blob: 2c662a1959ffee24b8662b77ef8bdf43afae3415 [file] [log] [blame]
//----------------------------------------------------------------------------
// Copyright (C) 2015 Authors
//
// This source file may be used and distributed without restriction provided
// that this copyright statement is not removed from the file and that any
// derivative work contains the original copyright notice and the associated
// disclaimer.
//
// This source file is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This source is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
// License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this source; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
//----------------------------------------------------------------------------
//
// *File Name: ogfx_if_lt24.v
//
// *Module Description:
// Interface to the LT24 LCD display.
//
// *Author(s):
// - Olivier Girard, olgirard@gmail.com
//
//----------------------------------------------------------------------------
// $Rev$
// $LastChangedBy$
// $LastChangedDate$
//----------------------------------------------------------------------------
`ifdef OGFX_NO_INCLUDE
`else
`include "openGFX430_defines.v"
`endif
module ogfx_if_lt24 (
// OUTPUTs
event_fsm_done_o, // Event - FSM is done
event_fsm_start_o, // Event - FSM is starting
lt24_cs_n_o, // LT24 Chip select (Active low)
lt24_d_o, // LT24 Data output
lt24_d_en_o, // LT24 Data output enable
lt24_rd_n_o, // LT24 Read strobe (Active low)
lt24_rs_o, // LT24 Command/Param selection (Cmd=0/Param=1)
lt24_wr_n_o, // LT24 Write strobe (Active low)
refresh_active_o, // Display refresh on going
refresh_data_request_o, // Display refresh new data request
status_o, // Status - FSM
// INPUTs
mclk, // Main system clock
puc_rst, // Main system reset
cfg_lt24_clk_div_i, // Clock Divider configuration for LT24 interface
cfg_lt24_display_size_i, // Display size (number of pixels)
cfg_lt24_refresh_i, // Refresh rate configuration for LT24 interface
cfg_lt24_refresh_sync_en_i, // Refresh sync enable configuration for LT24 interface
cfg_lt24_refresh_sync_val_i, // Refresh sync value configuration for LT24 interface
cmd_dfill_i, // Display refresh data
cmd_dfill_trig_i, // Trigger a full display refresh
cmd_generic_cmd_val_i, // Generic command value
cmd_generic_has_param_i, // Generic command to be sent has parameter(s)
cmd_generic_param_val_i, // Generic command parameter value
cmd_generic_trig_i, // Trigger generic command transmit (or new parameter available)
cmd_refresh_i, // Display refresh command
lt24_d_i, // LT24 Data input
refresh_data_i, // Display refresh data
refresh_data_ready_i // Display refresh new data is ready
);
// OUTPUTs
//=========
output event_fsm_done_o; // LT24 FSM done event
output event_fsm_start_o; // LT24 FSM start event
output lt24_cs_n_o; // LT24 Chip select (Active low)
output [15:0] lt24_d_o; // LT24 Data output
output lt24_d_en_o; // LT24 Data output enable
output lt24_rd_n_o; // LT24 Read strobe (Active low)
output lt24_rs_o; // LT24 Command/Param selection (Cmd=0/Param=1)
output lt24_wr_n_o; // LT24 Write strobe (Active low)
output refresh_active_o; // Display refresh on going
output refresh_data_request_o; // Display refresh new data request
output [4:0] status_o; // LT24 FSM Status
// INPUTs
//=========
input mclk; // Main system clock
input puc_rst; // Main system reset
input [2:0] cfg_lt24_clk_div_i; // Clock Divider configuration for LT24 interface
input [`SPIX_MSB:0] cfg_lt24_display_size_i; // Display size (number of pixels)
input [11:0] cfg_lt24_refresh_i; // Refresh rate configuration for LT24 interface
input cfg_lt24_refresh_sync_en_i; // Refresh sync enable configuration for LT24 interface
input [9:0] cfg_lt24_refresh_sync_val_i; // Refresh sync value configuration for LT24 interface
input [15:0] cmd_dfill_i; // Display refresh data
input cmd_dfill_trig_i; // Trigger a full display refresh
input [7:0] cmd_generic_cmd_val_i; // Generic command value
input cmd_generic_has_param_i; // Generic command to be sent has parameter(s)
input [15:0] cmd_generic_param_val_i; // Generic command parameter value
input cmd_generic_trig_i; // Trigger generic command transmit (or new parameter available)
input cmd_refresh_i; // Display refresh command
input [15:0] lt24_d_i; // LT24 Data input
input [15:0] refresh_data_i; // Display refresh data
input refresh_data_ready_i; // Display refresh new data is ready
//=============================================================================
// 1) WIRE, REGISTERS AND PARAMETER DECLARATION
//=============================================================================
// State machine registers
reg [4:0] lt24_state;
reg [4:0] lt24_state_nxt;
// Others
reg refresh_trigger;
wire status_gts_match;
// State definition
parameter STATE_IDLE = 0, // IDLE state
STATE_CMD_LO = 1, // Generic command to LT24
STATE_CMD_HI = 2,
STATE_CMD_PARAM_LO = 3,
STATE_CMD_PARAM_HI = 4,
STATE_CMD_PARAM_WAIT = 5,
STATE_RAMWR_INIT_CMD_LO = 6, // Initialize display buffer with data
STATE_RAMWR_INIT_CMD_HI = 7,
STATE_RAMWR_INIT_DATA_LO = 8,
STATE_RAMWR_INIT_DATA_HI = 9,
STATE_SCANLINE_CMD_LO = 10, // Wait for right scanline
STATE_SCANLINE_CMD_HI = 11,
STATE_SCANLINE_DUMMY_LO = 12,
STATE_SCANLINE_DUMMY_HI = 13,
STATE_SCANLINE_GTS1_LO = 14,
STATE_SCANLINE_GTS1_HI = 15,
STATE_SCANLINE_GTS2_LO = 16,
STATE_SCANLINE_GTS2_HI = 17,
STATE_RAMWR_REFR_CMD_LO = 18, // Refresh display buffer
STATE_RAMWR_REFR_CMD_HI = 19,
STATE_RAMWR_REFR_WAIT = 20,
STATE_RAMWR_REFR_DATA_LO = 21,
STATE_RAMWR_REFR_DATA_HI = 22;
//============================================================================
// 5) STATE MACHINE SENDING IMAGE DATA TO A SPECIFIED DISPLAY
//============================================================================
//--------------------------------
// LT24 Controller Clock Timer
//--------------------------------
reg [3:0] lt24_timer;
wire lt24_timer_done = lt24_d_en_o ? (lt24_timer == {1'b0, cfg_lt24_clk_div_i}) :
(lt24_timer == {cfg_lt24_clk_div_i, 1'b0}) ; // Use slower timing for read accesses
wire lt24_timer_run = (lt24_state != STATE_IDLE) &
(lt24_state != STATE_CMD_PARAM_WAIT) &
(lt24_state != STATE_RAMWR_REFR_WAIT) &
~lt24_timer_done;
wire lt24_timer_init = (lt24_timer_done & // Init if counter reaches limit:
!((lt24_state == STATE_CMD_PARAM_HI) & cmd_generic_has_param_i) & // -> if not moving to STATE_CMD_PARAM_WAIT
!((lt24_state == STATE_CMD_PARAM_WAIT))) | // -> if not in STATE_CMD_PARAM_WAIT
((lt24_state == STATE_CMD_PARAM_WAIT) & (cmd_generic_trig_i | ~cmd_generic_has_param_i)); // Init when leaving the STATE_CMD_PARAM_WAIT state
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_timer <= 4'h0;
else if (lt24_timer_init) lt24_timer <= 4'h0;
else if (lt24_timer_run) lt24_timer <= lt24_timer+4'h1;
//--------------------------------
// Pixel counter
//--------------------------------
reg [`SPIX_MSB:0] lt24_pixel_cnt;
wire lt24_pixel_cnt_run = (lt24_state==STATE_RAMWR_INIT_DATA_HI) |
(lt24_state==STATE_RAMWR_REFR_DATA_HI);
wire lt24_pixel_cnt_done = (lt24_pixel_cnt==1) | (lt24_pixel_cnt==0);
wire lt24_pixel_cnt_init = (lt24_state==STATE_RAMWR_INIT_CMD_HI) |
(lt24_state==STATE_RAMWR_REFR_CMD_HI) |
(lt24_pixel_cnt_done & lt24_pixel_cnt_run);
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_pixel_cnt <= {`SPIX_MSB+1{1'h0}};
else if (lt24_timer_init)
begin
if (lt24_pixel_cnt_init) lt24_pixel_cnt <= cfg_lt24_display_size_i;
else if (lt24_pixel_cnt_run) lt24_pixel_cnt <= lt24_pixel_cnt-{{`SPIX_MSB{1'h0}},1'b1};
end
//--------------------------------
// States Transitions
//--------------------------------
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)
case(lt24_state)
STATE_IDLE : lt24_state_nxt = cmd_dfill_trig_i ? STATE_RAMWR_INIT_CMD_LO :
refresh_trigger ?
(cfg_lt24_refresh_sync_en_i ? STATE_SCANLINE_CMD_LO : STATE_RAMWR_REFR_CMD_LO) :
cmd_generic_trig_i ? STATE_CMD_LO : STATE_IDLE ;
// GENERIC COMMANDS
STATE_CMD_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_CMD_LO : STATE_CMD_HI ;
STATE_CMD_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_CMD_HI :
cmd_generic_has_param_i ? STATE_CMD_PARAM_LO : STATE_IDLE ;
STATE_CMD_PARAM_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_CMD_PARAM_LO : STATE_CMD_PARAM_HI ;
STATE_CMD_PARAM_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_CMD_PARAM_HI :
cmd_generic_has_param_i ? STATE_CMD_PARAM_WAIT : STATE_IDLE ;
STATE_CMD_PARAM_WAIT : lt24_state_nxt = cmd_generic_trig_i ? STATE_CMD_PARAM_LO :
cmd_generic_has_param_i ? STATE_CMD_PARAM_WAIT : STATE_IDLE ;
// MEMORY INITIALIZATION
STATE_RAMWR_INIT_CMD_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_INIT_CMD_LO : STATE_RAMWR_INIT_CMD_HI ;
STATE_RAMWR_INIT_CMD_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_INIT_CMD_HI : STATE_RAMWR_INIT_DATA_LO ;
STATE_RAMWR_INIT_DATA_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_INIT_DATA_LO : STATE_RAMWR_INIT_DATA_HI ;
STATE_RAMWR_INIT_DATA_HI : lt24_state_nxt = lt24_timer_done &
lt24_pixel_cnt_done ? STATE_IDLE :
~lt24_timer_done ? STATE_RAMWR_INIT_DATA_HI : STATE_RAMWR_INIT_DATA_LO ;
// WAIT FOR RIGHT SCANLINE BEFORE REFRESH
STATE_SCANLINE_CMD_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_CMD_LO : STATE_SCANLINE_CMD_HI ;
STATE_SCANLINE_CMD_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_CMD_HI : STATE_SCANLINE_DUMMY_LO ;
STATE_SCANLINE_DUMMY_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_DUMMY_LO : STATE_SCANLINE_DUMMY_HI ;
STATE_SCANLINE_DUMMY_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_DUMMY_HI : STATE_SCANLINE_GTS1_LO ;
STATE_SCANLINE_GTS1_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_GTS1_LO : STATE_SCANLINE_GTS1_HI ;
STATE_SCANLINE_GTS1_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_GTS1_HI : STATE_SCANLINE_GTS2_LO ;
STATE_SCANLINE_GTS2_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_GTS2_LO : STATE_SCANLINE_GTS2_HI ;
STATE_SCANLINE_GTS2_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_SCANLINE_GTS2_HI :
(status_gts_match |
~cfg_lt24_refresh_sync_en_i) ? STATE_RAMWR_REFR_CMD_LO : STATE_SCANLINE_CMD_LO ;
// FRAME REFRESH
STATE_RAMWR_REFR_CMD_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_REFR_CMD_LO : STATE_RAMWR_REFR_CMD_HI ;
STATE_RAMWR_REFR_CMD_HI : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_REFR_CMD_HI :
~refresh_data_request_o ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT ;
STATE_RAMWR_REFR_WAIT : lt24_state_nxt = ~refresh_data_request_o ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT ;
STATE_RAMWR_REFR_DATA_LO : lt24_state_nxt = ~lt24_timer_done ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_DATA_HI ;
STATE_RAMWR_REFR_DATA_HI : lt24_state_nxt = lt24_timer_done &
lt24_pixel_cnt_done ? STATE_IDLE :
~lt24_timer_done ? STATE_RAMWR_REFR_DATA_HI :
~refresh_data_request_o ? STATE_RAMWR_REFR_DATA_LO : STATE_RAMWR_REFR_WAIT ;
// pragma coverage off
default : lt24_state_nxt = STATE_IDLE;
// pragma coverage on
endcase
// State machine
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_state <= STATE_IDLE;
else lt24_state <= lt24_state_nxt;
// Output status
assign status_o[0] = (lt24_state != STATE_IDLE); // LT24 FSM BUSY
assign status_o[1] = (lt24_state == STATE_CMD_PARAM_WAIT); // LT24 Waits for command parameter
assign status_o[2] = (lt24_state == STATE_RAMWR_REFR_CMD_LO) | (lt24_state == STATE_RAMWR_REFR_CMD_HI) | // LT24 REFRESH BUSY
(lt24_state == STATE_RAMWR_REFR_DATA_LO) | (lt24_state == STATE_RAMWR_REFR_DATA_HI) |
(lt24_state == STATE_RAMWR_REFR_WAIT);
assign status_o[3] = (lt24_state == STATE_SCANLINE_CMD_LO) | (lt24_state == STATE_SCANLINE_CMD_HI) | // LT24 WAIT FOR SCANLINE
(lt24_state == STATE_SCANLINE_DUMMY_LO) | (lt24_state == STATE_SCANLINE_DUMMY_HI) |
(lt24_state == STATE_SCANLINE_GTS1_LO) | (lt24_state == STATE_SCANLINE_GTS1_HI) |
(lt24_state == STATE_SCANLINE_GTS2_LO) | (lt24_state == STATE_SCANLINE_GTS2_HI);
assign status_o[4] = (lt24_state == STATE_RAMWR_INIT_CMD_LO) | (lt24_state == STATE_RAMWR_INIT_CMD_HI) | // LT24 INIT BUSY
(lt24_state == STATE_RAMWR_INIT_DATA_LO) | (lt24_state == STATE_RAMWR_INIT_DATA_HI);
assign refresh_active_o = status_o[2];
// Refresh data request
wire refresh_data_request_set = ((lt24_state == STATE_RAMWR_REFR_CMD_LO) & (lt24_state_nxt == STATE_RAMWR_REFR_CMD_HI)) |
((lt24_state == STATE_RAMWR_REFR_DATA_LO) & (lt24_state_nxt == STATE_RAMWR_REFR_DATA_HI)) |
(lt24_state == STATE_RAMWR_REFR_WAIT);
wire refresh_data_request_clr = refresh_data_ready_i;
reg refresh_data_request_reg;
always @(posedge mclk or posedge puc_rst)
if (puc_rst) refresh_data_request_reg <= 1'b0;
else refresh_data_request_reg <= refresh_data_request_clr ? 1'b0 :
refresh_data_request_set ? 1'b1 : refresh_data_request_reg;
assign refresh_data_request_o = refresh_data_request_reg & ~refresh_data_ready_i;
assign event_fsm_start_o = (lt24_state_nxt != STATE_IDLE) & (lt24_state == STATE_IDLE);
assign event_fsm_done_o = (lt24_state != STATE_IDLE) & (lt24_state_nxt == STATE_IDLE);
//============================================================================
// 6) LT24 CONTROLLER OUTPUT ASSIGNMENT
//============================================================================
// LT24 Chip select (active low)
reg lt24_cs_n_o;
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_cs_n_o <= 1'b1;
else lt24_cs_n_o <= (lt24_state_nxt==STATE_IDLE);
// Command (0) or Data (1)
reg lt24_rs_o;
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_rs_o <= 1'b1;
else lt24_rs_o <= ~((lt24_state_nxt==STATE_CMD_LO) | (lt24_state_nxt==STATE_CMD_HI) |
(lt24_state_nxt==STATE_SCANLINE_CMD_LO) | (lt24_state_nxt==STATE_SCANLINE_CMD_HI) |
(lt24_state_nxt==STATE_RAMWR_INIT_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_INIT_CMD_HI) |
(lt24_state_nxt==STATE_RAMWR_REFR_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_REFR_CMD_HI));
// LT24 Write strobe (Active low)
reg lt24_wr_n_o;
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) |
(lt24_state_nxt==STATE_RAMWR_INIT_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_INIT_DATA_LO) |
(lt24_state_nxt==STATE_RAMWR_REFR_CMD_LO) | (lt24_state_nxt==STATE_RAMWR_REFR_DATA_LO);
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_wr_n_o <= 1'b1;
else if (lt24_wr_n_clr) lt24_wr_n_o <= 1'b0;
else lt24_wr_n_o <= 1'b1;
// LT24 Read strobe (active low)
reg lt24_rd_n_o;
wire lt24_rd_n_clr = (lt24_state_nxt==STATE_SCANLINE_DUMMY_LO) |
(lt24_state_nxt==STATE_SCANLINE_GTS1_LO) | (lt24_state_nxt==STATE_SCANLINE_GTS2_LO);
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_rd_n_o <= 1'b1;
else if (lt24_rd_n_clr) lt24_rd_n_o <= 1'b0;
else lt24_rd_n_o <= 1'b1;
// LT24 Data
reg [15:0] lt24_d_nxt;
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)
case(lt24_state_nxt)
STATE_IDLE : lt24_d_nxt = 16'h0000;
STATE_CMD_LO,
STATE_CMD_HI : lt24_d_nxt = {8'h00, cmd_generic_cmd_val_i};
STATE_CMD_PARAM_LO,
STATE_CMD_PARAM_HI : lt24_d_nxt = cmd_generic_param_val_i;
STATE_CMD_PARAM_WAIT : lt24_d_nxt = lt24_d_o;
STATE_RAMWR_INIT_CMD_LO,
STATE_RAMWR_INIT_CMD_HI : lt24_d_nxt = 16'h002C;
STATE_RAMWR_INIT_DATA_LO,
STATE_RAMWR_INIT_DATA_HI : lt24_d_nxt = cmd_dfill_i;
STATE_SCANLINE_CMD_LO,
STATE_SCANLINE_CMD_HI : lt24_d_nxt = 16'h0045;
STATE_RAMWR_REFR_CMD_LO,
STATE_RAMWR_REFR_CMD_HI : lt24_d_nxt = 16'h002C;
STATE_RAMWR_REFR_DATA_LO : lt24_d_nxt = refresh_data_i;
STATE_RAMWR_REFR_DATA_HI : lt24_d_nxt = lt24_d_o;
STATE_RAMWR_REFR_WAIT : lt24_d_nxt = lt24_d_o;
// pragma coverage off
default : lt24_d_nxt = 16'h0000;
// pragma coverage on
endcase
reg [15:0] lt24_d_o;
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_d_o <= 16'h0000;
else lt24_d_o <= lt24_d_nxt;
// Output enable
reg lt24_d_en_o;
always @(posedge mclk or posedge puc_rst)
if (puc_rst) lt24_d_en_o <= 1'h0; // Don't drive output during reset
else lt24_d_en_o <= ~((lt24_state_nxt == STATE_SCANLINE_DUMMY_LO) |
(lt24_state_nxt == STATE_SCANLINE_DUMMY_HI) |
(lt24_state_nxt == STATE_SCANLINE_GTS1_LO ) |
(lt24_state_nxt == STATE_SCANLINE_GTS1_HI ) |
(lt24_state_nxt == STATE_SCANLINE_GTS2_LO ) |
(lt24_state_nxt == STATE_SCANLINE_GTS2_HI ));
//============================================================================
// 7) LT24 GTS VALUE (i.e. CURRENT SCAN LINE)
//============================================================================
reg [1:0] status_gts_msb;
wire status_gts_msb_wr = ((lt24_state == STATE_SCANLINE_GTS1_LO) & (lt24_state_nxt == STATE_SCANLINE_GTS1_HI));
always @(posedge mclk or posedge puc_rst)
if (puc_rst) status_gts_msb <= 2'h0;
else if (status_gts_msb_wr) status_gts_msb <= lt24_d_i[1:0];
reg [7:0] status_gts_lsb;
wire status_gts_lsb_wr = ((lt24_state == STATE_SCANLINE_GTS2_LO) & (lt24_state_nxt == STATE_SCANLINE_GTS2_HI));
always @(posedge mclk or posedge puc_rst)
if (puc_rst) status_gts_lsb <= 8'h00;
else if (status_gts_lsb_wr) status_gts_lsb <= lt24_d_i[7:0];
wire [7:0] unused_lt24_d_15_8 = lt24_d_i[15:8];
wire [9:0] status_gts = {status_gts_msb, status_gts_lsb};
assign status_gts_match = (status_gts == cfg_lt24_refresh_sync_val_i);
//============================================================================
// 8) REFRESH TIMER & TRIGGER
//============================================================================
// Refresh Timer
reg [23:0] refresh_timer;
wire refresh_timer_disable = (cfg_lt24_refresh_i==12'h000) | ~cmd_refresh_i;
wire refresh_timer_done = (refresh_timer[23:12]==cfg_lt24_refresh_i);
always @(posedge mclk or posedge puc_rst)
if (puc_rst) refresh_timer <= 24'h000000;
else if (refresh_timer_disable) refresh_timer <= 24'h000000;
else if (refresh_timer_done) refresh_timer <= 24'h000000;
else refresh_timer <= refresh_timer + 24'h1;
// Refresh Trigger
wire refresh_trigger_set = (lt24_state==STATE_IDLE) & cmd_refresh_i & (refresh_timer==24'h000000);
wire refresh_trigger_clr = (lt24_state==STATE_RAMWR_REFR_CMD_LO);
always @(posedge mclk or posedge puc_rst)
if (puc_rst) refresh_trigger <= 1'b0;
else if (refresh_trigger_set) refresh_trigger <= 1'b1;
else if (refresh_trigger_clr) refresh_trigger <= 1'b0;
endmodule // ogfx_if_lt24
`ifdef OGFX_NO_INCLUDE
`else
`include "openGFX430_undefines.v"
`endif