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

Verilog | 基4 booth乘法器

這篇具有很好參考價值的文章主要介紹了Verilog | 基4 booth乘法器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

上接乘法器介紹

原理

跟基2的算法一樣,假設(shè)A和B是乘數(shù)和被乘數(shù),且有:

A = ( a 2 n + 1 a 2 n ) a 2 n ? 1 a 2 n ? 2 … a 1 a 0 ( a ? 1 ) B = b 2 n ? 1 b 2 n ? 2 … b 1 b 0 \begin{align}A=&(a_{2n+1}a_{2n})a_{2n?1}a_{2n?2}…a_1a_0(a_{?1})\\ B=&b_{2n?1}b_{2n?2}…b_1b_0\end{align} A=B=?(a2n+1?a2n?)a2n?1?a2n?2?a1?a0?(a?1?)b2n?1?b2n?2?b1?b0???

其中, a ? 1 a_{?1} a?1?是末尾補的0, a 2 n , a 2 n + 1 a_{2n},a_{2n+1} a2n?,a2n+1?是擴展的兩位符號位。可以將乘數(shù)A表示為:

A = ( ? 1 ? a 2 n ? 1 ) 2 2 n ? 1 + a 2 n ? 2 ? 2 2 n ? 2 + ? + a 1 ? 2 + a 0 A=(?1?a_{2n?1})2^{2n?1}+a_{2n?2}?2^{2n?2}+?+a_1?2+a_0 A=(?1?a2n?1?)22n?1+a2n?2??22n?2+?+a1??2+a0?

同樣可以將兩數(shù)的積表示為:

A B = ( a ? 1 + a 0 ? 2 a 1 ) × B × 2 0 + ( a 1 + a 2 ? 2 a 3 ) × B × 2 2 + ( a 3 + a 4 ? 2 a 5 ) × B × 2 4 + … + ( a 2 n ? 1 + a 2 n ? 2 a 2 n + 1 ) × B × 2 2 n = B × [ ∑ k = 0 n ( a 2 k ? 1 + a 2 k ? 2 a 2 k + 1 ) ? 2 2 k ] = B × V a l ( A ) \begin{align}AB&=(a_{?1}+a_0?2a_1)×B×2^0+(a_1+a_2?2a_3)×B×2^2\\ &+(a_3+a_4?2a_5)×B×2^4+…\\ &+(a_{2n?1}+a_{2n}?2a_{2n+1})×B×2^{2n}\\ &\red{=B×[∑_{k=0}^n(a_{2k?1}+a_{2k}?2a_{2k+1})?2^{2k}]}\\ &=B×Val(A)\end{align} AB?=(a?1?+a0??2a1?)×B×20+(a1?+a2??2a3?)×B×22+(a3?+a4??2a5?)×B×24++(a2n?1?+a2n??2a2n+1?)×B×22n=B×[k=0n?(a2k?1?+a2k??2a2k+1?)?22k]=B×Val(A)??

紅色部分即為基4booth的編碼方式。

算法實現(xiàn)

乘數(shù)位 ( a 2 k ? 1 + a 2 k ? 2 a 2 k + 1 ) (a_{2k?1}+a_{2k}?2a_{2k+1}) (a2k?1?+a2k??2a2k+1?) 編碼操作
000 0
001 +B
010 +B
011 +2B
100 -2B
101 -B
110 -B
111 0
所有操作過后都會移位兩次。

Verilog 代碼

`timescale 1ns / 1ps

module booth4_mul #(
    parameter WIDTH_M = 8,
    parameter WIDTH_R = 8
) (
    input                            clk,
    input                            rstn,
    input                            vld_in,
    input      [        WIDTH_M-1:0] multiplicand,
    input      [        WIDTH_R-1:0] multiplier,
    output     [WIDTH_M+WIDTH_R-1:0] mul_out,
    output reg                       done
);
    parameter IDLE = 2'b00, ADD = 2'b01, SHIFT = 2'b11, OUTPUT = 2'b10;

    reg [1:0] current_state, next_state;

    reg [WIDTH_M+WIDTH_R+2:0] add1;
    reg [WIDTH_M+WIDTH_R+2:0] sub1;
    reg [WIDTH_M+WIDTH_R+2:0] add_x2;
    reg [WIDTH_M+WIDTH_R+2:0] sub_x2;
    reg [WIDTH_M+WIDTH_R+2:0] p_dct;
    reg [        WIDTH_R-1:0] count;

    always @(posedge clk or negedge rstn)
        if (!rstn) current_state = IDLE;
        else if (!vld_in) current_state = IDLE;
        else current_state <= next_state;

    always @* begin
        next_state = 2'bx;
        case (current_state)
            IDLE:    if (vld_in) next_state = ADD;
	 else next_state = IDLE;
            ADD:     next_state = SHIFT;
            SHIFT:   if (count == WIDTH_R / 2) next_state = OUTPUT;
 else next_state = ADD;
            OUTPUT:  next_state = IDLE;
            default: next_state = IDLE;
        endcase
    end

    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            {add1, sub1, add_x2, sub_x2, p_dct, count, done} <= 0;
        end else begin
            case (current_state)
                IDLE: begin
                    add1   <= {{2{multiplicand[WIDTH_R-1]}}, multiplicand, {WIDTH_R + 1{1'b0}}};
                    sub1   <= {-{{2{multiplicand[WIDTH_R-1]}}, multiplicand}, {WIDTH_R + 1{1'b0}}};
                    add_x2 <= {{multiplicand[WIDTH_M-1], multiplicand, 1'b0}, {WIDTH_R + 1{1'b0}}};
                    sub_x2 <= {-{multiplicand[WIDTH_M-1], multiplicand, 1'b0}, {WIDTH_R + 1{1'b0}}};
                    p_dct  <= {{WIDTH_M + 1{1'b0}}, multiplier, 1'b0};
                    count  <= 0;
                    done   <= 0;
                end
                ADD: begin
                    case (p_dct[2:0])
                        3'b000, 3'b111: p_dct <= p_dct;
                        3'b001, 3'b010: p_dct <= p_dct + add1;
                        3'b101, 3'b110: p_dct <= p_dct + sub1;
                        3'b100:         p_dct <= p_dct + sub_x2;
                        3'b011:         p_dct <= p_dct + add_x2;
                        default:        p_dct <= p_dct;
                    endcase
                    count <= count + 1;
                end
                SHIFT: p_dct <= {p_dct[WIDTH_M+WIDTH_R+2], p_dct[WIDTH_M+WIDTH_R+2], p_dct[WIDTH_M+WIDTH_R+2:2]};

                OUTPUT: begin
                    done <= 1;
                end
            endcase
        end
    end

    assign mul_out = p_dct[WIDTH_M+WIDTH_R:1];

endmodule

testbench:

`timescale 1ns / 1ps

module booth4_mul_tb ();
    `define TEST_WIDTH 8

    parameter WIDTH_M = `TEST_WIDTH;
    parameter WIDTH_R = `TEST_WIDTH;

    reg                               clk;
    reg                               rstn;
    reg                               vld_in;
    reg         [        WIDTH_M-1:0] multiplicand;
    reg         [        WIDTH_R-1:0] multiplier;

    wire        [WIDTH_M+WIDTH_R-1:0] mul_out;
    wire                              done;
    //輸入 :要定義有符號和符號,輸出:無要求
    wire signed [    `TEST_WIDTH-1:0] m1_in;
    wire signed [    `TEST_WIDTH-1:0] m2_in;

    reg signed  [  2*`TEST_WIDTH-1:0] product_ref;
    reg         [  2*`TEST_WIDTH-1:0] product_ref_u;

    assign m1_in = multiplier[`TEST_WIDTH-1:0];
    assign m2_in = multiplicand[`TEST_WIDTH-1:0];

    always #1 clk = ~clk;
    integer i, j;
    integer num_good;
    initial begin
        clk          = 0;
        vld_in       = 0;
        multiplicand = 0;
        multiplier   = 0;
        num_good     = 0;
        rstn         = 1;
        #4 rstn = 0;
        #2 rstn = 1;
        repeat (2) @(posedge clk);
        for (i = 0; i < (1 << `TEST_WIDTH); i = i + 1) begin
            for (j = 0; j < (1 << `TEST_WIDTH); j = j + 1) begin
                vld_in = 1;
                wait (done == 0);
                wait (done == 1);
                product_ref   = m1_in * m2_in;
                product_ref_u = m1_in * m2_in;
                if (product_ref != mul_out) begin
                    $display("multiplier = %d multiplicand = %d proudct =%d", m1_in, m2_in, mul_out);
                    @(posedge clk);
                    $stop;
                end else begin
                    num_good = num_good + 1;
                end
                multiplicand = multiplicand + 1;
            end
            multiplier = multiplier + 1;
        end
        $display("sim done. num good = %d", num_good);
        $finish;

    end

    booth4_mul #(
        .WIDTH_M(WIDTH_M),
        .WIDTH_R(WIDTH_R)
    ) U_BOOTH_RADIX4_0 (
        .clk         (clk),
        .rstn        (rstn),
        .vld_in      (vld_in),
        .multiplicand(multiplicand),
        .multiplier  (multiplier),
        .mul_out     (mul_out),
        .done        (done)
    );

    initial begin
        $fsdbDumpfile("tb.fsdb");
        $fsdbDumpvars;
        $fsdbDumpMDA();
        $dumpvars();
    end

endmodule

仿真波形圖:
Verilog | 基4 booth乘法器文章來源地址http://www.zghlxwxcb.cn/news/detail-495318.html

到了這里,關(guān)于Verilog | 基4 booth乘法器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

    2024年04月12日
    瀏覽(23)
  • 基于FPGA的64bit算術(shù)乘法器設(shè)計Verilog代碼Quartus仿真

    基于FPGA的64bit算術(shù)乘法器設(shè)計Verilog代碼Quartus仿真

    名稱:基于FPGA的64bit算術(shù)乘法器設(shè)計Verilog代碼Quartus仿真(文末獲?。?軟件:Quartus 語言:Verilog 代碼功能: Verilog HDL設(shè)計64bits算術(shù)乘法器 基本功能 1.用 Veriloghdl設(shè)計實現(xiàn)64bit二進制整數(shù)乘法器,底層乘法器使用16*168*88*328*16小位寬乘法器來實現(xiàn)底層乘法器可以使用FPGA內(nèi)部P實現(xiàn)

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

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

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

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

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

    目錄 標(biāo)題1.首先是七段數(shù)碼管? ?標(biāo)題二:有限狀態(tài)機控制的8*8位乘法器 標(biāo)題三:單周期MIPS CPU設(shè)計 1看一下實驗要求: ? ?2.接下來就是詳細(xì)設(shè)計: 1. 組合邏輯設(shè)計 ? ? ? ?由于7段數(shù)碼管由7個發(fā)光的數(shù)碼管構(gòu)成,因為我們想用二進制將0-9這幾個數(shù)字表示出來。所以他需要

    2024年01月17日
    瀏覽(50)
  • FPGA中除法器IP核乘法器IP核使用

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

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

    2024年02月01日
    瀏覽(22)
  • Logism · 原碼一位乘法器 實驗

    Logism · 原碼一位乘法器 實驗

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

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

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

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

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

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

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

    2024年02月11日
    瀏覽(30)
  • 基于FPGA的3位二進制的乘法器VHDL代碼Quartus 開發(fā)板

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

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

    2024年02月21日
    瀏覽(22)
  • 補碼一位乘法(Booth算法)

    補碼一位乘法(Booth算法)

    在補碼一位乘法的求解過程中我們需要的東西:[X]補,[Y]補以及被乘數(shù)的相反數(shù)的補碼[-X]補 一.運算規(guī)則 1.符號位參與計算 2.采用補碼進行計算 3.被乘數(shù)X 一般取雙符號位參與計算,并且讓部分積初始值為0,長度與被乘數(shù)X相同,乘數(shù)Y 可取單符號位 4.開始計算時,乘數(shù)Y 末尾

    2024年02月11日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包