那曲檬骨新材料有限公司

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

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

3天內不再提示

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

454398 ? 來源:FPGA技術聯盟 ? 作者:FPGA技術聯盟 ? 2020-12-11 10:42 ? 次閱讀

10. case,casez,casex語句

Verilog定義了case,casez和casex語句,用于做多種情況下的選擇語句。

reg [1:0] sel;

reg [2:0] result;

always @(*)

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

endcase

使用case語句代替嵌套的if-else將會產生更易讀的代碼,更好的邏輯利用率和更高的性能。

casez和casex語句在比較中允許“don't care”條件。 casez將“z“”值視為"don't care",casex將“z”和“x”值都視為“don't care”。如果casez或casex表達式中的任何位都是"don't care value",那么該位將被忽略。以下是casez和casex的例子。

reg [1:0] sel;

reg [2:0] result;

// using casez

always @(*)

casez(sel)

2’b0?: result = 3’d0;

2’b10: result = 3’d1;

2’b11: result = 3’d2;

endcase

// using casex

always @(*)

casex(sel)

2’b0x: result = 3’d0;

2’b10: result = 3’d1;

2’b11: result = 3’d2;

Endcase

case的表達式可以是一個常量,如下例所示。

reg [1:0] sel;

reg [2:0] result;

always @(*)

case(1

~sel[1]: result = 3’d0;

sel[1] & ~sel[0]: result = 3’d1;

sel[1] & sel[0]: result = 3’d2;

Endcase

在案例中使用don't care條件很容易導致case 條件重疊或重復。而且,使用這些語句會導致綜合和仿真不匹配。以下是案例case條件重疊的一個例子。

// casez statement contains overlapped case items

reg [1:0] sel;

reg [2:0] result;

always @(*)

casez(sel)

2’b0z: result = 3’d0;

2’b10: result = 3’d2;

2’b11: result = 3’d3;

2’b01: result = 3’d1; // overlap with 2’b0z

Endcase

允許重疊或重復的case條件,在大多數情況下不會觸發任何仿真或綜合警告。這是一種危險且難以調試的情況.。建議開發人員完全避免使用casex和casez語句。

在case語句中添加一個默認的條件是避免一系列問題的簡單方法。 有兩種方法可以達到相同的效果,如以下示例所示。

reg [1:0] sel;

reg [2:0] result;

// using default clause

always @(*)

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

default: result = 3’d3;

endcase

// 在case語句之前進行默認賦值

always @(*)

result = 3’d3;

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

Endcase

11. 在always塊中混合阻塞和非阻塞賦值

Verilog指定了總是可以出現在塊中的兩種賦值類型:阻塞和非阻塞。阻塞和非阻塞賦值分別用于描述組合邏輯和時序邏輯。永遠不要在同一個塊中混合使用阻塞和非阻塞賦值。這樣做可能會導致不可預知的綜合和仿真結果。在許多情況下,綜合工具不會產生任何警告,但綜合結果將是不正確的。以下兩個代碼示例說明了阻塞和非阻塞賦值的混合使用。

reg blocking, non_blocking;

always @(posedge clk) begin

if(reset) begin

blocking = 0;

non_blocking

end

else begin

blocking = ^data;

non_blocking

end

end

always @(*) begin

blocking = ^data;

non_blocking

end

正確的方法是:

reg blocking, non_blocking;

always @(posedge clk) begin

if(reset) begin

non_blocking

end

else begin

non_blocking

end

end

always @(*) begin

blocking = ^data;

End

12. 多個阻塞賦值

always塊中的阻塞賦值按其順序執行。 盡管這樣做通常很方便,但是建議開發者限制使用多個阻塞賦值來賦值always塊中的相同變量。下面的兩個代碼示例顯示了使用多個阻塞分配的潛在問題。

reg signal_a, signal_b, signal_c, signal_d;

always (*) begin

signal_a = signal_b & signal_c;

// …

// additional code

signal_d = signal_a & signal_e;

end

無意中改變signal_a和signal_d分配的順序將會破壞signal_d的功能。

reg [15:0] signal_a, signal_b;

always (*) begin

signal_a[15:12] = 4’b0;

// …

// additional code

signal_a = signal_b;

End

signal_a的最后一個賦值優先,signal_a的位[15:12]永遠不會被復位。

13. 使用命名的always塊

以下是always塊的例子。

reg reg_unnamed;

always @(posedge clk) begin : myname

// only visible in the “myname” block

reg reg_named;

// post-synthesis name : myname.reg_named

reg_named

// post-synthesis name : reg_unnamed

reg_unnamed

end // always

命名塊可以在幾種情況下有用。 因為always塊是唯一標識的,所以在仿真中更容易找到它。 而且,限制變量的范圍允許重復使用相同的變量名稱。

編輯:hfy

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

    關注

    1630

    文章

    21798

    瀏覽量

    606067
收藏 人收藏

    評論

    相關推薦

    Verilog HDL語言編程的誤區與經驗

    中使用casex語句當在可綜合代碼中使用casez語句時 要小心當寫case
    發表于 03-26 08:00

    如何解決vhdl代碼中的case語句問題?

    大家好 ...我在使用case語句時遇到問題....雖然我使用它如下::-------------------------------------------------- ---過程(CLK)開始
    發表于 06-26 11:47

    在SpinalHDL中關于casez的使用

    為:沒什么大的問題。但我們知道,在Verilog中,存在case,casez,casex三種語法(本篇不做三種語法的區分與討論,對此感興趣的小伙伴可以自行百度)。像下面的這種代碼:我們
    發表于 07-06 10:59

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

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

    FPGA學習系列:if-else與case

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

    數字設計FPGA應用:case語句

    本課程以目前流行的Xilinx 7系列FPGA的開發為主線,全面講解FPGA的原理及電路設計、Verilog HDL語言及VIVADO的應用,并循序漸進地從組合邏輯、時序邏輯的開發開始,深入到FPGA的基礎應用、綜合應用和進階應
    的頭像 發表于 12-03 07:02 ?5434次閱讀
    數字設計<b class='flag-5'>FPGA</b>應用:<b class='flag-5'>case</b><b class='flag-5'>語句</b>

    CASE語句的執行規則是什么?

    CASE語句用來選擇幾個分支程序部分之一。選擇是基于選擇表達式當前值的。
    的頭像 發表于 10-09 09:26 ?5486次閱讀
    <b class='flag-5'>CASE</b><b class='flag-5'>語句</b>的執行規則是什么?

    一文淺析case、casex、casez區別

    先,case的描述,匹配都是從上到下進行的,如果使用了casez,看上面的casez的列表,只要輸入有z/?的話,就能和任意匹配。
    發表于 09-30 14:56 ?3880次閱讀

    RTL表達式和運算符

    決策語句(Decision statements)允許程序塊的執行流程根據設計中信號的當前值分支到特定語句。SystemVerilog有兩個主要的決策語句:if…else語句
    的頭像 發表于 10-21 09:04 ?1403次閱讀

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

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

    Verilog中的If語句case語句介紹

    我們在上一篇文章中已經看到了如何使用程序塊(例如 always 塊來編寫按順序執行的 verilog 代碼。 我們還可以在程序塊中使用許多語句來控制在我們的verilog設計中信號賦值的方式
    的頭像 發表于 05-11 15:37 ?4750次閱讀
    Verilog中的If<b class='flag-5'>語句</b>和<b class='flag-5'>case</b><b class='flag-5'>語句</b>介紹

    Switch case中的case順序

    ,并按照順序進行比較,匹配時就跳轉到滿足條件的語句執行。所以,可以對case的值依照發生的可能性進行排序,把最有可能的放在第一位,這樣可以提高性能。 此外,在case中推薦使用小的連續的整數,因為在這種情況下,所有的編譯器都可以
    的頭像 發表于 11-20 18:16 ?894次閱讀

    case后邊可以跟多個語句

    是的,"case" 后面可以跟多個語句。在編程語言中,"case" 通常被用于 switch 語句中,用于檢查一個變量或表達式是否匹配某個特定的值。當匹配成功時,可以執行一個或多個
    的頭像 發表于 11-30 14:19 ?7028次閱讀

    java switch case的語法規則

    在Java中,switch case語句是一種用于多分支選擇的控制流語句。它允許根據某個表達式的值來執行不同的代碼塊。下面是關于switch cas
    的頭像 發表于 11-30 14:40 ?2504次閱讀

    java中的switch語句 case的取值

    Java中的switch語句是一種用于多重條件判斷的語句,用于根據不同的條件執行不同的代碼塊。在switch語句中,case關鍵字用來指定不
    的頭像 發表于 11-30 16:05 ?1267次閱讀
    全讯网新2网址| 乐透世界| 属蛇和属猪做生意| 百家乐导航| 澳门百家乐官网游戏官网| 德州扑克胜率计算器| 百家乐西园二手房| 皇冠百家乐官网的玩法技巧和规则 | 百家乐官网的连庄连闲| 大发888博爱彩| 366百家乐赌博| 顶尖百家乐官网的玩法技巧和规则 | 利澳百家乐娱乐城| 百家乐官网娱乐平台会员注册| 德州扑克比赛| 公海百家乐的玩法技巧和规则| 百家乐官网推锅| 皇冠网址大全| 博彩投注| 大发888 配置要求| 百家乐看图赢钱| 永康百家乐赌博| 百家乐官网娱乐软件| 百家乐官网风云论坛| 威尼斯人娱乐城网址| 百家乐游戏唯一官网网站| 骰宝 | 日博网| 上游棋牌大厅| 二八杠语音报牌器| 百家乐博彩资讯论坛| 网上玩百家乐犯法| 百家乐流水打法| 澳门百家乐代理| 百苑百家乐官网的玩法技巧和规则| 赌博机| 总统娱乐城| 百家乐怎样赢| 博客| 棋牌百家乐官网怎么玩| 最新皇冠网|