用verilog實現加法器
加法器是組合邏輯電路中的常見器件,瞭解其結構很有必要。
解決加法問題的根本是解決進位問題,解決進位問題的根本是理解加法豎式。比如計算二進制加法 1001(reg[3:0] in1) + 1101(reg[3:0] in2)。先計算個位in1[0]+in2[0] = 1+1,此時有兩個輸出,一個是最終結果的末位,應該輸出0,這裏記錄out[0] = 0;還有就是下一位的進位,此時有進位,應該輸出1,這裏記錄c[1] = 1。而在計算第二位的時候,應該是三個數相加 in1[0] + in2[0] + c[1] = 0 + 0 + 1,此時應該輸出 out[1] = 1,c[2] = 0。後面對第三位,第四位等的操作類似。
所以加法器(也就是全加器)是由多個半加器組合形成的。
首先介紹半加器。半加器有三個輸入,in1,In2(兩個數據輸入)和inc(一個進位輸入);兩個輸出out(最終結果) 和 outc(進位輸出)
in1 | in2 | inc | out | outc |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
可以根據卡諾圖得到輸出與輸入的邏輯表達式:
out = in1⊕in2⊕inc
outc = (in1&in2)|(in1&inc)|(inc&in2)
半加器模塊verilog代碼
module HalfAdder(in1, in2, inc, out, outc);
input in1, in2, inc;
output outc, out;
assign out = in1^in2^inc;
assign outc = (in1&in2)|(in1&inc)|(inc&in2);
endmodule
半加器設計好了之後就需要組成全加器,最終實現對2個8bit的數據的加法運算
全加器verilog代碼
module FullAdder(in1, in2, inc, out, outc);
input [7:0] in1, in2;
input inc;
output [7:0] out;
output outc;
wire [7:0] c;
HalfAdder adder0(.in1(in1[0]), .in2(in2[0]), .inc(inc), .out(out[0]), .outc(c[0]));
HalfAdder adder1(.in1(in1[1]), .in2(in2[1]), .inc(c[0]), .out(out[1]), .outc(c[1]));
HalfAdder adder2(.in1(in1[2]), .in2(in2[2]), .inc(c[1]), .out(out[2]), .outc(c[2]));
HalfAdder adder3(.in1(in1[3]), .in2(in2[3]), .inc(c[2]), .out(out[3]), .outc(c[3]));
HalfAdder adder4(.in1(in1[4]), .in2(in2[4]), .inc(c[3]), .out(out[4]), .outc(c[4]));
HalfAdder adder5(.in1(in1[5]), .in2(in2[5]), .inc(c[4]), .out(out[5]), .outc(c[5]));
HalfAdder adder6(.in1(in1[6]), .in2(in2[6]), .inc(c[5]), .out(out[6]), .outc(c[6]));
HalfAdder adder7(.in1(in1[7]), .in2(in2[7]), .inc(c[6]), .out(out[7]), .outc(c[7]));
assign outc = c[7];
endmodule
全加器testbench
`timescale 1ns/1ns
module FullAdder_TB;
reg[7:0] IN1,IN2;
reg INC;
wire[7:0] OUT;
wire OUTC;
wire[4:0] CURRENT_STATE;
parameter DELAY = 100;
integer i,j;
FullAdder fulladder_TB(.in1(IN1), .in2(IN2), .inc(INC), .out(OUT), .outc(OUTC));
initial
begin
INC = 0;
IN1 = 0;
IN2 = 0;
for(i = 0;i < 1000;i = i + 1)
for(j = 0;j < 1000;j = j + 1)
begin
#DELAY IN1 = i;
IN2 = j;
end
end
endmodule
仿真波形圖