8位加法器的流水线设计(2级流水、四级流水)

思考:流水线的设计是为了提高频率,在一个耗时比较长的组合逻辑中,加入寄存器,
可以将这个较长的组合逻辑分裂几份,从而提升主频,缺点是增加了寄存器的资源。
二级流水线的加法器的设计思想如下:
在第一个周期完成低四位的加法计算,使用一个四位加法器即可。在第二个周期在使用
一个四位加法器完成高四位的加法运算。因此到第二个周期结束才有计算结果。但是接下来
由于流水线的作用,每个周期都会出一个计算结果,需要注意的是两个8位加数从进去到
出来是经过两个时钟周期的。

二级流水

module  adder_8_2pip(
    input   wire    [7:0]   ina         ,
    input   wire    [7:0]   inb         ,
    input   wire            cin         ,
    input   wire            clk         ,
    
    output  reg     [7:0]   sum         ,
    output  reg             cout
);

reg     [3:0]       tempa       ;           //ina[7:4]寄存
reg     [3:0]       tempb       ;           //inb[7:4]寄存
reg     [3:0]       first_sum   ;           //低四位的和
reg                 first_cout  ;           //低四位的进位

always @(posedge clk) begin
    begin
        {first_cout, first_sum} <= ina[3:0] + inb[3:0] + cin;
        tempa <= ina[7:4];                   //ina的高四位寄存
        tempb <= inb[7:4];                   //inb的高四位寄存
    end
end

always @(posedge clk) begin
    begin
        {cout,sum[7:4]} <= tempa + tempb + first_cout;//高四位相加
        sum[3:0] <= first_sum;                        //第一周期的低四位和
    end
end

endmodule

testbench如下:

//author:   Zhouxingxing
//date:     2022/8/19
//function: 8位加法器的二级流水线实现

module  tb_adder_8_2pip;

reg     [7:0]   ina     ;
reg     [7:0]   inb     ;
reg             cin     ;
reg             clk     ;

wire    [7:0]   sum     ;
wire            cout    ;

adder_8_2pip u_adder_8_2pip(
    .ina    (ina)       ,
    .inb    (inb)       ,
    .cin    (cin)       ,
    .clk    (clk)       ,
    
    .sum    (sum)       ,
    .cout   (cout)
);

task run;
    @(posedge clk);
    ina = $random() % (2**8);
    inb = $random() % (2**8);
    cin = $random() % 2;
endtask

//产生时钟
initial begin
    clk = 1'b0;
end
always #10 clk = ~clk;

//产生激励
initial begin
    #50;
    repeat(50) begin
        run();
    end
end

endmodule

仿真波形如下,可以看出是在两个周期后出数据,之后每个周期都会出一个数据。
在这里插入图片描述

四级流水

四级流水设计,只不过此时采用的是二位加法器,并且多加触发器来缓存中间数据。

//author:   Zhouxingxing
//date:     2022/8/19
//function: 8位加法器的四级流水线实现

module adder_8_4pip(
    input   wire    [7:0]   ina     ,
    input   wire    [7:0]   inb     ,
    input   wire            cin     ,
    input   wire            clk     ,
    
    output  reg     [7:0]   sum     ,
    output  reg             cout
);

reg     [7:0]       tempa       ;
reg     [7:0]       tempb       ;
reg                 tempcin     ;
reg                 first_cout  ;
reg                 second_cout ;
reg                 third_cout  ;
reg     [1:0]       first_sum   ;
reg     [5:0]       first_ina   ;
reg     [5:0]       first_inb   ;
reg     [3:0]       second_sum  ;
reg     [3:0]       second_ina  ;
reg     [3:0]       second_inb  ;
reg     [5:0]       third_sum   ;
reg     [1:0]       third_ina   ;
reg     [1:0]       third_inb   ;

//输入数据缓存
always @(posedge clk) begin
    begin
        tempa <= ina;
        tempb <= inb;
        tempcin <= cin;
    end
end

//第一级 对低两位相加 将未参加计算的数据缓存
always @(posedge clk) begin
    begin
        {first_cout, first_sum} <= tempa[1:0] + tempb[1:0] + tempcin;
        first_ina <= tempa[7:2];
        first_inb <= tempb[7:2];
    end
end

//第二级 对第三位和第四位相加 将未参加计算的数据缓存
always @(posedge clk) begin
    begin
        {second_cout, second_sum} = {first_ina[1:0] + first_inb[1:0] + first_cout, first_sum};
        second_ina <= first_ina[5:2];
        second_inb <= first_inb[5:2];
    end
end

//第三级 对第五位和第六位相加 将未参加计算的数据缓存
always @(posedge clk) begin
    begin
        {third_cout, third_sum} <= {second_ina[1:0] + second_inb[1:0] + second_cout, second_sum};
        third_ina <= second_ina[3:2];
        third_inb <= second_inb[3:2];
    end
end

//第四级 对第六位和第七位相加 将未参加计算的数据缓存
always @(posedge clk) begin
    begin
        {cout,sum} = {third_ina[1:0] + third_inb[1:0] + third_cout, third_sum};
    end
end

endmodule
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值