精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

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

454398 ? 來源:FPGA技術(shù)聯(lián)盟 ? 作者:FPGA技術(shù)聯(lián)盟 ? 2020-12-11 10:42 ? 次閱讀

10. case,casez,casex語(yǔ)句

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

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語(yǔ)句代替嵌套的if-else將會(huì)產(chǎn)生更易讀的代碼,更好的邏輯利用率和更高的性能。

casez和casex語(yǔ)句在比較中允許“don't care”條件。 casez將“z“”值視為"don't care",casex將“z”和“x”值都視為“don't care”。如果casez或casex表達(dá)式中的任何位都是"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的表達(dá)式可以是一個(gè)常量,如下例所示。

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條件很容易導(dǎo)致case 條件重疊或重復(fù)。而且,使用這些語(yǔ)句會(huì)導(dǎo)致綜合和仿真不匹配。以下是案例case條件重疊的一個(gè)例子。

// 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

允許重疊或重復(fù)的case條件,在大多數(shù)情況下不會(huì)觸發(fā)任何仿真或綜合警告。這是一種危險(xiǎn)且難以調(diào)試的情況.。建議開發(fā)人員完全避免使用casex和casez語(yǔ)句。

在case語(yǔ)句中添加一個(gè)默認(rèn)的條件是避免一系列問題的簡(jiǎn)單方法。 有兩種方法可以達(dá)到相同的效果,如以下示例所示。

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語(yǔ)句之前進(jìn)行默認(rèn)賦值

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指定了總是可以出現(xiàn)在塊中的兩種賦值類型:阻塞和非阻塞。阻塞和非阻塞賦值分別用于描述組合邏輯和時(shí)序邏輯。永遠(yuǎn)不要在同一個(gè)塊中混合使用阻塞和非阻塞賦值。這樣做可能會(huì)導(dǎo)致不可預(yù)知的綜合和仿真結(jié)果。在許多情況下,綜合工具不會(huì)產(chǎn)生任何警告,但綜合結(jié)果將是不正確的。以下兩個(gè)代碼示例說明了阻塞和非阻塞賦值的混合使用。

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. 多個(gè)阻塞賦值

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

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分配的順序?qū)?huì)破壞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的最后一個(gè)賦值優(yōu)先,signal_a的位[15:12]永遠(yuǎn)不會(huì)被復(fù)位。

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

命名塊可以在幾種情況下有用。 因?yàn)閍lways塊是唯一標(biāo)識(shí)的,所以在仿真中更容易找到它。 而且,限制變量的范圍允許重復(fù)使用相同的變量名稱。

編輯:hfy

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

    關(guān)注

    1626

    文章

    21678

    瀏覽量

    602043
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Verilog HDL語(yǔ)言編程的誤區(qū)與經(jīng)驗(yàn)

    中使用casex語(yǔ)句當(dāng)在可綜合代碼中使用casez語(yǔ)句時(shí) 要小心當(dāng)寫case
    發(fā)表于 03-26 08:00

    如何解決vhdl代碼中的case語(yǔ)句問題?

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

    在SpinalHDL中關(guān)于casez的使用

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

    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-else與case

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

    數(shù)字設(shè)計(jì)FPGA應(yīng)用:case語(yǔ)句

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

    CASE語(yǔ)句的執(zhí)行規(guī)則是什么?

    CASE語(yǔ)句用來選擇幾個(gè)分支程序部分之一。選擇是基于選擇表達(dá)式當(dāng)前值的。
    的頭像 發(fā)表于 10-09 09:26 ?5369次閱讀
    <b class='flag-5'>CASE</b><b class='flag-5'>語(yǔ)句</b>的執(zhí)行規(guī)則是什么?

    一文淺析casecasexcasez區(qū)別

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

    RTL表達(dá)式和運(yùn)算符

    決策語(yǔ)句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語(yǔ)句。SystemVerilog有兩個(gè)主要的決策語(yǔ)句:if…else語(yǔ)句
    的頭像 發(fā)表于 10-21 09:04 ?1303次閱讀

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

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

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

    我們?cè)谏弦黄恼轮幸呀?jīng)看到了如何使用程序塊(例如 always 塊來編寫按順序執(zhí)行的 verilog 代碼。 我們還可以在程序塊中使用許多語(yǔ)句來控制在我們的verilog設(shè)計(jì)中信號(hào)賦值的方式
    的頭像 發(fā)表于 05-11 15:37 ?4332次閱讀
    Verilog中的If<b class='flag-5'>語(yǔ)句</b>和<b class='flag-5'>case</b><b class='flag-5'>語(yǔ)句</b>介紹

    Switch case中的case順序

    ,并按照順序進(jìn)行比較,匹配時(shí)就跳轉(zhuǎn)到滿足條件的語(yǔ)句執(zhí)行。所以,可以對(duì)case的值依照發(fā)生的可能性進(jìn)行排序,把最有可能的放在第一位,這樣可以提高性能。 此外,在case中推薦使用小的連續(xù)的整數(shù),因?yàn)樵谶@種情況下,所有的編譯器都可以
    的頭像 發(fā)表于 11-20 18:16 ?793次閱讀

    case后邊可以跟多個(gè)語(yǔ)句

    是的,"case" 后面可以跟多個(gè)語(yǔ)句。在編程語(yǔ)言中,"case" 通常被用于 switch 語(yǔ)句中,用于檢查一個(gè)變量或表達(dá)式是否匹配某個(gè)特定的值。當(dāng)匹配成功時(shí),可以執(zhí)行一個(gè)或多個(gè)
    的頭像 發(fā)表于 11-30 14:19 ?6463次閱讀

    java switch case的語(yǔ)法規(guī)則

    在Java中,switch case語(yǔ)句是一種用于多分支選擇的控制流語(yǔ)句。它允許根據(jù)某個(gè)表達(dá)式的值來執(zhí)行不同的代碼塊。下面是關(guān)于switch cas
    的頭像 發(fā)表于 11-30 14:40 ?2171次閱讀

    java中的switch語(yǔ)句 case的取值

    Java中的switch語(yǔ)句是一種用于多重條件判斷的語(yǔ)句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在switch語(yǔ)句中,case關(guān)鍵字用來指定不
    的頭像 發(fā)表于 11-30 16:05 ?1088次閱讀