HDLBits: 在線學(xué)習(xí) SystemVerilog(十)-Problem 43-59
HDLBits 是一組小型電路設(shè)計(jì)習(xí)題集,使用 Verilog/SystemVerilog 硬件描述語言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)~
網(wǎng)址如下:
https://hdlbits.01xz.net/
縮略詞索引:
SV:SystemVerilog
從今天開始新的一章-Circuits,包括基本邏輯電路、時(shí)序電路、組合電路等。
今天更新整個(gè)Basic Gates一小節(jié)題目(Problem 43-59)。
Problem 43-m2014_q4h
題目說明
實(shí)現(xiàn)如下電路:
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputin, outputout);
題目解析
這個(gè)題目沒什么難度,看下面參考代碼即可:
moduletop_module( inputlogicin, outputlogicout); assignout=in; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 44-m2014 q4i
題目說明
實(shí)現(xiàn)下面電路:
圖片來源:HDLBits
模塊端口聲明
moduletop_module( outputout);
題目解析
這道題難度不大核心代碼只有一行。
簡(jiǎn)單解答
moduletop_module( inputlogic[7:0]in, outputlogicparity ); assignparity=^in; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的無波形。
這一題就結(jié)束了。
Problem 45-m2014_q4e
題目說明
實(shí)現(xiàn)以下電路:
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputin1, inputin2, outputout);
題目解析
還是看懂電路即可。
moduletop_module( inputlogicin1, inputlogicin2, outputlogicout ); assignout=~(in1|in2); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 46-m2014_q4f
題目說明
實(shí)現(xiàn)以下電路
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputin1, inputin2, outputout);
題目解析
注意輸入端口前的非門。
moduletop_module( inputlogicin1, inputlogicin2, outputlogicout); assignout=in1&~in2; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 47-m2014_q4g
題目說明
實(shí)現(xiàn)以下電路:
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputin1, inputin2, inputin3, outputout);
題目解析
還是看懂電路即可。
moduletop_module( inputlogicin1, inputlogicin2, inputlogicin3, outputlogicout); assignout=(in1~^in2)^in3; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 48-Gates
題目說明
本題希望我們用兩輸入的組合電路來實(shí)現(xiàn)如下功能,該電路共用于7個(gè)輸出,具體情況如下:
模塊端口聲明
moduletop_module( inputa,b, outputout_and, outputout_or, outputout_xor, outputout_nand, outputout_nor, outputout_xnor, outputout_anotb );
題目解析
多種組合邏輯的實(shí)現(xiàn)。
moduletop_module( inputlogica,b, outputlogicout_and, outputlogicout_or, outputlogicout_xor, outputlogicout_nand, outputlogicout_nor, outputlogicout_xnor, outputlogicout_anotb ); assignout_and=a&b; assignout_or=a|b; assignout_xor=a^b; assignout_nand=~(a&b); assignout_nor=~(a|b); assignout_xnor=a~^b; assignout_anotb=a&~b; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 49-7420
題目說明
7420 chip是擁有兩組4輸入的與非門芯片,本練習(xí)需要構(gòu)造一個(gè)與7420 chip功能一樣的電路,擁有8個(gè)輸入與2個(gè)輸出。
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputp1a,p1b,p1c,p1d, outputp1y, inputp2a,p2b,p2c,p2d, outputp2y);
題目解析
這個(gè)題目無需理解7420是干什么的,只需要按照?qǐng)D中電路圖實(shí)現(xiàn)邏輯即可。
moduletop_module( inputlogicp1a,p1b,p1c,p1d, outputlogicp1y, inputlogicp2a,p2b,p2c,p2d, outputlogicp2y); assignp1y=~(p1a&p1b&p1c&p1d); assignp2y=~(p2a&p2b&p2c&p2d); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 50-Truthtable1
開始練習(xí)真值表了,網(wǎng)站上有些實(shí)例講解,我就不翻譯了,學(xué)過數(shù)電的應(yīng)該難度都不大。
題目說明
創(chuàng)建一個(gè)實(shí)現(xiàn)下述真值表的組合電路:
真值表如下:
圖片來源:HDLBits
最終實(shí)現(xiàn)的硬件框圖如下:
圖片來源:HDLBits
TIPS:約一行代碼解決問題
模塊端口聲明
moduletop_module( inputx3, inputx2, inputx1,//threeinputs outputf//oneoutput );
題目解析
這個(gè)題目重點(diǎn)是真值表化簡(jiǎn),將上面的真值表化簡(jiǎn)成最小項(xiàng)表達(dá)式即可。具體可以看下數(shù)電書很容易得到結(jié)果。
moduletop_module( inputlogicx3, inputlogicx2, inputlogicx1,//threeinputs outputlogicf//oneoutput ); assignf=x3&x1|x2&x1|~x3&x2; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 51-Mt2015_eq2
題目說明
創(chuàng)建一個(gè)具有兩個(gè) 2 位輸入A[1:0]和B[1:0]的電路,并產(chǎn)生一個(gè)輸出z。如果A = B ,則z的值應(yīng)為 1 ,否則z應(yīng)為 0。
模塊端口聲明
moduletop_module(input[1:0]A,input[1:0]B,outputz);
題目解析
這個(gè)題目重點(diǎn)是靈活使用三元運(yùn)算符,因?yàn)檫@個(gè)語法比較簡(jiǎn)單,所以大家注意一下使用方式即可~
moduletop_module(inputlogic[1:0]A, inputlogic[1:0]B, outputlogicz); assignz=(A==B)?1'b1:1'b0; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 52-Mt2015_q4a
題目說明
實(shí)現(xiàn)模塊 A ,該模塊實(shí)現(xiàn)函數(shù)z = (x^y) & x。
模塊端口聲明
moduletop_module(inputx,inputy,outputz);
題目解析
moduletop_module(inputlogicx, inputlogicy, outputlogicz); assignz=(x^y)&x; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 53-Mt2015_q4b
題目說明
電路B可以用下面的仿真波形來描述:
圖片來源:HDLBits
模塊端口聲明
moduletop_module(inputx,inputy,outputz);
題目解析
這個(gè)題目可以使用采點(diǎn)的方式,選擇幾個(gè)特殊點(diǎn),制作成真值表,然后化簡(jiǎn)即可。
或者從波形上看特點(diǎn):根據(jù)觀察所得輸出 z 為 x 與 y 的同或輸出,即相同為1, 不同為0;故實(shí)現(xiàn)代碼如下:
moduletop_module(inputlogicx, inputlogicy, outputlogicz); assignz=x~^y; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 54-Mt2015_q4
題目說明
根據(jù)子模塊Problem 52 與 53 來實(shí)現(xiàn)如下電路:
圖片來源:HDLBits
模塊端口聲明
moduletop_module(inputx,inputy,outputz);
題目解析
這個(gè)題目重點(diǎn)知道題目中A、B代表什么,其實(shí)這兩個(gè)就是上面兩道題目實(shí)現(xiàn)的子模塊,然后在將這兩個(gè)模塊的輸出進(jìn)行邏輯操作即可。
moduletop_module(inputlogicx, inputlogicy, outputlogicz); wirelogicza; wirelogiczb; assignza=(x^y)&x; assignzb=x~^y; assignz=(za|zb)^(za&zb); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 55-Ringer
題目說明
假設(shè)您正在設(shè)計(jì)一個(gè)手機(jī)的振鈴器和振動(dòng)電機(jī)控制電路。每當(dāng)電話需要從來電中振鈴 (input ring) 時(shí),您的電路必須打開振鈴器 (output motor = 1 ) 或電機(jī) (output ringer = 1),但不能同時(shí)打開這兩個(gè)。如果手機(jī)處于振動(dòng)模式 (input vibrate = 1),請(qǐng)打開電機(jī)( output motor = 1 )。否則,打開鈴聲。
我們嘗試僅適用assign語句來實(shí)現(xiàn)該組合電路。
設(shè)計(jì)提示:在設(shè)計(jì)電路時(shí),人們經(jīng)常不得不“倒退”地考慮問題,從輸出開始,然后再向輸入倒退,這是屬于軟件編程思想。硬件電路的編程與軟件的編程是存在差異的,一般進(jìn)行軟件編程時(shí),我們是先關(guān)注輸入( if (input are _)),再關(guān)注輸出( then (output are ))。而在硬件編程時(shí),我們需要轉(zhuǎn)變思維方式,在確保輸出是正確的情況下,再思考輸入。( The (output should be _) when (inputs are __))。
上面的問題描述是用適合軟件編程的命令式寫成的(if ring then do this),所以你必須把它轉(zhuǎn)換成更適合硬件實(shí)現(xiàn)的聲明式(assign ringer = ___)。能夠在兩種風(fēng)格之間進(jìn)行思考和轉(zhuǎn)換是硬件設(shè)計(jì)所需的最重要技能之一。
圖片來源:HDLBits
模塊端口聲明
moduletop_module( inputring, inputvibrate_mode, outputringer,//Makesound outputmotor//Vibrate );
題目解析
題目難度不大,重點(diǎn)是根據(jù)輸出的兩個(gè)信號(hào),裁決輸入邏輯。
moduletop_module( inputlogicring, inputlogicvibrate_mode, outputlogicringer,//Makesound outputlogicmotor//Vibrate ); assignringer=~vibrate_mode˚ assignmotor=vibrate_mode˚ endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 56-Thermostat
題目說明
一個(gè)冷/熱恒溫控制器可以同時(shí)在冬季和夏季對(duì)溫度進(jìn)行調(diào)節(jié)。實(shí)現(xiàn)一個(gè)可以根據(jù)需要打開和關(guān)閉加熱器、空調(diào)和鼓風(fēng)機(jī)的電路。
恒溫器可以處于以下兩種模式之一:加熱 ( mode = 1) 和冷卻 ( mode = 0)。在制熱模式下,當(dāng)天氣太冷時(shí)打開加熱器(too_cold = 1),但不要使用空調(diào)。在制冷模式下,空調(diào)過熱時(shí)打開空調(diào)(too_hot = 1),但不要打開加熱器。當(dāng)加熱器或空調(diào)打開時(shí),還要打開風(fēng)扇以循環(huán)空氣。此外,即使加熱器和空調(diào)關(guān)閉,用戶也可以請(qǐng)求將風(fēng)扇打開(fan_on = 1)。
嘗試僅使用assign語句,看看是否可以將問題描述轉(zhuǎn)換為邏輯電路。
模塊端口聲明
moduletop_module( inputtoo_cold, inputtoo_hot, inputmode, inputfan_on, outputheater, outputaircon, outputfan );
題目解析
這個(gè)題目解決方式參考上一題。
moduletop_module( inputlogictoo_cold, inputlogictoo_hot, inputlogicmode, inputlogicfan_on, outputlogicheater, outputlogicaircon, outputlogicfan ); assignheater=too_cold&mode; assignaircon=too_hot&~mode; assignfan=fan_on|heater|aircon; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 57-Conditional
題目說明
又是一道計(jì)“1”電路。
模塊端口聲明
moduletop_module( input[2:0]in, output[1:0]out);
題目解析
有很多種方式,我們使用組合電路實(shí)現(xiàn),也可以使用for循環(huán)。
moduletop_module( inputlogic[2:0]in, outputlogic[1:0]out); always_combbegin uniquecase(in) 3'b000:out=2'd0; 3'b001:out=2'd1; 3'b010:out=2'd1; 3'b011:out=2'd2; 3'b100:out=2'd1; 3'b101:out=2'd2; 3'b110:out=2'd2; 3'b111:out=2'd3; default:out=2'd0; endcase end endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
PS:FOR循環(huán)
moduletop_module( input[2:0]in, output[1:0]out); always@(*) begin out=2'b00; for(integeri=0;i<3;?i++) ????????????????begin ????????????????????if(in[i]?==?1'b1) ????????????????????????out?=?out?+?1'b1; ????????????????end ????????end endmodule
這一題就結(jié)束了。
Problem 58-Gatesv
題目說明
在給定一個(gè)四位輸入向量[3:0]。我們想知道每個(gè)位與其相鄰的位之間的一些關(guān)系:
out_both:此輸出向量的每個(gè)位指示相應(yīng)的輸入位及其左側(cè)的“鄰居”(較高的索引)是否都是“1” 。例如,out_both[2]表明in[2]和in[3]是否都為 1。由于in[3]左邊沒有“鄰居”,所以我們不需要知道out_both[3] .
out_any:此輸出向量的每個(gè)位指示相應(yīng)的輸入位及其右側(cè)的“鄰居”是否為“1”。例如,out_any[2]指示in[2]或in[1]是否為 1。由于in[0]右側(cè)沒有鄰居,因此我們不需要知道out_any[0] .
out_different:此輸出向量的每個(gè)位指示相應(yīng)的輸入位是否與其左側(cè)的“鄰居”不同。例如,out_diff[2]指示in[2]是否與in[3]不同。對(duì)于這部分,將向量視為環(huán)繞,因此in[3]左側(cè)的鄰居是in[0]。
模塊端口聲明
moduletop_module( input[3:0]in, output[2:0]out_both, output[3:1]out_any, output[3:0]out_different);
題目解析
這個(gè)題目重點(diǎn)理解這個(gè)相同或者不同之間的邏輯關(guān)系(就是與或非這三種關(guān)系,仔細(xì)思考,就沒什么問題了)。
moduletop_module( inputlogic[3:0]in, outputlogic[2:0]out_both, outputlogic[3:1]out_any, outputlogic[3:0]out_different); assignout_both[0]=in[1]&in[0]; assignout_both[1]=in[2]&in[1]; assignout_both[2]=in[3]&in[2]; assignout_any[1]=in[1]|in[0]; assignout_any[2]=in[2]|in[1]; assignout_any[3]=in[3]|in[2]; assignout_different[0]=in[1]^in[0]; assignout_different[1]=in[2]^in[1]; assignout_different[2]=in[3]^in[2]; assignout_different[3]=in[0]^in[3]; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 59-Gatesv100
題目說明
這一條道題和上一題完全相同,只不過輸入向量變成了[99:0],其他說明沒變。
模塊端口聲明
moduletop_module( input[99:0]in, output[98:0]out_both, output[99:1]out_any, output[99:0]out_different);
題目解析
這個(gè)題目的解決方式,就不能使用上面那種羅列所有可能情況的解決方式了(太多了),所以我們需要觀察上面那一題的規(guī)律來解決問題,這一題最簡(jiǎn)單的方式不會(huì)超過三行語句,但是難度還是不大。
moduletop_module( inputlogic[99:0]in, outputlogic[98:0]out_both, outputlogic[99:1]out_any, outputlogic[99:0]out_different); assignout_both=in[99:1]&in[98:0]; assignout_any=in[99:1]|in[98:0]; assignout_different={in[0],in[99:1]}^in; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,整體是從需求設(shè)計(jì)組合邏輯電路,再從波形圖設(shè)計(jì),還有兩道從實(shí)際使用角度設(shè)計(jì),對(duì)于組合電路的設(shè)計(jì)理解非常有幫助。
最后我這邊做題的代碼也是個(gè)人理解使用,有錯(cuò)誤歡迎大家批評(píng)指正,祝大家學(xué)習(xí)愉快~
代碼鏈接:
https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits
審核編輯:湯梓紅
-
邏輯電路
+關(guān)注
關(guān)注
13文章
491瀏覽量
42503 -
組合電器
+關(guān)注
關(guān)注
0文章
4瀏覽量
5924 -
Verilog
+關(guān)注
關(guān)注
28文章
1335瀏覽量
109844
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(十)-Problem 43-59
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論