Jump to content
    

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;

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

 

Share this post


Link to post
Share on other sites

эмм, собрать за 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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

des00

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

 

image.thumb.png.ca459d7d7f2e67cb3696e4f9de99b2a4.png

 

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

 

wave.do

c.do

receiver_data.vhd

receiver_data_vhd_tst.vhd

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

1 hour ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

14 hours ago, Maverick_ said:

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

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

 

5 hours ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...