$30
Objective
The objectives of this lab are to be familiar with the behavioral modeling of circuits and to design a 4-bit ALU capable of performing various arithmetic and logic operations and a seven-segment display decoder to display results.
ALU Design
An arithmetic logic unit (ALU) is a combinational circuit used to perform arithmetic and logic operations. It represents the fundamental building block of the central processing unit (CPU) of a computer. The block diagram of the ALU to design in this lab is shown below and can perform eight different operations as shown in the table.
operation
result =
0 0 0
A and B
0 0 1
A or B
0 1 0
Not B
0 1 1
A << B
1 0 0
A + B
1 0 1
A – B
1 1 0
A* B
1 1 1
A ÷ B
4-bit
ALU
A
B
operation
result
4
3
4
4
Write a Verilog code to implement the ALU in behavioral level
module Alu(A,B,operation,result);
input [3:0] A,B;
input [2:0] operation;
output [3:0] result;
reg [3:0] result; // redeclare the signals that appear on the left-hand side of the
// assignment statements inside the always block
always @(A,B,operation)
begin
case(operation)
3’b000: result = A & B;
3'b001: result = A | B;
3'b010: result = ~B; // bit-wise operator and returns the invert of the argument
// use ! for if true or false of single bit
3'b011: result = A << B;
3'b100: result = A + B;
3'b101: result = A - B;
3'b110: result = A * B;
3'b111: result = A / B;
endcase
end
endmodule
Seven-Segment Display Decoder: design a 7-segment display driver to display a 4-bit binary number.
Seven segment display uses seven different and individual LEDs to display a hexadecimal symbol. It has 7 wires to control the individual LED, one wire to control the decimal point and one enable wire.
Derive the truth-table for a 7 segment display decoder. This circuit inputs a 4-bit binary number x and provides active low outputs seg[6:0] for a 7-segment decoder.
If you put a 0 on A it will light up segment A
If you put a 1 on A it will NOT light up segment A
x
a b c d e f g (seg)
0
0000
0 0 0 0 0 0 1
1
0001
1 0 0 1 1 1 1
2
0010
0 0 1 0 0 1 0
3
0011
0 0 0 0 1 1 0
4
0100
1 0 0 1 1 0 0
5
0101
0 1 0 0 1 0 0
6
0110
0 1 0 0 0 0 0
7
0111
0 0 0 1 1 1 1
8
1000
0 0 0 0 0 0 0
9
1001
0 0 0 0 1 0 0
10
1010
0 0 0 1 0 0 0
11
1011
1 1 0 0 0 0 0
12
1100
0 1 1 0 0 0 1
13
1101
1 0 0 0 0 1 0
14
1110
0 1 1 0 0 0 0
15
1111
0 1 1 1 0 0 0
Implement the binary to 7 segment decoder/driver behaviorally in Verilog
module bin7seg (x, seg, dp);
input [3:0] x ; //4-bit input to display
output [6:0] seg; // segments from a to g
output dp; // decimal point
reg [6:0] seg; // re-declare as the type of reg
always @(x)
case (x)
0: seg = 7'b0000001;
1: seg = 7'b1001111;
2: seg = 7'b0010010;
3: seg = 7'b0000110;
4: seg = 7'b1001100;
5: seg = 7'b0100100;
6: seg = 7'b0100000;
7: seg = 7'b0001111;
8: seg = 7'b0000000;
9: seg = 7'b0000100;
10: seg = 7'b0001000;
11: seg = 7'b1100000;
12: seg = 7'b0110001;
13: seg = 7'b1000010;
14: seg = 7'b0110000;
15: seg = 7'b0111000;
default: seg = 7'b1111110;
endcase
endmodule
Write a Verilog module to display the ALU result on a 7- segment display and turn off the decimal point.
7
x
7-segment decoder
4-bit
ALU
A
B
operation
result
4
3
4
dp
seg
4
module toplevelmodule(A,B,operation, seg, dp);
// result and x get tied together internally , make it a wire
input [3:0] A, B;
input [2:0] operation;
wire result;
output [6:0] seg;
output dp;
// turn off decimal point
// active low -> 1 not 0
assign dp = 1;
// instantiate the ALU
// module Alu(A,B,operation,result);
ALU ALU(A, B, operation, result);
// instantiate the 7-seg display decoder
// module bin7seg(x,seg,dp);
bin7seg bin7seg(result,seg,dp);
endmodule
Testbench: Write a testbench to test both ALU and the toplevelmodule
On the EDAplayground.com, create a Verilog testbench to test your ALU and toplevelmodule, and perform the simulation to check if the results are correct. Test all 8 functions of the ALU by setting A = 3, and B = 2.
operation
A = 3
B = 2
Result =
seg
0 0 0
0011
0010
2
0010010
0 0 1
0011
0010
3
0000110
0 1 0
0011
0010
13
1000010
0 1 1
0011
0010
12
0110001
1 0 0
0011
0010
5
0100100
1 0 1
0011
0010
1
1001111
1 1 0
0011
0010
6
0100000
1 1 1
0011
0010
1
1001111
// Code your testbench here
// or browse Examples
module test;
// inputs
reg [3:0] A,B;
reg [2:0] operation;
// outputs
wire [3:0] result;
wire [6:0] seg;
wire dp;
// instantiate the ALU
Alu uut0(A, B, operation, result);
// instantiate toplevelmodule
toplevelmodule uut1(A,B,operation, seg, dp);
initial
begin
$dumpfile("dump.vcd");
$dumpvars(1,test);
// display the inputs and outputs
$monitor("%b %d %d %d %b", operation, A,B, result, seg);
// initialize inputs
A = 3; B = 2;
for(int i = 0; i < 8; i = i + 1) begin
#10 operation = i; end
#10 $finish;
end
endmodule
CHECKING OUTPUT :
https://www.edaplayground.com/x/BsXs
Homework: Write a Verilog code and testbench to implement another 4-bit ALU capable of performing four operations (AND, OR, ADD, SUB) based on the diagram shown below. In your code, you use the adder_subtractor module from Lab 8 to perform the addition and subtraction, and the given mux4x1 to selection the operation.
module Alu(A, B, operation, result);
//inputs and outputs
input [1:0] operation;
……
// Instantiate AND gate and OR gate
……
// connect M to operation[0]
……
// Instantiate add_subtractor
……
// Instantiate mux4x1
…….
endmodule
module mux4x1(i0, i1, i2, i3, select, y);
input [3:0] i0,i1,i2,i3;
input [1:0] select;
output [3:0] y;
reg [3:0] y;
always @ (i0 or i1 or i2 or i3 or select)
case (select)
2'b00: y = i0;
2'b01: y = i1;
2'b10: y = i2;
2'b11: y = i3;
endcase
endmodule