CP有效沿到來之前電路的狀態(tài)稱為當(dāng)前狀態(tài),用QnQ^nQn表示。
(相關(guān)資料圖)
CP有效沿到來后,電路進入的新狀態(tài)稱為次級狀態(tài),用Qn+1Q^{n+1}Qn+1表示。
D
QnQ^nQn
Qn+1Q^{n+1}Qn+1
0
0
0
0
1
0
1
0
1
1
1
1
Qn+1=DQ^{n+1}=DQn+1=D
由于直接置位和清除與CP信號無關(guān),因此該置位和清除操作稱為異步置位和清除。
直接置1、直接清零的過程如下:
(1) 當(dāng)SˉD=0\bar{S}_{D}=0SˉD=0時,RˉD=1\bar{R}_{D}=1RˉD=1,令Y1=1Y_{1}=1Y1=1 , Sˉ=Y1CPRˉD=CP\bar{S}=\overline{Y_{1} \cdot C P \cdot \bar{R}_{D}}=\overline{C P}Sˉ=Y1 CPRˉD=CP, Rˉ=SˉCPY4=1\quad \bar{R}=\overline{\bar{S} \cdot C P \cdot Y_{4}}=1Rˉ=Sˉ CPY4=1,所以Q=1Q=1Q=1,Qˉ=0\bar{Q}=0Qˉ=0,即輸出Q直接設(shè)置為1。
(2) 當(dāng)SˉD=1\bar{S}_{\mathrm{D}}=1SˉD=1時,RˉD=0\bar{R}_{\mathrm{D}}=0RˉD=0,使得Sˉ=1\bar{S}=1Sˉ=1,所以Q=0Q=0Q=0,Qˉ=1\bar{Q}=1Qˉ=1,即輸出Q直接清零。
所謂同步清零,是指只有清零輸入信號有效且CP有效沿(如上升沿)到來時,觸發(fā)器才能被清零。
(a) 實現(xiàn)同步清算的方案之一
(b)第二種實現(xiàn)同步清算的方案
功能:
En=0,Q保持不變。 En=1,在CP作用下,Q=D。 Qn+1=CEQn+CEDQ^{n+1}=\overline{C E} \cdot Q^{n}+C E \cdot DQn +1=CEQn+CED
邏輯符號
示例1. 嘗試對具有異步清零和異步設(shè)置的邊沿D 觸發(fā)器進行建模,如圖所示。
具有異步輸入的D 觸發(fā)器
//版本1:模塊Set_Rst_DFF(Q,Q_,D,CP,Rd_,Sd_);輸出Q,Q_;輸入D、CP、Rd_、Sd_;電線Y1、Y2、Y3、Y4、Y5、Y6;賦值#5 Y1=~(Sd_ Y2 Y4);賦值#5 Y2=~(Rd_ CP Y1);賦值#5 Y3=~(CP Y2 Y4);賦值#5 Y4=~(Rd_ Y3 D );賦值#5 Y5=~ (Sd_ Y2 Y6);賦值#5 Y6=~(Rd_ Y3 Y5);賦值Q=Y5;賦值Q_=Y6; endmodule 復(fù)制代碼版本1: 使用連續(xù)賦值語句按照該圖建模,賦值語句中#5表示給每個與非門添加5個單位時間的傳輸延遲。
//版本2模塊Set_Rst_DFF_bh(Q,Q_,D,CP,Rd_,Sd_);輸出寄存器Q;輸出Q_;輸入D、CP、Rd_、Sd_;賦值Q_=~Q;總是@(kedge CP 或negedge Sd_ 或negedge Rd_) if (~Sd_) //相當(dāng)于: if (Sd_==0) Q=1'b1;否則如果(~Rd_) Q=1'b0;否則Q=D; endmodule 復(fù)制了代碼版本2 的功能:
采用函數(shù)式描述風(fēng)格,使用always和if-else為輸出變量賦值。
negedge Sd_ 是一個異步事件,必須匹配if (~Sd_)。 negedge Rd_ 是另一個異步事件,它必須匹配if (~Rd_)。這是語法要求。
當(dāng)Sd_為0時,輸出Q置1;當(dāng)Sd_=1且Rd_=0時,輸出Q設(shè)置為0;當(dāng)Sd_ 和Rd_ 都不為0,并且時鐘CP 的上升沿到達時,輸出Q 被設(shè)置為0。輸入D 被傳遞到輸出Q。請注意,如果設(shè)置1 事件、設(shè)置0 事件和時鐘事件如果同時發(fā)生,則設(shè)置1 事件的優(yōu)先級最高,其次是設(shè)置0 事件,時鐘事件的優(yōu)先級最低。
示例2 具有同步清零功能的上升沿D 觸發(fā)器。
模塊Sync_rst_DFF(Q,D,CP,Rd_);輸出寄存器Q;輸入D、CP、Rd_;總是@(posege CP) if ( !Rd_) //也作為(~Rd_) Q=0; else Q=D ;endmodule 復(fù)制代碼示例4 使用功能描述風(fēng)格對如圖所示的電路(2 分電路)進行建模,并給出仿真結(jié)果。
解決方案:(1)設(shè)計塊:使用always和if-else語句給輸出變量賦值。代碼如下。
`時間刻度1 ns/1 nsmodule _2Divider (Q,CP,Rd_);輸出寄存器Q;輸入CP,Rd_;有線;賦值D=~Q;總是@(posege CP 或negedge Rd_) if(~Rd_) Q=1'b0;否則Q=D; endmodule復(fù)制代碼(2)激勵塊:為輸入變量賦值。
`時間刻度1 ns/1 nsmodule test_2Divider();reg CP, Rd_; wire Q;//調(diào)用(實例化)設(shè)計block_2Divider U1 (.CP(CP),Q(Q),Rd_(Rd_) ) ;initial begin //生成復(fù)位信號Rd_ Rd_=1'b0; rd_=#2000 1'b1;#8000 $stop;end always begin //生成時鐘信號CP CP=1'b0; CP=#500 1'b1 ; #500;end endmodule復(fù)制代碼(3)仿真波形(使用ModelSim)
從圖中可以看出,時鐘CP的周期為1000ns。在2000ns之前,清零信號Rd_有效,輸出Q清零。之后,Rd_=1,2500ns時,CP上升沿到來,Q=1;在下一個CP 上升沿(3500ns),Q=0,在下一個CP 上升沿(4500ns),Q=1,如此重復(fù),直到8000ns,執(zhí)行系統(tǒng)任務(wù)$stop模擬停止。
簡而言之,當(dāng)不考慮清零信號Rd_的作用時,每CP的上升沿到來,觸發(fā)器狀態(tài)Q就翻轉(zhuǎn)一次。輸出信號Q的頻率正好是CP頻率的二分之一,因此該電路稱為除2電路。所謂分頻電路是指能夠?qū)⑤斎氲母哳l信號變換為低頻信號輸出的電路。
例5 嘗試對如圖所示的電路進行建模并給出仿真結(jié)果。
4位異步二進制計數(shù)器邏輯圖
解決方案: (1)設(shè)計塊:采用結(jié)構(gòu)描述風(fēng)格的代碼如下。編寫了兩個模塊,可以將其放在一個名為Ripplecounter.v 的文件中。
第一個主模塊Ripplecounter 用作設(shè)計的頂層。實例化了分頻器子模塊_2Divider1 4次,第二個分頻器子模塊_2Divider1作為設(shè)計的底層。
`timescale 1 ns/1 ns/*====設(shè)計模塊:Ripplecounter.v====*/module Ripplecounter (Q,CP,CLR_);輸出[3:0] Q;輸入CP、CLR_; //實例引用分頻器module_2Divider1 _2Divider1 FF0 (Q[0],CP ,CLR_); //注意,引用時端口的順序- 位置關(guān)聯(lián)_2Divider1 FF1 (Q[1],~Q[0],CLR_) ; _2除法器1 FF2(Q[2],~Q[1],CLR_); _2Divider1 FF3(Q[3],~Q[2],CLR_);endmodule復(fù)制代碼設(shè)計的底層模塊_2Divider1
//分頻器子模塊模塊_2Divider1(Q,CP,Rd_);輸出寄存器Q;輸入CP,Rd_;總是@(posege CP 或negedge Rd_) if(!Rd_) Q=1'b0; else Q=~ Q;endmodule 復(fù)制代碼(2) 激勵塊:為輸入變量(CLR_和CP)賦值。
/*====激勵塊:test_Ripplecounter.v====*/module test_Ripplecounter();reg CLR_, CP;wire [3:0] Q;Ripplecounter i1 (.CLR_(CLR_),CP(CP), Q(Q));初始開始//CLR_ CLR_=1'b0; CLR_=#20 1'b1;#400 $stop;end always begin //CPCP=1'b0;CP=#10 1'b1;# 10;end endmodule 復(fù)制代碼(3) 仿真波形:如圖以下。
如圖所示,
時鐘CP的周期為20ns。開始時,清零信號CLR_有效(0~20ns),輸出Q清零。 20ns后,CLR_始終為高電平。 30ns時,CP上升沿到來,Q=0001;在CP 的下一個上升沿(50ns),Q=0010,在CP 的下一個上升沿(70ns),Q=0011,依此類推,直到310ns,Q=1111,在330ns, Q=0000,直到執(zhí)行系統(tǒng)任務(wù)$stop,模擬停止。該電路首先在CLR_的作用下清除輸出。此后,當(dāng)CLR_=1時,每當(dāng)CP的上升沿到來時,電路狀態(tài)Q在原來的二進制值的基礎(chǔ)上加1,符合二進制遞增計數(shù)的規(guī)則。直到計數(shù)值到達1111時,又出現(xiàn)CP的上升沿。計數(shù)值返回到0000并重新開始計數(shù)。因此,該電路稱為4位二進制向上計數(shù)器(Ripplecounter:紋波計數(shù)器)。
可以看出,計數(shù)器實際上是對時鐘脈沖進行計數(shù)的。每次時鐘脈沖觸發(fā)邊沿到達時,計數(shù)器都會改變狀態(tài)。
參考:
Verilog HDL與FPGA數(shù)字系統(tǒng)設(shè)計,Roger,機械工業(yè)出版社,2015年4月Verilog HDL與CPLD/FPGA項目開發(fā)教程(第2版),聶章龍,機械工業(yè)出版社,2015年12月Verilog HDL數(shù)字設(shè)計與綜合(第2版), Samir Palnitkar 著,夏宇文等譯,電子工業(yè)出版社,2015 年8 月Verilog HDL 導(dǎo)論(第3 版),J. BHASKER 著,夏宇文、甘偉譯,北京航空航天大學(xué)學(xué)會出版, 2019 年3 月