国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

關于除法電路

發布時間:2015-12-7 15:15    發布者:designapp
關鍵詞: 除法電路 , ASIC
除法,這個小學4年紀就開始學習和使用的方法卻一直是我這個ASIC工程師心中的痛。我一直在思考如何能找到一個簡單(硬件資源少)而快捷(時鐘排數少)的通用除法電路

其實簡單的說除法可以用迭代的減法來實現,但是對于硬件,這恐怕要花很多時間。我也一直沒有找到實現任意除法的好方法。但是對于某些除數固定的除法還是有一些辦法的。

1)最容易想到的就是ROM查找表,但是ROM畢竟不是我們的目標,雖然ROM有時是不錯的方法。

2)我開始仔細考慮這個問題是在做264解碼時必須要處理QP的問題。這是一個除以6的計算,由于被除數不會大于52(6bit),所以我簡化了一個組合邏輯來實現。代碼如下:

always@(idata)
begin
case(idata[5:3])
3'b000: begin
oquotient[3:1] = 3'b000;
if (idata[2:1]==2'b11)
begin
oquotient[0] = 1'b1;
end
else
begin
oquotient[0] = 1'b0;
end
end
3'b001: begin
oquotient[3:2] = 2'b00;
if (idata[2]==1'b1)
begin
oquotient[1:0] = 2'b10;
end
else
begin
oquotient[1:0] = 2'b01;
end
end
3'b010: begin
oquotient[3:1] = 3'b001;
if (idata[2:1]!=2'b00)
begin
oquotient[0] = 1'b1;
end
else
begin
oquotient[0] = 1'b0;
end
end
3'b011: begin
oquotient[3:1] = 3'b010;
if (idata[2:1]==2'b11)
begin
oquotient[0] = 1'b1;
end
else
begin
oquotient[0] = 1'b0;
end
end
3'b100: begin
oquotient[3:2] = 2'b01;
if (idata[2]==1'b1)
begin
oquotient[1:0] = 2'b10;
end
else
begin
oquotient[1:0] = 2'b01;
end
end
3'b101: begin
oquotient[3:1] = 3'b011;
if (idata[2:1]!=2'b00)
begin
oquotient[0] = 1'b1;
end
else
begin
oquotient[0] = 1'b0;
end
end
3'b110: begin
oquotient[3:1] = 3'b100;
if (idata[2:1]==2'b11)
begin
oquotient[0] = 1'b1;
end
else
begin
oquotient[0] = 1'b0;
end
end
3'b111: begin
oquotient[3:2] = 2'b10;
if (idata[2]==1'b1)
begin
oquotient[1:0] = 2'b10;
end
else
begin
oquotient[1:0] = 2'b01;
end
end
default: oquotient[3:0] = 4'd0;
endcase
end
//always@(idata)
//begin
// case(idata[3:1])
// 3'b000: rem_temp[1:0] = 2'b00;
// 3'b001: rem_temp[1:0] = 2'b01;
// 3'b010: rem_temp[1:0] = 2'b10;
// 3'b011: rem_temp[1:0] = 2'b00;
// 3'b100: rem_temp[1:0] = 2'b01;
// 3'b101: rem_temp[1:0] = 2'b10;
// 3'b110: rem_temp[1:0] = 2'b00;
// 3'b111: rem_temp[1:0] = 2'b01;
// default:rem_temp[1:0] = 2'b00;
// endcase
//end
//
//always@(idataor rem_temp)
//begin
// oremainder[0] = idata[0];
// case(idata[5:4])
// 2'b00,2'b11: oremainder[2:1] = rem_temp[1:0];
// 2'b01: oremainder[2:1] = {(~(rem_temp[1] | rem_temp[0])),rem_temp[1]};
// 2'b10: oremainder[2:1] = {rem_temp[0],(~(rem_temp[1] | rem_temp[0]))};
// default: oremainder[2:1] = rem_temp[1:0];
// endcase
//end

可見這個邏輯并不是很大,求商的邏輯不過是一個3bit的case里面套一級選擇(if),FPGA里不過就是一個ALU。時序也很好,百兆的鐘都沒有問題。我由此想到了,對于除數固定,被除數有一定范圍限制的除法,還是可以用一定簡化了邏輯實現的。

3)以下我們討論的除法就由此先做一個前提的約束:被除數是8bit,除數我們將分別討論3、5、7、11等質數的情況,其它的和數的除法可以分解成質數。

4) 除數為3(二進制2‘b11)

我最早的想法其實很簡單,除以3是很困難的,但是除以4對于硬件確實非常簡單的。所以也許可以通過對1/4進行一些調整來達到1/3的目的。這顯然是要在1/4上加一點什么,加什么呢?我突然想到了無窮級數:

1/4 1/16 1/64 .........
其無窮級數求和和剛好是1/3。這似乎就簡單了。不就是1/4 +1/16 +1/64 + .........
有一件事情是可能的,我們不能求無窮的加和,但是如果我們只要整數位,那也許就不需要無窮的加完。
temp[14:0] = {number[7:0],6'd0} + {number[7:0],4'd0} + {number[7:0],2'd0} + number[7:0];
result1[7:0] = temp[14:8] + ((number[7]==1'b1 && number[6:0]!=7'd0)? temp[7] : temp[7]&temp[6]);

number是8bit被除數,temp是number若干(這里這用了前4個)移位值的和,但是我們明白,這是不精確的,所以對此和進行一些調整。調整的方向一定是加一點什么(因為我們少加了很多數),result1就是這個調整的邏輯。

從整體上看看這個邏輯:4個14位數的加法,一個選擇邏輯和單bit加。邏輯不算太小(14bit加法電路還是不小的),但是也不算太大(畢竟就是4個加法)。時序由加法電路來限制,綜合的好應該到百兆是沒有問題的。

5)除數為5(3'b101)

1/5顯然和1/4比較近。我們仍然可以比較方便的寫出這個無窮級數來:

1 - 1/4 + 1/16 - 1/64 ...........
這個的和是4/5不是1/5,但是再除個4就好了(這很方便的)。
temp[13:0]={number[7:0],6'd0} - {number[7:0],4'd0} + {number[7:0],2'd0} - number[7:0] + number[7:2] - number[7:4];
result1[7:0] = temp[13:6] + temp[5];
result2[5:0] = result1[7:2];

temp是number的6個移位值的和,result1是調整后的值,result2是result/4的商。這個邏輯怎么要加6個值的和呢?其實就是近似問題,如果加的個數少,那么后面那個調整電路就會復雜些。

6)除數為7(3'b111)

這個和1/3其實是類似的,我就不贅述了。

7)除數為11(4'b1011)

這個有點煩,和11近的2^n是8或16,這個級數似乎不好找。但是我一覺醒來突然明白了一個事情:任何一個小數都是可以化為2進制表示的,而其2進制表示其實就是一個2^n的數列的和,只不過是換了一種形式吧了。

于是1/11就是0.0001011101 | 0001011101 | 0001011101 | ...........
temp[14:0] = {number[7:0],6'd0} + {number[7:0],4'd0} + {number[7:0],3'd0} + {number[7:0],2'd0} + number[7:0] + number[7:4];
result1[7:0] = temp[14:10] + (temp[9]&temp[8]&temp[7]&temp[6]);

精度仍然只取了前6個有效的(是1)的數,然后在result1上做了一些補足的調整。

8)總結:其實到這里我們就已經清除了一件事----所有除數固定的除法都可以用上述確定的過程來實現。具體說就是:第一,將除數n變成乘以1/n,然后用2進制來表示這個1/n。第二,根據被除數的位數來選取合適的1/n的有效位數。第三,再根據具體的結果做一些調整。

1/N取多少有效位合適,取決與被除數的范圍(被除數較大,就要多取幾位)、邏輯大小的控制(加法越多,可能你的門數和時序多要付出代價)、一級最后那個調整的復雜程度(總不能太復雜吧)。

好了,到這里就先告一段落吧,但是我仍然沒有從根本上真正解決任意除法的問題。我心中的通看來還要持續。不知有誰能最終來替我排解。
本文地址:http://m.qingdxww.cn/thread-158707-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 實時控制解決方案的正確選擇——數字信號控制器(DSC)或通用MCU
  • 探索PIC16F13145 MCU系列——快速概覽
  • PIC32CK SG單片機——輕松滿足新型網絡安全要求
  • PIC32CM LS60 Curiosity Pro評估工具包
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本人的色道免费网站| 秋霞午夜鲁丝片午夜精品久| 日本一区二区三区在线 观看网站| 午夜久久久精品| 香蕉久久久久久狠狠色| 欧美激情亚洲| 天天艹综合| 全网免费在线播放视频入口| 色无极亚洲| 亚洲春色在线视频| 四虎网页| 亚洲成a人片8888kkkk| 亚洲天天综合网| 日韩系列在线| 亚洲第一区视频| 午夜喷水| 三级国产| 亚洲天堂视频在线播放| 亚洲欧美日韩动漫| 亚洲欧美另类在线视频| 热99精品在线| 人成免费a级毛片| 欧美高清人妖另类| 午夜毛片视频高清不卡免费| 日日摸人人看97人人澡| 欧美特级黄| 天堂激情网| 日韩avav| 欧美五级在线观看视频播放| 日韩专区在线| 日韩视频在线免费| 亚洲欧美日韩精品高清| 色综合天天色| 欧美亚洲欧美日韩中文二区| 亚洲青草| 天天天天天操| 欧美一区二区三区精品国产| 亚洲综合在线观看一区www| 亚欧成人中文字幕一区| 亚洲国产精品一区| 欧美日韩中文在线视频|