0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如果在FPGA設(shè)計(jì)中不允許latch中現(xiàn),又如何避免呢?

FPGA設(shè)計(jì)論壇 ? 來源:FPGA設(shè)計(jì)論壇 ? 作者:FPGA設(shè)計(jì)論壇 ? 2022-11-08 15:07 ? 次閱讀

在進(jìn)行FPGA設(shè)計(jì)的過程中,經(jīng)常會(huì)在編譯程序時(shí)發(fā)現(xiàn)有一些warning提示生成了一些latch,而且一般FPGA的設(shè)計(jì)規(guī)則也不建議有l(wèi)atch生成。那么,latch究竟是什么東西呢?如果在FPGA設(shè)計(jì)中不允許latch中現(xiàn),又如何避免呢?

1 鎖存器、觸發(fā)器和寄存器的比較

(1)鎖存器

鎖存器(latch)是電平觸發(fā)的存儲(chǔ)單元,數(shù)據(jù)存儲(chǔ)的動(dòng)作(狀態(tài)轉(zhuǎn)換)取決于輸入時(shí)鐘(或者使能)信號(hào)的電平值,僅當(dāng)鎖存器處于使能狀態(tài)時(shí),輸出才會(huì)隨著數(shù)據(jù)輸入發(fā)生變化。

分為普通鎖存器和門控鎖存器。普通鎖存器無控制信號(hào),輸出狀態(tài)始終直接由輸入決定。在實(shí)際的數(shù)字系統(tǒng)中,為了協(xié)調(diào)各部分的工作,往往需要有一個(gè)特定的控制信號(hào)去控制鎖存器狀態(tài)轉(zhuǎn)換的時(shí)間,在控制信號(hào)無效時(shí),輸出保持不變,不隨輸入變換;當(dāng)控制信號(hào)有效時(shí),輸出由輸入決定,跟隨輸入變化。

①正是因?yàn)殚T控鎖存器在控制信號(hào)有效的期間內(nèi),都可以接收輸入信號(hào),所以,激勵(lì)信號(hào)的任何變化,都將直接引起鎖存器輸出狀態(tài)的改變。這時(shí)輸入信號(hào)若發(fā)生多次變化,輸出狀態(tài)也可能發(fā)生多次變化,這一現(xiàn)象稱為鎖存器的空翻。

②其次,當(dāng)門控鎖存器的控制信號(hào)有效時(shí),鎖存器就變成了一個(gè)組合電路,時(shí)序邏輯電路的模型就等效為兩個(gè)各組合電路互為反饋的反饋系統(tǒng),因此,系統(tǒng)有可能會(huì)因?yàn)樗矐B(tài)特性不穩(wěn)定而產(chǎn)生振蕩現(xiàn)象。

(2) 觸發(fā)器(flip-flop)

觸發(fā)器(flip-flop)是邊沿敏感的存儲(chǔ)單元,數(shù)據(jù)存儲(chǔ)的動(dòng)作(狀態(tài)轉(zhuǎn)換)由某一信號(hào)的上升或者下降沿進(jìn)行同步的(限制存儲(chǔ)單元狀態(tài)轉(zhuǎn)換在一個(gè)很短的時(shí)間內(nèi))。(鐘控D觸發(fā)器其實(shí)就是 D 鎖存器,邊沿 D 觸發(fā)器才是真正的 D 觸發(fā)器)

觸發(fā)器分為兩種,一種是主從觸發(fā)器和邊沿觸發(fā)器。主從觸發(fā)器在時(shí)鐘有效期內(nèi)(主觸發(fā)器)接收數(shù)據(jù),在時(shí)鐘邊沿輸出狀態(tài)轉(zhuǎn)換。邊沿觸發(fā)器在時(shí)鐘邊沿期間, 觸發(fā)器才接收數(shù)據(jù)并使輸出狀態(tài)轉(zhuǎn)換。目前,主從觸發(fā)器基本上已經(jīng)很少見了,實(shí)際使用的大都是邊沿觸發(fā)器。

(3)寄存器(register)

寄存器(register)用來暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果。在實(shí)際的數(shù)字系統(tǒng)中,通常把能夠用來存儲(chǔ)一組二進(jìn)制代碼的同步時(shí)序邏輯電路稱為寄存器。

區(qū)別與聯(lián)系:由于觸發(fā)器內(nèi)有記憶功能,因此利用觸發(fā)器可以方便地構(gòu)成寄存器。由于一個(gè)觸發(fā)器能夠存儲(chǔ)一位二進(jìn)制碼,所以把 n 個(gè)觸發(fā)器的時(shí)鐘端口連接起來就能構(gòu)成一個(gè)存儲(chǔ) n 位二進(jìn)制碼的寄存器。

從寄存數(shù)據(jù)的角度來講,寄存器和鎖存器的功能是相同的;它們的區(qū)別在于寄存器是同步時(shí)鐘控制,而鎖存器是電位信號(hào)控制。一般的設(shè)計(jì)規(guī)則是:在絕大多數(shù)設(shè)計(jì)中避免產(chǎn)生鎖存器。它會(huì)讓您設(shè)計(jì)的時(shí)序完蛋,并且它的隱蔽性很強(qiáng),非老手不能查出。

2 鎖存器具備的特點(diǎn)

(1)對(duì)毛刺敏感(使能信號(hào)有效時(shí),輸出狀態(tài)可能隨輸入多次變化,產(chǎn)生空翻,對(duì)下一級(jí)電路很危險(xiǎn)),不能異步復(fù)位,因此在上電后處于不確定的 狀態(tài)。

(2)鎖存器會(huì)使靜態(tài)時(shí)序分析變得非常復(fù)雜,不具備可重用性。(首先, 鎖存器沒有時(shí)鐘參與信號(hào)傳遞,無法做 STA;其次,綜合工具會(huì)將 latch 優(yōu)化掉,造成前后仿真結(jié)果不一致)

(3)在FPGA中基本的單元是由查找表和觸發(fā)器組成的,若生成鎖存器反而需要更多的資源。根據(jù)鎖存器的特點(diǎn)可以看出,在電路設(shè)計(jì)中,要對(duì)鎖存器特別謹(jǐn)慎,如果設(shè)計(jì)經(jīng)過綜合后產(chǎn)生出和設(shè)計(jì)意圖不一致的鎖存器,則將導(dǎo)致設(shè)計(jì)錯(cuò)誤,包括仿真和綜合。因此,在設(shè)計(jì)中需要避免產(chǎn)生意想不到的鎖存器。如果組合邏輯的語句完全不使用 always 語句塊,就可以保證綜合器不會(huì)綜合出鎖存器。

(4)但如果鎖存器和觸發(fā)器兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比D觸發(fā)器少(D觸發(fā)器需要12個(gè)MOS管,鎖存器只需6個(gè)MOS管),鎖存器的集成度更高。

所以在的ASIC設(shè)計(jì)中會(huì)用到鎖存器。但鎖存器對(duì)毛刺敏感,無異步復(fù)位端,不能讓芯片在上電時(shí) 處在確定的狀態(tài);另外,鎖存器會(huì)使靜態(tài)時(shí)序分析變得很復(fù)雜,不利于設(shè)計(jì)的可重用,所以,在ASIC設(shè)計(jì)中,除了CPU這高速電路,或者RAM這種對(duì)面積很敏感的電路,一般不提倡用鎖存器。

3 鎖存器的出現(xiàn)以及解決辦法

在基于always的組合邏輯描述語句中容易綜合出鎖存器的地方:

在FPGA程序設(shè)計(jì)過程中,出現(xiàn)latch絕大多數(shù)情況是因?yàn)閕f和case語句的不完全描述,導(dǎo)致程序在綜合過程中出現(xiàn)了latch的功能行為。舉個(gè)簡單的例子,寫個(gè)譯碼器,輸入為a,輸出為b,其中a為2位輸入,b為8位輸出,若如下所寫:

always@( * )

case(a)

2‘b00: b = 8’d1;

2‘b01: b = 8’d5;

2‘b10: b = 8’d8;

2‘b11: b = 8’d17;

endcase

但是若將a的位數(shù)改為3,如下所寫:

always@( * )

case(a)

3‘b000: b = 8’d1;

3‘b001: b = 8’d5;

3‘b010: b = 8’d8;

3‘b011: b = 8’d17;

Endcase

可以看到,第二張綜合圖里面出現(xiàn)了latch。然而,兩段程序的不同僅僅是a的位數(shù)從2變到了3,這究竟是為什么?

其實(shí)這就是因?yàn)閏ase的不完全描述所致。在第一段程序中,輸入a可能的四種取值都窮舉到了,所以是完全描述的。而第二段程序中,a變?yōu)榱?位數(shù),而取值只有3’b000、3’b001、3’b010、3’b011四個(gè),而3’b100到3’b111之間的數(shù)據(jù)并沒有列舉出,雖然在實(shí)際執(zhí)行過程中輸入并不會(huì)出現(xiàn)未列舉出的數(shù)值,但是系統(tǒng)在編譯時(shí)并不知情,所以它會(huì)在3’b100到3’b111之間的值出現(xiàn)時(shí)將b的輸出鎖存,也就是出現(xiàn)了latch的功能行為

。 之所以在硬件設(shè)計(jì)中避免latch的出現(xiàn),主要原因是latch會(huì)產(chǎn)生毛刺(glitch),這種毛刺對(duì)下一級(jí)電路是很危險(xiǎn)的。并且其隱蔽性很強(qiáng),不易查出。因此,在設(shè)計(jì)中,應(yīng)盡量避免latch的使用。

從其產(chǎn)生原因可以看出,為了防止出現(xiàn)latch,對(duì)于if語句和case語句一定要做到完全描述,最常用的方法就是總是加上else和default。

總結(jié):

鎖存器產(chǎn)生的根本原因:當(dāng)組合邏輯需要保持時(shí),就會(huì)綜合出鎖存器。

鎖存器的危害:

(1)latch會(huì)產(chǎn)生毛刺(glitch),這種毛刺對(duì)下一級(jí)電路是很危險(xiǎn)的;

(2)不能異步復(fù)位,因此在上電后處于不確定的 狀態(tài);

(3)鎖存器會(huì)使靜態(tài)時(shí)序分析變得非常復(fù)雜,不具備可重用性

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5290

    瀏覽量

    119785
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    1995

    瀏覽量

    61009
  • Latch
    +關(guān)注

    關(guān)注

    1

    文章

    48

    瀏覽量

    16189

原文標(biāo)題:FPGA設(shè)計(jì)中如何才能不出現(xiàn)Latch鎖存器

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電力系統(tǒng)不允許發(fā)生諧振的原因

    電力系統(tǒng)諧振是指在電力系統(tǒng),由于某些特定條件的滿足,導(dǎo)致系統(tǒng)內(nèi)部的電感和電容元件相互配合,形成一種振蕩現(xiàn)象。諧振現(xiàn)象在電力系統(tǒng)不允許發(fā)生的,因?yàn)樗鼤?huì)帶來一系列嚴(yán)重的問題和危害。以下是對(duì)電力系統(tǒng)
    的頭像 發(fā)表于 08-22 14:21 ?484次閱讀

    ESP8266是否不允許將pwm API與at命令固件一起使用?

    :esp_iot_sdk_v1.5.1/examples/at) 編譯和下載還可以,但它似乎沒有像我預(yù)期的那樣工作。 調(diào)用pwm_init()后,AT命令I(lǐng)/O太遲鈍,PWM信號(hào)波形也不穩(wěn)定。 是否不允許將 pwm API 與 at 命令固件一起使用? 您能給我展示有關(guān)此的工作示例或文檔嗎?
    發(fā)表于 07-22 06:05

    什么情況下變壓器不允許調(diào)壓

    定情況下,變壓器是不允許調(diào)壓的。 一、變壓器調(diào)壓的原理 變壓器調(diào)壓的原理主要基于電磁感應(yīng)原理。當(dāng)原邊繞組通過交流電時(shí),會(huì)在鐵芯中產(chǎn)生交變磁通,這個(gè)交變磁通會(huì)感應(yīng)到副邊繞組,從而產(chǎn)生副邊電壓。通過改變?cè)吅透边吚@組
    的頭像 發(fā)表于 07-19 10:35 ?545次閱讀

    使用USBUART組件與主機(jī)PC通信,如果在串行端口打開的情況下終止固件,主機(jī)端為什么會(huì)報(bào)錯(cuò)?

    我正在使用 USBUART 組件與主機(jī) PC 通信,我一直在尋找某種機(jī)制來關(guān)閉 MCU 端的串行端口,或者至少通知主機(jī)我將關(guān)閉端口。 我遇到過這樣一個(gè)問題:如果在串行端口打開的情況下終止固件(如重置
    發(fā)表于 06-03 08:41

    SSWLBIST觸發(fā)ESR0脈沖的原因?

    在 TC377 電路板上,如果在 UCB 啟用了 LBIST,則 ESR0 在釋放 4.4ms 后會(huì)有一個(gè) 579us 脈沖。 如果在 UCB 禁用 LBIST,ESR0 將直接釋
    發(fā)表于 06-03 08:04

    如何將S7-1500 CPU重置為出廠設(shè)置

    如果在項(xiàng)目環(huán)境開始重置為出廠設(shè)置,必須具有到相關(guān) CPU 的在線連接。
    的頭像 發(fā)表于 05-21 11:15 ?3025次閱讀
    如何將S7-1500 CPU重置為出廠設(shè)置<b class='flag-5'>呢</b>?

    電力電容器為什么不允許短時(shí)間內(nèi)過電壓運(yùn)行

    在電力系統(tǒng),電容器是一種重要的電氣設(shè)備,常用于提高功率因數(shù)、改善電網(wǎng)穩(wěn)定性等方面。然而,電容器作為一種電壓敏感的元件,對(duì)于電壓波動(dòng)非常敏感,特別是在短時(shí)間內(nèi)的過電壓情況下,可能引發(fā)嚴(yán)重的問題。為什么電力電容器不允許短時(shí)間內(nèi)過電壓運(yùn)行?
    的頭像 發(fā)表于 02-26 14:30 ?771次閱讀

    FPGA競爭與冒險(xiǎn)的前世今生

    競爭冒險(xiǎn):在組合電路,當(dāng)邏輯門有兩個(gè)互補(bǔ)輸入信號(hào)同時(shí)向相反狀態(tài)變化時(shí),輸出端可能產(chǎn)生過渡干擾脈沖的現(xiàn)象,稱為競爭冒險(xiǎn)。那么 FPGA 產(chǎn)生競爭冒險(xiǎn)的原因是什么? 信號(hào)在 FPGA
    發(fā)表于 02-21 16:26

    時(shí)序電路為什么在FPGA上綜合成了latch?

    有朋友提問,下面的代碼為什么在DC里可以綜合成DFF,而在FPGA上卻綜合成了latch
    的頭像 發(fā)表于 02-20 16:12 ?733次閱讀
    時(shí)序電路為什么在<b class='flag-5'>FPGA</b>上綜合成了<b class='flag-5'>latch</b>?

    CMOS閂鎖測試的電流脈沖如何加上的?

    閂鎖測試中進(jìn)行電流注入測試時(shí),管腳電壓還不允許超多1.52倍最大電壓,這個(gè)如何做到?注入的電流需要是在工作電流+100mA。
    發(fā)表于 02-04 07:29

    “tc1.3”編譯報(bào)錯(cuò)不允許使用向量表編號(hào)TriCore?怎么解決?

    “tc1.3” TriCore? 不允許使用矢量表編號(hào)
    發(fā)表于 01-22 08:33

    FPGA讀ad7401數(shù)據(jù)時(shí),FPGA發(fā)出的時(shí)鐘如果在線路上有丟失,AD7401還能輸出正確的MDATA嗎?

    FPGA讀ad7401的數(shù)據(jù)時(shí)。FPGA發(fā)出的時(shí)鐘如果在線路上有丟失,AD7401還能輸出正確的MDATA嗎?有沒有一套機(jī)制是防止時(shí)鐘信號(hào)丟失的。
    發(fā)表于 12-07 08:03

    減速機(jī)為什么不允許有軸向竄動(dòng)現(xiàn)象?

    減速機(jī)為什么不允許有軸向竄動(dòng)現(xiàn)象? 減速機(jī)是一種用來改變輸入軸傳動(dòng)力矩和轉(zhuǎn)速的裝置。作為機(jī)械設(shè)備的核心部件之一,減速機(jī)在各個(gè)行業(yè)起到非常重要的作用,廣泛應(yīng)用于機(jī)械傳動(dòng)系統(tǒng)。 在減速機(jī)
    的頭像 發(fā)表于 11-23 10:46 ?911次閱讀

    python的set類型

    Python的set類型是一種無序、可變的集合數(shù)據(jù)類型,它的主要特點(diǎn)是不允許重復(fù)元素的存在。本文將詳盡、詳實(shí)、細(xì)致地介紹set類型的使用場景、常用操作以及與其他類型的比較等方面,以幫助讀者全面了解
    的頭像 發(fā)表于 11-21 16:25 ?777次閱讀

    如何在層堆棧管理器定義單層板?

    如何在層堆棧管理器定義單層(單面)板?電路板目前有兩層,但Layer Stack Manager不允許我刪除其中一個(gè)信號(hào)層。
    的頭像 發(fā)表于 11-10 15:19 ?736次閱讀