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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的無(wú)波形。
這一題就結(jié)束了。
Problem 38-Gates100
題目說(shuō)明
構(gòu)建具有100個(gè)輸入的組合電路。
電路一共有3個(gè)輸出:
模塊端口聲明
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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無(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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的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)位,也是通常看到的進(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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中是無(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
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的無(wú)波形。
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,整體屬于加強(qiáng)練習(xí)的過(guò)程,適合獨(dú)立完成,加強(qiáng)理解。
審核編輯:彭靜
-
電路設(shè)計(jì)
+關(guān)注
關(guān)注
6677文章
2464瀏覽量
205333 -
硬件
+關(guān)注
關(guān)注
11文章
3381瀏覽量
66447 -
運(yùn)算符
+關(guān)注
關(guān)注
0文章
172瀏覽量
11107
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(九)-Problem 36-42
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言運(yùn)算符的使用方法
![C語(yǔ)言<b class='flag-5'>運(yùn)算符</b>的使用方法](https://file1.elecfans.com/web2/M00/AC/09/wKgaomVDF1-AYBFKAACPJ18ESQk001.jpg)
條件運(yùn)算符是什么_條件運(yùn)算符有哪些
![條件<b class='flag-5'>運(yùn)算符</b>是什么_條件<b class='flag-5'>運(yùn)算符</b>有哪些](https://file1.elecfans.com//web2/M00/A6/E7/wKgZomUMQSuAbA9jAAA7bHPujzo538.png)
單目運(yùn)算符是什么_單目運(yùn)算符有哪些
![單目<b class='flag-5'>運(yùn)算符</b>是什么_單目<b class='flag-5'>運(yùn)算符</b>有哪些](https://file.elecfans.com/web1/M00/46/12/o4YBAFqRG1aAAzScAABA3aO8y-4633.png)
C運(yùn)算符的優(yōu)先級(jí)和結(jié)合性詳細(xì)解決
淺析MySQL中的各類運(yùn)算符
![淺析MySQL中的各類<b class='flag-5'>運(yùn)算符</b>](https://file.elecfans.com/web1/M00/BA/34/o4YBAF6YKCOAdrrkAADxZ-io9KA956.png)
干貨:三大實(shí)例講解三種C++運(yùn)算符重載
![干貨:<b class='flag-5'>三</b>大實(shí)例講解<b class='flag-5'>三</b>種C++<b class='flag-5'>運(yùn)算符</b>重載](https://file.elecfans.com/web1/M00/C9/61/pIYBAF90R6mAUMtpAAFubJVo2Kg184.png)
python運(yùn)算符是什么
SystemVerilog-運(yùn)算符/表達(dá)式規(guī)則
什么是運(yùn)算符重載
條件(三元)運(yùn)算符
![條件(<b class='flag-5'>三元</b>)<b class='flag-5'>運(yùn)算符</b>](https://file.elecfans.com/web2/M00/8F/7C/poYBAGPkkdmAAnFeAAbOE5WUhL4016.jpg)
Go語(yǔ)言運(yùn)算符主要包括哪些呢?
![Go語(yǔ)言<b class='flag-5'>運(yùn)算符</b>主要包括哪些呢?](https://file1.elecfans.com/web2/M00/88/BD/wKgaomRwZX2AXGX6AAAQA292zsw400.jpg)
評(píng)論