99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

要長(zhǎng)高 ? 來(lái)源:eetop ? 作者:曜曜曜切克鬧 ? 2023-11-29 15:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文是針對(duì)在寫項(xiàng)目中遇到的Verilog代碼寫法錯(cuò)誤,多對(duì)一和一對(duì)多賦值問(wèn)題,從邏輯賦值的角度理解為何會(huì)編譯出錯(cuò)。并在后續(xù)討論了if-else和case的電路結(jié)構(gòu)和區(qū)別。在此處列出來(lái)供大家一起交流學(xué)習(xí)。

2.對(duì)Verilog代碼的理解

2.1 一對(duì)多賦值、多對(duì)一賦值行為的區(qū)別

2.1.1多對(duì)一賦值的Verilog代碼:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

REG1 <= 'd0;

REG2 <= 'd0;

end

else begin

if(write) begin

case(paddr)

'h54321 : REG1 <= ?pwdata; ? //在32'h54321寫入pwdata

'h12345 : REG2 <= ?pwdata; ? //在32'h12345寫入pwdata

default begin

REG1 <= REG1 ;

REG2 <= REG2 ;

end

endcase

//另一種寫法

//REG1 <= (paddr == 'h54321) ? pwdata : REG1; //在32'h54321寫入pwdata

//REG2 <= (paddr == 'h12345) ? pwdata : REG2; ?//在32'h12345寫入pwdata

end

else begin

REG1 <= REG1;

REG2 <= REG2;

end

end

end

·如果將一個(gè)信號(hào)(如pwdata)對(duì)多個(gè)信號(hào)進(jìn)行賦值(如REG1、REG2),應(yīng)該使用譯碼器形式的電路結(jié)構(gòu)。也就是pwdata根據(jù)paddr進(jìn)行譯碼,從而將值賦給REG1/REG2。如下圖所示

#FormatImgID_0#

·譯碼器一般用多個(gè)輸入信號(hào),根據(jù)padder判斷取值的不同,將輸入信號(hào)pwdata賦值給相應(yīng)的輸出信號(hào)。代碼中給出了兩種寫法都可以。

2.1.2一對(duì)多賦值的Verilog代碼:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

case(paddr)

'h54321 : prdata <= REG1; //在32'h54321讀出prdata = REG1 ?

'h12345 : prdata <= REG2; //在32'h12345讀出prdata = REG2

default : prdata <= prdata;

endcase

//注意下面這種寫法是錯(cuò)誤的(2.1.3中會(huì)分析)

//prdata <= (paddr == 'h54321) ? REG1 : prdata;

//prdata <= (paddr == 'h54321) ? REG2 : prdata;

end

else begin

prdata <= prdata;

end

end

end

·如果將多個(gè)信號(hào)(如REG1、REG2)對(duì)一個(gè)信號(hào)進(jìn)行賦值(如prdata),應(yīng)該使用多路選擇器形式的電路結(jié)構(gòu)。也就是REG1/REG2根據(jù)paddr進(jìn)行判斷,從而將值賦給prdata。如下圖所示

#FormatImgID_1#

·多路選擇器的寫法一般是利用case語(yǔ)句進(jìn)行實(shí)現(xiàn),根據(jù)case的條件不同,選擇不同的輸入信號(hào)對(duì)輸出信號(hào)進(jìn)行賦值。

2.1.3 為什么多對(duì)一賦值不能用三目運(yùn)算符呢?

即寫成:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

//注意多對(duì)一中,下面這種寫法是錯(cuò)誤的

prdata <= (paddr == 'h54321) ? REG1 : prdata;

prdata <= (paddr == 'h54321) ? REG2 : prdata;

end

else begin

prdata <= prdata;

end

end

end

分析:這時(shí)候編譯就會(huì)報(bào)錯(cuò),prdata同時(shí)被兩個(gè)常量賦值。假如說(shuō)paddr選中了'h54321,此時(shí) prdata<= REG1成立;但是請(qǐng)注意在第二條語(yǔ)句中,由于paddr≠'h54321,prdata <= prdata。

由此我們可以知道三目運(yùn)算符和case并不等價(jià),如果改寫成if-else多層嵌套語(yǔ)句,編譯沒(méi)有出錯(cuò)誤。

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

if(paddr == 'h54321)begin

prdata <= REG1;

end

else begin

if(paddr == 'h54321)begin

prdata <= REG2;

end

else begin

prdata <= prdata; ? ?

end

end

end

else begin

prdata <= prdata;

end

end

end

下面進(jìn)一步分析if-else和case語(yǔ)句的區(qū)別來(lái)分析。

2.2 if—else語(yǔ)句與case語(yǔ)句的區(qū)別

2.2.1 if-else語(yǔ)句的電路結(jié)構(gòu)

每個(gè)if-else就是一個(gè)2選1mux器。當(dāng)信號(hào)有明顯優(yōu)先級(jí)時(shí),首先要考慮if-else,但是if嵌套過(guò)多也會(huì)導(dǎo)致速度變慢;if語(yǔ)句結(jié)構(gòu)較慢,但占用面積小。

嵌套的if語(yǔ)句如果使用不當(dāng),就會(huì)導(dǎo)致設(shè)計(jì)的更大延時(shí),為了避免較大的路徑延遲,最好不要使用特別長(zhǎng)的嵌套if結(jié)構(gòu)。如想利用if語(yǔ)句來(lái)實(shí)現(xiàn)那些對(duì)延時(shí)要求苛刻的路徑時(shí),應(yīng)將最高優(yōu)先級(jí)給最遲到達(dá)的關(guān)鍵信號(hào)。

2.2.2 case語(yǔ)句的電路結(jié)構(gòu)

case語(yǔ)句綜合為 n選1的mux電路。適用于無(wú)明顯優(yōu)先級(jí)的邏輯判斷,即這些邏輯條件都處于同一個(gè)優(yōu)先級(jí)且互斥;case結(jié)構(gòu)電路速度較快,但占用面積較大。

2.2.3 if語(yǔ)句和case語(yǔ)句中的latch問(wèn)題

if-else:組合邏輯和時(shí)序邏輯中的always語(yǔ)句塊中實(shí)現(xiàn)是不同的。

組合邏輯中:if缺少else 時(shí),會(huì)有l(wèi)atch;

時(shí)序邏輯中:盡管缺少else,依舊是D觸發(fā)器,不存在latch。

case語(yǔ)句:case列舉不全并且還沒(méi)寫default語(yǔ)句,則會(huì)綜合出鎖存器。所以一定寫default,無(wú)論是組合還是時(shí)序邏輯。

總結(jié):保證if-else對(duì)應(yīng)齊全;case必寫default。

2.2.4 if-else語(yǔ)句和case語(yǔ)句的區(qū)別

對(duì)于這個(gè)的討論,本人認(rèn)為是以前由于綜合工具落后,導(dǎo)致有區(qū)別,但是隨著綜合工具的更新,他們之間的區(qū)別越來(lái)越小,甚至有人可以用if-else綜合出無(wú)優(yōu)先級(jí)的多路選擇器,用case綜合出有優(yōu)先級(jí)的多路選擇器。

“if-else的邏輯判別是有優(yōu)先級(jí)的,而case的邏輯判斷條件是并列的。

舉個(gè)例子,如果你用IF實(shí)現(xiàn)譯碼器,綜合出的是有優(yōu)先級(jí)的譯碼器。如果用CASE,綜合出的就是一個(gè)無(wú)優(yōu)先級(jí)的譯碼器。也就是說(shuō)IF是有優(yōu)先級(jí)的,執(zhí)行的次序有先后。而CASE執(zhí)行的時(shí)候是沒(méi)有先后順序的。”

“隨著綜合工具的進(jìn)步,已經(jīng)不需要討論if-else 和case的區(qū)別了,兩者可以等同 ”

“Verilog 2001標(biāo)準(zhǔn)(IEEE 1364-2001)第132頁(yè):

The case item expressions shall be evaluated and compared in the exact order in which they are given.

指出了case是串行有優(yōu)先級(jí)。又:

Apart from syntax, the case statement differs from the multiway if-else-if construct in two important ways:

a) The conditional expressions in the if-else-if construct are more general than comparing one expression with several others, as in the case statement.

b) The case statement provides a definitive result when there are x and z values in an expression.

a)是廢話。b)指出了case是四態(tài)對(duì)比。除此之外和if-else沒(méi)有差別?!?/p>

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    29

    文章

    1367

    瀏覽量

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

    關(guān)注

    3

    文章

    172

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70719
  • Case
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    13626
  • 多路選擇器
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    C語(yǔ)言中if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句詳解

    在C語(yǔ)言中,有三種條件判斷結(jié)構(gòu):if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句。
    發(fā)表于 08-18 16:36 ?1.3w次閱讀
    C語(yǔ)言中if語(yǔ)句、<b class='flag-5'>if-else</b>語(yǔ)句和switch語(yǔ)句詳解

    煉獄傳奇-if_elsecase之戰(zhàn)

    Verilog HDL語(yǔ)言中存在兩種分支語(yǔ)言:● if-else 條件分支語(yǔ)句● case 分支控制語(yǔ)句1. if-else條件分支語(yǔ)句if-els
    發(fā)表于 03-31 09:51

    Proteus之if-else語(yǔ)句的應(yīng)用

    Proteus之if-else語(yǔ)句的應(yīng)用,很好的Proteus資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-18 14:49 ?0次下載

    verilog中if與case語(yǔ)句不完整產(chǎn)生鎖存器的原因分析

      在很多地方都能看到,verilog中if與case語(yǔ)句必須完整,即if要加上else,case后要加上default語(yǔ)句,以防止鎖存器的發(fā)生,下載內(nèi)容中就談到了其中原因。
    發(fā)表于 09-16 09:29 ?24次下載

    FPGA學(xué)習(xí)系列:if-elsecase

    設(shè)計(jì)背景:不管是在什么軟件和硬件語(yǔ)言,我們?cè)谖覀兊?b class='flag-5'>代碼中都或多或少的用到這兩條語(yǔ)句,if..elsecase語(yǔ)句,今天我們將學(xué)習(xí)verilog中的這兩條語(yǔ)句,其實(shí)不管在什么語(yǔ)言中這兩
    的頭像 發(fā)表于 06-01 16:59 ?1.2w次閱讀
    FPGA學(xué)習(xí)系列:<b class='flag-5'>if-else</b>與<b class='flag-5'>case</b>

    C語(yǔ)言的switch case多分支選擇語(yǔ)句的詳細(xì)資料說(shuō)明

    1、switch-case開(kāi)關(guān)語(yǔ)句是一種多分支選擇語(yǔ)句,用來(lái)實(shí)現(xiàn)多方向條件分支。雖然采用if-else條件判斷語(yǔ)句也可以實(shí)現(xiàn)多方向條件分支,但是當(dāng)分支較多時(shí),使用if-else條件語(yǔ)句的嵌套層次會(huì)
    發(fā)表于 07-12 17:39 ?1次下載
    C語(yǔ)言的switch <b class='flag-5'>case</b>多分支選擇語(yǔ)句的詳細(xì)資料說(shuō)明

    30多個(gè)verilog實(shí)用例子代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是30多個(gè)verilog實(shí)用例子代碼合集免費(fèi)下載包括了:奇偶校驗(yàn)位產(chǎn)生器,用case語(yǔ)句描述的4選1數(shù)據(jù)選擇器,用casez描述的數(shù)據(jù)選擇器,持續(xù)賦值方式定義的2選1多路
    發(fā)表于 09-09 08:00 ?35次下載
    30多個(gè)<b class='flag-5'>verilog</b>實(shí)用例子<b class='flag-5'>代碼</b>合集免費(fèi)下載

    FPGA代碼經(jīng)驗(yàn) case,casez,casex語(yǔ)句

    使用case語(yǔ)句代替嵌套的if-else將會(huì)產(chǎn)生更易讀的代碼,更好的邏輯利用率和更高的性能。
    的頭像 發(fā)表于 12-11 10:42 ?6713次閱讀

    從入門到高級(jí)替換If-Else的5種方法示例

    ,它導(dǎo)致設(shè)計(jì)復(fù)雜,代碼可讀性差,并且可能導(dǎo)致重構(gòu)困難。 但是,If-Else 已成為事實(shí)上的代碼分支解決方案,這確實(shí)是有道理的。這是向所有有抱負(fù)的開(kāi)發(fā)人員講授的第一件事。 不幸的是,許多開(kāi)發(fā)人員從來(lái)沒(méi)有前進(jìn)到更合適的分支策略。有
    的頭像 發(fā)表于 02-20 16:27 ?7182次閱讀
    從入門到高級(jí)替換<b class='flag-5'>If-Else</b>的5種方法示例

    不會(huì)有人不知道怎么優(yōu)雅的替換if-else語(yǔ)句吧

    來(lái)自:love1024.blog.csdn.net/article/details/104955363 場(chǎng)景日常開(kāi)發(fā),if-else語(yǔ)句寫的不少吧??當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層
    的頭像 發(fā)表于 07-28 15:46 ?1695次閱讀
    不會(huì)有人不知道怎么優(yōu)雅的替換<b class='flag-5'>if-else</b>語(yǔ)句吧

    數(shù)字芯片設(shè)計(jì)流程之verilog設(shè)計(jì)

    綜合開(kāi)始拿給后端,確保每一個(gè)階段沒(méi)有問(wèn)題。后仿真,證明加入延遲后功能是否正確。一、verilog設(shè)計(jì)可綜合語(yǔ)句四大關(guān)鍵字:always、if-else、assign、case1、if-else
    發(fā)表于 11-05 15:51 ?29次下載
    數(shù)字芯片設(shè)計(jì)流程之<b class='flag-5'>verilog</b>設(shè)計(jì)

    解鎖新姿勢(shì):干掉過(guò)多的if-else!

    這點(diǎn)非常容易理解,就是說(shuō)在業(yè)務(wù)邏輯里面,先把不符合條件的給先過(guò)濾掉,而不是層層嵌套if-else判斷
    的頭像 發(fā)表于 11-12 10:01 ?809次閱讀

    什么是SystemVerilog-決策語(yǔ)句-if-else語(yǔ)句?

    決策語(yǔ)句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語(yǔ)句。SystemVerilog有兩個(gè)主要的決策語(yǔ)句:if…else語(yǔ)句和case語(yǔ)句,使用關(guān)鍵字case、
    的頭像 發(fā)表于 02-09 14:15 ?1594次閱讀
    什么是SystemVerilog-決策語(yǔ)句-<b class='flag-5'>if-else</b>語(yǔ)句?

    Verilog中的If語(yǔ)句和case語(yǔ)句介紹

    。這些語(yǔ)句統(tǒng)稱為順序語(yǔ)句。case 語(yǔ)句和 if 語(yǔ)句都是 verilog 中順序語(yǔ)句的示例。在這篇文章的其余部分,我們將討論如何在verilog中使用這兩個(gè)語(yǔ)句。然后,我們考慮這兩個(gè)結(jié)構(gòu)
    的頭像 發(fā)表于 05-11 15:37 ?5773次閱讀
    <b class='flag-5'>Verilog</b>中的If語(yǔ)句和<b class='flag-5'>case</b>語(yǔ)句介紹

    如何通過(guò)策略模式簡(jiǎn)化if-else

    相信大家日常開(kāi)發(fā)中會(huì)經(jīng)常寫各種分支判斷語(yǔ)句,比如 if-else ,當(dāng)分支較多時(shí),代碼看著會(huì)比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
    的頭像 發(fā)表于 10-08 16:08 ?993次閱讀
    如何通過(guò)策略模式簡(jiǎn)化<b class='flag-5'>if-else</b>