流水线加法器

IC设计中的流水线思想

流水线思想是一种高效的处理机制,目前先进的处理器都采用流水线结构来增加吞吐率,反映在电路上面就是尽可能的让数字系统全部的电路都持续的工作。如若不然,由于数字系统都是分模块设计,就会出现部分电路模块处于工作状态,而有的电路子模块处于空闲或等待任务的状态。

流水线的设计思想是将一个复杂的任务分解为n个子任务,分别交给n个处理单元按照一定的顺序处理子任务。这个n又叫做流水线深度,称为n级流水线。

流水线加法器举例

假如有两个输入的数据流,需要设计一个加法电路把数据流中的数值加起来。输入的值每个周期都在变化,数据流宽度为64位。

利用两个32 bit加法器来完成64bit加法器的功能,添加流水线本质上增加了系统处理数据的吞吐率!

框图如下:

image-20220524214925693

流水线加法器verilog代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// pipeline 64-bits adder

module adder_pipelined (
input clk,
input resetb,
input [63:0] A,
input [63:0] B,
output [64:0] FinalSum
);

reg [32:0] Lsum_d1; //The sum of Low 32 bits
wire [32:0] Lsum_d1_nxt; //
wire Carry_d1; //Low bits sum carry out

reg [31:0] Lsum_d2; // The sum of Low 32 bits
reg [31:0] Aup_d1, Bup_d1; // HIGH 32 bits
reg [32:0] Usum_d2;
wire [32:0] Usum_d2_nxt;
wire [64:0] FinalSum;
//*****************************************
assign Lsum_d1_nxt = A[31:0] + B[31:0];
assign Carry_d1 = Lsum_d1[32];
assign Usum_d2_nxt = Carry_d1 + Aup_d1 + Bup_d1;
assign FinalSum = {Usum_d2, Lsum_d1};
//****************************************
always @(posedge clk or negedge resetb) begin
if(!resetb) begin
Lsum_d1 <= 'd0;
Lsum_d2 <= 'd0;
Aup_d1 <= 'd0;
Bup_d1 <= 'd0;
Usum_d2 <= 'd0;
end
else begin
Lsum_d1 <= Lsum_d1_nxt;
Lsum_d2 <= Lsum_d1[31:0];
Aup_d1 <= A[63:32];
Bup_d1 <= B[63:32];
Usum_d2 <= Usum_d2_nxt;
end
end
endmodule

流水线加法器仿真代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
`timescale 1ps/1ps
module pipeline_adder_tb ();

parameter CLKTB_HALF_PERIOD = 2.5; // produces 200MHz clock
parameter RST_DEASSERT_DAY = 100; //rst_deassert

reg clkx, rstb;
reg [63:0]Ain, Bin;
wire[64:0]FinalSum;

//Generate clk
//******************

initial begin
clkx = 1'b0;
forever begin
#CLKTB_HALF_PERIOD clkx = ~clkx; // 200M Hz clk
end
end
//Generate resetb
//************************
initial begin
rstb = 1'b0;
#RST_DEASSERT_DAY rstb = 1'b1;
end

// module instantiation
adder_pipelined adder_pipelined_0(
.clk (clkx),
.resetb (rstb),
.A (Ain),
.B (Bin),
.FinalSUM (FinalSum)
);

initial begin
Ain = 'b0;
Bin = 'b0;
#500;
@(posedge clkx);
#1;
Ain = 64'h1234_4321_4321_1234;
Bin = 64'h2344_3214_3211_2341;
@(posedge clkx);
#1;
Ain = 64'hFFFF_FFFF_FFFF_FFFF;
Bin = 64'hFFFF_FFFF_FFFF_FFFF;
@(posedge clkx);
#1;
Ain = 64'hF000_0001_1234_0001;
Bin = 64'hFDC0_0001_1234_0001;
@(posedge clkx);
#1;
Ain = 64'h10;
Bin = 64'h11;
@(posedge clkx);
@(posedge clkx);
@(posedge clkx);
#1000;
$finish;
end
endmodule

仿真波形:

image-20220528022608635

流水线通过在较长的组合逻辑路径中插入寄存器降低了组合逻辑的延迟,从而增加时钟频率并提高性能。

0%