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

Subversion Repositories opengfx430

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

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
 
78 11 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 3 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 6 olivier.gi
    gpu_dma_busy_i,                            // GPU DMA execution on going
101 3 olivier.gi
    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 11 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 3 olivier.gi
// OUTPUTs
125 11 olivier.gi
//============
126 3 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 11 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 3 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 11 olivier.gi
//============
178 3 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 6 olivier.gi
input                gpu_dma_busy_i;           // GPU DMA execution on going
182 3 olivier.gi
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 6 olivier.gi
                       DISPLAY_SIZE_LO     = 'h14,
213
                       DISPLAY_SIZE_HI     = 'h16,
214 3 olivier.gi
                       DISPLAY_CFG         = 'h18,
215 8 olivier.gi
                       DISPLAY_REFR_CNT    = 'h1A,
216 3 olivier.gi
 
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 11 olivier.gi
                       LUT_CFG             = 'h30,  // LUT Configuration & Memory Access Gate
226
                       LUT_RAM_ADDR        = 'h32,
227
                       LUT_RAM_DATA        = 'h34,
228 3 olivier.gi
 
229
                       FRAME_SELECT        = 'h3E,  // Frame pointers and selection
230 6 olivier.gi
                       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 3 olivier.gi
 
239
                       VID_RAM0_CFG        = 'h50,  // First Video Memory Access Gate
240
                       VID_RAM0_WIDTH      = 'h52,
241 6 olivier.gi
                       VID_RAM0_ADDR_LO    = 'h54,
242
                       VID_RAM0_ADDR_HI    = 'h56,
243 3 olivier.gi
                       VID_RAM0_DATA       = 'h58,
244
 
245
                       VID_RAM1_CFG        = 'h60,  // Second Video Memory Access Gate
246
                       VID_RAM1_WIDTH      = 'h62,
247 6 olivier.gi
                       VID_RAM1_ADDR_LO    = 'h64,
248
                       VID_RAM1_ADDR_HI    = 'h66,
249 3 olivier.gi
                       VID_RAM1_DATA       = 'h68,
250
 
251 6 olivier.gi
                       GPU_CMD_LO          = 'h70,  // Graphic Processing Unit
252
                       GPU_CMD_HI          = 'h72,
253
                       GPU_STAT            = 'h74;
254 3 olivier.gi
 
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 6 olivier.gi
                       DISPLAY_SIZE_LO_D   = (BASE_REG << DISPLAY_SIZE_LO   ),
268 3 olivier.gi
                       DISPLAY_SIZE_HI_D   = (BASE_REG << DISPLAY_SIZE_HI   ),
269
                       DISPLAY_CFG_D       = (BASE_REG << DISPLAY_CFG       ),
270 8 olivier.gi
                       DISPLAY_REFR_CNT_D  = (BASE_REG << DISPLAY_REFR_CNT  ),
271 3 olivier.gi
 
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 11 olivier.gi
                       LUT_CFG_D           = (BASE_REG << LUT_CFG           ),
281 3 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 6 olivier.gi
                       FRAME0_PTR_LO_D     = (BASE_REG << FRAME0_PTR_LO     ),
286 3 olivier.gi
                       FRAME0_PTR_HI_D     = (BASE_REG << FRAME0_PTR_HI     ),
287 6 olivier.gi
                       FRAME1_PTR_LO_D     = (BASE_REG << FRAME1_PTR_LO     ),
288 3 olivier.gi
                       FRAME1_PTR_HI_D     = (BASE_REG << FRAME1_PTR_HI     ),
289 6 olivier.gi
                       FRAME2_PTR_LO_D     = (BASE_REG << FRAME2_PTR_LO     ),
290 3 olivier.gi
                       FRAME2_PTR_HI_D     = (BASE_REG << FRAME2_PTR_HI     ),
291 6 olivier.gi
                       FRAME3_PTR_LO_D     = (BASE_REG << FRAME3_PTR_LO     ),
292 3 olivier.gi
                       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 6 olivier.gi
                       VID_RAM0_ADDR_LO_D  = (BASE_REG << VID_RAM0_ADDR_LO  ),
297 3 olivier.gi
                       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 6 olivier.gi
                       VID_RAM1_ADDR_LO_D  = (BASE_REG << VID_RAM1_ADDR_LO  ),
303 3 olivier.gi
                       VID_RAM1_ADDR_HI_D  = (BASE_REG << VID_RAM1_ADDR_HI  ),
304
                       VID_RAM1_DATA_D     = (BASE_REG << VID_RAM1_DATA     ),
305
 
306 6 olivier.gi
                       GPU_CMD_LO_D        = (BASE_REG << GPU_CMD_LO        ),
307
                       GPU_CMD_HI_D        = (BASE_REG << GPU_CMD_HI        ),
308 3 olivier.gi
                       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 6 olivier.gi
                                (DISPLAY_SIZE_LO_D   &  {DEC_SZ{(reg_addr == DISPLAY_SIZE_LO   )}})  |
329 3 olivier.gi
                                (DISPLAY_SIZE_HI_D   &  {DEC_SZ{(reg_addr == DISPLAY_SIZE_HI   )}})  |
330
                                (DISPLAY_CFG_D       &  {DEC_SZ{(reg_addr == DISPLAY_CFG       )}})  |
331 8 olivier.gi
                                (DISPLAY_REFR_CNT_D  &  {DEC_SZ{(reg_addr == DISPLAY_REFR_CNT  )}})  |
332 3 olivier.gi
 
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 11 olivier.gi
                                (LUT_CFG_D           &  {DEC_SZ{(reg_addr == LUT_CFG           )}})  |
342 3 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 6 olivier.gi
                                (FRAME0_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME0_PTR_LO     )}})  |
347 3 olivier.gi
                                (FRAME0_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME0_PTR_HI     )}})  |
348 6 olivier.gi
                                (FRAME1_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME1_PTR_LO     )}})  |
349 3 olivier.gi
                                (FRAME1_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME1_PTR_HI     )}})  |
350 6 olivier.gi
                                (FRAME2_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME2_PTR_LO     )}})  |
351 3 olivier.gi
                                (FRAME2_PTR_HI_D     &  {DEC_SZ{(reg_addr == FRAME2_PTR_HI     )}})  |
352 6 olivier.gi
                                (FRAME3_PTR_LO_D     &  {DEC_SZ{(reg_addr == FRAME3_PTR_LO     )}})  |
353 3 olivier.gi
                                (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 6 olivier.gi
                                (VID_RAM0_ADDR_LO_D  &  {DEC_SZ{(reg_addr == VID_RAM0_ADDR_LO  )}})  |
358 3 olivier.gi
                                (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 6 olivier.gi
                                (VID_RAM1_ADDR_LO_D  &  {DEC_SZ{(reg_addr == VID_RAM1_ADDR_LO  )}})  |
364 3 olivier.gi
                                (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 6 olivier.gi
                                (GPU_CMD_LO_D        &  {DEC_SZ{(reg_addr == GPU_CMD_LO        )}})  |
368
                                (GPU_CMD_HI_D        &  {DEC_SZ{(reg_addr == GPU_CMD_HI        )}})  |
369 3 olivier.gi
                                (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 11 olivier.gi
wire               refr_cnt_done_evt;
393 3 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 11 olivier.gi
wire        gfx_irq_refr_cnt_done_en =  gfx_ctrl[2];
416 3 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 11 olivier.gi
wire         gpu_busy;
439 3 olivier.gi
 
440
assign       gfx_status[0]    = lt24_status_i[2]; // Screen Refresh is busy
441 11 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 3 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 11 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 3 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 11 olivier.gi
reg         gfx_irq_refr_cnt_done;
478 3 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 11 olivier.gi
       gfx_irq_refr_cnt_done <=  1'b0;
488 3 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 11 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 3 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 11 olivier.gi
                    (gfx_irq_refr_cnt_done & gfx_irq_refr_cnt_done_en) |
511 3 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 8 olivier.gi
// 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 11 olivier.gi
assign      refr_cnt_done_evt = (display_refr_cnt==16'h0001) & display_refr_cnt_dec;
624
 
625 8 olivier.gi
//------------------------------------------------
626 3 olivier.gi
// 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 11 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 3 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 11 olivier.gi
// LT24_REFRESH_SYNC Register
663 3 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 11 olivier.gi
//------------------------------------------------
734
// LUT_CFG Register
735
//------------------------------------------------
736 3 olivier.gi
 
737 11 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
  `ifdef WITH_EXTRA_LUT_BANK
746
  reg      sw_lut_bank_select_o;
747
  always @ (posedge mclk or posedge puc_rst)
748
    if (puc_rst)         sw_lut_bank_select_o <=  1'b0;
749
    else if (lut_cfg_wr) sw_lut_bank_select_o <=  per_din_i[2];
750
  `else
751
  assign   sw_lut_bank_select_o  =  1'b0;
752
  `endif
753
`else
754
  assign   sw_lut_bank_select_o  =  1'b0;
755
  assign   sw_lut_enable_o       =  1'b0;
756
`endif
757
 
758
reg  [2:0] hw_lut_palette_sel_o;
759
always @ (posedge mclk or posedge puc_rst)
760
  if (puc_rst)           hw_lut_palette_sel_o <=  3'h0;
761
  else if (lut_cfg_wr)   hw_lut_palette_sel_o <=  per_din_i[6:4];
762
 
763
reg  [3:0] hw_lut_bgcolor_o;
764
always @ (posedge mclk or posedge puc_rst)
765
  if (puc_rst)           hw_lut_bgcolor_o     <=  4'h0;
766
  else if (lut_cfg_wr)   hw_lut_bgcolor_o     <=  per_din_i[11:8];
767
 
768
reg  [3:0] hw_lut_fgcolor_o;
769
always @ (posedge mclk or posedge puc_rst)
770
  if (puc_rst)           hw_lut_fgcolor_o     <=  4'hf;
771
  else if (lut_cfg_wr)   hw_lut_fgcolor_o     <=  per_din_i[15:12];
772
 
773
wire [15:0] lut_cfg_rd  = {hw_lut_fgcolor_o, hw_lut_bgcolor_o,
774
                           1'b0,             hw_lut_palette_sel_o,
775
                           1'b0, sw_lut_bank_select_o, 1'b0, sw_lut_enable_o};
776
 
777 3 olivier.gi
//------------------------------------------------
778
// LUT_RAM_ADDR Register
779
//------------------------------------------------
780
`ifdef WITH_PROGRAMMABLE_LUT
781
 
782
reg  [7:0] lut_ram_addr;
783 11 olivier.gi
wire [8:0] lut_ram_addr_inc;
784 3 olivier.gi
wire       lut_ram_addr_inc_wr;
785
 
786
wire       lut_ram_addr_wr = reg_wr[LUT_RAM_ADDR];
787
 
788
always @ (posedge mclk or posedge puc_rst)
789 11 olivier.gi
  if (puc_rst)                  lut_ram_addr    <=  8'h00;
790
  else if (lut_ram_addr_wr)     lut_ram_addr    <=  per_din_i[7:0];
791
  else if (lut_ram_addr_inc_wr) lut_ram_addr    <=  lut_ram_addr_inc[7:0];
792 3 olivier.gi
 
793 11 olivier.gi
`ifdef WITH_EXTRA_LUT_BANK
794
reg        lut_bank_select;
795
always @ (posedge mclk or posedge puc_rst)
796
  if (puc_rst)                  lut_bank_select <=  1'b0;
797
  else if (lut_ram_addr_wr)     lut_bank_select <=  per_din_i[8];
798
  else if (lut_ram_addr_inc_wr) lut_bank_select <=  lut_ram_addr_inc[8];
799
`else
800
wire        lut_bank_select  =  1'b0;
801
`endif
802 3 olivier.gi
 
803 11 olivier.gi
assign      lut_ram_addr_inc =        {lut_bank_select, lut_ram_addr} + 9'h001;
804
wire [15:0] lut_ram_addr_rd  = {7'h00, lut_bank_select, lut_ram_addr};
805 3 olivier.gi
 
806 11 olivier.gi
`ifdef WITH_EXTRA_LUT_BANK
807
assign      lut_ram_addr_o   = {lut_bank_select, lut_ram_addr};
808 3 olivier.gi
`else
809 11 olivier.gi
assign      lut_ram_addr_o   =                   lut_ram_addr;
810 3 olivier.gi
`endif
811
 
812 11 olivier.gi
`else
813
wire [15:0] lut_ram_addr_rd  =  16'h0000;
814
`endif
815
 
816 3 olivier.gi
//------------------------------------------------
817
// LUT_RAM_DATA Register
818
//------------------------------------------------
819
`ifdef WITH_PROGRAMMABLE_LUT
820
 
821
// Update the LUT_RAM_DATA register with regular register write access
822
wire        lut_ram_data_wr  = reg_wr[LUT_RAM_DATA];
823
wire        lut_ram_data_rd  = reg_rd[LUT_RAM_DATA];
824
reg         lut_ram_dout_rdy;
825
 
826
// LUT-RAM data Register
827
reg  [15:0] lut_ram_data;
828
always @ (posedge mclk or posedge puc_rst)
829
  if (puc_rst)               lut_ram_data <=  16'h0000;
830
  else if (lut_ram_data_wr)  lut_ram_data <=  per_din_i;
831
  else if (lut_ram_dout_rdy) lut_ram_data <=  lut_ram_dout_i;
832
 
833
// Increment the address after a write or read access to the LUT_RAM_DATA register
834
assign lut_ram_addr_inc_wr = lut_ram_data_wr | lut_ram_data_rd;
835
 
836
// Apply peripheral data bus % write strobe during VID_RAMx_DATA write access
837
assign lut_ram_din_o       =    per_din_i & {16{lut_ram_data_wr}};
838
assign lut_ram_wen_o       = ~(|per_we_i  &     lut_ram_data_wr);
839
 
840
// Trigger a LUT-RAM read access immediately after:
841
//   - a LUT-RAM_ADDR register write access
842
//   - a LUT-RAM_DATA register read access
843
reg lut_ram_addr_wr_dly;
844
always @ (posedge mclk or posedge puc_rst)
845
  if (puc_rst) lut_ram_addr_wr_dly <= 1'b0;
846
  else         lut_ram_addr_wr_dly <= lut_ram_addr_wr;
847
 
848
reg  lut_ram_data_rd_dly;
849
always @ (posedge mclk or posedge puc_rst)
850
  if (puc_rst) lut_ram_data_rd_dly    <= 1'b0;
851
  else         lut_ram_data_rd_dly    <= lut_ram_data_rd;
852
 
853
// Chip enable.
854
// Note: we perform a data read access:
855
//       - one cycle after a VID_RAM_DATA register read access (so that the address has been incremented)
856
//       - one cycle after a VID_RAM_ADDR register write
857
assign lut_ram_cen_o = ~(lut_ram_addr_wr_dly | lut_ram_data_rd_dly | // Read access
858
                         lut_ram_data_wr);                           // Write access
859
 
860
// Update the VRAM_DATA register one cycle after each memory access
861
always @ (posedge mclk or posedge puc_rst)
862
  if (puc_rst) lut_ram_dout_rdy <= 1'b0;
863
  else         lut_ram_dout_rdy <= ~lut_ram_cen_o;
864
 
865
`else
866
wire [15:0] lut_ram_data  = 16'h0000;
867
`endif
868
 
869
//------------------------------------------------
870
// FRAME_SELECT Register
871
//------------------------------------------------
872
 
873
wire  frame_select_wr = reg_wr[FRAME_SELECT];
874
 
875
`ifdef WITH_FRAME1_POINTER
876
  `ifdef WITH_FRAME2_POINTER
877
  reg  [1:0] refresh_frame_select;
878
  reg  [1:0] vid_ram0_frame_select;
879
  reg  [1:0] vid_ram1_frame_select;
880
 
881
  always @ (posedge mclk or posedge puc_rst)
882
    if (puc_rst)
883
      begin
884
         refresh_frame_select  <= 2'h0;
885
         vid_ram0_frame_select <= 2'h0;
886
         vid_ram1_frame_select <= 2'h0;
887
      end
888
    else if (frame_select_wr)
889
      begin
890
         refresh_frame_select  <= per_din_i[1:0];
891
         vid_ram0_frame_select <= per_din_i[5:4];
892
         vid_ram1_frame_select <= per_din_i[7:6];
893
      end
894
 
895 11 olivier.gi
  wire [15:0] frame_select = {8'h00,       vid_ram1_frame_select,       vid_ram0_frame_select, 2'h0,       refresh_frame_select};
896 3 olivier.gi
  `else
897
  reg        refresh_frame_select;
898
  reg        vid_ram0_frame_select;
899
  reg        vid_ram1_frame_select;
900
 
901
  always @ (posedge mclk or posedge puc_rst)
902
    if (puc_rst)
903
      begin
904
         refresh_frame_select  <= 1'h0;
905
         vid_ram0_frame_select <= 1'h0;
906
         vid_ram1_frame_select <= 1'h0;
907
      end
908
    else if (frame_select_wr)
909
      begin
910
         refresh_frame_select  <= per_din_i[0];
911
         vid_ram0_frame_select <= per_din_i[4];
912
         vid_ram1_frame_select <= per_din_i[6];
913
      end
914
 
915 11 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};
916 3 olivier.gi
  `endif
917
`else
918 11 olivier.gi
  wire [15:0] frame_select = 16'h0000;
919 3 olivier.gi
`endif
920
 
921
// Frame pointer selections
922
`ifdef WITH_FRAME1_POINTER
923
assign refresh_frame_addr_o  = (refresh_frame_select==0)  ? frame0_ptr :
924
                           `ifdef WITH_FRAME2_POINTER
925
                               (refresh_frame_select==1)  ? frame1_ptr :
926
                             `ifdef WITH_FRAME3_POINTER
927
                               (refresh_frame_select==2)  ? frame2_ptr :
928
                                                            frame3_ptr ;
929
                             `else
930
                                                            frame2_ptr ;
931
                             `endif
932
                           `else
933
                                                            frame1_ptr ;
934
                           `endif
935
 
936
assign vid_ram0_base_addr    = (vid_ram0_frame_select==0) ? frame0_ptr :
937
                           `ifdef WITH_FRAME2_POINTER
938
                               (vid_ram0_frame_select==1) ? frame1_ptr :
939
                             `ifdef WITH_FRAME3_POINTER
940
                               (vid_ram0_frame_select==2) ? frame2_ptr :
941
                                                            frame3_ptr ;
942
                             `else
943
                                                            frame2_ptr ;
944
                             `endif
945
                           `else
946
                                                            frame1_ptr ;
947
                           `endif
948
 
949
assign vid_ram1_base_addr    = (vid_ram1_frame_select==0) ? frame0_ptr :
950
                           `ifdef WITH_FRAME2_POINTER
951
                               (vid_ram1_frame_select==1) ? frame1_ptr :
952
                             `ifdef WITH_FRAME3_POINTER
953
                               (vid_ram1_frame_select==2) ? frame2_ptr :
954
                                                            frame3_ptr ;
955
                             `else
956
                                                            frame2_ptr ;
957
                             `endif
958
                           `else
959
                                                            frame1_ptr ;
960
                           `endif
961
 
962
`else
963
assign refresh_frame_addr_o  = frame0_ptr;
964
assign vid_ram0_base_addr    = frame0_ptr;
965
assign vid_ram1_base_addr    = frame0_ptr;
966
`endif
967
 
968
//------------------------------------------------
969
// FRAME0_PTR_HI Register
970
//------------------------------------------------
971
`ifdef VRAM_BIGGER_4_KW
972
reg [`APIX_HI_MSB:0] frame0_ptr_hi;
973
 
974
wire                 frame0_ptr_hi_wr = reg_wr[FRAME0_PTR_HI];
975
 
976
always @ (posedge mclk or posedge puc_rst)
977
  if (puc_rst)               frame0_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
978
  else if (frame0_ptr_hi_wr) frame0_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
979
 
980
wire [16:0] frame0_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame0_ptr_hi};
981
wire [15:0] frame0_ptr_hi_rd  = frame0_ptr_hi_tmp[15:0];
982
`endif
983
 
984
//------------------------------------------------
985
// FRAME0_PTR_LO Register
986
//------------------------------------------------
987
reg  [`APIX_LO_MSB:0] frame0_ptr_lo;
988
 
989
wire                  frame0_ptr_lo_wr = reg_wr[FRAME0_PTR_LO];
990
 
991
always @ (posedge mclk or posedge puc_rst)
992
  if (puc_rst)               frame0_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
993
  else if (frame0_ptr_lo_wr) frame0_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
994
 
995
`ifdef VRAM_BIGGER_4_KW
996
assign      frame0_ptr        = {frame0_ptr_hi[`APIX_HI_MSB:0], frame0_ptr_lo};
997
wire [15:0] frame0_ptr_lo_rd  = frame0_ptr_lo;
998
`else
999
assign      frame0_ptr        = {frame0_ptr_lo[`APIX_LO_MSB:0]};
1000
wire [16:0] frame0_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame0_ptr_lo};
1001
wire [15:0] frame0_ptr_lo_rd  = frame0_ptr_lo_tmp[15:0];
1002
`endif
1003
 
1004
//------------------------------------------------
1005
// FRAME1_PTR_HI Register
1006
//------------------------------------------------
1007
`ifdef WITH_FRAME1_POINTER
1008
  `ifdef VRAM_BIGGER_4_KW
1009
  reg [`APIX_HI_MSB:0] frame1_ptr_hi;
1010
 
1011
  wire                 frame1_ptr_hi_wr = reg_wr[FRAME1_PTR_HI];
1012
 
1013
  always @ (posedge mclk or posedge puc_rst)
1014
    if (puc_rst)               frame1_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
1015
    else if (frame1_ptr_hi_wr) frame1_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
1016
 
1017
  wire [16:0] frame1_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame1_ptr_hi};
1018
  wire [15:0] frame1_ptr_hi_rd  = frame1_ptr_hi_tmp[15:0];
1019
  `endif
1020
`endif
1021
 
1022
//------------------------------------------------
1023
// FRAME1_PTR_LO Register
1024
//------------------------------------------------
1025
`ifdef WITH_FRAME1_POINTER
1026
  reg  [`APIX_LO_MSB:0] frame1_ptr_lo;
1027
 
1028
  wire                  frame1_ptr_lo_wr = reg_wr[FRAME1_PTR_LO];
1029
 
1030
  always @ (posedge mclk or posedge puc_rst)
1031
    if (puc_rst)               frame1_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
1032
    else if (frame1_ptr_lo_wr) frame1_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
1033
 
1034
  `ifdef VRAM_BIGGER_4_KW
1035
  assign      frame1_ptr        = {frame1_ptr_hi[`APIX_HI_MSB:0], frame1_ptr_lo};
1036
  wire [15:0] frame1_ptr_lo_rd  = frame1_ptr_lo;
1037
  `else
1038
  assign      frame1_ptr        = {frame1_ptr_lo[`APIX_LO_MSB:0]};
1039
  wire [16:0] frame1_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame1_ptr_lo};
1040
  wire [15:0] frame1_ptr_lo_rd  = frame1_ptr_lo_tmp[15:0];
1041
  `endif
1042
`endif
1043
 
1044
//------------------------------------------------
1045
// FRAME2_PTR_HI Register
1046
//------------------------------------------------
1047
`ifdef WITH_FRAME2_POINTER
1048
  `ifdef VRAM_BIGGER_4_KW
1049
  reg [`APIX_HI_MSB:0] frame2_ptr_hi;
1050
 
1051
  wire                 frame2_ptr_hi_wr = reg_wr[FRAME2_PTR_HI];
1052
 
1053
  always @ (posedge mclk or posedge puc_rst)
1054
    if (puc_rst)               frame2_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
1055
    else if (frame2_ptr_hi_wr) frame2_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
1056
 
1057
  wire [16:0] frame2_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}}, frame2_ptr_hi};
1058
  wire [15:0] frame2_ptr_hi_rd  = frame2_ptr_hi_tmp[15:0];
1059
  `endif
1060
`endif
1061
 
1062
//------------------------------------------------
1063
// FRAME2_PTR_LO Register
1064
//------------------------------------------------
1065
`ifdef WITH_FRAME2_POINTER
1066
  reg  [`APIX_LO_MSB:0] frame2_ptr_lo;
1067
 
1068
  wire                  frame2_ptr_lo_wr = reg_wr[FRAME2_PTR_LO];
1069
 
1070
  always @ (posedge mclk or posedge puc_rst)
1071
    if (puc_rst)               frame2_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
1072
    else if (frame2_ptr_lo_wr) frame2_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
1073
 
1074
  `ifdef VRAM_BIGGER_4_KW
1075
  assign      frame2_ptr        = {frame2_ptr_hi[`APIX_HI_MSB:0], frame2_ptr_lo};
1076
  wire [15:0] frame2_ptr_lo_rd  = frame2_ptr_lo;
1077
  `else
1078
  assign      frame2_ptr        = {frame2_ptr_lo[`APIX_LO_MSB:0]};
1079
  wire [16:0] frame2_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame2_ptr_lo};
1080
  wire [15:0] frame2_ptr_lo_rd  = frame2_ptr_lo_tmp[15:0];
1081
  `endif
1082
`endif
1083
 
1084
//------------------------------------------------
1085
// FRAME3_PTR_HI Register
1086
//------------------------------------------------
1087
`ifdef WITH_FRAME3_POINTER
1088
  `ifdef VRAM_BIGGER_4_KW
1089
  reg [`APIX_HI_MSB:0] frame3_ptr_hi;
1090
 
1091
  wire                 frame3_ptr_hi_wr = reg_wr[FRAME3_PTR_HI];
1092
 
1093
  always @ (posedge mclk or posedge puc_rst)
1094
    if (puc_rst)               frame3_ptr_hi <=  {`APIX_HI_MSB+1{1'b0}};
1095
    else if (frame3_ptr_hi_wr) frame3_ptr_hi <=  per_din_i[`APIX_HI_MSB:0];
1096
 
1097
  wire [16:0] frame3_ptr_hi_tmp = {{16-`APIX_HI_MSB{1'b0}},frame3_ptr_hi};
1098
  wire [15:0] frame3_ptr_hi_rd  = frame3_ptr_hi_tmp[15:0];
1099
  `endif
1100
`endif
1101
 
1102
//------------------------------------------------
1103
// FRAME3_PTR_LO Register
1104
//------------------------------------------------
1105
`ifdef WITH_FRAME3_POINTER
1106
  reg  [`APIX_LO_MSB:0] frame3_ptr_lo;
1107
 
1108
  wire                  frame3_ptr_lo_wr = reg_wr[FRAME3_PTR_LO];
1109
 
1110
  always @ (posedge mclk or posedge puc_rst)
1111
    if (puc_rst)               frame3_ptr_lo <=  {`APIX_LO_MSB+1{1'b0}};
1112
    else if (frame3_ptr_lo_wr) frame3_ptr_lo <=  per_din_i[`APIX_LO_MSB:0];
1113
 
1114
  `ifdef VRAM_BIGGER_4_KW
1115
  assign      frame3_ptr        = {frame3_ptr_hi[`APIX_HI_MSB:0], frame3_ptr_lo};
1116
  wire [15:0] frame3_ptr_lo_rd  = frame3_ptr_lo;
1117
  `else
1118
  assign      frame3_ptr        = {frame3_ptr_lo[`APIX_LO_MSB:0]};
1119
  wire [16:0] frame3_ptr_lo_tmp = {{16-`APIX_LO_MSB{1'b0}}, frame3_ptr_lo};
1120
  wire [15:0] frame3_ptr_lo_rd  = frame3_ptr_lo_tmp[15:0];
1121
  `endif
1122
`endif
1123
 
1124
//------------------------------------------------
1125
// VID_RAM0 Interface
1126
//------------------------------------------------
1127
wire        [15:0] vid_ram0_cfg;
1128
wire        [15:0] vid_ram0_width;
1129
`ifdef VRAM_BIGGER_4_KW
1130
wire        [15:0] vid_ram0_addr_hi;
1131
`endif
1132
wire        [15:0] vid_ram0_addr_lo;
1133
wire        [15:0] vid_ram0_data;
1134
 
1135
wire               vid_ram0_we;
1136
wire               vid_ram0_ce;
1137
wire        [15:0] vid_ram0_din;
1138
wire [`APIX_MSB:0] vid_ram0_addr_nxt;
1139
wire               vid_ram0_access;
1140
 
1141
ogfx_reg_vram_if ogfx_reg_vram0_if_inst (
1142
 
1143
// OUTPUTs
1144
    .vid_ram_cfg_o           ( vid_ram0_cfg             ),   // VID_RAM0_CFG     Register
1145
    .vid_ram_width_o         ( vid_ram0_width           ),   // VID_RAM0_WIDTH   Register
1146
`ifdef VRAM_BIGGER_4_KW
1147
    .vid_ram_addr_hi_o       ( vid_ram0_addr_hi         ),   // VID_RAM0_ADDR_HI Register
1148
`endif
1149
    .vid_ram_addr_lo_o       ( vid_ram0_addr_lo         ),   // VID_RAM0_ADDR_LO Register
1150
    .vid_ram_data_o          ( vid_ram0_data            ),   // VID_RAM0_DATA    Register
1151
 
1152
    .vid_ram_we_o            ( vid_ram0_we              ),   // Video-RAM Write strobe
1153
    .vid_ram_ce_o            ( vid_ram0_ce              ),   // Video-RAM Chip enable
1154
    .vid_ram_din_o           ( vid_ram0_din             ),   // Video-RAM Data input
1155
    .vid_ram_addr_nxt_o      ( vid_ram0_addr_nxt        ),   // Video-RAM Next address
1156
    .vid_ram_access_o        ( vid_ram0_access          ),   // Video-RAM Access
1157
 
1158
// INPUTs
1159
    .mclk                    ( mclk                     ),   // Main system clock
1160
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1161
 
1162
    .vid_ram_cfg_wr_i        ( reg_wr[VID_RAM0_CFG]     ),   // VID_RAM0_CFG     Write strobe
1163
    .vid_ram_width_wr_i      ( reg_wr[VID_RAM0_WIDTH]   ),   // VID_RAM0_WIDTH   Write strobe
1164
    .vid_ram_addr_hi_wr_i    ( reg_wr[VID_RAM0_ADDR_HI] ),   // VID_RAM0_ADDR_HI Write strobe
1165
    .vid_ram_addr_lo_wr_i    ( reg_wr[VID_RAM0_ADDR_LO] ),   // VID_RAM0_ADDR_LO Write strobe
1166
    .vid_ram_data_wr_i       ( reg_wr[VID_RAM0_DATA]    ),   // VID_RAM0_DATA    Write strobe
1167
    .vid_ram_data_rd_i       ( reg_rd[VID_RAM0_DATA]    ),   // VID_RAM0_DATA    Read  strobe
1168
 
1169
    .dbg_freeze_i            ( dbg_freeze_i             ),   // Freeze auto-increment on read when CPU stopped
1170
    .display_width_i         ( display_width_o          ),   // Display width
1171
    .gfx_mode_1_bpp_i        ( gfx_mode_1_bpp           ),   // Graphic mode  1 bpp resolution
1172
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp           ),   // Graphic mode  2 bpp resolution
1173
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp           ),   // Graphic mode  4 bpp resolution
1174
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp           ),   // Graphic mode  8 bpp resolution
1175
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp          ),   // Graphic mode 16 bpp resolution
1176
 
1177
    .per_din_i               ( per_din_i                ),   // Peripheral data input
1178
    .vid_ram_base_addr_i     ( vid_ram0_base_addr       ),   // Video-RAM base address
1179
    .vid_ram_dout_i          ( vid_ram_dout_i           )    // Video-RAM data input
1180
);
1181
 
1182
//------------------------------------------------
1183
// VID_RAM1 Interface
1184
//------------------------------------------------
1185
wire        [15:0] vid_ram1_cfg;
1186
wire        [15:0] vid_ram1_width;
1187
`ifdef VRAM_BIGGER_4_KW
1188
wire        [15:0] vid_ram1_addr_hi;
1189
`endif
1190
wire        [15:0] vid_ram1_addr_lo;
1191
wire        [15:0] vid_ram1_data;
1192
 
1193
wire               vid_ram1_we;
1194
wire               vid_ram1_ce;
1195
wire        [15:0] vid_ram1_din;
1196
wire [`APIX_MSB:0] vid_ram1_addr_nxt;
1197
wire               vid_ram1_access;
1198
 
1199
ogfx_reg_vram_if ogfx_reg_vram1_if_inst (
1200
 
1201
// OUTPUTs
1202
    .vid_ram_cfg_o           ( vid_ram1_cfg             ),   // VID_RAM1_CFG     Register
1203
    .vid_ram_width_o         ( vid_ram1_width           ),   // VID_RAM1_WIDTH   Register
1204
`ifdef VRAM_BIGGER_4_KW
1205
    .vid_ram_addr_hi_o       ( vid_ram1_addr_hi         ),   // VID_RAM1_ADDR_HI Register
1206
`endif
1207
    .vid_ram_addr_lo_o       ( vid_ram1_addr_lo         ),   // VID_RAM1_ADDR_LO Register
1208
    .vid_ram_data_o          ( vid_ram1_data            ),   // VID_RAM1_DATA    Register
1209
 
1210
    .vid_ram_we_o            ( vid_ram1_we              ),   // Video-RAM Write strobe
1211
    .vid_ram_ce_o            ( vid_ram1_ce              ),   // Video-RAM Chip enable
1212
    .vid_ram_din_o           ( vid_ram1_din             ),   // Video-RAM Data input
1213
    .vid_ram_addr_nxt_o      ( vid_ram1_addr_nxt        ),   // Video-RAM Next address
1214
    .vid_ram_access_o        ( vid_ram1_access          ),   // Video-RAM Access
1215
 
1216
// INPUTs
1217
    .mclk                    ( mclk                     ),   // Main system clock
1218
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1219
 
1220
    .vid_ram_cfg_wr_i        ( reg_wr[VID_RAM1_CFG]     ),   // VID_RAM1_CFG     Write strobe
1221
    .vid_ram_width_wr_i      ( reg_wr[VID_RAM1_WIDTH]   ),   // VID_RAM1_WIDTH   Write strobe
1222
    .vid_ram_addr_hi_wr_i    ( reg_wr[VID_RAM1_ADDR_HI] ),   // VID_RAM1_ADDR_HI Write strobe
1223
    .vid_ram_addr_lo_wr_i    ( reg_wr[VID_RAM1_ADDR_LO] ),   // VID_RAM1_ADDR_LO Write strobe
1224
    .vid_ram_data_wr_i       ( reg_wr[VID_RAM1_DATA]    ),   // VID_RAM1_DATA    Write strobe
1225
    .vid_ram_data_rd_i       ( reg_rd[VID_RAM1_DATA]    ),   // VID_RAM1_DATA    Read  strobe
1226
 
1227
    .dbg_freeze_i            ( dbg_freeze_i             ),   // Freeze auto-increment on read when CPU stopped
1228
    .display_width_i         ( display_width_o          ),   // Display width
1229
    .gfx_mode_1_bpp_i        ( gfx_mode_1_bpp           ),   // Graphic mode  1 bpp resolution
1230
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp           ),   // Graphic mode  2 bpp resolution
1231
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp           ),   // Graphic mode  4 bpp resolution
1232
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp           ),   // Graphic mode  8 bpp resolution
1233
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp          ),   // Graphic mode 16 bpp resolution
1234
 
1235
    .per_din_i               ( per_din_i                ),   // Peripheral data input
1236
    .vid_ram_base_addr_i     ( vid_ram1_base_addr       ),   // Video-RAM base address
1237
    .vid_ram_dout_i          ( vid_ram_dout_i           )    // Video-RAM data input
1238
);
1239
 
1240
//------------------------------------------------
1241
// GPU Interface (GPU_CMD/GPU_STAT) Registers
1242
//------------------------------------------------
1243
 
1244
wire [3:0] gpu_stat_fifo_cnt;
1245 6 olivier.gi
wire [3:0] gpu_stat_fifo_cnt_empty;
1246 3 olivier.gi
wire       gpu_stat_fifo_empty;
1247
wire       gpu_stat_fifo_full;
1248 6 olivier.gi
wire       gpu_stat_fifo_full_less_2;
1249
wire       gpu_stat_fifo_full_less_3;
1250 3 olivier.gi
 
1251
ogfx_reg_fifo ogfx_reg_fifo_gpu_inst (
1252
 
1253
// OUTPUTs
1254
    .fifo_cnt_o              ( gpu_stat_fifo_cnt        ),   // Fifo counter
1255
    .fifo_data_o             ( gpu_data_o               ),   // Read data output
1256
    .fifo_done_evt_o         ( gpu_fifo_done_evt        ),   // Fifo has been emptied
1257
    .fifo_empty_o            ( gpu_stat_fifo_empty      ),   // Fifo is currentely empty
1258 6 olivier.gi
    .fifo_empty_cnt_o        ( gpu_stat_fifo_cnt_empty  ),   // Fifo empty words counter
1259 3 olivier.gi
    .fifo_full_o             ( gpu_stat_fifo_full       ),   // Fifo is currentely full
1260
    .fifo_ovfl_evt_o         ( gpu_fifo_ovfl_evt        ),   // Fifo overflow event
1261
 
1262
// INPUTs
1263
    .mclk                    ( mclk                     ),   // Main system clock
1264
    .puc_rst                 ( puc_rst                  ),   // Main system reset
1265
 
1266
    .fifo_data_i             ( per_din_i                ),   // Read data input
1267
    .fifo_enable_i           ( gpu_enable_o             ),   // Enable fifo (flushed when disabled)
1268
    .fifo_pop_i              ( gpu_get_data_i           ),   // Pop data from the fifo
1269 6 olivier.gi
    .fifo_push_i             ( reg_wr[GPU_CMD_LO] |
1270
                               reg_wr[GPU_CMD_HI]       )    // Push new data to the fifo
1271 3 olivier.gi
);
1272
 
1273
assign      gpu_data_avail_o = ~gpu_stat_fifo_empty;
1274
 
1275 11 olivier.gi
assign      gpu_busy         = ~gpu_stat_fifo_empty | gpu_dma_busy_i;
1276 3 olivier.gi
 
1277 6 olivier.gi
wire [15:0] gpu_stat         = {gpu_busy, 2'b00, gpu_dma_busy_i,
1278
                                2'b00   , gpu_stat_fifo_full, gpu_stat_fifo_empty,
1279
                                gpu_stat_fifo_cnt, gpu_stat_fifo_cnt_empty};
1280 3 olivier.gi
 
1281 6 olivier.gi
 
1282 3 olivier.gi
//============================================================================
1283
// 4) DATA OUTPUT GENERATION
1284
//============================================================================
1285
 
1286
// Data output mux
1287
wire [15:0] gfx_ctrl_read          = gfx_ctrl             & {16{reg_rd[GFX_CTRL          ]}};
1288
wire [15:0] gfx_status_read        = gfx_status           & {16{reg_rd[GFX_STATUS        ]}};
1289
wire [15:0] gfx_irq_read           = gfx_irq              & {16{reg_rd[GFX_IRQ           ]}};
1290
 
1291
wire [15:0] display_width_read     = display_width_rd     & {16{reg_rd[DISPLAY_WIDTH     ]}};
1292
wire [15:0] display_height_read    = display_height_rd    & {16{reg_rd[DISPLAY_HEIGHT    ]}};
1293 6 olivier.gi
wire [15:0] display_size_lo_read   = display_size_lo_rd   & {16{reg_rd[DISPLAY_SIZE_LO   ]}};
1294 3 olivier.gi
`ifdef WITH_DISPLAY_SIZE_HI
1295
wire [15:0] display_size_hi_read   = display_size_hi_rd   & {16{reg_rd[DISPLAY_SIZE_HI   ]}};
1296
`endif
1297
wire [15:0] display_cfg_read       = display_cfg          & {16{reg_rd[DISPLAY_CFG       ]}};
1298 8 olivier.gi
wire [15:0] display_refr_cnt_read  = display_refr_cnt     & {16{reg_rd[DISPLAY_REFR_CNT  ]}};
1299 3 olivier.gi
 
1300
wire [15:0] lt24_cfg_read          = lt24_cfg             & {16{reg_rd[LT24_CFG          ]}};
1301
wire [15:0] lt24_refresh_read      = lt24_refresh         & {16{reg_rd[LT24_REFRESH      ]}};
1302
wire [15:0] lt24_refresh_sync_read = lt24_refresh_sync    & {16{reg_rd[LT24_REFRESH_SYNC ]}};
1303
wire [15:0] lt24_cmd_read          = lt24_cmd             & {16{reg_rd[LT24_CMD          ]}};
1304
wire [15:0] lt24_cmd_param_read    = lt24_cmd_param_o     & {16{reg_rd[LT24_CMD_PARAM    ]}};
1305
wire [15:0] lt24_cmd_dfill_read    = lt24_cmd_dfill_o     & {16{reg_rd[LT24_CMD_DFILL    ]}};
1306
wire [15:0] lt24_status_read       = lt24_status          & {16{reg_rd[LT24_STATUS       ]}};
1307
 
1308 11 olivier.gi
wire [15:0] lut_cfg_read           = lut_cfg_rd           & {16{reg_rd[LUT_CFG           ]}};
1309 3 olivier.gi
wire [15:0] lut_ram_addr_read      = lut_ram_addr_rd      & {16{reg_rd[LUT_RAM_ADDR      ]}};
1310
wire [15:0] lut_ram_data_read      = lut_ram_data         & {16{reg_rd[LUT_RAM_DATA      ]}};
1311
 
1312
wire [15:0] frame_select_read      = frame_select         & {16{reg_rd[FRAME_SELECT      ]}};
1313 6 olivier.gi
wire [15:0] frame0_ptr_lo_read     = frame0_ptr_lo_rd     & {16{reg_rd[FRAME0_PTR_LO     ]}};
1314 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1315
wire [15:0] frame0_ptr_hi_read     = frame0_ptr_hi_rd     & {16{reg_rd[FRAME0_PTR_HI     ]}};
1316
`endif
1317
`ifdef WITH_FRAME1_POINTER
1318 6 olivier.gi
  wire [15:0] frame1_ptr_lo_read   = frame1_ptr_lo_rd     & {16{reg_rd[FRAME1_PTR_LO     ]}};
1319 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1320
  wire [15:0] frame1_ptr_hi_read   = frame1_ptr_hi_rd     & {16{reg_rd[FRAME1_PTR_HI     ]}};
1321
  `endif
1322
`endif
1323
`ifdef WITH_FRAME2_POINTER
1324 6 olivier.gi
  wire [15:0] frame2_ptr_lo_read   = frame2_ptr_lo_rd     & {16{reg_rd[FRAME2_PTR_LO     ]}};
1325 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1326
  wire [15:0] frame2_ptr_hi_read   = frame2_ptr_hi_rd     & {16{reg_rd[FRAME2_PTR_HI     ]}};
1327
  `endif
1328
`endif
1329
`ifdef WITH_FRAME3_POINTER
1330 6 olivier.gi
  wire [15:0] frame3_ptr_lo_read   = frame3_ptr_lo_rd     & {16{reg_rd[FRAME3_PTR_LO     ]}};
1331 3 olivier.gi
  `ifdef VRAM_BIGGER_4_KW
1332
  wire [15:0] frame3_ptr_hi_read   = frame3_ptr_hi_rd     & {16{reg_rd[FRAME3_PTR_HI     ]}};
1333
  `endif
1334
`endif
1335
wire [15:0] vid_ram0_cfg_read      = vid_ram0_cfg         & {16{reg_rd[VID_RAM0_CFG      ]}};
1336
wire [15:0] vid_ram0_width_read    = vid_ram0_width       & {16{reg_rd[VID_RAM0_WIDTH    ]}};
1337 6 olivier.gi
wire [15:0] vid_ram0_addr_lo_read  = vid_ram0_addr_lo     & {16{reg_rd[VID_RAM0_ADDR_LO  ]}};
1338 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1339
wire [15:0] vid_ram0_addr_hi_read  = vid_ram0_addr_hi     & {16{reg_rd[VID_RAM0_ADDR_HI  ]}};
1340
`endif
1341
wire [15:0] vid_ram0_data_read     = vid_ram0_data        & {16{reg_rd[VID_RAM0_DATA     ]}};
1342
 
1343
wire [15:0] vid_ram1_cfg_read      = vid_ram1_cfg         & {16{reg_rd[VID_RAM1_CFG      ]}};
1344
wire [15:0] vid_ram1_width_read    = vid_ram1_width       & {16{reg_rd[VID_RAM1_WIDTH    ]}};
1345 6 olivier.gi
wire [15:0] vid_ram1_addr_lo_read  = vid_ram1_addr_lo     & {16{reg_rd[VID_RAM1_ADDR_LO  ]}};
1346 3 olivier.gi
`ifdef VRAM_BIGGER_4_KW
1347
wire [15:0] vid_ram1_addr_hi_read  = vid_ram1_addr_hi     & {16{reg_rd[VID_RAM1_ADDR_HI  ]}};
1348
`endif
1349
wire [15:0] vid_ram1_data_read     = vid_ram1_data        & {16{reg_rd[VID_RAM1_DATA     ]}};
1350 6 olivier.gi
wire [15:0] gpu_cmd_lo_read        = 16'h0000             & {16{reg_rd[GPU_CMD_LO        ]}};
1351
wire [15:0] gpu_cmd_hi_read        = 16'h0000             & {16{reg_rd[GPU_CMD_HI        ]}};
1352 3 olivier.gi
wire [15:0] gpu_stat_read          = gpu_stat             & {16{reg_rd[GPU_STAT          ]}};
1353
 
1354
 
1355
wire [15:0] per_dout_o             = gfx_ctrl_read          |
1356
                                     gfx_status_read        |
1357
                                     gfx_irq_read           |
1358
 
1359
                                     display_width_read     |
1360
                                     display_height_read    |
1361 6 olivier.gi
                                     display_size_lo_read   |
1362 3 olivier.gi
                                  `ifdef WITH_DISPLAY_SIZE_HI
1363
                                     display_size_hi_read   |
1364
                                  `endif
1365
                                     display_cfg_read       |
1366 8 olivier.gi
                                     display_refr_cnt_read  |
1367 3 olivier.gi
 
1368
                                     lt24_cfg_read          |
1369
                                     lt24_refresh_read      |
1370
                                     lt24_refresh_sync_read |
1371
                                     lt24_cmd_read          |
1372
                                     lt24_cmd_param_read    |
1373
                                     lt24_cmd_dfill_read    |
1374
                                     lt24_status_read       |
1375
 
1376 11 olivier.gi
                                     lut_cfg_read           |
1377 3 olivier.gi
                                     lut_ram_addr_read      |
1378
                                     lut_ram_data_read      |
1379
 
1380
                                     frame_select_read      |
1381 6 olivier.gi
                                     frame0_ptr_lo_read     |
1382 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1383
                                     frame0_ptr_hi_read     |
1384
                                  `endif
1385
                                `ifdef WITH_FRAME1_POINTER
1386 6 olivier.gi
                                     frame1_ptr_lo_read     |
1387 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1388
                                     frame1_ptr_hi_read     |
1389
                                  `endif
1390
                                `endif
1391
                                `ifdef WITH_FRAME2_POINTER
1392 6 olivier.gi
                                     frame2_ptr_lo_read     |
1393 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1394
                                     frame2_ptr_hi_read     |
1395
                                  `endif
1396
                                `endif
1397
                                `ifdef WITH_FRAME3_POINTER
1398 6 olivier.gi
                                     frame3_ptr_lo_read     |
1399 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1400
                                     frame3_ptr_hi_read     |
1401
                                  `endif
1402
                                `endif
1403
                                     vid_ram0_cfg_read      |
1404
                                     vid_ram0_width_read    |
1405 6 olivier.gi
                                     vid_ram0_addr_lo_read  |
1406 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1407
                                     vid_ram0_addr_hi_read  |
1408
                                  `endif
1409
                                     vid_ram0_data_read     |
1410
 
1411
                                     vid_ram1_cfg_read      |
1412
                                     vid_ram1_width_read    |
1413 6 olivier.gi
                                     vid_ram1_addr_lo_read  |
1414 3 olivier.gi
                                  `ifdef VRAM_BIGGER_4_KW
1415
                                     vid_ram1_addr_hi_read  |
1416
                                  `endif
1417
                                     vid_ram1_data_read     |
1418 6 olivier.gi
                                     gpu_cmd_lo_read        |
1419
                                     gpu_cmd_hi_read        |
1420 3 olivier.gi
                                     gpu_stat_read;
1421
 
1422
 
1423
//============================================================================
1424
// 5) VIDEO MEMORY INTERFACE
1425
//============================================================================
1426
 
1427
// Write access strobe
1428 6 olivier.gi
assign             vid_ram_wen_o      = ~(vid_ram0_we       | vid_ram1_we      );
1429 3 olivier.gi
 
1430
// Chip enable.
1431 6 olivier.gi
assign             vid_ram_cen_o      = ~(vid_ram0_ce       | vid_ram1_ce      );
1432 3 olivier.gi
 
1433
// Data to be written
1434 6 olivier.gi
assign             vid_ram_din_o      =  (vid_ram0_din      | vid_ram1_din     );
1435 3 olivier.gi
 
1436
// Detect memory accesses for ADDR update
1437 6 olivier.gi
wire               vid_ram_access     =  (vid_ram0_access   | vid_ram1_access  );
1438 3 olivier.gi
 
1439
// Next Address
1440
wire [`APIX_MSB:0] vid_ram_addr_nxt   =  (vid_ram0_addr_nxt | vid_ram1_addr_nxt);
1441
 
1442
// Align according to graphic mode
1443
wire [`VRAM_MSB:0] vid_ram_addr_align = ({`VRAM_AWIDTH{gfx_mode_1_bpp }} & vid_ram_addr_nxt[`APIX_MSB-0:4]) |
1444
                                        ({`VRAM_AWIDTH{gfx_mode_2_bpp }} & vid_ram_addr_nxt[`APIX_MSB-1:3]) |
1445
                                        ({`VRAM_AWIDTH{gfx_mode_4_bpp }} & vid_ram_addr_nxt[`APIX_MSB-2:2]) |
1446
                                        ({`VRAM_AWIDTH{gfx_mode_8_bpp }} & vid_ram_addr_nxt[`APIX_MSB-3:1]) |
1447
                                        ({`VRAM_AWIDTH{gfx_mode_16_bpp}} & vid_ram_addr_nxt[`APIX_MSB-4:0]) ;
1448
 
1449
// Generate Video RAM address
1450
reg [`VRAM_MSB:0] vid_ram_addr_o;
1451
always @ (posedge mclk or posedge puc_rst)
1452
  if (puc_rst)             vid_ram_addr_o <= {`VRAM_AWIDTH{1'b0}};
1453
  else if (vid_ram_access) vid_ram_addr_o <= vid_ram_addr_align;
1454
 
1455
 
1456
endmodule // ogfx_reg
1457
 
1458
`ifdef OGFX_NO_INCLUDE
1459
`else
1460
`include "openGFX430_undefines.v"
1461
`endif

powered by: WebSVN 2.1.0

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