关于VerilogHDL生成的锁存器
生活随笔
收集整理的這篇文章主要介紹了
关于VerilogHDL生成的锁存器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
總是會遇到有寫文檔中提到,不要生成鎖存器。問題是
?????? 一: 什么叫鎖存器
????? 二 : 為什么不要生成鎖存器
????? 三 : 如何避免生成鎖存器
??? 好,現(xiàn)在就這三個問題,一一做出解答
??? 一? 什么叫鎖存器
鎖存器(Latch)是一種對脈沖電平敏感的存儲單元電路,它們可以在特定輸入脈沖電平作用下改變狀態(tài)。鎖存,就是把信號暫存以維持某種電平狀態(tài)。鎖存器的最主要作用是緩存,其次完成高速的控制其與慢速的外設(shè)的不同步問題,再其次是解決驅(qū)動的問題,最后是解決一個 I/O 口既能輸出也能輸入的問題。 我的理解就是一個鎖進信號并存儲一段時間的電路,簡稱鎖存器。 二? 為什么不要生成鎖存器 一種說法 : 把該信號的變化暫存起來,待敏感電平列表中的某一個信號變化時再起作用,純組合邏輯電路不可能作到這一點,綜合器會發(fā)出警告。綜合工具會將Latch優(yōu)化掉,造成前、后仿真結(jié)果不一致。 第二種說法: 鎖存器為電平觸發(fā),無效電平鎖存,有效電平輸入即反應(yīng)到輸出,由于延時不同容易產(chǎn)生毛刺。組合邏輯中數(shù)據(jù)不需要鎖存,需要避免產(chǎn)生鎖存器。FPGA資源中木有鎖存器,需要觸發(fā)器加邏輯門構(gòu)成,消耗邏輯資源較多,但有時為了需要滿足一些規(guī)范協(xié)議,會用到鎖存器,總之FPGA用的很少。 而ASIC設(shè)計中,由于鎖存器構(gòu)成較簡單,傳輸速度快,用鎖存器可以有效提高集成度,所以用的比較多! 三? ?如何避免生成鎖存器 一份資料說? 在case () 后面加上?? ?//synthesis full_case。代碼中//synthesis full_case 是綜合命令,告知綜合工具case中已是全部列舉可能的情況,這樣綜合后無鎖存器。又有人說他在以下代碼中加入 //synthesis full_case 沒有效果 module datadistributor(datain,sel,enable,a,b,c,d); input datain; input[1:0] sel; input enable; output a; output c; output d; output b; reg a,b,c,d; always @(datain or enable or sel)beginif(enable==1'b1)begincase(sel)2'b00:a<=datain;2'b01:b<=datain;2'b10:c<=datain;2'b11:d<=datain;default:a<=datain;endcaseendelsebegina<=1'bz;b<=1'bz;c<=1'bz;d<=1'bz;endend endmodule這個帖子的結(jié)論就是 //synthesis full_case 去除的是沒有描述到的case情況所產(chǎn)生的鎖存器。所以上述代碼中產(chǎn)生的鎖存器是無法通過這條簡單的語句來消除的,好又有大神提及到
在 always 塊的 if..else 語句中如果所列的條件不完整,綜合時則會產(chǎn)生鎖存器。
example:always @(action)?? if(action)? out1 <= 1'b1;
沒有考慮到 !action 的情況,默認out1保持不變,這就產(chǎn)生了鎖存器。優(yōu)化方法:1.列出 !action 的情況,2.對out1賦初始值1.always @(action)?
? if(action)? out1 <= 1'b1;else??? out1 <= 1'b0;|2.always @(action)? beginout <= 1'b0;if(action)? out1 <= 1'b1;end
?滿滿以為這個我就可以大功告成,總算知道怎么樣避免產(chǎn)生鎖存器了。于是檢查了一下我的代碼,發(fā)現(xiàn)鎖存器好多啊,比如這個
?
1 //pulse_count and bit_count 2 reg [2:0] pulse_count = 3'd0; 3 reg [3:0] bit_count = 4'd0; 4 always @ (posedge i2c_clk) begin 5 if (curr_state == `IDLE) begin 6 pulse_count <= 3'd0; 7 bit_count <= 4'd0; 8 end else begin 9 if (pulse_count == 3'd4) pulse_count <= 3'd0; 10 else if ((curr_state != `WAIT) || scl ) 11 pulse_count <= pulse_count + 3'd1; 12 if (((curr_state == `TX) || (curr_state == `RX)) && (pulse_count == 3'd4)) begin 13 if (bit_count == 4'd8) bit_count <= 4'd0; 14 else bit_count <= bit_count + 4'd1; 15 end 16 end 17 end第12行產(chǎn)生的真值表并不全面那么事產(chǎn)生了鎖存器嗎?這個是李亞民老師的代碼
上面那位大神博文我只看了一半,后來才發(fā)現(xiàn)下面這么寫:
但是,在描述時序邏輯的時候,也通常利用 if 語句的隱式條件對帶時鐘使能的 D 觸發(fā)器建模
example:always@(posedge clk, negedge rst_n)? beginif(!rst_n)? sum <= 0;else if(EN)? sum <= a+b;表示在時鐘正沿來臨時,如果 EN 為 1 ,則將 a+b 的值賦給 sum, 言下之意是如果 EN 為 0, 那么 sum 保持原值不變。這里綜合工具會把代碼綜合成一個帶時鐘使能的 D 觸發(fā)器。?結(jié)論 : 組合邏輯,有無效狀態(tài)就會產(chǎn)生鎖存器?
?
總結(jié)
以上是生活随笔為你收集整理的关于VerilogHDL生成的锁存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Echarts利用多X轴实现七天天气预报
- 下一篇: 商品条形码