Можно ли получать и считать время в Modelsim? - PullRequest
0 голосов
/ 03 мая 2020

Можно ли получать и считать время в Modelsim?

Например, я хочу сбросить датчик. Для сброса датчиков требуется лог c '1' в течение 60 мкс, поэтому мой код отправляет его. Мне нужно поймать сигнал в файле testbench. Могу я написать что-нибудь подобное?

if signal = '1' for 60 us then...

Это было бы как команда wait: wait for 100 us;, но наоборот.

Я пытался сделать это, создав дополнительные часы подайте сигнал и посчитайте нарастающие фронты. Тем не менее, я надеюсь, что есть более простое решение.

upd. Итак, в моем случае я не знаю правильного кода, однако я попытаюсь объяснить подробно.

entity testbench is
end entity testbench;

architecture tb of testbench is

    signal reset_signal : std_logic;
    signal flag_success : std_logic;

begin

    RESET_PROCESS : process -- example process
    begin
        reset_signal <= '1';
        wait for 100 us;
        reset_signal <= '0';
        report "End simulation" severity failure;
    end process RESET_PROCESS;

    SENSOR_PROCESS : process
    begin
        -- i don't now how to write it correctly
        -- pseudocode
        if reset_signal = '1' within 60 us then
            flag_success <= '1';
        else
            flag_success <= '0';
        end if;
    end process;

end architecture tb;

RESET_PROCESS, как и моя программа, посылает reset_signal для 60 нас. SENSOR_PROCESS должен получить сигнал reset_signal. Я могу добавить clk в SENSOR_PROCESS и могу сосчитать восходящие грани. Тем не менее, это modelsim, он знает все временные характеристики, поэтому я думаю, что это можно сделать без clk.

Я нашел атрибуты и написал код:

    if reset_signal = '0' then
        if reset_signal'quiet(60 us) then
            flag_success <= '1';
        else
            flag_success <= '0';
        end if;
    end if;

    -- or

    if reset_signal = '0' then
        wait for 60 us;
        if reset_signal'stable(60 us) then
            flag_success <= '1';
        else
            flag_success <= '0';
        end if;
    end if;

К сожалению, код не работает ..

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я нашел решение, которое соответствует моим требованиям:

SENSOR_PROCESS : process
begin
    if reset_signal'stable(60 us) and (reset_signal = '0') then
        flag_success <= '1';
    else
        flag_success <= '0';
    end if;
    wait for 1 us;
end process;

Последний оператор WAIT, такой как тактовый сигнал, однако, если что-то случится между циклами процесса, код его распознает.

Спасибо)

0 голосов
/ 04 мая 2020

Если вы хотите проверить, что после 60us данные все еще будут равны '1', то вы можете сделать это следующим образом:

...
wait for 60 us;
if (reset == '1') then
    wait for 1 ns;
    if (reset == '0') then
        flag_success <= '1';
    else
        flag_success <= '1';
   end if
else
    flag_success <= '0';
end if;

Если вы хотите проверить данные через все 60us, возможно, вы можете сделать что-то вроде :

...
for i in loop 0 to 60
if (reset == '1') then
...
else
wait for 1 us;
end if;
...