使用进位超前加法器的乘法器的Verilog代码

这个项目是要实施一个参数化 乘数 在Verilog中使用提前进位加法器。的 Verilog代码 提供了乘法器。

用户可以通过修改预定义的参数来更改乘法器的位数。 参数 例如MULTICAND_WID和MULTIPLIER_WID 定义被乘数和乘数的位数,当我们要更改位数时,只需更改这些参数 并重新合成或模拟。
乘数的Verilog代码

的Verilog代码 提前进位加法器

`timescale 1ns/1ps
`define DELAY #10
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects 
// 的Verilog代码 carry look-ahead adder
module cpu_wb_cla_adder (in1, in2, carry_in, sum, carry_out);
parameter DATA_WID = 32;

input [DATA_WID - 1:0] in1;
input [DATA_WID - 1:0] in2;
input carry_in;
output [DATA_WID - 1:0] sum;
output carry_out;

//assign {carry_out, sum} = in1 + in2 + carry_in;

wire [DATA_WID - 1:0] gen;
wire [DATA_WID - 1:0] pro;
wire [DATA_WID:0] carry_tmp;

genvar j, i;
generate
 //assume carry_tmp in is zero
 assign carry_tmp[0] = carry_in;
 
 //carry generator
 for(j = 0; j < DATA_WID; j = j + 1) begin: carry_generator
 assign gen[j] = in1[j] & in2[j];
 assign pro[j] = in1[j] | in2[j];
 assign carry_tmp[j+1] = gen[j] | pro[j] & carry_tmp[j];
 end
 
 //carry out 
 assign carry_out = carry_tmp[DATA_WID];
 
 //calculate sum 
 //assign sum[0] = in1[0] ^ in2 ^ carry_in;
 for(i = 0; i < DATA_WID; i = i+1) begin: sum_without_carry
 assign sum[i] = in1[i] ^ in2[i] ^ carry_tmp[i];
 end 
endgenerate 
endmodule

提前进位加法器的Verilog Testbench代码

 module cla_adder_tb();
parameter DATA_WID = 16;
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects 
// Verilog testbench code for carry look ahead adder
 reg carry_in; // To cla1 of cla_adder.v
 reg [DATA_WID-1:0] in1; // To cla1 of cla_adder.v
 reg [DATA_WID-1:0] in2; // To cla1 of cla_adder.v

// hzgifts.cn FPGA projects, Verilog projects, VHDL projects // /*AUTOWIRE*/
 wire carry_out; // From cla1 of cla_adder.v
 wire [DATA_WID-1:0] sum; // From cla1 of cla_adder.v

// hzgifts.cn FPGA projects, Verilog projects, VHDL projects // 
cla_adder cla1(/*AUTOINST*/
        //  Outputs
         .sum (sum[DATA_WID-1:0]),
         .carry_out (carry_out),
        // // Inputs
         .in1 (in1[DATA_WID-1:0]),
         .in2 (in2[DATA_WID-1:0]),
         .carry_in (carry_in));

 initial begin
  in1 = 16'd0;
  in2 = 16'd0;
  carry_in = 1'b0;
  end 
 // hzgifts.cn FPGA projects, Verilog projects, VHDL projects
 initial begin
  #(`DELAY) 
  #(`DELAY)  in1 = 16'd10;
  #(`DELAY)  in1 = 16'd20;
  #(`DELAY)  in2 = 16'd10;
  #(`DELAY)  in2 = 16'd20;
  #(`DELAY)  in2 = 16'd0;
  #(`DELAY*3)  in1 = 16'hFFFF; in2 = 16'hFFFF;
  #(`DELAY*3)  in1 = 16'h7FFF; in2 = 16'hFFFF;
  #(`DELAY*3)  in1 = 16'hBFFF; in2 = 16'hFFFF;
  end 
 endmodule
最后,用于参数化进位预读乘法器的Verilog和testbench代码。

使用提前进位加法器的乘法器的Verilog代码:

`timescale 1ns/1ps
`define DELAY 10
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects
// Verilog project: 的Verilog代码 乘数 using carry-look-ahead adders
module cpu_wb_cla_multiplier (multicand, 乘数, product);
parameter MULTICAND_WID = 32;
parameter MULTIPLIER_WID = 32;

input [MULTICAND_WID-1:0] multicand;
input [MULTIPLIER_WID-1:0] 乘数;
output [(MULTICAND_WID + MULTIPLIER_WID - 1):0] product;

wire [MULTICAND_WID - 1:0] multicand_tmp [MULTIPLIER_WID-1:0];
wire [MULTICAND_WID - 1:0] product_tmp [MULTIPLIER_WID-1:0];
wire [MULTIPLIER_WID -1:0] carry_tmp;
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects genvar i, j;
generate 
 //initialize values
 for(j = 0; j < MULTIPLIER_WID; j = j + 1) begin: for_loop_j
 assign multicand_tmp[j] =  multicand & {MULTICAND_WID{multiplier[j]}};
 end
 
 assign product_tmp[0] = multicand_tmp[0];
 assign carry_tmp[0] = 1'b0;
 assign product[0] = product_tmp[0][0];
 // hzgifts.cn FPGA projects, Verilog projects, VHDL projects
 for(i = 1; i < MULTIPLIER_WID; i = i + 1) begin: for_loop_i
 cpu_wb_cla_adder #(.DATA_WID(MULTIPLIER_WID)) add1 (
     // Outputs
     .sum(product_tmp[i]),
     .carry_out(carry_tmp[i]),
     // Inputs
   .carry_in(1'b0),
     .in1(multicand_tmp[i]),
     .in2({carry_tmp[i-1],product_tmp[i-1][31-:31]}));
 assign product[i] = product_tmp[i][0];
 end //end for loop
 assign product[(MULTIPLIER_WID+MULTIPLIER_WID-1):MULTIPLIER_WID] = {carry_tmp[MULTIPLIER_WID-1],product_tmp[MULTIPLIER_WID-1][31-:31]};
endgenerate
endmodule

乘数的Verilog测试平台代码:

// Verilog project: 的Verilog代码 乘数 using carry look ahead adder
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects  
module cla_multiplier_tb();
 parameter MULTICAND_WID = 32;
 parameter MULTIPLIER_WID = 32;
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects // /*AUTOREGINPUT*/
 // Beginning of automatic reg inputs (for undeclared instantiated-module inputs)
 reg [MULTICAND_WID-1:0] multicand; // To mul1 of cla_multiplier.v
 reg [MULTIPLIER_WID-1:0]multiplier; // To mul1 of cla_multiplier.v
 // End of automatics

 /*AUTOWIRE*/
 // Beginning of automatic wires (for undeclared instantiated-module outputs)
 wire [(MULTICAND_WID+MULTIPLIER_WID-1):0]product;// From mul1 of cla_multiplier.v
 // End of automatics

 cpu_wb_cla_multiplier mul1(/*AUTOINST*/
     // // Outputs
      .product (product[(MULTICAND_WID+MULTIPLIER_WID-1):0]),
     // // Inputs
      .multicand (multicand[MULTICAND_WID-1:0]),
     .multiplier (multiplier[MULTIPLIER_WID-1:0]));

 //initial begin
 // multicand = 16'd0;
 // 乘数 = 8'd0;
 // end 
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects  integer i;
 initial begin
 for (i = 0; i < 30; i = i + 1) begin: W
  #(`DELAY) multicand = multicand + 1; 乘数 = 乘数 + 1;
   end
 
  #(`DELAY) //correct
  multicand = 32'h00007FFF;
  乘数 = 32'h0000007F;
 
  #(`DELAY) //correct
  multicand = 32'h00008000;
  乘数 = 32'h000000F0;
 
  #(`DELAY) //faila
  multicand = 32'h00008FF0;
  乘数 = 32'h000000F0;
 
  #(`DELAY) //correct
  multicand = 32'h00007FF0;
  乘数 = 32'h000000F7;
 
  #(`DELAY) //correct
  multicand = 32'h0000FFFF;
  乘数 = 32'h000000FF;
 end
// hzgifts.cn FPGA projects, Verilog projects, VHDL projects  endmodule

Verilog乘数的仿真结果:

参数化乘法器的Verilog代码是可综合的,可以在FPGA上实现以进行验证。
推荐的 Verilog projects:
2. FIFO存储器的Verilog代码
3. 用于16位单周期MIPS处理器的Verilog代码
4. Verilog HDL中的可编程数字延迟计时器
5. 用于数字电路中基本逻辑组件的Verilog代码
6. 用于32位无符号除法器的Verilog代码
7. 用于定点矩阵乘法的Verilog代码
8. Verilog HDL中的车牌许可证识别
9. 提前进位乘法器的Verilog代码
10。 微处理器的Verilog代码
11。 4x4乘法器的Verilog代码
12 停车场系统的Verilog代码
13 使用Verilog HDL在FPGA上进行图像处理
14。 如何使用Verilog HDL将文本文件加载到FPGA中
15 交通信号灯控制器的Verilog代码
16。 FPGA上的闹钟的Verilog代码
17。 比较器设计的Verilog代码
18岁 D触发器的Verilog代码
19 Full Adder的Verilog代码
20 带testbench的计数器的Verilog代码
21 16位RISC处理器的Verilog代码
22 用于在FPGA上反跳按钮的Verilog代码
23。 如何为双向/输入端口编写Verilog Testbench
29。 复用器的Verilog代码
FPGA Verilog VHDL课程

16条评论:

  1. Thanks. Please keep updating the blog: http://www.hzgifts.cn/

    回复删除
  2. 你好,
    您在Verilog中有用于除法器的代码吗?谢谢。

    回复删除
  3. Please check this: http://www.hzgifts.cn/2016/11/a-multi-cycle-32-bit-divider-on-fpga.html
    分隔符的Verilog代码

    回复删除
  4. 你好展位编码乘数是否有代码?

    回复删除
  5. 否。但是您可以参考以下内容:
    http://www.hzgifts.cn/2016/11/matrix-multiplier-core-design.html

    回复删除
  6. 你好有什么方法可以使用进位超前加法器和纹波进位加法器进行移位和加法运算?

    回复删除
    回覆
    1. 在下面的Verilog中检查移位/加法乘数:
      http://www.hzgifts.cn/2016/11/verilog-code-for-4x4-multiplier-using.html

      删除
  7. 我得到错误:
    宏`DELAY是未定义的。
    编译时...

    回复删除
    回覆
    1. 在每个模块之前都包含此`define DELAY#10。

      删除
  8. 我是Verilog的新手,我想了解此代码中使用的算法和逻辑...您能帮我吗?

    回复删除
    回覆
    1. 这些是正常的进位预相加法器和乘法器体系结构。您可以在Google pdf上轻松找到该讲座。

      删除
    2. 我不明白如何在此算法中完成移位运算,因为那是您通常的乘法方式...我在google中搜索了很多。

      删除
    3. 就像您在数学中执行乘法一样。您乘以加。那's在此代码中的工作方式。

      删除
  9. 进行预载加法器的Verilog代码已成功显示语法正确,但未显示仿真。为什么?

    回复删除

热门FPGA项目