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;