Заявление о ситуации на стенде VHDL принимает уменьшенное значение - PullRequest
0 голосов
/ 06 июля 2019

Я работаю над проектом, использующим VHDL, и столкнулся с проблемой во время одного из моих испытательных стендов. Я тестирую все входные комбинации для комбинационного компонента, используя цикл for в моем процессе стимула, но у меня есть оператор case внутри цикла foor, который не ведет себя так, как мне бы хотелось.

Это сегмент кода, который ведет себя не так, как я хочу:

for i in 0 to 20 loop
    case opcode is
        when "01001" | "01010" | "01100" | "01110" | "10000" =>
            d <= '0';
            wait for period;
            d <= '1';
        when "00010" | "00100" | "00101" | "00110" | "10001" | "10010" | "10011" =>
            d <= '1';
        when others =>
            d <= '0';
    end case;
    wait for period;
    opcode <= opcode + 1;

end loop;

В качестве примера я ожидаю, что d станет 1, когда opcode равно 00010. В симуляции, однако, d становится 1, когда opcode становится 00011, а не 00010 (то же самое для всех остальных случаев), как если бы значение, проверяемое оператором case, уменьшалось на 1. Я изменил opcode внутри оператора case до opcode+1, и он работал правильно. Я знаю, что VHDL является языком описания аппаратных средств и его поведение отличается от языка программирования, но я все еще не могу понять, почему это происходит, и хотел бы получить объяснение.

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Обновление сигнала opcode не «воспринимается» симулятором до тех пор, пока оно не выполнит оператор ожидания. Добавление wait for 0 ns; в начале цикла устраняет проблему.

0 голосов
/ 06 июля 2019

Сигналы обновляются только после завершения процесса, но не переменная. Похоже, что VHDL интерпретирует opcode как переменную, если вы измените выражение case на opcode+1 и как сигнал else.

Присвоение значения сигналу выполняется с помощью <=, а для переменных это :=.

Попробуйте изменить

opcode <= opcode + 1

К

opcode := opcode + 1

...