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
|