【发布时间】:2023-02-23 02:52:15
【问题描述】:
我目前正在通过 Pong Chu 的工作通过 System Verilog 示例进行 FPGA 原型设计,特别是第 4 章,其中介绍了时序电路。 Chu在其中描述了时序电路具有时序部分和组合部分的方法。到目前为止,一切都很好。作为一个例子,他展示了一个带同步清除的 D FF 是如何编码的:
module d_ff_sync_clr_2seg
(
input logic clk,
input logic syn_clr,
input logic d,
output logic q
);
// signal declaration
logic r_reg, r_next;
// body
// D FF
always_ff @(posedge clk)
r_reg <= r_next;
// next-state logic
always_comb
if (syn_clr)
r_next = 1'b0;
else
r_next = d;
// output logic
assign q = r_reg;
endmodule
在讨论中,他指出 syn_clr 信号仅在时钟的上升沿检查。他还为我发现更清晰的同一电路提供了不同的格式样式:
module d_ff_sync_clr_1seg
(
input logic clk,
input logic syn_clr,
input logic d,
output logic q
);
// body
always_ff @(posedge clk)
if (syn_clr)
q <= 1'b0;
else
q <= d;
endmodule
在第二个例子中(d_ff_sync_clr_1seg), 我可以清楚地看到,是的,在时钟的上升沿总是_ff块被激活并且syn_clr确实被采样了。
在第一个(d_ff_sync_clr_2seg), 更长的例子, Chu 的陈述syn_clr仅在时钟的上升沿检查不那么清楚。我的想法是,当syn_clr变化,总是梳块被激活,并且r_next更新为 1'b0 或d.然后,在时钟的上升沿,r_reg被赋予的价值r_next,因为它是在总是梳堵塞。如此间接地看起来,syn_clr(或检查结果syn_clr) 在时钟的上升沿被采样。我看不到发生的事情之间的联系总是_ff只对时钟的上升沿敏感的块和总是梳它将在任何时候激活syn_clr变化。怎么syn_clr只是在时钟的上升沿采样,因此是同步的,如果它在总是梳堵塞。
我明白在一个总是_ffblock 赋值是非阻塞的并且发生在块的末尾,但是在这个例子中只有一个赋值所以没问题。
此时,Chu 在书中提到了 FSM 和 FSMD,但并未在本章中正式介绍这些概念。
也许我遗漏了其他东西或我对总是块没有我想象的那么坚固。任何澄清将不胜感激。
【问题讨论】:
标签: system-verilog sequential flip-flop