Warp-SE/cpld/WarpSE.v
2022-04-05 18:00:27 -04:00

156 lines
3.5 KiB
Verilog

module WarpSE(
input [23:1] A_FSB,
input nAS_FSB,
input nLDS_FSB,
input nUDS_FSB,
input nWE_FSB,
output nDTACK_FSB,
output nVPA_FSB,
output nBERR_FSB,
input CLK,
output MCLK,
output RCLK,
input CLK2X_IOB,
input CLK_IOB,
input E_IOB,
input nDTACK_IOB,
input nVPA_IOB,
output nVMA_IOB,
output nAS_IOB,
output nUDS_IOB,
output nLDS_IOB,
output nBR_IOB,
input nBG_IOB,
input nBERR_IOB,
input nRES,
input nIPL2,
output CKE,
output nCS,
output nRAS,
output nCAS,
output nRWE,
output [1:0] BA,
output [11:0] RA,
output DQMH,
output DQML,
output nADoutLE0,
output nADoutLE1,
output nAoutOE,
output nDoutOE,
output nDinOE,
output nDinLE,
input [2:0] SW,
output CLK20EN,
output CLK25EN);
/* DIP switches */
assign CLK20EN = SW[0];
assign CLK25EN = !SW[0];
wire MotherboardROMEN = !SW[1];
/* AS cycle detection */
wire BACT;
wire [1:0] SS;
wire CLK_FSB = (~CLK && SS[1:0]==2'b01);
CLK clk(CLK, SS, MCLK, RCLK);
wire IOCS, SCSICS, IOPWCS, IACS, ROMCS, RAMCS, SndRAMCSWR;
CS cs(
/* Setting input */
MotherboardROMEN,
/* MC68HC000 interface */
A_FSB[23:08], CLK_FSB, nRES, nWE_FSB,
/* AS cycle detection */
BACT,
/* Device select outputs */
IOCS, SCSICS, IOPWCS, IACS, ROMCS, RAMCS, SndRAMCSWR);
RAM ram(
CLK, SS,
/* MC68HC000 interface */
A_FSB[21:1], nWE_FSB, nAS_FSB, nLDS_FSB, nUDS_FSB,
/* AS cycle detection */
BACT,
/* Select and ready signals */
RAMCS, ROMCS,
/* SDRAM interface */
CKE, nCS, nRAS, nCAS, nRWE,
BA, RA, DQMH, DQML);
wire Ready_IOBS, BERR_IOBS;
wire Park, IOREQ, IOACT, IOBERR;
wire ALE0S, ALE0M, ALE1;
assign nADoutLE0 = ~(ALE0S || ALE0M);
assign nADoutLE1 = ~ALE1;
wire IORW0, IOL0, IOU0;
IOBS iobs(
/* MC68HC000 interface */
CLK_FSB, nWE_FSB, nAS_FSB, nLDS_FSB, nUDS_FSB,
/* AS cycle detection, FSB BERR */
BACT,
/* Select and ready signals */
IOCS, IOPWCS, Ready_IOBS, BERR_IOBS,
/* Read data OE control */
nDinOE,
/* IOB Master Controller Interface */
IOREQ, IOACT, IOBERR,
/* FIFO primary level control */
ALE0S, IORW0, IOL0, IOU0,
/* FIFO secondary level control */
ALE1);
wire nAS_IOBout, nLDS_IOBout, nUDS_IOBout, nVMA_IOBout;
assign nAS_IOB = nAoutOE ? 1'bZ : nAS_IOBout;
assign nLDS_IOB = nAoutOE ? 1'bZ : nLDS_IOBout;
assign nUDS_IOB = nAoutOE ? 1'bZ : nUDS_IOBout;
assign nVMA_IOB = nAoutOE ? 1'bZ : nVMA_IOBout;
IOBM iobm(
/* PDS interface */
CLK2X_IOB, CLK_IOB, E_IOB,
nBR_IOB, nAS_IOBout, nLDS_IOBout, nUDS_IOBout, nVMA_IOBout,
nAS_IOB, nBG_IOB, nDTACK_IOB, nVPA_IOB, nBERR_IOB, nRES,
/* PDS address and data latch control */
nAoutOE, nDoutOE, ALE0M, nDinLE,
/* IO bus slave port interface */
IOACT, IOBERR,
Park, IOREQ, IOL0, IOU0, IORW0);
wire TimeoutA, TimeoutB;
CNT cnt(
/* FSB clock and AS detection */
CLK_FSB, BACT,
/* Timeout signals */
TimeoutA, TimeoutB);
/* Accelerator Disable Control */
reg RESr0 = 0;
reg RESr1 = 0;
reg RESr2 = 0;
reg IPL2r0 = 0;
reg IPL2r1 = 0;
reg RESDone = 0;
reg Disable = 0;
assign Park = ~Disable;
always @(posedge CLK_FSB) begin
RESr0 <= ~nRES; RESr1 <= RESr0; RESr2 <= RESr1;
IPL2r0 <= ~nIPL2; IPL2r1 <= IPL2r0;
if ( RESr0 && RESr1 && RESr2 && ~RESDone && IPL2r0 && IPL2r1) Disable <= 1;
if (~RESr0 && ~RESr1 && RESr2) RESDone <= 1;
end
FSB fsb(
CLK, SS,
/* MC68HC000 interface */
CLK_FSB, nAS_FSB, nDTACK_FSB, nVPA_FSB, nBERR_FSB,
/* AS cycle detection */
BACT,
/* Ready and IA inputs */
Ready_IOBS, ~(SndRAMCSWR && ~TimeoutA), Disable,
/* BERR inputs */
(~SCSICS && TimeoutB), BERR_IOBS,
/* Interrupt acknowledge select */
IACS);
endmodule