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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [fpga/] [altera_de0_nano_soc/] [rtl/] [verilog/] [opengfx430/] [ogfx_reg.v] - Blame information for rev 222

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

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

powered by: WebSVN 2.1.0

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