HDLBits 是一組小型電路設(shè)計(jì)習(xí)題集,使用 Verilog/SystemVerilog 硬件描述語言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)~
網(wǎng)址如下:
https://hdlbits.01xz.net/
關(guān)于HDLBits的Verilog實(shí)現(xiàn)可以查看下面專欄:
https://www.zhihu.com/column/c_1131528588117385216
縮略詞索引:
SV:SystemVerilog
Problem 15-Vector3
題目說明
模塊 32 位輸入向量如下所示,按照上下對(duì)應(yīng)關(guān)系,輸出為下方的 4 個(gè) 8-bits 向量。
圖片來自 HDLBits
這個(gè)題目的核心就是上面的圖片,將上面的輸入向量映射到下面向量。
模塊端口聲明
moduletop_module( input[4:0]a,b,c,d,e,f, output[7:0]w,x,y,z);
題目解析
這個(gè)題目重點(diǎn)是向量拼接,拼接操作符的基本語法使用 { } 將較小的向量括起來,每個(gè) { } 內(nèi)的向量使用逗號(hào)作為間隔。
{3'b111,3'b000}=>6'b111000 {1'b1,1'b0,3'b101}=>5'b10101 {4'ha,4'd10}=>8'b10101010//4'haand4'd10areboth4'b1010inbinary
拼接運(yùn)算符中的向量務(wù)必需要標(biāo)注位寬,不然綜合器怎么能知道你的結(jié)果需要多寬的位寬。因此 { 1,2,3 } 這樣的操作是非法的,并會(huì)產(chǎn)生一個(gè) Error:unsized constants are not allowed in concatenations.
moduletop_module( inputlogic[4:0]a,b,c,d,e,f, outputlogic[7:0]w,x,y,z );// assignw={a,b[4:2]}; assignx={b[1:0],c,d[4]}; assigny={d[3:0],e[4:1]}; assignz={e[0],f,2'b11}; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅(后面會(huì)展示)。
這一題就結(jié)束了。
Problem 16-Vectorr
題目說明
給定一個(gè) 8bit 輸入向量,將其反向輸出。
模塊端口聲明
moduletop_module( input[7:0]in, output[7:0]out );
題目解析
這道題難度不大但是不要想著使用assign out[7:0] = in[0:7];解決問題,因?yàn)樵赩erilog中這個(gè)語句不起作用,因?yàn)閂erilog使用向量時(shí)的位序應(yīng)與定義時(shí)保持一致。
簡單解決就是將輸入按照一個(gè)一個(gè)bit分開,然后重新組合即可。
但是如果向量是1024位呢?大家可以思考,后續(xù)還有類似問題,再使用其他方式解決,下面有參考示例。
簡單解答
moduletop_module( inputlogic[7:0]in, outputlogic[7:0]out ); assignout={in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]}; endmodule
其他方式解決
moduletop_module( inputlogic[7:0]in, outputlogic[7:0]out ); parametercount='d8; varintegeri; always_combbegin for(i=0;i
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅(后面會(huì)展示)。
這一題就結(jié)束了。
Problem 17-Vector4
題目說明
將一個(gè) 8bit 有符號(hào)數(shù)擴(kuò)展為 32bit 數(shù)。
模塊端口聲明
moduletop_module( input[7:0]in, output[31:0]out);
題目解析
本題考查的是向量的復(fù)制和拼接語法:{ 重復(fù)次數(shù) { 向量 } }。
重復(fù)次數(shù)必須是一個(gè)常量,而且請(qǐng)?zhí)貏e注意重復(fù)操作符有兩對(duì) { }.外層的 {} 不能少。
如:
{5{1'b1}}//5'b11111(or5'd31or5'h1f) {2{a,b,c}}//Thesameas{a,b,c,a,b,c} {3'd5,{2{3'd6}}}//9'b101_110_110.It'saconcatenationof101with //thesecondvector,whichistwocopiesof3'b110.
還需要注意有符號(hào)和無符號(hào)的復(fù)制:
重復(fù)操作符的應(yīng)用場(chǎng)景之一是在有符號(hào)數(shù)的擴(kuò)展。有符號(hào)數(shù)的擴(kuò)展是將符號(hào)位填充待擴(kuò)展的比特。比如要將 4bit 的 4'b0101 有符號(hào)數(shù)擴(kuò)展為 8bit ,0 是符號(hào)位,那么擴(kuò)展之后為 8'b0000 0101.
moduletop_module( inputlogic[7:0]in, outputlogic[31:0]out );// assignout={{24{in[7]}},in}; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中是沒有波形的~
這一題就結(jié)束了。
Problem 18-Vector5
題目說明
給定五個(gè) 1 位信號(hào)(a、b、c、d 和 e),計(jì)算 25 位輸出向量中的所有 25 個(gè)成對(duì)的邏輯比較。如果被比較的兩位相等,則輸出應(yīng)為 1。
圖片來自 HDLBits
問題的核心就是上面的圖片,相關(guān)操作如下:
out[24]=~a^a;//a==a,soout[24]isalways1. out[23]=~a^b; out[22]=~a^c; ... out[1]=~e^d; out[0]=~e^e;
模塊端口聲明
moduletop_module( inputa,b,c,d,e, output[24:0]out);
題目解析
這個(gè)題目還是上一題的延續(xù),屬于將幾個(gè)知識(shí)點(diǎn)串聯(lián)起來,向量復(fù)制擴(kuò)展,XNOR操作,前面知識(shí)掌握了這個(gè)題目就不難了。
moduletop_module( inputa,b,c,d,e, output[24:0]out);// //TheoutputisXNORoftwovectorscreatedby //concatenatingandreplicatingthefiveinputs. //assignout=~{...}^{...}; assignout=~{{5{a}},{5{b}},{5{c}},{5a5mgapgs4i},{5{e}}}^{5{a,b,c,d,e}}; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形~
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,整體難度不大,后面的題目難度會(huì)越來越大~
最后我這邊做題的代碼也是個(gè)人理解使用,有錯(cuò)誤歡迎大家批評(píng)指正,祝大家學(xué)習(xí)愉快~
審核編輯:彭靜
-
電路設(shè)計(jì)
+關(guān)注
關(guān)注
6673文章
2453瀏覽量
204350 -
硬件
+關(guān)注
關(guān)注
11文章
3328瀏覽量
66218 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110095
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(四)-Problem 15-18
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論