色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

探究比特對編碼與比特對編碼乘法器的設計

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2021-05-08 09:22 ? 次閱讀

比特對編碼與比特對編碼乘法器的設計

今天一起看看比特對編碼(有的也把它稱為基4booth編碼,名字不重要,主要是思想),可以解決上文中提到的問題

比特對編碼原理

booth重編碼的主要問題在于不能過濾掉010這樣序列。故考慮將通過連續相鄰兩位進行編碼,每次從低位向高位移動1位的方式(即booth比編碼),變成連續相鄰3位進行編碼,每次從低位向高位移動2位的方式(比特對編碼)。先討論其原理。

一個數我們考慮從低位向高位對其進行編碼,使其變成4進制(基4)的表示形式,每兩位二進制表示一位的四進制數。

3(2'b11)比4少1,2(2'b10)比4少2。在4進制數中,2需要向前進位則需要減去2再向前進位;3需要向前進位則需要減去1再向前進位。

我們的比特對編碼就是基于上述原理來的。

下面給出比特對編碼規律,如下表和圖所示,圖為一個實例,是對1011_1111的編碼,其表示-65。比特對編碼結果為 -1 00-1,故其表示的十進制d為:

d=-4^3 -4^0= -65

db1c8f96-af27-11eb-bf61-12bb97331649.png

db4d6756-af27-11eb-bf61-12bb97331649.png

再舉個例子,比如對0001_1001進行比特對編碼,得到編碼為:

+2-2+1

故其表示的十進制計算如下:

d=2*(4^2) -2*(4^1) +4^0

=32+8+1=41

其中的乘2與乘4都可以通過移位操作來實現,這就是為什么需要這么編碼的原因。

可以看到,每相鄰三位進行編碼,其中的最低位mi-1 其實表示來自前面的進位。故當其為 001時,得到的編碼為 +1(表示4),011時最低位1表示進位,故編碼為1+1=+2。

從中可以得出,對于8位二進制數0101_0101,經過比特對編碼后,得到的是 +1 +1 +1 +1,其表示的數為:

4^3 + 4^2 + 4^1 + 4^0 =

64+16+4+1=85

此時只需要進行3次加法運算,不會存在booth編碼所存在的問題。

同時發現對于數據位寬非偶數的數,我們需要將其在最高位補填一位符號位,再進行比特對編碼。

比特對編碼(對乘數進行編碼)乘法器,需要進行的加法次數為乘數位寬的一半。

比特對編碼乘法器設計

設計思想概敘:定義位寬為DW_A+DW_B+2的product寄存器(DW_A為被乘數a的位寬,DW_B為乘數b的位寬)。當in_valid與in_ready同時為高時,將乘數b(位寬為b)加載到product的低DW_B位。然后在計算狀態下(executing),將每次加法器的輸出放到product的高位,并每個時鐘周期將product右移2位。每個時鐘周期,通過對

m={product[1:0],prd_r[1]}

(其中prd_r[1]為上一個時鐘product的第二位)進行編碼,得出本次操作是加1、加2,減1,減2,還是不用做加減法(編碼為0)(代碼中上述五種操作對應的標志信號分別為add_1,add_2,sub_1,sub_2,noneed_add)。并將加法結果每次存到product寄存器的高位。

這里有個巧妙的思想就是,每個時鐘周期通過對product右移2位,再將其高DW_A位與a或者a*2進行相加或者相減操作,正好相當于每次product不動,把a或者a*2左移2位(乘以4)。這個思想源于《Verilog HDL 高級數字設計》中的精簡寄存器時序乘法器設計。

注意,這里是有符號數乘法器,每次左移需要在高位補符號位,故左移不能簡單的用 >> 描述(>>左移默認高位填0),具體描述見代碼。

其中減法采用加上這個數的補碼的方式;通過一個計數器(cnt)來指示什么時候結束運算;其中運算控制狀態機采用《狀態機的第四種描述方式》編寫;條件選擇多采用與或方式實現。

設計Verilog如下(dff_with_en為寄存器):

module radix4_mul #( parameter DW_A = 16, parameter DW_B = 8)( input clk, input rst_n, input in_valid, output in_ready, input flush, output o_valid, input o_ready, input [DW_A-1:0] a, input [DW_B-1:0] b, output [DW_A+DW_B-1:0] mul_res); //state machine for mulwire state;wire [$clog2((DW_B+1)/2):0] cnt;

wire exe_cnt_final = (cnt == (DW_B+1)/2); wire execute_en = in_valid&in_ready; localparam GET_DATA = 1'b0;localparam EXECUTING = 1'b1; wire curr_get_data = (state == GET_DATA);wire curr_executing = (state == EXECUTING); wire is_executing = curr_executing & (~exe_cnt_final);

wire nxt_get_data_en = (curr_executing & exe_cnt_final & o_ready) | flush;wire nxt_executing = curr_get_data & execute_en; wire nxt_state = (nxt_get_data_en & GET_DATA) | (nxt_executing & EXECUTING); wire tran_en = nxt_get_data_en | nxt_executing; dff_with_en #( .DW(1))dff_state( .clk (clk), .rst_n (rst_n), .enable (tran_en), .d_in (nxt_state), .q_out (state)); //cnt//wire [$clog2((DW_B+1)/2):0] cnt_nxt = curr_executing ? cnt+1 : 'h0; dff_with_en #( .DW($clog2((DW_B+1)/2)+1))dff_cnt( .clk (clk), .rst_n (rst_n), .enable (1'b1), .d_in (cnt_nxt), .q_out (cnt));

//get the awire [DW_A-1:0] a_d;wire [DW_A-1:0] nxt_a_d = nxt_executing ? a : a_d; dff_with_en #( .DW(DW_A))dff_a( .clk (clk), .rst_n (rst_n), .enable (1'b1), .d_in (nxt_a_d), .q_out (a_d));//radix 4 codingwire prd_r;wire [DW_A+DW_B+1:0] product;//wire [DW_B-1:0] b_shift;wire [2:0] m = is_executing ? {product[1:0],prd_r} : 3'b000; wire add_1 = (m == 3'b001) | (m == 3'b010);wire add_2 = (m == 3'b011);wire sub_1 = (m == 3'b110) | (m == 3'b101);wire sub_2 = (m == 3'b100); //wire [DW_A+DW_B+1:0] product; wire [DW_A+1:0] adder_op1 = ( {DW_A+2{add_1}}& { {2{a_d[DW_A-1]}},a_d} ) | ( {DW_A+2{add_2}}& { {1{a_d[DW_A-1]}},a_d,1'b0} ) | ( {DW_A+2{sub_1}}& (~{ {2{a_d[DW_A-1]}},a_d}) ) | ( {DW_A+2{sub_2}}& (~{ {1{a_d[DW_A-1]}},a_d,1'b0})); wire add_en = (add_1 | add_2 | sub_1 | sub_2)& is_executing;

wire noneed_add = is_executing & (~(add_1 | add_2 | sub_1 | sub_2)); wire [DW_A+1:0] adder_op2 = product[DW_A+DW_B+1:DW_B]; wire adder_cin = sub_1|sub_2; wire [DW_A+1:0] adder_res = adder_op1 + adder_op2 + adder_cin; wire [DW_A+DW_B+1:0] nxt_product = ({DW_A+DW_B+2{add_en}} &{{2{adder_res[DW_A+1]}},adder_res,product[DW_B-1:2]})| ({DW_A+DW_B+2{noneed_add}} & {{2{product[DW_A+DW_B+1]}},product[DW_A+DW_B+1:2]}) | ({DW_A+DW_B+2{o_valid}} & product) | ({DW_A+DW_B+2{nxt_executing}} & {{DW_A+2{1'b0}},b}); dff_with_en #( .DW(DW_A+DW_B+2))dff_product( .clk (clk), .rst_n (rst_n), .enable (1'b1),

.d_in (nxt_product), .q_out (product)); wire prd_nxt = curr_get_data ? 1'b0 : product[1]; dff_with_en #( .DW(1))dff_prd( .clk (clk), .rst_n (rst_n), .enable (1'b1), .d_in (prd_nxt), .q_out (prd_r));assign in_ready = curr_get_data;assign o_valid = exe_cnt_final;assign mul_res = product[DW_A+DW_B-1:0]; endmodule

如果乘數b位寬為奇數,請補一位符號位,變成偶數位寬,再輸入。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120256
  • 計數器
    +關注

    關注

    32

    文章

    2256

    瀏覽量

    94485
  • 乘法器
    +關注

    關注

    8

    文章

    205

    瀏覽量

    37046

原文標題:比特對編碼與比特對編碼乘法器的設計

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助,LMX2572LP參考時鐘路徑中的乘法器MULT的輸入頻率范圍問題求解

    在lmx2572LP的參考時鐘輸入路徑中,有一個乘法器MULT,其輸入頻率范圍在手冊中描述為10Mhz~40MHz。當我在TICS Pro軟件中進行配置時,這個乘法器提示我“Maximum
    發表于 11-08 11:36

    MPY634做基本乘法器遇到的疑問求解

    我是按圖所接.X2,Y2直接接地.但是乘法器輸出波形會跳.示波器是用直流偶合.DC一時是正的一時是負的.怎么回事?
    發表于 09-25 06:06

    請問如何用VCA810實現模擬乘法器

    我在《德州儀器高性能單片機和模擬器件在高校中的應用和選型指南》中看見,書中說VCA810可以做為模擬乘法器使用,但是應用手冊里的公式卻不是V0=VC*Vin,而是一個帶指數向的公式,所以我很好
    發表于 09-23 07:11

    請問VCA822做成四象限乘法器的帶寬是多少?

    如題,根據VCA822數據手冊中的四象限乘法器的原理圖,該電路的帶寬能達到多少?
    發表于 09-11 06:12

    CDCS504-Q1時鐘緩沖器和時鐘乘法器數據表

    電子發燒友網站提供《CDCS504-Q1時鐘緩沖器和時鐘乘法器數據表.pdf》資料免費下載
    發表于 08-23 10:35 ?0次下載
    CDCS504-Q1時鐘緩沖器和時鐘<b class='flag-5'>乘法器</b>數據表

    CDCVF25084時鐘乘法器數據表

    電子發燒友網站提供《CDCVF25084時鐘乘法器數據表.pdf》資料免費下載
    發表于 08-22 11:33 ?0次下載
    CDCVF25084時鐘<b class='flag-5'>乘法器</b>數據表

    CDCF5801A具有延遲控制和相位對準的時鐘乘法器數據表

    電子發燒友網站提供《CDCF5801A具有延遲控制和相位對準的時鐘乘法器數據表.pdf》資料免費下載
    發表于 08-22 10:56 ?0次下載
    CDCF5801A具有延遲控制和相位對準的時鐘<b class='flag-5'>乘法器</b>數據表

    CDCF5801時鐘乘法器數據表

    電子發燒友網站提供《CDCF5801時鐘乘法器數據表.pdf》資料免費下載
    發表于 08-22 10:37 ?0次下載
    CDCF5801時鐘<b class='flag-5'>乘法器</b>數據表

    CDCE906 PLL頻率合成器/乘法器/分頻器數據表

    電子發燒友網站提供《CDCE906 PLL頻率合成器/乘法器/分頻器數據表.pdf》資料免費下載
    發表于 08-22 09:30 ?0次下載
    CDCE906 PLL頻率合成器/<b class='flag-5'>乘法器</b>/分頻器數據表

    CDCS503帶可選SSC的時鐘緩沖器/時鐘乘法器數據表

    電子發燒友網站提供《CDCS503帶可選SSC的時鐘緩沖器/時鐘乘法器數據表.pdf》資料免費下載
    發表于 08-22 09:18 ?0次下載
    CDCS503帶可選SSC的時鐘緩沖器/時鐘<b class='flag-5'>乘法器</b>數據表

    SN5497、SN7497同步6位二進制速率乘法器數據表

    電子發燒友網站提供《SN5497、SN7497同步6位二進制速率乘法器數據表.pdf》資料免費下載
    發表于 06-03 09:24 ?2次下載
    SN5497、SN7497同步6位二進制速率<b class='flag-5'>乘法器</b>數據表

    AD630可以被用作這種乘法器嗎?怎么使用AD630實現兩個信號相乘呢?

    AD630芯片可以被用作這種乘法器嗎?怎么使用AD630芯片實現兩個信號相乘呢?
    發表于 05-30 08:26

    CMOSBCD速率乘法器CD4527B TYPES 數據表

    電子發燒友網站提供《CMOSBCD速率乘法器CD4527B TYPES 數據表.pdf》資料免費下載
    發表于 05-21 09:19 ?0次下載
    CMOSBCD速率<b class='flag-5'>乘法器</b>CD4527B TYPES 數據表

    CMOS二進制速率乘法器CD4089B TYPES 數據表

    電子發燒友網站提供《CMOS二進制速率乘法器CD4089B TYPES 數據表.pdf》資料免費下載
    發表于 05-21 09:17 ?0次下載
    CMOS二進制速率<b class='flag-5'>乘法器</b>CD4089B TYPES 數據表

    如何設計一個16比特的減法器呢?

    減法電路是基本集成運放電路的一種,算術運算電路主要包括數字**加法器電路、數字減法器電路、數字乘法器電路和數字除法器電路。
    的頭像 發表于 02-19 10:00 ?885次閱讀
    如何設計一個16<b class='flag-5'>比特</b>的減<b class='flag-5'>法器</b>呢?
    主站蜘蛛池模板: 中国老太60old mantv| 思思99精品国产自在现线| 欧美高清另类video| 欧美牲交A欧美牲交VDO| 日韩免费视频一区| 小SB几天没做SAO死了H| 亚洲男人在线观看| 4455永久在线毛片观看| max girls 大感谢祭| 国产GV天堂亚洲国产GV刚刚碰| 国产精品亚洲国产三区| 黃色带三级a级| 久久有码中文字幕| 青青草在线视频| 天堂网久久| 永久免费看bbb| qvod电影| 国产呦精品一区二区三区网站| 国产精品九九九久久九九| xxxx69美国| PORN白嫩内射合集| 东北老妇xxxxhd| 国语自产视频在线不卡| 毛片内射久久久一区| 日韩男明星| 亚洲精品123区| 99久久无码一区人妻A片竹菊| 国产成人小视频| 久久女婷五月综合色啪| 日本高清免费看| 亚洲国产高清在线观看视频| 97人人碰免费视频公开| 国产精品99精品无码视亚| 久久天天综合| 射漂亮黑b丝女| 中文字幕中文字幕永久免费| 二级毛片在线观看| 久久亚洲精品专区蓝色区| 婷婷精品国产亚洲AV在线观看 | 美女视频黄色的| 手机在线看片欧美亚洲|