ModelSim — имитация нажатия кнопок

Я хочу использовать четыре кнопки в качестве входов и три семисегментных светодиодных дисплея в качестве выходов. Две кнопки должны перемещаться вверх и вниз по шестнадцати ячейкам ОЗУ; два других должны увеличивать и уменьшать содержимое текущей отображаемой ячейки памяти. Сейчас я пытаюсь смоделировать свой дизайн, используя испытательные стенды ModelSim с помощью нажатия кнопок. Вот то, что я считаю соответствующими частями моего кода:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity DE2_TOP is

  port (
    KEY : in std_logic_vector(3 downto 0);         -- Push button
    );

end DE2_TOP;

architecture datapath of DE2_TOP is

begin  
  U1: entity work.lab1 port map (
    key => key,         
  );

end datapath;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity raminfr is                     -STANDARD RAM INFERENCE
    port (
        clk : in std_logic;
        we : in std_logic;
        a : in unsigned(3 downto 0);
        di : in unsigned(7 downto 0);
        do : out unsigned(7 downto 0)
    );
end raminfr;

architecture rtl of raminfr is

type ram_type is array (0 to 15) of unsigned(7 downto 0);
signal RAM : ram_type;
signal read_a : unsigned(3 downto 0);
begin
process (clk)
begin
    if rising_edge(clk) then
        if we = '1' then
            RAM(to_integer(a)) <= di;
        end if;
        read_a <= a;
    end if;
end process;
do <= RAM(to_integer(read_a));
end rtl;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity lab1 is
    port(
        clock : in std_logic;
        key : in std_logic_vector(3 downto 0); 
        );
end lab1;

architecture up_and_down of lab1 is
    signal value_in_ram : unsigned(7 downto 0);
    signal clk : std_logic;
    signal we : std_logic;
    signal value_counter    : unsigned(7 downto 0) ;
    signal register_counter : unsigned(3 downto 0);
        begin
    U1: entity work.raminfr port map (
        a   => register_counter,
        di  => value_counter,
        do  => value_in_ram,
        clk => clk,
        we  => we
    );

    process(clock)
        begin
            if rising_edge(clock) then
                if (key(3)='0' and key(2)='0' and key(1)='1' and key(0)='0') then
                    value_counter <= value_counter + "1";   
                elsif (key(3)='0' and key(2)='0' and key(1)='0' and key(0)='1') then  
                    value_counter <= value_counter - "1";   
                elsif (key(3)='1' and key(2)='0' and key(1)='0' and key(0)='0') then
                    register_counter<= register_counter + "1";
                    value_counter <= value_in_ram;
                elsif (key(3)='0' and key(2)='1' and key(1)='0' and key(0)='0') then
                    register_counter<= register_counter - "1";
                    value_counter <= value_in_ram;
                end if;
            end if;
    end process;
end architecture up_and_down;

Проблема в том, что, несмотря на инициализацию «ключа» (кнопок) на моем тестовом стенде, ModelSim по-прежнему отображает объект как «UUUU». Вот код моего тестового стенда, который находится в отдельном файле:

library ieee;
use ieee.std_logic_1164.all;

entity DE2_TOP_TEST is
end;

architecture BENCH of DE2_TOP_TEST is
signal KEY : std_logic_vector(3 downto 0);

begin
    KEY<="0010";
    U1: entity work.DE2_TOP port map (
        key=>key,
    );
end BENCH;

Кто-нибудь знает, что случилось?


person John Roberts    schedule 26.01.2013    source источник
comment
Создание тестового стенда в VHDL очень поможет в отладке вашего дизайна. В тестовом стенде вы эмулируете поведение внешнего мира (большую часть времени: все, что находится за пределами FPGA/ASIC). Сам тестовый стенд является лишь частью симуляции, а не реализацией с помощью ISE/Quartus/... на тестовом стенде вы нажимаете кнопки не внутри самого дизайна.   -  person vermaete    schedule 26.01.2013
comment
быстро и грязно: переместите «ключ ‹= ...» за пределы процесса. Сделайте это параллельным заданием. И исправить список чувствительности процесса. Только "часы" должны быть там.   -  person vermaete    schedule 26.01.2013
comment
Я переместил назначение клавиш непосредственно над оператором процесса, но получил тот же результат. Возможно, это связано с тем, что ModelSim извлекает ключ из моего объекта DE2_TOP, где он по-прежнему будет неинициализирован, поскольку я закомментировал сопоставление портов из lab1. Я также уже сделал тестовый стенд, но, возможно, я не использую его в полной мере. Не могли бы вы уточнить это?   -  person John Roberts    schedule 26.01.2013
comment
О тестовых стендах: Доулос сделал хорошее руководство по этому поводу doulos.com/knowhow/vhdl_designers_guide/test_bench_part_1< /а>   -  person vermaete    schedule 26.01.2013
comment
Если у вас есть тестовый стенд, обратите внимание, что вам нужно смоделировать тестовый стенд (vsim work._the_testbench_entity) i.s.o. верхний уровень вашего дизайна. Я бы пошел на тестовый стенд и не утверждал бы значение «ключа» в самом дизайне. Извините, что не прочитал весь ваш код, мне сейчас не хватает времени.   -  person vermaete    schedule 26.01.2013
comment
У меня есть тестовый стенд, но я не думаю, что использую его правильно. Все, что я сделал, это настроил его через графический интерфейс и указал на мой файл D2_TOP, по сути, сделав то, что я тестирую, таким же, как мой тестовый стенд. Я попытаюсь создать настоящий тестовый стенд в отдельном файле.   -  person John Roberts    schedule 26.01.2013
comment
Эй, чувак, я перешел на использование тестового стенда, но получил тот же результат. Не могли бы вы проверить мой измененный вопрос?   -  person John Roberts    schedule 27.01.2013


Ответы (1)


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

constant tb_clk_period : time       := (1 sec) / 10_000_000; -- 10 MHz
signal   tb_clk        : std_ulogic := '0';
...
-- clock generator
tb_clk <= not tb_clk after tb_clk_period / 2;
person user2099996    schedule 04.03.2013