2016-05-24 30 views
0

我正在使用一些VHDL代码(在FPGA上)读取16位数字信号,做一些处理,然后写出16位处理后的信号。目前它的设置应该是每10个时钟周期读一次输入,在下一个时钟周期进行一些处理(目前它什么都不做,只是输出输入),然后在剩下的8个时钟周期内递增计数器。使用If条件每10个时钟周期执行一次“某事”。如果“某事”需要超过1个时钟周期,该怎么办?

如果处理需要超过一个时钟周期才能完成(会如何),它会一直持续到完成并停止计数器递增直到它结束为止?或者计数器在处理信号时保持并行递增?

我将它设置为在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; 
+2

你的问题似乎为时过早。请参见[我如何提出一个好问题?](http://stackoverflow.com/help/how-to-ask)您可以编写一些实际的VHDL代码并进行模拟,以便您可以针对可复制的问题提出具体问题通过一个[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve)。 – user1155120

回答

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; 

注意,没有必要给信号写入自身以时钟控制的过程,除非你想让它明确信号保持其旧值。

+0

谢谢,这真的很有帮助。如果我没有明确说明信号保持旧值,我不确定输出是否会保持时钟周期之间的值。我也很高兴知道我可以覆盖默认任务,因为我先学习了SystemVerilog,但我不确定你可以在SystemVerilog中做到这一点,因为我相信它会给你一个错误,说你正在向同一输出写入2种不同的东西。 – SomeRandomPhysicist

相关问题