3.2.1.1 D flip-flop
问题描述
D触发器是一种存储位并定期更新的电路,通常在时钟信号的上升沿触发。
当使用时钟控制的always 块时,逻辑合成器会创建 D 触发器。D触发器是“组合逻辑块后接触发器”的最简单形式,其中组合逻辑部分只是一条线。创建一个 D 触发器。
代码:
module top_module (
input clk, // Clocks are used in sequential circuits
input d,
output reg q );//
// Use a clocked always block
// copy d to q at every positive edge of clk
// Clocked always blocks should use non-blocking assignments
always @(posedge clk) begin
q<=d;
end
endmodule
3.2.1.2 D flip-flops
问题描述
创建 8 位 D 触发器。所有 DFF 都应由clk的上升沿触发。
代码:
module top_module (
input clk,
input [7:0] d,
output [7:0] q
);
always @(posedge clk) begin
q<=d;
end
endmodule
3.2.1.3 DFF with reset
问题描述
创建 8 位具有高电平有效同步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。
相关知识:同步复位,当复位信号有效并且时钟沿到来时,产生复位操作。
优点:
- 抗干扰性高,可以剔除复位信号中周期短于时钟周期的毛刺,增强电路的稳定性;
- 有利于静态时序分析工具的分析
- 有利于基于周期的仿真工具的仿真
缺点:
- 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位。同时还要考虑如:时钟偏移、组合逻辑路径延时、复位延时等因素;
- 由于大多数的厂商目标库内的触发器都只有异步复位端口,采用同步复位的话,综合器就会在寄存器的数据输入端插入组合逻辑,耗费更多的逻辑资源;
- 同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。
代码:
module top_module (
input clk,
input reset, // Synchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk) begin
if(reset)
q<=8'd0;
else
q<=d;
end
endmodule
3.2.1.4 DFF with reset value
问题描述
创建 8 位具有高电平有效同步复位的 D 触发器。触发器必须重置为 0x34 而不是零。所有 DFF 都应由clk的下降沿触发。将寄存器重置为“1”有时称为“预设”
代码:
module top_module (
input clk,
input reset,
input [7:0] d,
output [7:0] q
);
always @(negedge clk)
begin
if(reset)
q <= 8'h0x34;
else
q <= d;
end
endmodule
3.2.1.5 DFF with asynchronous reset
问题描述
创建 8 位具有高电平有效异步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。
同步和异步复位触发器之间代码的唯一区别在于灵敏度列表。
相关知识:异步复位,无论时钟边沿到来与否,只要复位信号有效,输出就会被复位。
优点:
- 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源,设计相对简单。
- 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
缺点:
- 在复位信号释放的随机性,可能导致时序违规。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,如下图;
- 复位信号容易受到毛刺的影响
代码:
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output [7:0] q
);
always @(posedge clk or posedge areset) begin
if(areset)
q<=8'd0;
else
q<=d;
end
endmodule
拓展知识:异步复位,同步释放
优点:
- 避免复位信号释放的时候造成亚稳态问题
- 只要复位信号一有效,电路就处于复位状态,与时钟沿无关
- 有效捕捉复位,即使是短脉冲复位也不会丢失
- 有明确的复位撤销行为。复位的撤离是同步信号,因此有良好的的撤离时序和足够的恢复时间。
- 具体例子推荐异步复位,同步释放 - 知乎
3.2.1.6 DFF with byte enable
问题描述
创建 16 位D 触发器。有时只修改一组触发器的一部分很有用。字节使能输入控制 16 个寄存器中的每个字节是否应在该周期写入。byteena[1]控制高字节d[15:8],而byteena[0]控制低字节d[7:0]。resetn是一个同步的低电平有效复位。所有 DFF 都应由clk的上升沿触发。
代码:
module top_module (
input clk,
input resetn,
input [1:0] byteena,
input [15:0] d,
output [15:0] q
);
always @(posedge clk) begin
if(!resetn)
q<=16'd0;
else
begin
q[7:0]<=byteena[0]?d[7:0]:q[7:0];
q[15:8]<=byteena[1]?d[15:8]:q[15:8];
end
// else后面有两条语句,begin...end不能省略
end
endmodule