<kbd id="9plqc"><label id="9plqc"></label></kbd>

        <th id="9plqc"></th>
        1. <center id="9plqc"><video id="9plqc"></video></center>
          <sub id="9plqc"><form id="9plqc"><pre id="9plqc"></pre></form></sub>
          <nav id="9plqc"><form id="9plqc"><legend id="9plqc"></legend></form></nav>
          【FPGA基礎】Latch基礎 您所在的位置:網站首頁 袁樹珊命理探源pdf 【FPGA基礎】Latch基礎

          【FPGA基礎】Latch基礎

          2025-01-03 00:07| 來源: 網絡整理| 查看: 265

          “本文主要轉載自https://zhuanlan.zhihu.com/p/93133247,高屋建瓴。其中關於如何會產生latch的部分,轉載自https://zhuanlan.zhihu.com/p/34408492?from_voters_page=true。”

            在FPGA的設計中,避免使用鎖存器是幾乎所有FPGA工程師的共識,Xilinx和Altera也在手冊中提示大家要慎用鎖存器,除非你明確知道你確實需要一個latch來解決問題。要想理解latch是什麼,就需要分別理解鎖存器、觸發(fā)器和暫存器的概念。

          一、鎖存器、觸發(fā)器和暫存器的原理和區(qū)別

            鎖存器、觸發(fā)器和暫存器它們的英文分別為:Latch、Flip-Flop、Register。本文不會詳細介紹鎖存器和觸發(fā)器內部的電路,只對輸入輸出的波形分析。

          1、鎖存器 Latch

            鎖存器用來儲存狀態(tài)資訊,就是將這個狀態(tài)一直保持。鎖存器對脈衝的電平敏感,也就是電平觸發(fā),在有效的電平下,鎖存器處於使能狀態(tài),輸出隨著輸入發(fā)生變化,此時它不鎖存訊號,就像一個緩衝器一樣;在鎖存器沒有使能時,則資料被鎖住,輸入訊號不起作用,此時輸出一直為鎖存的狀態(tài)資訊。我們常見的鎖存器有SR鎖存器、D鎖存器、JK鎖存器等。

            我們以最簡單的D鎖存器為例來說明鎖存器的工作過程,D鎖存器有3個介面,也可以認為是4個,因為輸出的兩個和?只是單純的反向關係。

            其中D為輸入訊號,當E為高時,輸出Q即為輸入的D;當E為低時,Q保持E為高時的最後一次狀態(tài),也就是鎖存過程。

          為什麼鎖存器不好?

            從上面的圖中可以看出,鎖存器很容易在訊號上產生毛刺;而且也沒有時鐘訊號,不容易進行靜態(tài)時序分析。正是因為這兩個原因,我們在FPGA設計時,儘量不用鎖存器。

          2、觸發(fā)器

            觸發(fā)器(Flip-Flop,簡寫為 FF),也叫雙穩(wěn)態(tài)門,又稱雙穩(wěn)態(tài)觸發(fā)器。在中國臺灣及中國香港譯作“正反器”,是一種具有兩種穩(wěn)態(tài)的用於儲存的元件,可記錄二進位制數字訊號“1”和“0”。D觸發(fā)器是我們平時寫程式中用到最多的element。除了D觸發(fā)器,常見的觸發(fā)器還有T觸發(fā)器、SR觸發(fā)器、JK觸發(fā)器等。觸發(fā)器對脈衝邊沿敏感,其狀態(tài)只在時鐘脈衝的上升沿或下降沿的瞬間改變。

            我們以D觸發(fā)器為例來說明觸發(fā)器的工作過程,D觸發(fā)器介面如下:

            觸發(fā)器只在時鐘邊沿時起作用,所以哪怕輸入的訊號中有毛刺,輸出還是比較乾淨的。

            

            觸發(fā)器會有個CE的埠,如果CE為低,輸出保持不變,這樣也算是鎖存,但不會用到鎖存器,只要不用鎖存器,就不會有上述鎖存器帶來的問題。

          3、鎖存器和觸發(fā)器的對比

            避免使用D鎖存器,儘量使用D觸發(fā)器

          // D鎖存器 module test_latch( input a , input b , output y

          );

          always @(a or b) begin if (a == 1'b1) y = b; end

          endmodule

          // D觸發(fā)器 module test_d( input clk , input a , input b , output y

          );

          always @(posedge clk) begin if (a == 1'b1) y = b; end

          endmodule

            在D觸發(fā)器中,訊號a被綜合成D觸發(fā)器的使能端,只有在時鐘上沿到來且a為高時,b訊號的值才能傳遞給a;只要在時鐘上升沿期間訊號b是穩(wěn)定,即使在其他時候b還有毛刺,經過D觸發(fā)器後資料是穩(wěn)定的,毛刺被濾除。

          4、暫存器

            暫存器是用來存放資料的一些小型儲存區(qū)域,用來暫時存放參與運算的資料和運算結果,它被廣泛的用於各類數字系統(tǒng)和計算機中。其實暫存器就是一種常用的時序邏輯電路,但這種時序邏輯電路只包含儲存電路。暫存器的儲存電路是由鎖存器或觸發(fā)器構成的,因為一個鎖存器或觸發(fā)器能儲存1位二進位制數,所以由N個鎖存器或觸發(fā)器可以構成N位暫存器。 工程中的暫存器一般按計算機中位元組的位數設計,所以一般有8位暫存器、16位暫存器等。

            還有一點需要了解的是,FPGA中最小的單元是閘電路,閘電路又組成了鎖存器,鎖存器組成了暫存器。

          二、如何產生鎖存器以及如何避免鎖存器

            一般來說,在組合邏輯中,如果條件描述不全就會容易產生Latch

          1. if-else 和case-default必須配套,也就是出現if 必須出現else與之配套;有case必須在後面寫一個default,針對case語句也可以增加綜合指令 //synopsys full_case指令省略default語句。

          2.在所有條件下,對所有訊號都進行賦值,同時單個always模組儘量只對單一變數進行賦值。

            在時序電路的if語句中,即使沒有else,也不會綜合出Latch,因為時序電路綜合出來的是Flip-flop;

            上面這兩種寫法容易出現在什麼地方呢?最常見的就是在寫狀態(tài)機時,case語句中沒有給出變數的全部情況。

            最後就SIRF 2008年面試題為例進行說明

          “下面哪種寫法會產生latch?為什麼?”

          (1) always @(*) begin if(d) a = b; end

          (2) always @(*) begin if(d) a = b; else a = a; end

          (3) always @ (b or d) case(d) 2'b00: a=b>>1; 2'b11: c=b>>1; default: begin a=b; c=b; end endcase

          (4) always @(b or d) begin a = b; c = b; case (d) 2'b00: a = b >> 1; 2'b11: c = b >> 1; endcase end

          (5) always@(b or d) begin case (d) //synopsys full_case 2'b00: a = b >> 1; 2'b11: c = b >> 1; endcase end

          程式碼(1)中由於缺少else分支,故而會產生鎖存器;

          程式碼(2)if-else結構完整但由於為組合邏輯,而組合邏輯要想產生記憶功能(a鎖存),只能綜合成鎖存器;

          程式碼(3)中由於並未在所有情況下對所有訊號值賦值故會產生latch,當d為0時並沒有對c賦值;

          程式碼(4)中由於在選擇語句之前給訊號賦一個初值,故不會產生latch。但該種程式碼風格是按照軟體的思維方式書寫,故而不推薦使用;

          程式碼(5)中雖然有 //synopsys full_case但是依舊並未在所有情況下對所有訊號值賦值故會產生latch( //synopsys full_case只能省掉default)。

          三、FPGA中的Latch資源

            網上有一種說法是:FPGA中只有LUT和FF的資源,沒有現成的Latch,所以如果要用Latch,需要更多的資源來搭出來。這種說法是錯誤的,因為在Xilinx的FPGA中,6 系列之前的器件中都有Latch;6系列和7系列的FPGA中,一個Slice中有50%的storage element可以被配置為Latch或者Flip-Flop,另外一半隻能被配置為Flip-Flop。比如7系列FPGA中,一個Slice中有8個Flip-Flop,如果被配置成了Latch,該Slice的另外4個Flip-Flop就不能用了。這樣確實造成了資源的浪費。

            在UltraScale的FPGA中,所有的storage element都可以被配置成Flip-Flop和Latch。

            我們以下面的程式碼來說明Flip-Flop和Latch在Ultrascale的FPGA中Implementation後的結果。

          //Flip-Flop程式碼

          module FF_top( input clk, input [3:0] data_i, input data_ie, //enable output reg [3:0] o_latch );

          always @ ( posedge clk ) begin if(data_ie) o_latch



          【本文地址】

          公司簡介

          聯系我們

          今日新聞

          推薦新聞

          專題文章
            CopyRight 2018-2019 實驗室設備網 版權所有
            黄色免费网站在线看,韩国精品在线观看,韩国美女一区二区,99国产热 尼玛县| 苏尼特右旗| 独山县| 邛崃市| 闽侯县| 富民县| 崇左市| 凉城县| 平遥县| 临城县| 沧源| 酒泉市| 兴文县| 十堰市| 梅河口市| 红桥区| 凤庆县| 龙门县| 滦平县| 怀安县| 资源县| 嘉定区| 普格县| 达州市| 永春县| 抚宁县| 天台县| 隆安县| 墨玉县| 涪陵区| 玛多县| 鸡西市| 连云港市| 蕲春县| 万宁市| 长岛县| 商城县| 洛阳市| 恩平市| 佛冈县| 肇源县| http://444 http://444 http://444 http://444 http://444 http://444