在Verilog时序电路的设计中时钟是最关键的要素,尤其在可综合的时序设计中只能利用时钟边沿进行处理。 在always过程中利用时钟边沿(posedge 或negedge)驱动的寄存器类型变量可以综合成触发器(flip-flop)模型,如D触发器(D Flip-flop),JK触发器等模型,最常用的模型是D触发器模型。
- D触发器模型
最简单的D触发器有三个端子,分别为clock 端,D端,Q端
- 上升沿的D触发器模型如图1,在时钟上升沿时刻,触发器的Q端的值更新为D端的值,其它时间保持不变。
图1
- 下降沿的模型如图2.在时钟下降沿时刻,触发器的Q端的值更新为D端的值,其它时间保持不变。
图2
2.触发器的级联
在FPGA设计中一般都是采用同步时序电路设计,因此各个触发器按照分组的方式组成同步时序电路,在一个always过程中由于只使用一个时钟,因此在该过程的各个寄存器被赋值的寄存器都用同一个时钟边沿,因此它们的行为是同步的。也就是所有的触发器在时钟的边沿的驱动下,在同一时刻将触发器的Q端的值更新为对应的各自触发器的D端的值,这就是所谓的同步时序电路。级联及同步如图3所示。
图3
3.触发器的反馈
触发器反馈电路设计,是将触发器的Q输出端经过组合逻辑电路运算后反馈到输入端。该电路在计数器,分频器,累加器等的时序电路设计中应用比较广泛。
图3
例1 :Verilog描述D触发器模型
module dff ( input clk, input d, output reg q ); always@(posedge clk) q<=d; endmodule
图4
例2:带异步load端的D触发器模型。
module dffl_async ( input clk, input ld, input a, input d, output reg q ); always@(posedge clk or posedge ld) if(ld) q <= a; else q <= d; endmodule
例3:带同步load端的D触发器模型。
module dffl_sync ( input clk, input ld, input a, input d, output reg q ); always@(posedge clk) if(ld) q <= a; else q <= d; endmodule
带异步复位D触发器模型
例4:
module dffr ( input clk, input r, input d, output reg q ); always@(posedge clk or posedge r) if(r) q <= 1'b0; else q <= d; endmodule
例5:带异步置位端的D触发器模型
module dffls ( input clk, input s, input d, output reg q ); always@(posedge clk or posedge s) if(s) q <= 1'b1; else q <= d; endmodule
例6:带反馈的D触发器模型
module counter ( input clk, output reg [3:0] q = 0 ); wire [3:0] d; assign d = q+1; always@(posedge clk) q <= d ; endmodule
根据以上实例设计,还可以得到它们之间的各种组合,这里就不一一举例。
注意:在always的敏感表中不支持边沿和电平混合模式,如:
always@(posedge clk or s) 这种写法是错误的,应改成:
always@(posedge clk or posedge s)