數(shù)電基礎(chǔ)
前幾節(jié)都是組合邏輯電路,即輸出只與當(dāng)前輸入有關(guān),而與電路原來的狀態(tài)無關(guān)。組合邏輯最大的缺點(diǎn)就是會存在 競爭冒險(xiǎn) ,使用時序邏輯就可以極大地避免這種問題,從而使系統(tǒng)更加穩(wěn)定。時序邏輯電路有記憶的功能,含有存儲電路。其輸出是輸入及輸出前一個時刻的狀態(tài)的函數(shù)。
這里引入了現(xiàn)態(tài)和次態(tài)的概念,現(xiàn)態(tài)是當(dāng)前時刻的狀態(tài),表示為Qn,而次態(tài)表示輸入發(fā)生變化后其輸出的狀態(tài) ,表示為Qn+1。時序邏輯電路可以分為同步時序和異步時序,同步時序有統(tǒng)一的時鐘,而異步時序的觸發(fā)器狀態(tài)的變化不是同一時間發(fā)生的。
時序邏輯最基本的單元就是寄存器,寄存器具有存儲功能,一般是由D觸發(fā)器構(gòu)成,由時鐘脈沖控制,每個D觸發(fā)器(DFF)能夠存儲一位二進(jìn)制碼。
D觸發(fā)器
D觸發(fā)器是一種最簡單的觸發(fā)器。D觸發(fā)器的特點(diǎn)是:在時鐘上升沿時,次態(tài)=輸入D,在時鐘處于高電平或低電平時,次態(tài)保持不變。用表格表示:
同步復(fù)位的D觸發(fā)器
當(dāng)時鐘的上升沿到來時,檢測到按鍵的復(fù)位操作才有效,否則無效。clk是時鐘,rst_n是復(fù)位鍵(低電平有效),在前兩條虛線中,key_in在時鐘上升沿變?yōu)?,但是led_out不能立刻改變,而是在下一個時鐘上升沿時變?yōu)閗ey_in(Qn+=D)。key_in的抖動也不會影響到led_out。 注意 :第五條虛線,sys_rst_n被拉低后led_out沒有立刻復(fù)位變?yōu)?,而是當(dāng)syc_clk的上升沿到來的時候(第六條虛線)led_out才復(fù)位成功,在復(fù)位釋放的時候也是相同原因(第七條虛線)。
同步復(fù)位的D觸發(fā)器
異步的意思是和工作時鐘不同步,只要有檢測到按鍵被按下,就立刻執(zhí)行復(fù)位操作。第五條虛線,sys_rst_n被拉低后led_out立刻變?yōu)?,沒有等時鐘上升沿,復(fù)位釋放時需要等待時鐘上升沿才會為key_in。
同步和異步復(fù)位的D觸發(fā)器區(qū)別只在于復(fù)位時需不需要等時鐘上升沿。他們的共同點(diǎn)是對于電路中產(chǎn)生的毛刺有著極好的屏蔽作用。
設(shè)計(jì)規(guī)劃
本例中我們的目標(biāo)和(一)中一樣,點(diǎn)亮一個LED燈。但是這里使用的D觸發(fā)器,當(dāng)按鍵被按下,key_in=0作為輸入給觸發(fā)器的D端口,然后在時鐘上升沿時會被傳送給輸出led_out=0使LED燈被點(diǎn)亮。
編寫代碼
同步復(fù)位的代碼
module flip_flop
(
input wire sys_clk , //系統(tǒng)時鐘50Mh
input wire sys_rst_n, //全局復(fù)位
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
同步復(fù)位的特點(diǎn)是,復(fù)位時要等待上升沿,因此需要在上升沿時檢測復(fù)位狀態(tài),這樣就能保證復(fù)位信號在上升沿時才有效。使用always語句,時鐘上升沿時執(zhí)行塊中的判斷語句,當(dāng)復(fù)位信號為低電平時,LED燈點(diǎn)亮,否則,將key_in賦給led_out。(四)中提到always 時序邏輯塊中多用非阻塞賦值<=。
異步復(fù)位的代碼
module flip_flop
(
input wire sys_clk , //系統(tǒng)時鐘50Mh
input wire sys_rst_n , //全局復(fù)位
input wire key_in ,
output reg led_out
);
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)//sys_rst_n為低電平時復(fù)位,且是檢測到sys_rst_n的下
//降沿時立刻復(fù)位,不需等待sys_clk的上升沿來到后再復(fù)位
led_out <= 1'b0;
else
led_out <= key_in;
endmodule
異步復(fù)位的特點(diǎn)是,復(fù)位時不需要等待上升沿。當(dāng)電路發(fā)生always語句()中的變化時,執(zhí)行always塊,由于復(fù)位不需要等待上升沿,這里發(fā)生變化的條件就包含時鐘上升和復(fù)位有效。當(dāng)時鐘上升或復(fù)位有效時,執(zhí)行判斷語句,如果復(fù)位鍵為低電平則LED輸出低電平點(diǎn)亮,否則將key_in的值賦給led_out。
我們采用同步復(fù)位來演示。將代碼綜合看RTL視圖
如果復(fù)位鍵為低電平,那么復(fù)位有效,0被傳給觸發(fā)器并輸出,如果復(fù)位鍵為高電平,那么key_in的值被傳給觸發(fā)器并輸出,與我們的設(shè)計(jì)含義一致。
編寫testbench
`timescale 1ns/1ns
module tb_flip_flop();
reg sys_clk ;
reg sys_rst_n ;
reg key_in ;
wire led_out ;
//初始化系統(tǒng)時鐘、全局復(fù)位和輸入信號
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
key_in <= 1'b0;
#20
sys_rst_n <= 1'b1; //初始化20ns后,復(fù)位釋放
#210
sys_rst_n <= 1'b0; //為了觀察同步復(fù)位和異步復(fù)位的區(qū)別
sys_rst_n <= 1'b1; //復(fù)位40ns后再次讓復(fù)位釋放掉
end
//sys_clk:模擬系統(tǒng)時鐘,每10ns電平翻轉(zhuǎn)一次,周期為20ns,頻率為50MHz
always #10 sys_clk = ~sys_clk;
always #20 key_in <= {$random} % 2;
//------------------------------------------------------------
initial begin
$timeformat(-9, 0, "ns", 6);
$monitor("@time %t: key_in=%b led_out=%b", $time, key_in, led_out);
end
//------------------------------------------------------------
//------------------flip_flop_inst-------------------
flip_flop flip_flop_inst
(
.sys_clk (sys_clk ), //input sys_clk
.sys_rst_n (sys_rst_n ), //input sys_rst_n
.key_in (key_in ), //input key_in
.led_out (led_out ) //output led_out
);
endmodule
初始化:initial 塊中時鐘信號用阻塞賦值=,其他信號用非阻塞賦值。初始時時鐘為高電平,復(fù)位為低電平,key_in無所謂,此時輸出不能確定。延時20ns后復(fù)位釋放,再延時210ns后再次復(fù)位, 這么做的目的是:由于時鐘周期是20ns(后面的代碼可以看出來),在時鐘下降沿復(fù)位可以觀察同步復(fù)位和異步復(fù)位的變化。同步復(fù)位要等時鐘上升沿才變化,異步復(fù)位是即刻復(fù)位。再延時40ns后再次復(fù)位釋放。
模擬時鐘:每隔10ns翻轉(zhuǎn)一次,周期為20ns。模擬按鍵輸入:每隔20ns產(chǎn)生一個0或1的隨機(jī)數(shù)。時間間隔應(yīng)該小于等于時鐘周期,否則會產(chǎn)生毛刺。
打印和實(shí)例化與之前的沒有區(qū)別。
對比波形
同步復(fù)位電路:最開始的輸出不確定,20ns-210ns間,Qn+1=D,發(fā)現(xiàn)輸出與上一時刻的輸入相同,這是D觸發(fā)器的特征,210ns時復(fù)位有效,但是同步復(fù)位要等下一個時鐘上升沿,輸出才會為0。250ns復(fù)位釋放,等到時鐘上升沿260ns之后,輸出才變?yōu)樯弦粫r刻的輸入。
觀察一下異步復(fù)位
分配管腳
不同開發(fā)板的管腳設(shè)置不同,需要看用戶手冊的介紹。這里時鐘周期是20ns,也就是50MHz的時鐘晶振,選擇E1管腳。
全編譯后上板驗(yàn)證
用的異步復(fù)位,S0為key_in,S1為復(fù)位,LED0是輸出。當(dāng)key_in不按時為高電平,燈也為高電平熄滅,當(dāng)復(fù)位鍵按下時,即刻復(fù)位燈亮。當(dāng)key_in按下去時為低電平燈亮。
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
108458 -
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121282 -
D觸發(fā)器
+關(guān)注
關(guān)注
3文章
164瀏覽量
48032 -
組合邏輯電路
+關(guān)注
關(guān)注
6文章
70瀏覽量
14705 -
dff
+關(guān)注
關(guān)注
0文章
26瀏覽量
3458
發(fā)布評論請先 登錄
相關(guān)推薦
數(shù)字電路設(shè)計(jì)之同步時序邏輯電路
![數(shù)字<b class='flag-5'>電路</b>設(shè)計(jì)之同步<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b>](https://file.elecfans.com/web1/M00/C8/68/pIYBAF9uHvWAXi4vAABWkUjGWfg061.png)
FPGA基礎(chǔ)學(xué)習(xí)筆記--時序邏輯電路-寄存器
巧用Multisim9解決時序邏輯電路難題
時序邏輯電路的主要故障分析
![<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b>的主要故障分析](https://file.elecfans.com/web1/M00/4E/D4/pIYBAFrLJu6AMSwzAAAKzs1JTXA241.jpg)
時序邏輯電路由什么組成_時序邏輯電路特點(diǎn)是什么
![<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b>由什么組成_<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b>特點(diǎn)是什么](https://file.elecfans.com/web1/M00/46/40/o4YBAFqXbw2AQaXHAABQ900c2zM283.jpg)
組合邏輯電路和時序邏輯電路的學(xué)習(xí)課件免費(fèi)下載
![組合<b class='flag-5'>邏輯電路</b>和<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b>的學(xué)習(xí)課件免費(fèi)下載](https://file.elecfans.com/web1/M00/CB/E8/o4YBAF-X1ACANvH8AABt2cbCkm8385.png)
FPGA時序邏輯電路寄存器講解
![FPGA<b class='flag-5'>時序</b><b class='flag-5'>邏輯電路</b><b class='flag-5'>寄存器</b>講解](https://file.elecfans.com/web2/M00/A5/8E/pYYBAGRgiM-AOFEsAAAv363h1W0826.png)
評論