0.前言
为了熟悉整个数字IC设计流程,以知识点+实验的方式记录。 四位全加器的写法有很多种,按照FPGA的设计方法,可以直接调用一个四位的加法器;但数字IC基于标准cell的设计,为了速度与面积的trade off,以及后端布线方便,本实验采用模块调用的写法。
1.设计代码
module adder_4bits
(
input
[3:0
] num1,
input
[3:0
] num2,
output cout,
output
[3:0
] sum
);
wire cout_0
;
wire cout_1
;
wire cout_2
;
adder_1bit adder0
(
.num1
( num1
[0
] ),
.num2
( num2
[0
] ),
.cin
( 1'b0
),
.cout
( cout_0
),
.sum
( sum
[0
] )
);
adder_1bit adder1
(
.num1
( num1
[1
] ),
.num2
( num2
[1
] ),
.cin
( cout_0
),
.cout
( cout_1
),
.sum
( sum
[1
] )
);
adder_1bit adder2
(
.num1
( num1
[2
] ),
.num2
( num2
[2
] ),
.cin
( cout_1
),
.cout
( cout_2
),
.sum
( sum
[2
] )
);
adder_1bit adder3
(
.num1
( num1
[3
] ),
.num2
( num2
[3
] ),
.cin
( cout_2
),
.cout
( cout
),
.sum
( sum
[3
] )
);
endmodule
module adder_1bit
(
input num1 ,
input num2 ,
input cin ,
output cout ,
output
sum
);
assign
{cout,sum
}=num1+num2+cin
;
endmodule
2.验证代码
`timescale 1ns/1ps
module test_tb
();
reg clk_1
;
reg clk_16
;
reg
[3:0
] num1
;
reg
[3:0
] num2
;
wire cout
;
wire
[3:0
] sum ;
//instance
adder_4bits adder
(
.num1
( num1
),
.num2
( num2
),
.cout
( cout
),
.sum
( sum )
);
//generate clk
always
begin
forever
end
always
begin
forever
end
//add driven by clk
always@
(clk_1
)
begin
num1
=num1+4
'b0001;
end
always@(clk_16)
begin
num2=num2+4'b0001
;
end
initial
begin
//test begin
clk_1
=0
;
clk_16
=0
;
num1
=4
'b0000;
num2=4'b0000
;
$finish;
end
endmodule