Subversion Repositories programming

Rev

Rev 203 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 203 Rev 207
Line -... Line 1...
-
 
1
/**
-
 
2
 * Copyright 2006, Ira W. Snyder (devel@irasnyder.com)
-
 
3
 * License: GNU General Public License v2 (or, at your option, any later
-
 
4
 * version)
-
 
5
 */
-
 
6
 
-
 
7
/**
-
 
8
 * Name: Ira Snyder
-
 
9
 * Class: CS365 - Computer Architecture
-
 
10
 * Project #1 - Part 1 (support)
-
 
11
 * Due: 2006-02-06
-
 
12
 */
-
 
13
 
-
 
14
/**
-
 
15
 * File: ALU1.v
-
 
16
 * Purpose: Implementation of a 1-bit ALU.
-
 
17
 */
1
 
18
 
2
//Basic unit: 2-input and gate
-
 
3
module AND_2 (in1, in2, out);
-
 
4
   input in1, in2;
-
 
5
   output out;
-
 
6
   assign out = in1 & in2;
-
 
7
endmodule
-
 
8
 
-
 
9
//Basic unit: 2-input or gate
-
 
10
module OR_2 (in1, in2, out);
-
 
11
   input in1, in2;
-
 
12
   output out;
-
 
13
   assign out = in1 | in2;
-
 
14
endmodule
-
 
15
 
-
 
16
//Basic unit: 3-input or gate
-
 
17
module OR_3(in1, in2, in3, out);
-
 
18
   input in1, in2, in3;
-
 
19
   output out;
-
 
20
   assign out = in1 | in2 | in3;
-
 
21
endmodule
-
 
22
 
-
 
23
//Basic unit: 3-input and gate
-
 
24
module AND_3 (in1, in2, in3, out);
-
 
25
   input in1, in2, in3;
-
 
26
   output out;
-
 
27
   assign out = in1 & in2 & in3;
-
 
28
endmodule
-
 
29
 
-
 
30
//Basic unit: 4-input or gate
-
 
31
module OR_4 (in1, in2, in3, in4, out);
-
 
32
   input in1, in2, in3, in4;
-
 
33
   output out;
-
 
34
   assign out = in1 | in2 | in3 | in4;
-
 
35
endmodule
-
 
36
 
-
 
37
//Basic unit: Invert
-
 
38
module NOT_1 (in, out);
-
 
39
   input in;
-
 
40
   output out;
-
 
41
   assign out = ~in;
-
 
42
endmodule
-
 
43
 
-
 
44
//Basic unit: module for a 2x1 multiplexer
-
 
45
module Mux2 (a, b, op, out);
-
 
46
   input a, b, op;
-
 
47
   output out;
-
 
48
   wire w1, w2, w3;
-
 
49
 
-
 
50
   NOT_1 not1 (op, w1);
-
 
51
 
-
 
52
   AND_2 and2 (a, w1, w2);
-
 
53
   AND_2 and1 (b, op, w3);
-
 
54
 
-
 
55
   OR_2 or1 (w2, w3, out);
-
 
56
endmodule
-
 
57
 
-
 
58
//basic unit: 3-input NAND gate
-
 
59
module NAND_3 (in1, in2, in3, out);
-
 
60
  input in1, in2, in3;
-
 
61
  output out;
-
 
62
  assign out = ~(in1 & in2 & in3);
-
 
63
endmodule
-
 
64
 
-
 
65
//basic unit: 4-input NAND gate
-
 
66
module NAND_4 (in1, in2, in3, in4, out);
-
 
67
  input in1, in2, in3, in4;
-
 
68
  output out;
-
 
69
  assign out = ~(in1 & in2 & in3 & in4);
-
 
70
endmodule
-
 
71
 
-
 
72
// basic unit: 2-input NAND gate
-
 
73
module NAND_2 (in1, in2, out);
-
 
74
   input in1, in2;
-
 
75
   output out;
-
 
76
   assign out = ~(in1 & in2);
-
 
77
endmodule
-
 
78
 
-
 
79
// basic unit: 2-input NOR gate
-
 
80
module NOR_2 ( in1, in2, out);
-
 
81
   input in1, in2;
-
 
82
   output out;
-
 
83
   assign out = ~(in1 | in2);
-
 
84
endmodule
-
 
85
 
-
 
86
// module for a 4x1 multiplexer
-
 
87
module Mux4 (a, b, c, d, op, out);
-
 
88
   input a, b, c, d;
-
 
89
   input [0:1]op;
-
 
90
   output out;
-
 
91
   wire w1, w2, f1, f2, f3, f4;
-
 
92
 
-
 
93
   //instantiate two NOT gates
-
 
94
   NOT_1 not1 (op[0:0], w1);
-
 
95
   NOT_1 not2 (op[1:1], w2);
-
 
96
 
-
 
97
   //instantiate four 3-input NAND gates
-
 
98
   NAND_3 nand3_1 (a, w1, w2, f1);
-
 
99
   NAND_3 nand3_2 (b, w1, op[1:1], f2);
-
 
100
   NAND_3 nand3_3 (c, op[0:0], w2, f3);
-
 
101
   NAND_3 nand3_4 (d, op[0:0], op[1:1], f4);
-
 
102
 
-
 
103
   //instantiate one 4-input NAND gate
-
 
104
   NAND_4 nand4_1 (f1, f2, f3, f4, out);
-
 
105
endmodule
-
 
106
 
-
 
107
// CarryOut module for the 1-bit Adder
-
 
108
//cout = cin . a + cin . b + a . b
-
 
109
module CarryOut (carryIn, a, b, carryOut);
-
 
110
   input carryIn, a, b;
-
 
111
   output carryOut;
-
 
112
 
-
 
113
   wire w1, w2, w3;
-
 
114
 
-
 
115
   AND_2  and1 (carryIn, a, w1);
-
 
116
   AND_2  and2 (carryIn, b, w2);
-
 
117
   AND_2  and3 (a, b, w3);
-
 
118
 
-
 
119
   OR_3   or1 (w1, w2, w3, carryOut);
-
 
120
endmodule
-
 
121
 
-
 
122
//Sum module for 1-bit ALU
-
 
123
module Sum (carryIn, a, b, sum);
-
 
124
   input a, b, carryIn;
-
 
125
   wire w1, w2, w3, f1, f2, f3, f4;
-
 
126
   output sum;
-
 
127
 
-
 
128
   NOT_1 not1 (carryIn, w1);
-
 
129
   NOT_1 not2 (a, w2);
-
 
130
   NOT_1 not3 (b, w3);
-
 
131
 
-
 
132
   AND_3 and1 (a, w3, w1, f1);
-
 
133
   AND_3 and2 (w2, b, w1, f2);
-
 
134
   AND_3 and3 (w2, w3, carryIn, f3);
-
 
135
   AND_3 and4 (a, b, carryIn, f4);
-
 
136
 
-
 
137
   OR_4 or1 (f1, f2, f3, f4, sum);
-
 
138
 
-
 
139
endmodule
-
 
140
 
-
 
141
//module a 1-bit adder
-
 
142
module OneBitAdder (carryIn, a, b, carryOut, result);
-
 
143
   input carryIn, a, b;
-
 
144
   output carryOut, result;
-
 
145
 
-
 
146
   Sum sum (carryIn, a, b, result);
-
 
147
   CarryOut cout (carryIn, a, b, carryOut);
-
 
148
endmodule
-
 
149
 
-
 
150
// module for the 1-bit ALU
-
 
151
module ALU1 (a, b, cin, op, cout, result);
19
module ALU1 (a, b, cin, op, cout, result);
152
    input a, b, cin;
20
    input a, b, cin;
153
    input[0:1] op; /* 00=AND, 01=OR, 10=ADD, 11=ADD A+~B */
21
    input[0:1] op; /* 00=AND, 01=OR, 10=ADD, 11=ADD A+~B */
154
    output cout, result;
22
    output cout, result;
155
 
23