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

Subversion Repositories openmsp430

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

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_if_lt24.v
26
//
27
// *Module Description:
28
//                      Interface to the LT24 LCD display.
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_if_lt24 (
44
 
45
// OUTPUTs
46
    event_fsm_done_o,                              // Event  - FSM is done
47
    event_fsm_start_o,                             // Event  - FSM is starting
48
 
49
    lt24_cs_n_o,                                   // LT24 Chip select (Active low)
50
    lt24_d_o,                                      // LT24 Data output
51
    lt24_d_en_o,                                   // LT24 Data output enable
52
    lt24_rd_n_o,                                   // LT24 Read strobe (Active low)
53
    lt24_rs_o,                                     // LT24 Command/Param selection (Cmd=0/Param=1)
54
    lt24_wr_n_o,                                   // LT24 Write strobe (Active low)
55
 
56
    refresh_active_o,                              // Display refresh on going
57
    refresh_data_request_o,                        // Display refresh new data request
58
 
59
    status_o,                                      // Status - FSM
60
 
61
// INPUTs
62
    mclk,                                          // Main system clock
63
    puc_rst,                                       // Main system reset
64
 
65
    cfg_lt24_clk_div_i,                            // Clock Divider configuration for LT24 interface
66
    cfg_lt24_display_size_i,                       // Display size (number of pixels)
67
    cfg_lt24_refresh_i,                            // Refresh rate configuration for LT24 interface
68
    cfg_lt24_refresh_sync_en_i,                    // Refresh sync enable configuration for LT24 interface
69
    cfg_lt24_refresh_sync_val_i,                   // Refresh sync value configuration for LT24 interface
70
 
71
    cmd_dfill_i,                                   // Display refresh data
72
    cmd_dfill_trig_i,                              // Trigger a full display refresh
73
 
74
    cmd_generic_cmd_val_i,                         // Generic command value
75
    cmd_generic_has_param_i,                       // Generic command to be sent has parameter(s)
76
    cmd_generic_param_val_i,                       // Generic command parameter value
77
    cmd_generic_trig_i,                            // Trigger generic command transmit (or new parameter available)
78
 
79
    cmd_refresh_i,                                 // Display refresh command
80
 
81
    lt24_d_i,                                      // LT24 Data input
82
 
83
    refresh_data_i,                                // Display refresh data
84
    refresh_data_ready_i                           // Display refresh new data is ready
85
);
86
 
87
// OUTPUTs
88
//=========
89
output              event_fsm_done_o;              // LT24 FSM done event
90
output              event_fsm_start_o;             // LT24 FSM start event
91
 
92
output              lt24_cs_n_o;                   // LT24 Chip select (Active low)
93
output       [15:0] lt24_d_o;                      // LT24 Data output
94
output              lt24_d_en_o;                   // LT24 Data output enable
95
output              lt24_rd_n_o;                   // LT24 Read strobe (Active low)
96
output              lt24_rs_o;                     // LT24 Command/Param selection (Cmd=0/Param=1)
97
output              lt24_wr_n_o;                   // LT24 Write strobe (Active low)
98
 
99
output              refresh_active_o;              // Display refresh on going
100
output              refresh_data_request_o;        // Display refresh new data request
101
 
102
output        [4:0] status_o;                      // LT24 FSM Status
103
 
104
// INPUTs
105
//=========
106
input               mclk;                          // Main system clock
107
input               puc_rst;                       // Main system reset
108
 
109
input         [2:0] cfg_lt24_clk_div_i;            // Clock Divider configuration for LT24 interface
110
input [`SPIX_MSB:0] cfg_lt24_display_size_i;       // Display size (number of pixels)
111
input        [11:0] cfg_lt24_refresh_i;            // Refresh rate configuration for LT24 interface
112
input               cfg_lt24_refresh_sync_en_i;    // Refresh sync enable configuration for LT24 interface
113
input         [9:0] cfg_lt24_refresh_sync_val_i;   // Refresh sync value configuration for LT24 interface
114
 
115
input        [15:0] cmd_dfill_i;                   // Display refresh data
116
input               cmd_dfill_trig_i;              // Trigger a full display refresh
117
 
118
input         [7:0] cmd_generic_cmd_val_i;         // Generic command value
119
input               cmd_generic_has_param_i;       // Generic command to be sent has parameter(s)
120
input        [15:0] cmd_generic_param_val_i;       // Generic command parameter value
121
input               cmd_generic_trig_i;            // Trigger generic command transmit (or new parameter available)
122
 
123
input               cmd_refresh_i;                 // Display refresh command
124
 
125
input        [15:0] lt24_d_i;                      // LT24 Data input
126
 
127
input        [15:0] refresh_data_i;                // Display refresh data
128
input               refresh_data_ready_i;          // Display refresh new data is ready
129
 
130
 
131
//=============================================================================
132
// 1)  WIRE, REGISTERS AND PARAMETER DECLARATION
133
//=============================================================================
134
 
135
// State machine registers
136
reg          [4:0] lt24_state;
137
reg          [4:0] lt24_state_nxt;
138
 
139
// Others
140
reg                refresh_trigger;
141
wire               status_gts_match;
142
 
143
// State definition
144
parameter          STATE_IDLE                =   0,    // IDLE state
145
 
146
                   STATE_CMD_LO              =   1,    // Generic command to LT24
147
                   STATE_CMD_HI              =   2,
148
                   STATE_CMD_PARAM_LO        =   3,
149
                   STATE_CMD_PARAM_HI        =   4,
150
                   STATE_CMD_PARAM_WAIT      =   5,
151
 
152
                   STATE_RAMWR_INIT_CMD_LO   =   6,    // Initialize display buffer with data
153
                   STATE_RAMWR_INIT_CMD_HI   =   7,
154
                   STATE_RAMWR_INIT_DATA_LO  =   8,
155
                   STATE_RAMWR_INIT_DATA_HI  =   9,
156
 
157
                   STATE_SCANLINE_CMD_LO     =  10,    // Wait for right scanline
158
                   STATE_SCANLINE_CMD_HI     =  11,
159
                   STATE_SCANLINE_DUMMY_LO   =  12,
160
                   STATE_SCANLINE_DUMMY_HI   =  13,
161
                   STATE_SCANLINE_GTS1_LO    =  14,
162
                   STATE_SCANLINE_GTS1_HI    =  15,
163
                   STATE_SCANLINE_GTS2_LO    =  16,
164
                   STATE_SCANLINE_GTS2_HI    =  17,
165
 
166
 
167
                   STATE_RAMWR_REFR_CMD_LO   =  18,    // Refresh display buffer
168
                   STATE_RAMWR_REFR_CMD_HI   =  19,
169
                   STATE_RAMWR_REFR_WAIT     =  20,
170
                   STATE_RAMWR_REFR_DATA_LO  =  21,
171
                   STATE_RAMWR_REFR_DATA_HI  =  22;
172
 
173
 
174
//============================================================================
175
// 5) STATE MACHINE SENDING IMAGE DATA TO A SPECIFIED DISPLAY
176
//============================================================================
177
 
178
//--------------------------------
179
// LT24 Controller Clock Timer
180
//--------------------------------
181
reg [3:0] lt24_timer;
182
 
183
wire      lt24_timer_done = lt24_d_en_o ? (lt24_timer == {1'b0, cfg_lt24_clk_div_i}) :
184
                                          (lt24_timer == {cfg_lt24_clk_div_i, 1'b0}) ; // Use slower timing for read accesses
185
 
186
wire      lt24_timer_run  = (lt24_state     != STATE_IDLE)            &
187
                            (lt24_state     != STATE_CMD_PARAM_WAIT)  &
188
                            (lt24_state     != STATE_RAMWR_REFR_WAIT) &
189
                            ~lt24_timer_done;
190
 
191
wire      lt24_timer_init = (lt24_timer_done                          &                                                   // Init if counter reaches limit:
192
                           !((lt24_state    == STATE_CMD_PARAM_HI)    & cmd_generic_has_param_i) &                        //    -> if not moving to STATE_CMD_PARAM_WAIT
193
                           !((lt24_state    == STATE_CMD_PARAM_WAIT)))                           |                        //    -> if not in STATE_CMD_PARAM_WAIT
194
                            ((lt24_state    == STATE_CMD_PARAM_WAIT)  & (cmd_generic_trig_i | ~cmd_generic_has_param_i)); // Init when leaving the STATE_CMD_PARAM_WAIT state
195
 
196
always @(posedge mclk or posedge puc_rst)
197
  if (puc_rst)              lt24_timer <= 4'h0;
198
  else if (lt24_timer_init) lt24_timer <= 4'h0;
199
  else if (lt24_timer_run)  lt24_timer <= lt24_timer+4'h1;
200
 
201
 
202
//--------------------------------
203
// Pixel counter
204
//--------------------------------
205
reg [`SPIX_MSB:0] lt24_pixel_cnt;
206
 
207
wire              lt24_pixel_cnt_run  = (lt24_state==STATE_RAMWR_INIT_DATA_HI) |
208
                                        (lt24_state==STATE_RAMWR_REFR_DATA_HI);
209
 
210
wire              lt24_pixel_cnt_done = (lt24_pixel_cnt==1) | (lt24_pixel_cnt==0);
211
 
212
wire              lt24_pixel_cnt_init = (lt24_state==STATE_RAMWR_INIT_CMD_HI) |
213
                                        (lt24_state==STATE_RAMWR_REFR_CMD_HI) |
214
                                        (lt24_pixel_cnt_done & lt24_pixel_cnt_run);
215
 
216
always @(posedge mclk or posedge puc_rst)
217
  if (puc_rst)                      lt24_pixel_cnt <= {`SPIX_MSB+1{1'h0}};
218
  else if (lt24_timer_init)
219
    begin
220
       if (lt24_pixel_cnt_init)     lt24_pixel_cnt <= cfg_lt24_display_size_i;
221
       else if (lt24_pixel_cnt_run) lt24_pixel_cnt <= lt24_pixel_cnt-{{`SPIX_MSB{1'h0}},1'b1};
222
    end
223
 
224
 
225
//--------------------------------
226
// States Transitions
227
//--------------------------------
228
always @(lt24_state or cmd_dfill_trig_i or cmd_generic_trig_i or refresh_trigger or cfg_lt24_refresh_sync_en_i or status_gts_match or refresh_data_request_o or cmd_generic_has_param_i or lt24_timer_done or lt24_pixel_cnt_done)
229
    case(lt24_state)
230
      STATE_IDLE               :  lt24_state_nxt =  cmd_dfill_trig_i           ? STATE_RAMWR_INIT_CMD_LO  :
231
                                                    refresh_trigger            ?
232
                                                   (cfg_lt24_refresh_sync_en_i ? STATE_SCANLINE_CMD_LO    : STATE_RAMWR_REFR_CMD_LO) :
233
                                                    cmd_generic_trig_i         ? STATE_CMD_LO             : STATE_IDLE               ;
234
 
235
      // GENERIC COMMANDS
236
      STATE_CMD_LO             :  lt24_state_nxt = ~lt24_timer_done            ? STATE_CMD_LO             : STATE_CMD_HI             ;
237
      STATE_CMD_HI             :  lt24_state_nxt = ~lt24_timer_done            ? STATE_CMD_HI             :
238
                                                    cmd_generic_has_param_i    ? STATE_CMD_PARAM_LO       : STATE_IDLE               ;
239
 
240
      STATE_CMD_PARAM_LO       :  lt24_state_nxt = ~lt24_timer_done            ? STATE_CMD_PARAM_LO       : STATE_CMD_PARAM_HI       ;
241
      STATE_CMD_PARAM_HI       :  lt24_state_nxt = ~lt24_timer_done            ? STATE_CMD_PARAM_HI       :
242
                                                    cmd_generic_has_param_i    ? STATE_CMD_PARAM_WAIT     : STATE_IDLE               ;
243
 
244
      STATE_CMD_PARAM_WAIT     :  lt24_state_nxt =  cmd_generic_trig_i         ? STATE_CMD_PARAM_LO       :
245
                                                    cmd_generic_has_param_i    ? STATE_CMD_PARAM_WAIT     : STATE_IDLE               ;
246
 
247
      // MEMORY INITIALIZATION
248
      STATE_RAMWR_INIT_CMD_LO  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_INIT_CMD_LO  : STATE_RAMWR_INIT_CMD_HI  ;
249
      STATE_RAMWR_INIT_CMD_HI  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_INIT_CMD_HI  : STATE_RAMWR_INIT_DATA_LO ;
250
 
251
      STATE_RAMWR_INIT_DATA_LO :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_INIT_DATA_LO : STATE_RAMWR_INIT_DATA_HI ;
252
      STATE_RAMWR_INIT_DATA_HI :  lt24_state_nxt =  lt24_timer_done      &
253
                                                    lt24_pixel_cnt_done        ? STATE_IDLE               :
254
                                                   ~lt24_timer_done            ? STATE_RAMWR_INIT_DATA_HI : STATE_RAMWR_INIT_DATA_LO ;
255
 
256
      // WAIT FOR RIGHT SCANLINE BEFORE REFRESH
257
      STATE_SCANLINE_CMD_LO    :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_CMD_LO    : STATE_SCANLINE_CMD_HI    ;
258
      STATE_SCANLINE_CMD_HI    :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_CMD_HI    : STATE_SCANLINE_DUMMY_LO  ;
259
 
260
      STATE_SCANLINE_DUMMY_LO  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_DUMMY_LO  : STATE_SCANLINE_DUMMY_HI  ;
261
      STATE_SCANLINE_DUMMY_HI  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_DUMMY_HI  : STATE_SCANLINE_GTS1_LO   ;
262
 
263
      STATE_SCANLINE_GTS1_LO   :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_GTS1_LO   : STATE_SCANLINE_GTS1_HI   ;
264
      STATE_SCANLINE_GTS1_HI   :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_GTS1_HI   : STATE_SCANLINE_GTS2_LO   ;
265
 
266
      STATE_SCANLINE_GTS2_LO   :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_GTS2_LO   : STATE_SCANLINE_GTS2_HI   ;
267
      STATE_SCANLINE_GTS2_HI   :  lt24_state_nxt = ~lt24_timer_done            ? STATE_SCANLINE_GTS2_HI   :
268
                                                   (status_gts_match |
269
                                                  ~cfg_lt24_refresh_sync_en_i) ? STATE_RAMWR_REFR_CMD_LO  : STATE_SCANLINE_CMD_LO    ;
270
 
271
      // FRAME REFRESH
272
      STATE_RAMWR_REFR_CMD_LO  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_REFR_CMD_LO  : STATE_RAMWR_REFR_CMD_HI  ;
273
      STATE_RAMWR_REFR_CMD_HI  :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_REFR_CMD_HI  :
274
                                                   ~refresh_data_request_o     ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT    ;
275
 
276
      STATE_RAMWR_REFR_WAIT    :  lt24_state_nxt = ~refresh_data_request_o     ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT    ;
277
 
278
      STATE_RAMWR_REFR_DATA_LO :  lt24_state_nxt = ~lt24_timer_done            ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_DATA_HI ;
279
      STATE_RAMWR_REFR_DATA_HI :  lt24_state_nxt =  lt24_timer_done    &
280
                                                    lt24_pixel_cnt_done        ? STATE_IDLE               :
281
                                                   ~lt24_timer_done            ? STATE_RAMWR_REFR_DATA_HI :
282
                                                   ~refresh_data_request_o     ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT    ;
283
 
284
    // pragma coverage off
285
      default                  :  lt24_state_nxt =  STATE_IDLE;
286
    // pragma coverage on
287
    endcase
288
 
289
// State machine
290
always @(posedge mclk or posedge puc_rst)
291
  if (puc_rst) lt24_state  <= STATE_IDLE;
292
  else         lt24_state  <= lt24_state_nxt;
293
 
294
 
295
// Output status
296
assign   status_o[0]             =  (lt24_state != STATE_IDLE);                                                            // LT24 FSM BUSY
297
 
298
assign   status_o[1]             =  (lt24_state == STATE_CMD_PARAM_WAIT);                                                  // LT24 Waits for command parameter
299
 
300
assign   status_o[2]             =  (lt24_state == STATE_RAMWR_REFR_CMD_LO)  | (lt24_state == STATE_RAMWR_REFR_CMD_HI)  |  // LT24 REFRESH BUSY
301
                                    (lt24_state == STATE_RAMWR_REFR_DATA_LO) | (lt24_state == STATE_RAMWR_REFR_DATA_HI) |
302
                                    (lt24_state == STATE_RAMWR_REFR_WAIT);
303
 
304
assign   status_o[3]             =  (lt24_state == STATE_SCANLINE_CMD_LO)    | (lt24_state == STATE_SCANLINE_CMD_HI)    |  // LT24 WAIT FOR SCANLINE
305
                                    (lt24_state == STATE_SCANLINE_DUMMY_LO)  | (lt24_state == STATE_SCANLINE_DUMMY_HI)  |
306
                                    (lt24_state == STATE_SCANLINE_GTS1_LO)   | (lt24_state == STATE_SCANLINE_GTS1_HI)   |
307
                                    (lt24_state == STATE_SCANLINE_GTS2_LO)   | (lt24_state == STATE_SCANLINE_GTS2_HI);
308
 
309
assign   status_o[4]             =  (lt24_state == STATE_RAMWR_INIT_CMD_LO)  | (lt24_state == STATE_RAMWR_INIT_CMD_HI)  |  // LT24 INIT BUSY
310
                                    (lt24_state == STATE_RAMWR_INIT_DATA_LO) | (lt24_state == STATE_RAMWR_INIT_DATA_HI);
311
 
312
assign   refresh_active_o        =  status_o[2];
313
 
314
 
315
// Refresh data request
316
wire     refresh_data_request_set = ((lt24_state == STATE_RAMWR_REFR_CMD_LO)  & (lt24_state_nxt == STATE_RAMWR_REFR_CMD_HI))  |
317
                                    ((lt24_state == STATE_RAMWR_REFR_DATA_LO) & (lt24_state_nxt == STATE_RAMWR_REFR_DATA_HI)) |
318
                                     (lt24_state == STATE_RAMWR_REFR_WAIT);
319
wire     refresh_data_request_clr = refresh_data_ready_i;
320
reg      refresh_data_request_reg;
321
always @(posedge mclk or posedge puc_rst)
322
  if (puc_rst) refresh_data_request_reg <= 1'b0;
323
  else         refresh_data_request_reg <= refresh_data_request_clr ? 1'b0 :
324
                                         refresh_data_request_set ? 1'b1 : refresh_data_request_reg;
325
 
326
assign   refresh_data_request_o  = refresh_data_request_reg & ~refresh_data_ready_i;
327
 
328
assign   event_fsm_start_o       =  (lt24_state_nxt != STATE_IDLE) & (lt24_state     == STATE_IDLE);
329
assign   event_fsm_done_o        =  (lt24_state     != STATE_IDLE) & (lt24_state_nxt == STATE_IDLE);
330
 
331
 
332
//============================================================================
333
// 6) LT24 CONTROLLER OUTPUT ASSIGNMENT
334
//============================================================================
335
 
336
// LT24 Chip select (active low)
337
reg  lt24_cs_n_o;
338
always @(posedge mclk or posedge puc_rst)
339
  if (puc_rst) lt24_cs_n_o <= 1'b1;
340
  else         lt24_cs_n_o <= (lt24_state_nxt==STATE_IDLE);
341
 
342
// Command (0) or Data (1)
343
reg  lt24_rs_o;
344
always @(posedge mclk or posedge puc_rst)
345
  if (puc_rst) lt24_rs_o   <= 1'b1;
346
  else         lt24_rs_o   <= ~((lt24_state_nxt==STATE_CMD_LO)            | (lt24_state_nxt==STATE_CMD_HI)            |
347
                                (lt24_state_nxt==STATE_SCANLINE_CMD_LO)   | (lt24_state_nxt==STATE_SCANLINE_CMD_HI)   |
348
                                (lt24_state_nxt==STATE_RAMWR_INIT_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_INIT_CMD_HI) |
349
                                (lt24_state_nxt==STATE_RAMWR_REFR_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_REFR_CMD_HI));
350
 
351
// LT24 Write strobe (Active low)
352
reg  lt24_wr_n_o;
353
 
354
wire lt24_wr_n_clr = (lt24_state_nxt==STATE_CMD_LO)            | (lt24_state_nxt==STATE_CMD_PARAM_LO)       | (lt24_state_nxt==STATE_SCANLINE_CMD_LO) |
355
                     (lt24_state_nxt==STATE_RAMWR_INIT_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_INIT_DATA_LO) |
356
                     (lt24_state_nxt==STATE_RAMWR_REFR_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_REFR_DATA_LO);
357
 
358
always @(posedge mclk or posedge puc_rst)
359
  if (puc_rst)              lt24_wr_n_o <= 1'b1;
360
  else if (lt24_wr_n_clr)   lt24_wr_n_o <= 1'b0;
361
  else                      lt24_wr_n_o <= 1'b1;
362
 
363
// LT24 Read strobe (active low)
364
reg  lt24_rd_n_o;
365
 
366
wire lt24_rd_n_clr = (lt24_state_nxt==STATE_SCANLINE_DUMMY_LO) |
367
                     (lt24_state_nxt==STATE_SCANLINE_GTS1_LO)  | (lt24_state_nxt==STATE_SCANLINE_GTS2_LO);
368
 
369
always @(posedge mclk or posedge puc_rst)
370
  if (puc_rst)              lt24_rd_n_o <= 1'b1;
371
  else if (lt24_rd_n_clr)   lt24_rd_n_o <= 1'b0;
372
  else                      lt24_rd_n_o <= 1'b1;
373
 
374
 
375
// LT24 Data
376
reg [15:0] lt24_d_nxt;
377
always @(lt24_state_nxt or cmd_generic_cmd_val_i or cmd_generic_param_val_i or lt24_d_o or cmd_dfill_i or refresh_data_i)
378
  case(lt24_state_nxt)
379
    STATE_IDLE               : lt24_d_nxt = 16'h0000;
380
 
381
    STATE_CMD_LO,
382
    STATE_CMD_HI             : lt24_d_nxt = {8'h00, cmd_generic_cmd_val_i};
383
    STATE_CMD_PARAM_LO,
384
    STATE_CMD_PARAM_HI       : lt24_d_nxt = cmd_generic_param_val_i;
385
    STATE_CMD_PARAM_WAIT     : lt24_d_nxt = lt24_d_o;
386
 
387
    STATE_RAMWR_INIT_CMD_LO,
388
    STATE_RAMWR_INIT_CMD_HI  : lt24_d_nxt = 16'h002C;
389
    STATE_RAMWR_INIT_DATA_LO,
390
    STATE_RAMWR_INIT_DATA_HI : lt24_d_nxt = cmd_dfill_i;
391
 
392
    STATE_SCANLINE_CMD_LO,
393
    STATE_SCANLINE_CMD_HI    : lt24_d_nxt = 16'h0045;
394
 
395
    STATE_RAMWR_REFR_CMD_LO,
396
    STATE_RAMWR_REFR_CMD_HI  : lt24_d_nxt = 16'h002C;
397
    STATE_RAMWR_REFR_DATA_LO : lt24_d_nxt = refresh_data_i;
398
    STATE_RAMWR_REFR_DATA_HI : lt24_d_nxt = lt24_d_o;
399
    STATE_RAMWR_REFR_WAIT    : lt24_d_nxt = lt24_d_o;
400
 
401
    // pragma coverage off
402
    default                  : lt24_d_nxt = 16'h0000;
403
    // pragma coverage on
404
  endcase
405
 
406
reg [15:0] lt24_d_o;
407
always @(posedge mclk or posedge puc_rst)
408
  if (puc_rst) lt24_d_o <= 16'h0000;
409
  else         lt24_d_o <= lt24_d_nxt;
410
 
411
// Output enable
412
reg lt24_d_en_o;
413
always @(posedge mclk or posedge puc_rst)
414
  if (puc_rst) lt24_d_en_o <= 1'h0;       // Don't drive output during reset
415
  else         lt24_d_en_o <= ~((lt24_state_nxt == STATE_SCANLINE_DUMMY_LO) |
416
                                (lt24_state_nxt == STATE_SCANLINE_DUMMY_HI) |
417
                                (lt24_state_nxt == STATE_SCANLINE_GTS1_LO ) |
418
                                (lt24_state_nxt == STATE_SCANLINE_GTS1_HI ) |
419
                                (lt24_state_nxt == STATE_SCANLINE_GTS2_LO ) |
420
                                (lt24_state_nxt == STATE_SCANLINE_GTS2_HI ));
421
 
422
//============================================================================
423
// 7) LT24 GTS VALUE (i.e. CURRENT SCAN LINE)
424
//============================================================================
425
 
426
reg  [1:0] status_gts_msb;
427
wire       status_gts_msb_wr  = ((lt24_state == STATE_SCANLINE_GTS1_LO) & (lt24_state_nxt == STATE_SCANLINE_GTS1_HI));
428
always @(posedge mclk or posedge puc_rst)
429
  if (puc_rst)                status_gts_msb <= 2'h0;
430
  else if (status_gts_msb_wr) status_gts_msb <= lt24_d_i[1:0];
431
 
432
reg  [7:0] status_gts_lsb;
433
wire       status_gts_lsb_wr  = ((lt24_state == STATE_SCANLINE_GTS2_LO) & (lt24_state_nxt == STATE_SCANLINE_GTS2_HI));
434
always @(posedge mclk or posedge puc_rst)
435
  if (puc_rst)                status_gts_lsb <= 8'h00;
436
  else if (status_gts_lsb_wr) status_gts_lsb <= lt24_d_i[7:0];
437
 
438
wire [7:0] unused_lt24_d_15_8 = lt24_d_i[15:8];
439
wire [9:0] status_gts         = {status_gts_msb, status_gts_lsb};
440
 
441
assign     status_gts_match   = (status_gts == cfg_lt24_refresh_sync_val_i);
442
 
443
//============================================================================
444
// 8) REFRESH TIMER & TRIGGER
445
//============================================================================
446
 
447
// Refresh Timer
448
reg [23:0] refresh_timer;
449
wire       refresh_timer_disable = (cfg_lt24_refresh_i==12'h000) | ~cmd_refresh_i;
450
wire       refresh_timer_done    = (refresh_timer[23:12]==cfg_lt24_refresh_i);
451
 
452
always @(posedge mclk or posedge puc_rst)
453
  if (puc_rst)                    refresh_timer <= 24'h000000;
454
  else if (refresh_timer_disable) refresh_timer <= 24'h000000;
455
  else if (refresh_timer_done)    refresh_timer <= 24'h000000;
456
  else                            refresh_timer <= refresh_timer + 24'h1;
457
 
458
// Refresh Trigger
459
wire       refresh_trigger_set = (lt24_state==STATE_IDLE) & cmd_refresh_i & (refresh_timer==24'h000000);
460
wire       refresh_trigger_clr = (lt24_state==STATE_RAMWR_REFR_CMD_LO);
461
 
462
always @(posedge mclk or posedge puc_rst)
463
  if (puc_rst)                  refresh_trigger <= 1'b0;
464
  else if (refresh_trigger_set) refresh_trigger <= 1'b1;
465
  else if (refresh_trigger_clr) refresh_trigger <= 1'b0;
466
 
467
endmodule // ogfx_if_lt24
468
 
469
`ifdef OGFX_NO_INCLUDE
470
`else
471
`include "openGFX430_undefines.v"
472
`endif

powered by: WebSVN 2.1.0

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