vadimuzzz 0 19 июля, 2008 Опубликовано 19 июля, 2008 · Жалоба а че с dcfifo не так? имхо, самое оно для задачи. у меня похожая фигня была, данные с АЦП быстро заливались в фифо, потом внешний проц запрещал запись и потихоньку вычитывал. делал на dcfifo. тактовая АЦП была около 150МГц, для циклона с градацией -C8 вполне прилично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 19 июля, 2008 Опубликовано 19 июля, 2008 · Жалоба Понимаете - у меня тут как раз вопрос касательно потихоньку вычитывал Не могли бы вы привести вашу реализацию единичного (тихенького :) ) чтения? Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying: Ну где ж правильно??? Кривее, чем у Вас в исходнике придумать сложно. Первым делом - постулат (типа "имею мнение - хрен опровергнеш" ;) ) - ПЛИСы, и особенно FPGA, предназанчены для реализации синхронных устройств. Что у Вас : process (tmp_imp, signal_to_start) begin if (signal_to_start='0') then data_prepared <='0'; elsif (falling_edge(tmp_imp)) then data_prepared <='1'; end if; end process; На тактовый вход триггера Вы подаете сигнал, генерируемый логикой - gated clock - это не есть гуд. Да и использовать латчи в синхронных схемах вообще-то не рекомендуется. Далее : process (delay_chain, clock) begin if (delay_chain(0)='1' and delay_chain(1)='0') then tmp_imp <='1'; else tmp_imp <='0'; end if; end process; У Вас процесс будет запускаться по каждому изменению клока, хотя он в формировании выходного сигнала не участвует. С точки зрения синтеза это, может быть, это и не так страшно, но стиля описания не украшает :) Далее: process (tmp_imp,rst_signal) begin if (rst_signal='1') then imp_mux <= '0'; elsif (falling_edge(tmp_imp)) then imp_mux <='1'; end if; end process; Опять махровая асинхронщина - сигнал сброса (асинхронный) участвует в формировании выходного сигнала. Такой сброс хорошо использовать только для общего сброса или начальной установки всей системы. В общем, как в старом анекдоте : "Если думаешь, говоришь, пишешь, и подписываешь - то не удивляйся !" И еще, хочется процитировать уважаемого yes (хоть и про варнинги было сказано, но и тут в тему) : если квартус варнинг выдал побыстрее болт забейте что за глупая софтина человек умней его ну и подробнее там : http://www.telesys.ru/wwwboards/vhdl/61/messages/37364.shtml Ну а насчет LUT на входе - ну добавил и добавил, никакой логики там нет. Это уж Вы так констрейны задали (или не задали ;) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба 2 Stewart Little - спасибо за критику - критика всегда полезна :) А касательно ваших замечаний 1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ? 2) касательно использования латчей в синхронных схемах - а где вообсче про это можно почитать ? 3) process (delay_chain, clock) - а как бы вы поступили в этом случае ? 4) ну и касательно вашего последнего замечания про "махроваю асинхронщину" - сигнал сброса (асинхронный) участвует в формировании выходного сигнала, а общий сброс ситемы не есть ли тоже частью формирования выходного сигнала ? Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается А вообсче я так понял надо прочитать Recommended coding style от Altera. Наверно печерпну полезного... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба 2 Stewart Little - спасибо за критику - критика всегда полезна :) А касательно ваших замечаний 1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ? 2) касательно использования латчей в синхронных схемах - а где вообсче про это можно почитать ? 3) process (delay_chain, clock) - а как бы вы поступили в этом случае ? 4) ну и касательно вашего последнего замечания про "махроваю асинхронщину" - сигнал сброса (асинхронный) участвует в формировании выходного сигнала, а общий сброс ситемы не есть ли тоже частью формирования выходного сигнала ? Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается А вообсче я так понял надо прочитать Recommended coding style от Altera. Наверно печерпну полезного... Дополнительно можешь почитать http://electronix.ru/forum/index.php?showt...18207&st=45 и http://electronix.ru/forum/index.php?showt...48792&st=30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба 2 Maverick - почитаемс, может поменяется подход.. Хотя мне всё же кажется , что реализация с 2-х лутов и 4-х тригеров (как я привёл) - наименьшая разумная... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается Наблюдается. Один клок skew чего стоит. Чего проще - работать на одной системной частоте. Тогда clk_enable сам самбой получается. Вот пример. Он базовый для любой разработки для перехода из одного клокового домена в другой. именно на нем реализованы интерфейсы для декодирования несущего клока, замешанного в потоке приемных данных. Фактически это Ваше фифо для связи с процессором. Почаще смотрите не на луты, а в RTL просомтрщик. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity in_out_data is port( global_clk, in_clk_a, in_clk_b : in std_logic; input_data : in std_logic_vector(7 downto 0); out_data : out std_logic_vector(7 downto 0); out_clk : out std_logic); end in_out_data; architecture archi of in_out_data is signal data_rg : std_logic_vector(7 downto 0); signal sdvig_in_rg, sdvig_out_rg : std_logic_vector(2 downto 0); signal e_wr_rg, e_rd_rg : std_logic; begin process (global_clk) begin if rising_edge(global_clk) then sdvig_in_rg <= sdvig_in_rg(1 downto 0) & in_clk_a; sdvig_out_rg <= sdvig_out_rg(1 downto 0) & in_clk_b; if (e_wr_rg = '1') then data_rg <= input_data; end if; if (e_rd_rg = '1') then out_data <= data_rg; end if; end if; end process; out_clk <= in_clk_b; e_wr_rg <= sdvig_in_rg(1) and not sdvig_in_rg(2); e_rd_rg <= not sdvig_out_rg(1) and sdvig_out_rg(2); end archi; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба 2 sazh - спасибо за примерчик. Вроде всё ясно - дискретизируем данные согласно клока. Поробую переработать под такую логику. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба Понимаете - у меня тут как раз вопрос касательно Не могли бы вы привести вашу реализацию единичного (тихенького :) ) чтения? Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying: эмм.. а чего пример? как контроллером ножкой мигнуть? ну диаграмки посмотрите в ug_fifo. если внешнее устройство плис-то лучше с одним клоком, как уже неоднокоатно отмечалось. если клоки принципиально разные, то dc_fifo. и все операции чтения синхронизировать с клоком чтения (sazh пример привел), и чтоб никаких латчей ). если внешнее устройство - контроллер, то там автоматически все мигания ножками синхронные ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба 2 vadimuzzz - та ужо сам разобрался - сделал синхронный дизайн - ничего так получился.И квартус его кушает по человечески(без всяких skew). Осталось только нормально сделать пропускание 1-го импульса. А на счёт skew - может мне кто нибудь объяснить - чем он так плох в той реализации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба 1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ? Ну вот, уже все растолковали :) По данному конкретному вопросу "что делать" - подавать такой сигнал на вход разрешения триггера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба И всё таки - может мне кто нибудь объяснить - почему так плохо подавать сигнал с лута на клоковый вход тригера ? Что такого страшного получается ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба И всё таки - может мне кто нибудь объяснить - почему так плохо подавать сигнал с лута на клоковый вход тригера ? Что такого страшного получается ? Потому, что специальные клоковые пути специально выровнены по задержкам, т.ч. фронт клока приходит на триггеры одновременно, где бы на кристалле триггер не находился. Если же брать сигнал с выхода LUT, то этот сигнал по отношению к глобальному клоку будет сдвинут по фазе на неопределенную величину. В этом случае у вас появится еще один клоковый домен и вылезут все традиционные проблемы с этим связанные - если ничего не предпринимать, то метастабильность и сбои в работе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Я же не замешиваю это сигнал с клоковым?? Хотя асинхронность и разные клоки в принципе наблюдается.. А где можно почитать про эти самые проблемы и что нужно предпринимать по этому поводу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 23 июля, 2008 Опубликовано 23 июля, 2008 · Жалоба Вроде разгрёбся немного и закончил примитивненький компонент. Имеем такой генератор разрешающих импульсов: Прицепил его single_imp_generator.vhd Вот временная диаграмка поведения: То есть то что надо как раз. Однако если встраивать в периферию (её я тож кстати подредактировал - убрал как было с клоковых входов и поставил на enable входы сигналы) - то получаю каку - по ходу задом на перёд сабака работать начинает :07: Периферию специально сделал примитивную. Вот прицепил слэйв компонент для авалона mp.zip там и CVWF - поведение сразу. Там всё просто - должно ж отрабатываться - а тут так. И уже вроде и не асинхронно - клокирую всё тактовым(запрос на чтение забиваю по тактовой в сдвиговый регистр и далее логика, выдача флага готовности тоже с клоком синхронизировано)... Не могу понять - что опять он там наоптимизировал ? Уже вроде и skew отсутствует... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться