0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Verilog/SystemVerilog硬件描述語(yǔ)言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2022-09-15 09:11 ? 次閱讀

題目說明

給出了一個(gè)可以做16bit加法的模塊add16,實(shí)例化兩個(gè)add16以達(dá)到32bit加法的。

1229a180-3493-11ed-ba43-dac502259ad0.png

這個(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


1273475e-3493-11ed-ba43-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

12a995c0-3493-11ed-ba43-dac502259ad0.png

注意圖中的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".
136825bc-3493-11ed-ba43-dac502259ad0.png?

模塊端口聲明

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



13b7c2a2-3493-11ed-ba43-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

14596c10-3493-11ed-ba43-dac502259ad0.png

注意圖中的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);
1493103c-3493-11ed-ba43-dac502259ad0.png?

模塊端口聲明

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


14dc2d44-3493-11ed-ba43-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

15530ec8-3493-11ed-ba43-dac502259ad0.png

注意圖中的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)位。

157e92d2-3493-11ed-ba43-dac502259ad0.png 圖片來自 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


15b47b9a-3493-11ed-ba43-dac502259ad0.png

點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:

1655d166-3493-11ed-ba43-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。

這一題就結(jié)束了。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1339

    瀏覽量

    109889
  • HDL
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    fpga是用c語(yǔ)言還是verilog

    FPGA(現(xiàn)場(chǎng)可編程邏輯門陣列)開發(fā)主要使用的編程語(yǔ)言硬件描述語(yǔ)言HDL),其中Verilog是最常用的編程
    的頭像 發(fā)表于 03-27 14:38 ?1560次閱讀

    fpga通用語(yǔ)言是什么

    FPGA(現(xiàn)場(chǎng)可編程門陣列)的通用語(yǔ)言主要是指用于描述FPGA內(nèi)部邏輯結(jié)構(gòu)和行為的硬件描述語(yǔ)言。目前,Verilog
    的頭像 發(fā)表于 03-15 14:36 ?451次閱讀

    fpga三種編程語(yǔ)言

    FPGA(現(xiàn)場(chǎng)可編程門陣列)的編程涉及到三種主要的硬件描述語(yǔ)言HDL):VHDL(VHSIC Hardware Description Language)、Verilog以及
    的頭像 發(fā)表于 03-15 14:36 ?932次閱讀

    fpga用什么語(yǔ)言編程

    FPGA(現(xiàn)場(chǎng)可編程門陣列)的編程主要使用硬件描述語(yǔ)言HDL),其中最常用的是Verilog HDL和VHDL。
    的頭像 發(fā)表于 03-14 18:17 ?2443次閱讀

    fpga用的是什么編程語(yǔ)言 fpga用什么語(yǔ)言開發(fā)

    fpga用的是什么編程語(yǔ)言 FPGA(現(xiàn)場(chǎng)可編程邏輯門陣列)主要使用的編程語(yǔ)言硬件描述語(yǔ)言(HDL)。在眾多的
    的頭像 發(fā)表于 03-14 17:09 ?3160次閱讀

    fpga芯片用什么編程語(yǔ)言

    FPGA芯片主要使用的編程語(yǔ)言包括Verilog HDL和VHDL。這兩種語(yǔ)言都是硬件描述語(yǔ)言,
    的頭像 發(fā)表于 03-14 16:07 ?1383次閱讀

    VHDL語(yǔ)言快速入門指南

    HDL(VHSIC Hardware Description Language)是一種硬件描述語(yǔ)言,主要用于描述數(shù)字電路和系統(tǒng)的結(jié)構(gòu)、行為和
    發(fā)表于 03-04 11:41 ?2503次閱讀
    VHDL<b class='flag-5'>語(yǔ)言</b>快速入門指南

    verilog與其他編程語(yǔ)言的接口機(jī)制

    Verilog是一種硬件描述語(yǔ)言,用于描述數(shù)字電路的行為和結(jié)構(gòu)。與其他編程語(yǔ)言相比,
    的頭像 發(fā)表于 02-23 10:22 ?553次閱讀

    verilog調(diào)用模塊端口對(duì)應(yīng)方式

    Verilog是一種硬件描述語(yǔ)言HDL),廣泛應(yīng)用于數(shù)字電路設(shè)計(jì)和硬件驗(yàn)證。在
    的頭像 發(fā)表于 02-23 10:20 ?1401次閱讀

    verilog inout用法與仿真

    Verilog語(yǔ)言是一種硬件描述語(yǔ)言HDL),用于描述數(shù)字
    的頭像 發(fā)表于 02-23 10:15 ?2372次閱讀

    verilog中initial和always的區(qū)別

    Verilog是一種硬件描述語(yǔ)言HDL),用于設(shè)計(jì)和模擬數(shù)字電路。在Verilog中,關(guān)鍵字i
    的頭像 發(fā)表于 02-22 16:09 ?2180次閱讀

    verilog中for循環(huán)是串行執(zhí)行還是并行執(zhí)行

    Verilog中,for循環(huán)是并行執(zhí)行的。Verilog是一種硬件描述語(yǔ)言,用于描述和設(shè)計(jì)數(shù)字
    的頭像 發(fā)表于 02-22 16:06 ?2460次閱讀

    verilog function函數(shù)的用法

    Verilog 是一種硬件描述語(yǔ)言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在
    的頭像 發(fā)表于 02-22 15:49 ?4604次閱讀

    FPGA入門篇:Verilog計(jì)數(shù)器

    Verilog HDL是一種硬件描述語(yǔ)言,以文本形式來描述數(shù)字系統(tǒng)
    發(fā)表于 12-07 09:59 ?2450次閱讀
    FPGA入門篇:<b class='flag-5'>Verilog</b>計(jì)數(shù)器

    數(shù)字IC前端設(shè)計(jì)+后端設(shè)計(jì)流程實(shí)現(xiàn)

    RTL 設(shè)計(jì)** :芯片功能設(shè)計(jì)。硬件描述語(yǔ)言Verilog、VHDL、SystemVerilog。
    的頭像 發(fā)表于 11-08 15:03 ?3881次閱讀
    <b class='flag-5'>數(shù)字</b>IC前端設(shè)計(jì)+后端設(shè)計(jì)流程實(shí)現(xiàn)