OpenCores
URL https://opencores.org/ocsvn/ag_6502/ag_6502/trunk

Subversion Repositories ag_6502

[/] [ag_6502/] [trunk/] [juke-box/] [ag_main.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 olegodints
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company:   BMSTU
4
// Engineer:  Oleg Odintsov
5
// 
6
// Create Date:    15:09:47 01/19/2012 
7
// Design Name: 
8
// Module Name:    ag_main
9
// Project Name:    Agat Hardware Project
10
// Target Devices: 
11
// Tool versions: 
12
// Description: 
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: 
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
 
22
module RAM2kx8(input CLK, input[10:0] AB, input CS, input READ, output[7:0] DO, input[7:0] DI);
23
        reg[7:0] mem[0:2047];
24
        reg[7:0] R;
25
        assign DO = CS? R: 8'bZ;
26
        initial begin
27
                `include "monitor7.v"
28
//              mem['h7FA] = 8'h58;
29
//              mem['h7FB] = 8'hF9;
30
                mem['h7FC] = 8'h00;
31
                mem['h7FD] = 8'h18;
32
        end
33
        always @(posedge CLK) if (CS) if (READ) R <= mem[AB]; else mem[AB] <= DI;
34
endmodule
35
 
36
module RAM4kx8(input CLK, input[11:0] AB, input CS, input READ, output[7:0] DO, input[7:0] DI);
37
        reg[7:0] mem[0:4095];
38
        reg[7:0] R;
39
        assign DO = CS? R: 8'bZ;
40
        always @(posedge CLK) if (CS) if (READ) R <= mem[AB]; else mem[AB] <= DI;
41
endmodule
42
 
43
module RAM8kx8(input CLK, input[12:0] AB, input CS, input READ, output[7:0] DO, input[7:0] DI);
44
        reg[7:0] mem[0:8191];
45
        reg[7:0] R;
46
        assign DO = CS? R: 8'bZ;
47
        always @(posedge CLK) if (CS) if (READ) R <= mem[AB]; else mem[AB] <= DI;
48
endmodule
49
 
50
module RAM32kx8(input CLK, input[14:0] AB, input CS, input READ, output[7:0] DO, input[7:0] DI);
51
        reg[7:0] mem[0:32767];
52
        reg[7:0] R;
53
        integer i;
54
        assign DO = CS? R: 8'bZ;
55
        initial begin
56
                for(i = 0; i<32768; i = i + 1)  mem[i] <= 0;
57
        end
58
        always @(posedge CLK) if (CS) if (READ) R <= mem[AB]; else mem[AB] <= DI;
59
endmodule
60
 
61
module ag_main(
62
    input clk50,
63
         input[3:0] btns,
64
         output[7:0] leds,
65
         output[3:0] controls,
66
         output[4:0] vga_bus,
67
         input[1:0] ps2_bus_in,
68
         output clk_cpu
69
    );
70
 
71
//      assign leds = 0;
72
//      assign controls = 0;
73
//      assign vga_bus = 0;
74
 
75
        wire clk1, clk10;
76
        clk_div#5 cd5(clk50, clk10);
77
   clk_div#10 cd10(clk10, clk1);
78
 
79
 
80
        wire clk_vram;
81
        wire[13:0] AB2;
82
        wire[15:0] DI2;
83
 
84
        wire [15:0] AB;  // address bus
85
        wire [7:0] DI;           // data in, read bus
86
        wire [7:0] DO;           // data out, write bus
87
        wire read;
88
        wire rom_cs, ram_cs, xram_cs;
89
        wire phi_1, phi_2;
90
 
91
        RAM32Kx8x16 base_ram(phi_2, AB[14:0], ram_cs, read, DI, DO,
92
                                                        clk_vram, AB2, 1, DI2);
93
        RAM2kx8 rom1(phi_2, AB[10:0], rom_cs, read, DI, DO);
94
//      RAM8kx8 xram(phi_2, AB[12:0], xram_cs, read, DI, DO);
95
 
96
        wire [3:0] AB_HH = AB[15:12];
97
        wire [3:0] AB_HL = AB[11:8];
98
        wire [3:0] AB_LH = AB[7:4];
99
        wire [3:0] AB_LL = AB[3:0];
100
        wire [7:0] AB_H = AB[15:8];
101
        wire [7:0] AB_L = AB[7:0];
102
        wire AB_CXXX = (AB_HH == 4'hC);
103
        wire AB_FXXX = (AB_HH == 4'hF);
104
 
105
        wire AB_C0XX = AB_CXXX && !AB_HL;
106
 
107
        wire AB_C00X = AB_C0XX && (AB_LH == 4'h0);
108
        wire AB_C01X = AB_C0XX && (AB_LH == 4'h1);
109
        wire AB_C02X = AB_C0XX && (AB_LH == 4'h2);
110
        wire AB_C03X = AB_C0XX && (AB_LH == 4'h3);
111
        wire AB_C04X = AB_C0XX && (AB_LH == 4'h4);
112
        wire AB_C05X = AB_C0XX && (AB_LH == 4'h5);
113
        wire AB_C7XX = AB_CXXX && (AB_HL == 4'h7);
114
 
115
        reg timer_ints = 0;
116
 
117
        assign rom_cs = AB_FXXX && AB[11]; // F800-FFFF
118
        assign ram_cs = !AB[15];
119
        assign xram_cs = (AB_HH[3:1] == 3'b100);
120
 
121
 
122
        reg reset_auto = 1;
123
        wire reset;
124
        wire WE = ~read;                // write enable
125
        supply0 IRQ;            // interrupt request
126
        wire NMI;               // non-maskable interrupt request
127
        supply1 RDY;            // Ready signal. Pauses CPU when RDY=0 
128
        supply1 SO;                     // Set Overflow, not used.
129
        wire SYNC;
130
 
131
        assign NMI = timer_ints & vga_bus[0];
132
 
133
 
134
 
135
        reg[7:0] vmode = 0;
136
        wire[7:0] key_reg;
137
        reg[7:0] b_reg;
138
        reg[3:0] lb;
139
        wire key_rus;
140
        reg key_clear = 0;
141
        wire key_rst, key_pause;
142
 
143
        reg beep_reg = 0, tape_out_reg = 0;
144
 
145
 
146
        assign reset  = 0;//btns[0];
147
        assign leds = AB[11:4];
148
        assign controls = {1'b0, beep_reg ^ tape_out_reg, tape_out_reg, beep_reg};
149
 
150
        ag_video video(clk50, vmode, clk_vram, AB2, DI2, vga_bus);
151
 
152
 
153
        wire[1:0] ps2_bus;
154
 
155
        signal_filter sf1(clk1, ps2_bus_in[0], ps2_bus[0]);
156
        signal_filter sf2(clk1, ps2_bus_in[1], ps2_bus[1]);
157
 
158
 
159
        ag_keyb keyb(phi_2, ps2_bus, key_reg, key_clear, key_rus, key_rst, key_pause);
160
 
161
        assign DI = (AB_C00X && !WE)?b_reg?b_reg:key_reg:8'bZ;
162
        wire reset_all = reset | reset_auto | key_rst;
163
 
164
        always @(posedge phi_2) begin
165
                key_clear <= AB_C01X;
166
                if (AB_C01X) b_reg <= 0;
167
                else if (AB_C04X) timer_ints <= 1;
168
                else if (AB_C05X || reset_all) timer_ints <= 0;
169
 
170
                if (btns[2] & ~lb[2]) b_reg <= 8'h8D;
171
                else if (btns[0] & ~lb[0]) b_reg <= 8'h9A;
172
                else if (btns[1] & ~lb[1]) b_reg <= 8'hA0;
173
                else if (btns[3] & ~lb[3]) b_reg <= 8'h99;
174
                lb <= btns;
175
 
176
                if (AB_C02X) tape_out_reg <= ~tape_out_reg;
177
                if (AB_C03X) beep_reg <= ~beep_reg;
178
                if (AB_C7XX) vmode <= AB_L;
179
        end
180
        always @(posedge vga_bus[0]) begin
181
                reset_auto <= 0;
182
        end
183
 
184
        ag6502_ext_clock clk(clk50, clk1, phi_1, phi_2);
185
        ag6502 cpu(clk1, phi_1, phi_2, AB, read, DI, DO,
186
                                        RDY & ~key_pause, ~reset_all, ~IRQ, ~NMI, SO, SYNC);
187
 
188
        assign clk_cpu = clk1;
189
 
190
endmodule
191
 
192
 
193
module ag_test(
194
    input clk10
195
    );
196
 
197
        wire clk1, clkx;
198
        my_clk_div#10 c10(clk10, clk1);
199
        my_clk_div#100 c100(clk1, clkx);
200
 
201
        wire[13:0] AB2 = 0;
202
        wire[15:0] DI2;
203
 
204
        wire [15:0] AB;  // address bus
205
        wire [7:0] DI;           // data in, read bus
206
        wire [7:0] DO;           // data out, write bus
207
        wire read;
208
        wire rom_cs, ram_cs;
209
        wire phi_1, phi_2;
210
        wire clk_vram = 0;
211
 
212
//      RAM32Kx8x16 base_ram(phi_2, AB[14:0], ram_cs, read, DI, DO, 
213
//                                                      clk_vram, AB2, 1, DI2);
214
        RAM32kx8 base_ram(phi_2, AB[14:0], ram_cs, read, DI, DO);
215
        RAM2kx8 rom1(phi_2, AB[10:0], rom_cs, read, DI, DO);
216
 
217
        wire [3:0] AB_HH = AB[15:12];
218
        wire [3:0] AB_HL = AB[11:8];
219
        wire [3:0] AB_LH = AB[7:4];
220
        wire [3:0] AB_LL = AB[3:0];
221
        wire [7:0] AB_H = AB[15:8];
222
        wire [7:0] AB_L = AB[7:0];
223
        wire AB_CXXX = (AB_HH == 4'hC);
224
        wire AB_FXXX = (AB_HH == 4'hF);
225
 
226
        wire AB_C0XX = AB_CXXX && !AB_HL;
227
 
228
        wire AB_C00X = AB_C0XX && (AB_LH == 4'h0);
229
        wire AB_C01X = AB_C0XX && (AB_LH == 4'h1);
230
        wire AB_C02X = AB_C0XX && (AB_LH == 4'h2);
231
        wire AB_C03X = AB_C0XX && (AB_LH == 4'h3);
232
        wire AB_C04X = AB_C0XX && (AB_LH == 4'h4);
233
        wire AB_C05X = AB_C0XX && (AB_LH == 4'h5);
234
        wire AB_C7XX = AB_CXXX && (AB_HL == 4'h7);
235
 
236
        reg timer_ints = 1;
237
 
238
        assign rom_cs = AB_FXXX && AB[11]; // F800-FFFF
239
        assign ram_cs = !AB[15];
240
        assign xram_cs = (AB_HH[3:1] == 3'b100);
241
 
242
 
243
        reg reset_auto = 1;
244
        wire reset;
245
        wire WE = ~read;                // write enable
246
        supply0 IRQ;            // interrupt request
247
        wire NMI;               // non-maskable interrupt request
248
        supply1 RDY;            // Ready signal. Pauses CPU when RDY=0 
249
        supply1 SO;                     // Set Overflow, not used.
250
        wire SYNC;
251
 
252
        assign NMI = clkx;
253
 
254
 
255
 
256
        reg[7:0] vmode = 0;
257
        wire[7:0] key_reg;
258
        reg[7:0] b_reg;
259
        reg lb;
260
        wire key_rus = 0;
261
        reg key_clear = 0;
262
        wire key_rst = 0, key_pause = 0;
263
 
264
        reg beep_reg = 0, tape_out_reg = 0;
265
 
266
 
267
        assign reset  = 0;//btns[0];
268
 
269
        assign DI = (AB_C00X && !WE)?b_reg?b_reg:key_reg:8'bZ;
270
 
271
        always @(negedge clkx) begin
272
                reset_auto <= 0;
273
        end
274
 
275
        ag6502_ext_clock#(2,1) clk(clk10, clk1, phi_1, phi_2);
276
        ag6502 cpu(clk1, phi_1, phi_2, AB, read, DI, DO,
277
                                        RDY & ~key_pause, ~(reset | reset_auto | key_rst), ~IRQ, ~NMI, SO, SYNC);
278
 
279
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.