源自於 https://www.technobyte.org/verilog-full-adder-behavioral-modeling/
Logical diagram with the expression:
S = A ⊕ B ⊕ Cin
Cout = A.B + B.C + C.A
Cout = A & B | (A^B) & Cin
Truth Table for Full Adder:
A | B | Cin | SUM (S) | CARRY (Cout) |
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 |
Methods of encoding a Full Adder using Behavioral Modeling
`timescale 1ns / 1ps module full_adder( A, B, Cin, S, Cout); input wire A, B, Cin; output reg S, Cout; always @(A or B or Cin) begin S = A ^ B ^ Cin; Cout = A&B | (A^B) & Cin; end endmodule
`timescale 1ns / 1ps module full_adder(input wire A, B, Cin, output reg S, output reg Cout); always @(A or B or Cin) begin case (A | B | Cin) 3'b000: begin S = 0; Cout = 0; end 3'b001: begin S = 1; Cout = 0; end 3'b010: begin S = 1; Cout = 0; end 3'b011: begin S = 0; Cout = 1; end 3'b100: begin S = 1; Cout = 0; end 3'b101: begin S = 0; Cout = 1; end 3'b110: begin S = 0; Cout = 1; end 3'b111: begin S = 1; Cout = 1; end endcase end endmodule
`timescale 1ns / 1ps module full_adder( A, B, Cin, S, Cout); input wire A, B, Cin; output reg S, Cout; always @(A or B or Cin) begin if(A==0 && B==0 && Cin==0) begin S=0; Cout=0; end else if(A==0 && B==0 && Cin==1) begin S=1; Cout=0; end else if(A==0 && B==1 && Cin==0) begin S=1; Cout=0; end else if(A==0 && B==1 && Cin==1) begin S=0; Cout=1; end else if(A==1 && B==0 && Cin==0) begin S=1; Cout=0; end else if(A==1 && B==0 && Cin==1) begin S=0; Cout=1; end else if(A==1 && B==1 && Cin==0) begin S=0; Cout=1; end else if(A==1 && B==1 && Cin==1) begin S=1; Cout=1; end end endmodule
Testbench for full adder in Verilog
//timescale directive `timescale 1ns / 1ps module top; //declare testbench variables reg A_input, B_input, C_input; wire Sum, C_output; //instantiate the design module and connect to the testbench variables full_adder instantiation(.A(A_input), .B(B_input), .Cin(C_input), .S(Sum), .Cout(C_output)); initial begin $dumpfile("xyz.vcd"); $dumpvars; //set stimulus to test the code A_input=0; B_input=0; C_input=0; #100 $finish; end //provide the toggling input (just like truth table input) //this acts as the clock input always #40 A_input=~A_input; always #20 B_input=~B_input; always #10 C_input=~C_input; //display output if there’s a change in the input event always @(A_input or B_input or C_input) $monitor("At TIME(in ns)=%t, A=%d B=%d C=%d Sum = %d Carry = %d", $time, A_input, B_input, C_input, Sum, C_output); endmodule
沒有留言:
張貼留言