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

Subversion Repositories opengfx430

[/] [opengfx430/] [trunk/] [core/] [rtl/] [verilog/] [ogfx_reg_vram_if.v] - Diff between revs 3 and 6

Show entire file | Details | Blame | View Log

Rev 3 Rev 6
Line 61... Line 61...
    mclk,                                      // Main system clock
    mclk,                                      // Main system clock
    puc_rst,                                   // Main system reset
    puc_rst,                                   // Main system reset
 
 
    vid_ram_cfg_wr_i,                          // VID_RAMx_CFG     Write strobe
    vid_ram_cfg_wr_i,                          // VID_RAMx_CFG     Write strobe
    vid_ram_width_wr_i,                        // VID_RAMx_WIDTH   Write strobe
    vid_ram_width_wr_i,                        // VID_RAMx_WIDTH   Write strobe
`ifdef VRAM_BIGGER_4_KW
 
    vid_ram_addr_hi_wr_i,                      // VID_RAMx_ADDR_HI Write strobe
    vid_ram_addr_hi_wr_i,                      // VID_RAMx_ADDR_HI Write strobe
`endif
 
    vid_ram_addr_lo_wr_i,                      // VID_RAMx_ADDR_LO Write strobe
    vid_ram_addr_lo_wr_i,                      // VID_RAMx_ADDR_LO Write strobe
    vid_ram_data_wr_i,                         // VID_RAMx_DATA    Write strobe
    vid_ram_data_wr_i,                         // VID_RAMx_DATA    Write strobe
    vid_ram_data_rd_i,                         // VID_RAMx_DATA    Read  strobe
    vid_ram_data_rd_i,                         // VID_RAMx_DATA    Read  strobe
 
 
    dbg_freeze_i,                              // Freeze auto-increment on read when CPU stopped
    dbg_freeze_i,                              // Freeze auto-increment on read when CPU stopped
Line 104... Line 102...
input                mclk;                     // Main system clock
input                mclk;                     // Main system clock
input                puc_rst;                  // Main system reset
input                puc_rst;                  // Main system reset
 
 
input                vid_ram_cfg_wr_i;         // VID_RAMx_CFG     Write strobe
input                vid_ram_cfg_wr_i;         // VID_RAMx_CFG     Write strobe
input                vid_ram_width_wr_i;       // VID_RAMx_WIDTH   Write strobe
input                vid_ram_width_wr_i;       // VID_RAMx_WIDTH   Write strobe
`ifdef VRAM_BIGGER_4_KW
 
input                vid_ram_addr_hi_wr_i;     // VID_RAMx_ADDR_HI Write strobe
input                vid_ram_addr_hi_wr_i;     // VID_RAMx_ADDR_HI Write strobe
`endif
 
input                vid_ram_addr_lo_wr_i;     // VID_RAMx_ADDR_LO Write strobe
input                vid_ram_addr_lo_wr_i;     // VID_RAMx_ADDR_LO Write strobe
input                vid_ram_data_wr_i;        // VID_RAMx_DATA    Write strobe
input                vid_ram_data_wr_i;        // VID_RAMx_DATA    Write strobe
input                vid_ram_data_rd_i;        // VID_RAMx_DATA    Read  strobe
input                vid_ram_data_rd_i;        // VID_RAMx_DATA    Read  strobe
 
 
input                dbg_freeze_i;             // Freeze auto-increment on read when CPU stopped
input                dbg_freeze_i;             // Freeze auto-increment on read when CPU stopped
Line 198... Line 194...
// VID_RAMx_ADDR_HI Register
// VID_RAMx_ADDR_HI Register
//------------------------------------------------
//------------------------------------------------
wire   [`APIX_MSB:0] vid_ram_addr;
wire   [`APIX_MSB:0] vid_ram_addr;
wire   [`APIX_MSB:0] vid_ram_addr_inc;
wire   [`APIX_MSB:0] vid_ram_addr_inc;
wire                 vid_ram_addr_inc_wr;
wire                 vid_ram_addr_inc_wr;
 
reg                  vid_ram_addr_hi_wr_dly;
 
 
`ifdef VRAM_BIGGER_4_KW
`ifdef VRAM_BIGGER_4_KW
reg [`APIX_HI_MSB:0] vid_ram_addr_hi;
reg [`APIX_HI_MSB:0] vid_ram_addr_hi;
 
 
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
Line 215... Line 212...
 
 
//------------------------------------------------
//------------------------------------------------
// VID_RAMx_ADDR_LO Register
// VID_RAMx_ADDR_LO Register
//------------------------------------------------
//------------------------------------------------
reg [`APIX_LO_MSB:0] vid_ram_addr_lo;
reg [`APIX_LO_MSB:0] vid_ram_addr_lo;
reg                  vid_ram_addr_lo_wr_dly;
 
 
 
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
  if (puc_rst)                   vid_ram_addr_lo <=  {`APIX_LO_MSB+1{1'b0}};
  if (puc_rst)                   vid_ram_addr_lo <=  {`APIX_LO_MSB+1{1'b0}};
  else if (vid_ram_addr_lo_wr_i) vid_ram_addr_lo <=  per_din_i[`APIX_LO_MSB:0];
  else if (vid_ram_addr_lo_wr_i) vid_ram_addr_lo <=  per_din_i[`APIX_LO_MSB:0];
  else if (vid_ram_addr_inc_wr)  vid_ram_addr_lo <=  vid_ram_addr_inc[`APIX_LO_MSB:0];
  else if (vid_ram_addr_inc_wr)  vid_ram_addr_lo <=  vid_ram_addr_inc[`APIX_LO_MSB:0];
Line 247... Line 243...
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp_i       ),   // Graphic mode  2 bpp resolution
    .gfx_mode_2_bpp_i        ( gfx_mode_2_bpp_i       ),   // Graphic mode  2 bpp resolution
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp_i       ),   // Graphic mode  4 bpp resolution
    .gfx_mode_4_bpp_i        ( gfx_mode_4_bpp_i       ),   // Graphic mode  4 bpp resolution
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp_i       ),   // Graphic mode  8 bpp resolution
    .gfx_mode_8_bpp_i        ( gfx_mode_8_bpp_i       ),   // Graphic mode  8 bpp resolution
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp_i      ),   // Graphic mode 16 bpp resolution
    .gfx_mode_16_bpp_i       ( gfx_mode_16_bpp_i      ),   // Graphic mode 16 bpp resolution
    .vid_ram_addr_i          ( vid_ram_addr           ),   // Video-RAM address
    .vid_ram_addr_i          ( vid_ram_addr           ),   // Video-RAM address
    .vid_ram_addr_init_i     ( vid_ram_addr_lo_wr_dly ),   // Video-RAM address initialization
    .vid_ram_addr_init_i     ( vid_ram_addr_hi_wr_dly ),   // Video-RAM address initialization
    .vid_ram_addr_step_i     ( vid_ram_addr_inc_wr    ),   // Video-RAM address step
    .vid_ram_addr_step_i     ( vid_ram_addr_inc_wr    ),   // Video-RAM address step
    .vid_ram_width_i         ( vid_ram_width          ),   // Video-RAM width
    .vid_ram_width_i         ( vid_ram_width          ),   // Video-RAM width
    .vid_ram_msk_mode_i      ( vid_ram_msk_mode       ),   // Video-RAM Mask mode enable
    .vid_ram_msk_mode_i      ( vid_ram_msk_mode       ),   // Video-RAM Mask mode enable
    .vid_ram_win_mode_i      ( vid_ram_win_mode       ),   // Video-RAM Windows mode enable
    .vid_ram_win_mode_i      ( vid_ram_win_mode       ),   // Video-RAM Windows mode enable
    .vid_ram_win_x_swap_i    ( vid_ram_win_x_swap     ),   // Video-RAM X-Swap configuration
    .vid_ram_win_x_swap_i    ( vid_ram_win_x_swap     ),   // Video-RAM X-Swap configuration
Line 330... Line 326...
// VID_RAM0: Delay software read and write strobes
// VID_RAM0: Delay software read and write strobes
//--------------------------------------------------
//--------------------------------------------------
 
 
// Strobe writing to VID_RAMx_ADDR_LO register
// Strobe writing to VID_RAMx_ADDR_LO register
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
  if (puc_rst) vid_ram_addr_lo_wr_dly  <= 1'b0;
  if (puc_rst) vid_ram_addr_hi_wr_dly  <= 1'b0;
  else         vid_ram_addr_lo_wr_dly  <= vid_ram_addr_lo_wr_i;
  else         vid_ram_addr_hi_wr_dly  <= vid_ram_addr_hi_wr_i;
 
 
// Strobe reading from VID_RAMx_DATA register
// Strobe reading from VID_RAMx_DATA register
reg        vid_ram_data_rd_dly;
reg        vid_ram_data_rd_dly;
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
  if (puc_rst) vid_ram_data_rd_dly     <= 1'b0;
  if (puc_rst) vid_ram_data_rd_dly     <= 1'b0;
Line 346... Line 342...
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
  if (puc_rst) vid_ram_data_wr_dly     <= 1'b0;
  if (puc_rst) vid_ram_data_wr_dly     <= 1'b0;
  else         vid_ram_data_wr_dly     <= vid_ram_data_wr_i;
  else         vid_ram_data_wr_dly     <= vid_ram_data_wr_i;
 
 
// Trigger read access after a write in MSK mode
// Trigger read access after a write in MSK mode
wire       vid_ram_data_rd_msk   = ((vid_ram_data_wr_dly  | vid_ram_data_rd_dly | vid_ram_addr_lo_wr_i) & vid_ram_msk_mode & ~gfx_mode_16_bpp_i);
wire       vid_ram_data_rd_msk   = ((vid_ram_data_wr_dly  | vid_ram_data_rd_dly | vid_ram_addr_hi_wr_i) & vid_ram_msk_mode & ~gfx_mode_16_bpp_i);
 
 
 
 
//------------------------------------------------
//------------------------------------------------
// Compute VIDEO-RAM Strobes & Data
// Compute VIDEO-RAM Strobes & Data
//------------------------------------------------
//------------------------------------------------
Line 361... Line 357...
 
 
// Chip enable.
// Chip enable.
// Note: we perform a data read access:
// Note: we perform a data read access:
//       - one cycle after a VID_RAM_DATA register read access (so that the address has been incremented)
//       - one cycle after a VID_RAM_DATA register read access (so that the address has been incremented)
//       - one cycle after a VID_RAM_ADDR_LO register write
//       - one cycle after a VID_RAM_ADDR_LO register write
wire   vid_ram_ce_early = (vid_ram_addr_lo_wr_i | vid_ram_data_rd_dly | vid_ram_data_rd_msk | // Read access
wire   vid_ram_ce_early = (vid_ram_addr_hi_wr_i | vid_ram_data_rd_dly | vid_ram_data_rd_msk | // Read access
                           vid_ram_data_wr_i);                                                // Write access
                           vid_ram_data_wr_i);                                                // Write access
 
 
reg [1:0] vid_ram_ce;
reg [1:0] vid_ram_ce;
always @ (posedge mclk or posedge puc_rst)
always @ (posedge mclk or posedge puc_rst)
  if (puc_rst) vid_ram_ce <= 2'b00;
  if (puc_rst) vid_ram_ce <= 2'b00;
Line 384... Line 380...
// Compute VIDEO-RAM Address
// Compute VIDEO-RAM Address
//------------------------------------------------
//------------------------------------------------
 
 
// Mux ram address for early read access when ADDR_LO is updated
// Mux ram address for early read access when ADDR_LO is updated
`ifdef VRAM_BIGGER_4_KW
`ifdef VRAM_BIGGER_4_KW
wire [`APIX_MSB:0] vid_ram_addr_mux    = vid_ram_addr_lo_wr_i ? {vid_ram_addr[`APIX_MSB:16], per_din_i} :
wire [`APIX_MSB:0] vid_ram_addr_mux    = vid_ram_addr_hi_wr_i ? {per_din_i[`APIX_HI_MSB:0], vid_ram_addr[15:0]} :
                                         vid_ram_data_rd_msk  ?  vid_ram_addr_inc                       : vid_ram_addr;
                                         vid_ram_data_rd_msk  ?  vid_ram_addr_inc                       : vid_ram_addr;
`else
`else
wire [`APIX_MSB:0] vid_ram_addr_mux    = vid_ram_addr_lo_wr_i ? {per_din_i[`APIX_LO_MSB:0]}             :
wire [`APIX_MSB:0] vid_ram_addr_mux    = vid_ram_addr_hi_wr_i ? {per_din_i[`APIX_LO_MSB:0]}                     :
                                         vid_ram_data_rd_msk  ?  vid_ram_addr_inc                       : vid_ram_addr;
                                         vid_ram_data_rd_msk  ?  vid_ram_addr_inc                       : vid_ram_addr;
`endif
`endif
 
 
// Add frame pointer offset
// Add frame pointer offset
wire [`APIX_MSB:0] vid_ram_addr_offset = vid_ram_base_addr_i + vid_ram_addr_mux;
wire [`APIX_MSB:0] vid_ram_addr_offset = vid_ram_base_addr_i + vid_ram_addr_mux;
 
 
// Detect memory accesses for ADDR update
// Detect memory accesses for ADDR update
wire               vid_ram_access_o    = vid_ram_data_wr_i | vid_ram_data_rd_dly | vid_ram_addr_lo_wr_i | vid_ram_data_rd_msk;
wire               vid_ram_access_o    = vid_ram_data_wr_i | vid_ram_data_rd_dly | vid_ram_addr_hi_wr_i | vid_ram_data_rd_msk;
 
 
// Mux Address between the two interfaces
// Mux Address between the two interfaces
wire [`APIX_MSB:0] vid_ram_addr_nxt_o  = {`APIX_MSB+1{vid_ram_access_o}} & vid_ram_addr_offset;
wire [`APIX_MSB:0] vid_ram_addr_nxt_o  = {`APIX_MSB+1{vid_ram_access_o}} & vid_ram_addr_offset;
 
 
// Increment the address when accessing the VID_RAMx_DATA register:
// Increment the address when accessing the VID_RAMx_DATA register:
// - one clock cycle after a write access
// - one clock cycle after a write access
// - with the read access (if not in read-modify-write mode)
// - with the read access (if not in read-modify-write mode)
assign             vid_ram_addr_inc_wr = vid_ram_addr_lo_wr_dly | vid_ram_data_wr_dly | (vid_ram_data_rd_i & ~dbg_freeze_i & ~vid_ram_rmw_mode);
assign             vid_ram_addr_inc_wr = vid_ram_addr_hi_wr_dly | vid_ram_data_wr_dly | (vid_ram_data_rd_i & ~dbg_freeze_i & ~vid_ram_rmw_mode);
 
 
// Compute mask for the address LSBs depending on BPP resolution
// Compute mask for the address LSBs depending on BPP resolution
wire         [3:0] gfx_mode_addr_msk   = (        {4{gfx_mode_1_bpp_i}}  | // Take  4 address LSBs in  1bpp mode
wire         [3:0] gfx_mode_addr_msk   = (        {4{gfx_mode_1_bpp_i}}  | // Take  4 address LSBs in  1bpp mode
                                          {1'b0,  {3{gfx_mode_2_bpp_i}}} | // Take  3 address LSBs in  2bpp mode
                                          {1'b0,  {3{gfx_mode_2_bpp_i}}} | // Take  3 address LSBs in  2bpp mode
                                          {2'b00, {2{gfx_mode_4_bpp_i}}} | // Take  2 address LSBs in  4bpp mode
                                          {2'b00, {2{gfx_mode_4_bpp_i}}} | // Take  2 address LSBs in  4bpp mode

powered by: WebSVN 2.1.0

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