Перейти к содержанию
    

pipeline 2 bytes to 3 bytes

Добрый день

Что-то я не могу придумать как сделать. Мне надо принимать паралельно 2 байта, а выдавать паралельно 3 байта:

 library ieee;
 use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;

 entity receiver_data is
 
 generic (
 	BYTE_WIDTH  	: integer := 8;
 	BYTES 			: natural := 1
 );
    Port 
    (
		clk           	: in  std_logic;
		rst           	: in  std_logic;
	
		valid_in      	: in  std_logic;
		data0_in      	: in  std_logic_vector((BYTE_WIDTH*BYTES-1) downto 0);
		data1_in      	: in  std_logic_vector((BYTE_WIDTH*BYTES-1) downto 0);
	
		valid_out		: out std_logic;
		data0_out		: out  std_logic_vector((BYTE_WIDTH*BYTES-1) downto 0);
		data1_out		: out  std_logic_vector((BYTE_WIDTH*BYTES-1) downto 0);
		data2_out		: out  std_logic_vector((BYTE_WIDTH*BYTES-1) downto 0);
    );
 end receiver_data;

Подскажите пожалуйста как такое реализовать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эмм, собрать за 3 порции 6 байт и выдать за 2 порции по 3 байта?

Если поток не выровнен по границе 3-х байт, то в конце потребуется еще коррекция положения последнего байта.

вот нечто похожее, если нет входной валидностии и синхронизации

always_ff @(posedge clk) begin
  cnt_in  <= (cnt_in == 2) ? 0 : (cnt_int + 1'b1);
  data_in <= (data_in << 16) | idata[0 +: 16];
  //
  pipa    <= (cnt_in == 2);
  //
  val_out  <= pipa ? 2'b11 : (val_out << 1);
  data_out <= pipa ? data_in : (data_out << 24);
  //
  oval  <= val_out[2];
  odata <= data_out[24 +: 24];
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 01.07.2022 в 13:49, Maverick_ сказал:

Мне надо принимать паралельно 2 байта, а выдавать паралельно 3 байта

Элементарно:  data2_out <= (others => '0');  :)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/1/2022 at 2:14 PM, Самурай said:

Элементарно:  data2_out <= (others => '0');  :)))

Не понял Вас ... Если можно поясните пожалуйста

On 7/1/2022 at 2:13 PM, des00 said:

эмм, собрать за 3 порции 6 байт и выдать за 2 порции по 3 байта?

Если поток не выровнен по границе 3-х байт, то в конце потребуется еще коррекция положения последнего байта.

вот нечто похожее, если нет входной валидностии и синхронизации

always_ff @(posedge clk) begin
  cnt_in  <= (cnt_in == 2) ? 0 : (cnt_int + 1'b1);
  data_in <= (data_in << 16) | idata[0 +: 16];
  //
  pipa    <= (cnt_in == 2);
  //
  val_out  <= pipa ? 2'b11 : (val_out << 1);
  data_out <= pipa ? data_in : (data_out << 24);
  //
  oval  <= val_out[2];
  odata <= data_out[24 +: 24];
end

 

Спасибо, попробую

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 01.07.2022 в 14:30, Maverick_ сказал:

Не понял Вас ... Если можно поясните пожалуйста

Просто намек на некорректно поставленную задачу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

des00

за намек спасибо. Ниже скрин симуляции:

 

image.thumb.png.ca459d7d7f2e67cb3696e4f9de99b2a4.png

 

файлы реализации и тестбенча во вложении

 

wave.do

c.do

receiver_data.vhd

receiver_data_vhd_tst.vhd

 

2 часа назад, Самурай сказал:

Просто намек на некорректно поставленную задачу...

Решение я уже привел, я не знаю как по другому пояснить задачу, которую мне надо было реализовать...

Сформулируйте Вы - интересна Ваша формулировка моей задачи...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С записью в буфер кратного размера очень здравая мысль была предложена des00, как-то приходилось пользоваться подобной схемой. Вряд ли можно придумать что-то более подходящее. Есть готовые корки фифо с несимметричными выходами или конвертеры ширины данных, но так мы теряем переносимость и универсальность решения, а внутри скорее всего сделано что-то такое же

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/1/2022 at 5:13 PM, Tausinov said:

...  Вряд ли можно придумать что-то более подходящее

Вообще то для такого достаточно буфера на 2 байта.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, RobFPGA said:

Вообще то для такого достаточно буфера на 2 байта.   

Можно, но рождается мультиплексор для сбора выходного слова. А решение с кратным буфером помимо того что там только сдвиговые регистры, может использоваться еще для CDC частот 2/3 рожденных с одной PLL без какого либо FIFO. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/1/2022 at 8:31 PM, des00 said:

Можно, но рождается мультиплексор для сбора выходного слова. А решение с кратным буфером помимо того что там только сдвиговые регистры, может использоваться еще для CDC частот 2/3 рожденных с одной PLL без какого либо FIFO. 

Моя реализация не позволит обеспечивать CDC...

Надо немного по другому описать/добавить логику...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/3/2022 at 11:21 PM, Maverick_ said:

Моя реализация не позволит обеспечивать CDC...

Надо немного по другому описать/добавить логику...

ну да, там на каждой стороне нужно родить "генератор" общей кратной "частоты" и переложить данные) Похожее я часто в полифазной обработке делаю)

А вот если одна из сторон может изменять количество элементов массива динамически, вот там самое веселье начинается) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/4/2022 at 8:19 AM, des00 said:

ну да, там на каждой стороне нужно родить "генератор" общей кратной "частоты" и переложить данные) Похожее я часто в полифазной обработке делаю)

А вот если одна из сторон может изменять количество элементов массива динамически, вот там самое веселье начинается) 

Интересная у Вас работа)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/4/2022 at 7:19 AM, des00 said:

А вот если одна из сторон может изменять количество элементов массива динамически, вот там самое веселье начинается) 

А еще веселее когда это делают обе стороны. Но как раз в таком случае бывает выгодно один большой мукс на входе регистра разбить на 2 более мелких, на входе и выходе.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, Maverick_ said:

Интересная у Вас работа)

ну а как по другому когда надо "слова" декодера разрядностью 8/16/32 собирать из BPSK...QAM4096 символов)

 

5 hours ago, RobFPGA said:

А еще веселее кода это делают обе стороны. Но как раз в таком случае бывает выгодно один большой мукс на входе регистра разбить на 2 более мелких, на входе и выходе.   

плавали, знаем, а если еще и на символьной под 300 так там начинаются выкрутасы)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...