VHDL:如何在进程语句中执行一次 for 循环
VHDL: How can I execute the for loop once in process statement
我是 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
作为最后一个语句。一个简单的 wait
表示“永远等待”。它肯定会暂停进程:
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;
我是 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
作为最后一个语句。一个简单的 wait
表示“永远等待”。它肯定会暂停进程:
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;