VHDL:如何在进程语句中执行for循环一次



我是vhdl和FPGA的新手。对于我的项目,我需要使用For循环。当我模拟我的代码时,它一直在计数,而不是停止。我希望我的代码只执行一次,我的重点是当循环达到极限时,代码将停止执行。这是我的密码。

process(clk)
begin

report "Hello";

for j in 0 to 3 loop 
if (j<4) then
cA <= cA + 1;
report "middle";
exit;
end if;
end loop;  

report "done";

end process;

正如教科书中可能解释的那样,VHDL过程是一个无限循环。在执行完最后一条指令后,执行第一条指令。

有敏感度列表的进程(在您的情况下为clk(等效于没有敏感度列表但列表上有最终等待语句的进程。因此,您的流程相当于:

process
begin    
report "Hello";
for j in 0 to 3 loop 
if (j<4) then
cA <= cA + 1;
report "middle";
exit;
end if;
end loop;  
report "done";
wait on clk;
end process;

因此,您的循环在模拟开始时第一次执行,进程将挂起,等待clk更改。每次clk更改时,它都会恢复,再次执行循环并挂起。如果你的时钟从未停止,你的进程将始终在一个时钟周期内恢复两次(一次在上升沿,一次在下降沿(。

如果您想在模拟开始时只执行一次此循环,请删除敏感度列表并添加wait作为最后一条语句。简单的CCD_ 5表示">永远等待";。它肯定会暂停进程:

process
begin    
report "Hello";
for j in 0 to 3 loop 
if (j<4) then
cA <= cA + 1;
report "middle";
exit;
end if;
end loop;  
report "done";
wait;
end process;

相反,如果您想执行循环并仅在特定事件发生后停止,例如信号go被断言为高电平的时钟上升沿,请在过程开始时添加另一条wait语句:

process
begin
wait until rising_edge(clk) and go = '1';
report "Hello";
for j in 0 to 3 loop 
if (j<4) then
cA <= cA + 1;
report "middle";
exit;
end if;
end loop;  
report "done";
wait;
end process;

最新更新