iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 19
2
自我挑戰組

Verilog 從放棄到有趣系列 第 19

[Day19]何謂Latch?

  • 分享至 

  • xImage
  •  

今天要來跟大家分享電路的儲存裝置,一個是Latch,一個是Flip-Flop
首先給大家看一下一個位元Latch的電路圖以及真值表,有學過數位邏輯的應該都有看過,不過還是簡單介紹一下,S是set,R是reset,所以當S跟R都為0時輸出值是不會變的,可參考真值表,所以這樣的電路為一個儲存元件.
https://ithelp.ithome.com.tw/upload/images/20171230/20107543MvOkCkFjwJ.pnghttps://ithelp.ithome.com.tw/upload/images/20171230/20107543kTwq0CUZSB.png

再來是Flip-Flop,看電路能發現比Latch多了幾個邏輯閘跟微分電路,下面這電路也稱D型正反器,輸入接腳為D(Data)跟clk(clock),意思是當clock正緣時才去觸發這個正反器,clk等於1跟等於0時值是不會變的,如真值表.

https://ithelp.ithome.com.tw/upload/images/20171230/20107543kLH3x5j5FN.png
https://ithelp.ithome.com.tw/upload/images/20171230/20107543v9ZVQ4hQ9J.png

為什麼要介紹儲存元間呢,一方面加深大家寫電路的印象及對儲存元件的瞭解,一方面是要來講一下Latch在寫verilog時會造成的問題,因為實際在跑電路時,可能會有一些因素造成電路有雜訊的問題,造成如果使用Latch來儲存的話,可能會造成一些訊號誤判造成電路錯誤的情況,而Flip-Flop比較沒有這情況是因為只有在時脈上升的才改變值,所以時脈之間有雜訊並不會影響輸出值,所以今天要跟大家分享如何避免Latch的產生.

通常在寫combinational電路時才會出現Latch,而且通常是判斷條件沒寫完整的關係,會產生的原因大約為一下幾個

-if and else

always@(*)begin
  if(rst)
    a = 0;
  else if(c1)
    a = in1;
end	

像以上這樣,所以要嘛把條件寫滿,或者給初始值,各舉一個例子

條件寫滿:

always@(*)begin
  if(rst)
    a = 0;
  else if(c1)
    a = in1;
  else
    a = 0;
end	

補初始值:

always@(*)begin
a = 0;
  if(rst)
    a = 0;
  else if(c1)
    a = in1;
end

-case:
在寫case時,當case沒寫完整時,記得捕default:,不然也會產生Latch.

always@(*)begin
  case(Q)
    0:Q_NEXT = 1;
    1:Q_NEXT = 2;
    default:NEXT = 0;
  endcase
end

-回授
通常也是在組合語言出現,自己給自己值,這樣就會產生Latch把值存起來.

assign a = a + 1;
always@(*)begin
  a = a + 1;
end

會產生Latch情況大概就上面那幾項,大家在寫組合語言時要多小心,尤其是有判斷式時,要記得把情況寫滿或給初始值,但如果是循序邏輯的話就沒有這問題了,這邊就提供給大家做參考.


上一篇
[Day18]Coding Style 2/2
下一篇
[Day20]泡沫排序法
系列文
Verilog 從放棄到有趣30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
654321ioopp
iT邦新手 5 級 ‧ 2022-09-16 15:21:27

文章中latch圖表是錯誤的,NAND輸入只要有一個為0,輸出必為1。

我要留言

立即登入留言