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
#10 clk_1=~clk_1;
end
always
begin
forever
#160 clk_16=~clk_16;
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;
#20000;
$finish;
end
endmodule