使用 If 条件每 10 个时钟周期执行一次 "something"。如果 "something" 需要超过 1 个时钟周期怎么办?

Using If condition to do "something" once every 10 clock cycles. what if "something" takes more than 1 clock cycle?

我正在编写一些 VHDL 代码,这些代码将用于(在 FPGA 上)读取 16 位数字信号,进行一些处理,然后写出 16 位处理后的信号。目前它是这样设置的,所以它应该每 10 个时钟周期读取一次输入,在下一个时钟周期做一些处理(它目前什么都不做,只是输出输入)然后在剩下的 8 个时钟周期增加计数器。

如果处理完成的时间超过一个时钟周期会发生什么(它会怎样),它会继续直到它完成并停止计数器递增直到它完成吗?或者计数器在处理信号时会保持并行递增吗?

我会将其设置为在 8 个时钟周期结束之前完成该过程(及时写入输出)。

伪代码看起来像这样:

Do (on rising clock edge):
if (n = 10) then
  n <= 1;
  Output <= ProcessedSignal;
  InputSignal <= Input;
elsif (n = 1) then
  n <= n + 1
  Output <= Output;
  -- do some signal processing here (e.g. a filter)
  ProcessedSignal <= InputSignal;
else
  n <= n + 1;
  Output <= Output;
  ProcessedSignal <= ProcessedSignal;
end if;

这完全取决于您如何编写代码;任何一种行为都是可能的。你的伪代码几乎是有效的 VHDL,如果我理解正确的话,它会做你想做的。这是对真实代码的建议:(没有 architecture/signal 声明,也缺少重置)

process (clock)
begin
  if rising_edge(clock) then
    n <= n + 1; -- default assignment

    if (n = 10) then
      n <= 1; -- overrides default assignment
      Output <= ProcessedSignal;
      InputSignal <= Input;
    elsif (n = 1) then
      -- do some signal processing here (e.g. a filter)
      ProcessedSignal <= InputSignal;
    elsif (n = 2) then
      -- do more processing
    end if;
  end if;
end process;

请注意,在时钟进程中不需要向自身写入信号,除非您想明确表示信号保持其旧值。