VHDL 状态机和时钟

VHDL state machines and clock

我有一个关于 VHDL 中使用的状态机的一般性问题。我听说每个状态都在一个时钟周期内处理。

假设我有一个状态需要一个以上的时钟周期才能完成。例如,如果我想在某个状态下等待几秒钟。这能做到吗?

或者如果我有一个状态,我想写入一个需要 10 个时钟周期(10 个地址)来填充的 blockram。这可以在通常用于呈现状态机的 case 语句中完成吗?

通常在你需要在一个状态下执行N个重复动作的情况下(如你所描述的,等待N ns,写入N个地址。)它通常在其中使用一个计数器。希望下面的例子可以澄清一点:

process(clk, rst)
begin
if (rst = '1') then
index <= 0; -- memory address
current_s <= write_memory ;
currentValue <= (others => '0');
elsif rising_edge(clk) then
   case curresnt_s is 
   when write_memory =>
      if index < ADDRESS_SIZE then
        index <= index + 1; 
        memory(index) <= currentValue;
      else 
        curresnt_s  <= done;
      end if;
   when done => null;
   end case;
end case;

在此代码内存中将是一个 std_logic_vector 数组; 您可以使用相同的想法等待 100ns。 如果你知道你的时钟以 10ns 的周期运行,你可以在改变到其他状态之前在某种状态下数到 10。