-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlu.v
84 lines (64 loc) · 1.89 KB
/
Alu.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Code your design here
// through behavioural level modelling in verilog
module Alu(
input [3:0] a, b , input [2:0] opcode ,
output reg flagc , flagz , output reg [7:0] y );
parameter Add = 3'b000 , sub = 3'b001 , multi = 3'b010 ,AND =3'b011 ,
NAND = 3'b100, OR = 3'b101 , EXOR = 3'b110 , NOR = 3'b111 ;
always@(*)
begin
case(opcode)
Add : begin y = a+b ;
flagc = y[5];
flagz = (y[8]==3'b0);
end
sub : begin y = a+b ;
flagz = (y[8]==3'b0);
end
multi : begin y = a*b ;
flagz = (y[8]==3'b0);
end
AND : begin y = a&b ;
flagz = (y[8]==3'b0);
end
NAND : begin y = ~(a&b) ;
flagz = (y[8]==3'b0);
end
OR : begin y = a|b ;
flagz = (y[8]==3'b0);
end
EXOR : begin y = a^b ;
flagz = (y[8]==3'b0);
end
NOR : begin y = ~(a|b) ;
flagz = (y[8]==3'b0);
end
default : begin y = 8'bx ;
flagc = 1'bx;
flagz = 1'bx;
end
endcase
end
endmodule
//---------------------------------------------------
//testbench for ARITHMETIC AND LOGIC UNIT
// Code your testbench here
module tb ;
reg [3:0] a;reg [3:0] b ;
reg [2:0] opcode ;
wire flagc ;
wire flagz ;
wire [7:0] y ;
Alu uut( .a(a) , .b(b) , .opcode(opcode) , .y(y) , .flagc(flagc) , .flagz(flagz));
initial begin
$dumpfile("test.vcd");
$dumpvars(1 ,a ,b, opcode , flagc ,flagz, y );
a = 4'b000 ;
b = 4'b000 ;
#5 a= 4'b0010 ;b = 4'b0011 ; opcode = 3'b000;
#5 a= 4'b0010 ; b = 4'b0011 ; opcode = 3'b001;
#5 a= 4'b0010 ; b = 4'b0011 ; opcode = 3'b011;
#5 a= 4'b0010 ; b = 4'b0011 ; opcode = 3'b100;
#5 a= 4'b0010 ; b = 4'b0011 ; opcode = 3'b101;
end
endmodule