目錄
鎖存器
1、簡介
2、實(shí)驗(yàn)任務(wù)
3、程序設(shè)計(jì)
3.1、缺少 else 分支的鎖存器代碼
3.2、補(bǔ)齊?else 分支
3.3、缺少 default 的 case 語句的鎖存器代碼
3.3、補(bǔ)齊 default 的 case 語句
4、本章總結(jié)
鎖存器
? ? ? ?鎖存器(俗稱 Latch)是數(shù)字電路中的一種具有記憶功能的邏輯元件。鎖存器對脈沖電平敏感的存儲(chǔ)單元電路,它只在輸入脈沖的高電平(或低電平)期間對輸入信號(hào)敏感并改變狀態(tài)。在數(shù)字電路中可以記錄二進(jìn)制數(shù)字信號(hào)“0”和“1”。
1、簡介
? ? ? 鎖存器(latch)是電平觸發(fā)的存儲(chǔ)單元,數(shù)據(jù)存儲(chǔ)的動(dòng)作取決于輸入時(shí)鐘(或者使能)信號(hào)的電平值,盡當(dāng)鎖存器處于使能狀態(tài)時(shí),輸出才會(huì)隨著數(shù)據(jù)輸入發(fā)生變化。
? ? ? 鎖存器不同于觸發(fā)器,鎖存器在不鎖存數(shù)據(jù)時(shí),輸出端的信號(hào)隨輸入信號(hào)變化,就像信號(hào)通過一個(gè)緩存器一樣;一旦鎖存信號(hào)起鎖存作用,則數(shù)據(jù)被鎖住,輸入信號(hào)不起作用。因此鎖存器也稱為透明鎖存器,指的是不鎖存時(shí)輸出對輸入是透明的。
? ? ? ? 鎖存器的分類包括 RS 鎖存器、門控 RS 鎖存器和 D 鎖存器,此處我們詳細(xì)介紹下 D 鎖存器。
? ? ? ?那么什么是 D 鎖存器呢?
? ? ? ?所謂的 D 鎖存器,就是能夠?qū)⑤斎氲膯温窋?shù)據(jù) D 存入到鎖存器中的電路,下面是我們給出 D 鎖存器的電路圖,如下圖所示。
? ? ? ? 從 D 鎖存器的電路圖中我們可以看出,該電路主要是由兩個(gè)部分組成,第一個(gè)部分是由 G1、G2兩個(gè)與非門組成的 RS 鎖存器,第二個(gè)部分是由 G3、G4 兩個(gè)與非門組成的控制電路。C 為控制信號(hào),用來控制 G3 和 G4 的激勵(lì)輸入。
? ? ? ?下面我們來分析下 D 鎖存器的工作原理,當(dāng)控制信號(hào) C=0 時(shí),根據(jù)與非門的邏輯定律,無論 D 輸入什么信號(hào),RD 和 SD 信號(hào)同時(shí)為 1。根據(jù)由與非門組成的 RS 鎖存器的邏輯定律,RD 和 SD 都同時(shí)等于 1 的話,鎖存器的輸出端 Q 將維持原狀態(tài)不變。那么,當(dāng)控制端 C=1 時(shí),如果此時(shí) D=0,SD 就等于 1,RD 就等于 0,根據(jù) RS 鎖存器的邏輯規(guī)律,電路的結(jié)果就為 0 狀態(tài);如果 D =1,那么 RD 就等于 1,SD 也就等于 0,鎖存器的結(jié)果就為 1 狀態(tài),也就是說,此時(shí)鎖存器的狀態(tài)是由激勵(lì)輸入端 D 來確定的,并且 D 等于什么,鎖存器的狀態(tài)就是什么,這就是我們前面所說的,將單路數(shù)據(jù) D 存入到鎖存器之中。
? ? ? ?根據(jù)上面的描述,我們可以推出 D 鎖存器的特性表,Qn 是指觸發(fā)器當(dāng)前邏輯狀態(tài)也即觸發(fā)前的狀態(tài),Qn+1 是指觸發(fā)后的狀態(tài)。
? ? ? ? 通過這個(gè)表格,我們可以看出,當(dāng) C 為 1 時(shí),D 的狀態(tài)和 Qn+1 的狀態(tài)完全一樣,當(dāng) D=0 時(shí),Qn+1=0,當(dāng) D=1 時(shí),Qn+1=1。
? ? ? ?我們還可以進(jìn)一步畫出 D 鎖存器的波形圖。
? ? ? ? 從 D 鎖存器的波形圖圖中我們可以看出,D 是鎖存器的輸入信號(hào),C 是鎖存器的控制信號(hào),Q 是鎖存器的輸出信號(hào),當(dāng)控制信號(hào) C 為高電平時(shí),輸出信號(hào) Q 將跟隨輸入信號(hào) D 的變化而變化,大家看虛線內(nèi),Q 的波形等于 D 的波形。當(dāng)控制信號(hào) C 從高電平變?yōu)榈碗娖綍r(shí),輸入信號(hào) D 的狀態(tài)將會(huì)決定鎖存器將要鎖存的狀態(tài)。大家可以看到,C 由高變低的那兩條虛線內(nèi),所對應(yīng)的輸入信號(hào) D 為低電平,那么輸出信號(hào) Q 也將會(huì)鎖存低電平。最后面的那兩條虛線也同理,D 為高電平,Q 鎖存高電平。
? ? ?? D 鎖存器的介紹就到這里,下面我們來從實(shí)際的邏輯設(shè)計(jì)里面看下鎖存器的壞處。
? ? ? ?在絕大多數(shù)設(shè)計(jì)中我們要避免產(chǎn)生鎖存器。它會(huì)讓您設(shè)計(jì)的時(shí)序出問題,并且它的隱蔽性很強(qiáng),新人很難查出問題。鎖存器最大的危害在于不能過濾毛刺和影響工具進(jìn)行時(shí)序分析。這對于下一級(jí)電路是極其危險(xiǎn)的。所以,只要能用觸發(fā)器的地方,就不用鎖存器。
? ? ? ?由上圖示意圖我們可以看到,鎖存器沒有時(shí)鐘信號(hào),只有數(shù)據(jù)輸入和使能以及輸出 q 端,沒有時(shí)鐘信號(hào)也就說明我們沒有辦法對這種器件進(jìn)行時(shí)序分析,這個(gè)在時(shí)序電路里面是非常危險(xiǎn)的行為,因?yàn)榭赡芤饡r(shí)序不滿足導(dǎo)致電路功能實(shí)現(xiàn)有問題。
2、實(shí)驗(yàn)任務(wù)
設(shè)計(jì)一個(gè)鎖存器電路。
3、程序設(shè)計(jì)
? ? ? ?代碼里面出現(xiàn) latch 的兩個(gè)原因:在組合邏輯中,if 或者 case 語句不完整的描述,比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了 latch。解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。
? ? ? ?大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。
3.1、缺少 else 分支的鎖存器代碼
? ? ? 根據(jù)程序設(shè)計(jì)的思路,我們來設(shè)計(jì)一個(gè) if 語句,但缺少 else 分支的鎖存器代碼(latch.v),代碼編寫如下:
//實(shí)驗(yàn)任務(wù):設(shè)計(jì)一個(gè)鎖存器電路
//程序設(shè)計(jì):
//代碼里面出現(xiàn) latch 的兩個(gè)原因:在組合邏輯中,if 或者 case 語句不完整的描述,
//比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了 latch。
//解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。
//大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,
//帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。
module latch(
//input clk, //system clk
input a,
input b,
output reg y // output signal
);
//*******************************************
//** main code
//*******************************************
always @(*) begin
if(a==1)
y=b;
//else
// y=0;
end
endmodule
? ? ? 程序中的一個(gè)組合邏輯電路使用了 if 語句,但是這個(gè)語句沒有 else 分支,我們可以使用 Vivado查看 RTL 視圖。
從 RTL ANALSIS 視圖中可以看出,模塊下面顯示了 RTL_LATCH,可以看出這個(gè)電路就是 latch。
3.2、補(bǔ)齊?else 分支
下面我們把 else 補(bǔ)充完整再來看下電路結(jié)構(gòu),代碼如下:
//實(shí)驗(yàn)任務(wù):設(shè)計(jì)一個(gè)鎖存器電路
//程序設(shè)計(jì):
//代碼里面出現(xiàn) latch 的兩個(gè)原因:在組合邏輯中,if 或者 case 語句不完整的描述,
//比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了 latch。
//解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。
//大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,
//帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。
module latch(
//input clk, //system clk
input a,
input b,
output reg y // output signal
);
//*******************************************
//** main code
//*******************************************
always @(*) begin
if(a==1)
y=b;
else
y=0;
end
endmodule
這個(gè)代碼中,添加了 else 分支,我們可以使用 RTL ANALSIS 視圖再看一下綜合的電路結(jié)構(gòu)。
上圖所示的電路結(jié)構(gòu)是一個(gè) mux 選擇電路,可以看出,加了 else 分支的電路就不會(huì)有 latch 電路。
3.3、缺少 default 的 case 語句的鎖存器代碼
下面我們來寫一個(gè)不帶 default 的 case 語句,代碼如下:
//
//實(shí)驗(yàn)任務(wù):設(shè)計(jì)一個(gè)鎖存器電路
//程序設(shè)計(jì):
//代碼里面出現(xiàn) latch 的兩個(gè)原因:在組合邏輯中,if 或者 case 語句不完整的描述,
//比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了 latch。
//解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。
//大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,
//帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。
module latch(
//input clk, //system clk
input a,
input b,
output reg y // output signal
);
//*******************************************
//** main code
//*******************************************
always @(*) begin
// if(a==1)
// y=b;
// //else
// // y=0;
case(a)
0:y = b;
endcase
end
endmodule
從 RTL ANALSIS 視圖中可以看出,模塊下面顯示了 RTL_LATCH,可以看出這個(gè)電路就是 latch。
3.3、補(bǔ)齊 default 的 case 語句
下面我們把 case 語句的 default 補(bǔ)充完整再來看下電路結(jié)構(gòu),代碼如下:
//
//實(shí)驗(yàn)任務(wù):設(shè)計(jì)一個(gè)鎖存器電路
//程序設(shè)計(jì):
//代碼里面出現(xiàn) latch 的兩個(gè)原因:在組合邏輯中,if 或者 case 語句不完整的描述,
//比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了 latch。
//解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。
//大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,
//帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。
module latch(
//input clk, //system clk
input a,
input b,
output reg y // output signal
);
//*******************************************
//** main code
//*******************************************
always @(*) begin
// if(a==1)
// y=b;
// //else
// // y=0;
case(a)
0:y = b;
default:y = 0;
endcase
end
endmodule
可以看出,這個(gè)語句有 case 的 default 分支,我們使用 vivado 的 RTL ANALSIS 來看下綜合的電路結(jié)構(gòu)。
?上圖所示的電路結(jié)構(gòu)是一個(gè) mux 選擇電路,可以看出,加了 case 的 default 分支的電路就不會(huì)有 latch電路。
4、本章總結(jié)
? ? ? ?本章需要掌握的重點(diǎn)是代碼里面出現(xiàn) latch 在組合邏輯中出現(xiàn)的原因:if 語句或者 case 語句不完整的描述,比如 if 缺少 else 分支,case 缺少 default 分支,導(dǎo)致代碼在綜合過程中出現(xiàn)了latch。解決辦法就是 if 必須帶 else 分支,case 必須帶 default 分支。 文章來源:http://www.zghlxwxcb.cn/news/detail-689398.html
? ? ? ?大家需要注意下,只有不帶時(shí)鐘的 always 語句的 if 或者 case 語句不完整才會(huì)產(chǎn)生 latch,帶時(shí)鐘的語句 if 或者 case 語句不完整描述不會(huì)產(chǎn)生 latch。 文章來源地址http://www.zghlxwxcb.cn/news/detail-689398.html
到了這里,關(guān)于數(shù)字電路基礎(chǔ)---鎖存器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!