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

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

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

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

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

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


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

  -- 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;

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


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

Подскажите пожалуйста начинающему разбираться в 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);

 

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

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


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

Спасибо!

Поясните пожалуйста - что подсчитывают pack_cnt при упаковке и unpack_cnt при распаковке?

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


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

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

 

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

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

 

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

 

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

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

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

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

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


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

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

 

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

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

 

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

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

 

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

 

 

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

 

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

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

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

 

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

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

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

 

 

 

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


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

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

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

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

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

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


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

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

Но всё-таки остаётся непонятным, почему при упаковке сигнал готовности данных "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 и выставляется сигнал готово слово....

 

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

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


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

Спасибо!

 

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

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

сделано так:

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

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

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


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

Спасибо!

 

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

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

сделано так:

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

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

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


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

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

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

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

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

 

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


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

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

          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);

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


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

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

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

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

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

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

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

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

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

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