用verilog實現加法器

用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 = in1in2inc

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

仿真波形圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章