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

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

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

如何靈活使用三元運(yùn)算符

OpenFPGA ? 來(lái)源:OpenFPGA ? 作者:OpenFPGA ? 2022-09-28 17:07 ? 次閱讀

HDLBits: 在線學(xué)習(xí) SystemVerilog(九)-Problem 36-42

HDLBits 是一組小型電路設(shè)計(jì)習(xí)題集,使用 Verilog/SystemVerilog 硬件描述語(yǔ)言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)~

縮略詞索引

SV:SystemVerilog

今天的幾道題主要是補(bǔ)充SV的一些補(bǔ)充語(yǔ)法練習(xí)。

Problem 36-Conditional

這道題主要是考察條件(三元)運(yùn)算符的用法,具體詳見(jiàn)《SystemVerilog-條件(三元)運(yùn)算符》!

題目說(shuō)明

給定四個(gè)無(wú)符號(hào)數(shù),請(qǐng)找出最小值。無(wú)符號(hào)數(shù)可以與標(biāo)準(zhǔn)比較運(yùn)算符(a < b)進(jìn)行比較。使用條件運(yùn)算符描述一個(gè)兩路的最小值電路,然后組合它來(lái)創(chuàng)建一個(gè)4路最小電路??赡苄枰恍┚€向量作為中間結(jié)果。

模塊端口聲明

moduletop_module(
input[7:0]a,b,c,d,
output[7:0]min);

題目解析

這個(gè)題目重點(diǎn)是靈活使用三元運(yùn)算符,因?yàn)檫@個(gè)語(yǔ)法比較簡(jiǎn)單,所以大家注意一下使用方式即可~

moduletop_module(
inputlogic[7:0]a,b,c,d,
outputlogic[7:0]min
);



assignmin=((a
f7585eac-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f77d4bae-3eea-11ed-9e49-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。

這一題就結(jié)束了。

Problem 37-Reduction

這題是考察歸約運(yùn)算符,本來(lái)想在SV系列文章里寫(xiě)的,這次作為一個(gè)專題在下面一篇文章中。

題目說(shuō)明

當(dāng)通過(guò)不完善的通道傳輸數(shù)據(jù)時(shí),奇偶校驗(yàn)通常用作檢測(cè)錯(cuò)誤的簡(jiǎn)單方法。創(chuàng)建一個(gè)電路,計(jì)算 8 位字節(jié)的奇偶校驗(yàn)位(將向該字節(jié)添加第9位)。 我們將使用偶校驗(yàn),其中奇偶校驗(yàn)位只是所有8個(gè)數(shù)據(jù)位的XOR

模塊端口聲明

moduletop_module(
input[7:0]in,
outputparity);

題目解析

這道題難度不大核心代碼只有一行。

簡(jiǎn)單解答

moduletop_module(
inputlogic[7:0]in,
outputlogicparity
);
assignparity=^in;
endmodule


f7b55fda-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f7d2deb6-3eea-11ed-9e49-dac502259ad0.png

注意圖中的無(wú)波形。

這一題就結(jié)束了。

Problem 38-Gates100

題目說(shuō)明

構(gòu)建具有100個(gè)輸入的組合電路。

電路一共有3個(gè)輸出:

f7f03920-3eea-11ed-9e49-dac502259ad0.png

模塊端口聲明

moduletop_module(
input[99:0]in,
outputout_and,
outputout_or,
outputout_xor
);

題目解析

上一個(gè)問(wèn)題已經(jīng)說(shuō)過(guò)歸約運(yùn)算符了,這道題肯定也是類似解答思路,應(yīng)該很簡(jiǎn)單吧~~~

moduletop_module(
inputlogic[99:0]in,
outputlogicout_and,
outputlogicout_or,
outputlogicout_xor
);

assignout_and=∈
assignout_or=|in;
assignout_xor=^in;

endmodule
f8109c38-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f82f029a-3eea-11ed-9e49-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。

這一題就結(jié)束了。

Problem 39-Vector100r

題目說(shuō)明

給了一個(gè)長(zhǎng)度是100的向量,請(qǐng)把它翻轉(zhuǎn)輸出一下。

提示:for循環(huán)(組合always塊或者generate塊)在這里很有用。 這道題中,因?yàn)椴恍枰K實(shí)例化(必須使用generate塊),建議使用always塊。

模塊端口聲明

moduletop_module(
input[99:0]in,
output[99:0]out
);

題目解析

提示中已經(jīng)暗示了使用for循環(huán),所以我們就按照always...for...使用即可。

moduletop_module(
inputlogic[99:0]in,
outputlogic[99:0]out
);

varintegeri;
always_combbegin
for(i=0;i<=?99;?i?=?i?+?1)begin
????????????out[i]?=?in[99?-?i];
????????end
????end

endmodule



f84e0cb2-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f87b85de-3eea-11ed-9e49-dac502259ad0.png

注意圖中無(wú)波形。

這一題就結(jié)束了。

Problem 40-Popcount255

題目說(shuō)明

老生常談的題目了,設(shè)計(jì)電路來(lái)計(jì)算輸入矢量中‘1’的個(gè)數(shù),題目要求建立一個(gè)255bit輸入的矢量來(lái)判斷輸入中‘1’的個(gè)數(shù)。

提示:重復(fù)工作量建議使用for~

模塊端口聲明

moduletop_module(
input[254:0]in,
output[7:0]out);

題目解析

這個(gè)題目的爭(zhēng)論點(diǎn)在怎么減少邏輯量,目前沒(méi)什么好思路,但是可以增加運(yùn)行速度,那就是分類冶制。

moduletop_module(
input[254:0]in,
outputreg[7:0]out
);

always@(*)begin//Combinationalalwaysblock
out=0;
for(inti=0;i<255;i++)
???out?=?out?+?in[i];
?end
?
endmodule

f89c2a50-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f8bdc8cc-3eea-11ed-9e49-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。

這一題就結(jié)束了。

Problem 41-Adder100i

題目說(shuō)明

通過(guò)實(shí)例化 100 個(gè)全加器來(lái)創(chuàng)建一個(gè) 100 位二進(jìn)制波紋進(jìn)位加法器。加法器將兩個(gè) 100 位數(shù)字和一個(gè)進(jìn)位相加,輸出為sum與cout,還要輸出紋波進(jìn)位加法器中每個(gè)全加器的進(jìn)位。cout[99] 是最后一個(gè)全加器的最終進(jìn)位,也是通??吹降倪M(jìn)位。

模塊端口聲明

moduletop_module(
input[99:0]a,b,
inputcin,
output[99:0]cout,
output[99:0]sum);

題目解析

這個(gè)題目簡(jiǎn)單的用法就是generate...for,最近在整理這方面知識(shí),在這篇文章發(fā)出來(lái)之前應(yīng)該已經(jīng)發(fā)布,詳見(jiàn)《【Verilog我思我用】-generate》。

moduletop_module(
inputlogic[99:0]a,b,
inputlogiccin,
outputlogic[99:0]cout,
outputlogic[99:0]sum);


generate
genvari;
for(i=0;i<=?99;?i?=?i?+?1)begin:adder
?????????if(i?==?0)begin
?????????????assign?{cout[0],?sum[0]}?=?a[0]?+?b[0]?+?cin;
????????????end
????????????else?begin
?????????????assign?{cout[i],?sum[i]}?=?a[i]?+?b[i]?+?cout[i-1];
????????????end?????????
????????end
????endgenerate

endmodule

f8ef299e-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f9010290-3eea-11ed-9e49-dac502259ad0.png

注意圖中是無(wú)波形的。

這一題就結(jié)束了。

Problem 42-Bcdadd100

題目說(shuō)明

本題已經(jīng)提供了一個(gè)名為bcd_fadd的BCD一位全加器,他會(huì)添加兩個(gè)BCD數(shù)字和一個(gè)cin,并產(chǎn)生一個(gè)cout和sum。

modulebcd_fadd{
input[3:0]a,
input[3:0]b,
inputcin,
outputcout,
output[3:0]sum);

我們需要實(shí)例化100個(gè)bcd_fadd來(lái)實(shí)現(xiàn)100位的BCD進(jìn)位加法器。該加法器應(yīng)包含兩個(gè)100bit的BCD碼和一個(gè)cin, 輸出產(chǎn)生sum 和 cout。

模塊端口聲明

moduletop_module(
input[399:0]a,b,
inputcin,
outputcout,
output[399:0]sum);

題目解析

這個(gè)題目也是在鞏固generate用法,建議自己完成并思考。

moduletop_module(
inputlogic[399:0]a,b,
inputlogiccin,
outputlogiccout,
outputlogic[399:0]sum);


wirelogic[99:0]cout_temp;

generate
genvari;
for(i=0;i<=?99;?i?=?i?+?1)begin:BCD_adder
????????????if(i?==?0)begin
????????????????bcd_fadd?u1_bcd_fadd(
????????????????????.a??(a[3:0]??),
????????????????????.b??(b[3:0]??),
????????????????????.cin?(cin??),
????????????????????.sum?(sum[3:0]?),
????????????????????.cout?(cout_temp[0]?)
????????????????);
????????????end
????????????else?begin
????????????????bcd_fadd?u2_bcd_fadd(
????????????????????.a??(a[4?*?i?+?3:?4?*?i]?),
????????????????????.b??(b[4?*?i?+?3:?4?*?i]?),
????????????????????.cin?(cout_temp[i?-?1]???????),
????????????????????.sum?(sum[4?*?i?+?3:?4?*?i]??),
????????????????????.cout?(cout_temp[i]???????????)
????????????????);
????????????end
????????end
????????assign?cout?=?cout_temp[99];
????endgenerate
????????????????????

endmodule

f9274874-3eea-11ed-9e49-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

f967405a-3eea-11ed-9e49-dac502259ad0.png

注意圖中的無(wú)波形。

這一題就結(jié)束了。

總結(jié)

今天的幾道題就結(jié)束了,整體屬于加強(qiáng)練習(xí)的過(guò)程,適合獨(dú)立完成,加強(qiáng)理解。

審核編輯:彭靜
聲明:本文內(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)投訴
  • 電路設(shè)計(jì)
    +關(guān)注

    關(guān)注

    6659

    文章

    2420

    瀏覽量

    202813
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3211

    瀏覽量

    66062
  • 運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    170

    瀏覽量

    11048

原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(九)-Problem 36-42

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言運(yùn)算符的使用方法

    詳細(xì)介紹了C語(yǔ)言表達(dá)式、算術(shù)運(yùn)算符、賦值運(yùn)算符、關(guān)系運(yùn)算符、條件結(jié)構(gòu)、邏輯運(yùn)算符、位運(yùn)算符的語(yǔ)法和使用方法,并討論了
    發(fā)表于 11-02 11:30 ?1415次閱讀
    C語(yǔ)言<b class='flag-5'>運(yùn)算符</b>的使用方法

    如何去使用運(yùn)算符

    運(yùn)算的定義是什么?運(yùn)算符是由什么組成的?如何去使用運(yùn)算符?
    發(fā)表于 07-15 13:13

    條件運(yùn)算符是什么_條件運(yùn)算符有哪些

    運(yùn)算符優(yōu)先級(jí)高于賦值、逗號(hào)運(yùn)算符,低于其他運(yùn)算符。關(guān)系運(yùn)算實(shí)際上是邏輯比較運(yùn)算,它是邏輯運(yùn)算
    發(fā)表于 11-16 16:02 ?1.1w次閱讀
    條件<b class='flag-5'>運(yùn)算符</b>是什么_條件<b class='flag-5'>運(yùn)算符</b>有哪些

    單目運(yùn)算符是什么_單目運(yùn)算符有哪些

    單目運(yùn)算符是指運(yùn)算所需變量為一個(gè)的運(yùn)算符,又叫一運(yùn)算符,其中有邏輯非運(yùn)算符:!、按位取反
    的頭像 發(fā)表于 02-24 15:42 ?6w次閱讀
    單目<b class='flag-5'>運(yùn)算符</b>是什么_單目<b class='flag-5'>運(yùn)算符</b>有哪些

    C運(yùn)算符的優(yōu)先級(jí)和結(jié)合性詳細(xì)解決

    運(yùn)算符是一種告訴編譯器執(zhí)行特定的數(shù)學(xué)或邏輯操作的符號(hào)。 C語(yǔ)言內(nèi)置了豐富的運(yùn)算符,大體可分為10類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位
    的頭像 發(fā)表于 02-22 17:27 ?3185次閱讀

    淺析MySQL中的各類運(yùn)算符

    MySQL支持多種運(yùn)算符,我們?cè)趯?xiě)SQL腳本時(shí)經(jīng)常會(huì)需要用到各種各樣的運(yùn)算符,這些運(yùn)算符可以用來(lái)連接表達(dá)式,進(jìn)而從數(shù)據(jù)庫(kù)中查詢我們需要的結(jié)果集等。這些類型主要包括算術(shù)運(yùn)算符、比較
    的頭像 發(fā)表于 05-03 17:41 ?2022次閱讀
    淺析MySQL中的各類<b class='flag-5'>運(yùn)算符</b>

    干貨:大實(shí)例講解種C++運(yùn)算符重載

    本章節(jié)主要講解是運(yùn)算符重載。運(yùn)算符重載是賦予運(yùn)算符能操作自定義類型的功能。C++運(yùn)算符重載主要分為以下類:
    的頭像 發(fā)表于 09-30 16:59 ?3404次閱讀
    干貨:<b class='flag-5'>三</b>大實(shí)例講解<b class='flag-5'>三</b>種C++<b class='flag-5'>運(yùn)算符</b>重載

    python運(yùn)算符是什么

    python運(yùn)算符 0. 什么是運(yùn)算符? 本章節(jié)主要說(shuō)明Python的運(yùn)算符。舉個(gè)簡(jiǎn)單的例子 4 +5 = 9 。 例子中,4和5被稱為操作數(shù),“+”號(hào)為運(yùn)算符。 Python語(yǔ)言支持
    的頭像 發(fā)表于 02-21 16:44 ?2341次閱讀

    SystemVerilog-運(yùn)算符/表達(dá)式規(guī)則

    RTL建模中廣泛使用的運(yùn)算符是條件運(yùn)算符,也稱為三元運(yùn)算符,該運(yùn)算符用于在兩個(gè)表達(dá)式之間進(jìn)行選擇——表5-2列出了用于表示條件
    的頭像 發(fā)表于 08-03 09:03 ?2999次閱讀

    什么是運(yùn)算符重載

    重載運(yùn)算符是具有特殊名稱的函數(shù),是通過(guò)關(guān)鍵字** operator **后跟運(yùn)算符的符號(hào)來(lái)定義的
    的頭像 發(fā)表于 01-20 15:30 ?2423次閱讀

    條件(三元運(yùn)算符

    RTL建模中廣泛使用的運(yùn)算符是條件運(yùn)算符,也稱為三元運(yùn)算符,該運(yùn)算符用于在兩個(gè)表達(dá)式之間進(jìn)行選擇——表5-2列出了用于表示條件
    的頭像 發(fā)表于 02-09 15:42 ?1297次閱讀
    條件(<b class='flag-5'>三元</b>)<b class='flag-5'>運(yùn)算符</b>

    什么是移位運(yùn)算符

    移位運(yùn)算符將向量的位向右或向左移位指定的次數(shù)。SystemVerilog具有按位和算術(shù)移位運(yùn)算符
    的頭像 發(fā)表于 02-09 15:49 ?1761次閱讀
    什么是移位<b class='flag-5'>運(yùn)算符</b>

    Go語(yǔ)言運(yùn)算符主要包括哪些呢?

    Go語(yǔ)言運(yùn)算符主要包括:算數(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符和其他
    的頭像 發(fā)表于 05-26 15:54 ?822次閱讀
    Go語(yǔ)言<b class='flag-5'>運(yùn)算符</b>主要包括哪些呢?

    Golang為何舍棄三元運(yùn)算符

    golang中不存在?:運(yùn)算符的原因是因?yàn)檎Z(yǔ)言設(shè)計(jì)者已經(jīng)預(yù)見(jiàn)到三元運(yùn)算符經(jīng)常被用來(lái)構(gòu)建一些極其復(fù)雜的表達(dá)式。雖然使用if進(jìn)行替代會(huì)讓代碼顯得更長(zhǎng),但這毫無(wú)疑問(wèn)可讀性更強(qiáng)。
    的頭像 發(fā)表于 04-03 15:13 ?648次閱讀

    c語(yǔ)言從右到左的運(yùn)算符有哪些

    用在變量之后時(shí),它們會(huì)先返回變量的原始值,然后再進(jìn)行遞增或遞減。 三元條件運(yùn)算符 ( ?: ):這個(gè)運(yùn)算符的求值順序是從右到左。首先計(jì)算第個(gè)表達(dá)式,然后根據(jù)第一個(gè)表達(dá)式的結(jié)果選擇第二
    的頭像 發(fā)表于 08-20 11:39 ?602次閱讀