思考:流水线的设计是为了提高频率,在一个耗时比较长的组合逻辑中,加入寄存器,
可以将这个较长的组合逻辑分裂几份,从而提升主频,缺点是增加了寄存器的资源。
二级流水线的加法器的设计思想如下:
在第一个周期完成低四位的加法计算,使用一个四位加法器即可。在第二个周期在使用
一个四位加法器完成高四位的加法运算。因此到第二个周期结束才有计算结果。但是接下来
由于流水线的作用,每个周期都会出一个计算结果,需要注意的是两个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
仿真波形如下,可以看出是在两个周期后出数据,之后每个周期都会出一个数据。
文章来源:https://www.toymoban.com/news/detail-506552.html
四级流水
四级流水设计,只不过此时采用的是二位加法器,并且多加触发器来缓存中间数据。文章来源地址https://www.toymoban.com/news/detail-506552.html
//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
到了这里,关于8位加法器的流水线设计(2级流水、四级流水)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!