前兩節(jié)中所介紹的門級電路都是沒有延遲的,實(shí)際門級電路都是有延遲的。
Verilog 中允許用戶使用門延遲,來定義輸入到其輸出信號的傳輸延遲。
門延遲類型主要有以下 3 種。
在門的輸入發(fā)生變化時(shí),門的輸出從 0,x,z 變化為 1 所需要的轉(zhuǎn)變時(shí)間,稱為上升延遲。
在門的輸入發(fā)生變化時(shí),門的輸出從 1,x,z 變化為 0 所需要的轉(zhuǎn)變時(shí)間,稱為下降延遲。
關(guān)斷延遲是指門的輸出從 0,1,x 變化為高阻態(tài) z 所需要的轉(zhuǎn)變時(shí)間。
門輸出從 0,1,z 變化到 x 所需要的轉(zhuǎn)變時(shí)間并沒有被明確的定義,但是它所需要的時(shí)間可以由其他延遲類型確定,即為以上 3 種延遲值中最小的那個(gè)延遲。
門延遲可以在門單元例化時(shí)定義,定義格式如下:
gate_type [delay] [instance_name] (signal_list) ;
其中,delay 的個(gè)數(shù)可以為 0 個(gè)、1 個(gè)、2 個(gè)或 3個(gè) 。
下表為不同延遲個(gè)數(shù)時(shí),各種類型延遲的取值情況說明。
延遲類型 | 無延遲 | 1 個(gè)延遲 (d) | 2 個(gè)延遲 (d1, d2) | 3 個(gè)延遲 (d1, d2, d3) |
---|---|---|---|---|
上升 | 0 | d | d1 | d1 |
下降 | 0 | d | d2 | d2 |
關(guān)斷 | 0 | d | min(d1, d2) | d3 |
to_x | 0 | d | min(d1, d2) | min(d1, d2, d3) |
如果用戶沒有指定延遲值,則默認(rèn)延遲為 0 。
如果用戶指定了 1 個(gè)延遲值,則所有類型的延遲值大小均為此值。
如果用戶指定了 2 個(gè)延遲值,則他們分別代表上升延遲和下降延遲,關(guān)斷和"to_x"延遲均為這 2 種延遲值中最小的那個(gè)。
如果用戶指定了 3 個(gè)延遲值,則他們分別代表上升延遲、下降延遲和關(guān)斷延遲,"to_x"延遲為這 3 種延遲值中最小的那個(gè)。
帶有延遲值的門級單元例化如下:
//rise, fall and turn-off delay are all 1
and #(1) (OUT1, IN1, IN2) ;
//rise delay = 2.1, fall dalay = 2, trun-off delay = 2
or #(2.1, 2) (OUT2, IN1, IN2) ;
//rise delay = 2, fall dalay = 1, trun-off delay = 1.3
bufif0 #(2, 1, 1.3) (OUT3, IN1, CTRL) ;
需要說明的是,多輸入門(如與門)和多輸出門(如非門)最多只能定義 2 個(gè)延遲,因?yàn)檩敵霾粫?huì)是 z 。
三態(tài)門和單向開關(guān)單路(MOS 管、CMOS 管等)可以定義 3 個(gè)延遲。
上下拉門級電路不會(huì)有任何的延遲,因?yàn)樗硎镜氖且环N硬件屬性,上下拉狀態(tài)不會(huì)發(fā)生變化,且沒有輸出值。
雙向開關(guān)(tran)在傳輸信號時(shí)沒有延遲,不允許添加延遲定義。
帶有控制端的雙向開關(guān)(tranif1, tranif0)在開關(guān)切換的時(shí)候,會(huì)有開或關(guān)的延遲,可以給此類雙向開關(guān)指定 0 個(gè)、1 個(gè)或 2 個(gè)的延遲,例如:
//turn-on and turn-off delay are all 1
tranif0 #(1) (inout1, inout2, CTRL);
//turn-on delay = 1, turn-off delay = 1.2
tranif1 #(1, 1.2) (inout3, inout4, CTRL);
由于集成電路制造工藝的差異,實(shí)際電路中器件的延遲總會(huì)在一定范圍內(nèi)波動(dòng)。Verilog 中,用戶不僅可以指定 3 種類型的門延遲,還可以對每種類型的門延遲指定其最小值、典型值和最大值。在編譯或仿真階段,來選擇使用哪一種延遲值,為更切實(shí)際的仿真提供了支持。
下面通過例化實(shí)例,來說明最小、典型、最大延遲的用法。
//所有的延遲類型: 最小延遲 1, 典型延遲 2, 最大延遲 3
and #(1:2:3) (OUT1, IN1, IN2) ;
//上升延遲:最小延遲 1, 典型延遲 2, 最大延遲 3
//下降延遲:最小延遲 3, 典型延遲 4, 最大延遲 5
//關(guān)斷延遲:最小延遲 min(1,3), 典型延遲 min(2,4), 最大延遲 min(3,5)
or #(1:2:3, 3:4:5) (OUT2, IN1, IN2) ;
//上升延遲:最小延遲 1, 典型延遲 2, 最大延遲 3
//下降延遲:最小延遲 3, 典型延遲 4, 最大延遲 5
//關(guān)斷延遲:最小延遲 2, 典型延遲 3, 最大延遲 4
bufif0 #(1:2:3, 3:4:5, 2:3:4) (OUT3, IN1, CTRL) ;
下面從門級建模的角度,對 D 觸發(fā)器進(jìn)行設(shè)計(jì)。
SR 觸發(fā)器結(jié)構(gòu)圖及真值表如下所示。
在基本的 SR 觸發(fā)器前面增加 2 個(gè)與非門,可構(gòu)成帶有控制端 SR 鎖存器。
SR 鎖存器及其真值表如下所示。
基本的 SR 觸發(fā)器輸入端不能同時(shí)為 0, 帶有控制端的 SR 鎖存器輸入端不能同時(shí)為 1,否則會(huì)導(dǎo)致輸出端 Q 與 Q' 的非互補(bǔ)性矛盾。
為消除此種不允許的狀態(tài),在帶有控制端的 SR 鎖存器結(jié)構(gòu)中加入取反模塊,保證 2 個(gè)輸入端均為相反邏輯,則形成了 D 鎖存器。
其結(jié)構(gòu)圖和真值表如下所示。
D 鎖存器是一種電平觸發(fā)。
如果在 EN=1 的有效時(shí)間內(nèi),D 端信號發(fā)生多次翻轉(zhuǎn),則輸出端 Q 也會(huì)發(fā)生多次翻轉(zhuǎn)。這降低了電路的抗干擾能力,不是實(shí)際所需求的安全電路。
為提高觸發(fā)器的可靠性,增強(qiáng)電路抗干擾能力,發(fā)明了在特定時(shí)刻鎖存信號的 D 觸發(fā)器。
將兩個(gè) D 鎖存器進(jìn)行級聯(lián),時(shí)鐘取反,便構(gòu)成了一種簡單的 D 觸發(fā)器,又名 Flip-flop。
其結(jié)構(gòu)圖和真值表如下所示。
第一級 D 鎖存器又稱為主鎖存器,在 CP 為低電平時(shí)鎖存。第二級 D 鎖存器又稱為從鎖存器,時(shí)鐘較主鎖存器相反,在 CP 為高電平時(shí)鎖存。
綜上所述,D 觸發(fā)器輸出端 Qs 只會(huì)在時(shí)鐘 CP 下降沿對 D 端進(jìn)行信號的鎖存,其余時(shí)間輸出端信號具有保持的功能。
將雙級 D 鎖存器展開為門級結(jié)構(gòu),如下圖所示。
對 D 觸發(fā)進(jìn)行門級建模,并加入門級延時(shí),verilog 模型如下:
module D_TRI(
input D, CP,
output Q, QR);
parameter RISE_TIME = 0.11 ;
parameter FALL_TIME = 0.07 ;
//part1, not gate
wire CPN, DN ;
not #(RISE_TIME, FALL_TIME) (CPN, CP);
not #(RISE_TIME, FALL_TIME) (DN, D);
//part2, master trigger
wire G3O, G4O ;
nand #(RISE_TIME, FALL_TIME) (G3O, D, CP);
nand #(RISE_TIME, FALL_TIME) (G4O, DN, CP);
wire #(RISE_TIME, FALL_TIME) G1O, G2O ;
nand #(RISE_TIME, FALL_TIME) (G1O, G3O, G2O);
nand #(RISE_TIME, FALL_TIME) (G2O, G4O, G1O);
//part3, slave trigger
wire G7O, G8O ;
nand #(RISE_TIME, FALL_TIME) (G7O, G1O, CPN);
nand #(RISE_TIME, FALL_TIME) (G8O, G2O, CPN);
wire G5O, G6O ;
nand #(RISE_TIME, FALL_TIME) (G5O, G7O, G6O);
nand #(RISE_TIME, FALL_TIME) (G6O, G8O, G5O);
assign Q = G5O ;
assign QR = G6O ;
endmodule
testbench 編寫如下:
`timescale 1ns/1ps
module test ;
reg D, CP = 0 ;
wire Q, QR ;
always #5 CP = ~CP ;
initial begin
D = 0 ;
#12 D = 1 ;
#10 D = 0 ;
#14 D = 1 ;
#3 D = 0 ;
#18 D = 0 ;
end
D_TRI u_d_trigger(
.D (D),
.CP (CP),
.Q (Q),
.QR (QR));
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end
endmodule // test
仿真結(jié)果如下。
由圖可知,Q/QR 信號均在時(shí)鐘 CP 下降沿采集到了 D 端信號,并在單周期內(nèi)保持不變,且輸出有延遲。
對 cap3 時(shí)刻進(jìn)行放大,對延時(shí)進(jìn)行追蹤,如下圖所示。
點(diǎn)擊這里下載源碼
更多建議: