Subversion Repositories pentevo

Rev

Rev 668 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 668 Rev 684
Line 45... Line 45...
45
 
45
 
46
`include "../include/tune.v"
46
`include "../include/tune.v"
47
 
47
 
48
module zclock(
48
module zclock(
49
 
49
 
50
        input fclk,
50
        input  wire        fclk,
51
        input rst_n,
51
        input  wire        rst_n,
52
 
52
 
53
        input zclk, // Z80 clock, buffered via act04 and returned back to the FPGA
53
        input  wire        zclk, // Z80 clock, buffered via act04 and returned back to the FPGA
54
 
54
 
-
 
55
        input  wire [15:0] a, // for contention
-
 
56
 
-
 
57
        input  wire [ 1:0] modes_raster,
-
 
58
        input  wire        mode_contend_type,
-
 
59
        input  wire        mode_contend_ena,
-
 
60
        input  wire [ 2:0] mode_7ffd_bits,    // low 3 bits of 7FFD for 128k contention
-
 
61
 
-
 
62
        input  wire        contend,
-
 
63
 
-
 
64
        input  wire        mreq_n,
-
 
65
        input  wire        iorq_n,
-
 
66
        input  wire        m1_n,
55
        input rfsh_n, // switch turbo modes in RFSH part of m1
67
        input  wire        rfsh_n, // switch turbo modes in RFSH part of m1
56
 
68
 
57
 
69
 
58
        output reg zclk_out, // generated Z80 clock - passed through inverter externally!
70
        output reg         zclk_out, // generated Z80 clock - passed through inverter externally!
59
 
71
 
60
        output reg zpos,
72
        output reg         zpos,
Line 64... Line 76...
64
        input  wire zclk_stall,
76
        input  wire        zclk_stall,
65
 
77
 
66
 
78
 
67
 
79
 
68
 
80
 
69
        input [1:0] turbo, // 2'b00 -  3.5 MHz
81
        input  wire [ 1:0] turbo, // 2'b00 -  3.5 MHz
70
                           // 2'b01 -  7.0 MHz
82
                                  // 2'b01 -  7.0 MHz
71
                           // 2'b1x - 14.0 MHz
83
                                  // 2'b1x - 14.0 MHz
72
 
84
 
73
        output reg [1:0] int_turbo, // internal turbo, switched on /RFSH
85
        output reg  [ 1:0] int_turbo, // internal turbo, switched on /RFSH
74
 
86
 
75
 
87
 
76
        // input signals for 14MHz external IORQ waits
88
        // input signals for 14MHz external IORQ waits
77
        input  wire external_port,
89
        input  wire        external_port,
78
        input  wire iorq_n,
-
 
79
        input  wire m1_n,
-
 
80
 
90
 
81
 
91
 
82
        input cbeg,
92
        input  wire        cbeg,
83
        input pre_cend // syncing signals, taken from arbiter.v and dram.v
93
        input  wire        pre_cend // syncing signals, taken from arbiter.v and dram.v
84
);
94
);
85
 
95
 
86
 
96
 
87
        reg precend_cnt;
97
        reg precend_cnt;
88
        wire h_precend_1; // to take every other pulse of pre_cend
98
        wire h_precend_1; // to take every other pulse of pre_cend
89
        wire h_precend_2; // to take every other pulse of pre_cend
99
        wire h_precend_2; // to take every other pulse of pre_cend
90
 
100
 
91
        reg [2:0] zcount; // counter for generating 3.5 and 7 MHz z80 clocks
101
        reg [2:0] zcount; // counter for generating 3.5 and 7 MHz z80 clocks
92
 
102
 
93
 
-
 
94
        reg old_rfsh_n;
103
        reg old_rfsh_n;
95
 
104
 
96
 
-
 
97
        wire stall;
105
        wire stall;
98
 
106
 
99
 
-
 
100
        reg clk14_src; // source for 14MHz clock
107
        reg clk14_src; // source for 14MHz clock
101
 
108
 
102
 
-
 
103
 
-
 
104
 
-
 
105
 
-
 
106
        wire pre_zpos_35,
109
        wire pre_zpos_35,
107
             pre_zneg_35;
110
             pre_zneg_35;
108
 
111
 
109
        wire pre_zpos_70,
112
        wire pre_zpos_70,
110
             pre_zneg_70;
113
             pre_zneg_70;
111
 
114
 
112
        wire pre_zpos_140,
115
        wire pre_zpos_140,
113
             pre_zneg_140;
116
             pre_zneg_140;
114
 
117
 
115
 
118
 
-
 
119
        reg  r_mreq_n;
-
 
120
        wire iorq_n_a;
-
 
121
        reg  r_iorq_n_a;
-
 
122
        wire contend_wait;
-
 
123
        wire contend_mem;
-
 
124
        wire contend_io;
-
 
125
        wire contend_addr;
-
 
126
 
-
 
127
        reg [2:0] p7ffd; // resync to 14MHz
116
 
128
 
117
 
129
 
118
`ifdef SIMULATE
130
`ifdef SIMULATE
119
        initial // simulation...
131
        initial // simulation...
120
        begin
132
        begin
Line 135... Line 147...
135
                if( old_rfsh_n && !rfsh_n )
147
                if( old_rfsh_n && !rfsh_n )
136
                        int_turbo <= turbo;
148
                        int_turbo <= turbo;
137
        end
149
        end
138
 
150
 
139
 
151
 
-
 
152
        // resync p7ffd
-
 
153
        always @(posedge fclk)
-
 
154
                p7ffd <= mode_7ffd_bits;
-
 
155
 
140
 
156
 
141
 
157
 
142
        // make 14MHz iorq wait
158
        // make 14MHz iorq wait
143
        reg [3:0] io_wait_cnt;
159
        reg [3:0] io_wait_cnt;
144
       
160
       
Line 175... Line 191...
175
        endcase
191
        endcase
176
 
192
 
177
 
193
 
178
 
194
 
179
 
195
 
180
        assign stall = zclk_stall | io_wait;
196
        assign stall = zclk_stall | io_wait | contend_wait;
181
 
197
 
182
 
198
 
183
 
199
 
184
        // 14MHz clocking
200
        // 14MHz clocking
185
        always @(posedge fclk)
201
        always @(posedge fclk)
Line 241... Line 257...
241
                if( zneg )
257
                if( zneg )
242
                        zclk_out <= 1'b1;
258
                        zclk_out <= 1'b1;
243
        end
259
        end
244
 
260
 
245
 
261
 
-
 
262
 
-
 
263
 
-
 
264
 
-
 
265
        // contention emulation -- only 48k by now, TODO 128k pages and +2a/+3!
-
 
266
        //
-
 
267
        assign iorq_n_a = iorq_n || (a[0]==1'b1);
-
 
268
        //
-
 
269
        always @(posedge fclk)
-
 
270
        if( zpos )
-
 
271
        begin
-
 
272
                r_mreq_n   <= mreq_n;
-
 
273
                r_iorq_n_a <= iorq_n_a;
-
 
274
        end
-
 
275
        //
-
 
276
        assign contend_addr = (modes_raster[0]==1'b0) ? ( a[15:14]==2'b01                                  ) : // 48k mode
-
 
277
                                                        ( a[15:14]==2'b01 || (a[15:14]==2'b11 && p7ffd[0]) ) ; // 128k mode (yet only 128/+2)
-
 
278
        //
-
 
279
        assign contend_mem = contend_addr && r_mreq_n;
-
 
280
        assign contend_io  = !iorq_n_a && r_iorq_n_a;
-
 
281
        //
-
 
282
        assign contend_wait = contend && (contend_mem || contend_io) && !int_turbo && modes_raster[1] && mode_contend_ena;
-
 
283
        //
-
 
284
        // TODO: contend is 28MHz signal, while we'd better have here
-
 
285
        //       3.5MHz-synced r_contend signal, which should be synced
-
 
286
        //       to free-running 3.5MHz zpos/zneg sequence (not affected by stall)
-
 
287
 
246
endmodule
288
endmodule
247
 
289