📅  最后修改于: 2021-01-11 15:07:24             🧑  作者: Mango
D触发器是在时钟给定边沿跟随输入引脚d的顺序元件。 D触发器是数字逻辑电路中的基本组件。
实现了两种类型的D型触发器:上升沿D型触发器和下降沿D型触发器。
D触发器是一个边沿触发的存储设备,当其时钟输入发生有效边沿跳变时,会将其D输入上的信号值传输到Q输出。然后,输出值一直保持到下一个有效时钟周期为止。
使用边沿触发的always语句来推断触发器。通过在事件列表中包含posege或negedge子句,可以始终触发always语句。以下是一些顺序Always语句的示例,例如:
always @(posedge Clock)
always @(negedge Clock)
always @(posedge Clock or posedge Reset)
always @(posedge Clock or negedge Reset)
always @(negedge Clock or posedge Reset)
always @(negedge Clock or negedge Reset)
如果异步复位触发器被建模,需要在总语句的事件列表中的第二posedge或negedge条款。同样,大多数综合工具都要求必须在Always语句之后的if语句中或在begin之后(如果它位于顺序的begin-end块中)使用reset。
例
//Active low asynchronous reset
always @(posedge Clock or negedge Reset)
begin
if (!Reset)
…….
……..
end
module dff (input d,
input rstn,
input clk,
output reg q);
always @ (posedge clk or negedge rstn)
if (!rstn)
q <= 0;
else
q <= d;
endmodule
硬件原理图
试验台
module tb_dff;
reg clk;
reg d;
reg rstn;
reg [2:0] delay;
dff dff0 ( .d(d),
.rsnt (rstn),
.clk (clk),
.q (q));
// Generate clock
always #10 clk = ~clk;
// Testcase
initial begin
clk <= 0;
d <= 0;
rstn <= 0;
#15 d <= 1;
#10 rstn <= 1;
for (int i = 0; i < 5; i=i+1) begin
delay = $random;
#(delay) d <= i;
end
end
endmodule
module dff (input d,
input rstn,
input clk,
output reg q);
always @ (posedge clk)
if (!rstn)
q <= 0;
else
q <= d;
endmodule
硬件原理图
试验台
module tb_dff;
reg clk;
reg d;
reg rstn;
reg [2:0] delay;
dff dff0 ( .d(d),
.rsnt (rstn),
.clk (clk),
.q (q));
// Generate clock
always #10 clk = ~clk;
// Testcase
initial begin
clk <= 0;
d <= 0;
rstn <= 0;
#15 d <= 1;
#10 rstn <= 1;
for (int i = 0; i < 5; i=i+1) begin
delay = $random;
#(delay) d <= i;
end
end
endmodule