FPGA 系列文章
- 如果你想學(xué)習(xí)有關(guān)FPGA的專業(yè)術(shù)語,可以參考這一篇:FPGA專業(yè)術(shù)語介紹
一、LATCH(鎖存器)是什么
一句話概括,能夠存儲一個狀態(tài)的數(shù)字電路叫做鎖存器。
以下是最為基本的一個RS鎖存器的具體結(jié)構(gòu):
以下是它的真值表,其中X表示不確定/無效:
R {R} R(清零) | S {S} S(置位) | Q ( t ) {Q(t)} Q(t) (上一時(shí)刻的輸出 ) | Q ( t + 1 ) {Q(t+1)} Q(t+1) (這一時(shí)刻的輸出A) | Q  ̄ \overline{Q} Q?(這一時(shí)刻的輸出B) |
---|---|---|---|---|
0 | 0 | Q | Q | !Q |
1 | 0 | Q | 0 | 1 |
0 | 1 | Q | 1 | 0 |
1 | 1 | X | X | X |
這張真值表的前三行如下圖所示,能夠使得輸出的結(jié)果和定義一致。
第一種情況,電路能夠維持輸出為Q:
第二種情況,上面的NOR門輸出一定為0,進(jìn)而使得整個電路達(dá)到穩(wěn)態(tài):
第三種情況,下面的NOR門輸出一定為0,進(jìn)而使得整個電路達(dá)到穩(wěn)態(tài):
唯獨(dú)這張真值表的第四行輸出結(jié)果和定義不一致:
看起來這張電路圖是一個穩(wěn)定的狀態(tài),但當(dāng)我們把這個狀態(tài)切換到S=R=0的狀態(tài)時(shí),就會產(chǎn)生兩種可能的穩(wěn)態(tài):
1.上面R對應(yīng)的或非門電路延遲較低,這時(shí)候Q先被置為1:
2.下面S對應(yīng)的或非門電路延遲較低,這時(shí)候!Q先被置為1:
在這種情況下,輸出結(jié)果完全隨機(jī)(與電路延遲相關(guān)),由于這種現(xiàn)象很玄學(xué)。因此我們在使用RS鎖存器時(shí),一般不會將R和S同時(shí)置1。
為了解決RS鎖存器帶來的問題(RS不能同時(shí)為1),我們需要在它的輸入之前添加一些邏輯電路,進(jìn)化版本的RS鎖存器被叫做D鎖存器。
D鎖存器的具體結(jié)構(gòu)如下:
D鎖存器在RS鎖存器的輸入之前添加了一個非門,排除了RS同時(shí)為1的情況。同時(shí),上圖中的D鎖存器將使能輸入(E)設(shè)置為clock,使得該電路只有在時(shí)鐘信號為1的時(shí)候才能夠工作(設(shè)置為時(shí)鐘信號為0時(shí)工作也很簡單)
D鎖存器的真值表如下:
D {D} D(置位) | E {E} E(使能) | Q ( t ) {Q(t)} Q(t) (上一時(shí)刻的輸出 ) | Q ( t + 1 ) {Q(t+1)} Q(t+1) (這一時(shí)刻的輸出A) | Q  ̄ ( t + 1 ) \overline{Q}(t+1) Q?(t+1)(這一時(shí)刻的輸出B) |
---|---|---|---|---|
0 | 0 | Q | Q | !Q |
1 | 0 | Q | Q | !Q |
0 | 1 | Q | 1 | 0 |
1 | 1 | Q | 0 | 1 |
D鎖存器足夠完美了嗎?
當(dāng)然不,D鎖存器同樣存在問題,那就是無法去除輸入的毛刺/抖動。當(dāng)E為1的時(shí)候,D 和 !Q 的值永遠(yuǎn)是相等的 (哪怕輸入存在毛刺/抖動)。為了進(jìn)一步的改進(jìn),人們在D鎖存器的基礎(chǔ)上提出了觸發(fā)器的概念。觸發(fā)器的具體結(jié)構(gòu)會在第二章進(jìn)行介紹。
二、FF(觸發(fā)器)是什么
一句話概括:觸發(fā)器是能在指定的事件發(fā)生時(shí)存儲狀態(tài)的數(shù)字電路。
觸發(fā)器是時(shí)序邏輯電路的基本單元,用來存儲1位2進(jìn)制信息,具有記憶和存儲功能。常見的觸發(fā)器包括D觸發(fā)器,J-K觸發(fā)器等。
D觸發(fā)器
D觸發(fā)器可以由兩個D鎖存器級聯(lián)構(gòu)成,它的具體結(jié)構(gòu)如下,其中FF1和FF2都代表上文提到的D鎖存器:
以下是兩個D鎖存器級聯(lián)構(gòu)成的D觸發(fā)器的真值表:
D {D} D | C L K {CLK} CLK | Q ( t ) {Q(t)} Q(t) (上一時(shí)刻的輸出 ) | Q ( t + 1 ) {Q(t+1)} Q(t+1) (這一時(shí)刻的輸出A) | Q  ̄ ( t + 1 ) \overline{Q}(t+1) Q?(t+1)(這一時(shí)刻的輸出B) |
---|---|---|---|---|
0 | 0 | Q | Q | !Q |
1 | 0 | Q | Q | !Q |
0 | 0->1 | Q | 0 | 1 |
1 | 0->1 | Q | 1 | 0 |
0 | 1 | Q | Q | !Q |
1 | 1 | Q | Q | !Q |
0 | 1->0 | Q | Q | !Q |
1 | 1->0 | Q | Q | !Q |
從真值表中可以看出,輸出的改變只可能發(fā)生在時(shí)鐘信號的上升沿。接下來讓我們按CLK依次分析這四種情況:
-
第一種情況,CLK為0,這時(shí)候FF2的CLK輸入為0,因此電路的輸出保持不變。
-
第二種情況,CLK處于上升沿(0->1)到達(dá)的瞬間,由于電路內(nèi)部的延遲,這時(shí)候FF1會先取上升沿到達(dá)之前瞬間D的狀態(tài),之后將該狀態(tài)保存。
-
第三種情況,CLK為1,這時(shí)候FF1的CLK輸入為0,因此Q1的輸出保持不變,進(jìn)而使整個電路的輸出保持不變。
-
第四種情況,CLK處于下降沿(1->0)到達(dá)的瞬間,由于電路內(nèi)部的延遲,這時(shí)候FF2會先取下降沿到達(dá)之前瞬間Q1的狀態(tài),之后將該狀態(tài)保存。
JK觸發(fā)器
JK觸發(fā)器彌補(bǔ)了RS鎖存器的缺陷,能夠在輸入為1時(shí)將狀態(tài)翻轉(zhuǎn)。JK觸發(fā)器的具體結(jié)構(gòu)如下圖:
藍(lán)框中的電路結(jié)構(gòu)將或非門換為了與非門,同樣也是RS鎖存器的一種表現(xiàn)方式。感興趣的同學(xué)可以自己推導(dǎo)一下真值表。
這里先直接給出與非門實(shí)現(xiàn)RS鎖存器的真值表:
S {S} S(置位) | R {R} R(清零) | Q ( t ) {Q(t)} Q(t) (上一時(shí)刻的輸出 ) | Q ( t + 1 ) {Q(t+1)} Q(t+1) (這一時(shí)刻的輸出A) | Q  ̄ \overline{Q} Q?(這一時(shí)刻的輸出B) |
---|---|---|---|---|
0 | 0 | X | X | X |
0 | 1 | Q | 1 | 0 |
1 | 0 | Q | 0 | 1 |
1 | 1 | Q | Q | !Q |
JK觸發(fā)器通過紅框?qū)崿F(xiàn)上升沿讀取數(shù)據(jù)。當(dāng)CLK處于上升沿(0->1)時(shí),由于非門的延遲,會有一瞬間出現(xiàn)CLK變?yōu)?的情況,這時(shí)候讀取數(shù)據(jù),剩下的時(shí)候CLK均為0。
在時(shí)鐘上升沿信號未到來時(shí),與非門G3和G4將J與K端的輸入信號屏蔽,觸發(fā)器狀態(tài)不受輸入信號的影響,維持不變。在時(shí)鐘上升沿信號到來時(shí),觸發(fā)器的狀態(tài)將會隨著J與K的輸入產(chǎn)生相應(yīng)的變化。
-
時(shí)鐘上升沿信號到來時(shí),J=0,K=0,觸發(fā)器狀態(tài)維持不變。
-
時(shí)鐘上升沿信號到來時(shí),J=1,K=0,這時(shí)候S和R的值分別為Q和1,JK觸發(fā)器會將這一時(shí)刻的輸出A置為1。(無論Q為0或1,根據(jù)上面的真值表,這一時(shí)刻的輸出A都一定為1)
-
時(shí)鐘上升沿信號到來時(shí),J=0,K=1,這時(shí)候S和R的值分別為1和!Q,JK觸發(fā)器會將這一時(shí)刻的輸出A置為0。(無論Q為0或1,根據(jù)上面的真值表,這一時(shí)刻的輸出A都一定為0)
-
時(shí)鐘上升沿信號到來時(shí),J=K=1,這時(shí)候S和R的值分別為Q和!Q,根據(jù)上面的真值表,這一時(shí)刻的輸出A與這一時(shí)刻的輸出B一定為!Q和Q,實(shí)現(xiàn)翻轉(zhuǎn)。
JK觸發(fā)器的真值表如下圖:
J {J} J | K {K} K | C L K {CLK} CLK | Q ( t ) {Q(t)} Q(t) (上一時(shí)刻的輸出 ) | Q ( t + 1 ) {Q(t+1)} Q(t+1) (這一時(shí)刻的輸出1) | Q  ̄ ( t + 1 ) \overline{Q}(t+1) Q?(t+1)(這一時(shí)刻的輸出2) |
---|---|---|---|---|---|
0 | 0 | 0 | Q | Q | !Q |
0 | 1 | 0 | Q | Q | !Q |
1 | 0 | 0 | Q | Q | !Q |
1 | 1 | 0 | Q | Q | !Q |
0 | 0 | 0->1 | Q | Q | !Q |
0 | 1 | 0->1 | Q | 0 | 1 |
1 | 0 | 0->1 | Q | 1 | 0 |
1 | 1 | 0->1 | Q | !Q | Q |
0 | 0 | 1 | Q | Q | !Q |
0 | 1 | 1 | Q | Q | !Q |
1 | 0 | 1 | Q | Q | !Q |
1 | 1 | 1 | Q | Q | !Q |
0 | 0 | 1->0 | Q | Q | !Q |
0 | 1 | 1->0 | Q | Q | !Q |
1 | 0 | 1->0 | Q | Q | !Q |
1 | 1 | 1->0 | Q | Q | !Q |
將J和K合并成一個信號,它就有了一個新名稱:T觸發(fā)器。
三、牛刀小試:避免使用Verilog綜合出LATCH
因?yàn)長ATCH的種種缺點(diǎn),它是我們在寫Verilog代碼的時(shí)候唯恐避之不及的。然而,我們常常會遇到由于邏輯定義不完整綜合出LATCH的情況。在代碼包含always@(*)時(shí),一般情況下會綜合出LUT,但假如沒有將if/else中所有case的賦值情況寫完整,編譯器就會綜合出LATCH,以下是一段綜合出LATCH的Verilog代碼:
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up );
always @(*) begin
case(scancode)
16'he06b:
left=1;
16'he072:
down=1;
16'he074:
right=1;
16'he075:
up=1;
endcase
end
endmodule
這段代碼與人物上下左右移動有關(guān)。例如16’he06b這個case,如果我們在其中沒有指定down,right和up的值,那么它就會自動保存原來的值(信號接收之前的值),綜合出鎖存器。
如何讓上面的電路不綜合出LATCH呢?
非常簡單,只要在每一次 always @(*) begin 的最開始指定left,down,right和up的值就可以了,更改后的代碼如下所示:
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up );
always @(*) begin
left=0;down=0;right=0;up=0;// 給up,down,left,right賦初始值
case(scancode)
16'he06b:
left=1;
16'he072:
down=1;
16'he074:
right=1;
16'he075:
up=1;
endcase
end
endmodule
需要注意的是,對于always@(posedge clk),即使case不完整,也不會綜合出LATCH,綜合器會將這些不執(zhí)行的情況視為不需要進(jìn)行任何操作。
參考文檔
FPGA中LUT、LATCH、FF的概念
RS鎖存器,D鎖存器、D觸發(fā)器簡介
數(shù)字電路學(xué)習(xí)筆記(九):初識鎖存器
D觸發(fā)器 (D-FF)詳解
數(shù)字電路中的鎖存器(latch)和各種觸發(fā)器(flip-flop)文章來源:http://www.zghlxwxcb.cn/news/detail-823748.html
從CMOS到觸發(fā)器(二)文章來源地址http://www.zghlxwxcb.cn/news/detail-823748.html
到了這里,關(guān)于FPGA結(jié)構(gòu):LATCH(鎖存器)和 FF(觸發(fā)器)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!