dsmv 0 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба вот как раз за такие финты, я бы своим подаванам уши открутил ... %)) В пределах одного модуля нужно ссылаться только на один уникальный клок идущий из одного места. В системе много модулей и несколько клоков. Чаще всего проблемы начинаются при межмодульном взаимодействии. ... temp_sub : entity work.temp_sub port map (clk, a,b,c,d); temp_sub_1 : entity work.temp_sub port map (clk1, a1,b1,c1,d1); ... Ваш код не эквивалентен моему. Смысл моего примера, в том что c и с1 формируются по clk, d и d1 по clk1; Сигналы с,c1,d,d1 должны быть одинаковыми, но сигнал d1 формируется неправильно из за delta задержки clk1. Это фундаментальная проблема симулятора, и для Aldec и для Mentor. Для написания теста все средства хороши, лишь бы понятно было и наглядно. Но, елы-палы, вас же дети читать будут! К синтезу и проекту для ПЛИС эта конструкцияя имеет отношение 0%. Если при моделировании синтезируемой схемы хочется наблюдать фронты сигналов с выходов асинхронных элементов, то для этого вам, барин, нужна ¨post place and route simulation model¨. Долго будет думать симулятор, но покажет. Эта конструкция работает на 100 %. При моделировании проекта я хочу видеть фронт сигнала который отличается от фронта клока. Само значение задержки мне не важно, можно 1 ns, можно 0.1. Но эта задержка гарантирует адекватность поведения схемы на модели и в ПЛИС. И всё это мне надо видеть до "post place and route" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба Это фундаментальная проблема симулятора, и для Aldec и для Mentor. Я бы сказал, скорее, что это фундаментальное свойство языка. Поэтому действительно, переназначать клок внутри модуля не стоит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба В системе много модулей и несколько клоков. Чаще всего проблемы начинаются при межмодульном взаимодействии. До меня дошло наконец-то. Такого я не встречал еще. Проблема возникает тут: clk1 <= clk В PLD оба сигнала станут одной сетью, но симулятор их не воспринимает как эквивалентные, будут гонки. Поизучаю, как еще можно с этим бороться. DSMV, а можно ли привести пример такого межмодульного взаимодействия? Возможно, в иерархии модулей клок расходится вглубь, а потом поднимается обратно из нескольких модулей на уровень выше. Написал этот же код, увидел проблему в симуляторе. -- ----------------------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity delta_demo_tb is generic ( CLOCK_PERIOD : time := 10 ns ); end delta_demo_tb; architecture model of delta_demo_tb is procedure gen_clock(period : time; signal clk: out std_logic) is begin loop clk <= '1'; wait for period /2; clk <= '0'; wait for period /2; end loop; end gen_clock; procedure gen_reset(signal clk: in std_logic; signal reset: out std_logic; duration : natural) is begin reset <= '1'; for i in 1 to duration loop wait until rising_edge(clk); end loop; reset <= '0'; loop wait for 1000 sec; end loop; end gen_reset; signal clk, clk1, reset : std_logic; signal a,b,c,d : std_logic; begin gen_reset(clk, reset, 3); -- формируется сигнал reset длиной 3 такта gen_clock(10 ns, clk); -- формируется клок clk1 <= clk; -- клок клонируется process(reset, clk) begin if reset='1' then a <= '0'; b <= '0'; c <= '0'; elsif rising_edge(clk) then a <= not a; if (a='1') then b <= not b; end if; c <= a and b; end if; end process; process(reset, clk1) begin if reset='1' then d <= '0'; elsif rising_edge(clk1) then d <= a and b; end if; end process; end model; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба Поизучаю, как еще можно с этим бороться. Написал этот же код, увидел проблему в симуляторе. проблема высосана из пальца и стара как мир, не надо множить линии клоков внутри одного и того же модуля, а если и размножаете то назначайте все взаимодействия по одному клоку, или используйте не сигнальное присвоение а alias. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsmv 0 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба DSMV, а можно ли привести пример такого межмодульного взаимодействия? Вот есть образцово-показательный проект. adp201cp5_v20_adm212x100m.zip проблема высосана из пальца и стара как мир, не надо множить линии клоков внутри одного и того же модуля, а если и размножаете то назначайте все взаимодействия по одному клоку, или используйте не сигнальное присвоение а alias. Это не единственная проблема, встречаются ещё ситуации которые лечатся after 1 ns, хотя такого явного присвоения клока не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 23 июля, 2009 Опубликовано 23 июля, 2009 · Жалоба Вот есть образцово-показательный проект. Посмотрел. Есть какое-то характерное место, чтобы тупо grep-ом не искать? Симулятор не запускал, просто пролистал. Нашел тесты, в них можно делать что угодно. Видел FIFO с разными клоками. Это немного другое. Гонки там - нормальное дело. Но вот если на такое FIFO подать один клок, то будут, хм, отличия между симуляцией и железом. Вы это имеете в виду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Это не единственная проблема, встречаются ещё ситуации которые лечатся after 1 ns, хотя такого явного присвоения клока не было. не поверите, ни разу не сталкивался с этим, за исключением специально созданных тестов, за все время работы с фпга на 3-х языках. И даже если бы столкнулся, то не пачкал бы код постоянными after а завернул бы в обертку с транспортными задержками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsmv 0 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба Посмотрел. Есть какое-то характерное место, чтобы тупо grep-ом не искать? В этом проекте всё работает. Это просто как пример, причём не самый большой. Кстати, например cl_fifo_control_v2 - автомат написан в виде двух процессов, причём не везде добавлены after 1 ns; И давно работает. не поверите, ни разу не сталкивался с этим, за исключением специально созданных тестов, за все время работы с фпга на 3-х языках. И даже если бы столкнулся, то не пачкал бы код постоянными after а завернул бы в обертку с транспортными задержками. Почему не поверю. Поверю. Работать можно по разному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба В этом проекте всё работает. Это просто как пример, причём не самый большой. Кстати, например cl_fifo_control_v2 - автомат написан в виде двух процессов, причём не везде добавлены after 1 ns; И давно работает. Вы меня пугаете. В cl_fifo_control_v2 один клок, упомянутому эффекту при присвоении клоков взяться неоткуда. Классически записанный автомат кого-то из Милей с Мурами. По поводу "и давно работает", хочется сказать, что за это время не все возможные развития событий могли иметь место. Если сбой был, то ошибка есть, но если сбоя не было, это не значит, что ошибок нет. Нужны более убедительные доказательства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MadMakc 0 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба ко всему, что сказано, почему-то никто не узрел ещё один косяк: type stp_type is (s0, s1, s2,s3 ); -- описание типа dsmv, пожалейте себя и разработчиков, которые будут ваш код использовать: не пишите состояния автомата безымянными s0,s1,s2 и т.д. И даже state0,state1 и т.д. не пишите. пройдет полгода - и вы сами будете вспонимнать, и вряд ли вспоните, что за состояние s0 или не дай бог s20. используйте нормальные, понятные имена - это и наглядней и понятней. поверьте на слово, состояния idle, read_reg,end_packet, wr_data намного понятней и приятней для обозрения, чем s0,s1,s20,s100. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsmv 0 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба поверьте на слово, состояния idle, read_reg,end_packet, wr_data намного понятней и приятней для обозрения, чем s0,s1,s20,s100. Верю, иногда даже называю, но редко. Но я хочу сказать, что даже s0,s1 понятней чем если напрямую записывать "001" "010" Классически записанный автомат кого-то из Милей с Мурами. Конечно, это классический автомат, но по моему не удобный. В результате у меня получился автомат, который я привёл в начале темы. Естественно, никому я его не навязываю, даже у себя на работе. Но интересуюсь кто и как пишет. Пока что было очень интересное сообщение от Shtirlits: http://electronix.ru/forum/index.php?showt...t=0&start=0 Я такого ещё не встречал. Остальные - классические автоматы Мили и Мура. Или я ошибаюсь ? По поводу "и давно работает", хочется сказать, что за это время не все возможные развития событий могли иметь место. Естественно, ряд ошибок уже выявлен и исправлен. Если ещё будут выявлены, то и они будут исправлены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба Почитайте вложение. Там дано очень хорошее объяснение. Рекомендую В принципе например в Xilinx ISE примеры описаний различных конструкций(тригеры, счетчики и т.д.) - смотри скриншот. В квартусе я уверен тоже это есть. Пользуйтесь этим. FSM_design.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsmv 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба Почитайте вложение. Там дано очень хорошее объяснение. Рекомендую В принципе например в Xilinx ISE примеры описаний различных конструкций(тригеры, счетчики и т.д.) - смотри скриншот. В квартусе я уверен тоже это есть. Пользуйтесь этим. Я видел такой документ. Наиболее близкий к моему описанию последний автомат: "VHDL for the “Mealy” machine generated from the Truth Table." Отличие - в формировании сбора, ну и after 1 ns конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба Я видел такой документ. Наиболее близкий к моему описанию последний автомат: "VHDL for the ”Mealy” machine generated from the Truth Table." Отличие - в формировании сбора, ну и after 1 ns конечно. Тогда в чем вопрос? :) Зачем писать "after 1 ns" если это для функционального моделирования, а синтезатором это будет игнорироваться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsmv 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба Тогда в чем вопрос? :) Зачем писать "after 1 ns" если это для функционального моделирования, а синтезатором это будет игнорироваться? Собственно меня интересуют нюансы описания КА. После изучения примеров Xilinx, литературы, собственных шишек, у меня получился вариант КА, я привёл его в начале темы. after 1 ns - на мой взгляд обязательная часть, помогает избежать некорректного моделирования, но со мной очень многие не согласны. Я это принимаю как факт, причём совершенно спокойно :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться