The GAL16V8 PLD - Oakland University

Download Report

Transcript The GAL16V8 PLD - Oakland University

Designing Combinational Logic
Circuits in Verilog - 2
Discussion 7.3
Designing Combinational Logic
Circuits in Verilog - 2
• Binary to Gray code converter
• Gray code to binary converter
• Binary-to-BCD converter
Gray Code
Definition: An ordering of 2n binary numbers such that
only one bit changes from one entry to the next.
Binary coding {0...7}: {000, 001, 010, 011, 100, 101, 110, 111}
Gray coding {0...7}:
{000, 001, 011, 010, 110, 111, 101, 100}
Not unique
One method for generating a Gray code sequence:
Start with all bits zero and successively flip the
right-most bit that produces a new string.
Binary - Gray Code Conversions
Gray code: G[i], i = n – 1 : 0
Binary code: B[i], i = n – 1 : 0
Binary coding {0...7}: {000, 001, 010, 011, 100, 101, 110, 111}
Gray coding {0...7}:
{000, 001, 011, 010, 110, 111, 101, 100}
Convert Binary to Gray:
Copy the most significant bit.
For each smaller i
G[i] = B[i+1] ^ B[i]
Convert Gray to Binary:
Copy the most significant bit.
For each smaller i
B[i] = B[i+1] ^ G[i]
Gray Code
Note that the least significant bit
that can be changed without
repeating a value is the bit
that is changed
Binary to Gray code
G[2] = B[2];
G[1:0] = B[2:1] ^ B[1:0];
Binary
B[2:0]
Gray Code
G[2:0]
000
001
010
011
100
101
110
111
000
001
011
010
110
111
101
100
Binary to Gray code
MSB
grayCode = binary ^ (binary >> 1)
G(msb) = B(msb);
for(j = msb-1; j >= 0; j=j-1)
G(j) = B(j+1) ^ B(j);
B[j]
G[j]
msb = 5 for 6-bit codes
LSB
bin2gray.v
module bin2gray ( B ,G );
input [3:0] B ;
wire [3:0] B ;
output [3:0] G ;
wire [3:0] G ;
assign G[3] = B[3];
assign G[2:0] = B[3:1] ^ B[2:0];
endmodule
Convert Binary to Gray:
Copy the most significant bit.
For each smaller i
G[i] = B[i+1] ^ B[i]
Binary to Gray Code Conversion
Designing Combinational Logic
Circuits in Verilog - 2
• Binary to Gray code converter
• Gray code to binary converter
• Binary-to-BCD converter
Binary - Gray Code Conversions
Gray code: G[i], i = n – 1 : 0
Binary code: B[i], i = n – 1 : 0
Binary coding {0...7}: {000, 001, 010, 011, 100, 101, 110, 111}
Gray coding {0...7}:
{000, 001, 011, 010, 110, 111, 101, 100}
Convert Binary to Gray:
Copy the most significant bit.
For each smaller i
G[i] = B[i+1] ^ B[i]
Convert Gray to Binary:
Copy the most significant bit.
For each smaller i
B[i] = B[i+1] ^ G[i]
Gray Code
Gray code to Binary
B[2] = G[2];
B[1:0] = B[2:1] ^ G[1:0];
Binary
B[2:0]
Gray Code
G[2:0]
000
001
010
011
100
101
110
111
000
001
011
010
110
111
101
100
Gray code to Binary
B(msb) = G(msb);
for(j = msb-1; j >= 0; j--)
B(j) = B(j+1) ^ G(j);
MSB
B[j]
G[j]
LSB
Gray code to Binary
module gray2bin6 ( G ,B );
input [5:0] G ;
wire [5:0] G ;
output [5:0] B ;
wire [5:0] B ;
assign B[5] = G[5];
assign B[4:0] = B[5:1] ^ G[4:0];
endmodule
B(msb) = G(msb);
for(j = msb-1; j >= 0; j=j-1)
B(j) = B(j+1) ^ G(j);
gray2bin.v
module gray2bin ( G ,B );
input [3:0] G ;
wire [3:0] G ;
output [3:0] B ;
reg [3:0] B ;
integer i;
Convert Gray to Binary:
Copy the most significant bit.
For each smaller i
B[i] = B[i+1] ^ G[i]
always @(G)
begin
B[3] = G[3];
for(i=2; i >= 0; i = i-1)
B[i] = B[i+1] ^ G[i];
end
endmodule
Gray Code to Binary Conversion
Designing Combinational Logic
Circuits in Verilog - 2
• Binary to Gray code converter
• Gray code to binary converter
• Binary-to-BCD converter
Shift and Add-3 Algorithm
S1. Shift the binary number left one bit.
22. If 8 shifts have taken place, the BCD number is in the
Hundreds, Tens, and Units column.
33. If the binary value in any of the BCD columns is 5 or greater,
add 3 to that value in that BCD column.
44. Go to 1.
Operation
HEX
Start
Hundreds
Tens
Units
Binary
F
1 1 1 1
F
1 1 1 1
Steps to convert an 8-bit binary number to BCD
Operation
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
Add 3
Shift 7
Add 3
Shift 8
BCD
Hundreds
1
1
1 0
2
Tens
1
0
0
0
1
1 1
0 0
0 1
0 1
1 0
5
Units
1
1
1
0
1
0
0
1
1
0
1
0
0
0
0
1
0
1
1 1
0 1
1 0
0 0
0 0
0 1
0 1
1 1
0 1
1 0
5
Binary
1
1
1
0
1
0
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
F
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1
1
1
1
1
1
1
1
1
F
1 1 1 1
1 1 1
1 1
1
1
Truth table for Add-3 Module
A3 A2 A1 A0
C
S3 S2 S1 S0
A3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
A2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
S3
0
0
0
0
0
1
1
1
1
1
X
X
X
X
X
X
S2
0
0
0
0
1
0
0
0
0
1
X
X
X
X
X
X
S1
0
0
1
1
0
0
0
1
1
0
X
X
X
X
X
X
S0
0
1
0
1
0
0
1
0
1
0
X
X
X
X
X
X
K-Map for S3
A1 A0
A3
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
A2
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
S3
0
0
0
0
0
1
1
1
1
1
X
X
X
X
X
X
S2
0
0
0
0
1
0
0
0
0
1
X
X
X
X
X
X
S1
0
0
1
1
0
0
0
1
1
0
X
X
X
X
X
X
S0
0
1
0
1
0
0
1
0
1
0
X
X
X
X
X
X
A3 A2
00
01
11
10
1
1
1
00
01
11
X
X
X
X
10
1
1
X
X
S3 = A3
| A2 & A0
| A2 & A1
Binary-to-BCD
Converter
RTL Solution
Steps to convert a 6-bit binary number to BCD
Operation
1. Clear all bits of z to zero
2. Shift B left 3 bits
z[8:3] = B[5:0];
3. Do 3 times
if Units >4 then add 3 to Units
(note: Units = z[9:6])
Shift z left 1 bit
4. Tens = P[6:4] = z[12:10]
Units = P[3:0] = z[9:6]
B
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
BCD
P
z
Tens
Units
Binary
5 4 3 2 1 0
3
F
1 1 1 1 1 1
1
1 1
1 1 1 1 1
1 1 1 1
1 1 1
1 1 1
1 0 1 0
1 1 1
1
0 1 0 1
1 1
1
1 0 0 0
1 1
1 1
0 0 0 1
1
1 1 0
0 0 1 1
6
3
7
4
3
13
10 9
0
6 5
0
Operation
module binbcd6(B,P);
input [5:0] B;
output [6:0] P;
reg [6:0] P;
reg [12:0] z;
integer i;
binbcd6.v
always @(B)
begin
for(i = 0; i <= 12; i = i+1)
z[i] = 0;
z[8:3] = B;
for(i = 0; i <= 2; i = i+1)
begin
if(z[9:6] > 4)
z[9:6] = z[9:6] + 3;
z[12:1] = z[11:0];
end
P = z[12:6];
end
endmodule
Tens
Units
Binary
5 4 3 2 1 0
B
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
BCD
P
z
3
F
1 1 1 1 1 1
1
1 1 1 1 1
1 1
1 1 1 1
1 1 1
1 1 1
1 0 1 0
1 1 1
1
0 1 0 1
1 1
1
1 0 0 0
1 1
1 1
0 0 0 1
1
1 1 0
0 0 1 1
6
3
7
4
3
13
10 9
0
6 5
Hex 3F
6-bit binary input
0 B5 B4 B3 B2 B1 B0
1
1
1
1
0
1
1
1
1
1
C1
1
0
C2
1
0
0
0
C3
0
1
1
0
0
0
P7 P6 P5 P4 P3 P2 P1 P0
tens
units
6
3
0
binbcd6.v
Operation
B
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
BCD
P
z
Tens
Units
Hex 3F
6-bit binary input
0 B5 B4 B3 B2 B1 B0
Binary
1
5 4 3 2 1 0
3
F
1 1
1 0 1 0
1 1 1
1
0 1 0 1
1 1
1
1 0 0 0
1 1
1 1
0 0 0 1
1
1 1 0
0 0 1 1
4
3
13
10 9
1
0
1
1
1
1
1
C2
1
0
0
0
C3
0
1
1
0
0
0
P7 P6 P5 P4 P3 P2 P1 P0
3
7
0
1 1 1 1
1 1 1
6
1
1 1 1 1 1
1 1 1
1
C1
1 1 1 1 1 1
1
1
0
6 5
0
tens
units
6
3
BCD output
module binbcd8(B,P);
input [7:0] B;
output [9:0] P;
binbcd8.v
reg [9:0] P;
reg [17:0] z;
integer i;
always @(B)
begin
for(i = 0; i <= 17; i = i+1)
z[i] = 0;
z[10:3] = B;
Operation
B
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
Add 3
Shift 7
Add 3
Shift 8
BCD
P
z
for(i = 1; i <= 5; i = i+1)
begin
if(z[11:8] > 4)
z[11:8] = z[11:8] + 3;
if(z[15:12] > 4)
z[15:12] = z[15:12] + 3;
z[17:1] = z[16:0];
end
P = z[17:8];
end
endmodule
Hundreds
Tens
Units
Binary
4
3
7
1
1
1 0
2
9 8
17 16
1
0
0
0
7
15
1
0
0
0
1
1
1
0
1
1
0
5
1
1
1
0
1
0
0
1
1
0
1
0
0
0
0
1
0
4
12
3
11
1
0
1
0
0
0
0
1
0
1
1
1
1
0
0
0
1
1
1
1
0
5
1
1
1
0
1
0
1
1
1
1
0
1
0
8
1
1
1
1
1
1
1
1
1
1
1
1
7
F
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1
1
1
1
1
1
1
1
1
4
0
F
1 1 1 1
1 1 1
1 1
1
1
3
0
binbcd8.v
Operation
B
HEX
Start
Shift 1
Shift 2
Shift 3
Add 3
Shift 4
Add 3
Shift 5
Shift 6
Add 3
Shift 7
Add 3
Shift 8
BCD
P
z
Hundreds
Tens
Units
Binary
4
3
7
1
1
1 0
2
9 8
17 16
1
0
0
0
7
15
1
0
0
0
1
1
1
0
1
1
0
5
1
1
1
0
1
0
0
1
1
0
1
0
0
0
0
1
0
4
12
3
11
1
0
1
0
0
0
0
1
0
1
1
1
1
0
0
0
1
1
1
1
0
5
1
1
1
0
1
0
1
1
1
1
0
1
0
8
1
1
1
1
1
1
1
1
1
1
1
1
7
F
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1
1
1
1
1
1
1
1
1
4
0
F
1 1 1 1
1 1 1
1 1
1
1
3
0
module binbcd9(B,P);
input [8:0] B;
output [10:0] P;
9-bit Binary Input
binbcd9.v
0 B8 B7 B6 B5 B4 B3 B2 B1 B0
reg [10:0] P;
reg [19:0] z;
integer i;
always @(B)
begin
for(i = 0; i <= 19; i = i+1)
z[i] = 0;
z[11:3] = B;
for(i = 0; i <= 5; i = i+1)
begin
if(z[12:9] > 4)
z[12:9] = z[12:9] + 3;
if(z[16:13] > 4)
z[16:13] = z[16:13] + 3;
z[19:1] = z[18:0];
end
P = z[19:9];
end
endmodule
C1
C2
C3
0
C7
C4
C8
C5
C9
C6
P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0
Hundreds
Tens
Units
BCD Output
Figure 5. 9-bit Binary-to-BCD Converter
9-bit Binary Input
0 B8 B7 B6 B5 B4 B3 B2 B1 B0
binbcd9.v
C1
C2
C3
0
C7
C4
C8
C5
C9
C6
P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0
Hundreds
Tens
Units
BCD Output
Figure 5. 9-bit Binary-to-BCD Converter
16-bit
Binary-to-BCD
Converter
binbcd16.v
module binbcd16(B,P);
input [15:0] B;
output [18:0] P;
reg [18:0] P;
reg [31:0] z;
integer i;
always @(B)
begin
for(i = 0; i <= 31; i = i+1)
z[i] = 0;
z[18:3] = B;
for(i = 0; i <= 12; i = i+1)
begin
if(z[19:16] > 4)
z[19:16] = z[19:16]
if(z[23:20] > 4)
z[23:20] = z[23:20]
if(z[27:24] > 4)
z[27:24] = z[27:24]
if(z[31:28] > 4)
z[31:28] = z[31:28]
z[31:1] = z[30:0];
end
P = z[31:16];
end
endmodule
+ 3;
+ 3;
+ 3;
+ 3;
binbcd16.v