|
Прояснить ситуацию, синхронная загрузка регистров по enable |
|
|
|
Mar 17 2008, 15:18
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(Михаил_K @ Mar 17 2008, 19:03)  Дело в том, что система параметров плиса (я работаю с xilinx) построена так, что временные параметры, относящиеся к вводу-выводу даны для условий, что сигналы принимаются (выдаются) на триггеры, расположенные в IOB. Только руководствуясь этими параметрами можно расчитать правильную передачу данных с внешнего девайса на ПЛИС. В противном случае никто не гарантирует вам правильную работу устройсвта, и убедившись в том, что одно устройство работает, вы можете нарваться на то, что другой экземпляр работать не будет. Да, наверно вы правы. Я хоть работаю с Lattice, но данный аспект видимо весьма схож у брендов ибо он привязан к FPGA в приципе. Нужно будет напомнить сеи аспекты заглянув в datasheet Латтиса...
|
|
|
|
|
Mar 18 2008, 03:37
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Саша Z @ Mar 17 2008, 09:21)  Будем думать как сдвинуть клок в test benchе (создать скажем 5-10 ns tpd входных сигналов относительно входного клока)... Прекратите заниматься шаманством, описанным в большинстве книг начального уровня по ХДЛ языкам. Привязывайте сигналы синхронных интерфейсов к клоку и можете, хотя для событийной модели ВХДЛ это не обязательно, задать задержку на интерфейсе. делается это просто, положим что valid сигнал синхронного интерфейса. Код signal valid : std_logic;
..........
valid <= '0'; wait until rising_edge(clk); -- initial sync
for i in 0 to 10 loop valid <= '1'; wait until rising_edge(clk); valid <= '0'; end loop в случае добавления задержек Код for i in 0 to 10 loop valid <= '1' after 1ns; wait until rising_edge(clk); valid <= '0' after 1ns; end loop Удачи!! ЗЫ. Хотя на SV при использовании interface с clocking секцией все описывается намного красивее %)))
--------------------
|
|
|
|
|
Mar 18 2008, 06:01
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(des00 @ Mar 18 2008, 07:37)  Прекратите заниматься шаманством, описанным в большинстве книг начального уровня по ХДЛ языкам. Привязывайте сигналы синхронных интерфейсов к клоку и можете, хотя для событийной модели ВХДЛ это не обязательно, задать задержку на интерфейсе. делается это просто, положим что valid сигнал синхронного интерфейса. Код signal valid : std_logic;
..........
valid <= '0'; wait until rising_edge(clk); -- initial sync
for i in 0 to 10 loop valid <= '1'; wait until rising_edge(clk); valid <= '0'; end loop в случае добавления задержек Код for i in 0 to 10 loop valid <= '1' after 1ns; wait until rising_edge(clk); valid <= '0' after 1ns; end loop Удачи!! ЗЫ. Хотя на SV при использовании interface с clocking секцией все описывается намного красивее %))) Шаманство не причем, не обязательно сразу принимать в штыки даже вопросы начального уровня  , конкретно насчет попытки задержки клока - я не читал об этом в книгах, так-что их обвинять не могу, это моя додумка, видимо не самая удачная ввиду малого опыта. На свою настольную книгу (VHDL for logic synthesis by Andrew Rushton) жаловаться не могу, из нее почерпнул очень многое... Насчет привязки к клоку и задание имитации tpd как вы привели в примере - спасибо, это действительно мне кажется правильным подходом. SV тут не причем, речь идет о конкретном случае, VHDL, то что возможно/невозможно в других языках, мирах, не релевантно Цитата(sazh @ Mar 18 2008, 08:58)  Обычно поток данных сопровождается не только передним фронтом клока но и интервалом, в которм передаются данные, или импульсом начала потока. Проблем быть не должно. Хотя желательно работать по одному фронту клока. Наверно надо продумать интерфейс передачи. Вы правы. В приведенных мной кусках симуляции (да и кусках кода) видно что есть сигнал DV (Data Valid) который и "вырезает" окно в котором идут данные. По фронту DV, синхронно с клоком ессно начинается первое данное потока. Насчет фронта - если учитывать задержку tpd входных данных по фронту клока - то действительно наверно можно работать например только по фронту. Сейчас пытаюсь симулировать tpd на входных данных и сигналах относительно входного клока в test benchе, видно что в таком случае действительно достаточно работать только по одному edge клока.
|
|
|
|
|
Mar 18 2008, 10:14
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Саша Z @ Mar 18 2008, 01:01)  Шаманство не причем, не обязательно сразу принимать в штыки даже вопросы начального уровня  , конкретно насчет попытки задержки клока - я не читал об этом в книгах, так-что их обвинять не могу, это моя додумка, видимо не самая удачная ввиду малого опыта. На свою настольную книгу (VHDL for logic synthesis by Andrew Rushton) жаловаться не могу, из нее почерпнул очень многое... Да я даже не собирался %))) Дело в том, что книги начального уровня (особено на русском языке) рассматривают синтез, но совершенно не рассматривают вопросы моделирования. И в большинстве материала приведены тестбенчи, в которых синхронные сигналы привязываются к клоку только за счет задержек. Начинающие разработчики начинают копировать данный стиль, а потом выясняется что у них place-route модель не работает как rtl. начинают править ртл модель, тогда как дело в тестбенче Это не сильно страшно в вхдл, но куда опаснее в верилоге, ибо его событийная модель не детерменированна. в SV эту ситуацию разрулили очень красиво, через программы и клокинг секции, что сделают в вхдл, дождемся релиза нового стандарта %) удачи!!
--------------------
|
|
|
|
|
Mar 18 2008, 11:33
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(des00 @ Mar 18 2008, 14:14)  Да я даже не собирался %))) Дело в том, что книги начального уровня (особено на русском языке) рассматривают синтез, но совершенно не рассматривают вопросы моделирования. И в большинстве материала приведены тестбенчи, в которых синхронные сигналы привязываются к клоку только за счет задержек.
Начинающие разработчики начинают копировать данный стиль, а потом выясняется что у них place-route модель не работает как rtl. начинают править ртл модель, тогда как дело в тестбенче
Это не сильно страшно в вхдл, но куда опаснее в верилоге, ибо его событийная модель не детерменированна. в SV эту ситуацию разрулили очень красиво, через программы и клокинг секции, что сделают в вхдл, дождемся релиза нового стандарта %) удачи!! Да, ситуация знакома, мой изначальный test-bench был тоже привязан к клоку задержками... Честно говоря с русскоязычной тех. литературой не знаком вообще, всегда читаю англоязычную, привык за пол-жизни в других реалиях... Кстати, нашел проблему у себя в коде (не в test-benchе) - проблема была в тайминге сигнала разрешение считывание с выхода параллельного регистра. В свое время, когда писла сей блок под чуть другую систему - внес туда искуственную задержку на 1 клок по своим причинам, и сейчас она меня и держала....
|
|
|
|
|
Mar 18 2008, 18:19
|
Знающий
   
Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737

|
Цитата(Саша Z @ Mar 17 2008, 15:26)  Возможно, на практике наверно не проблема как вы и говорите, я-же просто стараюсь придерживаться "книги", посему стараюсь все сигналы участвущие в процессе как входа заность в список чуствительности..  , меньше потом вохможной головной боли... На мой взгляд ключевое непонимание HDL. В список чувствительности процесса заносятся только асинхронные сигналы - сигналы, при изменении которых изменяется выход элемента. Для комбинационных схем - все входные сигналы. Для регистра - асинхронные (клок, асинхронный сброс). Остальные (такие как: синхронный сброс, энэйбл, сигналы влияющие на вход триггера и т.п.) в список чувствительности не вносятся. Цитата(Саша Z @ Mar 18 2008, 09:01)  Шаманство не причем, не обязательно сразу принимать в штыки даже вопросы начального уровня  , конкретно насчет попытки задержки клока - я не читал об этом в книгах, так-что их обвинять не могу, это моя додумка, видимо не самая удачная ввиду малого опыта. На свою настольную книгу (VHDL for logic synthesis by Andrew Rushton) жаловаться не могу, из нее почерпнул очень многое... Задерживается не клок, а данные и другие сигналы. Триггер ведь не работает мгновенно.
|
|
|
|
|
Mar 18 2008, 19:29
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(dvladim @ Mar 18 2008, 22:19)  На мой взгляд ключевое непонимание HDL. В список чувствительности процесса заносятся только асинхронные сигналы - сигналы, при изменении которых изменяется выход элемента. Для комбинационных схем - все входные сигналы. Для регистра - асинхронные (клок, асинхронный сброс). Остальные (такие как: синхронный сброс, энэйбл, сигналы влияющие на вход триггера и т.п.) в список чувствительности не вносятся. Задерживается не клок, а данные и другие сигналы. Триггер ведь не работает мгновенно.  Да понятно все это, в синхронных процессах в основном так и получалось что кроме клока все остальные сигналы по которым происходили events - были асинхронные. То что задержка идет на сигналах по выходу относительно клока - тоже спору нет, тут все очевидно. Говорилось о другом аспекте - о том как искуственно приимитировать задержку сигналов в test benchе, т.е. имитация входного тайминга. Было предложение задержать входной клок, но все-таки ессно правельней дать задержки на сигналы относительно клока.
|
|
|
|
|
Mar 19 2008, 07:45
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Вообще-то, дело вкуса. Я, например, чтобы избежать подобных казусов при создании тестбенча стараюсь с помощью задержек формировать только клок, я для остальных сигналов создавать процессы, работающие по этому клоку. вот пример. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY northogonal_corrector_noc_test_vhd_tb IS END northogonal_corrector_noc_test_vhd_tb; ARCHITECTURE behavior OF northogonal_corrector_noc_test_vhd_tb IS COMPONENT northogonal_corrector PORT( DI : IN std_logic_vector(7 downto 0); DQ : IN std_logic_vector(7 downto 0); CLK : IN std_logic; Ce : IN std_logic; QI : OUT std_logic_vector(7 downto 0); QQ : OUT std_logic_vector(7 downto 0) ); END COMPONENT; SIGNAL DI : std_logic_vector(7 downto 0); SIGNAL DQ : std_logic_vector(7 downto 0); SIGNAL QI : std_logic_vector(7 downto 0); SIGNAL QQ : std_logic_vector(7 downto 0); SIGNAL CLK : std_logic; SIGNAL Ce : std_logic; constant T : time := 10 ns; signal Counter : std_logic_vector (1 downto 0):="00"; signal Pointer : std_logic_vector (1 downto 0):="00"; type ARRAY_8BITS is array (integer range <>) of std_logic_Vector (7 downto 0); constant I: ARRAY_8BITS(0 to 3):=(X"3C",X"28",X"D8",X"C4"); constant Q: ARRAY_8BITS(0 to 3):=(X"3C",X"D8",X"28",X"C4"); BEGIN uut: northogonal_corrector PORT MAP( DI => DI, DQ => DQ, QI => QI, QQ => QQ, CLK => CLK, Ce => Ce ); tb : PROCESS BEGIN CLK<='1'; wait for T/2; CLK<= '0'; wait for T/2; END PROCESS; process (CLK) begin if (CLK'Event and CLK = '1') then Counter <= Counter + '1'; if (Counter = "11") then Ce<='1'; Pointer<= Pointer + '1'; else Ce<='0'; end if; end if; end process; DI<=I(CONV_INTEGER(Pointer)); DQ<=Q(CONV_INTEGER(Pointer)); END; Может быть более громоздко, но зато потом голова не болит
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|