【问题标题】:Using If condition to do "something" once every 10 clock cycles. what if "something" takes more than 1 clock cycle?使用 If 条件每 10 个时钟周期执行一次“某事”。如果“某事”需要超过 1 个时钟周期怎么办?
【发布时间】:2016-05-26 00:43:26
【问题描述】:

我正在编写一些 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


【解决方案1】:

这完全取决于您如何编写代码;任何一种行为都是可能的。您的伪代码几乎是有效的 VHDL,如果我正确理解您,它将执行您想要的操作。这是对真实代码的建议:(没有架构/信号声明,也缺少重置)

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;

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

【讨论】:

  • 谢谢,这真的很有帮助。如果我没有明确说明信号保持它的旧值,我不确定输出是否会在时钟周期之间保持它的值。很高兴知道我可以覆盖默认分配,因为我首先学习了 SystemVerilog,但我不确定你是否可以在 SystemVerilog 中做到这一点,因为我相信它会给你一个错误,说你正在向同一个输出写入 2 个不同的东西。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多