Skip to content

Commit f70d2d6

Browse files
authored
Merge pull request #1240 from ogamespec/master
Core6502 decoder.v
2 parents afc4c7f + e8bd240 commit f70d2d6

6 files changed

Lines changed: 365 additions & 0 deletions

File tree

HDL/Core6502/decoder.v

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,138 @@ module Decoder(
1818

1919
output [129:0] X;
2020

21+
wire [20:0] d;
22+
assign d = {n_T1X,n_T0,n_IR[5],IR[5],n_IR[6],IR[6],n_IR[2],IR[2],n_IR[3],IR[3],n_IR[4],IR[4],n_IR[7],IR[7],n_IR[0],IR01,n_IR[1],n_T2,n_T3,n_T4,n_T5};
23+
24+
assign X[0] = ~|{d[5],d[8],d[14],d[15],d[17]};
25+
assign X[1] = ~|{d[2],d[6],d[10],d[11],d[13]};
26+
assign X[2] = ~|{d[3],d[6],d[10],d[12],d[13]};
27+
assign X[3] = ~|{d[5],d[8],d[9],d[12],d[13],d[17],d[19]};
28+
assign X[4] = ~|{d[5],d[8],d[10],d[12],d[13],d[15],d[17],d[19]};
29+
assign X[5] = ~|{d[5],d[8],d[9],d[16],d[17],d[19]};
30+
assign X[6] = ~|{d[3],d[10],d[14]};
31+
assign X[7] = ~|{d[4],d[8],d[15]};
32+
assign X[8] = ~|{d[3],d[6],d[9],d[11],d[13]};
33+
assign X[9] = ~|{d[4],d[8],d[9],d[12],d[13],d[15],d[17],d[19]};
34+
assign X[10] = ~|{d[4],d[8],d[9],d[12],d[13],d[16],d[17],d[19]};
35+
assign X[11] = ~|{d[5],d[8],d[9],d[16],d[18],d[19]};
36+
assign X[12] = ~|{d[4],d[8],d[15],d[17]};
37+
assign X[13] = ~|{d[4],d[8],d[10],d[12],d[13],d[15],d[17],d[19]};
38+
assign X[14] = ~|{d[4],d[8],d[15],d[18],d[19]};
39+
assign X[15] = ~|{d[4],d[8],d[9],d[12],d[13],d[16],d[17],d[20]};
40+
assign X[16] = ~|{d[5],d[8],d[9],d[12],d[13],d[16],d[18],d[20]};
41+
assign X[17] = ~|{d[4],d[8],d[10],d[12],d[13],d[15],d[18],d[19]};
42+
assign X[18] = ~|{d[5],d[8],d[9],d[12],d[13],d[17],d[20]};
43+
assign X[19] = ~|{d[5],d[8],d[14],d[15],d[18],d[19]};
44+
assign X[20] = ~|{d[5],d[8],d[9],d[15],d[18],d[19]};
45+
assign X[21] = ~|{d[5],d[7],d[9],d[11],d[13],d[15],d[18],d[19]};
46+
assign X[22] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[15],d[17]};
47+
assign X[23] = ~|{d[5],d[7],d[9],d[12],d[13],d[17],d[19]};
48+
assign X[24] = ~|{d[1],d[5],d[7],d[9],d[11],d[13],d[16],d[18]};
49+
assign X[25] = ~|{d[2],d[5],d[7],d[9],d[12],d[13],d[18]};
50+
assign X[26] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[16],d[17]};
51+
assign X[27] = ~|{d[4],d[7],d[16],d[18]};
52+
assign X[28] = ~|{d[3]};
53+
assign X[29] = ~|{d[6],d[7],d[16],d[17],d[19]};
54+
assign X[30] = ~|{d[5],d[7],d[9],d[12],d[14],d[16]};
55+
assign X[31] = ~|{d[3],d[9],d[12],d[14]};
56+
assign X[32] = ~|{d[6],d[7],d[15],d[17],d[19]};
57+
assign X[33] = ~|{d[3],d[11]};
58+
assign X[34] = ~|{d[19]};
59+
assign X[35] = ~|{d[3],d[5],d[7],d[9],d[13]};
60+
assign X[36] = ~|{d[2],d[5],d[7],d[9]};
61+
assign X[37] = ~|{d[1],d[5],d[7],d[9],d[11],d[13],d[15]};
62+
assign X[38] = ~|{d[1],d[5],d[7],d[9],d[11],d[13],d[16],d[17]};
63+
assign X[39] = ~|{d[2],d[6],d[9],d[11],d[13]};
64+
assign X[40] = ~|{d[1],d[6],d[10],d[11],d[13]};
65+
assign X[41] = ~|{d[3],d[6],d[10],d[11],d[13]};
66+
assign X[42] = ~|{d[2],d[10],d[12]};
67+
assign X[43] = ~|{d[5],d[7],d[9],d[12],d[13],d[18]};
68+
assign X[44] = ~|{d[4],d[8],d[16],d[18]};
69+
assign X[45] = ~|{d[1],d[6],d[9],d[11],d[13]};
70+
assign X[46] = ~|{d[2],d[6],d[10],d[11],d[13]};
71+
assign X[47] = ~|{d[5],d[7],d[9],d[11],d[13],d[16]};
72+
assign X[48] = ~|{d[3],d[5],d[7],d[9],d[11],d[13],d[15],d[18]};
73+
assign X[49] = ~|{d[5],d[8],d[9],d[16],d[19]};
74+
assign X[50] = ~|{d[6],d[8],d[16],d[17],d[19]};
75+
assign X[51] = ~|{d[6],d[8],d[16],d[18],d[19]};
76+
assign X[52] = ~|{d[6],d[16],d[18],d[19]};
77+
assign X[53] = ~|{d[4],d[7],d[15],d[18]};
78+
assign X[54] = ~|{d[2],d[5],d[7],d[9],d[12],d[14],d[16]};
79+
assign X[55] = ~|{d[4],d[7],d[15]};
80+
assign X[56] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[15],d[18]};
81+
assign X[57] = ~|{d[3],d[5],d[7],d[9],d[13]};
82+
assign X[58] = ~|{d[5],d[8],d[10],d[12],d[13],d[15],d[17],d[19]};
83+
assign X[59] = ~|{d[6],d[7],d[20]};
84+
assign X[60] = ~|{d[6],d[16],d[18],d[20]};
85+
assign X[61] = ~|{d[4],d[7],d[9],d[12],d[13],d[20]};
86+
assign X[62] = ~|{d[4],d[8],d[9],d[12],d[13],d[15],d[17],d[19]};
87+
assign X[63] = ~|{d[5],d[7],d[9],d[12],d[13],d[16],d[18],d[19]};
88+
assign X[64] = ~|{d[6],d[8],d[15],d[18],d[19]};
89+
assign X[65] = ~|{d[6],d[19]};
90+
assign X[66] = ~|{d[5],d[8],d[9],d[12],d[13],d[15],d[18],d[19]};
91+
assign X[67] = ~|{d[4],d[7],d[9],d[12],d[13],d[19]};
92+
assign X[68] = ~|{d[4],d[8],d[9],d[12],d[13],d[15],d[18],d[19]};
93+
assign X[69] = ~|{d[5],d[7],d[9],d[14],d[15],d[18],d[19]};
94+
assign X[70] = ~|{d[6],d[7],d[15],d[18],d[19]};
95+
assign X[71] = ~|{d[1],d[10],d[12]};
96+
assign X[72] = ~|{d[0],d[6],d[10],d[11],d[13]};
97+
assign X[73] = ~|{d[5],d[10],d[11],d[13],d[19]};
98+
assign X[74] = ~|{d[3],d[5],d[7],d[9],d[12],d[13],d[16],d[17]};
99+
assign X[75] = ~|{d[4],d[7],d[9],d[12],d[13],d[16],d[19]};
100+
assign X[76] = ~|{d[4],d[7],d[16]};
101+
assign X[77] = ~|{d[3],d[5],d[7],d[9],d[11],d[13],d[15],d[17]};
102+
assign X[78] = ~|{d[2],d[5],d[7],d[9],d[11],d[13],d[15],d[18]};
103+
assign X[79] = ~|{d[6],d[8],d[15],d[17]};
104+
assign X[80] = ~|{d[3],d[5],d[10],d[11],d[13]};
105+
assign X[81] = ~|{d[3],d[11],d[14]};
106+
assign X[82] = ~|{d[3],d[6],d[11],d[13]};
107+
assign X[83] = ~|{d[3],d[12]};
108+
assign X[84] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[16],d[18]};
109+
assign X[85] = ~|{d[1]};
110+
assign X[86] = ~|{d[2]};
111+
assign X[87] = ~|{d[5],d[7],d[9],d[11],d[13],d[17],d[19]};
112+
assign X[88] = ~|{d[5],d[7],d[9],d[12],d[14],d[16],d[19]};
113+
assign X[89] = ~|{d[0],d[6],d[9],d[11],d[13]};
114+
assign X[90] = ~|{d[2],d[12]};
115+
assign X[91] = ~|{d[1],d[6],d[10],d[11],d[13]};
116+
assign X[92] = ~|{d[2],d[10],d[12]};
117+
assign X[93] = ~|{d[2],d[5],d[10],d[11],d[13]};
118+
assign X[94] = ~|{d[5],d[7],d[9],d[11],d[13],d[17]};
119+
assign X[95] = ~|{d[5],d[7],d[9],d[11],d[13],d[15],d[18]};
120+
assign X[96] = ~|{d[5],d[7],d[9],d[12],d[14],d[16]};
121+
assign X[97] = ~|{d[8],d[15],d[17]};
122+
assign X[98] = ~|{d[1],d[5],d[7],d[9],d[11],d[13],d[15],d[17]};
123+
assign X[99] = ~|{d[3],d[5],d[7],d[9],d[12],d[13],d[15],d[17]};
124+
assign X[100] = ~|{d[3],d[5],d[7],d[9],d[12],d[13],d[17]};
125+
assign X[101] = ~|{d[1],d[5],d[7],d[9],d[12],d[14],d[16]};
126+
assign X[102] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[16]};
127+
assign X[103] = ~|{d[0],d[5],d[7],d[9],d[11],d[13],d[15],d[18]};
128+
assign X[104] = ~|{d[3],d[5],d[7],d[9],d[12],d[14],d[16],d[17]};
129+
assign X[105] = ~|{d[2],d[5],d[7],d[9],d[12],d[13],d[18]};
130+
assign X[106] = ~|{d[4],d[16]};
131+
assign X[107] = ~|{d[4],d[7],d[15]};
132+
assign X[108] = ~|{d[5],d[7],d[10],d[12],d[13],d[16],d[19]};
133+
assign X[109] = ~|{d[5],d[7],d[9],d[14],d[15],d[18],d[20]};
134+
assign X[110] = ~|{d[5],d[7],d[10],d[12],d[13],d[15],d[19]};
135+
assign X[111] = ~|{d[2],d[10],d[11],d[14]};
136+
assign X[112] = ~|{d[6],d[16],d[18],d[20]};
137+
assign X[113] = ~|{d[5],d[7],d[9],d[14],d[15],d[18],d[19]};
138+
assign X[114] = ~|{d[5],d[7],d[9],d[12],d[13],d[15],d[18],d[19]};
139+
assign X[115] = ~|{d[1],d[5],d[7],d[9],d[11],d[13],d[16],d[17]};
140+
assign X[116] = ~|{d[6],d[8],d[16],d[17],d[20]};
141+
assign X[117] = ~|{d[5],d[8],d[9],d[12],d[14],d[16],d[20]};
142+
assign X[118] = ~|{d[4],d[7],d[9],d[12],d[13],d[15],d[20]};
143+
assign X[119] = ~|{d[5],d[8],d[9],d[11],d[16],d[20]};
144+
assign X[120] = ~|{d[5],d[8],d[10],d[12],d[13],d[16],d[19]};
145+
assign X[121] = ~|{d[15]};
146+
assign X[122] = ~|{d[2],d[9],d[12],d[14]};
147+
assign X[123] = ~|{d[3],d[9],d[11],d[14]};
148+
assign X[124] = ~|{d[0],d[6],d[11],d[13]};
149+
assign X[125] = ~|{d[1],d[10],d[12]};
150+
assign X[126] = ~|{d[7]};
151+
assign X[127] = ~|{d[5],d[8],d[10],d[12],d[13],d[15],d[18]};
152+
assign X[128] = ~|{d[12],d[13]};
153+
assign X[129] = ~|{d[5],d[7],d[9],d[12],d[13]};
154+
21155
endmodule // Decoder
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.csv
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
iverilog -D ICARUS -o decoder_test.run ../../../Common/*.v ../../../Core6502/*.v decoder_test.v
2+
vvp decoder_test.run
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Go through all 6502 decoder values and output them to CSV.
2+
3+
`timescale 1ns/1ns
4+
5+
module Decoder_Run ();
6+
7+
reg CLK;
8+
integer f;
9+
10+
always #1 CLK = ~CLK;
11+
12+
reg [13:0] Decoder_cnt; // The counter acts as an enumerator for all decoder inputs
13+
14+
wire [129:0] Decoder_out;
15+
16+
wire n_T0;
17+
wire n_T1X;
18+
wire n_T2;
19+
wire n_T3;
20+
wire n_T4;
21+
wire n_T5;
22+
wire IR01;
23+
wire [7:0] IR;
24+
25+
// Assign the decoder inputs.
26+
// The lower six bits represent the Tx. The remaining high bits are IR.
27+
28+
assign n_T0 = ~Decoder_cnt[0];
29+
assign n_T1X = ~Decoder_cnt[1];
30+
assign n_T2 = ~Decoder_cnt[2];
31+
assign n_T3 = ~Decoder_cnt[3];
32+
assign n_T4 = ~Decoder_cnt[4];
33+
assign n_T5 = ~Decoder_cnt[5];
34+
assign IR = Decoder_cnt[13:6];
35+
assign IR01 = IR[0]|IR[1];
36+
37+
Decoder dec (
38+
.n_T0(n_T0), .n_T1X(n_T1X),
39+
.n_T2(n_T2), .n_T3(n_T3), .n_T4(n_T4), .n_T5(n_T5),
40+
.IR01(IR01),
41+
.IR(IR), .n_IR(~IR),
42+
.X(Decoder_out) );
43+
44+
always @(posedge CLK) begin
45+
$fwrite (f, "%b,%b\n", Decoder_cnt, Decoder_out);
46+
Decoder_cnt = Decoder_cnt + 1;
47+
end
48+
49+
initial begin
50+
51+
$dumpfile("decoder_test.vcd");
52+
$dumpvars(0, Decoder_Run);
53+
54+
f = $fopen("decoder_6502.csv","w");
55+
$fwrite(f, "inputs,outputs\n");
56+
57+
Decoder_cnt <= 0;
58+
CLK <= 1'b0;
59+
60+
repeat (1<<14) @ (posedge CLK);
61+
$fclose (f);
62+
$finish;
63+
end
64+
65+
endmodule // Decoder_Run

Scripts/decoder.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'''
2+
Script for automatic generation of NOR decoders.
3+
'''
4+
5+
import os
6+
import sys
7+
8+
def Main (decoder_txt):
9+
print (f"Using {decoder_txt} as bitmask");
10+
11+
bitmask_dump = open(decoder_txt, 'r')
12+
lines = bitmask_dump.readlines()
13+
14+
decoder_out = 0
15+
for line in lines:
16+
decoder_in = 0
17+
first = True
18+
print (f"assign dec_out[{decoder_out}] = ~|{{", end = '') # Reducing nor
19+
for bit in line[::-1]: # msb first in input vector, need to reverse string
20+
if (bit == '0' or bit == '1'):
21+
if (bit == '1'):
22+
if (not first): print (",", end = '')
23+
print (f"d[{decoder_in}]", end = '')
24+
first = False
25+
decoder_in += 1
26+
print ("};")
27+
decoder_out += 1
28+
29+
if __name__ == '__main__':
30+
if (len(sys.argv) < 2):
31+
print ("Use: python3 decoder.py <decoder.txt>")
32+
else:
33+
Main(sys.argv[1])

Scripts/decoder.txt

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
000101100000100100000
2+
000000010110001000100
3+
000000011010001001000
4+
010100011001100100000
5+
010101011010100100000
6+
010110000001100100000
7+
000000100010000001000
8+
000001000000100010000
9+
000000010101001001000
10+
010101011001100010000
11+
010110011001100010000
12+
011010000001100100000
13+
000101000000100010000
14+
010101011010100010000
15+
011001000000100010000
16+
100110011001100010000
17+
101010011001100100000
18+
011001011010100010000
19+
100100011001100100000
20+
011001100000100100000
21+
011001000001100100000
22+
011001010101010100000
23+
000101010101010100001
24+
010100011001010100000
25+
001010010101010100010
26+
001000011001010100100
27+
000110010101010100001
28+
001010000000010010000
29+
000000000000000001000
30+
010110000000011000000
31+
000010101001010100000
32+
000000101001000001000
33+
010101000000011000000
34+
000000000100000001000
35+
010000000000000000000
36+
000000010001010101000
37+
000000000001010100100
38+
000001010101010100010
39+
000110010101010100010
40+
000000010101001000100
41+
000000010110001000010
42+
000000010110001001000
43+
000000001010000000100
44+
001000011001010100000
45+
001010000000100010000
46+
000000010101001000010
47+
000000010110001000100
48+
000010010101010100000
49+
001001010101010101000
50+
010010000001100100000
51+
010110000000101000000
52+
011010000000101000000
53+
011010000000001000000
54+
001001000000010010000
55+
000010101001010100100
56+
000001000000010010000
57+
001001010101010100001
58+
000000010001010101000
59+
010101011010100100000
60+
100000000000011000000
61+
101010000000001000000
62+
100000011001010010000
63+
010101011001100010000
64+
011010011001010100000
65+
011001000000101000000
66+
010000000000001000000
67+
011001011001100100000
68+
010000011001010010000
69+
011001011001100010000
70+
011001100001010100000
71+
011001000000011000000
72+
000000001010000000010
73+
000000010110001000001
74+
010000010110000100000
75+
000110011001010101000
76+
010010011001010010000
77+
000010000000010010000
78+
000101010101010101000
79+
001001010101010100100
80+
000101000000101000000
81+
000000010110000101000
82+
000000100100000001000
83+
000000010100001001000
84+
000000001000000001000
85+
001010010101010100001
86+
000000000000000000010
87+
000000000000000000100
88+
010100010101010100000
89+
010010101001010100000
90+
000000010101001000001
91+
000000001000000000100
92+
000000010110001000010
93+
000000001010000000100
94+
000000010110000100100
95+
000100010101010100000
96+
001001010101010100000
97+
000010101001010100000
98+
000101000000100000000
99+
000101010101010100010
100+
000101011001010101000
101+
000100011001010101000
102+
000010101001010100010
103+
000010010101010100001
104+
001001010101010100001
105+
000110101001010101000
106+
001000011001010100100
107+
000010000000000010000
108+
000001000000010010000
109+
010010011010010100000
110+
101001100001010100000
111+
010001011010010100000
112+
000000100110000000100
113+
101010000000001000000
114+
011001100001010100000
115+
011001011001010100000
116+
000110010101010100010
117+
100110000000101000000
118+
100010101001100100000
119+
100001011001010010000
120+
100010000101100100000
121+
010010011010100100000
122+
000001000000000000000
123+
000000101001000000100
124+
000000100101000001000
125+
000000010100001000001
126+
000000001010000000010
127+
000000000000010000000
128+
001001011010100100000
129+
000000011000000000000
130+
000000011001010100000

0 commit comments

Comments
 (0)