在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

觸發器的應用案例

FPGA開源工坊 ? 來源:FPGA開源工坊 ? 2023-11-13 09:55 ? 次閱讀

今天群友遇到一個在綜合的時候報錯ambiguous clock in event control的問題,我們就來看看一個always塊會生成什么樣的電路。

案例一

首先從最簡單的一段代碼來看:

always @(posedge clk ) begin
    c <= b;
end

在上面的代碼里面敏感信號只有一個posedge clk,begin end中間也只有一個賦值語句,僅僅是一個打拍的操作,那么我們來看一下,他生成的電路是什么樣子的。

67497840-81c0-11ee-939d-92fbcf53809c.png

可以看到,clk和b經過一個IBUF后接入觸發器的C端(時鐘端)和D端(數據輸入端),然后輸出Q端經過一個OBUF連接到c。其中IBUF和OBUF以及BUFG是vivado自動幫我們插入的,當信號是頂層信號的時候vivado就會幫我們自動插入IBUF和OBUF,時鐘信號幫我們自動掛到了時鐘樹上面。

案例二:

那么vivado是怎么認出來我們代碼里面寫的clk就是時鐘信號呢,是靠clk這個名字嗎,讓我們把clk換成rst來看一下,代碼如下:

always @(posedge rst ) begin
        c <= 1'b1;
end

676e6178-81c0-11ee-939d-92fbcf53809c.png

可以看到上面代碼生成的電路和案例一中的電路是一樣的,vivado也是把posedge rst認為是時鐘信號接到了觸發器的時鐘端,可見vivado并不是靠名字來識別哪個信號是時鐘,哪個信號是復位的。

案例三:

那么我們應該怎么生成一個復位信號呢,先看一下同步復位的情況,代碼如下:

always @(posedge clk ) begin
    if(rst == 1'b1)begin
        c <= 1'b0;
    end
    else begin
        c <= b;
    end       
end

678d0eac-81c0-11ee-939d-92fbcf53809c.png

可以看到復位端rst接到了觸發器的復位信號上。注意在上述代碼中是高電平復位的,那么我們再看一下如果是低電平復位會產生什么樣子的電路,代碼如下:

always @(posedge clk ) begin
    if(rst == 1'b0)begin
        c <= 1'b0;
    end
    else begin
        c <= b;
    end       
end

67a927e0-81c0-11ee-939d-92fbcf53809c.png

可以看到在rst信號之后多了一個LUT,這個LUT的目的是將rst信號取反,也就是說我們想讓rst為0的時候進行復位,但是vivado在生成電路的時候會將其取反變為1之后接到觸發器的復位端,這里在復位端插入一級LUT便會影響我們的時序,這也是為什么我們常說FPGA推薦同步高復位的原因之一。

在UG901中有相關的描述如下:

67d1b5f2-81c0-11ee-939d-92fbcf53809c.png

案例四:

在案例三中展示了同步復位的情況,注意這里生成的觸發器都是FDRE,在xilinx的FPGA中一共有四種觸發器,在UG901中有說明,如下圖:

67ea9a7c-81c0-11ee-939d-92fbcf53809c.png

可以看到對于同步復位的觸發器有FDSE和FDRE兩種,兩者的區別就是FDSE在復位的時候輸出是1,FDRE是0。,這也是為什么在案例三中無論是高復位還是低復位生成的都是FDRE。

那么我們改變一下代碼,讓c在復位的時候變為1,也就是c <= 1'b1,來看看生成的電路是什么樣子的,代碼如下:

always @(posedge clk ) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end       
end

680e3ab8-81c0-11ee-939d-92fbcf53809c.png

可以看到在這種情況下,我們的代碼就映射到了一個FDSE上。

案例五:

第五個案例就來看一下vivado是怎么把rst認為是復位信號的。我們先來看如下代碼:

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

68314a94-81c0-11ee-939d-92fbcf53809c.png

可以發現復位信號沒有了,FDRE是復位端直接接了地,那么我們有理由懷疑是不是vivado在處理if else的時候會把if里面的信號認為是復位信號呢。上述代碼里面兩個if語句并列,生成的電路也是a b rst經過一大段組合邏輯之后接入到FDRE是D端。

案例六:

將案例五的代碼稍將改變,也就是在第二個if前面增加一個else,代碼如下

always @(posedge clk ) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else if (a == 1'b1)begin
        c <= b;
    end       
end

68510c8a-81c0-11ee-939d-92fbcf53809c.png

可以看到我們的復位端又重新回來了,那么也就印證了在案例五中的猜想,他是靠if else, if elseif這樣的結構來識別是不是復位的,怎么映射過去的,需要注意的是案例六中因為我們寫了a==1時才把b的值給到c,那么a就被接入到了觸發器的CE端,當a的值是0時,CE端為0,Q端保持上一次的值不變。注意在時序電路里面,我們不寫else也不會生成latch。

案例七:

上面代碼都是在敏感信號里面只有一個posedge clk,那么如果我們寫多個敏感信號呢,會變成什么樣子。

always @(posedge clk or posedge rst) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    if (a == 1'b1)begin
        c <= b;
    end       
end

我們先來看一下上述代碼,敏感列表里面有兩個信號,posedge clk和posedge rst。并且在begin end里面也沒有if else或者if else if這種結構的語句,按照我們同步復位的幾個案例的推斷,他會把clk和rst都推斷為時鐘信號,而實際上我們不可能給一個xilinx的FPGA的觸發器同時接兩個時鐘信號,這個時候vivado在綜合的時候就給我們報錯了。

因為我們知道一個觸發器只能有一個時鐘信號,如果有多個時鐘信號我們也需要做時鐘切換電路,來確保在同一時刻只有一個時鐘接到上面。vivado推斷不出來上述代碼究竟哪個信號是時鐘信號,那他只能報錯了,告訴我們當前時鐘信號是模棱兩可的。

686a33f4-81c0-11ee-939d-92fbcf53809c.png

案例八:

那么案例七中的代碼怎么改呢,第一種選擇案例五中的方式,將敏感列表變為一個,那么時鐘信號自然就明確了。

第二種就是敏感列表中另一個信號變為復位信號。這兩種改法取決于我們想要實現的邏輯是什么樣子的。

always @(posedge clk or posedge rst) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end       
end

6887df6c-81c0-11ee-939d-92fbcf53809c.png

第二種改法被綜合為一個FDPE。

案例九:

always @(posedge clk) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
    
    if(a == 1'b1)begin
        c <= d;
    end
         
end

我們再來看一段代碼:

有一組if else,如果只有這一組的話,他就應該和案例4一樣生成一個FDSE,但是我們下面又給他加了一句if,那么他便不會將rst認為是一個復位信號了,而是和其他if else一起生成一大堆組合邏輯。

68a2c8fe-81c0-11ee-939d-92fbcf53809c.png

案例十:

在案例九里面是對同一個信號進行賦值,如果我們對不同的信號進行賦值呢。

always @(posedge clk) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
    
    if(a == 1'b1)begin
        e <= d;
    end
         
end

上述代碼和案例九里面,只有當a==1時的操作不同,一個是對c進行賦值,另一個是對新的寄存器e進行賦值,那么vivado就會對c和e兩個寄存器分別處理,生成如下電路:

68c48a02-81c0-11ee-939d-92fbcf53809c.png

這個代碼和我們分成兩個always寫是一樣的:

always @(posedge clk) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
   
         
end


always @(posedge clk) begin
    if(a == 1'b1)begin
        e <= d;
    end
         
end

案例十一:

如果我案例九中的代碼換成異步復位呢,會發生什么:

always @(posedge clk or negedge rst) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
    
    if(a == 1'b1)begin
        c <= d;
    end
         
end

68f7e302-81c0-11ee-939d-92fbcf53809c.png

綜合完直接報錯了,那么為什么案例九中沒報錯呢。是因為我們敏感列表里面有clk和rst,他們肯定不是復位就是時鐘信號嘛,vivado也會這么考慮,但是在begin end里面寫的代碼塊,按第一個if else結構應該生成帶復位的觸發器,而第二個if結構,他又不應該生成,vivado就傻眼了,只能報錯啊。而案例九里面,rst不在敏感列表里面,vivado還有一種選擇就是將其當成普通信號,所以案例九生成了一大堆的組合邏輯。

案例十二:

也許會有一種想法就是把案例十一的代碼像案例十那樣改,也就是對兩個寄存器進行賦值,如下代碼:

always @(posedge clk or posedge rst) begin
    if(rst == 1'b1)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
    
    if(a == 1'b1)begin
        e <= d;
    end
         
end

不過不好意思,這種寫法也是錯誤的,會報錯

691afeb4-81c0-11ee-939d-92fbcf53809c.png

這是因為我們在敏感列表里面寫兩個信號,但是對于e這個寄存器又都沒有使用,不會生成復位信號,那可不就接著報ambiguous clock in event control了。在上述代碼中對c的操作是不會出錯的。

案例十三:

看到這里不知道大家有沒有注意到,在異步復位里面,我們都是posedge rst和if(rst == 1'b1)也就是高電平復位,注意這兩個是需要匹配的,如果我們寫個posedge rst但是緊接著寫if(rst == 1'b0),這樣寫是會報錯的。

always @(posedge clk or posedge rst) begin
    if(rst == 1'b0)begin
        c <= 1'b1;
    end
    else begin
        c <= b;
    end  
   
         
end

6935550c-81c0-11ee-939d-92fbcf53809c.png

如上代碼和報錯,vivado也不知道他應該是生成一個高電平復位還是一個低電平復位的電路了,所以他報錯了。

關于異步復位還是同步復位可以參考UG949中的描述:

69519cb2-81c0-11ee-939d-92fbcf53809c.png

697c6ece-81c0-11ee-939d-92fbcf53809c.png

69a33a0e-81c0-11ee-939d-92fbcf53809c.png

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 觸發器
    +關注

    關注

    14

    文章

    2003

    瀏覽量

    61301
  • 代碼
    +關注

    關注

    30

    文章

    4823

    瀏覽量

    68939
  • 時鐘信號
    +關注

    關注

    4

    文章

    452

    瀏覽量

    28646
  • Vivado
    +關注

    關注

    19

    文章

    815

    瀏覽量

    66819
  • 復位信號
    +關注

    關注

    0

    文章

    54

    瀏覽量

    6355

原文標題:小議觸發器

文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    JK觸發器 D觸發器 RS觸發器 T觸發器 真值表

    D觸發器真值表分析: 1. D 觸發器真值表   Dn   
    發表于 09-11 23:15 ?2w次閱讀

    JK觸發器,JK觸發器是什么意思

    JK觸發器,JK觸發器是什么意思 1.主從JK觸發器主從結構觸發器也可以徹底解決直接控制,防止空翻。這里以性能優良、廣泛使用的主從JK觸發器
    發表于 03-08 13:36 ?6895次閱讀

    D觸發器,D觸發器是什么意思

    D觸發器,D觸發器是什么意思   邊沿D 觸發器:  電平觸發的主從觸發器工作時,必須在正跳沿前加入輸入信號。如果在CP 高
    發表于 03-08 13:53 ?4991次閱讀

    什么是RS觸發器,RS觸發器的工作原理是什么?

    什么是RS觸發器,RS觸發器的工作原理是什么? 主從RS觸發器
    發表于 03-08 14:00 ?3.1w次閱讀

    施密特觸發器,施密特觸發器是什么意思

    施密特觸發器,施密特觸發器是什么意思 施密特觸發器也有兩個穩定狀態,但與一般觸發器不同的是,施密特觸發器采用電位
    發表于 03-08 14:14 ?1980次閱讀

    觸發器的分類, 觸發器的電路

    觸發器的分類, 觸發器的電路 雙穩態器件有兩類:一類是觸發器,一類是鎖存。鎖存觸發器的原
    發表于 03-09 09:59 ?1691次閱讀

    什么是邊沿觸發器_邊沿D觸發器介紹

    邊沿觸發器,指的是接收時鐘脈沖CP 的某一約定跳變(正跳變或負跳變)來到時的輸入數據。在CP=l 及CP=0 期間以及CP非約定跳變到來時,觸發器不接收數據的觸發器。具有下列特點的觸發器
    發表于 01-31 09:02 ?7.2w次閱讀
    什么是邊沿<b class='flag-5'>觸發器</b>_邊沿D<b class='flag-5'>觸發器</b>介紹

    觸發器的作用_觸發器的特點介紹

    本文開始介紹了觸發器的定義和觸發器的特點,其次闡述了觸發器的分類和觸發器的作用,最后介紹了觸發器的工作原理。
    發表于 03-27 17:35 ?2.2w次閱讀

    電平觸發器,脈沖觸發器和邊沿觸發器觸發因素是什么

    脈沖觸發器由兩個相同的電平觸發的SR觸發器組成,其中左SR觸發器成為主觸發器,右手側稱為從觸發器
    的頭像 發表于 02-11 10:56 ?9603次閱讀
    電平<b class='flag-5'>觸發器</b>,脈沖<b class='flag-5'>觸發器</b>和邊沿<b class='flag-5'>觸發器</b>的<b class='flag-5'>觸發</b>因素是什么

    t觸發器和jk觸發器的區別和聯系

    觸發器是數字電路中常用的組合邏輯電路,在現代電子系統中有著廣泛的應用。其中,最常用的兩種觸發器是T觸發器和JK觸發器。本文將詳細介紹T觸發器
    的頭像 發表于 02-06 14:04 ?6381次閱讀

    t觸發器與d觸發器的區別和聯系

    在數字電路設計中,觸發器是一種非常重要的存儲元件,用于存儲一位二進制信息。觸發器的種類很多,其中最為常見的是T觸發器(Toggle Flip-Flop)和D觸發器(Data Flip-
    的頭像 發表于 08-11 09:37 ?3448次閱讀

    t觸發器變為d觸發器的條件

    在數字電路設計中,觸發器是一種非常重要的存儲元件,用于存儲一位二進制信息。觸發器的種類很多,其中最為常見的有JK觸發器、D觸發器和T觸發器
    的頭像 發表于 08-22 10:33 ?1736次閱讀

    d觸發器和jk觸發器的區別是什么

    引言 數字電路是現代電子技術的基礎,廣泛應用于計算機、通信、控制等領域。觸發器是數字電路中的一種基本邏輯元件,具有存儲和傳遞信息的功能。 觸發器的基本概念 觸發器是一種具有記憶功能的數字電路元件
    的頭像 發表于 08-22 10:37 ?2313次閱讀

    怎么用jk觸發器變成t觸發器

    將JK觸發器變成T觸發器,主要涉及到對JK觸發器的輸入端口進行適當的連接和配置,以實現T觸發器的邏輯功能。以下是將JK觸發器轉換為T
    的頭像 發表于 08-28 09:41 ?3162次閱讀

    rs觸發器的工作原理 rs觸發器和sr觸發器的區別

    RS觸發器(Reset-Set觸發器)和SR觸發器(Set-Reset觸發器)是數字電路中常用的兩種基本觸發器。它們在邏輯功能和應用上有所不
    的頭像 發表于 10-21 10:06 ?3988次閱讀
    主站蜘蛛池模板: 久久久精品免费热线观看 | 五月天婷婷在线免费观看 | 国产一区二区三区毛片 | 黄色大成网站 | www.色婷婷.com| 欧美日韩色片 | 另类视频色综合 | 一区二区三区欧美在线 | 日日爽视频 | 扒开双腿疯狂进出爽爽爽 | 看全色黄大色大片免费久久怂 | 国产精品三级a三级三级午夜 | 日韩欧美卡通动漫在线观看 | 4338×亚洲全国最大色成网站 | 曰本福利写真片视频在线 | 美女拍拍拍免费视频观看 | 精品一区二区三区在线视频 | 五月天婷婷在线播放 | 一级片在线免费观看 | 男人的天堂网在线 | 五月香婷婷 | 久久刺激 | 亚洲综合成人网在线观看 | 久久国产精品99精品国产987 | 亚洲黄色网址 | 日本精品视频一视频高清 | yiren22亚洲综合高清一区 | 人人爽人人爱 | 天天躁日日躁狠狠躁一级毛片 | 欧美人与动欧交视频 | 乱小说录目伦800 | 天天操夜夜操夜夜操 | 日本xxx69| 色第一页 | 国产怡红院| 黄色网址网站在线观看 | 久久免费精品 | 欧美日韩一级视频 | 噜噜噜噜天天狠狠 | 欧美一级特黄aaaaaa在线看片 | 久久久久久久久国产 |