一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

觸發(fā)器的應(yīng)用案例

FPGA開(kāi)源工坊 ? 來(lái)源:FPGA開(kāi)源工坊 ? 2023-11-13 09:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天群友遇到一個(gè)在綜合的時(shí)候報(bào)錯(cuò)ambiguous clock in event control的問(wèn)題,我們就來(lái)看看一個(gè)always塊會(huì)生成什么樣的電路。

案例一

首先從最簡(jiǎn)單的一段代碼來(lái)看:

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

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

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

可以看到,clk和b經(jīng)過(guò)一個(gè)IBUF后接入觸發(fā)器的C端(時(shí)鐘端)和D端(數(shù)據(jù)輸入端),然后輸出Q端經(jīng)過(guò)一個(gè)OBUF連接到c。其中IBUF和OBUF以及BUFG是vivado自動(dòng)幫我們插入的,當(dāng)信號(hào)是頂層信號(hào)的時(shí)候vivado就會(huì)幫我們自動(dòng)插入IBUF和OBUF,時(shí)鐘信號(hào)幫我們自動(dòng)掛到了時(shí)鐘樹(shù)上面。

案例二:

那么vivado是怎么認(rèn)出來(lái)我們代碼里面寫(xiě)的clk就是時(shí)鐘信號(hào)呢,是靠clk這個(gè)名字嗎,讓我們把clk換成rst來(lái)看一下,代碼如下:

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

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

可以看到上面代碼生成的電路和案例一中的電路是一樣的,vivado也是把posedge rst認(rèn)為是時(shí)鐘信號(hào)接到了觸發(fā)器的時(shí)鐘端,可見(jiàn)vivado并不是靠名字來(lái)識(shí)別哪個(gè)信號(hào)是時(shí)鐘,哪個(gè)信號(hào)是復(fù)位的。

案例三:

那么我們應(yīng)該怎么生成一個(gè)復(fù)位信號(hào)呢,先看一下同步復(fù)位的情況,代碼如下:

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

可以看到復(fù)位端rst接到了觸發(fā)器的復(fù)位信號(hào)上。注意在上述代碼中是高電平復(fù)位的,那么我們?cè)倏匆幌氯绻堑碗娖綇?fù)位會(huì)產(chǎn)生什么樣子的電路,代碼如下:

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信號(hào)之后多了一個(gè)LUT,這個(gè)LUT的目的是將rst信號(hào)取反,也就是說(shuō)我們想讓rst為0的時(shí)候進(jìn)行復(fù)位,但是vivado在生成電路的時(shí)候會(huì)將其取反變?yōu)?之后接到觸發(fā)器的復(fù)位端,這里在復(fù)位端插入一級(jí)LUT便會(huì)影響我們的時(shí)序,這也是為什么我們常說(shuō)FPGA更推薦同步高復(fù)位的原因之一。

在UG901中有相關(guān)的描述如下:

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

案例四:

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

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

可以看到對(duì)于同步復(fù)位的觸發(fā)器有FDSE和FDRE兩種,兩者的區(qū)別就是FDSE在復(fù)位的時(shí)候輸出是1,F(xiàn)DRE是0。,這也是為什么在案例三中無(wú)論是高復(fù)位還是低復(fù)位生成的都是FDRE。

那么我們改變一下代碼,讓c在復(fù)位的時(shí)候變?yōu)?,也就是c <= 1'b1,來(lái)看看生成的電路是什么樣子的,代碼如下:

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

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

案例五:

第五個(gè)案例就來(lái)看一下vivado是怎么把rst認(rèn)為是復(fù)位信號(hào)的。我們先來(lái)看如下代碼:

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

可以發(fā)現(xiàn)復(fù)位信號(hào)沒(méi)有了,F(xiàn)DRE是復(fù)位端直接接了地,那么我們有理由懷疑是不是vivado在處理if else的時(shí)候會(huì)把if里面的信號(hào)認(rèn)為是復(fù)位信號(hào)呢。上述代碼里面兩個(gè)if語(yǔ)句并列,生成的電路也是a b rst經(jīng)過(guò)一大段組合邏輯之后接入到FDRE是D端。

案例六:

將案例五的代碼稍將改變,也就是在第二個(gè)if前面增加一個(gè)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

可以看到我們的復(fù)位端又重新回來(lái)了,那么也就印證了在案例五中的猜想,他是靠if else, if elseif這樣的結(jié)構(gòu)來(lái)識(shí)別是不是復(fù)位的,怎么映射過(guò)去的,需要注意的是案例六中因?yàn)槲覀儗?xiě)了a==1時(shí)才把b的值給到c,那么a就被接入到了觸發(fā)器的CE端,當(dāng)a的值是0時(shí),CE端為0,Q端保持上一次的值不變。注意在時(shí)序電路里面,我們不寫(xiě)else也不會(huì)生成latch。

案例七:

上面代碼都是在敏感信號(hào)里面只有一個(gè)posedge clk,那么如果我們寫(xiě)多個(gè)敏感信號(hào)呢,會(huì)變成什么樣子。

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

我們先來(lái)看一下上述代碼,敏感列表里面有兩個(gè)信號(hào),posedge clk和posedge rst。并且在begin end里面也沒(méi)有if else或者if else if這種結(jié)構(gòu)的語(yǔ)句,按照我們同步復(fù)位的幾個(gè)案例的推斷,他會(huì)把clk和rst都推斷為時(shí)鐘信號(hào),而實(shí)際上我們不可能給一個(gè)xilinx的FPGA的觸發(fā)器同時(shí)接兩個(gè)時(shí)鐘信號(hào),這個(gè)時(shí)候vivado在綜合的時(shí)候就給我們報(bào)錯(cuò)了。

因?yàn)槲覀冎酪粋€(gè)觸發(fā)器只能有一個(gè)時(shí)鐘信號(hào),如果有多個(gè)時(shí)鐘信號(hào)我們也需要做時(shí)鐘切換電路,來(lái)確保在同一時(shí)刻只有一個(gè)時(shí)鐘接到上面。vivado推斷不出來(lái)上述代碼究竟哪個(gè)信號(hào)是時(shí)鐘信號(hào),那他只能報(bào)錯(cuò)了,告訴我們當(dāng)前時(shí)鐘信號(hào)是模棱兩可的。

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

案例八:

那么案例七中的代碼怎么改呢,第一種選擇案例五中的方式,將敏感列表變?yōu)橐粋€(gè),那么時(shí)鐘信號(hào)自然就明確了。

第二種就是敏感列表中另一個(gè)信號(hào)變?yōu)閺?fù)位信號(hào)。這兩種改法取決于我們想要實(shí)現(xiàn)的邏輯是什么樣子的。

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

第二種改法被綜合為一個(gè)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

我們?cè)賮?lái)看一段代碼:

有一組if else,如果只有這一組的話,他就應(yīng)該和案例4一樣生成一個(gè)FDSE,但是我們下面又給他加了一句if,那么他便不會(huì)將rst認(rèn)為是一個(gè)復(fù)位信號(hào)了,而是和其他if else一起生成一大堆組合邏輯。

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

案例十:

在案例九里面是對(duì)同一個(gè)信號(hào)進(jìn)行賦值,如果我們對(duì)不同的信號(hào)進(jìn)行賦值呢。

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

上述代碼和案例九里面,只有當(dāng)a==1時(shí)的操作不同,一個(gè)是對(duì)c進(jìn)行賦值,另一個(gè)是對(duì)新的寄存器e進(jìn)行賦值,那么vivado就會(huì)對(duì)c和e兩個(gè)寄存器分別處理,生成如下電路:

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

這個(gè)代碼和我們分成兩個(gè)always寫(xiě)是一樣的:

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

案例十一:

如果我案例九中的代碼換成異步復(fù)位呢,會(huì)發(fā)生什么:

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

綜合完直接報(bào)錯(cuò)了,那么為什么案例九中沒(méi)報(bào)錯(cuò)呢。是因?yàn)槲覀兠舾辛斜砝锩嬗衏lk和rst,他們肯定不是復(fù)位就是時(shí)鐘信號(hào)嘛,vivado也會(huì)這么考慮,但是在begin end里面寫(xiě)的代碼塊,按第一個(gè)if else結(jié)構(gòu)應(yīng)該生成帶復(fù)位的觸發(fā)器,而第二個(gè)if結(jié)構(gòu),他又不應(yīng)該生成,vivado就傻眼了,只能報(bào)錯(cuò)啊。而案例九里面,rst不在敏感列表里面,vivado還有一種選擇就是將其當(dāng)成普通信號(hào),所以案例九生成了一大堆的組合邏輯。

案例十二:

也許會(huì)有一種想法就是把案例十一的代碼像案例十那樣改,也就是對(duì)兩個(gè)寄存器進(jìn)行賦值,如下代碼:

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

不過(guò)不好意思,這種寫(xiě)法也是錯(cuò)誤的,會(huì)報(bào)錯(cuò)

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

這是因?yàn)槲覀冊(cè)诿舾辛斜砝锩鎸?xiě)兩個(gè)信號(hào),但是對(duì)于e這個(gè)寄存器又都沒(méi)有使用,不會(huì)生成復(fù)位信號(hào),那可不就接著報(bào)ambiguous clock in event control了。在上述代碼中對(duì)c的操作是不會(huì)出錯(cuò)的。

案例十三:

看到這里不知道大家有沒(méi)有注意到,在異步復(fù)位里面,我們都是posedge rst和if(rst == 1'b1)也就是高電平復(fù)位,注意這兩個(gè)是需要匹配的,如果我們寫(xiě)個(gè)posedge rst但是緊接著寫(xiě)if(rst == 1'b0),這樣寫(xiě)是會(huì)報(bào)錯(cuò)的。

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

如上代碼和報(bào)錯(cuò),vivado也不知道他應(yīng)該是生成一個(gè)高電平復(fù)位還是一個(gè)低電平復(fù)位的電路了,所以他報(bào)錯(cuò)了。

關(guān)于異步復(fù)位還是同步復(fù)位可以參考UG949中的描述:

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    14

    文章

    2039

    瀏覽量

    62146
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70757
  • 時(shí)鐘信號(hào)
    +關(guān)注

    關(guān)注

    4

    文章

    468

    瀏覽量

    29233
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    835

    瀏覽量

    68789
  • 復(fù)位信號(hào)
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    6585

原文標(biāo)題:小議觸發(fā)器

文章出處:【微信號(hào):FPGA開(kāi)源工坊,微信公眾號(hào):FPGA開(kāi)源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    JK觸發(fā)器 D觸發(fā)器 RS觸發(fā)器 T觸發(fā)器 真值表

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

    JK觸發(fā)器,JK觸發(fā)器是什么意思

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

    D觸發(fā)器,D觸發(fā)器是什么意思

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

    什么是RS觸發(fā)器,RS觸發(fā)器的工作原理是什么?

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

    施密特觸發(fā)器,施密特觸發(fā)器是什么意思

    施密特觸發(fā)器,施密特觸發(fā)器是什么意思 施密特觸發(fā)器也有兩個(gè)穩(wěn)定狀態(tài),但與一般觸發(fā)器不同的是,施密特觸發(fā)器采用電位
    發(fā)表于 03-08 14:14 ?2179次閱讀

    觸發(fā)器的分類, 觸發(fā)器的電路

    觸發(fā)器的分類, 觸發(fā)器的電路 雙穩(wěn)態(tài)器件有兩類:一類是觸發(fā)器,一類是鎖存。鎖存觸發(fā)器的原
    發(fā)表于 03-09 09:59 ?1778次閱讀

    什么是邊沿觸發(fā)器_邊沿D觸發(fā)器介紹

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

    觸發(fā)器的作用_觸發(fā)器的特點(diǎn)介紹

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

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

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

    t觸發(fā)器和jk觸發(fā)器的區(qū)別和聯(lián)系

    觸發(fā)器是數(shù)字電路中常用的組合邏輯電路,在現(xiàn)代電子系統(tǒng)中有著廣泛的應(yīng)用。其中,最常用的兩種觸發(fā)器是T觸發(fā)器和JK觸發(fā)器。本文將詳細(xì)介紹T觸發(fā)器
    的頭像 發(fā)表于 02-06 14:04 ?7194次閱讀

    t觸發(fā)器與d觸發(fā)器的區(qū)別和聯(lián)系

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

    t觸發(fā)器變?yōu)閐觸發(fā)器的條件

    在數(shù)字電路設(shè)計(jì)中,觸發(fā)器是一種非常重要的存儲(chǔ)元件,用于存儲(chǔ)一位二進(jìn)制信息。觸發(fā)器的種類很多,其中最為常見(jiàn)的有JK觸發(fā)器、D觸發(fā)器和T觸發(fā)器
    的頭像 發(fā)表于 08-22 10:33 ?2895次閱讀

    d觸發(fā)器和jk觸發(fā)器的區(qū)別是什么

    引言 數(shù)字電路是現(xiàn)代電子技術(shù)的基礎(chǔ),廣泛應(yīng)用于計(jì)算機(jī)、通信、控制等領(lǐng)域。觸發(fā)器是數(shù)字電路中的一種基本邏輯元件,具有存儲(chǔ)和傳遞信息的功能。 觸發(fā)器的基本概念 觸發(fā)器是一種具有記憶功能的數(shù)字電路元件
    的頭像 發(fā)表于 08-22 10:37 ?3930次閱讀

    怎么用jk觸發(fā)器變成t觸發(fā)器

    將JK觸發(fā)器變成T觸發(fā)器,主要涉及到對(duì)JK觸發(fā)器的輸入端口進(jìn)行適當(dāng)?shù)倪B接和配置,以實(shí)現(xiàn)T觸發(fā)器的邏輯功能。以下是將JK觸發(fā)器轉(zhuǎn)換為T
    的頭像 發(fā)表于 08-28 09:41 ?4969次閱讀

    rs觸發(fā)器的工作原理 rs觸發(fā)器和sr觸發(fā)器的區(qū)別

    RS觸發(fā)器(Reset-Set觸發(fā)器)和SR觸發(fā)器(Set-Reset觸發(fā)器)是數(shù)字電路中常用的兩種基本觸發(fā)器。它們?cè)谶壿嫻δ芎蛻?yīng)用上有所不
    的頭像 發(fā)表于 10-21 10:06 ?7192次閱讀