4 * Note about interrupt wiring:
10 * With debug switch clamping all 3 down
16 inout [15:0] cpu_data, // m68k data bus
17 input [23:1] cpu_address, // m68k address bus
18 output [2:0] _cpu_ipl, // m68k interrupt request
19 input _cpu_as, // m68k address strobe
20 input _cpu_uds, // m68k upper data strobe
21 input _cpu_lds, // m68k lower data strobe
22 input cpu_r_w, // m68k read / write
23 output _cpu_dtack, // m68k data acknowledge
24 inout _cpu_reset, // m68k reset
25 output cpu_clk, // m68k clock
28 inout [15:0] ram_data, // sram data bus
29 output [19:1] ram_address, // sram address bus
30 output [3:0] _ram_ce, // sram chip enable
31 output _ram_bhe, // sram upper byte select
32 output _ram_ble, // sram lower byte select
33 output _ram_we, // sram write enable
34 output _ram_oe, // sram output enable
37 input rxd, // rs232 receive
38 output txd, // rs232 send
39 input cts, // rs232 clear to send
40 output rts, // rs232 request to send
43 input [5:0]_joy1, // joystick 1 [fire2,fire,up,down,left,right]
44 input [5:0]_joy2, // joystick 2 [fire2,fire,up,down,left,right]
47 inout msdat, // PS2 mouse data
48 inout msclk, // PS2 mouse clk
49 inout kbddat, // PS2 keyboard data
50 inout kbdclk, // PS2 keyboard clk
53 output _hsync, // horizontal sync
54 output _vsync, // vertical sync
55 output [3:0] red, // red
56 output [3:0] green, // green
57 output [3:0] blue, // blue
60 output left, // audio bitstream left
61 output right, // audio bitstream right
64 input mclk, // master system clock (4.433619 Mhz)
65 output pwrled, // power led
67 input _15khz, // scandoubler disable (jumper, unused)
69 output scsi_hshake, // handshake for scsi fifo
70 input nmi, // macsbug !
73 input _spi_cs, // SPI chip select
74 input sdi, // SPI data input
75 inout sdo, // SPI data output
76 input sck // SPI clock
83 /* Backbus SPI interface */
90 /* Chip-selects & rdata for backbus clients */
92 wire [7:0] bb_rdata_scope;
94 wire [7:0] bb_rdata_ctrl;
96 wire [7:0] bb_rdata_cpu;
98 wire [7:0] bb_rdata_iwm;
100 wire [7:0] bb_rdata_scsi;
102 wire [7:0] bb_rdata_mem;
104 /* Signals for the scope module */
105 wire [63:0] scoped_sigs;
107 /* Main bus between CPU and devices */
108 wire [23:1] bus_addr;
109 wire [15:0] bus_wdata;
117 wire [15:0] bus_rdata_mem;
120 wire [7:0] bus_rdata_scsi;
123 wire [7:0] bus_rdata_scc;
126 wire [7:0] bus_rdata_via;
129 wire [7:0] bus_rdata_iwm;
132 wire [2:0] via_pa_sndvol;
133 wire via_pa_sndbuf_sel; /* 1=main, 0=alt */
134 wire via_pa_rom_ovl; /* 1=overlay */
136 wire via_pa_vidbuf_sel; /* 1=main, 0=alt */
137 wire via_pa_scc_wreq;
138 wire via_pb_mouse_switch;
139 wire via_pb_mouse_x2;
140 wire via_pb_mouse_y2;
141 wire via_pb_snddis; /* 1=disabled */
142 wire [7:0] via_kbd_out;
143 wire via_kbd_out_strobe;
144 wire [7:0] via_kbd_in;
145 wire via_kbd_in_strobe;
150 wire [15:0] vid_pixels;
153 /* SCC additional wires */
162 wire _rtc_data_enable;
174 reg [3:0] reset_ctl = 4'b0000;/* Xilinx tool should cope */
181 /* Scope test hack */
182 reg [7:0] scope_test;
184 /* PS2 mouse & kbd port debug */
185 wire [15:0] ps2m_dbg;
186 wire [15:0] ps2k_dbg;
188 /* Not real synchronizers but will do */
192 /* Instanciate clock generator */
193 clockgen clocks(.mclk(mclk),
198 /* Low skew clock out trick from Matt */
199 OFDDRCPE OFDDRCPE_inst (
\r
200 .Q(cpu_clk), // Data output (connect directly to
202 .C0(sysclk16), // 0 degree clock input
\r
203 .C1(~sysclk16), // 180 degree clock input
\r
204 .CE(1'b1), // Clock enable input
\r
205 .CLR(1'b0), // Asynchronous reset input
\r
206 .D0(1'b1), // Posedge data input
\r
207 .D1(1'b0), // Negedge data input
\r
208 .PRE(1'b0) // Asynchronous preset input
\r
211 /* Instanciate backbus/SPI interface. Use 16Mhz clock for now */
212 spi_backbus spi_bb(.sysclk(sysclk16),
221 .bb_strobe(bb_strobe),
224 /* Our reset currently comes reset_ctl, this will deassert it
225 * after 4clk of config (gives time to slower components like
228 assign reset = ~reset_ctl[0];
229 always@(posedge sysclk16)
230 if (!ctrl_cpu_reset && !_cpu_reset)
233 reset_ctl[3:0] <= { 1'b1, reset_ctl[3:1] };
234 assign _cpu_reset = ctrl_cpu_reset ? 1'b0 : 1'bz;
236 /* Instanciate scope module */
237 scope scop0(.sysclk(sysclk16),
243 .bb_rdata(bb_rdata_scope),
244 .bb_strobe(bb_strobe && bb_cs_scope),
248 assign scoped_sigs = { msclk, /* 63 */
250 cpu_data, /* 61..46 */
251 cpu_address, /* 45..23 */
252 _cpu_ipl, /* 22..20 */
262 assign scoped_sigs = 0;
264 always@(posedge reset or posedge sysclk16) begin
268 scope_test <= scope_test + 1;
272 /* Instanciate the CPU interface */
273 cpu_intf cpu0(.sysclk(sysclk16),
276 .cpu_addr(cpu_address),
281 ._cpu_dtack(_cpu_dtack),
284 .bb_rdata(bb_rdata_cpu),
285 .bb_strobe(bb_strobe && bb_cs_cpu),
288 .bus_wdata(bus_wdata),
292 .bus_phase(bus_phase),
293 .bus_cs_ram(bus_cs_ram),
294 .bus_cs_rom(bus_cs_rom),
295 .bus_ack_mem(bus_ack_mem),
296 .bus_rdata_mem(bus_rdata_mem),
297 .bus_cs_scsi(bus_cs_scsi),
298 .bus_ack_scsi(bus_ack_scsi),
299 .bus_rdata_scsi(bus_rdata_scsi),
300 .bus_cs_scc(bus_cs_scc),
301 .bus_ack_scc(bus_ack_scc),
302 .bus_rdata_scc(bus_rdata_scc),
303 .bus_cs_via(bus_cs_via),
304 .bus_ack_via(bus_ack_via),
305 .bus_rdata_via(bus_rdata_via),
306 .bus_cs_iwm(bus_cs_iwm),
307 .bus_ack_iwm(bus_ack_iwm),
308 .bus_rdata_iwm(bus_rdata_iwm),
309 .rom_ovl(via_pa_rom_ovl));
311 /* CPU interrupt inputs */
313 * Don't assert _via_irq if _scc_irq is asserted
314 * a temporary spurrious is fine but the ROM will not
315 * handle otherwise a level 3 (it just RTEs).
317 assign _cpu_ipl = _prg_irq ?
318 {1'b1, _scc_irq, _via_irq | ~_scc_irq }
321 /* Instanciate memory interface */
322 mem_intf mem0(.sysclk(sysclk16),
325 .ram_address(ram_address),
331 .bus_cs_ram(bus_cs_ram),
332 .bus_cs_rom(bus_cs_rom),
334 .bus_ack(bus_ack_mem),
335 .bus_addr(bus_addr[22:1]),
338 .bus_phase(bus_phase),
339 .bus_wdata(bus_wdata),
340 .bus_rdata(bus_rdata_mem),
343 .bb_rdata(bb_rdata_mem),
344 .bb_strobe(bb_strobe & bb_cs_mem),
346 .vid_bufsel(via_pa_vidbuf_sel),
349 .vid_pixels(vid_pixels));
351 /* Instanciate VIA */
352 via6522 via0(.sysclk(sysclk16),
354 .cs(bus_cs_via & bus_phase),
357 .wdata(bus_wdata[15:8]),
358 .rdata(bus_rdata_via),
360 .pa_in7(via_pa_scc_wreq),
361 .pa_out({via_pa_vidbuf_sel,
366 .pb_out2_0({_rtc_data_enable,
369 .pb_out7(via_pb_snddis),
370 .pb_in6_3({hblank_sync,
373 via_pb_mouse_switch}),
374 .pb_in0(rtc_data_in),
376 .sr_in_strobe(via_kbd_in_strobe),
377 .sr_out(via_kbd_out),
378 .sr_out_strobe(via_kbd_out_strobe),
382 /* Simplified one-phase interface */
383 assign bus_ack_via = bus_cs_via;
385 /* Instanciate the RTC */
386 rtc rtc0(.sysclk(sysclk16),
389 .data_in(rtc_data_in),
390 .data_out(rtc_data_out),
391 .data_clock(rtc_data_clock),
392 ._data_enable(_rtc_data_enable));
394 /* Instanciate scc */
395 scc scc0(.sysclk(sysclk16),
397 .cs(bus_cs_scc & bus_phase),
400 .wdata(bus_wdata[15:8]),
401 .rdata(bus_rdata_scc),
407 .dcd_a(scc_mouse_x1),
408 .dcd_b(scc_mouse_y1),
409 .wreq(via_pa_scc_wreq));
410 /* Simplified one-phase interface */
411 assign bus_ack_scc = bus_cs_scc;
413 /* Instanciate iwm */
414 iwm iwm0(.sysclk(sysclk16),
421 .wdata(bus_wdata[7:0]),
422 .rdata(bus_rdata_iwm),
425 .bb_rdata(bb_rdata_iwm),
426 .bb_strobe(bb_strobe && bb_cs_iwm),
428 .via_sel(via_pa_disksel));
430 /* Instanciate scsi */
431 ncr5380 scsi0(.sysclk(sysclk16),
433 .bus_cs(bus_cs_scsi),
435 .bus_ack(bus_ack_scsi),
436 .bus_phase(bus_phase),
437 .bus_rs(bus_addr[6:4]),
439 .wdata(bus_wdata[15:8]),
440 .rdata(bus_rdata_scsi),
441 .scsi_hshake(scsi_hshake),
444 .bb_rdata(bb_rdata_scsi),
445 .bb_strobe(bb_strobe && bb_cs_scsi),
448 /* Instanciate video output module */
449 video video0(.pixclk(pixclk),
459 .hblank(vid_hblank));
461 /* Instanciate the PS/2 mouse interface */
462 ps2_mouse mouse0(.sysclk(sysclk16),
468 .x2(via_pb_mouse_x2),
469 .y2(via_pb_mouse_y2),
470 .button(via_pb_mouse_switch),
473 /* Instanciate the PS/2 keyboard interface */
474 ps2_kbd kbd0(.sysclk(sysclk16),
478 .data_out(via_kbd_out),
479 .strobe_out(via_kbd_out_strobe),
480 .data_in(via_kbd_in),
481 .strobe_in(via_kbd_in_strobe),
484 /* Instanciate global backbus control registers */
485 ctrl ctrl0(.sysclk(sysclk16),
489 .bb_rdata(bb_rdata_ctrl),
490 .bb_strobe(bb_strobe && bb_cs_ctrl),
494 .cpu_reset(ctrl_cpu_reset));
496 /* Generate backbus chip selects and mux the backbus read data */
497 assign bb_cs_ctrl = bb_addr[5:3] == 3'b000;
498 assign bb_cs_cpu = bb_addr[5:4] == 3'b001;
499 assign bb_cs_mem = bb_addr[5:3] == 3'b100;
500 assign bb_cs_iwm = bb_addr[5:3] == 3'b101;
501 assign bb_cs_scsi = bb_addr[5:3] == 3'b110;
502 assign bb_cs_scope = bb_addr[5:3] == 3'b111;
504 assign bb_rdata = bb_cs_ctrl ? bb_rdata_ctrl :
505 bb_cs_cpu ? bb_rdata_cpu :
506 bb_cs_iwm ? bb_rdata_iwm :
507 bb_cs_scsi ? bb_rdata_scsi :
508 bb_cs_mem ? bb_rdata_mem :
509 bb_cs_scope ? bb_rdata_scope : 8'hff;
512 always@(posedge sysclk16) begin
517 led_cnt <= led_cnt + 1;
518 if (led_cnt == 1000000) begin
525 /* Programmer switch, latch the button */
526 always@(posedge sysclk16) begin
532 _prg_irq <= ~nmi_sync;
536 /* Not real synchronizers but will do */
537 always@(posedge sysclk16 or posedge reset) begin
542 _vblank_sync <= _vsync;
543 hblank_sync <= vid_hblank;
547 /* LED output powered by a weak pullup */
548 assign pwrled = led ? 1'b1 : 1'bz;
550 /* Unused output signals */
551 assign kbddat = 1'bz;
552 assign kbdclk = 1'bz;
560 endmodule // mimigmac