日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ
		


一. 整數(shù)的概念

整數(shù)在 IEEE 的規(guī)定上有短整數(shù) short integer , 中整數(shù) integer 和 長整數(shù) long integer ,它們之間的關(guān)系如下:

為了方便討論,下面均以短整數(shù)作為例子。

  • 原碼:最高為符號位,之后是數(shù)值位。

+62 的原碼表示為 00111110
-62 的原碼表示為 10111110
  • 補(bǔ)碼:正數(shù)和0的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼是將其原碼的符號位保持不變,對數(shù)值位逐位求反,然后在最低位加一。對補(bǔ)碼求補(bǔ)就可以得到原碼。

+6 的原碼表示為 00000110            +6 的補(bǔ)碼表示為 00000110 
-5 的原碼表示為 10000101            -5 的補(bǔ)碼表示為 11111011
  • 補(bǔ)碼的運(yùn)算規(guī)則:在FPGA的底層,有符號數(shù)都是按照補(bǔ)碼來存儲的。補(bǔ)碼有一個(gè)特別的好處就是可以將減法轉(zhuǎn)換為加法,從而將加減法統(tǒng)一。

7-5:
7 的補(bǔ)碼是 00000111,-5 的補(bǔ)碼是 11111011 ,7 + (-5) = 00000111 + 11111011 = (1)00000010
由于只有8位,因此將進(jìn)位舍去得到加和的結(jié)果為 00000010,恰好是 2 的補(bǔ)碼
3-4:
3 的補(bǔ)碼是 00000011,-4 的補(bǔ)碼是 11111100 ,3 + (-4) = 00000011 + 11111100 = 11111111
得到加和的結(jié)果為 11111111,恰好是 -1 的補(bǔ)碼
  • 溢出:兩個(gè)補(bǔ)碼相加時(shí),如果產(chǎn)生的和超出了有效數(shù)字位所表示的范圍,則計(jì)算結(jié)果會出錯(cuò),解決的方法是擴(kuò)大字長。

二. 簡單的加法與減法操作

通過上面的討論,我們可以很容易的看到,從理論上講在底層對補(bǔ)碼只用加法就可以完成加法與減法的操作,但是由于我們在上層是對行為進(jìn)行描述,因此也是要用到減法的。

module adder8(sum,ina,inb); // 定義輸入輸出變量,這個(gè)加法器不考慮進(jìn)位,只需要對輸入數(shù)據(jù)進(jìn)行最高位擴(kuò)展  output [8:0] sum; input [7:0] ina,inb; assign sum = {ina[7], ina} + {inb[7],inb}; endmodule 

module subber8(dif,ina,inb); // 定義輸入輸出變量,這個(gè)減法器不考慮借位,只需要對輸入數(shù)據(jù)進(jìn)行最高位擴(kuò)展  output [8:0] dif; input [7:0] ina,inb; assign dif = {ina[7], ina} - {inb[7],inb}; endmodule 

這是對有符號數(shù)設(shè)計(jì)的加減法器,可以看到上面的加減法都完成的很棒,并沒有產(chǎn)生溢出的問題。

三. 采用流水線操作的加法器(耗時(shí)角度考慮)



這是一個(gè)四級流水線加法器的框圖,上面的加法器采用5級鎖存、4級加法的結(jié)構(gòu)。每一個(gè)加法器實(shí)現(xiàn)2位數(shù)據(jù)和上一個(gè)進(jìn)位的相加,整個(gè)加法器只受2位全加器的工作速度的限制,平均完成一個(gè)加法運(yùn)算只需要一個(gè)時(shí)鐘周期的時(shí)間,需要注意的是由于有四級流水線,因此這個(gè)加法器在輸出第一個(gè)計(jì)算值的時(shí)候有四個(gè)時(shí)鐘周期的延時(shí)。這里只給出無符號數(shù)的流水線加法器的模型,都寫出來太長了(其實(shí)我也沒有寫 )。代碼寫的比較繁瑣,但是邏輯更清楚,主要是當(dāng)做學(xué)習(xí)流水線結(jié)構(gòu)的例子,真正在工程中用的話感覺還是調(diào)IP核吧。

module pipeadder8(cout,sum,ina,inb,cin,clk,rst_n); // 定義輸入輸出變量  output [7:0] sum; output cout; input [7:0] ina,inb; input cin,clk,rst_n; reg [7:0] tmpa,tmpb,sum; reg cout; reg tmpci,firstco,secondco,thirdco; reg[1:0] firsts; reg[5:0] firsta,firstb; reg[3:0] seconds; reg[3:0] seconda,secondb; reg[5:0] thirds; reg[1:0] thirda, thirdb; // 這里進(jìn)行第0級數(shù)據(jù)緩存  always@(posedge clk or negedge rst_n) begin if(!rst_n) {tmpa,tmpb,tmpci} <= {8'd0,8'd0,1'b0}; else {tmpa,tmpb,tmpci} <= {ina,inb,cin}; end // 這里進(jìn)行第1級數(shù)據(jù)緩存,并且完成最低兩位以及進(jìn)位位的加法  always@(posedge clk or negedge rst_n) begin if(!rst_n) {firstco,firsts,firsta,firstb} = {1'b0,2'd0,6'd0,6'd0}; else begin {firstco,firsts} <= tmpa[1:0] + tmpb[1:0] + tmpci;
			firsta <= tmpa[7:2];
			firstb <= tmpb[7:2]; end end // 這里進(jìn)行第2級數(shù)據(jù)緩存,并且完成次低兩位以及進(jìn)位位的加法  always@(posedge clk or negedge rst_n) begin if(!rst_n) {secondco,seconds,seconda,secondb} = {1'b0,4'd0,4'd0,4'd0}; else begin {secondco,seconds} <= {{1'b0,firsta[1:0]} + {1'b0,firstb[1:0]} + firstco, firsts};
			seconda <= firsta[5:2];
			secondb <= firstb[5:2]; end end // 這里進(jìn)行第3級數(shù)據(jù)緩存,并且完成次次低兩位以及進(jìn)位位的加法  always@(posedge clk or negedge rst_n) begin if(!rst_n) {thirdco,thirds,thirda,thirdb} = {1'b0,6'd0,2'd0,2'd0}; else begin {thirdco,thirds} <= {{1'b0,seconda[1:0]} + {1'b0,secondb[1:0]} + secondco, seconds};
			thirda <= seconda[3:2];
			thirdb <= secondb[3:2]; end end // 這里進(jìn)行第4級數(shù)據(jù)緩存,并且完成次次次低兩位以及進(jìn)位位的加法  always@(posedge clk or negedge rst_n) begin if(!rst_n) {cout,sum} = {1'b0,8'd0}; else {cout,sum} <= {{1'b0,thirda[1:0]} + {1'b0,thirdb[1:0]} + thirdco, thirds}; end endmodule 



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉