//=================================
// Ch07 adder1.v
// 一位元全加法器 (assign 敘述與 if 敘述)
module FA (S_0, S_1,S_2,Co_0, Co_1,Co_2, A, B, Ci);
input A, B, Ci; // A, B, Ci 一位元輸入
output S_0, S_1,S_2, Co_0, Co_1, Co_2; // S 加法和, Co 進位
reg S_1, Co_1,S_2,Co_2; // 宣告為暫存器資料
// 布林方程式描述
assign S_0 = A ^ B ^ Ci;
assign Co_0 = (A & B) | (A & Ci) | (B & Ci);
// 查真值表描述
always@ (A or B or Ci) begin
if ({A,B,Ci} == 3'b000) {Co_1,S_1} = 2'b00;
else if ({A,B,Ci} == 3'b001) {Co_1,S_1} = 2'b01;
else if ({A,B,Ci} == 3'b010) {Co_1,S_1} = 2'b01;
else if ({A,B,Ci} == 3'b011) {Co_1,S_1} = 2'b10;
else if ({A,B,Ci} == 3'b100) {Co_1,S_1} = 2'b01;
else if ({A,B,Ci} == 3'b101) {Co_1,S_1} = 2'b10;
else if ({A,B,Ci} == 3'b110) {Co_1,S_1} = 2'b10;
else {Co_1,S_1} = 2'b11;
end
// 查真值表描述
always@ (A or B or Ci) begin
case ({A,B,Ci})
3'b000 : begin S_2 = 0; Co_2 = 0; end
3'b001 : begin S_2 = 1; Co_2 = 0; end
3'b010 : begin S_2 = 1; Co_2 = 0; end
3'b011 : begin S_2 = 0; Co_2 = 1; end
3'b100 : begin S_2 = 1; Co_2 = 0; end
3'b101 : begin S_2 = 0; Co_2 = 1; end
3'b110 : begin S_2 = 0; Co_2 = 1; end
3'b111 : begin S_2 = 1; Co_2 = 1; end
endcase
end
endmodule
////////////////////////////////////////////////////////////////////////////////
`timescale 100ns/1ps
module T;
//output
wire S_0;
wire S_1;
wire S_2;
wire Co_0;
wire Co_1;
wire Co_2;
//input
reg A = 1'b0;
reg B = 1'b0;
reg Ci = 1'b0;
// Instantiate the Unit Under Test (UUT)
FA UUT (
.S_0(S_0),
.S_1(S_1),
.S_2(S_2),
.Co_0(Co_0),
.Co_1(Co_1),
.Co_2(Co_2),
.A(A),
.B(B),
.Ci(Ci));
integer i = 0;
initial
begin
#220 // Final time: 800 ns
$stop;
end
initial begin
$monitor (S_0, S_1,S_2,Co_0,Co_1,Co_2, A, B, Ci);
for(i=1; i<=10; i=i+1)
begin
#20 {A,B,Ci}=i;
end
end
endmodule
沒有留言:
張貼留言