一直都知道fpga中有l(wèi)atch這么一回事,但是一直都不太清楚到底什么是鎖存器,它是怎么產(chǎn)生的,它到底和寄存器有多少區(qū)別,它怎么消除。為什么說他不好?
一,是什么
鎖存器是一種在異步時序電路系統(tǒng)中,對輸入信號電平敏感的單元,用來存儲信息。一個鎖存器可以存儲1bit的信息,通常,鎖存器會多個一起出現(xiàn),如4位鎖存器,8位鎖存器。
鎖存器在數(shù)據(jù)未鎖存時,輸出端的信號隨輸入信號變化,就像信號通過一個緩沖器,一旦鎖存信號有效,則數(shù)據(jù)被鎖存,輸入信號不起作用。因此,鎖存器也被稱為透明鎖存器,指的是不鎖存時輸出對于輸入是透明的。
二 鎖存器與寄存器的區(qū)別:
兩者都是基本存儲單元,單鎖存器是電平觸發(fā)的存儲器,觸發(fā)器是邊沿觸發(fā)的存儲器。本質(zhì)是,兩者的基本功能是一樣的,都可以存儲數(shù)據(jù)。意思是說一個是組合邏輯的,一個是在時序電路中用的,時鐘出發(fā)的。
三,鎖存器的危害:
對毛刺敏感,不能異步復(fù)位,所以上電以后處于不確定的狀態(tài);
Latch會使靜態(tài)時序分析變得非常復(fù)雜;
在PLD芯片中,基本的單元是由查找表和觸發(fā)器組成的,若生成鎖存器反而需要更多的資源。
第三條也是最基本的原因。
四,產(chǎn)生的原因 ********ps重重之重
上面說了那沒多只是覺得網(wǎng)上的沒把鎖存器說明白。下面的才是重點(diǎn)。
1,case
2,if-------else if
3,always@(敏感信號表)
五 解決
1.case——————加default:
關(guān)于defalut的情況:一是可以 default:data=1‘bx;這個x表示未知,在綜合時可以避免產(chǎn)生鎖存器。在仿真時是紅線表示。
二是 default:data=0;這樣產(chǎn)生一個默認(rèn)的情況。
2.if-----------------------一定要有else語句。
3.always---------如是說道:在賦值表達(dá)式右邊參與賦值的信號都必須在always@(敏感電平列表)中列出。
如果在賦值表達(dá)式右端引用了敏感電平列表中沒有列出的信號,那么在綜合時,將會為該沒有列出的信號隱含地產(chǎn)生一個透明鎖存器。
4. 付初值。好用的
,我們討論一下到底鎖存器是不是就是沒用的
1. Latch的本質(zhì)
Latch作為一種電路單元,必然有其存在的理由及應(yīng)用場景,在實(shí)際應(yīng)用中,有些設(shè)計(jì)不可避免的要使用Latch,特別是總線應(yīng)用上,例如,地址鎖存器,數(shù)據(jù)鎖存器,復(fù)位信號鎖存器等。但是在更多的情況下,很容易產(chǎn)生未預(yù)料到的鎖存器,使邏輯功能不滿足要求,浪費(fèi)大量時間。比較好的應(yīng)用規(guī)則是:要學(xué)會分析是否需要Latch以及代碼是否會產(chǎn)生意外的Latch。
通過Verilog HDL實(shí)現(xiàn)序列最大值搜索程序,并保持檢測到的最大值
- [plain] view plaincopymodule two_max(
- a,rst_n,abmax
- );
- input [7:0] a;
- input rst_n;
- output [7:0] abmax;
- reg [7:0] abmax_tmp;
- always @ (a or rst_n) begin
- if (!rst_n)
- abmax_tmp = 8‘h00;
- else
- if (a》abmax_tmp)
- abmax_tmp = a;
- end
- endmodule
上述代碼在ISE中的綜合結(jié)果會給出設(shè)計(jì)中包含Latch的警告。但實(shí)際上,abmax_tmp鎖存器正是我們需要的,所以,雖然有警告,但是代碼設(shè)計(jì)是沒有問題的。將上述代碼的if語句補(bǔ)全:
- [plain] view plaincopyif (a 》 abmax_tmp)
- abmax_tmp = a;
- else
- abmax_tmp = abmax_tmp;
經(jīng)過綜合后,仍然有Latch的警告。無論Latch是否是用戶需要的,ISE都會給出警告,主要原因就是Latch對整個設(shè)計(jì)的時序性能影響較大。所以,在設(shè)計(jì)中要盡量避免Latch,但是確實(shí)需要使用的情況,也可以使用。
2. “不期望”latch
指的是與設(shè)計(jì)意圖不符,產(chǎn)生的Latch。主要問題在于設(shè)計(jì)人員沒有合理使用Verilog HDL語言,常見的原因是對條件語句(if、casse)的分支描述不完整。典型例子:用Verilog HDL實(shí)現(xiàn)一個鎖存器,當(dāng)輸入數(shù)據(jù)大于127時,將輸入數(shù)據(jù)輸出,否則輸出0
- [plain] view plaincopymodule latch_demo(
- din,dout
- );
- input [7:0] din;
- output [7:0] dout;
- reg [7:0] dout;
- always @ (din) begin
- if (din》127)
- dout 《= din;
- end
- endmodule
綜合后的結(jié)果,在比較器后面級聯(lián)了鎖存器,這是因?yàn)閕f語句缺少else分支造成的。查看仿真結(jié)果,當(dāng)輸入小于127時,輸出保持了上次的127,不是0,沒有達(dá)到設(shè)計(jì)要求。修改方法很簡單,就是講if-else補(bǔ)全。
- [plain] view plaincopyif (din 》 127 )
- dout = din;
- else
- dout = 0;
在ISE中綜合后的結(jié)果中,可以看到補(bǔ)全if-else后,在比較器后面級聯(lián)了與門,代替原來的鎖存器,仿真結(jié)果也正確。
至此,可以得到一個結(jié)論:Latch作為一種基本電路單元,會影響到電路的時序性能,應(yīng)該盡量避免使用,但出現(xiàn)Latch造成設(shè)計(jì)與意圖不符的情況,是由于設(shè)計(jì)人員代碼不正確造成的。
-
寄存器
+關(guān)注
關(guān)注
31文章
5369瀏覽量
121275 -
鎖存器
+關(guān)注
關(guān)注
8文章
911瀏覽量
41666 -
異步時序
+關(guān)注
關(guān)注
0文章
6瀏覽量
8656 -
Latch
+關(guān)注
關(guān)注
1文章
48瀏覽量
16241 -
單鎖存器
+關(guān)注
關(guān)注
0文章
2瀏覽量
1644
發(fā)布評論請先 登錄
相關(guān)推薦
鎖存器、觸發(fā)器、寄存器和緩沖器的區(qū)別
Verilog基本功--flipflop和latch以及register的區(qū)別
寄存器的作用有哪些?
累加器是寄存器嗎_寄存器、累加器、暫存器有什么區(qū)別
如何使用鎖存器的Time Borrowing技術(shù)來替代關(guān)鍵路徑中的寄存器
鎖存器、觸發(fā)器、寄存器的關(guān)聯(lián)與區(qū)別及其相應(yīng)的verilog描述
Verilog中 鎖存器/觸發(fā)器/寄存器的區(qū)別
什么是鎖存器 與寄存器有何區(qū)別
帶輸入鎖存器的8位移位寄存器數(shù)據(jù)表
![帶輸入<b class='flag-5'>鎖</b><b class='flag-5'>存</b><b class='flag-5'>器</b>的8位移位<b class='flag-5'>寄存器</b>數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論