色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Verilog代碼:if-else和case的電路結構和區別

要長高 ? 來源:eetop ? 作者:曜曜曜切克鬧 ? 2023-11-29 15:10 ? 次閱讀

本文是針對在寫項目中遇到的Verilog代碼寫法錯誤,多對一和一對多賦值問題,從邏輯賦值的角度理解為何會編譯出錯。并在后續討論了if-else和case的電路結構和區別。在此處列出來供大家一起交流學習。

2.對Verilog代碼的理解

2.1 一對多賦值、多對一賦值行為的區別

2.1.1多對一賦值的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

·如果將一個信號(如pwdata)對多個信號進行賦值(如REG1、REG2),應該使用譯碼器形式的電路結構。也就是pwdata根據paddr進行譯碼,從而將值賦給REG1/REG2。如下圖所示

#FormatImgID_0#

·譯碼器一般用多個輸入信號,根據padder判斷取值的不同,將輸入信號pwdata賦值給相應的輸出信號。代碼中給出了兩種寫法都可以。

2.1.2一對多賦值的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

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

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

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

end

else begin

prdata <= prdata;

end

end

end

·如果將多個信號(如REG1、REG2)對一個信號進行賦值(如prdata),應該使用多路選擇器形式的電路結構。也就是REG1/REG2根據paddr進行判斷,從而將值賦給prdata。如下圖所示

#FormatImgID_1#

·多路選擇器的寫法一般是利用case語句進行實現,根據case的條件不同,選擇不同的輸入信號對輸出信號進行賦值。

2.1.3 為什么多對一賦值不能用三目運算符呢?

即寫成:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

//注意多對一中,下面這種寫法是錯誤的

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

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

end

else begin

prdata <= prdata;

end

end

end

分析:這時候編譯就會報錯,prdata同時被兩個常量賦值。假如說paddr選中了'h54321,此時 prdata<= REG1成立;但是請注意在第二條語句中,由于paddr≠'h54321,prdata <= prdata。

由此我們可以知道三目運算符和case并不等價,如果改寫成if-else多層嵌套語句,編譯沒有出錯誤。

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

下面進一步分析if-else和case語句的區別來分析。

2.2 if—else語句與case語句的區別

2.2.1 if-else語句的電路結構

每個if-else就是一個2選1mux器。當信號有明顯優先級時,首先要考慮if-else,但是if嵌套過多也會導致速度變慢;if語句結構較慢,但占用面積小。

嵌套的if語句如果使用不當,就會導致設計的更大延時,為了避免較大的路徑延遲,最好不要使用特別長的嵌套if結構。如想利用if語句來實現那些對延時要求苛刻的路徑時,應將最高優先級給最遲到達的關鍵信號。

2.2.2 case語句的電路結構

case語句綜合為 n選1的mux電路。適用于無明顯優先級的邏輯判斷,即這些邏輯條件都處于同一個優先級且互斥;case結構電路速度較快,但占用面積較大。

2.2.3 if語句和case語句中的latch問題

if-else:組合邏輯和時序邏輯中的always語句塊中實現是不同的。

組合邏輯中:if缺少else 時,會有latch;

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

case語句:case列舉不全并且還沒寫default語句,則會綜合出鎖存器。所以一定寫default,無論是組合還是時序邏輯。

總結:保證if-else對應齊全;case必寫default。

2.2.4 if-else語句和case語句的區別

對于這個的討論,本人認為是以前由于綜合工具落后,導致有區別,但是隨著綜合工具的更新,他們之間的區別越來越小,甚至有人可以用if-else綜合出無優先級的多路選擇器,用case綜合出有優先級的多路選擇器。

“if-else的邏輯判別是有優先級的,而case的邏輯判斷條件是并列的。

舉個例子,如果你用IF實現譯碼器,綜合出的是有優先級的譯碼器。如果用CASE,綜合出的就是一個無優先級的譯碼器。也就是說IF是有優先級的,執行的次序有先后。而CASE執行的時候是沒有先后順序的。”

“隨著綜合工具的進步,已經不需要討論if-else 和case的區別了,兩者可以等同 ”

“Verilog 2001標準(IEEE 1364-2001)第132頁:

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

指出了case是串行有優先級。又:

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是四態對比。除此之外和if-else沒有差別。”

審核編輯:黃飛

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

    關注

    28

    文章

    1351

    瀏覽量

    110162
  • D觸發器
    +關注

    關注

    3

    文章

    164

    瀏覽量

    47961
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68754
  • Case
    +關注

    關注

    0

    文章

    27

    瀏覽量

    13379
  • 多路選擇器
    +關注

    關注

    1

    文章

    22

    瀏覽量

    6545
收藏 人收藏

    評論

    相關推薦

    C語言中if語句、if-else語句和switch語句詳解

    在C語言中,有三種條件判斷結構:if語句、if-else語句和switch語句。
    發表于 08-18 16:36 ?1.2w次閱讀
    C語言中if語句、<b class='flag-5'>if-else</b>語句和switch語句詳解

    煉獄傳奇-if_elsecase之戰

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

    Proteus之if-else語句的應用

    Proteus之if-else語句的應用,很好的Proteus資料,快來學習吧。
    發表于 04-18 14:49 ?0次下載

    verilog中if與case語句不完整產生鎖存器的原因分析

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

    FPGA學習系列:if-elsecase

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

    C語言的switch case多分支選擇語句的詳細資料說明

    1、switch-case開關語句是一種多分支選擇語句,用來實現多方向條件分支。雖然采用if-else條件判斷語句也可以實現多方向條件分支,但是當分支較多時,使用if-else條件語句的嵌套層次會
    發表于 07-12 17:39 ?1次下載
    C語言的switch <b class='flag-5'>case</b>多分支選擇語句的詳細資料說明

    30多個verilog實用例子代碼合集免費下載

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

    FPGA代碼經驗 case,casez,casex語句

    使用case語句代替嵌套的if-else將會產生更易讀的代碼,更好的邏輯利用率和更高的性能。
    的頭像 發表于 12-11 10:42 ?6301次閱讀

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

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

    不會有人不知道怎么優雅的替換if-else語句吧

    來自:love1024.blog.csdn.net/article/details/104955363 場景日常開發,if-else語句寫的不少吧??當邏輯分支非常多的時候,if-else套了一層
    的頭像 發表于 07-28 15:46 ?1450次閱讀
    不會有人不知道怎么優雅的替換<b class='flag-5'>if-else</b>語句吧

    數字芯片設計流程之verilog設計

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

    解鎖新姿勢:干掉過多的if-else

    這點非常容易理解,就是說在業務邏輯里面,先把不符合條件的給先過濾掉,而不是層層嵌套if-else判斷
    的頭像 發表于 11-12 10:01 ?668次閱讀

    什么是SystemVerilog-決策語句-if-else語句?

    決策語句(Decision statements)允許程序塊的執行流程根據設計中信號的當前值分支到特定語句。SystemVerilog有兩個主要的決策語句:if…else語句和case語句,使用關鍵字case
    的頭像 發表于 02-09 14:15 ?1202次閱讀
    什么是SystemVerilog-決策語句-<b class='flag-5'>if-else</b>語句?

    Verilog中的If語句和case語句介紹

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

    如何通過策略模式簡化if-else

    相信大家日常開發中會經常寫各種分支判斷語句,比如 if-else ,當分支較多時,代碼看著會比較臃腫,那么如何優化呢? 1、什么是策略模式? Define a family
    的頭像 發表于 10-08 16:08 ?784次閱讀
    如何通過策略模式簡化<b class='flag-5'>if-else</b>
    主站蜘蛛池模板: 欧美性喷潮xxxx| 久久综合老色鬼网站| 最新在线黄色网址| 亚洲欧美日韩在线观看一区二区三区 | 在线免费观看视频a| 亚洲精品一线二线三线无人区 | 中文字幕人成人乱码亚洲AV| 亚洲午夜精品A片久久不卡蜜桃 | bl撅高扒开臀缝哦| 99久久精品久久久久久清纯| 97资源总站(中文字幕)| 97在线精品视频| 99久久爱re热6在线播放| 99re这里只有精品国产| 99精品网站| yellow视频免费观看高清在线| jizzzz亚洲丰满xxxx| 办公室里呻吟的丰满老师电影| 柏木舞子在线| 国产av在在免费线观看美女| 国产高清-国产av| 国产亚洲AV精品无码麻豆 | 亚洲精品色情婷婷在线播放| 亚洲人成7777| 在野外被男人躁了一夜动图| 3d在线看小舞被躁视频| cctv网站| 国产黄片毛片| 极品虎白在线观看| 老湿影院色情a| 欧美黑白配性xxxxx| 色姣姣狠狠撩综合网| 亚州三级久久电影| 亚洲中文无码亚洲人在线观看-| 在线视频中文字幕| AV色蜜桃一区二区三区| 国产AV精品无码免费看| 国产专区青青草原亚洲| 久久网站视频| 青青草久久伊人| 午夜免费福利片|