Jump to content

    
Sign in to follow this  
FLTI

Упаковка/распаковка в потоке данных.

Recommended Posts

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

в одно 64-битное слово ( 4 младшие бита останутся пустыми ) и как наоборот из потока данных распаковывать старшие 60 бит из 64-битного слова в три 20-битных слова?

Или ещё лучше подскажите литературу где есть подобного рода примеры.

Share this post


Link to post
Share on other sites

  -- Packing 20-bit data into 64-bit data bus
  pack_20to60 : process(clk_video_input, rst_vid_in_d2)
  begin
    if (clk_video_input'event and clk_video_input = '1') then
      s_64bit_ready <= '0';
      if (vin_en = '1') then
          if (pack_cnt = "01") then
            s_64bit_ready <= '1';
          end if;
          --
          if (pack_cnt = "10") then
            pack_cnt <= (others => '0');
          else
            pack_cnt <= pack_cnt + 1;
          end if;
          --
          vid_wr_yc_data_d1 <= vid_wr_yc_data;
          vid_wr_yc_data_d2 <= vid_wr_yc_data_d1;
          vid_wr_fifo_din        <= vid_wr_yc_data_d2(19 downto 0)&vid_wr_yc_data_d1(19 downto 0)&vid_wr_yc_data(19 downto 0);
          --
       end if;
     end if;
  end process;

 

  -- Unpacking 60-bit data \w read enable signal to 10-bit data output counter
  unpack_60to10 : process(clk_video_output, rst)
  begin
    if (clk_video_output'event and clk_video_output = '1') then
      --
      if (rst = '1') then -- to be in sync with output data
        unpack_cnt     <= "00";
      elsif (s_vid_rd_data_rden = '1') then
        if (unpack_cnt = "10") then
          unpack_cnt <= (others => '0');
        else
          unpack_cnt <= unpack_cnt + 1;
        end if;
      end if;
    end if;
  end process;

  UNPACK_FF : process(clk_video_output) -- reduce unpack fanout
  begin
    if (rising_edge(clk_video_output)) then
        case unpack_cnt is
          when "01"   =>
            ofifo_y     <= s_vid_rd_fifo_dout(59 downto 50);
            ofifo_c     <= s_vid_rd_fifo_dout(49 downto 40);
          when "10"   =>
            ofifo_y     <= s_vid_rd_fifo_dout(39 downto 30);
            ofifo_c     <= s_vid_rd_fifo_dout(29 downto 20);
          when others =>
            ofifo_y     <= s_vid_rd_fifo_dout(19 downto 10);
            ofifo_c     <= s_vid_rd_fifo_dout(9  downto 0);
        end case;
    end if;
  end process;

Share this post


Link to post
Share on other sites
Подскажите пожалуйста начинающему разбираться в VHDL как написать код, чтобы в потоке данных с несущим клоком паковать три 20-битных слова

в одно 64-битное слово ( 4 младшие бита останутся пустыми ) и как наоборот из потока данных распаковывать старшие 60 бит из 64-битного слова в три 20-битных слова?

Или ещё лучше подскажите литературу где есть подобного рода примеры.

на мой взгляд, для запаковки ключевое слово конкатенация

Пример из сообщения KPiter

 

vid_wr_fifo_din    <= vid_wr_yc_data_d2(19 downto 0)&vid_wr_yc_data_d1(19 downto 0)&vid_wr_yc_data(19 downto 0);

 

Литературу Вы найдете в топике данной ветки...

Share this post


Link to post
Share on other sites

В обоих процедурах есть похожие куски:

 

          if (pack_cnt = "10") then
            pack_cnt <= (others => '0');

        if (unpack_cnt = "10") then
          unpack_cnt <= (others => '0');

 

Что они означают и почему они именно для значения счётчика "10" ?

"10" - это в смысле 10b ?

Как задаётся новая тактовая частота полученных при упаковке и распаковке потоков?

Share this post


Link to post
Share on other sites
Что они означают и почему они именно для значения счётчика "10" ?

"10" - это в смысле 10b ?

Как задаётся новая тактовая частота полученных при упаковке и распаковке потоков?

По достижении двухбитным счетчиком значения "10" (в бинарном виде), счетчик сбрасывается.

Тактовая частота остается прежней, просто в нужный момент выставляется сигнал готовности данных "s_64bit_ready" и при дальнейшей обработке данные считываются по этому сигналу.

Share this post


Link to post
Share on other sites

Спасибо, начинаю разбираться, , но остаётся непонятным, почему при упаковке сигнал готовности данных "s_64bit_ready" выставляется уже при pack_cnt = "01"?

 if (pack_cnt = "01") then
s_64bit_ready <= '1';

Ведь при pack_cnt = "01" ещё не всё 64-битное слово сформировано?

 

Распаковка сделана в другом стиле. Видимо скопирована из другого места.

Но в принципе же нет проблем сделать в таком же стиле как и упаковка?

Ну или наоборот, упаковку сделать в том стиле, в котором сделана распаковка ( case unpack_cnt is ).

Вообще какой стиль более правильный?

Share this post


Link to post
Share on other sites

тот который лучше подходит.

 

case - четкие значения, каждому виду значения - один вектор входной.

if - условие, если выполняется то и славно, но может выполниться для нескольких входных векторов.

 

более четкое условие, как более строгое, сжирает больше ресурсов

менее строгое - менее детерминировано в поведении, сильнее маскирует ошибки.

 

правила делать так или сяк нет, потому и есть несколько способов....

 

 

даже итерации до 3 можно делать 3 способами

 

начинать с 0 и проверять что больше 2

начинать с 2 и проверять что равно 0

начинать с одного и проверять что изменился знак.

 

1 более стабильное условие

2 жрет меньше лутов, но если 0 проскочили будет потвтор

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

 

 

 

Share this post


Link to post
Share on other sites

Понял, спасибо.

Но всё-таки остаётся непонятным, почему при упаковке сигнал готовности данных "s_64bit_ready" выставляется уже при pack_cnt = "01"?

 if (pack_cnt = "01") then
s_64bit_ready <= '1';

Ведь при pack_cnt = "01" ещё не всё 64-битное слово сформировано?

Share this post


Link to post
Share on other sites
Понял, спасибо.

Но всё-таки остаётся непонятным, почему при упаковке сигнал готовности данных "s_64bit_ready" выставляется уже при pack_cnt = "01"?

 if (pack_cnt = "01") then
s_64bit_ready <= '1';

Ведь при pack_cnt = "01" ещё не всё 64-битное слово сформировано?

 

очевидно ошибочка:)

скорее должно быть

 

if (pack_cnt = "00") then
            s_64bit_ready <= '1';
          end if;

 

первое слово приходит меняется 00 - 01

второе слово приходит меняется 01 - 10

третье слово приходит 10 - 00 и выставляется сигнал готово слово....

 

видимо автор что-то такое и хотел

Share this post


Link to post
Share on other sites

Спасибо!

 

А почему вместо простого и понятного

if (pack_cnt = "10") then
            pack_cnt <=  '0';

сделано так:

if (pack_cnt = "10") then
            pack_cnt <= (others => '0');

Почему вместо '0' использовано others => '0' ?

Share this post


Link to post
Share on other sites
Спасибо!

 

А почему вместо простого и понятного

if (pack_cnt = "10") then
            pack_cnt <=  '0';

сделано так:

if (pack_cnt = "10") then
            pack_cnt <= (others => '0');

потому что pack_cnt вектор

Share this post


Link to post
Share on other sites

Всем спасибо!

Меня эта ошибка в коде с толку сбивала.

Завтра на железе опробую в Квартусе на СигналТепе оба варианта кода, надеюсь всё получится.

По крайней мере я теперь понимаю как это работает.

 

Share this post


Link to post
Share on other sites

Шикарно конечно хранить данные в двух векторах одновременно. Это от души, это по нашему.

          vid_wr_yc_data_d1 <= vid_wr_yc_data;
          vid_wr_yc_data_d2 <= vid_wr_yc_data_d1;
          vid_wr_fifo_din        <= vid_wr_yc_data_d2(19 downto 0)&vid_wr_yc_data_d1(19 downto 0)&vid_wr_yc_data(19 downto 0);

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.

Sign in to follow this