全并行流水线移位相加乘法器

本文介绍了全并行流水线移位相加乘法器的基本算法,通过取消分时复用,利用流水线技术提高计算速度。内容包括移位部分的RTL代码,固定移位单元和移位器的实现,加法部分的加法树设计,以及顶层的组合。测试阶段,使用SystemVerilog完成,通过比较固定延迟后的结果验证乘法器的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本算法

与分时复用的移位相加类似,取消分时复用,使用面积换时间,使用流水线设计,流水线填满后可以一个时钟周期计算出一个结果

  • 分别计算乘数的移位结果,并与被乘数对应位相与
  • 使用加法树将结果相加

RTL代码

移位部分

固定移位单元代码如下,当被乘数第n位为1时,输出乘数移位向左移位n位的结果

module shift_unit #(
    parameter WIDTH = 4,
    parameter SHIFT_NUM = 0
)(
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low
    input shift_valid,
    input shift_mask,
    input [WIDTH - 1:0]shift_din,

    output reg [2 * WIDTH - 1:0]shift_dout
);

wire [2 * WIDTH - 1:0]shift_din_ext;
assign shift_din_ext = {(WIDTH)'(0),shift_din};

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        shift_dout <= 'b0;
    end else if((shift_valid == 1'b1) && (shift_mask == 1'b1)) begin
        shift_dout <= shift_din_ext << SHIFT_NUM;
    end else begin
        shift_dout <= 'b0;
    end
end

endmodule

移位器代码如下,使用生成语句生成位宽个移位器

module parallel_shifter #(
    parameter WIDTH = 4
)(
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input mult_valid,
    input [WIDTH - 1:0]mult1,mult2,

    output [(WIDTH ** 2) * 2 - 1:0]shift_dout
);

genvar a;
generate
    for (a = 0; a < WIDTH; a = a + 1) begin:shifter_layer
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值