16 bit Radix 4 Booth Multiplier Verilog Code
Here we are sharing the verilog implementation of 16 bit radix 4 booth multiplier using sequential logic. It takes 16 clock cycle to multiply two 16-bit signed numbers.
//Booth Multiplier 16-bit module multiplier ( input clk,reset, input [15:0] x,y, output reg [31:0] out ); reg [2:0] c=0 ; reg [31:0] pp=0; //partial products reg [31:0] spp=0; //shifted partial products reg [31:0] prod=0; reg [15:0] i=0,j=0; reg flag=0, temp=0 ; wire [15:0] inv_x ; //assign x= (~x) +1'b1; assign inv_x = (~x) +1'b1; always@(posedge clk) begin if(reset) begin out=0; c=0; pp=0; flag=0; spp=0; i=0; j=0; prod=0; end else begin if(!flag) c={y[1],y[0],1'b0}; flag=1; case(c) //////////////////////// 3'b000,3'b111: begin if(i<8) begin i=i+1; c={y[2*i+1],y[2*i],y[2*i-1]}; end else c=3'bxxx; end //////////////////////////// 3'b001,3'b010: begin if(i<8) begin i=i+1; c={y[2*i+1],y[2*i],y[2*i-1]}; pp={{16{x[15]}},x}; if(i==1'b1) prod=pp; else begin temp=pp[31]; j=i-1; j=j<<1; spp=pp<<j; spp={temp,spp[30:0]}; prod=prod+spp; end end else c=3'bxxx; end /////////////////////////// 3'b011: begin if(i<8) begin i=i+1; c={y[2*i+1],y[2*i],y[2*i-1]}; pp={{15{x[15]}},x,1'b0}; if(i==1'b1) prod=pp; else begin temp=pp[31]; j=i-1; j=j<<1; spp=pp<<j; spp={temp,spp[30:0]}; prod=prod+spp; end end else c=3'bxxx; end /////////////////////////// 3'b100: begin if(i<8) begin i=i+1; c={y[2*i+1],y[2*i],y[2*i-1]}; pp={{15{inv_x[15]}},inv_x,1'b0}; if(i==1'b1) prod=pp; else begin temp=pp[31]; j=i-1; j=j<<1; spp=pp<<j; spp={temp,spp[30:0]}; prod=prod+spp; end end else c=3'bxxx; end //////////////////////////////////// 3'b101, 3'b110: begin if(i<8) begin i=i+1; c={y[2*i+1],y[2*i],y[2*i-1]}; pp={{16{inv_x[15]}},inv_x}; if(i==1'b1) prod=pp; else begin temp=pp[31]; j=i-1; j=j<<1; spp=pp<<j; spp={temp,spp[30:0]}; prod=prod+spp; end end else c=3'bxxx; end //////////////// default: out= prod; endcase end end endmodule
sir i want code for radix 8
Do you have the verilog codes for radix 8?
sir do you have the test bench for radix 4 code
do you have the tset bench of this radix 4 code
sir can you provide test bench of it..
I tried this but the product is always 0. Here is the test bench
`timescale 1 ns/10 ps
module mult_tb;
reg clock, reset ;
reg [15:0] multiplicand;
reg [15:0] multiplier;
reg [31:0] product;
reg [3:0] ready;
reg start;
multiplier dut(.clk(clock),.reset(reset), .x(multiplicand),.y(multiplier), .out(product));
initial begin
clock = 1’b0;
reset = 1’b0;
multiplicand = 16’b0000000000000000;
multiplier = 16’b0000000000000000;
product = 32’b00000000000000000000000000000000;
end
always #5 clock = ~clock;
initial
begin
reset = 1’b1;
clock = 1’b1;
ready = 1’b1;
start = 1’b1;
#3
multiplicand = 16’b0000000000001101;
multiplier = 16’b0000000000001111;
# 200;
$stop;
end
endmodule
Then what changes you have made to get the output?can u please tell me