mirror of
https://github.com/MiSTer-devel/ao486_MiSTer.git
synced 2026-05-24 03:04:49 +00:00
859 lines
24 KiB
Verilog
859 lines
24 KiB
Verilog
|
|
module system
|
|
(
|
|
input reset,
|
|
|
|
input clk_sys,
|
|
input [27:0] clock_rate,
|
|
|
|
input l1_disable,
|
|
input l2_disable,
|
|
|
|
output [1:0] fdd_request,
|
|
output [2:0] ide0_request,
|
|
output [2:0] ide1_request,
|
|
input [1:0] floppy_wp,
|
|
|
|
input [1:0] joystick_dis,
|
|
input [13:0] joystick_dig_1,
|
|
input [13:0] joystick_dig_2,
|
|
input [15:0] joystick_ana_1,
|
|
input [15:0] joystick_ana_2,
|
|
input [1:0] joystick_mode,
|
|
input [1:0] joystick_timed,
|
|
|
|
input [15:0] mgmt_address,
|
|
input mgmt_read,
|
|
output [15:0] mgmt_readdata,
|
|
input mgmt_write,
|
|
input [15:0] mgmt_writedata,
|
|
|
|
input ps2_kbclk_in,
|
|
input ps2_kbdat_in,
|
|
output ps2_kbclk_out,
|
|
output ps2_kbdat_out,
|
|
input ps2_mouseclk_in,
|
|
input ps2_mousedat_in,
|
|
output ps2_mouseclk_out,
|
|
output ps2_mousedat_out,
|
|
output ps2_reset_n,
|
|
|
|
input [5:0] bootcfg,
|
|
input uma_ram,
|
|
output [7:0] syscfg,
|
|
|
|
input clk_uart1,
|
|
input uart1_rx,
|
|
output uart1_tx,
|
|
input uart1_cts_n,
|
|
input uart1_dcd_n,
|
|
input uart1_dsr_n,
|
|
output uart1_rts_n,
|
|
output uart1_dtr_n,
|
|
|
|
input clk_uart2,
|
|
input uart2_rx,
|
|
output uart2_tx,
|
|
input uart2_cts_n,
|
|
input uart2_dcd_n,
|
|
input uart2_dsr_n,
|
|
output uart2_rts_n,
|
|
output uart2_dtr_n,
|
|
|
|
input clk_mpu,
|
|
input mpu_rx,
|
|
output mpu_tx,
|
|
|
|
input clk_audio,
|
|
output [8:0] sample_cms_l,
|
|
output [8:0] sample_cms_r,
|
|
output [15:0] sample_sb_l,
|
|
output [15:0] sample_sb_r,
|
|
output [15:0] sample_opl_l,
|
|
output [15:0] sample_opl_r,
|
|
input sound_fm_mode,
|
|
input sound_cms_en,
|
|
|
|
output speaker_out,
|
|
|
|
output sbp,
|
|
|
|
output [4:0] vol_master_l,
|
|
output [4:0] vol_master_r,
|
|
output [4:0] vol_voice_l,
|
|
output [4:0] vol_voice_r,
|
|
output [4:0] vol_midi_l,
|
|
output [4:0] vol_midi_r,
|
|
output [4:0] vol_cd_l,
|
|
output [4:0] vol_cd_r,
|
|
output [4:0] vol_line_l,
|
|
output [4:0] vol_line_r,
|
|
output [1:0] vol_spk,
|
|
output [4:0] vol_en,
|
|
|
|
input clk_vga,
|
|
input [27:0] clock_rate_vga,
|
|
|
|
output video_ce,
|
|
output video_blank_n,
|
|
output video_hsync,
|
|
output video_vsync,
|
|
output [7:0] video_r,
|
|
output [7:0] video_g,
|
|
output [7:0] video_b,
|
|
input video_f60,
|
|
output [7:0] video_pal_a,
|
|
output [17:0] video_pal_d,
|
|
output video_pal_we,
|
|
output [19:0] video_start_addr,
|
|
output [8:0] video_width,
|
|
output [10:0] video_height,
|
|
output [3:0] video_flags,
|
|
output [8:0] video_stride,
|
|
output video_off,
|
|
input video_fb_en,
|
|
input video_lores,
|
|
input video_border,
|
|
|
|
output DDRAM_CLK,
|
|
input DDRAM_BUSY,
|
|
output [7:0] DDRAM_BURSTCNT,
|
|
output [24:0] DDRAM_ADDR,
|
|
input [63:0] DDRAM_DOUT,
|
|
input DDRAM_DOUT_READY,
|
|
output DDRAM_RD,
|
|
output [63:0] DDRAM_DIN,
|
|
output [7:0] DDRAM_BE,
|
|
output DDRAM_WE
|
|
);
|
|
|
|
wire a20_enable;
|
|
wire [7:0] dma_floppy_readdata;
|
|
wire dma_floppy_tc;
|
|
wire [7:0] dma_floppy_writedata;
|
|
wire dma_floppy_req;
|
|
wire dma_floppy_ack;
|
|
wire dma_sb_req_8;
|
|
wire dma_sb_req_16;
|
|
wire dma_sb_ack_8;
|
|
wire dma_sb_ack_16;
|
|
wire [7:0] dma_sb_readdata_8;
|
|
wire [15:0] dma_sb_readdata_16;
|
|
wire [15:0] dma_sb_writedata;
|
|
wire [15:0] dma_readdata;
|
|
wire dma_waitrequest;
|
|
wire [23:0] dma_address;
|
|
wire dma_read;
|
|
wire dma_readdatavalid;
|
|
wire dma_write;
|
|
wire [15:0] dma_writedata;
|
|
wire dma_16bit;
|
|
|
|
wire [15:0] mgmt_fdd_readdata;
|
|
wire [15:0] mgmt_ide0_readdata;
|
|
wire [15:0] mgmt_ide1_readdata;
|
|
wire mgmt_ide0_cs;
|
|
wire mgmt_ide1_cs;
|
|
wire mgmt_fdd_cs;
|
|
wire mgmt_rtc_cs;
|
|
|
|
wire interrupt_done;
|
|
wire interrupt_do;
|
|
wire [7:0] interrupt_vector;
|
|
reg [15:0] interrupt;
|
|
wire irq_0, irq_1, irq_2, irq_3, irq_4, irq_5, irq_6, irq_7, irq_8, irq_9, irq_10, irq_12, irq_14, irq_15;
|
|
|
|
wire cpu_io_read_do;
|
|
wire [15:0] cpu_io_read_address;
|
|
wire [2:0] cpu_io_read_length;
|
|
wire [31:0] cpu_io_read_data;
|
|
wire cpu_io_read_done;
|
|
wire cpu_io_write_do;
|
|
wire [15:0] cpu_io_write_address;
|
|
wire [2:0] cpu_io_write_length;
|
|
wire [31:0] cpu_io_write_data;
|
|
wire cpu_io_write_done;
|
|
wire [15:0] iobus_address;
|
|
wire iobus_write;
|
|
wire iobus_read;
|
|
wire [2:0] iobus_datasize;
|
|
wire [31:0] iobus_writedata;
|
|
|
|
reg ide0_cs;
|
|
reg ide1_cs;
|
|
reg floppy0_cs;
|
|
reg dma_master_cs;
|
|
reg dma_page_cs;
|
|
reg dma_slave_cs;
|
|
reg pic_master_cs;
|
|
reg pic_slave_cs;
|
|
reg pit_cs;
|
|
reg ps2_io_cs;
|
|
reg ps2_ctl_cs;
|
|
reg joy_cs;
|
|
reg rtc_cs;
|
|
reg fm_cs;
|
|
reg sb_cs;
|
|
reg uart1_cs;
|
|
reg uart2_cs;
|
|
reg mpu_cs;
|
|
reg vga_b_cs;
|
|
reg vga_c_cs;
|
|
reg vga_d_cs;
|
|
reg sysctl_cs;
|
|
|
|
wire fdd0_inserted;
|
|
|
|
wire [7:0] sound_readdata;
|
|
wire [7:0] floppy0_readdata;
|
|
wire [31:0] ide0_readdata;
|
|
wire [31:0] ide1_readdata;
|
|
wire [7:0] joystick_readdata;
|
|
wire [7:0] pit_readdata;
|
|
wire [7:0] ps2_readdata;
|
|
wire [7:0] rtc_readdata;
|
|
wire [7:0] uart1_readdata;
|
|
wire [7:0] uart2_readdata;
|
|
wire [7:0] mpu_readdata;
|
|
wire [7:0] dma_io_readdata;
|
|
wire [7:0] pic_readdata;
|
|
wire [7:0] vga_io_readdata;
|
|
|
|
wire [29:0] mem_address;
|
|
wire [31:0] mem_writedata;
|
|
wire [31:0] mem_readdata;
|
|
wire [3:0] mem_byteenable;
|
|
wire [3:0] mem_burstcount;
|
|
wire mem_write;
|
|
wire mem_read;
|
|
wire mem_waitrequest;
|
|
wire mem_readdatavalid;
|
|
|
|
wire [16:0] vga_address;
|
|
wire [7:0] vga_readdata;
|
|
wire [7:0] vga_writedata;
|
|
wire vga_read;
|
|
wire vga_write;
|
|
wire [2:0] vga_memmode;
|
|
wire [5:0] video_wr_seg;
|
|
wire [5:0] video_rd_seg;
|
|
|
|
assign DDRAM_CLK = clk_sys;
|
|
|
|
l2_cache cache
|
|
(
|
|
.CLK (clk_sys),
|
|
.RESET (reset),
|
|
|
|
.DISABLE (l2_disable),
|
|
|
|
.CPU_ADDR (mem_address),
|
|
.CPU_DIN (mem_writedata),
|
|
.CPU_DOUT (mem_readdata),
|
|
.CPU_DOUT_READY (mem_readdatavalid),
|
|
.CPU_BE (mem_byteenable),
|
|
.CPU_BURSTCNT (mem_burstcount),
|
|
.CPU_BUSY (mem_waitrequest),
|
|
.CPU_RD (mem_read),
|
|
.CPU_WE (mem_write),
|
|
|
|
.DDRAM_ADDR (DDRAM_ADDR),
|
|
.DDRAM_DIN (DDRAM_DIN),
|
|
.DDRAM_DOUT (DDRAM_DOUT),
|
|
.DDRAM_DOUT_READY (DDRAM_DOUT_READY),
|
|
.DDRAM_BE (DDRAM_BE),
|
|
.DDRAM_BURSTCNT (DDRAM_BURSTCNT),
|
|
.DDRAM_BUSY (DDRAM_BUSY),
|
|
.DDRAM_RD (DDRAM_RD),
|
|
.DDRAM_WE (DDRAM_WE),
|
|
|
|
.VGA_ADDR (vga_address),
|
|
.VGA_DIN (vga_readdata),
|
|
.VGA_DOUT (vga_writedata),
|
|
.VGA_RD (vga_read),
|
|
.VGA_WE (vga_write),
|
|
.VGA_MODE (vga_memmode),
|
|
|
|
.VGA_WR_SEG (video_wr_seg),
|
|
.VGA_RD_SEG (video_rd_seg),
|
|
.VGA_FB_EN (video_fb_en),
|
|
|
|
.uma_ram (uma_ram)
|
|
);
|
|
|
|
ao486 ao486
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.cache_disable (l1_disable),
|
|
|
|
.avm_address (mem_address),
|
|
.avm_writedata (mem_writedata),
|
|
.avm_byteenable (mem_byteenable),
|
|
.avm_burstcount (mem_burstcount),
|
|
.avm_write (mem_write),
|
|
.avm_read (mem_read),
|
|
.avm_waitrequest (mem_waitrequest),
|
|
.avm_readdatavalid (mem_readdatavalid),
|
|
.avm_readdata (mem_readdata),
|
|
|
|
.interrupt_do (interrupt_do),
|
|
.interrupt_vector (interrupt_vector),
|
|
.interrupt_done (interrupt_done),
|
|
|
|
.io_read_do (cpu_io_read_do),
|
|
.io_read_address (cpu_io_read_address),
|
|
.io_read_length (cpu_io_read_length),
|
|
.io_read_data (cpu_io_read_data),
|
|
.io_read_done (cpu_io_read_done),
|
|
.io_write_do (cpu_io_write_do),
|
|
.io_write_address (cpu_io_write_address),
|
|
.io_write_length (cpu_io_write_length),
|
|
.io_write_data (cpu_io_write_data),
|
|
.io_write_done (cpu_io_write_done),
|
|
|
|
.a20_enable (a20_enable),
|
|
|
|
.dma_address (dma_address),
|
|
.dma_16bit (dma_16bit),
|
|
.dma_read (dma_read),
|
|
.dma_readdata (dma_readdata),
|
|
.dma_readdatavalid (dma_readdatavalid),
|
|
.dma_waitrequest (dma_waitrequest),
|
|
.dma_write (dma_write),
|
|
.dma_writedata (dma_writedata)
|
|
);
|
|
|
|
always @(posedge clk_sys) begin
|
|
ide0_cs <= ({iobus_address[15:3], 3'd0} == 16'h01F0) || ({iobus_address[15:0]} == 16'h03F6);
|
|
ide1_cs <= ({iobus_address[15:3], 3'd0} == 16'h0170) || ({iobus_address[15:0]} == 16'h0376);
|
|
joy_cs <= ({iobus_address[15:0] } == 16'h0201);
|
|
floppy0_cs <= ({iobus_address[15:2], 2'd0} == 16'h03F0) || ({iobus_address[15:1], 1'd0} == 16'h03F4) || ({iobus_address[15:0]} == 16'h03F7) ;
|
|
dma_master_cs <= ({iobus_address[15:5], 5'd0} == 16'h00C0);
|
|
dma_page_cs <= ({iobus_address[15:4], 4'd0} == 16'h0080);
|
|
dma_slave_cs <= ({iobus_address[15:4], 4'd0} == 16'h0000);
|
|
pic_master_cs <= ({iobus_address[15:1], 1'd0} == 16'h0020);
|
|
pic_slave_cs <= ({iobus_address[15:1], 1'd0} == 16'h00A0);
|
|
pit_cs <= ({iobus_address[15:2], 2'd0} == 16'h0040) || (iobus_address == 16'h0061);
|
|
ps2_io_cs <= ({iobus_address[15:3], 3'd0} == 16'h0060);
|
|
ps2_ctl_cs <= ({iobus_address[15:4], 4'd0} == 16'h0090);
|
|
rtc_cs <= ({iobus_address[15:1], 1'd0} == 16'h0070);
|
|
fm_cs <= ({iobus_address[15:2], 2'd0} == 16'h0388);
|
|
sb_cs <= ({iobus_address[15:4], 4'd0} == 16'h0220);
|
|
uart1_cs <= ({iobus_address[15:3], 3'd0} == 16'h03F8);
|
|
uart2_cs <= ({iobus_address[15:3], 3'd0} == 16'h02F8);
|
|
mpu_cs <= ({iobus_address[15:1], 1'd0} == 16'h0330);
|
|
vga_b_cs <= ({iobus_address[15:4], 4'd0} == 16'h03B0);
|
|
vga_c_cs <= ({iobus_address[15:4], 4'd0} == 16'h03C0);
|
|
vga_d_cs <= ({iobus_address[15:4], 4'd0} == 16'h03D0);
|
|
sysctl_cs <= ({iobus_address[15:0] } == 16'h8888);
|
|
end
|
|
|
|
reg [7:0] ctlport = 0;
|
|
always @(posedge clk_sys) begin
|
|
reg in_reset = 1;
|
|
if(reset) begin
|
|
ctlport <= 8'hA2;
|
|
in_reset <= 1;
|
|
end
|
|
else if((ide0_cs|ide1_cs|floppy0_cs) && in_reset) begin
|
|
ctlport <= 0;
|
|
in_reset <= 0;
|
|
end
|
|
else if(iobus_write && sysctl_cs && iobus_datasize == 2 && iobus_writedata[15:8] == 8'hA1) begin
|
|
ctlport <= iobus_writedata[7:0];
|
|
in_reset <= 0;
|
|
end
|
|
end
|
|
|
|
assign syscfg = ctlport;
|
|
|
|
wire [7:0] iobus_readdata8 =
|
|
( floppy0_cs ) ? floppy0_readdata :
|
|
( dma_master_cs|dma_slave_cs|dma_page_cs ) ? dma_io_readdata :
|
|
( pic_master_cs|pic_slave_cs ) ? pic_readdata :
|
|
( pit_cs ) ? pit_readdata :
|
|
( ps2_io_cs|ps2_ctl_cs ) ? ps2_readdata :
|
|
( rtc_cs ) ? rtc_readdata :
|
|
( sb_cs|fm_cs ) ? sound_readdata :
|
|
( uart1_cs ) ? uart1_readdata :
|
|
( uart2_cs ) ? uart2_readdata :
|
|
( mpu_cs ) ? mpu_readdata :
|
|
( vga_b_cs|vga_c_cs|vga_d_cs ) ? vga_io_readdata :
|
|
( joy_cs ) ? joystick_readdata :
|
|
8'hFF;
|
|
|
|
iobus iobus
|
|
(
|
|
.clk (clk_sys),
|
|
.reset (reset),
|
|
|
|
.cpu_read_do (cpu_io_read_do),
|
|
.cpu_read_address (cpu_io_read_address),
|
|
.cpu_read_length (cpu_io_read_length),
|
|
.cpu_read_data (cpu_io_read_data),
|
|
.cpu_read_done (cpu_io_read_done),
|
|
.cpu_write_do (cpu_io_write_do),
|
|
.cpu_write_address (cpu_io_write_address),
|
|
.cpu_write_length (cpu_io_write_length),
|
|
.cpu_write_data (cpu_io_write_data),
|
|
.cpu_write_done (cpu_io_write_done),
|
|
|
|
.bus_address (iobus_address),
|
|
.bus_write (iobus_write),
|
|
.bus_read (iobus_read),
|
|
.bus_io32 (((ide0_cs | ide1_cs) & ~iobus_address[9]) | sysctl_cs),
|
|
.bus_datasize (iobus_datasize),
|
|
.bus_writedata (iobus_writedata),
|
|
.bus_readdata (ide0_cs ? ide0_readdata : ide1_cs ? ide1_readdata : iobus_readdata8),
|
|
.bus_wait (ide0_wait | ide1_wait)
|
|
);
|
|
|
|
dma dma
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.mem_address (dma_address),
|
|
.mem_16bit (dma_16bit),
|
|
.mem_waitrequest (dma_waitrequest),
|
|
.mem_read (dma_read),
|
|
.mem_readdatavalid (dma_readdatavalid),
|
|
.mem_readdata (dma_readdata),
|
|
.mem_write (dma_write),
|
|
.mem_writedata (dma_writedata),
|
|
|
|
.io_address (iobus_address[4:0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read),
|
|
.io_write (iobus_write),
|
|
.io_readdata (dma_io_readdata),
|
|
.io_master_cs (dma_master_cs),
|
|
.io_slave_cs (dma_slave_cs),
|
|
.io_page_cs (dma_page_cs),
|
|
|
|
.dma_2_req (dma_floppy_req),
|
|
.dma_2_ack (dma_floppy_ack),
|
|
.dma_2_tc (dma_floppy_tc),
|
|
.dma_2_readdata (dma_floppy_readdata),
|
|
.dma_2_writedata (dma_floppy_writedata),
|
|
|
|
.dma_1_req (dma_sb_req_8),
|
|
.dma_1_ack (dma_sb_ack_8),
|
|
.dma_1_readdata (dma_sb_readdata_8),
|
|
.dma_1_writedata (dma_sb_writedata[7:0]),
|
|
|
|
.dma_5_req (dma_sb_req_16),
|
|
.dma_5_ack (dma_sb_ack_16),
|
|
.dma_5_readdata (dma_sb_readdata_16),
|
|
.dma_5_writedata (dma_sb_writedata)
|
|
);
|
|
|
|
floppy floppy
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.clock_rate (clock_rate),
|
|
|
|
.io_address (iobus_address[2:0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read & floppy0_cs),
|
|
.io_write (iobus_write & floppy0_cs),
|
|
.io_readdata (floppy0_readdata),
|
|
|
|
.fdd0_inserted (fdd0_inserted),
|
|
|
|
.dma_req (dma_floppy_req),
|
|
.dma_ack (dma_floppy_ack),
|
|
.dma_tc (dma_floppy_tc),
|
|
.dma_readdata (dma_floppy_readdata),
|
|
.dma_writedata (dma_floppy_writedata),
|
|
|
|
.mgmt_address (mgmt_address[3:0]),
|
|
.mgmt_fddn (mgmt_address[7]),
|
|
.mgmt_writedata (mgmt_writedata),
|
|
.mgmt_readdata (mgmt_fdd_readdata),
|
|
.mgmt_write (mgmt_write & mgmt_fdd_cs),
|
|
.mgmt_read (mgmt_read & mgmt_fdd_cs),
|
|
|
|
.wp (floppy_wp),
|
|
|
|
.request (fdd_request),
|
|
.irq (irq_6)
|
|
);
|
|
|
|
wire [3:0] ide_address = {iobus_address[9],iobus_address[2:0]};
|
|
|
|
wire ide0_nodata;
|
|
reg ide0_wait = 0;
|
|
always @(posedge clk_sys) begin
|
|
if(iobus_read & ide0_cs & ide0_nodata & !ide_address) ide0_wait <= 1;
|
|
if(~ide0_nodata) ide0_wait <= 0;
|
|
end
|
|
|
|
ide ide0
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.io_address (ide_address),
|
|
.io_writedata (iobus_writedata),
|
|
.io_read ((iobus_read & ide0_cs) | ide0_wait),
|
|
.io_write (iobus_write & ide0_cs),
|
|
.io_readdata (ide0_readdata),
|
|
.io_32 (iobus_datasize[2]),
|
|
|
|
.use_fast (1),
|
|
.no_data (ide0_nodata),
|
|
|
|
.mgmt_address (mgmt_address[3:0]),
|
|
.mgmt_writedata (mgmt_writedata),
|
|
.mgmt_readdata (mgmt_ide0_readdata),
|
|
.mgmt_write (mgmt_write & mgmt_ide0_cs),
|
|
.mgmt_read (mgmt_read & mgmt_ide0_cs),
|
|
|
|
.request (ide0_request),
|
|
.irq (irq_14)
|
|
);
|
|
|
|
wire ide1_nodata;
|
|
reg ide1_wait = 0;
|
|
always @(posedge clk_sys) begin
|
|
if(iobus_read & ide1_cs & ide1_nodata & !ide_address) ide1_wait <= 1;
|
|
if(~ide1_nodata) ide1_wait <= 0;
|
|
end
|
|
|
|
ide ide1
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.io_address (ide_address),
|
|
.io_writedata (iobus_writedata),
|
|
.io_read ((iobus_read & ide1_cs) | ide1_wait),
|
|
.io_write (iobus_write & ide1_cs),
|
|
.io_readdata (ide1_readdata),
|
|
.io_32 (iobus_datasize[2]),
|
|
|
|
.use_fast (1),
|
|
.no_data (ide1_nodata),
|
|
|
|
.mgmt_address (mgmt_address[3:0]),
|
|
.mgmt_writedata (mgmt_writedata),
|
|
.mgmt_readdata (mgmt_ide1_readdata),
|
|
.mgmt_write (mgmt_write & mgmt_ide1_cs),
|
|
.mgmt_read (mgmt_read & mgmt_ide1_cs),
|
|
|
|
.request (ide1_request),
|
|
.irq (irq_15)
|
|
);
|
|
|
|
joystick joystick
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.clock_rate (clock_rate),
|
|
|
|
.read (iobus_read & joy_cs),
|
|
.write (iobus_write & joy_cs),
|
|
.readdata (joystick_readdata),
|
|
|
|
.dis (joystick_dis),
|
|
|
|
.dig_1 (joystick_dig_1),
|
|
.dig_2 (joystick_dig_2),
|
|
.ana_1 (joystick_ana_1),
|
|
.ana_2 (joystick_ana_2),
|
|
.mode (joystick_mode),
|
|
.timed (joystick_timed)
|
|
);
|
|
|
|
pit pit
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.clock_rate (clock_rate),
|
|
|
|
.io_address ({iobus_address[5],iobus_address[1:0]}),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_readdata (pit_readdata),
|
|
.io_read (iobus_read & pit_cs),
|
|
.io_write (iobus_write & pit_cs),
|
|
|
|
.speaker_out (speaker_out),
|
|
.irq (irq_0)
|
|
);
|
|
|
|
ps2 ps2
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.io_address (iobus_address[3:0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read),
|
|
.io_write (iobus_write),
|
|
.io_readdata (ps2_readdata),
|
|
.io_cs (ps2_io_cs),
|
|
.ctl_cs (ps2_ctl_cs),
|
|
|
|
.ps2_kbclk (ps2_kbclk_in),
|
|
.ps2_kbdat (ps2_kbdat_in),
|
|
.ps2_kbclk_out (ps2_kbclk_out),
|
|
.ps2_kbdat_out (ps2_kbdat_out),
|
|
|
|
.ps2_mouseclk (ps2_mouseclk_in),
|
|
.ps2_mousedat (ps2_mousedat_in),
|
|
.ps2_mouseclk_out (ps2_mouseclk_out),
|
|
.ps2_mousedat_out (ps2_mousedat_out),
|
|
|
|
.output_a20_enable (),
|
|
.output_reset_n (ps2_reset_n),
|
|
.a20_enable (a20_enable),
|
|
|
|
.irq_keyb (irq_1),
|
|
.irq_mouse (irq_12)
|
|
);
|
|
|
|
rtc rtc
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.clock_rate (clock_rate),
|
|
|
|
.io_address (iobus_address[0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read & rtc_cs),
|
|
.io_write (iobus_write & rtc_cs),
|
|
.io_readdata (rtc_readdata),
|
|
|
|
.mgmt_address (mgmt_address[7:0]),
|
|
.mgmt_write (mgmt_write & mgmt_rtc_cs),
|
|
.mgmt_writedata (mgmt_writedata[7:0]),
|
|
|
|
.bootcfg ({bootcfg[5:2], bootcfg[1:0] ? bootcfg[1:0] : {~fdd0_inserted, fdd0_inserted}}),
|
|
|
|
.irq (irq_8)
|
|
);
|
|
|
|
sound sound
|
|
(
|
|
.clk (clk_sys),
|
|
.clk_audio (clk_audio),
|
|
.rst_n (~reset),
|
|
|
|
.clock_rate (clock_rate),
|
|
|
|
.address (iobus_address[3:0]),
|
|
.writedata (iobus_writedata[7:0]),
|
|
.read (iobus_read),
|
|
.write (iobus_write),
|
|
.readdata (sound_readdata),
|
|
.sb_cs (sb_cs),
|
|
.fm_cs (fm_cs),
|
|
|
|
.dma_req8 (dma_sb_req_8),
|
|
.dma_req16 (dma_sb_req_16),
|
|
.dma_ack (dma_sb_ack_16 | dma_sb_ack_8),
|
|
.dma_readdata (dma_sb_req_16 ? dma_sb_readdata_16 : dma_sb_readdata_8),
|
|
.dma_writedata (dma_sb_writedata),
|
|
|
|
.sbp (sbp),
|
|
|
|
.vol_master_l (vol_master_l),
|
|
.vol_master_r (vol_master_r),
|
|
.vol_voice_l (vol_voice_l),
|
|
.vol_voice_r (vol_voice_r),
|
|
.vol_midi_l (vol_midi_l),
|
|
.vol_midi_r (vol_midi_r),
|
|
.vol_cd_l (vol_cd_l),
|
|
.vol_cd_r (vol_cd_r),
|
|
.vol_line_l (vol_line_l),
|
|
.vol_line_r (vol_line_r),
|
|
.vol_spk (vol_spk),
|
|
.vol_en (vol_en),
|
|
|
|
.sample_cms_l (sample_cms_l),
|
|
.sample_cms_r (sample_cms_r),
|
|
.sample_sb_l (sample_sb_l),
|
|
.sample_sb_r (sample_sb_r),
|
|
.sample_opl_l (sample_opl_l),
|
|
.sample_opl_r (sample_opl_r),
|
|
|
|
.fm_mode (sound_fm_mode),
|
|
.cms_en (sound_cms_en),
|
|
|
|
.irq_5 (irq_5),
|
|
.irq_7 (irq_7),
|
|
.irq_10 (irq_10)
|
|
);
|
|
|
|
uart uart1
|
|
(
|
|
.clk (clk_sys),
|
|
.br_clk (clk_uart1),
|
|
.reset (reset),
|
|
|
|
.address (iobus_address[2:0]),
|
|
.writedata (iobus_writedata[7:0]),
|
|
.read (iobus_read),
|
|
.write (iobus_write),
|
|
.readdata (uart1_readdata),
|
|
.cs (uart1_cs),
|
|
|
|
.rx (uart1_rx),
|
|
.tx (uart1_tx),
|
|
.cts_n (uart1_cts_n),
|
|
.dcd_n (uart1_dcd_n),
|
|
.dsr_n (uart1_dsr_n),
|
|
.rts_n (uart1_rts_n),
|
|
.dtr_n (uart1_dtr_n),
|
|
.ri_n (1),
|
|
|
|
.irq (irq_4)
|
|
);
|
|
|
|
uart uart2
|
|
(
|
|
.clk (clk_sys),
|
|
.br_clk (clk_uart2),
|
|
.reset (reset),
|
|
|
|
.address (iobus_address[2:0]),
|
|
.writedata (iobus_writedata[7:0]),
|
|
.read (iobus_read),
|
|
.write (iobus_write),
|
|
.readdata (uart2_readdata),
|
|
.cs (uart2_cs),
|
|
|
|
.rx (uart2_rx),
|
|
.tx (uart2_tx),
|
|
.cts_n (uart2_cts_n),
|
|
.dcd_n (uart2_dcd_n),
|
|
.dsr_n (uart2_dsr_n),
|
|
.rts_n (uart2_rts_n),
|
|
.dtr_n (uart2_dtr_n),
|
|
.ri_n (1),
|
|
|
|
.irq (irq_3)
|
|
);
|
|
|
|
mpu mpu
|
|
(
|
|
.clk (clk_sys),
|
|
.br_clk (clk_mpu),
|
|
.reset (reset),
|
|
|
|
.address (iobus_address[0]),
|
|
.writedata (iobus_writedata[7:0]),
|
|
.read (iobus_read),
|
|
.write (iobus_write),
|
|
.readdata (mpu_readdata),
|
|
.cs (mpu_cs),
|
|
|
|
.rx (mpu_rx),
|
|
.tx (mpu_tx),
|
|
|
|
.double_rate (1),
|
|
.irq (irq_9)
|
|
);
|
|
|
|
vga vga
|
|
(
|
|
.clk_sys (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.clk_vga (clk_vga),
|
|
.clock_rate_vga (clock_rate_vga),
|
|
|
|
.io_address (iobus_address[3:0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read),
|
|
.io_write (iobus_write),
|
|
.io_readdata (vga_io_readdata),
|
|
.io_b_cs (vga_b_cs),
|
|
.io_c_cs (vga_c_cs),
|
|
.io_d_cs (vga_d_cs),
|
|
|
|
.mem_address (vga_address),
|
|
.mem_read (vga_read),
|
|
.mem_readdata (vga_readdata),
|
|
.mem_write (vga_write),
|
|
.mem_writedata (vga_writedata),
|
|
|
|
.vga_ce (video_ce),
|
|
.vga_blank_n (video_blank_n),
|
|
.vga_horiz_sync (video_hsync),
|
|
.vga_vert_sync (video_vsync),
|
|
.vga_r (video_r),
|
|
.vga_g (video_g),
|
|
.vga_b (video_b),
|
|
.vga_f60 (video_f60),
|
|
.vga_memmode (vga_memmode),
|
|
.vga_pal_a (video_pal_a),
|
|
.vga_pal_d (video_pal_d),
|
|
.vga_pal_we (video_pal_we),
|
|
.vga_start_addr (video_start_addr),
|
|
.vga_wr_seg (video_wr_seg),
|
|
.vga_rd_seg (video_rd_seg),
|
|
.vga_width (video_width),
|
|
.vga_height (video_height),
|
|
.vga_flags (video_flags),
|
|
.vga_stride (video_stride),
|
|
.vga_off (video_off),
|
|
.vga_lores (video_lores),
|
|
.vga_border (video_border),
|
|
|
|
.irq (irq_2)
|
|
);
|
|
|
|
pic pic
|
|
(
|
|
.clk (clk_sys),
|
|
.rst_n (~reset),
|
|
|
|
.io_address (iobus_address[0]),
|
|
.io_writedata (iobus_writedata[7:0]),
|
|
.io_read (iobus_read),
|
|
.io_write (iobus_write),
|
|
.io_readdata (pic_readdata),
|
|
.io_master_cs (pic_master_cs),
|
|
.io_slave_cs (pic_slave_cs),
|
|
|
|
.interrupt_vector (interrupt_vector),
|
|
.interrupt_done (interrupt_done),
|
|
.interrupt_do (interrupt_do),
|
|
.interrupt_input (interrupt)
|
|
);
|
|
|
|
always @* begin
|
|
interrupt = 0;
|
|
|
|
interrupt[0] = irq_0;
|
|
interrupt[1] = irq_1;
|
|
interrupt[3] = irq_3;
|
|
interrupt[4] = irq_4;
|
|
interrupt[5] = irq_5;
|
|
interrupt[6] = irq_6;
|
|
interrupt[7] = irq_7;
|
|
interrupt[8] = irq_8;
|
|
interrupt[9] = irq_9 | irq_2;
|
|
interrupt[10] = irq_10;
|
|
interrupt[12] = irq_12;
|
|
interrupt[14] = irq_14;
|
|
interrupt[15] = irq_15;
|
|
end
|
|
|
|
assign mgmt_ide0_cs = (mgmt_address[15:8] == 8'hF0);
|
|
assign mgmt_ide1_cs = (mgmt_address[15:8] == 8'hF1);
|
|
assign mgmt_fdd_cs = (mgmt_address[15:8] == 8'hF2);
|
|
assign mgmt_rtc_cs = (mgmt_address[15:8] == 8'hF4);
|
|
assign mgmt_readdata = mgmt_ide0_cs ? mgmt_ide0_readdata : mgmt_ide1_cs ? mgmt_ide1_readdata : mgmt_fdd_readdata;
|
|
|
|
endmodule
|