国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基2-booth乘法器原理及verilog代碼

這篇具有很好參考價(jià)值的文章主要介紹了基2-booth乘法器原理及verilog代碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.booth乘法器原理

對(duì)于一個(gè)n位的有符號(hào)二進(jìn)制數(shù)B,首位是0則B可以表示為:

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

首位是1,B[n-2:0]是實(shí)際數(shù)字的補(bǔ)碼,所以可以得到

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

可以得到合并的公式如下所示:

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

將公式展開:

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

除了n-1項(xiàng)外的每一項(xiàng)乘2之后再減去本身:

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

根據(jù)2^i重構(gòu)公式:

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

為了統(tǒng)一形式,添加一項(xiàng)B[-1],初始值為0.注意這里的B[-1]是一個(gè)單獨(dú)的寄存器,與B并沒有關(guān)系則B可以修改為

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

booth乘法器,乘法器,fpga開發(fā),51單片機(jī),stm32,單片機(jī),Powered by 金山文檔

2.乘法器模塊設(shè)計(jì)

對(duì)于上一章節(jié)的B的公式我們可以看出,實(shí)際關(guān)注的是B中相鄰兩位的大小,所以可以對(duì)B進(jìn)行移位處理即可每次只關(guān)注B[0]B[-1],同時(shí)A乘的2的i次方也是對(duì)A進(jìn)行移位。綜上我們可以構(gòu)建一個(gè)新的向量array,用來移位和計(jì)算累加和。

從i=0開始計(jì)算累加和,對(duì)累加和的計(jì)算總共有三種情況:

  1. { B[i],B[i-1] } = 2'b00或2'b11 :B[i-1]-B[i] = 0,無操作

  1. { B[i],B[i-1] } = 2'b01 :B[i-1]-B[i] = 1,相加

  1. { B[i],B[i-1]} = 2'b10 :B[i-1]-B[i] = -1,相減

不妨設(shè)計(jì)算兩個(gè)四位的二進(jìn)制數(shù)相乘,首先定義一個(gè)四位的寄存器Q用來計(jì)算累加和。在這里可能會(huì)有個(gè)疑問,四位二進(jìn)制數(shù)相加結(jié)果應(yīng)該是五位的數(shù),為什么這里只需要設(shè)四位。

所以array的實(shí)際組成是array = {Q,B,B[-1]};Q和B[-1]的初始值都是0.每次計(jì)算都是先根據(jù)B[0]B[-1]的結(jié)果,計(jì)算Q的值,然后進(jìn)行算術(shù)右移。并定義一個(gè)計(jì)數(shù)器用來計(jì)算執(zhí)行次數(shù),總次數(shù)即為B的位數(shù)。

我們可以發(fā)現(xiàn)第一次計(jì)算的Q到最后是移位到了最末端,這種計(jì)算方式和普通移位的區(qū)別是,普通方法是將2^i,左移i次,而本節(jié)的方式是將數(shù)從高位右移,實(shí)際結(jié)果相同。

下面給出7*(-5)的例子作為參考

-----------------------------------------初始化------------------------------------------

設(shè)4-bit A , 4-bit B , 4-bit Q ,1-bit B[-1]

A = 0111(7);

-A = 1001;

B = 1011(-5);

Q = 0000;

B[-1] = 0;

B[0]B[-1] = 10;

{Q,B,B[-1]} = 0000_1011_0;

-----------------------------------------count = 3---------------------------------------

----------------------------------------計(jì)算累加和---------------------------------------

B = 1011;

B[-1] = 0;

B[0]B[-1] = 10;

Q = Q - A = 1001;

{Q,B,B[-1]} = 1001_1011_0

--------------------------------------------移位-----------------------------------------

{Q,B,B[-1]} = 1100_1101_1

-----------------------------------------count = 2---------------------------------------

-----------------------------------------計(jì)算累加和-------------------------------------

Q = 1100;

B = 1101;

B[-1] = 1;

B[0]B[-1] = 11;無操作

Q = Q = 1100;

{Q,B,B[-1]} = 1100_1101_1

--------------------------------------------移位-----------------------------------------

{Q,B,B[-1]} = 1110_0110_1

-----------------------------------------count = 1---------------------------------------

-----------------------------------------計(jì)算累加和-------------------------------------

Q = 1110;

B = 0110;

B[-1] = 1;

B[0]B[-1] = 01;相加

Q = Q + A = 1110 + 0111 = 0101;

{Q,B,B[-1]} = 0101_0110_1

--------------------------------------------移位-----------------------------------------

{Q,B,B[-1]} = 0010_1011_0

-----------------------------------------count = 0---------------------------------------

-----------------------------------------計(jì)算累加和-------------------------------------

Q = 0010;

B = 1011;

B[-1] = 0;

B[0]B[-1] = 10;相減

Q = Q - A = 0010 + 1001 = 1011;

{Q,B,B[-1]} = 1011_1011_1;

--------------------------------------------移位-----------------------------------------

{Q,B,B[-1]} = 1101_1101_1;

--------------------------------------------輸出-----------------------------------------

CO = 1101_1101;

3.verilog代碼與testbench

3.1 verilog代碼

module boothmultiplier_radix2#(
    parameter size = 4 
)
(
    clk,
    rst_n,
    valid_i,
    receive_i,
    multiplicand_i,
    multiplier_i,
    busy_o,
    ready_o,
    result_o
);
    input wire clk;
    input wire rst_n;
    input wire valid_i;
    input wire receive_i;
    input wire signed [size-1:0] multiplicand_i;
    input wire signed [size-1:0] multiplier_i;
    output reg busy_o;
    output reg ready_o;
    output wire signed [2*size-1:0] result_o;

    reg signed [2*size:0] array;
    reg [size-1:0] M;
    reg [size-1:0] Q;
    reg [1:0] count;

    localparam STATE_IDLE  = 2'b00;
    localparam STATE_CALC  = 2'b01;
    localparam STATE_SHIFT = 2'b10;
    localparam STATE_END   = 2'b11;

    reg [1:0] state,next_state;

    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            state <= STATE_IDLE;
        end else begin
            state <= next_state;
        end
    end

    always@(*)begin
        if(!rst_n)begin
            next_state = STATE_IDLE;
        end else begin
            case (state)
                STATE_IDLE: begin
                    if(valid_i)begin
                        next_state = STATE_CALC;
                    end else begin
                        next_state = STATE_IDLE;
                    end
                end
                STATE_CALC: begin
                        next_state = STATE_SHIFT;
                end
                STATE_SHIFT: begin
                    if(count == 0)begin
                        next_state = STATE_END;
                    end else begin
                        next_state = STATE_CALC;
                    end
                end
                STATE_END: begin
                    if(receive_i)begin
                        next_state = STATE_IDLE;
                    end else begin
                        next_state = STATE_END;
                    end
                end
                default: next_state = STATE_IDLE;
            endcase
        end
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)begin
            array <= 'b0;
            M <= 'b0;
            Q <= 'b0;
            ready_o <= 1;
            busy_o <= 0;
            count <= 0;
        end else begin
            case(state)
                STATE_IDLE: begin
                    if(valid_i)begin
                        ready_o <= 0;
                        busy_o <= 1;
                        M <= multiplicand_i;
                        Q <= multiplier_i;
                        count <= 2'd3;
                        array <= {4'b0,multiplier_i,1'b0};
                    end else begin
                        array <= 'b0;
                        M <= 'b0;
                        Q <= 'b0;
                        ready_o <= 1;
                        busy_o <= 0;
                        count <= 2'b0;
                    end
                end
                STATE_CALC: begin
                    case({array[1:0]})
                        2'b00,2'b11:begin
                            array <= array;
                        end
                        2'b01:begin
                            array <= (array + {M[size-1:0],{(size+1){1'b0}}});
                        end
                        2'b10:begin
                            array <= (array - {M[size-1:0],{(size+1){1'b0}}});
                        end
                    endcase
                end
                STATE_SHIFT: begin
                    if(count != 0)begin
                        count <= count -1; 
                    end else begin
                        count <= 2'd3;
                        busy_o <= 0;
                        ready_o <= 1;
                    end
                    array <= array >>> 1;
                end
                STATE_END: begin
                    if(receive_i)begin
                        busy_o <= 0;
                        ready_o <= 1;
                    end else begin
                        busy_o <= 1;
                        ready_o <= 0;
                    end
                end
                default: begin
                    array <= 'b0;
                    M <= 'b0;
                    Q <= 'b0;
                    busy_o <= 0;
                    count <= 2'd3;
                end
            endcase
        end
    end

    assign result_o = (state == STATE_END)?array[8:1]:0;
endmodule

3.2 testbench

module Top_tb
();
    reg clk;
    reg rst_n;
    reg valid_i;
    reg signed [3:0] multiplicand_i;
    reg signed [3:0] multiplier_i;
    reg receive_i;

    wire [3:0]result_o;
    wire ready_o;
    wire busy_o;
    boothmultiplier_radix2#(
        .size(4)
    )
    UUT(
        .clk(clk),
        .rst_n(rst_n),
        .valid_i(valid_i),
        .receive_i(receive_i),
        .multiplicand_i(multiplicand_i),
        .multiplier_i(multiplier_i),
        .busy_o(busy_o),
        .ready_o(ready_o),
        .result_o(result_o)
    );
    
    initial begin
        clk = 0;
        rst_n = 0;
        #100
        rst_n = 1;
        #100
        wait(clk);
        multiplicand_i = 4'b0111;
        multiplier_i = 4'b1011;
        valid_i = 1;
        #20
        valid_i = 0;
        wait(ready_o);
        receive_i = 1;
        multiplicand_i = 4'b0101;
        multiplier_i = 4'b1001;
        valid_i = 1;
        #1000
        $stop;
    end

    always #10 clk = ~clk;
endmodule

4.評(píng)價(jià)與展望

1、由于計(jì)算和移位在同一周期內(nèi)實(shí)現(xiàn)并不是很好寫,也為了更加直觀,代碼中將計(jì)算和移位分在兩個(gè)周期中完成,導(dǎo)致計(jì)算速度會(huì)將近降了一倍。

2、輸出result_o采用的是wire類型輸出,也可修改為reg輸出,更加穩(wěn)定。

3、后續(xù)可加入流水線,增加數(shù)據(jù)吞吐量。

4、testbench并不完整,只是給了個(gè)框架,有興趣的朋友可以完善一下。文章來源地址http://www.zghlxwxcb.cn/news/detail-775379.html

到了這里,關(guān)于基2-booth乘法器原理及verilog代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于FPGA的3位二進(jìn)制的乘法器VHDL代碼Quartus 開發(fā)板

    基于FPGA的3位二進(jìn)制的乘法器VHDL代碼Quartus 開發(fā)板

    名稱:基于FPGA的3位二進(jìn)制的乘法器VHDL代碼Quartus? 開發(fā)板(文末獲取) 軟件:Quartus 語言:VHDL 代碼功能: 3位二進(jìn)制的乘法器 該乘法器實(shí)現(xiàn)兩個(gè)三位二進(jìn)制的乘法,二極管LED2~LED0顯示輸入的被乘數(shù),LED5~LED3顯示乘數(shù),數(shù)碼管顯示相應(yīng)的十進(jìn)制輸入值和輸出結(jié)果 本代碼已在開

    2024年02月21日
    瀏覽(22)
  • m基于FPGA的半帶濾波器verilog設(shè)計(jì),對(duì)比普通結(jié)構(gòu)以及乘法器復(fù)用結(jié)構(gòu)

    m基于FPGA的半帶濾波器verilog設(shè)計(jì),對(duì)比普通結(jié)構(gòu)以及乘法器復(fù)用結(jié)構(gòu)

    目錄 1.算法描述 2.仿真效果預(yù)覽 3.verilog核心程序 4.完整FPGA ? ? ? ? HBF模塊由半帶濾波器(HBF)和抽取模塊組成。該模塊的任務(wù)是實(shí)現(xiàn)2倍抽取進(jìn)一步降低信號(hào)采樣速率。由于HBF的沖激響應(yīng)h(k)除零點(diǎn)外其余偶數(shù)點(diǎn)均為零,所以用HBF實(shí)現(xiàn)2倍抽取可以節(jié)省一半的運(yùn)算量,對(duì)增強(qiáng)軟

    2023年04月08日
    瀏覽(32)
  • 基于FPGA的任意位寬乘法器VHDL代碼Quartus仿真

    基于FPGA的任意位寬乘法器VHDL代碼Quartus仿真

    名稱:基于FPGA的任意位寬乘法器VHDL代碼Quartus仿真(文末獲?。?軟件:Quartus 語言:VHDL 代碼功能: 任意位寬乘法器 設(shè)計(jì)一個(gè)任意位寬乘法器,通過可調(diào)參數(shù)N,可以配置為任意位寬,N可以自由修改 可調(diào)參數(shù)N定義如下: N : INTEGER := 16--N位乘法器,N可以自由修改,默認(rèn)為16位

    2024年02月21日
    瀏覽(18)
  • 數(shù)字IC經(jīng)典電路(2)——經(jīng)典乘法器的實(shí)現(xiàn)(乘法器簡(jiǎn)介及Verilog實(shí)現(xiàn))

    數(shù)字IC經(jīng)典電路(2)——經(jīng)典乘法器的實(shí)現(xiàn)(乘法器簡(jiǎn)介及Verilog實(shí)現(xiàn))

    數(shù)字電路中乘法器是一種常見的電子元件,其基本含義是將兩個(gè)數(shù)字相乘,并輸出其乘積。與加法器不同,乘法器可以實(shí)現(xiàn)更復(fù)雜的運(yùn)算,因此在數(shù)字電路系統(tǒng)中有著廣泛的應(yīng)用。 乘法器的主要用途是在數(shù)字信號(hào)處理、計(jì)算機(jī)科學(xué)以及其他數(shù)字電路應(yīng)用中進(jìn)行精確的數(shù)字乘法

    2024年02月06日
    瀏覽(102)
  • verilog編程之乘法器的實(shí)現(xiàn)

    verilog編程之乘法器的實(shí)現(xiàn)

    知識(shí)儲(chǔ)備 首先來回顧一下乘法是如何在計(jì)算機(jī)中實(shí)現(xiàn)的。 假設(shè)現(xiàn)在有兩個(gè)32位帶符號(hào)定點(diǎn)整數(shù)x和y,我們現(xiàn)在要讓x和y相乘,然后把乘積存放在z中,大家知道,兩個(gè)32位數(shù)相乘,結(jié)果不會(huì)超過64位,因此z的長度應(yīng)該為64位。 z = x * y中,x是被乘數(shù),在Verilog代碼中 multiplicand表示

    2024年04月12日
    瀏覽(23)
  • FPGA中除法器IP核乘法器IP核使用

    FPGA中除法器IP核乘法器IP核使用

    1.除法器IP核有兩種,3.0是最大支持32bit的被除數(shù)除數(shù);4.0是最大支持64bit的被除數(shù)除數(shù);研究電機(jī)時(shí)需要計(jì)算步數(shù),都僅僅需要32bit因此選擇3.0; 2.有兩種類型 (1)remainder 余數(shù) (2)fractional:小數(shù) (3)dividend:被除數(shù) (4)divisior: 除數(shù) (5)quotient : 商 選擇無符號(hào)數(shù)據(jù),余

    2024年02月01日
    瀏覽(22)
  • xilinx FPGA 乘法器ip核(multipler)的使用(VHDL&Vivado)

    xilinx FPGA 乘法器ip核(multipler)的使用(VHDL&Vivado)

    一、創(chuàng)建除法ip核 ?可以選擇兩個(gè)變量數(shù)相乘,也可以選擇一個(gè)變量輸入數(shù)據(jù)和一個(gè)常數(shù)相乘 可以選擇mult(dsp資源)或者lut(fpga資源) 可以選擇速度優(yōu)先或者面積優(yōu)先 可以自己選擇輸出位寬 還有時(shí)鐘使能和復(fù)位功能 ?二、編寫VHDL程序:聲明和例化乘法器ip核 三、編寫仿真程

    2024年02月11日
    瀏覽(30)
  • 計(jì)算機(jī)組成原理3個(gè)實(shí)驗(yàn)-logisim實(shí)現(xiàn)“七段數(shù)碼管”、“有限狀態(tài)機(jī)控制的8*8位乘法器”、“單周期MIPS CPU設(shè)計(jì)”。

    計(jì)算機(jī)組成原理3個(gè)實(shí)驗(yàn)-logisim實(shí)現(xiàn)“七段數(shù)碼管”、“有限狀態(tài)機(jī)控制的8*8位乘法器”、“單周期MIPS CPU設(shè)計(jì)”。

    目錄 標(biāo)題1.首先是七段數(shù)碼管? ?標(biāo)題二:有限狀態(tài)機(jī)控制的8*8位乘法器 標(biāo)題三:?jiǎn)沃芷贛IPS CPU設(shè)計(jì) 1看一下實(shí)驗(yàn)要求: ? ?2.接下來就是詳細(xì)設(shè)計(jì): 1. 組合邏輯設(shè)計(jì) ? ? ? ?由于7段數(shù)碼管由7個(gè)發(fā)光的數(shù)碼管構(gòu)成,因?yàn)槲覀兿胗枚M(jìn)制將0-9這幾個(gè)數(shù)字表示出來。所以他需要

    2024年01月17日
    瀏覽(50)
  • Logism · 原碼一位乘法器 實(shí)驗(yàn)

    Logism · 原碼一位乘法器 實(shí)驗(yàn)

    8位無符號(hào)的原碼一位乘法器的實(shí)現(xiàn) 通過時(shí)鐘驅(qū)動(dòng)右移,模擬運(yùn)算過程 實(shí)現(xiàn)脈沖控制,位移指定次數(shù)后要及時(shí)停止 結(jié)果輸出給到乘積隧道 ????????A.掌握寄存器、分離器、比較器等一系列新的邏輯元件使用方法 ????????B.學(xué)習(xí)并運(yùn)用計(jì)算機(jī)原碼乘法原理,在硬件電路中

    2023年04月25日
    瀏覽(21)
  • FPGA流水線除法器(Verilog)原理及實(shí)現(xiàn)

    FPGA流水線除法器(Verilog)原理及實(shí)現(xiàn)

    ??除法器的計(jì)算過程如下圖所示。 假設(shè)數(shù)值的位寬為N。 Step1:分別將被除數(shù)和除數(shù)擴(kuò)展至原來2倍位寬(2N),被除數(shù)在其左邊補(bǔ)N位0,除數(shù)在其右邊補(bǔ)N位0; Step2:將被除數(shù)依次左移(每次左移1位),末位補(bǔ)數(shù)值(該數(shù)值為被除數(shù)高N位與除數(shù)高N位的商),高N位為被除數(shù)高

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包