在verilog中实现边缘触发复位,无需初始块



我正在尝试将edge_triggered重置添加到我的module,这意味着只有在reset中检测到从0到1的瞬态时,才应该执行重置操作。此外,我不想在我的模块中使用任何initial块(因为我认为初始块在FPGA中存在问题(。

最后,我决定这样做:

always @ (posedge clock, posedge reset) ...

但我遇到的问题是,我需要知道always block灵敏度列表的哪个元素被激活。

我还认为这种方法不是一个合适的解决方案:

always @ (posedge clock, posedge reset) begin
if(reset) begin
//doing reset operations
end
.
.
.
end

因为如果reset在下一个posedge clock中比以前的时钟为1(不是从0到1的瞬态(,则将执行重置操作!但我们不想这样。

那么,有没有办法找出灵敏度列表中的哪个元素激活了always block?或者甚至用于实现边缘触发重置的任何其他解决方案?

几乎可以肯定的是,在您的FPGA中没有一个基元可以完全按照您的意愿进行操作。即使在模拟中,也无法判断敏感度列表中的哪条边触发了更新。

您发布的代码应该是合成的,但正如您所指出的,它的行为就像标准的异步重置,并且只要reset为高,它就会继续重置。为了只在reset上升沿上复位,您需要一些时钟域交叉逻辑来检测边沿并在clock域上输出单个脉冲。

例如:

// This module can assert reset_pulse asynchronously but must output a pulse
// for at least one 'clock' cycle and deassert synchronously.
async_edge_to_pulse e2p (
.in_edge   (reset),
.out_clock (clock),
.out_pulse (reset_pulse)
);
always @(posedge clock or posedge reset_pulse) begin
if (reset_pulse) begin
// reset logic
end else begin
// operational logic
end
end

最新更新