【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算
目錄
- 0 前言
- 0.1 使用環(huán)境
- 0.2 知識(shí)點(diǎn)
- 0.3 注意事項(xiàng)
 
- 1 建模:1位加法器
- 1.1 構(gòu)建基礎(chǔ)模型
- 1.1.1 一位加法器
- 1.1.1.1 科技黑箱:外部端口與功能
- 1.1.1.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
 
- 1.1.2 從頂層模塊提取低層模塊:取反功能選擇器
- 1.1.2.1 科技黑箱:外部端口與功能
- 1.1.2.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
 
- 1.1.3 從頂層模塊提取低層模塊:基礎(chǔ)加法器
- 1.1.3.1 科技黑箱:外部端口與功能
- 1.1.3.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
 
 
- 1.2 層次建模
- 1.2.1 32位加法器
- 1.2.2 1位加法器
 
 
- 2 實(shí)現(xiàn):1位加法器
- 2.1 取反選擇器
- 2.1.1 設(shè)計(jì)塊
- 2.1.2 激勵(lì)塊
- 2.1.3 功能驗(yàn)證
 
- 2.2 基礎(chǔ)加法器
- 2.2.1 設(shè)計(jì)塊
- 2.2.2 激勵(lì)塊
- 2.2.3 功能驗(yàn)證
 
- 2.3 1位加法器的實(shí)現(xiàn)
- 2.3.1 設(shè)計(jì)塊
- 2.3.2 激勵(lì)塊&功能驗(yàn)證
 
 
- 3 原理講解:實(shí)現(xiàn)整數(shù)減法,將負(fù)數(shù)轉(zhuǎn)換為補(bǔ)碼
- 3.1 計(jì)算機(jī)進(jìn)制數(shù)與人類進(jìn)制數(shù)的差別
- 3.1.1 十進(jìn)制數(shù)轉(zhuǎn)換為補(bǔ)碼的原理
 
- 3.2 進(jìn)位輸入信號(hào)carry_in的作用
 
- 3 建模:32位加法器
- 3.1 科技黑箱:外部端口
- 3.2 揭秘黑箱:內(nèi)部細(xì)節(jié)
- 3.2.1 組合式設(shè)計(jì)的核心原則
 
 
- 4 實(shí)現(xiàn):32位加法器
- 4.1 設(shè)計(jì)塊
- 4.2 激勵(lì)塊
- 4.2.1 報(bào)錯(cuò)解決方案
 
- 4.3 仿真驗(yàn)證
 
- 5 行為級(jí)建模的魅力
- 5.1 設(shè)計(jì)塊
- 5.2 激勵(lì)塊
- 5.3 結(jié)果驗(yàn)證
- 5.4 思考點(diǎn)
 
- 6 由行為級(jí)描述掌握幾大重要思想
- 7 待求解決方案的錯(cuò)誤
0 前言
0.1 使用環(huán)境
- EDA工具:Vivado 2017.4
- 硬件描述語言:Verilog HDL
0.2 知識(shí)點(diǎn)
- 加法器(全加器)
- 多路選擇器
- Verilog 語言及其設(shè)計(jì)思想
- 補(bǔ)碼
0.3 注意事項(xiàng)
本文中所有的Verilog實(shí)現(xiàn)部分,均完成了仿真測(cè)試,并未進(jìn)行時(shí)序驗(yàn)證以及后續(xù)的邏輯綜合步驟,后續(xù)步驟可能會(huì)出現(xiàn)問題,請(qǐng)讀者自行完成修改。
1 建模:1位加法器
我們先來構(gòu)建1位加法器,要知道,32位加法器只不過是將32個(gè)1位加法器以特定的方式連接起來,真正的核心是1位加法器的設(shè)計(jì)。
1.1 構(gòu)建基礎(chǔ)模型
1.1.1 一位加法器
1.1.1.1 科技黑箱:外部端口與功能
功能:能夠?qū)崿F(xiàn)整數(shù)的加減法,這也就意味著
- 輸入端口 - 數(shù)據(jù):a,b
- 進(jìn)位:carry_in
- 取反控制:a_invert,b_invert
 
- 輸出端口 - 和:sum
- 進(jìn)位:carry_out
 
特別注意:對(duì)于多個(gè)加法器組合的情況,carry_in是來自上一個(gè)加法器的carry_out,如果位置是第一個(gè),則要置為0
1.1.1.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
 內(nèi)部線網(wǎng):不與外部相連的內(nèi)部線,就是內(nèi)部線網(wǎng),在Verilog設(shè)計(jì)中需要單獨(dú)加上!
1.1.2 從頂層模塊提取低層模塊:取反功能選擇器
1.1.2.1 科技黑箱:外部端口與功能
下圖圖示部分為取反功能選擇器,其功能是控制輸入的數(shù)據(jù)是否執(zhí)行取反操作
 
 以下是其外部端口:
 
1.1.2.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
多路選擇器的全面講解參考我的另一篇文章:全面剖析數(shù)據(jù)選擇器
1.1.3 從頂層模塊提取低層模塊:基礎(chǔ)加法器
1.1.3.1 科技黑箱:外部端口與功能
1.1.3.2 揭秘黑箱:內(nèi)部結(jié)構(gòu)與模塊
使用數(shù)據(jù)流建模,兩個(gè)邏輯表達(dá)式就可以,這個(gè)部分是數(shù)字邏輯必備知識(shí),不再贅述。
1.2 層次建模
1.2.1 32位加法器
32位加法器1位加法器12.....30311.2.2 1位加法器
1位加法器取反選擇器1非門二選一選擇器取反選擇器2基礎(chǔ)加法器與門或門2 實(shí)現(xiàn):1位加法器
2.1 取反選擇器
2.1.1 設(shè)計(jì)塊
`timescale 1ns / 1ps// 取反選擇器的設(shè)計(jì) module date_invert_choose (input a, // 數(shù)據(jù)輸入input a_invert, // 使能端 output a_out // 數(shù)據(jù)輸出);choose_2to1 CH0 (a,~a,a_invert,a_out); // 調(diào)用二選一選擇器實(shí)例endmodule// 二選一選擇器 module choose_2to1 (input d0,d1, // 數(shù)據(jù)輸入input add, // 地址控制output out // 數(shù)據(jù)輸出);assign out = (~add)&d0 | add&d1;endmoduleFPGA優(yōu)化結(jié)果如下:
 
2.1.2 激勵(lì)塊
設(shè)置激勵(lì)塊有兩個(gè)口訣:
- 調(diào)用模塊,建實(shí)例
- 設(shè)置輸入,驗(yàn)輸出
2.1.3 功能驗(yàn)證
仿真結(jié)果沒有問題!
 
2.2 基礎(chǔ)加法器
2.2.1 設(shè)計(jì)塊
module add_base_1size (input a,b, // 數(shù)據(jù)輸入input carry_in, // 進(jìn)位輸入output carry_out, // 進(jìn)位輸出output sum // 和);assign sum = a ^ b ^ carry_in;assign carry_out = a&b | (a^b)&carry_in;endmodule2.2.2 激勵(lì)塊
請(qǐng)讀者自行完成
2.2.3 功能驗(yàn)證
經(jīng)過仿真驗(yàn)證,沒有問題。
2.3 1位加法器的實(shí)現(xiàn)
本節(jié)展現(xiàn)的是完整代碼,包含2.1和2.2的設(shè)計(jì)塊代碼
 
2.3.1 設(shè)計(jì)塊
`timescale 1ns / 1ps// 取反選擇器的設(shè)計(jì) module date_invert_choose (input a, // 數(shù)據(jù)輸入input a_invert, // 使能端 output a_out // 數(shù)據(jù)輸出);choose_2to1 CH0 (a,~a,a_invert,a_out); // 調(diào)用二選一選擇器實(shí)例endmodule// 二選一選擇器 module choose_2to1 (input d0,d1, // 數(shù)據(jù)輸入input add, // 地址控制output out // 數(shù)據(jù)輸出);assign out = (~add)&d0 | add&d1;endmodule// 基礎(chǔ)加法器 module add_base_1size (input a,b, // 數(shù)據(jù)輸入input carry_in, // 進(jìn)位輸入output carry_out, // 進(jìn)位輸出output sum // 和);assign sum = a ^ b ^ carry_in;assign carry_out = a&b | (a^b)&carry_in;endmodule// 1位加法器的實(shí)現(xiàn) module add_1size (input a,b, // 數(shù)據(jù)輸入input a_invert,b_invert, // 求反控制input carry_in, output carry_out,output sum);// 內(nèi)部線網(wǎng)設(shè)置wire a_out,b_out; // 獲得經(jīng)過求反選擇器之后的結(jié)果// 調(diào)用模塊實(shí)例// 求反控制器實(shí)例date_invert_choose DateA (a,a_invert,a_out);date_invert_choose DateB (b,b_invert,b_out);// 加法器實(shí)例add_base_1size Add_A_B (a_out,b_out,carry_in,carry_out,sum);endmodule2.3.2 激勵(lì)塊&功能驗(yàn)證
module test;reg a,b; // 注意reg為無符號(hào)數(shù)reg a_invert,b_invert;reg carry_in;wire carry_out;wire sum;add_1size AD0 (a,b,a_invert,b_invert,carry_in,carry_out,sum);// 設(shè)置信號(hào),求 a + (-b)即 a - binitialbegina = 0; b = 0;a_invert = 0; b_invert = 1; // b取反carry_in = 1; // b取反加1#1 $display("a = %b, b = %b, carry_out = %b\na - b = %b\n",a,b,carry_out,sum); // 模擬 a - bif (sum == 0)$display("驗(yàn)證成功! 0 - 0 = 0");endendmodule
 這里的驗(yàn)證我有必要講解一下,因?yàn)橛行┑胤綍?huì)令人費(fèi)解。
3 原理講解:實(shí)現(xiàn)整數(shù)減法,將負(fù)數(shù)轉(zhuǎn)換為補(bǔ)碼
本小節(jié)可以跳過,可以看完第4節(jié)再回看。
3.1 計(jì)算機(jī)進(jìn)制數(shù)與人類進(jìn)制數(shù)的差別
計(jì)算機(jī)進(jìn)制數(shù)指的是
- 二進(jìn)制
- 八進(jìn)制
- 十六進(jìn)制
人類進(jìn)制數(shù)指的是
- 十進(jìn)制
兩者差別主要在于,十進(jìn)制數(shù)使用 -來表示負(fù)數(shù),而計(jì)算機(jī)進(jìn)制數(shù)使用補(bǔ)碼來表示負(fù)數(shù),在其數(shù)據(jù)本身,就包含了符號(hào),而十進(jìn)制數(shù)據(jù)是不包含符號(hào)位的,它的符號(hào)位是單獨(dú)存在的。這也是機(jī)器數(shù)數(shù)據(jù)符號(hào)化的特點(diǎn)。
而人類又習(xí)慣于使用十進(jìn)制,這才有了負(fù)數(shù)的補(bǔ)碼轉(zhuǎn)換方法及其硬件設(shè)計(jì)邏輯。
在這里重點(diǎn)強(qiáng)調(diào),不要理會(huì)原碼、反碼,這是歷史上已經(jīng)被淘汰的東西,他們跟補(bǔ)碼,只是有數(shù)學(xué)上的聯(lián)系,以及歷史原因。
但是,從十進(jìn)制數(shù)轉(zhuǎn)換為補(bǔ)碼這一過程跟原碼、反碼完全沒有關(guān)系,很多教材和老師的講解都是不正確的。
我們只需要記住以下原則:
3.1.1 十進(jìn)制數(shù)轉(zhuǎn)換為補(bǔ)碼的原理
請(qǐng)注意,這里十進(jìn)制數(shù)的對(duì)象為:全體實(shí)數(shù),包含整數(shù)和小數(shù),他們都適用于補(bǔ)碼轉(zhuǎn)換規(guī)則,重要的一點(diǎn)區(qū)別是在計(jì)算機(jī)存儲(chǔ)上
- 計(jì)算機(jī)存儲(chǔ)整數(shù),直接使用補(bǔ)碼表示
- 計(jì)算機(jī)存儲(chǔ)小數(shù),使用的是浮點(diǎn)表示,關(guān)于這一點(diǎn)請(qǐng)?jiān)敿?xì)閱讀浮點(diǎn)運(yùn)算的知識(shí)
在這里,我們以十進(jìn)制整數(shù)為例來進(jìn)行說明
- 對(duì)于正數(shù),這個(gè)非常容易,直接使用除基取余法即可,高位需要用0補(bǔ)全
 例如(假定寄存器為16位):
 200D = 0000_0000_1100_1000B
- 對(duì)于負(fù)數(shù),需要遵循這樣的規(guī)則:全部取反再加1
例如 -2D:
(1)先表示出2D = 0000_0000_0000_0010B
(2)再全部取反,1111_1111_1111_1101B
(3)再加1,1111_1111_1111_1110B
(4)這樣得到的結(jié)果就是 -2D的補(bǔ)碼
需要注意的是,此時(shí)如果高位有空余,需要補(bǔ)上1,而不是0
其中,我之前提到的取反功能選擇器,就是完成了取反操作,但是還有加1操作呢?我們繼續(xù)看下一小節(jié)!
3.2 進(jìn)位輸入信號(hào)carry_in的作用
我在1.1.1.1節(jié)提到過,carry_這個(gè)信號(hào),初始需要置為0,加法器單獨(dú)存在一個(gè)的時(shí)候,它是不太重要的。
只有多個(gè)加法器連在一起(串行進(jìn)位,第3節(jié)會(huì)提及)的時(shí)候,上一級(jí)的carry_in與下一級(jí)的carry_out連接起來,才能發(fā)揮作用。
但是,如果初始將carry_in置為1,就能夠發(fā)揮它的作用了,它在補(bǔ)碼轉(zhuǎn)換過程,起到了加1的作用。
無論輸入的數(shù)據(jù)是1位還是32位,加1只需要在最低位加1,也就是只需要把單獨(dú)存在的,不與carry_out連接的caryy_in置為1,就能實(shí)現(xiàn)加1操作。
十進(jìn)制的2:0000 0000 0000 0010先取反: 1111 1111 1111 1101再加1: + 1————————————————————————1111 1111 1111 1110 其中:取反操作使用取反選擇器完成加1操作只需將carry_in置為1這樣一來,取反選擇器與carry_in = 1緊密合作,就完成了十進(jìn)制數(shù)到補(bǔ)碼的轉(zhuǎn)換,也就實(shí)現(xiàn)了整數(shù)的加減法。
備注:如果這個(gè)部分看不懂,請(qǐng)看完第3節(jié)再回看此節(jié)。
至此,我想你能夠理解實(shí)現(xiàn)整數(shù)減法的硬件設(shè)計(jì)原理了。
思考點(diǎn):
這里留一個(gè)問題給讀者思考,試想,如果采用大多數(shù)老師講解的原碼、反碼和補(bǔ)碼的原則去轉(zhuǎn)換補(bǔ)碼,硬件設(shè)計(jì)會(huì)是怎樣的?
這里我直接給你結(jié)果分析,具體設(shè)計(jì)不再講解,自行完成。
 顯然,按照這樣的方式,設(shè)計(jì)會(huì)非常復(fù)雜,而且沒有必要,既違背了硬件設(shè)計(jì)簡單性原則,也增加了數(shù)學(xué)運(yùn)算的復(fù)雜度
一般老師講解的原碼、反碼和補(bǔ)碼的轉(zhuǎn)換方式是
- 先求原碼,再求反碼,再求補(bǔ)碼
我教你的是
- 全部取反再加1
這二者是區(qū)別就是
- 前者教你 1 + 10 - 9 = 2
- 后者教你: 1 + 1 = 2
對(duì)比之下,哪個(gè)更加簡潔不言而喻,事實(shí)上,這些都是人為規(guī)定,怎么計(jì)算都可以,在數(shù)學(xué)上都說的通,但是要考慮硬件簡單性原則,后者顯然更加占優(yōu)勢(shì)。
 假定a,b均為非負(fù)整數(shù),則:
 a - b = a + ( b取反 + 1 )
但是事實(shí)的情況往往會(huì)更加復(fù)雜,比如:-a - b又如何處理?
目前從原理上能夠?qū)崿F(xiàn)減法,但這遠(yuǎn)遠(yuǎn)不夠,還需要根據(jù)實(shí)際需求進(jìn)一步改進(jìn),這就涉及到了將其添加到MIPS指令上,這個(gè)以后再說。
3 建模:32位加法器
這里采用串行進(jìn)位方式進(jìn)行連接,并非并行進(jìn)位(超前進(jìn)位)。
關(guān)于基礎(chǔ)加法器的超前進(jìn)位實(shí)現(xiàn),參照我的文章:全面剖析:加法器——從1位到4位,從一般加法(串行進(jìn)位)到快速加法(并行進(jìn)位/超前進(jìn)位)【此處鏈接待完善】
3.1 科技黑箱:外部端口
3.2 揭秘黑箱:內(nèi)部細(xì)節(jié)
3.2.1 組合式設(shè)計(jì)的核心原則
- 全部接口都連接,分三大類 - 與外部總線連接
- 與外部一根線連接
- 內(nèi)部相互連接(配置內(nèi)部線網(wǎng),一般為數(shù)組)
 
4 實(shí)現(xiàn):32位加法器
4.1 設(shè)計(jì)塊
此處直接使用前面設(shè)計(jì)好的1位加法器,再次強(qiáng)調(diào),此處為串行進(jìn)位
module add_32sizes (input [31:0] a,b,input a_invert,b_invert,input carry_in,output carry_out,output [31:0] sum);// 設(shè)置內(nèi)部線網(wǎng)wire carry_out_in [30:0]; // 內(nèi)部串行進(jìn)位傳遞// 調(diào)用模塊實(shí)例add_1size ADD0 (a[0],b[0],a_invert,b_invert,carry_in,carry_out_in[0],sum[0]);add_1size ADD1 (a[1],b[1],a_invert,b_invert,carry_out_in[0],carry_out_in[1],sum[1]);add_1size ADD2 (a[2],b[2],a_invert,b_invert,carry_out_in[1],carry_out_in[2],sum[2]);add_1size ADD3 (a[3],b[3],a_invert,b_invert,carry_out_in[2],carry_out_in[3],sum[3]);add_1size ADD4 (a[4],b[4],a_invert,b_invert,carry_out_in[3],carry_out_in[4],sum[4]);add_1size ADD5 (a[5],b[5],a_invert,b_invert,carry_out_in[4],carry_out_in[5],sum[5]);add_1size ADD6 (a[6],b[6],a_invert,b_invert,carry_out_in[5],carry_out_in[6],sum[6]);add_1size ADD7 (a[7],b[7],a_invert,b_invert,carry_out_in[6],carry_out_in[7],sum[7]);add_1size ADD8 (a[8],b[8],a_invert,b_invert,carry_out_in[7],carry_out_in[8],sum[8]);add_1size ADD9 (a[9],b[9],a_invert,b_invert,carry_out_in[8],carry_out_in[9],sum[9]);add_1size ADD10 (a[10],b[10],a_invert,b_invert,carry_out_in[9],carry_out_in[10],sum[10]);add_1size ADD11 (a[11],b[11],a_invert,b_invert,carry_out_in[10],carry_out_in[11],sum[11]); add_1size ADD12 (a[12],b[12],a_invert,b_invert,carry_out_in[11],carry_out_in[12],sum[12]);add_1size ADD13 (a[13],b[13],a_invert,b_invert,carry_out_in[12],carry_out_in[13],sum[13]);add_1size ADD14 (a[14],b[14],a_invert,b_invert,carry_out_in[13],carry_out_in[14],sum[14]);add_1size ADD15 (a[15],b[15],a_invert,b_invert,carry_out_in[14],carry_out_in[15],sum[15]);add_1size ADD16 (a[16],b[16],a_invert,b_invert,carry_out_in[15],carry_out_in[16],sum[16]);add_1size ADD17 (a[17],b[17],a_invert,b_invert,carry_out_in[16],carry_out_in[17],sum[17]);add_1size ADD18 (a[18],b[18],a_invert,b_invert,carry_out_in[17],carry_out_in[18],sum[18]);add_1size ADD19 (a[19],b[19],a_invert,b_invert,carry_out_in[18],carry_out_in[19],sum[19]);add_1size ADD20 (a[20],b[20],a_invert,b_invert,carry_out_in[19],carry_out_in[20],sum[20]);add_1size ADD21 (a[21],b[21],a_invert,b_invert,carry_out_in[20],carry_out_in[21],sum[21]);add_1size ADD22 (a[22],b[22],a_invert,b_invert,carry_out_in[21],carry_out_in[22],sum[22]);add_1size ADD23 (a[23],b[23],a_invert,b_invert,carry_out_in[22],carry_out_in[23],sum[23]);add_1size ADD24 (a[24],b[24],a_invert,b_invert,carry_out_in[23],carry_out_in[24],sum[24]);add_1size ADD25 (a[25],b[25],a_invert,b_invert,carry_out_in[24],carry_out_in[25],sum[25]);add_1size ADD26 (a[26],b[26],a_invert,b_invert,carry_out_in[25],carry_out_in[26],sum[26]);add_1size ADD27 (a[27],b[27],a_invert,b_invert,carry_out_in[26],carry_out_in[27],sum[27]);add_1size ADD28 (a[28],b[28],a_invert,b_invert,carry_out_in[27],carry_out_in[28],sum[28]);add_1size ADD29 (a[29],b[29],a_invert,b_invert,carry_out_in[28],carry_out_in[29],sum[29]);add_1size ADD30 (a[30],b[30],a_invert,b_invert,carry_out_in[29],carry_out_in[30],sum[30]);add_1size ADD31 (a[31],b[31],a_invert,b_invert,carry_out_in[30],carry_out,sum[31]);endmodule4.2 激勵(lì)塊
注意,因?yàn)樵赩erilog中,reg自動(dòng)以二進(jìn)制補(bǔ)碼形式存儲(chǔ),所以此處驗(yàn)證負(fù)數(shù)的時(shí)候,我們假定計(jì)算機(jī)沒有以補(bǔ)碼存儲(chǔ)這一功能,我們假定b = -5,并且手動(dòng)設(shè)置b的值,將b的值設(shè)置為5的補(bǔ)碼,5的補(bǔ)碼就是其二進(jìn)制表示0101B,以此來驗(yàn)證5的補(bǔ)碼經(jīng)過全部取反加1后,是否變成了-5的補(bǔ)碼,從而驗(yàn)證了設(shè)計(jì)的正確性。
如果你沒有看懂,那么請(qǐng)看完第6節(jié)的補(bǔ)充鏈接,再回顧此內(nèi)容。
module test;reg [31:0] a,b; // 注意reg為無符號(hào)數(shù)reg a_invert,b_invert;integer carry_in;wire carry_out;wire [31:0] sum;add_32sizes AD0 (a,b,a_invert,b_invert,carry_in,carry_out,sum);// 設(shè)置信號(hào),假設(shè)b = -5;a = 8;求a + b initialbegina = 4'b1000; // 8的補(bǔ)碼b = 4'b0101; // reg為無符號(hào)數(shù),自動(dòng)把-5存為補(bǔ)碼,無法驗(yàn)證結(jié)果,因此使用 |-5| = 5 的補(bǔ)碼a_invert = 0; b_invert = 1; // b取反carry_in = 1; // b取反加1#1 $display("a = %d, b = -%d\na + b = %d\n",a,b,sum); // 模擬 a - bif(sum == 3)$display("驗(yàn)證成功! 8 + (- 5) = 3");endendmodule4.2.1 報(bào)錯(cuò)解決方案
對(duì)于這樣的錯(cuò)誤:[XSIM 43-3238] Failed to link the design.
通常情況下,是因?yàn)榧?lì)塊與設(shè)計(jì)塊的連接出了問題,可能是
- 模塊調(diào)用錯(cuò)誤
- 模塊忘記實(shí)例化
- 模塊接口連接錯(cuò)誤
可以按照這個(gè)思路依次排查
4.3 仿真驗(yàn)證
5 行為級(jí)建模的魅力
前面說了那么多,其實(shí),真正硬件編程的時(shí)候沒有那么麻煩,強(qiáng)大的EDA工具讓我們能夠只需要描述其行為,就能完成設(shè)計(jì),這是抽象層次足夠高的設(shè)計(jì),讓我們來看一下。
這里你可能想要摔電腦了,什么????我做了這么半天,實(shí)際上只需要幾行??那你寫了這么多有啥用!!
冷靜一下,仔細(xì)想一下,你是不是在之前的操作中,對(duì)于加法器已經(jīng)非常熟悉了?如果你認(rèn)真做了,我想應(yīng)該是的,這就是Learning by doing,在做中學(xué),能夠快速掌握知識(shí),加深對(duì)于知識(shí)的理解程度,這一點(diǎn)是很必要的,因此你必須花時(shí)間來完成它。
5.1 設(shè)計(jì)塊
module add_32bits(input [31:0] a,b,input ADDctl, // 控制端,用于識(shí)別加減法 0代表加法,1代表減法output reg [31:0] result);always @(a,b,ADDctl)begincase(ADDctl)0: result = a + b;1: result = a - b;endcaseendendmodule5.2 激勵(lì)塊
module test;// reg signed [31:0] a,b;integer a,b;reg ADDctl;wire signed [31:0] result;add_32bits ADD_0 (a,b,ADDctl,result);initialbegin// 測(cè)試加法a = -1; b = 20; ADDctl = 0;#1 $display("%d + %d = %d",a,b,result);#1// 測(cè)試減法 【1-20= 溢出值,因?yàn)椴蛔R(shí)別補(bǔ)碼!???怎么辦】a = -10; b = 28; ADDctl = 1;#1 $display("%d - %d = %d",a,b,result);endendmodule5.3 結(jié)果驗(yàn)證
5.4 思考點(diǎn)
以上問題,看完下一小結(jié)的擴(kuò)展鏈接,你就能得知答案。
6 由行為級(jí)描述掌握幾大重要思想
設(shè)計(jì)的思想有
- 分治思想
- 歸一思想
- 實(shí)戰(zhàn)驗(yàn)證思維
- 查閱資料的能力
我單獨(dú)寫了一篇文章,以闡述一些重要的理論和思想。請(qǐng)看:待完善
7 待求解決方案的錯(cuò)誤
[XSIM 43-3345] Unable to remove previous simulation file xsim.dir/test_behav/xsimk.exe. Please check if you have another instance of this simulation running on your system, terminate it and then recompile your design. System Error Message: boost::filesystem::status: 拒絕訪問。: "xsim.dir/test_behav/xsimk.exe".
[XSIM 43-3238] Failed to link the design.
我不知道為什么會(huì)拒絕訪問,并且此狀態(tài)下,系統(tǒng)不能刪除文件,唯一的辦法就是重新建立一個(gè)文件,并且將設(shè)計(jì)塊和激勵(lì)塊copy過去。
問題待解決中!如有讀者知道解決方案,歡迎私聊我~
總結(jié)
以上是生活随笔為你收集整理的【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: lol小鱼人怕什么英雄
- 下一篇: 原神神无冢屏障怎么解
