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