我正在尝试将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