vat 0 18 июня, 2019 Опубликовано 18 июня, 2019 · Жалоба Народ, подскажите плиз! Элементарная вещь, но не получается что-то (от жары мозги клинит наверно)). Имеется проект в VHDL , Quartus II 9.1 Web Edition, MAX II EPM570. Использую bidirectional bus: IO : inout std_logic_vector(7 downto 0); .... if OE='0' then IO <= "ZZZZZZZZ"; DB(7 downto 0) <= IO; else IO <= rD; end if; Железка пока не подъехала, тестирую на встроенном симуляторе Quartus. Получается что чтение с шины IO работает нормально, а вот при выдаче данных на нее (из регистра rD при OE='1') на шине IO остается третье состояние (Z). Даже не знаю - в моем VHDL коде ошибка (я в нем новичок) или симулятор неправильно отрабатывает или еще что... Заранее спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 18 июня, 2019 Опубликовано 18 июня, 2019 · Жалоба Вы бы дописали список чувствительности для примера (неясно по чему там срабатывание и что городит синтезатор). А вообще третье состояние лучше присваивать асинхронно: IO <= "ZZZZZZZZ" when OE='0' else rD; DB(7 downto 0) <= IO; иначе и симулятор и реальная железка может показать что угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vat 0 18 июня, 2019 Опубликовано 18 июня, 2019 · Жалоба Спасибо! Попробую изменить (хотя этот пример взял из методички Интел/Альтера). а что такое " список чувствительности" и где его настраивать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 18 июня, 2019 Опубликовано 18 июня, 2019 · Жалоба 12 minutes ago, vat said: а что такое " список чувствительности" и где его настраивать? Это то, что написано в скобках после слова process. Напиример: module_proc : process(main_clk_in) begin if rising_edge(main_clk_in) then ... end if; end process; Означает, что процесс синхронный и срабатывает по переднему фронту клока (main_clk_in). В асинхронных процессах в списке чувствительности должны быть указаны все сигналы, которые входят в процесс. В Вашем случае это IO, rD и OE. Если чего-то нет, то моделирование будет работать криво. А в железке - как повезёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vat 0 18 июня, 2019 Опубликовано 18 июня, 2019 · Жалоба процесс меня асинхронный и эти сигналы я перечислил. У меня такое ощущение что это закидон симулятора. Набросал сейчас на привычной мне схемотехнике простенькую аналогичную схемку - то же самое вышло - шина IO не занимается устройством, там или Z или то что я сам на ней задам внешним воздействием. До этого я использовал выходы с 3я состояниями для ресетов или согласования с 5В девайсами (с резисторами подтяжки) - все работало, даже не тестировал в симуляторе, а тут впервые обратил внимание, так как железки еще нет, а прошивку готовить надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба В таком случае это просто загоны VHDL+студия. Неоднократно сталкивался, что синтезируются неопнятные, а иногда и дикие вещи. попробуйте поставить присвоение, как я показал выше - должно опустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба DB(7 downto 0) <= IO; вынесите за границы процесса, иначе получается латч. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vat 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба Все попробовал, ничего не помогает. Не работает симуляция даже в примере от Интела/Альтеры (bidir.vhd (Tri-state bus implementation)): LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY bidir IS PORT( bidir : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0); oe, clk : IN STD_LOGIC; inp : IN STD_LOGIC_VECTOR (7 DOWNTO 0); outp : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END bidir; ARCHITECTURE maxpld OF bidir IS SIGNAL a : STD_LOGIC_VECTOR (7 DOWNTO 0); -- DFF that stores -- value from input. SIGNAL b : STD_LOGIC_VECTOR (7 DOWNTO 0); -- DFF that stores BEGIN -- feedback value. PROCESS(clk) BEGIN IF clk = '1' AND clk'EVENT THEN -- Creates the flipflops a <= inp; outp <= b; END IF; END PROCESS; PROCESS (oe, bidir) -- Behavioral representation BEGIN -- of tri-states. IF( oe = '0') THEN bidir <= "ZZZZZZZZ"; b <= bidir; ELSE bidir <= a; b <= bidir; END IF; END PROCESS; END maxpld; точнее она не работает только в части вывода на двунаправленную шину (команда "bidir <= a;"). Она остается в состоянии Z. Ладно, обойдусь без этого... Всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба Покажите картинку с временными диаграммами. Возможен вариант, что у вас какой-нибудь не тот сигнал вытащен из нетлиста на диаграммы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба PROCESS (oe, bidir) -- Behavioral representation BEGIN -- of tri-states. IF( oe = '0') THEN bidir <= "ZZZZZZZZ"; b <= bidir; ELSE bidir <= a; b <= bidir; END IF; Сигнал "a" не числится в списке чувствительности... Нет детекта сигнала -> нет изменения bidir И сделайте все не в процессе. Я вам даже код написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба Во-первых, у вас во втором процессе неполный список чувствительности. Из-за этого в симуляторе вы увидите не то, что ожидаете. Замените этот процесс на классическое описание: b <= bidir; bidir <= a when (OE = '0') else (others => 'Z'); Во-вторых, должен быть правильно написан тестбенч: надо правильно подключить там двунаправленный сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба 22 часа назад, vat сказал: if OE='0' then IO <= "ZZZZZZZZ"; DB(7 downto 0) <= IO; else IO <= rD; end if; Правильно писать так: DB(7 downto 0) <= IO; IO <= rD when (OE = '1') else (others => 'Z'); без всяких процессов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vat 0 19 июня, 2019 Опубликовано 19 июня, 2019 (изменено) · Жалоба по порядку... сначала результат симуляции для интеловского примера... Комбинации AB, CD и EF вывожу на шину я, между ними должно быть занятие шины устройством, но его нет - Z Изменено 19 июня, 2019 пользователем vat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vat 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба Nick_K, включил a и b в списки чувствительности. Результат не изменился. Без процессов и клока я еще вчера попробовал - тоже нет занятия шины. Народ - это пример (bidir.vhd) из первоисточника - "библии" от Интела/Альтеры. Если он не правильный, то во что верить ? ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 19 июня, 2019 Опубликовано 19 июня, 2019 · Жалоба Мне смутно вспоминается, что в старом альтеровском симуляторе была какая-то такая фиговина, что входы он рисует одним сигналом, выходы - другим. Посмотрите, что у вас еще есть в нетлисте доступное для вывода на диаграммы (не порты ввода/вывода, а внутренние цепи). Или возьмите квартус версии 13.1 - там уже используется моделсимовский движок для моделирования, а max II еще поддерживается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться