本文旨在總結(jié)近期復(fù)習(xí)的數(shù)字電路D觸發(fā)器(邊沿觸發(fā))的內(nèi)容。
D觸發(fā)器是一個具有 記憶功能 ,持有 兩個穩(wěn)定狀態(tài)(0和1) 的信息存儲器件,是數(shù)字電路初學(xué)者所能接觸到最簡單的 時序邏輯電路 , 也是多種時序邏輯的電路的基本邏輯單元。
邊沿觸發(fā)D觸發(fā)器特點是可以在時鐘脈沖到來時刻從一個狀態(tài)翻轉(zhuǎn)到另一個狀態(tài),其具有的存儲特性也是時序邏輯的基本特征。
其內(nèi)部結(jié)構(gòu)可以由3個RS鎖存器構(gòu)成
將其繪制成一個模型,最簡單的如下圖表示,D為數(shù)據(jù)輸入端,clk為時鐘輸入端,Q為數(shù)據(jù)輸出端口。
這種D觸發(fā)器的功能也是相當(dāng)簡單的,就是當(dāng)CLK上升沿到來時,Q的輸出等于D,特征方程寫為 Q=D* (沒有任何控制輸入的情況下)。 波形圖如下所示:
為了進一步具體得知其作用,接下來在FPGA開發(fā)板上展示其功能,使用的辦卡為德致倫的genesys2,芯片為kintex-7系列的xc7k325tffg900-2。
為了更加全面一些,在此為D觸發(fā)器增加復(fù)位功能(按下按鈕回到初始狀態(tài)),此時可以有兩種復(fù)位D觸發(fā)器,一種是同步復(fù)位,一種是異步復(fù)位。
同步復(fù)位:按鈕按下,上升沿到來時刻復(fù)位,復(fù)位動作和系統(tǒng)時鐘同步。
異步復(fù)位:按鈕按下立刻復(fù)位,復(fù)位無需看系統(tǒng)時鐘的臉色。
下面給出本設(shè)計的模塊框圖:
說明一下各個端口的作用,sys_clk為時鐘,sys_rst_n為復(fù)位,key_in為按鍵輸入,即為觸發(fā)器的D,led_out為輸出,本demo會將其接到開發(fā)板的燈上,用燈的亮滅展示D觸發(fā)器的效果。
首先展示同步D觸發(fā)器的verilog代碼和testbench以及仿真結(jié)果。
module flip_flop(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output reg led_out
);
always@(posedge sys_clk)
if (sys_rst_n == 1'b0)
led_out <= 1'b0;
else
led_out <= key_in;
endmodule
————————————————————testbench——————————————————————————————————
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/01/21 20:02:21
// Design Name:
// Module Name: tb_flip_flop
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_flip_flop(
);
reg sys_clk;
reg sys_rst_n;
reg key_in;
wire led_out;
initial begin
sys_clk = 1'b1; //時鐘信號初始化為1
sys_rst_n <= 1'b0; //復(fù)位信號初始化,因為低電平有效,所以為0
key_in <= 1'b0; //輸入信號的初始化
#20
sys_rst_n <= 1'b1; //20ns后,復(fù)位信號釋放,因為低電平復(fù)位,所以變成高電平開始工作。
#210
sys_rst_n <= 1'b0;
#40
sys_rst_n <= 1'b1; //復(fù)位40ns再次釋放
end
always #10 sys_clk = ~sys_clk;
always #20 key_in <= {$random}%2; //20ns產(chǎn)生一次隨機數(shù),比時鐘周期大,利于波形觀察
flip_flop flip_flop_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.key_in(key_in),
.led_out(led_out)
);
endmodule
仿真結(jié)果跑500ns:
可以發(fā)現(xiàn),盡管系統(tǒng)已經(jīng)處于復(fù)位釋放的狀態(tài)(復(fù)位鍵為高電平),時鐘,數(shù)據(jù)和上升沿也都到來,但是輸出會在時鐘的下一拍進行變化。 **即:當(dāng)時鐘和信號在同一時刻變化時,我們以時鐘的上升沿前一時刻采集的輸入信號為依據(jù)來產(chǎn)生輸出信號。 **
下面是異步D觸發(fā)器的代碼,區(qū)別是增加了復(fù)位下降沿到來時刻的敏感性(always語句),testbench和同步D觸發(fā)器的一致。
module flip_flop(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output reg led_out
);
always@(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
led_out <= 1'b0;
else
led_out <= key_in;
endmodule
可以觀察到復(fù)位下降沿到來時刻,輸出即刻置為0,經(jīng)過綜合之后的RTL電路如圖所示,和設(shè)計(異步D觸發(fā)器電路,同步D觸發(fā)器電路多一個MUX模塊)的差不多。
然后分配管腳。
此次實驗中出現(xiàn)的一個問題是,此次使用的FPGA已經(jīng)沒有單端口時鐘輸出,所以需要調(diào)用PLL的IP核合成輸出一個單端口的時鐘信號,這個準(zhǔn)備下一篇再說。
實驗設(shè)備(謝謝老板買的高級貨,可惜許可證快到期了):
-
時鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131484 -
D觸發(fā)器
+關(guān)注
關(guān)注
3文章
164瀏覽量
47917 -
數(shù)字電路
+關(guān)注
關(guān)注
193文章
1605瀏覽量
80625 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61158 -
時序邏輯電路
+關(guān)注
關(guān)注
2文章
94瀏覽量
16546
發(fā)布評論請先 登錄
相關(guān)推薦
評論