verilog中的posedge只能用在时钟上吗?
Can posedge in verilog be used only on clock?
能否在不是时钟的变量上检测到 posedge?
比如我有一个复位键R,只要按一下就会把机器复位到启动状态。
always @ (posedge clk, posedge R)
if(R)
reset_the_machine();
else
use_the_next_state();
在设置或重置等信号上使用 边沿 是模板模式合成工具选择在单个 always
中表示异步逻辑的产物堵塞。如果您没有使用 posedge
限定 R
,那么 R
的下降沿 (negedge
) 将执行 use_next_state()
分支。因此模拟会将复位的释放解释为 posedge
时钟。
最初开发 Verilog 时,其目的是使用单独的 always
块来实现使用过程连续分配的同步和异步行为
always @(R)
if (R)
assign state = initial_state;
else
deassign state;
always @(posedge clk)
state <= next_state;
但今天的综合工具不再支持此模板,可能是因为与完全连续的 assign
语句混淆。
你的问题有两个问题:
can posegde in verilog be used only on clock?
答案是否定的
Can a posedge be detected on variables that aren't a clock?
答案是肯定的。
verilog 语言中没有时钟。每个信号都是平等的。可以在任何变量的模拟中检测到边缘。边缘检测本身就是一个模拟工件。
时钟只是一个现代硬件神器。 verilog 程序反映硬件行为,因此需要以特定的硬件相关方式对时钟进行编程。但这只是一个编程技巧。
关于您的示例,请参阅 dave-59 的回答。
能否在不是时钟的变量上检测到 posedge?
比如我有一个复位键R,只要按一下就会把机器复位到启动状态。
always @ (posedge clk, posedge R)
if(R)
reset_the_machine();
else
use_the_next_state();
在设置或重置等信号上使用 边沿 是模板模式合成工具选择在单个 always
中表示异步逻辑的产物堵塞。如果您没有使用 posedge
限定 R
,那么 R
的下降沿 (negedge
) 将执行 use_next_state()
分支。因此模拟会将复位的释放解释为 posedge
时钟。
最初开发 Verilog 时,其目的是使用单独的 always
块来实现使用过程连续分配的同步和异步行为
always @(R)
if (R)
assign state = initial_state;
else
deassign state;
always @(posedge clk)
state <= next_state;
但今天的综合工具不再支持此模板,可能是因为与完全连续的 assign
语句混淆。
你的问题有两个问题:
can posegde in verilog be used only on clock?
答案是否定的
Can a posedge be detected on variables that aren't a clock?
答案是肯定的。
verilog 语言中没有时钟。每个信号都是平等的。可以在任何变量的模拟中检测到边缘。边缘检测本身就是一个模拟工件。
时钟只是一个现代硬件神器。 verilog 程序反映硬件行为,因此需要以特定的硬件相关方式对时钟进行编程。但这只是一个编程技巧。
关于您的示例,请参阅 dave-59 的回答。