一、設計文件
第一種寫法(我最開始寫的)
//====================================================================== // --- 名稱 : 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