我已经编写了一个模拟过程,可以根据需要顺序设置或更改信号,我通常使用等待语句来等待某些时间间隔或等待信号分配,但只有当我知道信号何时到来时才会出现这种情况,例如:
reset <= '1';
write <= '0';
read <= '0';
wait for 25 ns;
reset <= '0';
chipselect <= '1';
wait until clk = '1';
但是现在我需要做一些不同的事情,我有一个通常为0的信号,我需要在它变为1时暂停模拟激励。但是信号不是定时的。意思是我不能用简单的等待语句来做,因为模拟只会在某个时间等待它。我希望这种效果始终发生。怎么做这样的事情?
答案 0 :(得分:2)
根据描述,我知道你想暂停刺激 基于信号生成,因此刺激时间相应延长 停顿的时间。
对于此,具有活动时间的信号(下面名为active_time
)可以是
创建,然后可以基于此时间生成刺激。活跃时间
仅在active_stimuli
为TRUE时运行。
与active_wait_for
对应的支持程序(下面名为wait for
)
然后可以创建等待请求的活动时间量,以供使用
刺激的产生过程。
建议代码:
architecture syn of tb is
-- Active declarations
signal active_stimuli : boolean := TRUE;
constant ACTIVE_RESOLUTION : time := 1 ps;
signal active_time : time := 0 ps;
-- Wait procedure for active delay
procedure active_wait_for(delay : time) is
variable active_time_start_v : time;
begin
active_time_start_v := active_time;
if delay > 0 ps then
wait until active_time >= active_time_start_v + delay;
end if;
end procedure;
-- Stimuli signal
signal stimuli_a : std_logic;
signal stimuli_b : std_logic;
begin
-- Active time generation
process is
begin
wait for ACTIVE_RESOLUTION;
if active_stimuli then
active_time <= active_time + ACTIVE_RESOLUTION;
else -- Save execution time in loop by wait until
wait until active_stimuli;
end if;
end process;
-- Stimuli generation
process is
begin
stimuli_a <= '0';
stimuli_b <= '0';
wait until active_time >= 2 ns;
stimuli_a <= '1';
active_wait_for(3 ns);
stimuli_b <= '1';
wait;
end process;
...
波形显示操作如下:
请注意,极性与问题中的信号不同,但是命名是 这种极性更清晰。
答案 1 :(得分:1)
关于&#34;暂停&#34;的一些想法中断型信号的激励过程:
将激励重写为时钟进程(例如状态机),并将中断用作时钟使能。但这可能是一种痛苦。
可能更容易,无论何时等待,等待这样的事情:
wait until clk = '1';
if interrupt = '1' then
wait until interrupt = '0';
wait until clk = '1';
end if;
或者它不是同步等待:
wait for 100 ns;
if interrupt = '1' then
wait until interrupt = '0';
end if;
当然,您可以编写一个程序来简化这些过程。可能有更简单/更优雅的方式来编码,但我写的应该有效。
答案 2 :(得分:0)
这就是你想要的:
process (start) begin
if rising_edge(start) then
-- Respond to start signal rising
end if;
end process;
答案 3 :(得分:0)
没有什么可以阻止您在测试平台/模拟中编写另一个进程来等待其他情况发生。您可能希望这样做的一个示例是,您只是计算特定条件的事件数。
例如:
Signal_Waiter : process(interrupt)
begin
if rising_edge(interrupt) then
-- do stuff here such as increment a counter
end if;
end process;
由于此过程完全独立于代码的“刺激”部分,因此始终可以进行唤醒和处理。在这种情况下,只要信号中断发生变化,它就会唤醒。
如果您正在从单独的过程中驱动刺激信号,请小心,因为您不能有两个过程驱动相同的信号。如果您需要对主控制过程的反馈,可以使用信号或共享变量进行反馈。