FLTI 0 2 мая, 2013 Опубликовано 2 мая, 2013 · Жалоба Подскажите пожалуйста начинающему разбираться в VHDL как написать код, чтобы в потоке данных с несущим клоком паковать три 20-битных слова в одно 64-битное слово ( 4 младшие бита останутся пустыми ) и как наоборот из потока данных распаковывать старшие 60 бит из 64-битного слова в три 20-битных слова? Или ещё лучше подскажите литературу где есть подобного рода примеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kpiter 0 2 мая, 2013 Опубликовано 2 мая, 2013 · Жалоба -- 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 2 мая, 2013 Опубликовано 2 мая, 2013 · Жалоба Подскажите пожалуйста начинающему разбираться в 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); Литературу Вы найдете в топике данной ветки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 3 мая, 2013 Опубликовано 3 мая, 2013 · Жалоба Спасибо! Поясните пожалуйста - что подсчитывают pack_cnt при упаковке и unpack_cnt при распаковке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба В обоих процедурах есть похожие куски: if (pack_cnt = "10") then pack_cnt <= (others => '0'); if (unpack_cnt = "10") then unpack_cnt <= (others => '0'); Что они означают и почему они именно для значения счётчика "10" ? "10" - это в смысле 10b ? Как задаётся новая тактовая частота полученных при упаковке и распаковке потоков? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Amurak 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Что они означают и почему они именно для значения счётчика "10" ? "10" - это в смысле 10b ? Как задаётся новая тактовая частота полученных при упаковке и распаковке потоков? По достижении двухбитным счетчиком значения "10" (в бинарном виде), счетчик сбрасывается. Тактовая частота остается прежней, просто в нужный момент выставляется сигнал готовности данных "s_64bit_ready" и при дальнейшей обработке данные считываются по этому сигналу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Спасибо, начинаю разбираться, , но остаётся непонятным, почему при упаковке сигнал готовности данных "s_64bit_ready" выставляется уже при pack_cnt = "01"? if (pack_cnt = "01") then s_64bit_ready <= '1'; Ведь при pack_cnt = "01" ещё не всё 64-битное слово сформировано? Распаковка сделана в другом стиле. Видимо скопирована из другого места. Но в принципе же нет проблем сделать в таком же стиле как и упаковка? Ну или наоборот, упаковку сделать в том стиле, в котором сделана распаковка ( case unpack_cnt is ). Вообще какой стиль более правильный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба тот который лучше подходит. case - четкие значения, каждому виду значения - один вектор входной. if - условие, если выполняется то и славно, но может выполниться для нескольких входных векторов. более четкое условие, как более строгое, сжирает больше ресурсов менее строгое - менее детерминировано в поведении, сильнее маскирует ошибки. правила делать так или сяк нет, потому и есть несколько способов.... даже итерации до 3 можно делать 3 способами начинать с 0 и проверять что больше 2 начинать с 2 и проверять что равно 0 начинать с одного и проверять что изменился знак. 1 более стабильное условие 2 жрет меньше лутов, но если 0 проскочили будет потвтор 3 легче проверять знаковый бит, мало жрет проверка, но счетчик должен быть на бит больше и надо следить за начальным значением оно не столь очевидно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Понял, спасибо. Но всё-таки остаётся непонятным, почему при упаковке сигнал готовности данных "s_64bit_ready" выставляется уже при pack_cnt = "01"? if (pack_cnt = "01") then s_64bit_ready <= '1'; Ведь при pack_cnt = "01" ещё не всё 64-битное слово сформировано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Понял, спасибо. Но всё-таки остаётся непонятным, почему при упаковке сигнал готовности данных "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 и выставляется сигнал готово слово.... видимо автор что-то такое и хотел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Спасибо! А почему вместо простого и понятного if (pack_cnt = "10") then pack_cnt <= '0'; сделано так: if (pack_cnt = "10") then pack_cnt <= (others => '0'); Почему вместо '0' использовано others => '0' ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Спасибо! А почему вместо простого и понятного if (pack_cnt = "10") then pack_cnt <= '0'; сделано так: if (pack_cnt = "10") then pack_cnt <= (others => '0'); потому что pack_cnt вектор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Всем спасибо! Меня эта ошибка в коде с толку сбивала. Завтра на железе опробую в Квартусе на СигналТепе оба варианта кода, надеюсь всё получится. По крайней мере я теперь понимаю как это работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuchynski 0 9 июня, 2014 Опубликовано 9 июня, 2014 · Жалоба Шикарно конечно хранить данные в двух векторах одновременно. Это от души, это по нашему. 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FLTI 0 9 июня, 2014 Опубликовано 9 июня, 2014 · Жалоба Это неправильно или просто не оптимально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться