題目說明
給出了一個(gè)可以做16bit加法的模塊add16,實(shí)例化兩個(gè)add16以達(dá)到32bit加法的。
這個(gè)題目的核心就是上面的圖片,將兩個(gè)16bit加法合成32bit加法即可。
模塊端口聲明
moduletop_module( input[31:0]a, input[31:0]b, output[31:0]sum );
題目解析
這個(gè)題目重點(diǎn)是進(jìn)位的處理,一個(gè)add16模塊計(jì)算結(jié)果的低16位,另一個(gè)add16模塊在接收到第一個(gè)的進(jìn)位后計(jì)算結(jié)果的高16位。此32bit加法器不需要處理輸入進(jìn)位(假設(shè)為0)和輸出進(jìn)位(無需進(jìn)位),但為了內(nèi)部模塊為了結(jié)果的正確仍要處理進(jìn)位信號(hào)。(換句話說,add16模塊執(zhí)行16bit的a+b+cin,而頂層模塊執(zhí)行32bit的a+b)
moduletop_module( inputlogic[31:0]a, inputlogic[31:0]b, outputlogic[31:0]sum ); wirelogic[15:0]sum_temp0,sum_temp1; varlogiccout1; add16d1( .a(a[15:0]), .b(b[15:0]), .cin(1'd0), .sum(sum_temp0), .cout(cout1) ); add16d2( .a(a[31:16]), .b(b[31:16]), .cin(cout1), .sum(sum_temp1), .cout() ); assignsum={sum_temp1,sum_temp0}; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 25-Module fadd
題目說明
在本練習(xí)中,將創(chuàng)建具有兩個(gè)層次結(jié)構(gòu)的電路。top_module將實(shí)例化add16(提供)的兩個(gè)副本,每個(gè)副本將實(shí)例化add1(必須自己編寫)的 16 個(gè)副本。因此,必須編寫兩個(gè)模塊:top_module和add1。與Problem 24: Adder 1(Module add)一樣,提供給您一個(gè)執(zhí)行16bit的加法的模塊。您需要實(shí)例化兩個(gè)16bit加法模塊來實(shí)現(xiàn)32bit加法器。一個(gè)add16計(jì)算加法結(jié)果的低16位,另一個(gè)計(jì)算結(jié)果的高16位。您的32位加法器同樣不需要處理進(jìn)位輸入(假設(shè)為0)和進(jìn)位輸出(無需進(jìn)位)信號(hào)。
如下圖所示,將add16模塊連接在一起,給出的add16模塊如下:
moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);
在每個(gè)add16中,16 個(gè)全加器(模塊add1,未提供)被實(shí)例化以實(shí)際執(zhí)行加法。必須編寫具有以下聲明的完整加法器模塊:
moduleadd1(inputa,inputb,inputcin,outputsum,outputcout);
回想一下,全加器計(jì)算 a+b+cin 的和和進(jìn)位。
綜上所述,本設(shè)計(jì)共有三個(gè)模塊:
top_module— 頂級(jí)模塊包含兩個(gè)add16
add16 — 一個(gè) 16 位加法器模塊,由 16 個(gè)add1組成
add1 — 1 位全加器模塊。
如果提交缺少add1模塊,將收到一條錯(cuò)誤消息,內(nèi)容為:
Error(12006):Nodeinstance"user_fadd[0].a1"instantiatesundefinedentity"add1".?
模塊端口聲明
moduletop_module( input[31:0]a, input[31:0]b, output[31:0]sum );
題目解析
只比上一題復(fù)雜些,核心內(nèi)容沒變。
moduletop_module( inputlogic[31:0]a, inputlogic[31:0]b, outputlogic[31:0]sum );// wirelogiccout; add16u1_add16( .a(a[15:0]), .b(b[15:0]), .cin(1'd0), .sum(sum[15:0]), .cout(cout) ); add16u2_add16( .a(a[31:16]), .b(b[31:16]), .cin(cout), .sum(sum[31:16]), .cout() ); endmodule moduleadd1(inputlogica, inputlogicb, inputlogiccin, outputlogicsum, outputlogiccout ); //Fulladdermodulehere assign{cout,sum}=a+b+cin; endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 26-Module_cseladd
題目說明
上一個(gè)練習(xí)中(Problem 25: Adder 2(Module fadd))實(shí)現(xiàn)的加法器應(yīng)該叫做行波進(jìn)位加法器(RCA: Ripple-Carry Adder)。這種加法器的缺點(diǎn)是計(jì)算進(jìn)位輸出的延遲是相當(dāng)慢的(最壞的情況下,來自于進(jìn)位輸入)。并且如果前一級(jí)加法器計(jì)算完成之前,后一級(jí)加法器不能開始計(jì)算。這又使得加法器的計(jì)算延遲變大。
一種改進(jìn)是進(jìn)位選擇加法器,如下所示。第一級(jí)加法器與之前相同,但我們復(fù)制第二級(jí)加法器,一個(gè)假設(shè)進(jìn)位=0,一個(gè)假設(shè)進(jìn)位=1,然后使用快速2對(duì)1多路復(fù)用器選擇哪個(gè)結(jié)果碰巧是正確的。
在本練習(xí)中,將獲得與上一個(gè)練習(xí)相同的模塊add16,該模塊將兩個(gè) 16 位數(shù)字與進(jìn)位相加,并產(chǎn)生一個(gè)進(jìn)位和 16 位和。必須實(shí)例化其中的三add16來構(gòu)建進(jìn)位選擇加法器,同時(shí)實(shí)現(xiàn)16bit的2選1選擇器來選擇結(jié)果。
如下圖所示將模塊連接在一起。提供的模塊add16具有以下聲明:
moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);?
模塊端口聲明
moduletop_module( input[31:0]a, input[31:0]b, output[31:0]sum );
題目解析
這題是上一題的改進(jìn)版本的加法器,其實(shí)這也是我們數(shù)電上學(xué)到的CSA(Carry-Select Adder,選擇進(jìn)位加法器),其相對(duì)于行波進(jìn)位加法器延遲小一半左右,但是其是利用資源換取的,所以相應(yīng)消耗的資源增加約一倍。
moduletop_module( inputlogic[31:0]a, inputlogic[31:0]b, outputlogic[31:0]sum ); wirelogiccout_sel; wirelogic[15:0]upperbit_sum0,upperbit_sum1; add16u0_add16( .a(a[15:0]), .b(b[15:0]), .cin(1'd0), .sum(sum[15:0]), .cout(cout_sel) ); add16u1_add16( .a(a[31:16]), .b(b[31:16]), .cin(1'd0), .sum(upperbit_sum0), .cout() ); add16u2_add16( .a(a[31:16]), .b(b[31:16]), .cin(1'd1), .sum(upperbit_sum1), .cout() ); always_comb begin uniquecase(cout_sel) 1'd0:sum[31:16]=upperbit_sum0; 1'd1:sum[31:16]=upperbit_sum1; default:sum[31:16]=upperbit_sum0; endcase end endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 27-Module addsub
題目說明
減法器可以通過選擇性地取反一個(gè)輸入而從加法器構(gòu)建,這相當(dāng)于將輸入反相然后加 1。最終結(jié)果是一個(gè)可以執(zhí)行兩種操作的電路:(a + b + 0) 和 ( a + ~b + 1)。
題目要求構(gòu)建下面的加減法器。
提供了一個(gè) 16 位加法器模塊,需要對(duì)其進(jìn)行兩次實(shí)例化:
moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);
每當(dāng)sub為 1 時(shí),使用 32 位寬的 XOR 門來反轉(zhuǎn)b輸入。(這也可以被視為b[31:0]與sub復(fù)制32次相異或)。同時(shí)sub信號(hào)連接到加法器的進(jìn)位。
圖片來自 HDLBits
模塊端口聲明
moduletop_module( input[31:0]a, input[31:0]b, inputsub, output[31:0]sum );
題目解析
這個(gè)題目考察的是減法器,這里就用到數(shù)電小常識(shí):減去一個(gè)數(shù)等于加上這個(gè)數(shù)的補(bǔ)碼(就是題中的按位取反再加1)。
moduletop_module( inputlogic[31:0]a, inputlogic[31:0]b, inputlogicsub, outputlogic[31:0]sum ); wirelogiccout_0; wirelogic[31:0]b_reverse; assignb_reverse=b^{32{sub}}; add16u1_add16( .a(a[15:0]), .b(b_reverse[15:0]), .cin(sub), .sum(sum[15:0]), .cout(cout_0) ); add16u2_add16( .a(a[31:16]), .b(b_reverse[31:16]), .cin(cout_0), .sum(sum[31:16]), .cout() ); endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
審核編輯:劉清
-
Verilog
+關(guān)注
關(guān)注
28文章
1339瀏覽量
109889 -
HDL
+關(guān)注
關(guān)注
8文章
325瀏覽量
47291 -
加法器
+關(guān)注
關(guān)注
6文章
183瀏覽量
30046
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(六)-Problem 24-27
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論