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)位,也是通??吹降倪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
點(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)注
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論