Стенд для разработки таймера реакции VHDL

Я должен протестировать с помощью modelsim этот компонент:

    COMPONENT part5 
PORT ( CLOCK_50,KEY0,KEY3 : IN STD_LOGIC;
       SW: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
       HEX3,HEX2,HEX1,HEX0: OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
       LEDR : OUT STD_LOGIC_VECTOR (1 DOWNTO 0)
      );
END COMPONENT;

Это будет реализовано на альтере DE2. Предполагается, что он работает с часами (CLOCK_50), после того, как KEY0 переходит на логический уровень 1, подсчитывая тактовые периоды, пока не достигнет числа, вставленного в SW (7 DOWNTO 0), в этот момент загорается красный светодиод: LEDR. С момента включения LEDR четыре шестнадцатеричных дисплея (HEX0, HEX1, HEX2 и HEX3) начинают отсчет с интервалом в 1 мс. Я должен нажать кнопку KEY3 (на плате DE2) как можно быстрее, пока не достигну значения, представленного в SW(7 DOWNTO 0): красный свет гаснет и показывает остановку счета.

Я пробовал с этим:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;` 

ENTITY tb_part5 IS 
END ENTITY;

ARCHITECTURE beha OF tb_part5 IS

COMPONENT part5 
PORT ( CLOCK_50,KEY0,KEY3 : IN STD_LOGIC;
       SW: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
       HEX3,HEX2,HEX1,HEX0: OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
       LEDR : OUT STD_LOGIC_VECTOR (1 DOWNTO 0)
      );
END COMPONENT;

SIGNAL clk,key,rst: STD_LOGIC:='0';--inputs
SIGNAL switch: STD_LOGIC_VECTOR (7 DOWNTO 0); 
SIGNAL led,led1: STD_LOGIC;--outputs
SIGNAL dec0,dec1,dec2,dec3 : STD_LOGIC_VECTOR (6 DOWNTO 0);

BEGIN
switch<="00001010";

PROCESS --clock
BEGIN
clk<='1' AFTER 10 ns ;
clk<='0' AFTER 20 ns ;
END PROCESS;

PROCESS --reset
BEGIN
rst<='0';
WAIT FOR 20 ns;
rst<='1';
WAIT;
END PROCESS;

PROCESS
BEGIN
IF led='1' THEN 
   key<= '1';
   WAIT FOR 20 ns;
   key<='0';
   WAIT FOR 20 ns;
ELSE 
   key<='0';
END IF;
END PROCESS;



DUT : part5 PORT MAP (CLOCK_50=>clk, KEY0=>rst,KEY3=>key,SW=>switch,HEX3=>dec3,HEX2=>dec2,HEX1=>dec1,HEX0=>dec0,LEDR(0)=>led,LEDR(1)=>led1);
END beha;

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

Спасибо


person 218141    schedule 14.04.2018    source источник
comment
Но симуляция не дает никаких результатов не является полезной формулировкой проблемы. Предоставьте минимальный воспроизводимый пример, позволяющий смоделировать ваш код без отсутствующей сущности/архитектуры. Ваш часовой процесс не работает и не содержит оператора ожидания или списка чувствительности и будет зацикливаться, не приостанавливая зависание модели моделирования. Ошибка в тестовой среде, обратите внимание на операторы ожидания в процессе часов. Запросы на сторонние ресурсы не по теме.   -  person    schedule 14.04.2018


Ответы (1)


Архитектура тестового стенда для начинающих может быть очень простой. Вы можете протестировать множество компонентов всего за 5 процессов (включая clk и процесс сброса). Когда вы создаете тестовый стенд, вы обычно генерируете по крайней мере один такт и сброс для тестируемого проекта (DUT). Для этого процесса вы можете сохранить следующее, и это должно работать для всех одиночных часов (не имеет значения, является ли сброс синхронным или асинхронным). Затем вы создадите процесс стимула. Этот процесс позволит вам генерировать данные для вашего тестируемого устройства (вы повлияете на сигналы, подключенные к вашему тестируемому устройству). Этот процесс может определить конец вашей симуляции. Вы можете установить некоторые сигналы и подождать 100000 нс, если хотите протестировать последовательность без сигналов модификации (входы тестируемого устройства).

После создания стимула вы можете запустить симуляцию и вручную проверить выходные данные тестируемого устройства, но это не лучший способ (может быть, в вашем случае, но не в более крупном проекте). Самый простой способ контролировать целостность ваших выходных данных — создать ссылку. Эта ссылка является ожидаемой реакцией вашего дизайна. Например: если вы хотите реализовать дизайн, который ждет 100 тактов. Вы создадите опорный сигнал выхода, но вам не нужно использовать VHDL, который вы можете синтезировать. У вас есть доступ ко всем функциям VHDL (ожидание, ожидание и т. д.).

В конце у вас будет последний процесс, чекер. Этот будет сравнивать выходные данные и ссылки, чтобы определить, есть ли какие-то ошибки в вашем дизайне.

Не забудьте поместить оператор ожидания во все процессы (в зависимости от end_sim_s для каждого примера), чтобы остановить симуляцию, когда все будет смоделировано

Вот структура пустого тестового стенда:

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

entity tb_part5 is
    port (
     -- no IO for test bench
    );
end entity;

architecture beha of tb_part5 is

    ---------------
    -- Constants --
    ---------------
    constant CLOCK_PERIOD : time := 10 ns;  -- e.g.

    ------------------------
    -- Test bench signals --
    ------------------------
    signal clk_sti   : std_logic := '0';
    signal rst_sti   : std_logic := '1'; -- !!! activ high !!!
    -- end of sim flag
    signal end_sim_s : boolean   := false;

begin

    ----------------------
    -- Clock generation --
    ----------------------
    process
    begin
        clk_sti <= '1';
        wait for CLOCK_PERIOD/2;
        clk_sti <= '0';
        wait for CLOCK_PERIOD/2;
        if end_sim_s = true then
            wait;                       -- end of simulation
        end if;
    end process;

    --------------------
    -- Reset sequence --
    --------------------
    process
    begin
        rst <= '1';
        wait for 2*CLOCK_PERIOD;
        rst <= '0';
        wait;
    end process;

    ----------------------
    -- Stimulus process --
    ----------------------
    process
    begin
        -- default values for DUT inputs

        -- wait end of reset sequence
        wait until (rst_sti = '0');

        -- do something

        -- end of simulation
        end_sim_s <= true;
        wait;
    end process;

    -----------------------
    -- Reference process --
    -----------------------

    -------------------
    -- Check process --
    -------------------

    -----------------------
    -- DUT instanciation --
    -----------------------

end beha;

Для вашего тестового стенда я предлагаю вам следующую архитектуру. Но вы должны осознавать, что ваш испытательный стенд ничего не проверяет.

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

entity tb_part5 is
port (
    -- no IO in test bench
    );
end entity;

architecture beha of tb_part5 is

    ---------------
    -- Constants --
    ---------------
    constant CLOCK_PERIOD : time := 10 ns;  -- e.g.

    -----------------------
    -- Internals signals --
    -----------------------
    signal clk, key, rst          : std_logic := '0';  --inputs
    signal switch                 : std_logic_vector (7 downto 0);
    signal led, led1              : std_logic;         --outputs
    signal dec0, dec1, dec2, dec3 : std_logic_vector (6 downto 0);

    -- test bench signals
    signal end_sim_s : boolean := false;


begin

    switch <= "00001010";

    ----------------------
    -- Clock generation --
    ----------------------
    process
    begin
        clk <= '0';
        wait for CLOCK_PERIOD/2;
        clk <= '1';
        wait for CLOCK_PERIOD/2;
        if end_sim_s = true then
            wait;                       -- end of simulation
        end if;
    end process;

    --------------------
    -- Reset sequence --
    --------------------
    process
    begin
    -- TIPS : if you want to be more efficient you should us a norm to
    -- define your signal. A reset signal activ low can be called nRst for
    -- exemple. Maybe actually you have an activ low reset but maybe not.
    -- This exemple show a reset activ low sequence
        rst <= '0';
        wait for 2*CLOCK_PERIOD;
        rst <= '1';
        wait;
    end process;

    ---------------------
    -- Your TEST bench --
    ---------------------
    -- this part do the same thing that you were asking.    
    process
    begin
        -- the if statement in the previous version is not a good thing to do.
        -- in fact, you want your process to wait until an event.

        -- initial state (default value)
        key <= '0';

        -- wait until the end of reset sequence (just in case)
        wait until (rst = '1');         -- e.g.

        -- wait until DUT assert led
        wait until (led = '1');         -- e.g.

        -- start your sequence
        key <= '1';
        wait for 20 ns;
        key <= '0';
        wait for 20 ns;

        -- here you have 2 choices. let the process iterate a second time or just
        -- end the simulation at this moment
        -- stop here
        -- notify the others process the end of simulation
        end_sim_s <= true;
        -- block process
        wait;
    end process;

    -----------------------
    -- DUT instanciation --
    -----------------------
    DUT : part5 port map (
        CLOCK_50 => clk,
        KEY0     => rst,
        KEY3     => key,
        SW       => switch,
        HEX3     => dec3,
        HEX2     => dec2,
        HEX1     => dec1,
        HEX0     => dec0,
        LEDR(0)  => led,
        LEDR(1)  => led1
        );

end beha;

Надеюсь, что это поможет вам. С уважением. Майк

person M.Meury    schedule 20.04.2018