一、设计文件
第一种写法(我最开始写的)
//====================================================================== // --- 名称 : D4 // --- 作者 : liuxiaoyan_fpga // --- 日期 : 2022-03-29 // --- 描述 : 设计一个4bit串联触发器电路 // --- 用途 : 需要4个D触发器 //====================================================================== module D4 //---------------------<端口声明>--------------------------------------- ( input D0 , input Clk , input Rst_n , output reg Q0 , output reg Q1 , output reg Q2 , output reg Q3 ); always @(posedge Clk or negedge Rst_n) begin if (Rst_n == 1'b0) Q0 <= 1'b0; else Q0 <= D0; end always @(posedge Clk or negedge Rst_n) begin if (Rst_n == 1'b0) Q1 <= 1'b0; else Q1 <= Q0; end always @(posedge Clk or negedge Rst_n) begin if (Rst_n == 1'b0) Q2 <= 1'b0; else Q2 <= Q1; end always @(posedge Clk or negedge Rst_n) begin if (Rst_n == 1'b0) Q3 <= 1'b0; else Q3 <= Q2; end endmodule
第二种写法(正点原子)
//====================================================================== // --- 名称 : D4 // --- 作者 : liuxiaoyan_fpga // --- 日期 : 2022-03-29 // --- 描述 : 设计一个4bit串联触发器电路 // --- 用途 : 需要4个D触发器 //====================================================================== module D4 //---------------------<端口声明>--------------------------------------- ( input Clk, input Rst_n, input X, output letout ); reg Q0; reg Q1; reg Q2; reg Q3; always@(posedge Clk or negedge Rst_n)begin if(Rst_n == 1'b0)begin Q0 <= 1'b0; Q1 <= 1'b0; Q2 <= 1'b0; Q3 <= 1'b0; end else begin Q0 <= X; Q1 <= Q0; Q2 <= Q1; Q3 <= Q2; end end assign letout = Q3; endmodule
二、仿真文件
`timescale 1ns/1ns module D4_tb; reg Clk; reg Rst_n; reg X; wire letout; initial begin Clk = 1'b0; Rst_n = 1'b0; # 20; Rst_n = 1'b1; X = 1'b0; end always #10 Clk = ~ Clk; always #12 X = {$random}%2; D4 a1 ( .Clk(Clk), .Rst_n(Rst_n), .X(X), . letout(letout) ); endmodule
三、波形
4个D触发器
1. 第一个触发器的输出和输入:输出只需要等输入改变后,紧接着那个时钟上升沿就改变
2.由于第一个触发器是在时钟上升沿改变的,那第二个触发器就需要等到完整的下一个时钟上升沿,于是就形成了输出比输入慢一节拍(一个时钟周期)
四、RTL