Перейти к содержанию
    

симуляция bidirectional bus в Quartus II

Народ, подскажите плиз! Элементарная вещь, но не получается что-то (от жары мозги клинит наверно)).

Имеется проект в 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 коде ошибка (я в нем новичок) или симулятор неправильно отрабатывает или еще что...

Заранее спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы бы дописали список чувствительности для примера (неясно по чему там срабатывание и что городит синтезатор). А вообще третье состояние лучше присваивать асинхронно:

IO <= "ZZZZZZZZ" when OE='0' else
	rD;

DB(7 downto 0) <= IO;

иначе и симулятор и реальная железка может показать что угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Попробую изменить (хотя этот пример взял из методички Интел/Альтера).

а что такое " список чувствительности" и где его настраивать? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Если чего-то нет, то моделирование будет работать криво. А в железке - как повезёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

процесс меня асинхронный и эти сигналы я перечислил. У меня такое ощущение что это закидон симулятора. Набросал сейчас на привычной мне схемотехнике простенькую аналогичную схемку - то же самое вышло - шина IO не занимается устройством, там или Z или то что я сам на ней задам внешним воздействием.

До этого я использовал выходы с 3я состояниями для ресетов или согласования с 5В девайсами (с резисторами подтяжки) - все работало, даже не тестировал в симуляторе, а тут впервые обратил внимание, так как железки еще нет, а прошивку готовить надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таком случае это просто загоны VHDL+студия. Неоднократно сталкивался, что синтезируются неопнятные, а иногда и дикие вещи. попробуйте поставить присвоение, как я показал выше - должно опустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все попробовал, ничего не помогает. Не работает симуляция даже в примере от Интела/Альтеры (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.

Ладно, обойдусь без этого...

Всем спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите картинку с временными диаграммами.

Возможен вариант, что у вас какой-нибудь не тот сигнал вытащен из нетлиста на диаграммы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

И сделайте все не в процессе. Я вам даже код написал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, у вас во втором процессе неполный список чувствительности. Из-за этого в симуляторе вы увидите не то, что ожидаете. Замените этот процесс на классическое описание:

    b <= bidir;
    bidir <= a when (OE = '0') else (others => 'Z');

Во-вторых, должен быть правильно написан тестбенч: надо правильно подключить там двунаправленный сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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');
	

без всяких процессов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по порядку... сначала результат симуляции для интеловского примера... Комбинации AB, CD и EF вывожу на шину я, между ними должно быть занятие шины устройством, но его нет - Z

 

 

 

123.jpg

Изменено пользователем vat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Nick_K, включил a и b в списки чувствительности. Результат не изменился.

Без процессов и клока я еще вчера попробовал - тоже нет занятия шины. 

Народ - это пример (bidir.vhd) из первоисточника - "библии" от Интела/Альтеры. Если он не правильный, то во что верить ? )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне смутно вспоминается, что в старом альтеровском симуляторе была какая-то такая фиговина, что входы он рисует одним сигналом, выходы - другим. Посмотрите, что у вас еще есть в нетлисте доступное для вывода на диаграммы (не порты ввода/вывода, а внутренние цепи). Или возьмите квартус версии 13.1 - там уже используется моделсимовский движок для моделирования, а max II еще поддерживается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...