Jump to content

    

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

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

Share this post


Link to post
Share on other sites

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

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

DB(7 downto 0) <= IO;

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

 DB(7 downto 0) <= IO;  вынесите за границы процесса, иначе получается латч.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
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');
	

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

Share this post


Link to post
Share on other sites

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

 

 

 

123.jpg

Edited by vat

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this