我是靠谱客的博主 寂寞小甜瓜,最近开发中收集的这篇文章主要介绍基于 FPGA 的高级数字电路设计(4)Booth 乘法器设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、基 4 RTL 代码


`timescale 1ns / 1ps

module Mul_Booth(
clk,a,b,product
    );
    input  clk;
    input  [7:0] a;
    input  [7:0] b;
    output [15:0] product;

    reg [3:0] Booth4,Booth3,Booth2,Booth1;
    wire [15:0] product1,product2,product3,product4;
    wire [7:0] fb;
    wire [8:0] fbb;
/*-----------------//基4 Booth 编码表----------------*/
    always @(posedge clk) begin 
    case(a[7:5])
    3'b000:Booth4=0;//0
    3'b001:Booth4=1;//1
    3'b010:Booth4=1;//1
    3'b011:Booth4=2;//2
    3'b100:Booth4=4;//-2
    3'b101:Booth4=3;//-1
    3'b110:Booth4=3;//-1
    default:Booth4=0;//0
    endcase
    end
    always @(posedge clk) begin 
    case(a[5:3])
    3'b000:Booth3=0;
    3'b001:Booth3=1;
    3'b010:Booth3=1;
    3'b011:Booth3=2;
    3'b100:Booth3=4;
    3'b101:Booth3=3;
    3'b110:Booth3=3;
    default:Booth3=0;
    endcase
    end
    always @(posedge clk) begin 
    case(a[3:1])
    3'b000:Booth2=0;
    3'b001:Booth2=1;
    3'b010:Booth2=1;
    3'b011:Booth2=2;
    3'b100:Booth2=4;
    3'b101:Booth2=3;
    3'b110:Booth2=3;
    default:Booth2=0;
    endcase
    end
    always @(posedge clk) begin 
    case({a[1:0],1'b0})
    3'b000:Booth1=0;
    3'b001:Booth1=1;
    3'b010:Booth1=1;
    3'b011:Booth1=2;
    3'b100:Booth1=4;
    3'b101:Booth1=3;
    3'b110:Booth1=3;
    default:Booth1=0;
    endcase
    end    
/*--------------------部分积相加--------------------*/
    assign product=product1+(product2<<2)+(product3<<4)+(product4<<6);

    BuFenJi p1(.clk(clk),.Booth(Booth1),.b(b),.product(product1),.fb(fb),.fbb(fbb));
    BuFenJi p2(.clk(clk),.Booth(Booth2),.b(b),.product(product2),.fb(fb),.fbb(fbb));
    BuFenJi p3(.clk(clk),.Booth(Booth3),.b(b),.product(product3),.fb(fb),.fbb(fbb));
    BuFenJi p4(.clk(clk),.Booth(Booth4),.b(b),.product(product4),.fb(fb),.fbb(fbb));

endmodule
`timescale 1ns / 1ps

module BuFenJi(
clk,Booth,b,product,fb,fbb
    );
    input clk;
    input [3:0] Booth;
    input [7:0] b;
    output reg [15:0] product;
    output wire [7:0] fb;
    output wire [8:0] fbb;
/*-----------------//针对基4 Booth 编码表操作----------------*/
    always @(posedge clk) begin
        case(Booth)
            3'd0:product=16'b0;
            3'd1:begin
                if(b[7]) product={8'b11111111,b[7:0]};
                else     product={8'b00000000,b[7:0]};end
            3'd2:begin
                if(b[7]) product={7'b1111111,b[7:0],1'b0};
                else     product={7'b0000000,b,1'b0};end
            3'd4:begin
                if(!b[7])  product={7'b1111111,fbb[8:0]};
                else       product={7'b0000000,fbb[8:0]};end//-2
            default:begin
                if(!b[7]) product={8'b11111111,fb[7:0]};
                else      product={8'b00000000,fb[7:0]};end
        endcase
    end
/*-----------------对于-1、-2事先求反加1----------------*/
        assign fb =(~b[7:0]+8'b00000001);
        assign fbb=~{b[7:0],1'b0}+1'b1;

endmodule

二、基 2 RTL 代码

`timescale 1ns / 1ps

module Multi_Booth(
clk,rst,a,b,result
    );
    input clk;
    input rst;
    input [WIDTH-1:0] a,b;
    output [2*WIDTH-1:0] result;
    parameter WIDTH=4;
    reg [WIDTH-1:0] temp1,temp2;
    reg tempq,nd;
    reg [3:0] i;
    assign  result={temp2,temp1};
    always @(posedge clk or negedge rst) begin
        if(!rst)begin
            temp1<=a;temp2<=0;tempq<=0;nd<=0;i<=0;end
        else begin
            if(i<WIDTH) begin
                if(!nd)
                    case({temp1[0],tempq})
                        2'b01:begin temp2<=temp2+b;nd<=1;end
                        2'b10:begin temp2<=temp2-b;nd<=1;end 
                    default:begin
                        {temp2,temp1,tempq}<={temp2[WIDTH-1],temp2,temp1};
                        i<=i+1;
                    end
                    endcase
                else begin
                    {temp2,temp1,tempq}<={temp2[WIDTH-1],temp2,temp1};
                    nd<=0;
                    i<=i+1;
                    end
            end
        end
    end
endmodule

最后

以上就是寂寞小甜瓜为你收集整理的基于 FPGA 的高级数字电路设计(4)Booth 乘法器设计的全部内容,希望文章能够帮你解决基于 FPGA 的高级数字电路设计(4)Booth 乘法器设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部