Warp-SE/cpld/CNT.v

106 lines
2.8 KiB
Coq
Raw Normal View History

2021-10-29 10:04:59 +00:00
module CNT(
2023-03-26 08:33:59 +00:00
/* FSB clock and E clock inputs */
input CLK, input E,
2021-10-29 10:04:59 +00:00
/* Refresh request */
2023-04-08 08:08:53 +00:00
output reg RefReq, output reg RefUrg,
2023-03-26 08:33:59 +00:00
/* Reset, button */
output reg nRESout, input nIPL2,
2023-03-20 04:53:10 +00:00
/* Mac PDS bus master control outputs */
2023-04-08 09:46:13 +00:00
output reg AoutOE, output reg nBR_IOB,
/* Sound QoS */
2023-04-09 08:19:06 +00:00
input BACT, input nWE,
input SndROMCS, input SndRAMCSWR, input RAMCS,
output reg QoSReady);
2023-03-26 08:33:59 +00:00
/* E clock synchronization */
reg [1:0] Er;
wire EFall = Er[1] && !Er[0];
always @(posedge CLK) Er[1:0] <= { Er[0], E };
2023-04-08 09:46:13 +00:00
/* NMI button synchronization */
reg nIPL2r; always @(posedge CLK) nIPL2r <= nIPL2;
2023-04-08 09:49:29 +00:00
/* Startup sequence state */
reg [1:0] IS = 0;
2022-09-04 01:32:05 +00:00
/* Timer counts from 0 to 1010 (10) -- 11 states == 14.042 us
2023-03-22 01:11:58 +00:00
* Refresh timer sequence
2023-04-08 08:08:53 +00:00
* | Timer | RefReq | RefUrg |
* |---------|--------|-----------|
2023-03-22 01:11:58 +00:00
* | 0 0000 | 0 | 0 |
2023-04-08 08:08:53 +00:00
* | 1 0001 | 1 | 0 |
2023-03-26 08:33:59 +00:00
* | 2 0010 | 1 | 0 |
2023-03-22 01:11:58 +00:00
* | 3 0011 | 1 | 0 |
* | 4 0100 | 1 | 0 |
* | 5 0101 | 1 | 0 |
* | 6 0110 | 1 | 0 |
* | 7 0111 | 1 | 0 |
2023-04-08 08:08:53 +00:00
* | 8 1000 | 1 | 0 |
* | 9 1001 | 1 | 0 |
* | 10 1010 | 1 | 1 |
2023-03-20 04:53:10 +00:00
* back to timer==0
2022-09-04 01:32:05 +00:00
*/
2023-03-22 01:11:58 +00:00
reg [3:0] Timer = 0;
2023-04-08 08:08:53 +00:00
wire TimerTC = RefUrg;
2023-03-26 08:33:59 +00:00
always @(posedge CLK) begin
if (EFall) begin
if (TimerTC) Timer <= 0;
else Timer <= Timer+1;
2023-04-08 08:08:53 +00:00
RefUrg <= Timer==9;
RefReq <= !(Timer==10);
end
2021-10-29 10:04:59 +00:00
end
2023-03-22 01:11:58 +00:00
2023-04-09 08:19:06 +00:00
/* During init (IS!=3) long timer counts from 0 to 4095.
* 4096 states == 57.516 ms
* During operation (IS==3) long timer counts from 0 to 3
2023-04-08 09:46:13 +00:00
* starting at first sound RAM access.
2023-04-10 02:47:27 +00:00
* Period is 28.124 us - 42.240 us */
2023-04-09 08:19:06 +00:00
reg [11:0] LTimer;
2023-03-26 08:33:59 +00:00
reg LTimerTC;
always @(posedge CLK) begin
2023-04-09 08:19:06 +00:00
if (IS==3) begin
LTimer[11:2] <= 0;
if (BACT && SndRAMCSWR) LTimer[1:0] <= 1;
else if (LTimer==0) LTimer[1:0] <= 0;
else if (EFall && TimerTC) LTimer[1:0] <= LTimer+1;
end else if (EFall && TimerTC) LTimer <= LTimer+1;
LTimerTC <= LTimer[11:0]==12'hFFE;
2021-10-29 10:04:59 +00:00
end
2023-04-08 09:46:13 +00:00
/* Sound QoS */
reg [3:0] WS = 0;
always @(posedge CLK) begin
2023-04-09 08:19:06 +00:00
if (!BACT) WS <= 0;
else WS <= WS+1;
QoSReady <= (LTimer[1:0]==0) || (BACT && (
QoSReady || WS==15 || !nWE || (!RAMCS && !SndROMCS)));
2023-04-08 09:46:13 +00:00
end
2023-04-08 09:49:29 +00:00
/* Startup sequence state control */
2023-04-08 09:46:13 +00:00
wire ISTC = EFall && TimerTC && LTimerTC;
2023-03-26 08:33:59 +00:00
always @(posedge CLK) begin
2023-04-08 09:46:13 +00:00
case (IS[1:0])
2023-04-10 02:47:27 +00:00
0: begin
2023-03-20 04:53:10 +00:00
AoutOE <= 0; // Tristate PDS address and control
nRESout <= 0; // Hold reset low
2023-03-22 01:11:58 +00:00
nBR_IOB <= 0; // Default to request bus
2023-04-08 09:46:13 +00:00
if (ISTC) IS <= 1;
2023-04-10 02:47:27 +00:00
end 1: begin
2023-03-26 08:33:59 +00:00
AoutOE <= 0;
nRESout <= 0;
nBR_IOB <= !(!nBR_IOB && nIPL2r); // Disable bus request if NMI pressed
2023-04-08 09:46:13 +00:00
if (ISTC && nIPL2r) IS <= 2;
2023-04-10 02:47:27 +00:00
end 2: begin
2023-03-26 08:33:59 +00:00
AoutOE <= !nBR_IOB;
nRESout <= 0;
2023-04-08 09:46:13 +00:00
if (ISTC) IS <= 3;
2023-04-10 02:47:27 +00:00
end 3: begin
nRESout <= 1; // Release reset
2023-04-08 09:46:13 +00:00
IS <= 3;
2022-09-04 01:32:05 +00:00
end
2022-09-11 21:15:53 +00:00
endcase
end
2021-10-29 10:04:59 +00:00
endmodule