OpenCores
URL https://opencores.org/ocsvn/opengfx430/opengfx430/trunk

Subversion Repositories opengfx430

[/] [opengfx430/] [trunk/] [core/] [rtl/] [verilog/] [ogfx_reg.v] - Blame information for rev 6

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 olivier.gi
//----------------------------------------------------------------------------
2
// Copyright (C) 2015 Authors
3
//
4
// This source file may be used and distributed without restriction provided
5
// that this copyright statement is not removed from the file and that any
6
// derivative work contains the original copyright notice and the associated
7
// disclaimer.
8
//
9
// This source file is free software; you can redistribute it and/or modify
10
// it under the terms of the GNU Lesser General Public License as published
11
// by the Free Software Foundation; either version 2.1 of the License, or
12
// (at your option) any later version.
13
//
14
// This source is distributed in the hope that it will be useful, but WITHOUT
15
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17
// License for more details.
18
//
19
// You should have received a copy of the GNU Lesser General Public License
20
// along with this source; if not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
//
23
//----------------------------------------------------------------------------
24
//
25
// *File Name: ogfx_reg.v
26
//
27
// *Module Description:
28
//                      Registers for oMSP programming.
29
//
30
// *Author(s):
31
//              - Olivier Girard,    olgirard@gmail.com
32
//
33
//----------------------------------------------------------------------------
34
// $Rev$
35
// $LastChangedBy$
36
// $LastChangedDate$
37
//----------------------------------------------------------------------------
38
`ifdef OGFX_NO_INCLUDE
39
`else
40
`include "openGFX430_defines.v"
41
`endif
42
 
43
module  ogfx_reg (
44
 
45
// OUTPUTs
46
    irq_gfx_o,                                 // Graphic Controller interrupt
47
 
48
    gpu_data_o,                                // GPU data
49
    gpu_data_avail_o,                          // GPU data available
50
    gpu_enable_o,                              // GPU enable
51
 
52
    lt24_reset_n_o,                            // LT24 Reset (Active Low)
53
    lt24_on_o,                                 // LT24 on/off
54
    lt24_cfg_clk_o,                            // LT24 Interface clock configuration
55
    lt24_cfg_refr_o,                           // LT24 Interface refresh configuration
56
    lt24_cfg_refr_sync_en_o,                   // LT24 Interface refresh sync enable configuration
57
    lt24_cfg_refr_sync_val_o,                  // LT24 Interface refresh sync value configuration
58
    lt24_cmd_refr_o,                           // LT24 Interface refresh command
59
    lt24_cmd_val_o,                            // LT24 Generic command value
60
    lt24_cmd_has_param_o,                      // LT24 Generic command has parameters
61
    lt24_cmd_param_o,                          // LT24 Generic command parameter value
62
    lt24_cmd_param_rdy_o,                      // LT24 Generic command trigger
63
    lt24_cmd_dfill_o,                          // LT24 Data fill value
64
    lt24_cmd_dfill_wr_o,                       // LT24 Data fill trigger
65
 
66
    display_width_o,                           // Display width
67
    display_height_o,                          // Display height
68
    display_size_o,                            // Display size (number of pixels)
69
    display_y_swap_o,                          // Display configuration: swap Y axis (horizontal symmetry)
70
    display_x_swap_o,                          // Display configuration: swap X axis (vertical symmetry)
71
    display_cl_swap_o,                         // Display configuration: swap column/lines
72
    gfx_mode_o,                                // Video mode (1xx:16bpp / 011:8bpp / 010:4bpp / 001:2bpp / 000:1bpp)
73
 
74
    per_dout_o,                                // Peripheral data output
75
 
76
    refresh_frame_addr_o,                      // Refresh frame base address
77
    refresh_lut_select_o,                      // Refresh LUT bank selection
78
 
79
`ifdef WITH_PROGRAMMABLE_LUT
80
    lut_ram_addr_o,                            // LUT-RAM address
81
    lut_ram_din_o,                             // LUT-RAM data
82
    lut_ram_wen_o,                             // LUT-RAM write strobe (active low)
83
    lut_ram_cen_o,                             // LUT-RAM chip enable (active low)
84
`endif
85
 
86
    vid_ram_addr_o,                            // Video-RAM address
87
    vid_ram_din_o,                             // Video-RAM data
88
    vid_ram_wen_o,                             // Video-RAM write strobe (active low)
89
    vid_ram_cen_o,                             // Video-RAM chip enable (active low)
90
 
91
// INPUTs
92
    dbg_freeze_i,                              // Freeze address auto-incr on read
93
    gpu_cmd_done_evt_i,                        // GPU command done event
94
    gpu_cmd_error_evt_i,                       // GPU command error event
95 6 olivier.gi
    gpu_dma_busy_i,                            // GPU DMA execution on going
96 3 olivier.gi
    gpu_get_data_i,                            // GPU get next data
97
    lt24_status_i,                             // LT24 FSM Status
98
    lt24_start_evt_i,                          // LT24 FSM is starting
99
    lt24_done_evt_i,                           // LT24 FSM is done
100
    mclk,                                      // Main system clock
101
    per_addr_i,                                // Peripheral address
102
    per_din_i,                                 // Peripheral data input
103
    per_en_i,                                  // Peripheral enable (high active)
104
    per_we_i,                                  // Peripheral write enable (high active)
105
    puc_rst,                                   // Main system reset
106
`ifdef WITH_PROGRAMMABLE_LUT
107
    lut_ram_dout_i,                            // LUT-RAM data input
108
`endif
109
    vid_ram_dout_i                             // Video-RAM data input
110
);
111
 
112
// OUTPUTs
113
//=========
114
output               irq_gfx_o;                // Graphic Controller interrupt
115
 
116
output        [15:0] gpu_data_o;               // GPU data
117
output               gpu_data_avail_o;         // GPU data available
118
output               gpu_enable_o;             // GPU enable
119
 
120
output               lt24_reset_n_o;           // LT24 Reset (Active Low)
121
output               lt24_on_o;                // LT24 on/off
122
output         [2:0] lt24_cfg_clk_o;           // LT24 Interface clock configuration
123
output        [11:0] lt24_cfg_refr_o;          // LT24 Interface refresh configuration
124
output               lt24_cfg_refr_sync_en_o;  // LT24 Interface refresh sync configuration
125
output         [9:0] lt24_cfg_refr_sync_val_o; // LT24 Interface refresh sync value configuration
126
output               lt24_cmd_refr_o;          // LT24 Interface refresh command
127
output         [7:0] lt24_cmd_val_o;           // LT24 Generic command value
128
output               lt24_cmd_has_param_o;     // LT24 Generic command has parameters
129
output        [15:0] lt24_cmd_param_o;         // LT24 Generic command parameter value
130
output               lt24_cmd_param_rdy_o;     // LT24 Generic command trigger
131
output        [15:0] lt24_cmd_dfill_o;         // LT24 Data fill value
132
output               lt24_cmd_dfill_wr_o;      // LT24 Data fill trigger
133
 
134
output [`LPIX_MSB:0] display_width_o;          // Display width
135
output [`LPIX_MSB:0] display_height_o;         // Display height
136
output [`SPIX_MSB:0] display_size_o;           // Display size (number of pixels)
137
output               display_y_swap_o;         // Display configuration: swap Y axis (horizontal symmetry)
138
output               display_x_swap_o;         // Display configuration: swap X axis (vertical symmetry)
139
output               display_cl_swap_o;        // Display configuration: swap column/lines
140
output         [2:0] gfx_mode_o;               // Video mode (1xx:16bpp / 011:8bpp / 010:4bpp / 001:2bpp / 000:1bpp)
141
 
142
output        [15:0] per_dout_o;               // Peripheral data output
143
 
144
output [`APIX_MSB:0] refresh_frame_addr_o;     // Refresh frame base address
145
output         [1:0] refresh_lut_select_o;     // Refresh LUT bank selection
146
 
147
`ifdef WITH_PROGRAMMABLE_LUT
148
output [`LRAM_MSB:0] lut_ram_addr_o;           // LUT-RAM address
149
output        [15:0] lut_ram_din_o;            // LUT-RAM data
150
output               lut_ram_wen_o;            // LUT-RAM write strobe (active low)
151
output               lut_ram_cen_o;            // LUT-RAM chip enable (active low)
152
`endif
153
 
154
output [`VRAM_MSB:0] vid_ram_addr_o;           // Video-RAM address
155
output        [15:0] vid_ram_din_o;            // Video-RAM data
156
output               vid_ram_wen_o;            // Video-RAM write strobe (active low)
157
output               vid_ram_cen_o;            // Video-RAM chip enable (active low)
158
 
159
// INPUTs
160
//=========
161
input                dbg_freeze_i;             // Freeze address auto-incr on read
162
input                gpu_cmd_done_evt_i;       // GPU command done event
163
input                gpu_cmd_error_evt_i;      // GPU command error event
164 6 olivier.gi
input                gpu_dma_busy_i;           // GPU DMA execution on going
165 3 olivier.gi
input                gpu_get_data_i;           // GPU get next data
166
input          [4:0] lt24_status_i;            // LT24 FSM Status
167
input                lt24_start_evt_i;         // LT24 FSM is starting
168
input                lt24_done_evt_i;          // LT24 FSM is done
169
input                mclk;                     // Main system clock
170
input         [13:0] per_addr_i;               // Peripheral address
171
input         [15:0] per_din_i;                // Peripheral data input
172
input                per_en_i;                 // Peripheral enable (high active)
173
input          [1:0] per_we_i;                 // Peripheral write enable (high active)
174
input                puc_rst;                  // Main system reset
175
`ifdef WITH_PROGRAMMABLE_LUT
176
input         [15:0] lut_ram_dout_i;           // LUT-RAM data input
177
`endif
178
input         [15:0] vid_ram_dout_i;           // Video-RAM data input
179
 
180
 
181
//=============================================================================
182
// 1)  PARAMETER DECLARATION
183
//=============================================================================
184
 
185
// Register base address (must be aligned to decoder bit width)
186
parameter       [14:0] BASE_ADDR           = 15'h0200;
187
 
188
// Decoder bit width (defines how many bits are considered for address decoding)
189
parameter              DEC_WD              =  7;
190
 
191
// Register addresses offset
192
parameter [DEC_WD-1:0] GFX_CTRL            = 'h00,  // General control/status/irq
193
                       GFX_STATUS          = 'h08,
194
                       GFX_IRQ             = 'h0A,
195
 
196
                       DISPLAY_WIDTH       = 'h10,  // Display configuration
197
                       DISPLAY_HEIGHT      = 'h12,
198 6 olivier.gi
                       DISPLAY_SIZE_LO     = 'h14,
199
                       DISPLAY_SIZE_HI     = 'h16,
200 3 olivier.gi
                       DISPLAY_CFG         = 'h18,
201
 
202
                       LT24_CFG            = 'h20,  // LT24 configuration and Generic command sending
203
                       LT24_REFRESH        = 'h22,
204
                       LT24_REFRESH_SYNC   = 'h24,
205
                       LT24_CMD            = 'h26,
206
                       LT24_CMD_PARAM      = 'h28,
207
                       LT24_CMD_DFILL      = 'h2A,
208
                       LT24_STATUS         = 'h2C,
209
 
210
                       LUT_RAM_ADDR        = 'h30,  // LUT Memory Access Gate
211
                       LUT_RAM_DATA        = 'h32,
212
 
213
                       FRAME_SELECT        = 'h3E,  // Frame pointers and selection
214 6 olivier.gi
                       FRAME0_PTR_LO       = 'h40,
215
                       FRAME0_PTR_HI       = 'h42,
216
                       FRAME1_PTR_LO       = 'h44,
217
                       FRAME1_PTR_HI       = 'h46,
218
                       FRAME2_PTR_LO       = 'h48,
219
                       FRAME2_PTR_HI       = 'h4A,
220
                       FRAME3_PTR_LO       = 'h4C,
221
                       FRAME3_PTR_HI       = 'h4E,
222 3 olivier.gi
 
223
                       VID_RAM0_CFG        = 'h50,  // First Video Memory Access Gate
224
                       VID_RAM0_WIDTH      = 'h52,
225 6 olivier.gi
                       VID_RAM0_ADDR_LO    = 'h54,
226
                       VID_RAM0_ADDR_HI    = 'h56,
227 3 olivier.gi
                       VID_RAM0_DATA       = 'h58,
228
 
229
                       VID_RAM1_CFG        = 'h60,  // Second Video Memory Access Gate
230
                       VID_RAM1_WIDTH      = 'h62,
231 6 olivier.gi
                       VID_RAM1_ADDR_LO    = 'h64,
232
                       VID_RAM1_ADDR_HI    = 'h66,
233 3 olivier.gi
                       VID_RAM1_DATA       = 'h68,
234
 
235 6 olivier.gi
                       GPU_CMD_LO          = 'h70,  // Graphic Processing Unit
236
                       GPU_CMD_HI          = 'h72,
237
                       GPU_STAT            = 'h74;
238 3 olivier.gi
 
239
 
240
// Register one-hot decoder utilities
241
parameter              DEC_SZ              =  (1 << DEC_WD);
242
parameter [DEC_SZ-1:0] BASE_REG            =  {{DEC_SZ-1{1'b0}}, 1'b1};
243
 
244
// Register one-hot decoder
245
parameter [DEC_SZ-1:0] GFX_CTRL_D          = (BASE_REG << GFX_CTRL          ),
246
                       GFX_STATUS_D        = (BASE_REG << GFX_STATUS        ),
247
                       GFX_IRQ_D           = (BASE_REG << GFX_IRQ           ),
248
 
249
                       DISPLAY_WIDTH_D     = (BASE_REG << DISPLAY_WIDTH     ),
250
                       DISPLAY_HEIGHT_D    = (BASE_REG << DISPLAY_HEIGHT    ),
251 6 olivier.gi
                       DISPLAY_SIZE_LO_D   = (BASE_REG << DISPLAY_SIZE_LO   ),
252 3 olivier.gi
                       DISPLAY_SIZE_HI_D   = (BASE_REG << DISPLAY_SIZE_HI   ),
253
                       DISPLAY_CFG_D       = (BASE_REG << DISPLAY_CFG       ),
254
 
255
                       LT24_CFG_D          = (BASE_REG << LT24_CFG          ),
256
                       LT24_REFRESH_D      = (BASE_REG << LT24_REFRESH      ),
257
                       LT24_REFRESH_SYNC_D = (BASE_REG << LT24_REFRESH_SYNC ),
258
                       LT24_CMD_D          = (BASE_REG << LT24_CMD          ),
259
                       LT24_CMD_PARAM_D    = (BASE_REG << LT24_CMD_PARAM    ),
260
                       LT24_CMD_DFILL_D    = (BASE_REG << LT24_CMD_DFILL    ),
261
                       LT24_STATUS_D       = (BASE_REG << LT24_STATUS       ),
262
 
263
                       LUT_RAM_ADDR_D      = (BASE_REG << LUT_RAM_ADDR      ),
264
                       LUT_RAM_DATA_D      = (BASE_REG << LUT_RAM_DATA      ),
265
 
266
                       FRAME_SELECT_D      = (BASE_REG << FRAME_SELECT      ),
267 6 olivier.gi
                       FRAME0_PTR_LO_D     = (BASE_REG << FRAME0_PTR_LO     ),
268 3 olivier.gi
                       FRAME0_PTR_HI_D     = (BASE_REG << FRAME0_PTR_HI     ),
269 6 olivier.gi
                       FRAME1_PTR_LO_D     = (BASE_REG << FRAME1_PTR_LO     ),
270 3 olivier.gi
                       FRAME1_PTR_HI_D     = (BASE_REG << FRAME1_PTR_HI     ),
271 6 olivier.gi
                       FRAME2_PTR_LO_D     = (BASE_REG << FRAME2_PTR_LO     ),
272 3 olivier.gi
                       FRAME2_PTR_HI_D     = (BASE_REG << FRAME2_PTR_HI     ),
273 6 olivier.gi
                       FRAME3_PTR_LO_D     = (BASE_REG << FRAME3_PTR_LO     ),
274 3 olivier.gi
                       FRAME3_PTR_HI_D     = (BASE_REG << FRAME3_PTR_HI     ),
275
 
276
                       VID_RAM0_CFG_D      = (BASE_REG << VID_RAM0_CFG      ),
277
                       VID_RAM0_WIDTH_D    = (BASE_REG << VID_RAM0_WIDTH    ),
278 6 olivier.gi
                       VID_RAM0_ADDR_LO_D  = (BASE_REG << VID_RAM0_ADDR_LO  ),
279 3 olivier.gi
                       VID_RAM0_ADDR_HI_D  = (BASE_REG << VID_RAM0_ADDR_HI  ),
280
                       VID_RAM0_DATA_D     = (BASE_REG << VID_RAM0_DATA     ),
281
 
282
                       VID_RAM1_CFG_D      = (BASE_REG << VID_RAM1_CFG      ),
283
                       VID_RAM1_WIDTH_D    = (BASE_REG << VID_RAM1_WIDTH    ),
284 6 olivier.gi
                       VID_RAM1_ADDR_LO_D  = (BASE_REG << VID_RAM1_ADDR_LO  ),
285 3 olivier.gi
                       VID_RAM1_ADDR_HI_D  = (BASE_REG << VID_RAM1_ADDR_HI  ),
286
                       VID_RAM1_DATA_D     = (BASE_REG << VID_RAM1_DATA     ),
287
 
288 6 olivier.gi
                       GPU_CMD_LO_D        = (BASE_REG << GPU_CMD_LO        ),
289
                       GPU_CMD_HI_D        = (BASE_REG << GPU_CMD_HI        ),
290 3 olivier.gi
                       GPU_STAT_D          = (BASE_REG << GPU_STAT          );
291
 
292
 
293
//============================================================================
294
// 2)  REGISTER DECODER
295
//============================================================================
296
 
297
// Local register selection
298
wire               reg_sel   =  per_en_i & (per_addr_i[13:DEC_WD-1]==BASE_ADDR[14:DEC_WD]);
299
 
300
// Register local address
301
wire  [DEC_WD-1:0] reg_addr  =  {per_addr_i[DEC_WD-2:0], 1'b0};
302
 
303
// Register address decode
304
wire  [DEC_SZ-1:0] reg_dec   =  (GFX_CTRL_D          &  {DEC_SZ{(reg_addr == GFX_CTRL          )}})  |
305
                                (GFX_STATUS_D        &  {DEC_SZ{(reg_addr == GFX_STATUS        )}})  |
306
                                (GFX_IRQ_D           &  {DEC_SZ{(reg_addr == GFX_IRQ           )}})  |
307
 
308
                                (DISPLAY_WIDTH_D     &  {DEC_SZ{(reg_addr == DISPLAY_WIDTH     )}})  |
309
                                (DISPLAY_HEIGHT_D    &  {DEC_SZ{(reg_addr == DISPLAY_HEIGHT    )}})  |
310 6 olivier.gi
                                (DISPLAY_SIZE_LO_D   &  {DEC_SZ{(reg_addr == DISPLAY_SIZE_LO   )}})  |
311 3 olivier.gi
                                (DISPLAY_SIZE_HI_D   &  {DEC_SZ{(reg_addr == DISPLAY_SIZE_HI   )}})  |
312
                                (DISPLAY_CFG_D       &  {DEC_SZ{(reg_addr == DISPLAY_CFG       )}})  |
313
 
314
                                (LT24_CFG_D          &  {DEC_SZ{(reg_addr == LT24_CFG          )}})  |
315
                                (LT24_REFRESH_D      &  {DEC_SZ{(reg_addr == LT24_REFRESH      )}})  |
316
                                (LT24_REFRESH_SYNC_D &  {DEC_SZ{(reg_addr == LT24_REFRESH_SYNC )}})  |
317
                                (LT24_CMD_D          &  {DEC_SZ{(reg_addr == LT24_CMD          )}})  |
318
                                (LT24_CMD_PARAM_D    &  {DEC_SZ{(reg_addr == LT24_CMD_PARAM    )}})  |
319
                                (LT24_CMD_DFILL_D    &  {DEC_SZ{(reg_addr == LT24_CMD_DFILL    )}})  |
320
                                (LT24_STATUS_D       &  {DEC_SZ{(reg_addr == LT24_STATUS       )}})  |
321
 
322
                                (LUT_RAM_ADDR_D      &  {DEC_SZ{(reg_addr == LUT_RAM_ADDR      )}})  |
323
                                (LUT_RAM_DATA_D      &  {DEC_SZ{(reg_addr == LUT_RAM_DATA      )}})  |
324
 
325
                                (FRAME_SELECT_D      &  {DEC_SZ{(reg_addr == FRAME_SELECT      )}})  |
326 6 olivier.gi
                                (FRAME0_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME0_PTR_LO     )}})  |
327 3 olivier.gi
                                (FRAME0_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME0_PTR_HI     )}})  |
328 6 olivier.gi
                                (FRAME1_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME1_PTR_LO     )}})  |
329 3 olivier.gi
                                (FRAME1_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME1_PTR_HI     )}})  |
330 6 olivier.gi
                                (FRAME2_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME2_PTR_LO     )}})  |
331 3 olivier.gi
                                (FRAME2_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME2_PTR_HI     )}})  |
332 6 olivier.gi
                                (FRAME3_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME3_PTR_LO     )}})  |
333 3 olivier.gi
                                (FRAME3_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME3_PTR_HI     )}})  |
334
 
335
                                (VID_RAM0_CFG_D      &  {DEC_SZ{(reg_addr == VID_RAM0_CFG      )}})  |
336
                                (VID_RAM0_WIDTH_D    &  {DEC_SZ{(reg_addr == VID_RAM0_WIDTH    )}})  |
337 6 olivier.gi
                                (VID_RAM0_ADDR_LO_D  &  {DEC_SZ{(reg_addr == VID_RAM0_ADDR_LO  )}})  |
338 3 olivier.gi
                                (VID_RAM0_ADDR_HI_D  &  {DEC_SZ{(reg_addr == VID_RAM0_ADDR_HI  )}})  |
339
                                (VID_RAM0_DATA_D     &  {DEC_SZ{(reg_addr == VID_RAM0_DATA     )}})  |
340
 
341
                                (VID_RAM1_CFG_D      &  {DEC_SZ{(reg_addr == VID_RAM1_CFG      )}})  |
342
                                (VID_RAM1_WIDTH_D    &  {DEC_SZ{(reg_addr == VID_RAM1_WIDTH    )}})  |
343 6 olivier.gi
                                (VID_RAM1_ADDR_LO_D  &  {DEC_SZ{(reg_addr == VID_RAM1_ADDR_LO  )}})  |
344 3 olivier.gi
                                (VID_RAM1_ADDR_HI_D  &  {DEC_SZ{(reg_addr == VID_RAM1_ADDR_HI  )}})  |
345
                                (VID_RAM1_DATA_D     &  {DEC_SZ{(reg_addr == VID_RAM1_DATA     )}})  |
346
 
347 6 olivier.gi
                                (GPU_CMD_LO_D        &  {DEC_SZ{(reg_addr == GPU_CMD_LO        )}})  |
348
                                (GPU_CMD_HI_D        &  {DEC_SZ{(reg_addr == GPU_CMD_HI        )}})  |
349 3 olivier.gi
                                (GPU_STAT_D          &  {DEC_SZ{(reg_addr == GPU_STAT          )}});
350
 
351
// Read/Write probes
352
wire               reg_write =  |per_we_i & reg_sel;
353
wire               reg_read  = ~|per_we_i & reg_sel;
354
 
355
// Read/Write vectors
356
wire  [DEC_SZ-1:0] reg_wr    = reg_dec & {DEC_SZ{reg_write}};
357
wire  [DEC_SZ-1:0] reg_rd    = reg_dec & {DEC_SZ{reg_read}};
358
 
359
// Other wire declarations
360
wire [`APIX_MSB:0] frame0_ptr;
361
`ifdef WITH_FRAME1_POINTER
362
wire [`APIX_MSB:0] frame1_ptr;
363
`endif
364
`ifdef WITH_FRAME2_POINTER
365
wire [`APIX_MSB:0] frame2_ptr;
366
`endif
367
`ifdef WITH_FRAME3_POINTER
368
wire [`APIX_MSB:0] frame3_ptr;
369
`endif
370
wire [`APIX_MSB:0] vid_ram0_base_addr;
371
wire [`APIX_MSB:0] vid_ram1_base_addr;
372
`ifdef WITH_EXTRA_LUT_BANK
373
reg                lut_bank_select;
374
`endif
375
wire               gpu_fifo_done_evt;
376
wire               gpu_fifo_ovfl_evt;
377
 
378
 
379
//============================================================================
380
// 3) REGISTERS
381
//============================================================================
382
 
383
//------------------------------------------------
384
// GFX_CTRL Register
385
//------------------------------------------------
386
reg  [15:0] gfx_ctrl;
387
 
388
wire        gfx_ctrl_wr = reg_wr[GFX_CTRL];
389
 
390
always @ (posedge mclk or posedge puc_rst)
391
  if (puc_rst)          gfx_ctrl <=  16'h0000;
392
  else if (gfx_ctrl_wr) gfx_ctrl <=  per_din_i;
393
 
394
// Bitfield assignments
395
wire        gfx_irq_refr_done_en     =  gfx_ctrl[0];
396
wire        gfx_irq_refr_start_en    =  gfx_ctrl[1];
397
wire        gfx_irq_gpu_fifo_done_en =  gfx_ctrl[4];
398
wire        gfx_irq_gpu_fifo_ovfl_en =  gfx_ctrl[5];
399
wire        gfx_irq_gpu_cmd_done_en  =  gfx_ctrl[6];
400
wire        gfx_irq_gpu_cmd_error_en =  gfx_ctrl[7];
401
assign      gfx_mode_o               =  gfx_ctrl[10:8]; // 1xx: 16 bits-per-pixel
402
                                                        // 011:  8 bits-per-pixel
403
                                                        // 010:  4 bits-per-pixel
404
                                                        // 001:  2 bits-per-pixel
405
                                                        // 000:  1 bits-per-pixel
406
wire        gpu_enable_o             =  gfx_ctrl[12];
407
 
408
// Video modes decoding
409
wire        gfx_mode_1_bpp           =  (gfx_mode_o == 3'b000);
410
wire        gfx_mode_2_bpp           =  (gfx_mode_o == 3'b001);
411
wire        gfx_mode_4_bpp           =  (gfx_mode_o == 3'b010);
412
wire        gfx_mode_8_bpp           =  (gfx_mode_o == 3'b011);
413
wire        gfx_mode_16_bpp          = ~(gfx_mode_8_bpp | gfx_mode_4_bpp | gfx_mode_2_bpp | gfx_mode_1_bpp);
414
 
415
//------------------------------------------------
416
// GFX_STATUS Register
417
//------------------------------------------------
418
wire  [15:0] gfx_status;
419
 
420
assign       gfx_status[0]    = lt24_status_i[2]; // Screen Refresh is busy
421
assign       gfx_status[15:1] = 15'h0000;
422
 
423
//------------------------------------------------
424
// GFX_IRQ Register
425
//------------------------------------------------
426
wire [15:0] gfx_irq;
427
 
428
// Clear IRQ when 1 is written. Set IRQ when FSM is done
429
wire        gfx_irq_refr_done_clr     = per_din_i[0] & reg_wr[GFX_IRQ];
430
wire        gfx_irq_refr_done_set     = lt24_done_evt_i;
431
 
432
wire        gfx_irq_refr_start_clr    = per_din_i[1] & reg_wr[GFX_IRQ];
433
wire        gfx_irq_refr_start_set    = lt24_start_evt_i;
434
 
435
wire        gfx_irq_gpu_fifo_done_clr = per_din_i[4] & reg_wr[GFX_IRQ];
436
wire        gfx_irq_gpu_fifo_done_set = gpu_fifo_done_evt;
437
 
438
wire        gfx_irq_gpu_fifo_ovfl_clr = per_din_i[5] & reg_wr[GFX_IRQ];
439
wire        gfx_irq_gpu_fifo_ovfl_set = gpu_fifo_ovfl_evt;
440
 
441
wire        gfx_irq_gpu_cmd_done_clr  = per_din_i[6] & reg_wr[GFX_IRQ];
442
wire        gfx_irq_gpu_cmd_done_set  = gpu_cmd_done_evt_i;
443
 
444
wire        gfx_irq_gpu_cmd_error_clr = per_din_i[7] & reg_wr[GFX_IRQ];
445
wire        gfx_irq_gpu_cmd_error_set = gpu_cmd_error_evt_i;
446
 
447
reg         gfx_irq_refr_done;
448
reg         gfx_irq_refr_start;
449
reg         gfx_irq_gpu_fifo_done;
450
reg         gfx_irq_gpu_fifo_ovfl;
451
reg         gfx_irq_gpu_cmd_done;
452
reg         gfx_irq_gpu_cmd_error;
453
always @ (posedge mclk or posedge puc_rst)
454
  if (puc_rst)
455
    begin
456
       gfx_irq_refr_done     <=  1'b0;
457
       gfx_irq_refr_start    <=  1'b0;
458
       gfx_irq_gpu_fifo_done <=  1'b0;
459
       gfx_irq_gpu_fifo_ovfl <=  1'b0;
460
       gfx_irq_gpu_cmd_done  <=  1'b0;
461
       gfx_irq_gpu_cmd_error <=  1'b0;
462
    end
463
  else
464
    begin
465
       gfx_irq_refr_done     <=  (gfx_irq_refr_done_set     | (~gfx_irq_refr_done_clr     & gfx_irq_refr_done    )); // IRQ set has priority over clear
466
       gfx_irq_refr_start    <=  (gfx_irq_refr_start_set    | (~gfx_irq_refr_start_clr    & gfx_irq_refr_start   )); // IRQ set has priority over clear
467
       gfx_irq_gpu_fifo_done <=  (gfx_irq_gpu_fifo_done_set | (~gfx_irq_gpu_fifo_done_clr & gfx_irq_gpu_fifo_done)); // IRQ set has priority over clear
468
       gfx_irq_gpu_fifo_ovfl <=  (gfx_irq_gpu_fifo_ovfl_set | (~gfx_irq_gpu_fifo_ovfl_clr & gfx_irq_gpu_fifo_ovfl)); // IRQ set has priority over clear
469
       gfx_irq_gpu_cmd_done  <=  (gfx_irq_gpu_cmd_done_set  | (~gfx_irq_gpu_cmd_done_clr  & gfx_irq_gpu_cmd_done )); // IRQ set has priority over clear
470
       gfx_irq_gpu_cmd_error <=  (gfx_irq_gpu_cmd_error_set | (~gfx_irq_gpu_cmd_error_clr & gfx_irq_gpu_cmd_error)); // IRQ set has priority over clear
471
    end
472
 
473
assign  gfx_irq   = {8'h00,
474
                     gfx_irq_gpu_cmd_error, gfx_irq_gpu_cmd_done, gfx_irq_gpu_fifo_ovfl, gfx_irq_gpu_fifo_done,
475
                     2'h0, gfx_irq_refr_start, gfx_irq_refr_done};
476
 
477
assign  irq_gfx_o = (gfx_irq_refr_done     & gfx_irq_refr_done_en)     |
478
                    (gfx_irq_refr_start    & gfx_irq_refr_start_en)    |
479
                    (gfx_irq_gpu_cmd_error & gfx_irq_gpu_cmd_error_en) |
480
                    (gfx_irq_gpu_cmd_done  & gfx_irq_gpu_cmd_done_en)  |
481
                    (gfx_irq_gpu_fifo_ovfl & gfx_irq_gpu_fifo_ovfl_en) |
482
                    (gfx_irq_gpu_fifo_done & gfx_irq_gpu_fifo_done_en);  // Graphic Controller interrupt
483
 
484
//------------------------------------------------
485
// DISPLAY_WIDTH Register
486
//------------------------------------------------
487
reg  [`LPIX_MSB:0] display_width_o;
488
 
489
wire               display_width_wr = reg_wr[DISPLAY_WIDTH];
490
wire [`LPIX_MSB:0] display_w_h_nxt  = (|per_din_i[`LPIX_MSB:0]) ? per_din_i[`LPIX_MSB:0] :
491
                                                                  {{`LPIX_MSB{1'b0}}, 1'b1};
492
 
493
always @ (posedge mclk or posedge puc_rst)
494
  if (puc_rst)               display_width_o <=  {{`LPIX_MSB{1'b0}}, 1'b1};
495
  else if (display_width_wr) display_width_o <=  display_w_h_nxt;
496
 
497
wire [16:0] display_width_tmp = {{16-`LPIX_MSB{1'b0}}, display_width_o};
498
wire [15:0] display_width_rd  = display_width_tmp[15:0];
499
 
500
//------------------------------------------------
501
// DISPLAY_HEIGHT Register
502
//------------------------------------------------
503
reg  [`LPIX_MSB:0] display_height_o;
504
 
505
wire               display_height_wr = reg_wr[DISPLAY_HEIGHT];
506
 
507
always @ (posedge mclk or posedge puc_rst)
508
  if (puc_rst)                display_height_o <=  {{`LPIX_MSB{1'b0}}, 1'b1};
509
  else if (display_height_wr) display_height_o <=  display_w_h_nxt;
510
 
511
wire [16:0] display_height_tmp = {{16-`LPIX_MSB{1'b0}}, display_height_o};
512
wire [15:0] display_height_rd  = display_height_tmp[15:0];
513
 
514
//------------------------------------------------
515
// DISPLAY_SIZE_HI Register
516
//------------------------------------------------
517
`ifdef WITH_DISPLAY_SIZE_HI
518
reg  [`SPIX_HI_MSB:0] display_size_hi;
519
 
520
wire                  display_size_hi_wr = reg_wr[DISPLAY_SIZE_HI];
521
 
522
always @ (posedge mclk or posedge puc_rst)
523
  if (puc_rst)                 display_size_hi <=  {`SPIX_HI_MSB+1{1'h0}};
524
  else if (display_size_hi_wr) display_size_hi <=  per_din_i[`SPIX_HI_MSB:0];
525
 
526
wire  [16:0] display_size_hi_tmp = {{16-`SPIX_HI_MSB{1'h0}}, display_size_hi};
527
wire  [15:0] display_size_hi_rd  = display_size_hi_tmp[15:0];
528
`endif
529
 
530
//------------------------------------------------
531
// DISPLAY_SIZE_LO Register
532
//------------------------------------------------
533
reg  [`SPIX_LO_MSB:0] display_size_lo;
534
 
535
wire                  display_size_lo_wr = reg_wr[DISPLAY_SIZE_LO];
536
 
537
always @ (posedge mclk or posedge puc_rst)
538
  if (puc_rst)                 display_size_lo <=  {{`SPIX_LO_MSB{1'h0}}, 1'b1};
539
  else if (display_size_lo_wr) display_size_lo <=  per_din_i[`SPIX_LO_MSB:0];
540
 
541
wire  [16:0] display_size_lo_tmp = {{16-`SPIX_LO_MSB{1'h0}}, display_size_lo};
542
wire  [15:0] display_size_lo_rd  = display_size_lo_tmp[15:0];
543
 
544
`ifdef WITH_DISPLAY_SIZE_HI
545
assign display_size_o = {display_size_hi, display_size_lo};
546
`else
547
assign display_size_o =  display_size_lo;
548
`endif
549
 
550
//------------------------------------------------
551
// DISPLAY_CFG Register
552
//------------------------------------------------
553
reg   display_x_swap_o;
554
reg   display_y_swap_o;
555
reg   display_cl_swap_o;
556
 
557
wire  display_cfg_wr = reg_wr[DISPLAY_CFG];
558
 
559
always @ (posedge mclk or posedge puc_rst)
560
  if (puc_rst)
561
    begin
562
       display_cl_swap_o <=  1'b0;
563
       display_y_swap_o  <=  1'b0;
564
       display_x_swap_o  <=  1'b0;
565
    end
566
  else if (display_cfg_wr)
567
    begin
568
       display_cl_swap_o <=  per_din_i[0];
569
       display_y_swap_o  <=  per_din_i[1];
570
       display_x_swap_o  <=  per_din_i[2];
571
    end
572
 
573
wire [15:0] display_cfg = {13'h0000,
574
                           display_x_swap_o,
575
                           display_y_swap_o,
576
                           display_cl_swap_o};
577
 
578
//------------------------------------------------
579
// LT24_CFG Register
580
//------------------------------------------------
581
reg  [15:0] lt24_cfg;
582
 
583
wire        lt24_cfg_wr = reg_wr[LT24_CFG];
584
 
585
always @ (posedge mclk or posedge puc_rst)
586
  if (puc_rst)          lt24_cfg <=  16'h0000;
587
  else if (lt24_cfg_wr) lt24_cfg <=  per_din_i;
588
 
589
// Bitfield assignments
590
assign     lt24_cfg_clk_o  =  lt24_cfg[6:4];
591
assign     lt24_reset_n_o  = ~lt24_cfg[1];
592
assign     lt24_on_o       =  lt24_cfg[0];
593
 
594
//------------------------------------------------
595
// LT24_REFRESH Register
596
//------------------------------------------------
597
reg        lt24_cmd_refr_o;
598
reg [11:0] lt24_cfg_refr_o;
599
 
600
wire      lt24_refresh_wr   = reg_wr[LT24_REFRESH];
601
wire      lt24_cmd_refr_clr = lt24_done_evt_i & lt24_status_i[2] & (lt24_cfg_refr_o==8'h00); // Auto-clear in manual refresh mode when done
602
 
603
always @ (posedge mclk or posedge puc_rst)
604
  if (puc_rst)                lt24_cmd_refr_o      <=  1'h0;
605
  else if (lt24_refresh_wr)   lt24_cmd_refr_o      <=  per_din_i[0];
606
  else if (lt24_cmd_refr_clr) lt24_cmd_refr_o      <=  1'h0;
607
 
608
always @ (posedge mclk or posedge puc_rst)
609
  if (puc_rst)                lt24_cfg_refr_o      <=  12'h000;
610
  else if (lt24_refresh_wr)   lt24_cfg_refr_o      <=  per_din_i[15:4];
611
 
612
wire [15:0] lt24_refresh = {lt24_cfg_refr_o, 3'h0, lt24_cmd_refr_o};
613
 
614
//------------------------------------------------
615
// LT24_REFRESH Register
616
//------------------------------------------------
617
reg        lt24_cfg_refr_sync_en_o;
618
reg  [9:0] lt24_cfg_refr_sync_val_o;
619
 
620
wire       lt24_refresh_sync_wr   = reg_wr[LT24_REFRESH_SYNC];
621
 
622
always @ (posedge mclk or posedge puc_rst)
623
  if (puc_rst)                   lt24_cfg_refr_sync_en_o  <=  1'h0;
624
  else if (lt24_refresh_sync_wr) lt24_cfg_refr_sync_en_o  <=  per_din_i[15];
625
 
626
always @ (posedge mclk or posedge puc_rst)
627
  if (puc_rst)                   lt24_cfg_refr_sync_val_o <=  10'h000;
628
  else if (lt24_refresh_sync_wr) lt24_cfg_refr_sync_val_o <=  per_din_i[9:0];
629
 
630
wire [15:0] lt24_refresh_sync = {lt24_cfg_refr_sync_en_o, 5'h00, lt24_cfg_refr_sync_val_o};
631
 
632
 
633
//------------------------------------------------
634
// LT24_CMD Register
635
//------------------------------------------------
636
reg  [15:0] lt24_cmd;
637
 
638
wire        lt24_cmd_wr = reg_wr[LT24_CMD];
639
 
640
always @ (posedge mclk or posedge puc_rst)
641
  if (puc_rst)          lt24_cmd <=  16'h0000;
642
  else if (lt24_cmd_wr) lt24_cmd <=  per_din_i;
643
 
644
assign     lt24_cmd_val_o       = lt24_cmd[7:0];
645
assign     lt24_cmd_has_param_o = lt24_cmd[8];
646
 
647
//------------------------------------------------
648
// LT24_CMD_PARAM Register
649
//------------------------------------------------
650
reg  [15:0] lt24_cmd_param_o;
651
 
652
wire        lt24_cmd_param_wr = reg_wr[LT24_CMD_PARAM];
653
 
654
always @ (posedge mclk or posedge puc_rst)
655
  if (puc_rst)                lt24_cmd_param_o <=  16'h0000;
656
  else if (lt24_cmd_param_wr) lt24_cmd_param_o <=  per_din_i;
657
 
658
reg lt24_cmd_param_rdy_o;
659
always @ (posedge mclk or posedge puc_rst)
660
  if (puc_rst) lt24_cmd_param_rdy_o <=  1'b0;
661
  else         lt24_cmd_param_rdy_o <=  lt24_cmd_param_wr;
662
 
663
//------------------------------------------------
664
// LT24_CMD_DFILL Register
665
//------------------------------------------------
666
reg  [15:0] lt24_cmd_dfill_o;
667
 
668
assign      lt24_cmd_dfill_wr_o = reg_wr[LT24_CMD_DFILL];
669
 
670
always @ (posedge mclk or posedge puc_rst)
671
  if (puc_rst)                  lt24_cmd_dfill_o <=  16'h0000;
672
  else if (lt24_cmd_dfill_wr_o) lt24_cmd_dfill_o <=  per_din_i;
673
 
674
//------------------------------------------------
675
// LT24_STATUS Register
676
//------------------------------------------------
677
wire  [15:0] lt24_status;
678
 
679
assign       lt24_status[0]    = lt24_status_i[0]; // FSM_BUSY
680
assign       lt24_status[1]    = lt24_status_i[1]; // WAIT_PARAM
681
assign       lt24_status[2]    = lt24_status_i[2]; // REFRESH_BUSY
682
assign       lt24_status[3]    = lt24_status_i[3]; // WAIT_FOR_SCANLINE
683
assign       lt24_status[4]    = lt24_status_i[4]; // DATA_FILL_BUSY
684
assign       lt24_status[15:5] = 11'h000;
685
 
686
 
687
//------------------------------------------------
688
// LUT_RAM_ADDR Register
689
//------------------------------------------------
690
`ifdef WITH_PROGRAMMABLE_LUT
691
 
692
reg  [7:0] lut_ram_addr;
693
wire [7:0] lut_ram_addr_inc;
694
wire       lut_ram_addr_inc_wr;
695
 
696
wire       lut_ram_addr_wr = reg_wr[LUT_RAM_ADDR];
697
 
698
always @ (posedge mclk or posedge puc_rst)
699
  if (puc_rst)                  lut_ram_addr <=  8'h00;
700
  else if (lut_ram_addr_wr)     lut_ram_addr <=  per_din_i[7:0];
701
  else if (lut_ram_addr_inc_wr) lut_ram_addr <=  lut_ram_addr_inc;
702
 
703
assign      lut_ram_addr_inc = lut_ram_addr + 8'h01;
704
wire [15:0] lut_ram_addr_rd  = {8'h00, lut_ram_addr};
705
 
706
 `ifdef WITH_EXTRA_LUT_BANK
707
   assign lut_ram_addr_o = {lut_bank_select, lut_ram_addr};
708
 `else
709
   assign lut_ram_addr_o = lut_ram_addr;
710
 `endif
711
 
712
`else
713
wire [15:0] lut_ram_addr_rd  = 16'h0000;
714
`endif
715
 
716
//------------------------------------------------
717
// LUT_RAM_DATA Register
718
//------------------------------------------------
719
`ifdef WITH_PROGRAMMABLE_LUT
720
 
721
// Update the LUT_RAM_DATA register with regular register write access
722
wire        lut_ram_data_wr  = reg_wr[LUT_RAM_DATA];
723
wire        lut_ram_data_rd  = reg_rd[LUT_RAM_DATA];
724
reg         lut_ram_dout_rdy;
725
 
726
// LUT-RAM data Register
727
reg  [15:0] lut_ram_data;
728
always @ (posedge mclk or posedge puc_rst)
729
  if (puc_rst)               lut_ram_data <=  16'h0000;
730
  else if (lut_ram_data_wr)  lut_ram_data <=  per_din_i;
731
  else if (lut_ram_dout_rdy) lut_ram_data <=  lut_ram_dout_i;
732
 
733
// Increment the address after a write or read access to the LUT_RAM_DATA register
734
assign lut_ram_addr_inc_wr = lut_ram_data_wr | lut_ram_data_rd;
735
 
736
// Apply peripheral data bus % write strobe during VID_RAMx_DATA write access
737
assign lut_ram_din_o       =    per_din_i & {16{lut_ram_data_wr}};
738
assign lut_ram_wen_o       = ~(|per_we_i  &     lut_ram_data_wr);
739
 
740
// Trigger a LUT-RAM read access immediately after:
741
//   - a LUT-RAM_ADDR register write access
742
//   - a LUT-RAM_DATA register read access
743
reg lut_ram_addr_wr_dly;
744
always @ (posedge mclk or posedge puc_rst)
745
  if (puc_rst) lut_ram_addr_wr_dly <= 1'b0;
746
  else         lut_ram_addr_wr_dly <= lut_ram_addr_wr;
747
 
748
reg  lut_ram_data_rd_dly;
749
always @ (posedge mclk or posedge puc_rst)
750
  if (puc_rst) lut_ram_data_rd_dly    <= 1'b0;
751
  else         lut_ram_data_rd_dly    <= lut_ram_data_rd;
752
 
753
// Chip enable.
754
// Note: we perform a data read access:
755
//       - one cycle after a VID_RAM_DATA register read access (so that the address has been incremented)
756
//       - one cycle after a VID_RAM_ADDR register write
757
assign lut_ram_cen_o = ~(lut_ram_addr_wr_dly | lut_ram_data_rd_dly | // Read access
758
                         lut_ram_data_wr);                           // Write access
759
 
760
// Update the VRAM_DATA register one cycle after each memory access
761
always @ (posedge mclk or posedge puc_rst)
762
  if (puc_rst) lut_ram_dout_rdy <= 1'b0;
763
  else         lut_ram_dout_rdy <= ~lut_ram_cen_o;
764
 
765
`else
766
wire [15:0] lut_ram_data  = 16'h0000;
767
`endif
768
 
769
//------------------------------------------------
770
// FRAME_SELECT Register
771
//------------------------------------------------
772
 
773
wire  frame_select_wr = reg_wr[FRAME_SELECT];
774
 
775
`ifdef WITH_PROGRAMMABLE_LUT
776
  reg        refresh_sw_lut_enable;
777
 
778
  always @ (posedge mclk or posedge puc_rst)
779
    if (puc_rst)              refresh_sw_lut_enable  <=  1'b0;
780
    else if (frame_select_wr) refresh_sw_lut_enable  <=  per_din_i[2];
781
`else
782
  wire       refresh_sw_lut_enable = 1'b0;
783
`endif
784
 
785
`ifdef WITH_EXTRA_LUT_BANK
786
  reg        refresh_sw_lut_select;
787
 
788
  always @ (posedge mclk or posedge puc_rst)
789
    if (puc_rst)
790
      begin
791
         refresh_sw_lut_select <=  1'b0;
792
         lut_bank_select       <=  1'b0;
793
      end
794
    else if (frame_select_wr)
795
      begin
796
         refresh_sw_lut_select <=  per_din_i[3];
797
         lut_bank_select       <=  per_din_i[15];
798
      end
799
`else
800
  assign refresh_sw_lut_select  =  1'b0;
801
  wire   lut_bank_select        =  1'b0;
802
`endif
803
  wire [1:0] refresh_lut_select_o = {refresh_sw_lut_select, refresh_sw_lut_enable};
804
 
805
`ifdef WITH_FRAME1_POINTER
806
  `ifdef WITH_FRAME2_POINTER
807
  reg  [1:0] refresh_frame_select;
808
  reg  [1:0] vid_ram0_frame_select;
809
  reg  [1:0] vid_ram1_frame_select;
810
 
811
  always @ (posedge mclk or posedge puc_rst)
812
    if (puc_rst)
813
      begin
814
         refresh_frame_select  <= 2'h0;
815
         vid_ram0_frame_select <= 2'h0;
816
         vid_ram1_frame_select <= 2'h0;
817
      end
818
    else if (frame_select_wr)
819
      begin
820
         refresh_frame_select  <= per_din_i[1:0];
821
         vid_ram0_frame_select <= per_din_i[5:4];
822
         vid_ram1_frame_select <= per_din_i[7:6];
823
      end
824
 
825
  wire [15:0] frame_select = {lut_bank_select, 7'h00, vid_ram1_frame_select, vid_ram0_frame_select, refresh_lut_select_o, refresh_frame_select};
826
  `else
827
  reg        refresh_frame_select;
828
  reg        vid_ram0_frame_select;
829
  reg        vid_ram1_frame_select;
830
 
831
  always @ (posedge mclk or posedge puc_rst)
832
    if (puc_rst)
833
      begin
834
         refresh_frame_select  <= 1'h0;
835
         vid_ram0_frame_select <= 1'h0;
836
         vid_ram1_frame_select <= 1'h0;
837
      end
838
    else if (frame_select_wr)
839
      begin
840
         refresh_frame_select  <= per_din_i[0];
841
         vid_ram0_frame_select <= per_din_i[4];
842
         vid_ram1_frame_select <= per_din_i[6];
843
      end
844
 
845
  wire [15:0] frame_select = {lut_bank_select, 7'h00, 1'h0, vid_ram1_frame_select, 1'h0, vid_ram0_frame_select, refresh_lut_select_o, 1'h0, refresh_frame_select};
846
  `endif
847
`else
848
  wire [15:0] frame_select = {lut_bank_select, 11'h000, refresh_lut_select_o, 2'h0};
849
`endif
850
 
851
// Frame pointer selections
852
`ifdef WITH_FRAME1_POINTER
853
assign refresh_frame_addr_o  = (refresh_frame_select==0)  ? frame0_ptr :
854
                           `ifdef WITH_FRAME2_POINTER
855
                               (refresh_frame_select==1)  ? frame1_ptr :
856
                             `ifdef WITH_FRAME3_POINTER
857
                               (refresh_frame_select==2)  ? frame2_ptr :
858
                                                            frame3_ptr ;
859
                             `else
860
                                                            frame2_ptr ;
861
                             `endif
862
                           `else
863
                                                            frame1_ptr ;
864
                           `endif
865
 
866
assign vid_ram0_base_addr    = (vid_ram0_frame_select==0) ? frame0_ptr :
867
                           `ifdef WITH_FRAME2_POINTER
868
                               (vid_ram0_frame_select==1) ? frame1_ptr :
869
                             `ifdef WITH_FRAME3_POINTER
870
                               (vid_ram0_frame_select==2) ? frame2_ptr :
871
                                                            frame3_ptr ;
872
                             `else
873
                                                            frame2_ptr ;
874
                             `endif
875
                           `else
876
                                                            frame1_ptr ;
877
                           `endif
878
 
879
assign vid_ram1_base_addr    = (vid_ram1_frame_select==0) ? frame0_ptr :
880
                           `ifdef WITH_FRAME2_POINTER
881
                               (vid_ram1_frame_select==1) ? frame1_ptr :
882
                             `ifdef WITH_FRAME3_POINTER
883
                               (vid_ram1_frame_select==2) ? frame2_ptr :
884
                                                            frame3_ptr ;
885
                             `else
886
                                                            frame2_ptr ;
887
                             `endif
888
                           `else
889
                                                            frame1_ptr ;
890
                           `endif
891
 
892
`else
893
assign refresh_frame_addr_o  = frame0_ptr;
894
assign vid_ram0_base_addr    = frame0_ptr;
895
assign vid_ram1_base_addr    = frame0_ptr;
896
`endif
897
 
898
//------------------------------------------------
899
// FRAME0_PTR_HI Register
900
//------------------------------------------------
901
`ifdef VRAM_BIGGER_4_KW
902
reg [`APIX_HI_MSB:0] frame0_ptr_hi;
903
 
904
wire                 frame0_ptr_hi_wr = reg_wr[FRAME0_PTR_HI];
905
 
906
always @ (posedge mclk or posedge puc_rst)
907
  if (puc_rst)               frame0_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
908
  else if (frame0_ptr_hi_wr) frame0_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
909
 
910
wire [16:0] frame0_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame0_ptr_hi};
911
wire [15:0] frame0_ptr_hi_rd  = frame0_ptr_hi_tmp[15:0];
912
`endif
913
 
914
//------------------------------------------------
915
// FRAME0_PTR_LO Register
916
//------------------------------------------------
917
reg  [`APIX_LO_MSB:0] frame0_ptr_lo;
918
 
919
wire                  frame0_ptr_lo_wr = reg_wr[FRAME0_PTR_LO];
920
 
921
always @ (posedge mclk or posedge puc_rst)
922
  if (puc_rst)               frame0_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
923
  else if (frame0_ptr_lo_wr) frame0_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
924
 
925
`ifdef VRAM_BIGGER_4_KW
926
assign      frame0_ptr        = {frame0_ptr_hi[`APIX_HI_MSB:0], frame0_ptr_lo};
927
wire [15:0] frame0_ptr_lo_rd  = frame0_ptr_lo;
928
`else
929
assign      frame0_ptr        = {frame0_ptr_lo[`APIX_LO_MSB:0]};
930
wire [16:0] frame0_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame0_ptr_lo};
931
wire [15:0] frame0_ptr_lo_rd  = frame0_ptr_lo_tmp[15:0];
932
`endif
933
 
934
//------------------------------------------------
935
// FRAME1_PTR_HI Register
936
//------------------------------------------------
937
`ifdef WITH_FRAME1_POINTER
938
  `ifdef VRAM_BIGGER_4_KW
939
  reg [`APIX_HI_MSB:0] frame1_ptr_hi;
940
 
941
  wire                 frame1_ptr_hi_wr = reg_wr[FRAME1_PTR_HI];
942
 
943
  always @ (posedge mclk or posedge puc_rst)
944
    if (puc_rst)               frame1_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
945
    else if (frame1_ptr_hi_wr) frame1_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
946
 
947
  wire [16:0] frame1_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame1_ptr_hi};
948
  wire [15:0] frame1_ptr_hi_rd  = frame1_ptr_hi_tmp[15:0];
949
  `endif
950
`endif
951
 
952
//------------------------------------------------
953
// FRAME1_PTR_LO Register
954
//------------------------------------------------
955
`ifdef WITH_FRAME1_POINTER
956
  reg  [`APIX_LO_MSB:0] frame1_ptr_lo;
957
 
958
  wire                  frame1_ptr_lo_wr = reg_wr[FRAME1_PTR_LO];
959
 
960
  always @ (posedge mclk or posedge puc_rst)
961
    if (puc_rst)               frame1_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
962
    else if (frame1_ptr_lo_wr) frame1_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
963
 
964
  `ifdef VRAM_BIGGER_4_KW
965
  assign      frame1_ptr        = {frame1_ptr_hi[`APIX_HI_MSB:0], frame1_ptr_lo};
966
  wire [15:0] frame1_ptr_lo_rd  = frame1_ptr_lo;
967
  `else
968
  assign      frame1_ptr        = {frame1_ptr_lo[`APIX_LO_MSB:0]};
969
  wire [16:0] frame1_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame1_ptr_lo};
970
  wire [15:0] frame1_ptr_lo_rd  = frame1_ptr_lo_tmp[15:0];
971
  `endif
972
`endif
973
 
974
//------------------------------------------------
975
// FRAME2_PTR_HI Register
976
//------------------------------------------------
977
`ifdef WITH_FRAME2_POINTER
978
  `ifdef VRAM_BIGGER_4_KW
979
  reg [`APIX_HI_MSB:0] frame2_ptr_hi;
980
 
981
  wire                 frame2_ptr_hi_wr = reg_wr[FRAME2_PTR_HI];
982
 
983
  always @ (posedge mclk or posedge puc_rst)
984
    if (puc_rst)               frame2_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
985
    else if (frame2_ptr_hi_wr) frame2_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
986
 
987
  wire [16:0] frame2_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame2_ptr_hi};
988
  wire [15:0] frame2_ptr_hi_rd  = frame2_ptr_hi_tmp[15:0];
989
  `endif
990
`endif
991
 
992
//------------------------------------------------
993
// FRAME2_PTR_LO Register
994
//------------------------------------------------
995
`ifdef WITH_FRAME2_POINTER
996
  reg  [`APIX_LO_MSB:0] frame2_ptr_lo;
997
 
998
  wire                  frame2_ptr_lo_wr = reg_wr[FRAME2_PTR_LO];
999
 
1000
  always @ (posedge mclk or posedge puc_rst)
1001
    if (puc_rst)               frame2_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
1002
    else if (frame2_ptr_lo_wr) frame2_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
1003
 
1004
  `ifdef VRAM_BIGGER_4_KW
1005
  assign      frame2_ptr        = {frame2_ptr_hi[`APIX_HI_MSB:0], frame2_ptr_lo};
1006
  wire [15:0] frame2_ptr_lo_rd  = frame2_ptr_lo;
1007
  `else
1008
  assign      frame2_ptr        = {frame2_ptr_lo[`APIX_LO_MSB:0]};
1009
  wire [16:0] frame2_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame2_ptr_lo};
1010
  wire [15:0] frame2_ptr_lo_rd  = frame2_ptr_lo_tmp[15:0];
1011
  `endif
1012
`endif
1013
 
1014
//------------------------------------------------
1015
// FRAME3_PTR_HI Register
1016
//------------------------------------------------
1017
`ifdef WITH_FRAME3_POINTER
1018
  `ifdef VRAM_BIGGER_4_KW
1019
  reg [`APIX_HI_MSB:0] frame3_ptr_hi;
1020
 
1021
  wire                 frame3_ptr_hi_wr = reg_wr[FRAME3_PTR_HI];
1022
 
1023
  always @ (posedge mclk or posedge puc_rst)
1024
    if (puc_rst)               frame3_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
1025
    else if (frame3_ptr_hi_wr) frame3_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
1026
 
1027
  wire [16:0] frame3_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}},frame3_ptr_hi};
1028
  wire [15:0] frame3_ptr_hi_rd  = frame3_ptr_hi_tmp[15:0];
1029
  `endif
1030
`endif
1031
 
1032
//------------------------------------------------
1033
// FRAME3_PTR_LO Register
1034
//------------------------------------------------
1035
`ifdef WITH_FRAME3_POINTER
1036
  reg  [`APIX_LO_MSB:0] frame3_ptr_lo;
1037
 
1038
  wire                  frame3_ptr_lo_wr = reg_wr[FRAME3_PTR_LO];
1039
 
1040
  always @ (posedge mclk or posedge puc_rst)
1041
    if (puc_rst)               frame3_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
1042
    else if (frame3_ptr_lo_wr) frame3_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
1043
 
1044
  `ifdef VRAM_BIGGER_4_KW
1045
  assign      frame3_ptr        = {frame3_ptr_hi[`APIX_HI_MSB:0], frame3_ptr_lo};
1046
  wire [15:0] frame3_ptr_lo_rd  = frame3_ptr_lo;
1047
  `else
1048
  assign      frame3_ptr        = {frame3_ptr_lo[`APIX_LO_MSB:0]};
1049
  wire [16:0] frame3_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame3_ptr_lo};
1050
  wire [15:0] frame3_ptr_lo_rd  = frame3_ptr_lo_tmp[15:0];
1051
  `endif
1052
`endif
1053
 
1054
//------------------------------------------------
1055
// VID_RAM0 Interface
1056
//------------------------------------------------
1057
wire        [15:0] vid_ram0_cfg;
1058
wire        [15:0] vid_ram0_width;
1059
`ifdef VRAM_BIGGER_4_KW
1060
wire        [15:0] vid_ram0_addr_hi;
1061
`endif
1062
wire        [15:0] vid_ram0_addr_lo;
1063
wire        [15:0] vid_ram0_data;
1064
 
1065
wire               vid_ram0_we;
1066
wire               vid_ram0_ce;
1067
wire        [15:0] vid_ram0_din;
1068
wire [`APIX_MSB:0] vid_ram0_addr_nxt;
1069
wire               vid_ram0_access;
1070
 
1071
ogfx_reg_vram_if ogfx_reg_vram0_if_inst (
1072
 
1073
// OUTPUTs
1074
    .vid_ram_cfg_o           ( vid_ram0_cfg             ),   // VID_RAM0_CFG     Register
1075
    .vid_ram_width_o         ( vid_ram0_width           ),   // VID_RAM0_WIDTH   Register
1076
`ifdef VRAM_BIGGER_4_KW
1077
    .vid_ram_addr_hi_o       ( vid_ram0_addr_hi         ),   // VID_RAM0_ADDR_HI Register
1078
`endif
1079
    .vid_ram_addr_lo_o       ( vid_ram0_addr_lo         ),   // VID_RAM0_ADDR_LO Register
1080
    .vid_ram_data_o          ( vid_ram0_data            ),   // VID_RAM0_DATA    Register
1081
 
1082
    .vid_ram_we_o            ( vid_ram0_we              ),   // Video-RAM Write strobe
1083
    .vid_ram_ce_o            ( vid_ram0_ce              ),   // Video-RAM Chip enable
1084
    .vid_ram_din_o           ( vid_ram0_din             ),   // Video-RAM Data input
1085
    .vid_ram_addr_nxt_o      ( vid_ram0_addr_nxt        ),   // Video-RAM Next address
1086
    .vid_ram_access_o        ( vid_ram0_access          ),   // Video-RAM Access
1087
 
1088
// INPUTs
1089
    .mclk                    ( mclk                     ),   // Main system clock
1090
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1091
 
1092
    .vid_ram_cfg_wr_i        ( reg_wr[VID_RAM0_CFG]     ),   // VID_RAM0_CFG     Write strobe
1093
    .vid_ram_width_wr_i      ( reg_wr[VID_RAM0_WIDTH]   ),   // VID_RAM0_WIDTH   Write strobe
1094
    .vid_ram_addr_hi_wr_i    ( reg_wr[VID_RAM0_ADDR_HI] ),   // VID_RAM0_ADDR_HI Write strobe
1095
    .vid_ram_addr_lo_wr_i    ( reg_wr[VID_RAM0_ADDR_LO] ),   // VID_RAM0_ADDR_LO Write strobe
1096
    .vid_ram_data_wr_i       ( reg_wr[VID_RAM0_DATA]    ),   // VID_RAM0_DATA    Write strobe
1097
    .vid_ram_data_rd_i       ( reg_rd[VID_RAM0_DATA]    ),   // VID_RAM0_DATA    Read  strobe
1098
 
1099
    .dbg_freeze_i            ( dbg_freeze_i             ),   // Freeze auto-increment on read when CPU stopped
1100
    .display_width_i         ( display_width_o          ),   // Display width
1101
    .gfx_mode_1_bpp_i        ( gfx_mode_1_bpp           ),   // Graphic mode  1 bpp resolution
1102
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp           ),   // Graphic mode  2 bpp resolution
1103
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp           ),   // Graphic mode  4 bpp resolution
1104
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp           ),   // Graphic mode  8 bpp resolution
1105
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp          ),   // Graphic mode 16 bpp resolution
1106
 
1107
    .per_din_i               ( per_din_i                ),   // Peripheral data input
1108
    .vid_ram_base_addr_i     ( vid_ram0_base_addr       ),   // Video-RAM base address
1109
    .vid_ram_dout_i          ( vid_ram_dout_i           )    // Video-RAM data input
1110
);
1111
 
1112
//------------------------------------------------
1113
// VID_RAM1 Interface
1114
//------------------------------------------------
1115
wire        [15:0] vid_ram1_cfg;
1116
wire        [15:0] vid_ram1_width;
1117
`ifdef VRAM_BIGGER_4_KW
1118
wire        [15:0] vid_ram1_addr_hi;
1119
`endif
1120
wire        [15:0] vid_ram1_addr_lo;
1121
wire        [15:0] vid_ram1_data;
1122
 
1123
wire               vid_ram1_we;
1124
wire               vid_ram1_ce;
1125
wire        [15:0] vid_ram1_din;
1126
wire [`APIX_MSB:0] vid_ram1_addr_nxt;
1127
wire               vid_ram1_access;
1128
 
1129
ogfx_reg_vram_if ogfx_reg_vram1_if_inst (
1130
 
1131
// OUTPUTs
1132
    .vid_ram_cfg_o           ( vid_ram1_cfg             ),   // VID_RAM1_CFG     Register
1133
    .vid_ram_width_o         ( vid_ram1_width           ),   // VID_RAM1_WIDTH   Register
1134
`ifdef VRAM_BIGGER_4_KW
1135
    .vid_ram_addr_hi_o       ( vid_ram1_addr_hi         ),   // VID_RAM1_ADDR_HI Register
1136
`endif
1137
    .vid_ram_addr_lo_o       ( vid_ram1_addr_lo         ),   // VID_RAM1_ADDR_LO Register
1138
    .vid_ram_data_o          ( vid_ram1_data            ),   // VID_RAM1_DATA    Register
1139
 
1140
    .vid_ram_we_o            ( vid_ram1_we              ),   // Video-RAM Write strobe
1141
    .vid_ram_ce_o            ( vid_ram1_ce              ),   // Video-RAM Chip enable
1142
    .vid_ram_din_o           ( vid_ram1_din             ),   // Video-RAM Data input
1143
    .vid_ram_addr_nxt_o      ( vid_ram1_addr_nxt        ),   // Video-RAM Next address
1144
    .vid_ram_access_o        ( vid_ram1_access          ),   // Video-RAM Access
1145
 
1146
// INPUTs
1147
    .mclk                    ( mclk                     ),   // Main system clock
1148
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1149
 
1150
    .vid_ram_cfg_wr_i        ( reg_wr[VID_RAM1_CFG]     ),   // VID_RAM1_CFG     Write strobe
1151
    .vid_ram_width_wr_i      ( reg_wr[VID_RAM1_WIDTH]   ),   // VID_RAM1_WIDTH   Write strobe
1152
    .vid_ram_addr_hi_wr_i    ( reg_wr[VID_RAM1_ADDR_HI] ),   // VID_RAM1_ADDR_HI Write strobe
1153
    .vid_ram_addr_lo_wr_i    ( reg_wr[VID_RAM1_ADDR_LO] ),   // VID_RAM1_ADDR_LO Write strobe
1154
    .vid_ram_data_wr_i       ( reg_wr[VID_RAM1_DATA]    ),   // VID_RAM1_DATA    Write strobe
1155
    .vid_ram_data_rd_i       ( reg_rd[VID_RAM1_DATA]    ),   // VID_RAM1_DATA    Read  strobe
1156
 
1157
    .dbg_freeze_i            ( dbg_freeze_i             ),   // Freeze auto-increment on read when CPU stopped
1158
    .display_width_i         ( display_width_o          ),   // Display width
1159
    .gfx_mode_1_bpp_i        ( gfx_mode_1_bpp           ),   // Graphic mode  1 bpp resolution
1160
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp           ),   // Graphic mode  2 bpp resolution
1161
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp           ),   // Graphic mode  4 bpp resolution
1162
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp           ),   // Graphic mode  8 bpp resolution
1163
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp          ),   // Graphic mode 16 bpp resolution
1164
 
1165
    .per_din_i               ( per_din_i                ),   // Peripheral data input
1166
    .vid_ram_base_addr_i     ( vid_ram1_base_addr       ),   // Video-RAM base address
1167
    .vid_ram_dout_i          ( vid_ram_dout_i           )    // Video-RAM data input
1168
);
1169
 
1170
//------------------------------------------------
1171
// GPU Interface (GPU_CMD/GPU_STAT) Registers
1172
//------------------------------------------------
1173
 
1174
wire [3:0] gpu_stat_fifo_cnt;
1175 6 olivier.gi
wire [3:0] gpu_stat_fifo_cnt_empty;
1176 3 olivier.gi
wire       gpu_stat_fifo_empty;
1177
wire       gpu_stat_fifo_full;
1178 6 olivier.gi
wire       gpu_stat_fifo_full_less_2;
1179
wire       gpu_stat_fifo_full_less_3;
1180 3 olivier.gi
 
1181
ogfx_reg_fifo ogfx_reg_fifo_gpu_inst (
1182
 
1183
// OUTPUTs
1184
    .fifo_cnt_o              ( gpu_stat_fifo_cnt        ),   // Fifo counter
1185
    .fifo_data_o             ( gpu_data_o               ),   // Read data output
1186
    .fifo_done_evt_o         ( gpu_fifo_done_evt        ),   // Fifo has been emptied
1187
    .fifo_empty_o            ( gpu_stat_fifo_empty      ),   // Fifo is currentely empty
1188 6 olivier.gi
    .fifo_empty_cnt_o        ( gpu_stat_fifo_cnt_empty  ),   // Fifo empty words counter
1189 3 olivier.gi
    .fifo_full_o             ( gpu_stat_fifo_full       ),   // Fifo is currentely full
1190
    .fifo_ovfl_evt_o         ( gpu_fifo_ovfl_evt        ),   // Fifo overflow event
1191
 
1192
// INPUTs
1193
    .mclk                    ( mclk                     ),   // Main system clock
1194
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1195
 
1196
    .fifo_data_i             ( per_din_i                ),   // Read data input
1197
    .fifo_enable_i           ( gpu_enable_o             ),   // Enable fifo (flushed when disabled)
1198
    .fifo_pop_i              ( gpu_get_data_i           ),   // Pop data from the fifo
1199 6 olivier.gi
    .fifo_push_i             ( reg_wr[GPU_CMD_LO] |
1200
                               reg_wr[GPU_CMD_HI]       )    // Push new data to the fifo
1201 3 olivier.gi
);
1202
 
1203
assign      gpu_data_avail_o = ~gpu_stat_fifo_empty;
1204
 
1205 6 olivier.gi
wire        gpu_busy         = ~gpu_stat_fifo_empty | gpu_dma_busy_i;
1206 3 olivier.gi
 
1207 6 olivier.gi
wire [15:0] gpu_stat         = {gpu_busy, 2'b00, gpu_dma_busy_i,
1208
                                2'b00   , gpu_stat_fifo_full, gpu_stat_fifo_empty,
1209
                                gpu_stat_fifo_cnt, gpu_stat_fifo_cnt_empty};
1210 3 olivier.gi
 
1211 6 olivier.gi
 
1212 3 olivier.gi
//============================================================================
1213
// 4) DATA OUTPUT GENERATION
1214
//============================================================================
1215
 
1216
// Data output mux
1217
wire [15:0] gfx_ctrl_read          = gfx_ctrl             & {16{reg_rd[GFX_CTRL          ]}};
1218
wire [15:0] gfx_status_read        = gfx_status           & {16{reg_rd[GFX_STATUS        ]}};
1219
wire [15:0] gfx_irq_read           = gfx_irq              & {16{reg_rd[GFX_IRQ           ]}};
1220
 
1221
wire [15:0] display_width_read     = display_width_rd     & {16{reg_rd[DISPLAY_WIDTH     ]}};
1222
wire [15:0] display_height_read    = display_height_rd    & {16{reg_rd[DISPLAY_HEIGHT    ]}};
1223 6 olivier.gi
wire [15:0] display_size_lo_read   = display_size_lo_rd   & {16{reg_rd[DISPLAY_SIZE_LO   ]}};
1224 3 olivier.gi
`ifdef WITH_DISPLAY_SIZE_HI
1225
wire [15:0] display_size_hi_read   = display_size_hi_rd   & {16{reg_rd[DISPLAY_SIZE_HI   ]}};
1226
`endif
1227
wire [15:0] display_cfg_read       = display_cfg          & {16{reg_rd[DISPLAY_CFG       ]}};
1228
 
1229
wire [15:0] lt24_cfg_read          = lt24_cfg             & {16{reg_rd[LT24_CFG          ]}};
1230
wire [15:0] lt24_refresh_read      = lt24_refresh         & {16{reg_rd[LT24_REFRESH      ]}};
1231
wire [15:0] lt24_refresh_sync_read = lt24_refresh_sync    & {16{reg_rd[LT24_REFRESH_SYNC ]}};
1232
wire [15:0] lt24_cmd_read          = lt24_cmd             & {16{reg_rd[LT24_CMD          ]}};
1233
wire [15:0] lt24_cmd_param_read    = lt24_cmd_param_o     & {16{reg_rd[LT24_CMD_PARAM    ]}};
1234
wire [15:0] lt24_cmd_dfill_read    = lt24_cmd_dfill_o     & {16{reg_rd[LT24_CMD_DFILL    ]}};
1235
wire [15:0] lt24_status_read       = lt24_status          & {16{reg_rd[LT24_STATUS       ]}};
1236
 
1237
wire [15:0] lut_ram_addr_read      = lut_ram_addr_rd      & {16{reg_rd[LUT_RAM_ADDR      ]}};
1238
wire [15:0] lut_ram_data_read      = lut_ram_data         & {16{reg_rd[LUT_RAM_DATA      ]}};
1239
 
1240
wire [15:0] frame_select_read      = frame_select         & {16{reg_rd[FRAME_SELECT      ]}};
1241 6 olivier.gi
wire [15:0] frame0_ptr_lo_read     = frame0_ptr_lo_rd     & {16{reg_rd[FRAME0_PTR_LO     ]}};
1242 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1243
wire [15:0] frame0_ptr_hi_read     = frame0_ptr_hi_rd     & {16{reg_rd[FRAME0_PTR_HI     ]}};
1244
`endif
1245
`ifdef WITH_FRAME1_POINTER
1246 6 olivier.gi
  wire [15:0] frame1_ptr_lo_read   = frame1_ptr_lo_rd     & {16{reg_rd[FRAME1_PTR_LO     ]}};
1247 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1248
  wire [15:0] frame1_ptr_hi_read   = frame1_ptr_hi_rd     & {16{reg_rd[FRAME1_PTR_HI     ]}};
1249
  `endif
1250
`endif
1251
`ifdef WITH_FRAME2_POINTER
1252 6 olivier.gi
  wire [15:0] frame2_ptr_lo_read   = frame2_ptr_lo_rd     & {16{reg_rd[FRAME2_PTR_LO     ]}};
1253 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1254
  wire [15:0] frame2_ptr_hi_read   = frame2_ptr_hi_rd     & {16{reg_rd[FRAME2_PTR_HI     ]}};
1255
  `endif
1256
`endif
1257
`ifdef WITH_FRAME3_POINTER
1258 6 olivier.gi
  wire [15:0] frame3_ptr_lo_read   = frame3_ptr_lo_rd     & {16{reg_rd[FRAME3_PTR_LO     ]}};
1259 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1260
  wire [15:0] frame3_ptr_hi_read   = frame3_ptr_hi_rd     & {16{reg_rd[FRAME3_PTR_HI     ]}};
1261
  `endif
1262
`endif
1263
wire [15:0] vid_ram0_cfg_read      = vid_ram0_cfg         & {16{reg_rd[VID_RAM0_CFG      ]}};
1264
wire [15:0] vid_ram0_width_read    = vid_ram0_width       & {16{reg_rd[VID_RAM0_WIDTH    ]}};
1265 6 olivier.gi
wire [15:0] vid_ram0_addr_lo_read  = vid_ram0_addr_lo     & {16{reg_rd[VID_RAM0_ADDR_LO  ]}};
1266 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1267
wire [15:0] vid_ram0_addr_hi_read  = vid_ram0_addr_hi     & {16{reg_rd[VID_RAM0_ADDR_HI  ]}};
1268
`endif
1269
wire [15:0] vid_ram0_data_read     = vid_ram0_data        & {16{reg_rd[VID_RAM0_DATA     ]}};
1270
 
1271
wire [15:0] vid_ram1_cfg_read      = vid_ram1_cfg         & {16{reg_rd[VID_RAM1_CFG      ]}};
1272
wire [15:0] vid_ram1_width_read    = vid_ram1_width       & {16{reg_rd[VID_RAM1_WIDTH    ]}};
1273 6 olivier.gi
wire [15:0] vid_ram1_addr_lo_read  = vid_ram1_addr_lo     & {16{reg_rd[VID_RAM1_ADDR_LO  ]}};
1274 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1275
wire [15:0] vid_ram1_addr_hi_read  = vid_ram1_addr_hi     & {16{reg_rd[VID_RAM1_ADDR_HI  ]}};
1276
`endif
1277
wire [15:0] vid_ram1_data_read     = vid_ram1_data        & {16{reg_rd[VID_RAM1_DATA     ]}};
1278 6 olivier.gi
wire [15:0] gpu_cmd_lo_read        = 16'h0000             & {16{reg_rd[GPU_CMD_LO        ]}};
1279
wire [15:0] gpu_cmd_hi_read        = 16'h0000             & {16{reg_rd[GPU_CMD_HI        ]}};
1280 3 olivier.gi
wire [15:0] gpu_stat_read          = gpu_stat             & {16{reg_rd[GPU_STAT          ]}};
1281
 
1282
 
1283
wire [15:0] per_dout_o             = gfx_ctrl_read          |
1284
                                     gfx_status_read        |
1285
                                     gfx_irq_read           |
1286
 
1287
                                     display_width_read     |
1288
                                     display_height_read    |
1289 6 olivier.gi
                                     display_size_lo_read   |
1290 3 olivier.gi
                                  `ifdef WITH_DISPLAY_SIZE_HI
1291
                                     display_size_hi_read   |
1292
                                  `endif
1293
                                     display_cfg_read       |
1294
 
1295
                                     lt24_cfg_read          |
1296
                                     lt24_refresh_read      |
1297
                                     lt24_refresh_sync_read |
1298
                                     lt24_cmd_read          |
1299
                                     lt24_cmd_param_read    |
1300
                                     lt24_cmd_dfill_read    |
1301
                                     lt24_status_read       |
1302
 
1303
                                     lut_ram_addr_read      |
1304
                                     lut_ram_data_read      |
1305
 
1306
                                     frame_select_read      |
1307 6 olivier.gi
                                     frame0_ptr_lo_read     |
1308 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1309
                                     frame0_ptr_hi_read     |
1310
                                  `endif
1311
                                `ifdef WITH_FRAME1_POINTER
1312 6 olivier.gi
                                     frame1_ptr_lo_read     |
1313 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1314
                                     frame1_ptr_hi_read     |
1315
                                  `endif
1316
                                `endif
1317
                                `ifdef WITH_FRAME2_POINTER
1318 6 olivier.gi
                                     frame2_ptr_lo_read     |
1319 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1320
                                     frame2_ptr_hi_read     |
1321
                                  `endif
1322
                                `endif
1323
                                `ifdef WITH_FRAME3_POINTER
1324 6 olivier.gi
                                     frame3_ptr_lo_read     |
1325 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1326
                                     frame3_ptr_hi_read     |
1327
                                  `endif
1328
                                `endif
1329
                                     vid_ram0_cfg_read      |
1330
                                     vid_ram0_width_read    |
1331 6 olivier.gi
                                     vid_ram0_addr_lo_read  |
1332 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1333
                                     vid_ram0_addr_hi_read  |
1334
                                  `endif
1335
                                     vid_ram0_data_read     |
1336
 
1337
                                     vid_ram1_cfg_read      |
1338
                                     vid_ram1_width_read    |
1339 6 olivier.gi
                                     vid_ram1_addr_lo_read  |
1340 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1341
                                     vid_ram1_addr_hi_read  |
1342
                                  `endif
1343
                                     vid_ram1_data_read     |
1344 6 olivier.gi
                                     gpu_cmd_lo_read        |
1345
                                     gpu_cmd_hi_read        |
1346 3 olivier.gi
                                     gpu_stat_read;
1347
 
1348
 
1349
//============================================================================
1350
// 5) VIDEO MEMORY INTERFACE
1351
//============================================================================
1352
 
1353
// Write access strobe
1354 6 olivier.gi
assign             vid_ram_wen_o      = ~(vid_ram0_we       | vid_ram1_we      );
1355 3 olivier.gi
 
1356
// Chip enable.
1357 6 olivier.gi
assign             vid_ram_cen_o      = ~(vid_ram0_ce       | vid_ram1_ce      );
1358 3 olivier.gi
 
1359
// Data to be written
1360 6 olivier.gi
assign             vid_ram_din_o      =  (vid_ram0_din      | vid_ram1_din     );
1361 3 olivier.gi
 
1362
// Detect memory accesses for ADDR update
1363 6 olivier.gi
wire               vid_ram_access     =  (vid_ram0_access   | vid_ram1_access  );
1364 3 olivier.gi
 
1365
// Next Address
1366
wire [`APIX_MSB:0] vid_ram_addr_nxt   =  (vid_ram0_addr_nxt | vid_ram1_addr_nxt);
1367
 
1368
// Align according to graphic mode
1369
wire [`VRAM_MSB:0] vid_ram_addr_align = ({`VRAM_AWIDTH{gfx_mode_1_bpp }} & vid_ram_addr_nxt[`APIX_MSB-0:4]) |
1370
                                        ({`VRAM_AWIDTH{gfx_mode_2_bpp }} & vid_ram_addr_nxt[`APIX_MSB-1:3]) |
1371
                                        ({`VRAM_AWIDTH{gfx_mode_4_bpp }} & vid_ram_addr_nxt[`APIX_MSB-2:2]) |
1372
                                        ({`VRAM_AWIDTH{gfx_mode_8_bpp }} & vid_ram_addr_nxt[`APIX_MSB-3:1]) |
1373
                                        ({`VRAM_AWIDTH{gfx_mode_16_bpp}} & vid_ram_addr_nxt[`APIX_MSB-4:0]) ;
1374
 
1375
// Generate Video RAM address
1376
reg [`VRAM_MSB:0] vid_ram_addr_o;
1377
always @ (posedge mclk or posedge puc_rst)
1378
  if (puc_rst)             vid_ram_addr_o <= {`VRAM_AWIDTH{1'b0}};
1379
  else if (vid_ram_access) vid_ram_addr_o <= vid_ram_addr_align;
1380
 
1381
 
1382
endmodule // ogfx_reg
1383
 
1384
`ifdef OGFX_NO_INCLUDE
1385
`else
1386
`include "openGFX430_undefines.v"
1387
`endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.