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

Subversion Repositories rtftextcontroller

[/] [rtftextcontroller/] [trunk/] [rtl/] [verilog/] [rfTextController.sv] - Diff between revs 31 and 32

Show entire file | Details | Blame | View Log

Rev 31 Rev 32
Line 1... Line 1...
// ============================================================================
// ============================================================================
//        __
//        __
//   \\__/ o\    (C) 2006-2022  Robert Finch, Waterloo
//   \\__/ o\    (C) 2006-2023  Robert Finch, Waterloo
//    \  __ /    All rights reserved.
//    \  __ /    All rights reserved.
//     \/_//     robfinch@finitron.ca
//     \/_//     robfinch@finitron.ca
//       ||
//       ||
//
//
//      rfTextController.sv
//      rfTextController.sv
Line 48... Line 48...
//      horizontal sync pulses.
//      horizontal sync pulses.
//
//
//      The core includes an embedded dual port RAM to hold the screen
//      The core includes an embedded dual port RAM to hold the screen
//      characters.
//      characters.
//
//
//  The controller expects a 128kB memory region to be reserved.
//  The controller expects a 256kB memory region to be reserved.
//
//
//  Memory Map:
//  Memory Map:
//  00000-0FFFF   display ram
//  00000-3FFFF   display ram
//  10000-1FEFF   character bitmap ram
//  40000-7FFFF   character bitmap ram
//  1FF00-1FFFF   controller registers
//  80000-800FF   controller registers
//
//
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Registers
// Registers
//
//
// 00h
// 00h
Line 72... Line 72...
//  15-12                                                          hhhh  pixel size - height
//  15-12                                                          hhhh  pixel size - height
//  21-16              nnnnnn  char width in pixels
//  21-16              nnnnnn  char width in pixels
//  24                      r  reset state bit
//  24                      r  reset state bit
//  32                      e  controller enable
//  32                      e  controller enable
//  40                      m  multi-color mode
//  40                      m  multi-color mode
 
//  41                      a  anti-alias mode
//  48-52               nnnnn  yscroll
//  48-52               nnnnn  yscroll
//  56-60               nnnnn  xscroll
//  56-60               nnnnn  xscroll
// 10h
// 10h
//      30- 0   cccccccc cccccccc  color code for transparent background RGB 4,9,9,9 (only RGB 7,7,7 used)
//      30- 0   cccccccc cccccccc  color code for transparent background RGB 4,9,9,9 (only RGB 7,7,7 used)
//  63-32   cccc...cccc        border color ZRGB 4,9,9,9
//  63-32   cccc...cccc        border color ZRGB 4,9,9,9
Line 98... Line 99...
//  15- 0   aaaaaaaa aaaaaaaa  font address in char bitmap memory
//  15- 0   aaaaaaaa aaaaaaaa  font address in char bitmap memory
//  31-24              dddddd  font ascent
//  31-24              dddddd  font ascent
//  63-32   nnnnnnnn nnnnnnnn  font ram lock "LOCK" or "UNLK"
//  63-32   nnnnnnnn nnnnnnnn  font ram lock "LOCK" or "UNLK"
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//
//
 
// 1209 LUTs / 1003 FFs / 48 BRAMs / 1 DSP
// ============================================================================
// ============================================================================
 
 
//`define USE_CLOCK_GATE
//`define USE_CLOCK_GATE
 
//`define SUPPORT_AAM   1
 
`define TC_RAM_ADDR     32'hEC000001
 
`define TC_CBM_ADDR     32'hEC040001
 
`define TC_REG_ADDR     32'hEC080001
 
 
module rfTextController(
module rfTextController(
        rst_i, clk_i, cs_i,
        rst_i, clk_i, cs_config_i, cs_io_i,
        cti_i, cyc_i, stb_i, ack_o, wr_i, sel_i, adr_i, dat_i, dat_o,
        cti_i, cyc_i, stb_i, ack_o, wr_i, sel_i, adr_i, dat_i, dat_o,
        dot_clk_i, hsync_i, vsync_i, blank_i, border_i, zrgb_i, zrgb_o, xonoff_i
        dot_clk_i, hsync_i, vsync_i, blank_i, border_i, zrgb_i, zrgb_o, xonoff_i
);
);
parameter num = 4'd1;
parameter num = 4'd1;
parameter COLS = 8'd64;
parameter COLS = 8'd64;
parameter ROWS = 8'd32;
parameter ROWS = 8'd32;
parameter BUSWID = 64;
parameter BUSWID = 32;
 
parameter TEXT_CELL_COUNT = 8192;
 
parameter CFG_BUS = 8'd0;
 
parameter CFG_DEVICE = 5'd1;
 
parameter CFG_FUNC = 3'd0;
 
parameter CFG_VENDOR_ID =       16'h0;
 
parameter CFG_DEVICE_ID =       16'h0;
 
parameter CFG_SUBSYSTEM_VENDOR_ID       = 16'h0;
 
parameter CFG_SUBSYSTEM_ID = 16'h0;
 
parameter CFG_ROM_ADDR = 32'hFFFFFFF0;
 
 
// Syscon
// Syscon
input  rst_i;                   // reset
input  rst_i;                   // reset
input  clk_i;                   // clock
input  clk_i;                   // clock
 
 
 
input cs_config_i;
 
input cs_io_i;
 
 
// Slave signals
// Slave signals
input  cs_i;            // circuit select
 
input  [2:0] cti_i;
input  [2:0] cti_i;
input  cyc_i;                           // valid bus cycle
input  cyc_i;                           // valid bus cycle
input  stb_i;       // data strobe
input  stb_i;       // data strobe
output ack_o;                           // data acknowledge
output ack_o;                           // data acknowledge
input  wr_i;                            // write
input  wr_i;                            // write
input  [BUSWID/8-1:0] sel_i;    // byte lane select
input  [BUSWID/8-1:0] sel_i;    // byte lane select
input  [16:0] adr_i;    // address
input  [31:0] adr_i;    // address
input  [BUSWID-1:0] dat_i;                      // data input
input  [BUSWID-1:0] dat_i;                      // data input
output reg [BUSWID-1:0] dat_o;  // data output
output reg [BUSWID-1:0] dat_o;  // data output
 
 
// Video signals
// Video signals
input dot_clk_i;                // video dot clock
input dot_clk_i;                // video dot clock
Line 139... Line 155...
input border_i;                 // border area
input border_i;                 // border area
input [39:0] zrgb_i;            // input pixel stream
input [39:0] zrgb_i;            // input pixel stream
output reg [39:0] zrgb_o;       // output pixel stream
output reg [39:0] zrgb_o;       // output pixel stream
input xonoff_i;
input xonoff_i;
 
 
 
integer n2,n3;
reg controller_enable;
reg controller_enable;
reg [39:0] bkColor40, bkColor40d, bkColor40d2;  // background color
reg [39:0] bkColor40, bkColor40d, bkColor40d2, bkColor40d3;     // background color
reg [39:0] fgColor40, fgColor40d, fgColor40d2;  // foreground color
reg [39:0] fgColor40, fgColor40d, fgColor40d2, fgColor40d3;     // foreground color
 
 
wire [1:0] pix;                         // pixel value from character generator 1=on,0=off
wire [1:0] pix;                         // pixel value from character generator 1=on,0=off
 
 
reg por;
reg por;
wire vclk;
wire vclk;
assign txt_clk_o = vclk;
 
assign txt_we_o = por;
 
assign txt_sel_o = 8'hFF;
 
assign cbm_clk_o = vclk;
 
assign cbm_we_o = 1'b0;
 
assign cbm_sel_o = 8'hFF;
 
 
 
reg [63:0] rego;
reg [63:0] rego;
reg [5:0] yscroll;
reg [5:0] yscroll;
reg [5:0] xscroll;
reg [5:0] xscroll;
reg [11:0] windowTop;
reg [11:0] windowTop;
Line 178... Line 189...
reg [ 2:0] rBlink;
reg [ 2:0] rBlink;
reg [31:0] bdrColor;            // Border color
reg [31:0] bdrColor;            // Border color
reg [ 3:0] pixelWidth;  // horizontal pixel width in clock cycles
reg [ 3:0] pixelWidth;  // horizontal pixel width in clock cycles
reg [ 3:0] pixelHeight; // vertical pixel height in scan lines
reg [ 3:0] pixelHeight; // vertical pixel height in scan lines
reg mcm;                                                                // multi-color mode
reg mcm;                                                                // multi-color mode
 
reg aam;                                                                // anti-alias mode
 
 
wire [11:0] hctr;               // horizontal reference counter (counts clocks since hSync)
wire [11:0] hctr;               // horizontal reference counter (counts clocks since hSync)
wire [11:0] scanline;   // scan line
wire [11:0] scanline;   // scan line
reg [ 7:0] row;         // vertical reference counter (counts rows since vSync)
reg [ 7:0] row;         // vertical reference counter (counts rows since vSync)
reg [ 7:0] col;         // horizontal column
reg [ 7:0] col;         // horizontal column
Line 210... Line 222...
reg [30:0] tileColor2;
reg [30:0] tileColor2;
reg  bgt, bgtd, bgtd2;
reg  bgt, bgtd, bgtd2;
 
 
wire [63:0] tdat_o;
wire [63:0] tdat_o;
wire [63:0] chdat_o;
wire [63:0] chdat_o;
 
reg [63:0] cfg_dat [0:31];
 
reg [63:0] cfg_out;
 
 
 
function [63:0] fnRbo;
 
input n;
 
input [63:0] i;
 
        fnRbo = n ? {i[7:0],i[15:8],i[23:16],i[31:24],i[39:32],i[47:40],i[55:48],i[63:56]} : i;
 
endfunction
 
 
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// bus interfacing
// bus interfacing
// Address Decoding
// Address Decoding
// I/O range Dx
// I/O range Dx
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Register the inputs
// Register the inputs
 
reg cs_config;
reg cs_rom, cs_reg, cs_text, cs_any;
reg cs_rom, cs_reg, cs_text, cs_any;
reg [16:0] radr_i;
reg cs_rom1, cs_reg1, cs_text1;
 
reg cs_tc;
 
reg [17:0] radr_i;
reg [63:0] rdat_i;
reg [63:0] rdat_i;
reg rwr_i;
reg rwr_i;
reg [7:0] rsel_i;
reg [7:0] rsel_i;
reg [7:0] wrs_i;
reg [7:0] wrs_i;
 
reg [31:0] tc_ram_addr;
 
reg [31:0] tc_cbm_addr;
 
reg [31:0] tc_reg_addr;
 
 
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        cs_rom <= cs_i && cyc_i && stb_i && (adr_i[16:8] >= 9'h100 && adr_i[16:8] < 9'h1FF);
        cs_any <= cyc_i & stb_i & cs_io_i;
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        cs_reg <= cs_i && cyc_i && stb_i && (adr_i[16:8] == 9'h1FF);
        cs_config <= cyc_i & stb_i & cs_config_i && adr_i[27:20]==CFG_BUS && adr_i[19:15]==CFG_DEVICE && adr_i[14:12]==CFG_FUNC;
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        cs_text <= cs_i && cyc_i && stb_i && (adr_i[16:8] < 9'h100);
        cs_rom1 <= adr_i[31:18] == tc_cbm_addr[31:18];
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        cs_any <= cs_i && cyc_i && stb_i;
        cs_reg1 <= adr_i[31: 8] == tc_reg_addr[31: 8];
 
always_ff @(posedge clk_i)
 
        cs_text1 <= adr_i[31:18] == tc_ram_addr[31:18];
 
always_comb
 
        cs_rom <= cs_rom1 && cs_any;
 
always_comb
 
        cs_reg <= cs_reg1 && cs_any;
 
always_comb
 
        cs_text <= cs_text1 && cs_any;
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        wrs_i <= BUSWID==64 ? {8{wr_i}} & sel_i :
        wrs_i <= (BUSWID==64) ? {8{wr_i}} & sel_i :
                adr_i[2] ? {{4{wr_i}} & sel_i,4'h0} : {4'h0,{4{wr_i}} & sel_i};
                adr_i[2] ? {{4{wr_i}} & sel_i,4'h0} : {4'h0,{4{wr_i}} & sel_i};
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        rwr_i <= wr_i;
        rwr_i <= wr_i;
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        rsel_i <= BUSWID==64 ? sel_i : adr_i[2] ? {sel_i,4'h0} : {4'h0,sel_i};
        rsel_i <= (BUSWID==64) ? sel_i : adr_i[2] ? {sel_i,4'h0} : {4'h0,sel_i};
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        radr_i <= adr_i;
        radr_i <= adr_i;
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        rdat_i <= BUSWID==64 ? dat_i : {2{dat_i}};
        rdat_i <= (BUSWID==64) ? dat_i : (BUSWID==32) ? {2{dat_i}} : {4{dat_i}};
 
 
// Register outputs
// Register outputs
always @(posedge clk_i)
always_ff @(posedge clk_i)
if (BUSWID==64)
if (BUSWID==64)
        casez({cs_rom,cs_reg,cs_text})
        casez({cs_config,cs_rom,cs_reg,cs_text})
        3'b1??: dat_o <= chdat_o;
        4'b1???:        dat_o <= cfg_out;
        3'b01?: dat_o <= rego;
        4'b01??:        dat_o <= chdat_o;
        3'b001: dat_o <= tdat_o;
        4'b001?:        dat_o <= rego;
 
        4'b0001:        dat_o <= tdat_o;
        default:        dat_o <= 'h0;
        default:        dat_o <= 'h0;
        endcase
        endcase
else if (BUSWID==32)
else if (BUSWID==32)
        casez({cs_rom,cs_reg,cs_text})
        casez({cs_config,cs_rom,cs_reg,cs_text})
        3'b1??: dat_o <= radr_i[2] ? chdat_o[63:32] : chdat_o[31:0];
        4'b1???:        dat_o <= radr_i[2] ? cfg_out[63:32] : cfg_out[31:0];
        3'b01?: dat_o <= radr_i[2] ? rego[63:32] : rego[31:0];
        4'b01??:        dat_o <= radr_i[2] ? chdat_o[63:32] : chdat_o[31:0];
        3'b001: dat_o <= radr_i[2] ? tdat_o[63:32] : tdat_o[31:0];
        4'b001?:        dat_o <= radr_i[2] ? rego[63:32] : rego[31:0];
 
        4'b0001:        dat_o <= radr_i[2] ? tdat_o[63:32] : tdat_o[31:0];
        default:        dat_o <= 'd0;
        default:        dat_o <= 'd0;
        endcase
        endcase
else
else
        dat_o <= 'd0;
        dat_o <= 'd0;
 
 
Line 278... Line 315...
        .READ_STAGES(5),
        .READ_STAGES(5),
        .WRITE_STAGES(1),
        .WRITE_STAGES(1),
        .REGISTER_OUTPUT(1)
        .REGISTER_OUTPUT(1)
)
)
uag1 (
uag1 (
 
        .rst_i(rst_i),
        .clk_i(clk_i),
        .clk_i(clk_i),
        .ce_i(1'b1),
        .ce_i(1'b1),
        .i(cs_any),
        .i((cs_any|cs_config) & ~rwr_i),
        .we_i(cs_any & rwr_i),
        .we_i((cs_any|cs_config) & rwr_i),
        .o(ack_o),
        .o(ack_o),
        .rid_i(0),
        .rid_i(0),
        .wid_i(0),
        .wid_i(0),
        .rid_o(),
        .rid_o(),
        .wid_o()
        .wid_o()
);
);
 
 
//--------------------------------------------------------------------
//--------------------------------------------------------------------
 
// config
 
//--------------------------------------------------------------------
 
 
 
initial begin
 
        for (n3 = 0; n3 < 32; n3 = n3 + 1)
 
                cfg_dat[n3] = 'd0;
 
end
 
 
 
always_ff @(posedge clk_i)
 
if (rst_i) begin
 
        tc_ram_addr <= `TC_RAM_ADDR;
 
        tc_cbm_addr <= `TC_CBM_ADDR;
 
        tc_reg_addr     <= `TC_REG_ADDR;
 
end
 
else begin
 
        if (cs_config) begin
 
                if (rwr_i)
 
                        case(radr_i[7:3])
 
                        5'h02:
 
                                begin
 
                                        if (&rsel_i[3:0] && rdat_i[31:0]==32'hFFFFFFFF)
 
                                                tc_ram_addr <= 32'hFFFFFFFF;    // no memory is needed
 
                                        else begin
 
                                                if (rsel_i[0])  tc_ram_addr[7:0] <= rdat_i[7:0];
 
                                                if (rsel_i[1])  tc_ram_addr[15:8] <= rdat_i[15:8];
 
                                                if (rsel_i[2])  tc_ram_addr[23:16] <= rdat_i[23:16];
 
                                                if (rsel_i[3])  tc_ram_addr[31:24] <= rdat_i[31:24];
 
                                        end
 
                                        if (&rsel_i[7:4] && rdat_i[31:0]==32'hFFFFFFFF)
 
                                                tc_cbm_addr <= 32'hFFFFFFFF;    // no memory is needed
 
                                        else begin
 
                                                if (rsel_i[4])  tc_cbm_addr[7:0] <= rdat_i[7:0];
 
                                                if (rsel_i[5])  tc_cbm_addr[15:8] <= rdat_i[15:8];
 
                                                if (rsel_i[6])  tc_cbm_addr[23:16] <= rdat_i[23:16];
 
                                                if (rsel_i[7])  tc_cbm_addr[31:24] <= rdat_i[31:24];
 
                                        end
 
                                end
 
                        5'h03:
 
                                begin
 
                                        if (&rsel_i[3:0] && rdat_i[31:0]==32'hFFFFFFFF)
 
                                                tc_reg_addr <= 32'hFFFFFFFF;    // no memory is needed
 
                                        else begin
 
                                                if (rsel_i[0])  tc_reg_addr[7:0] <= rdat_i[7:0];
 
                                                if (rsel_i[1])  tc_reg_addr[15:8] <= rdat_i[15:8];
 
                                                if (rsel_i[2])  tc_reg_addr[23:16] <= rdat_i[23:16];
 
                                                if (rsel_i[3])  tc_reg_addr[31:24] <= rdat_i[31:24];
 
                                        end
 
                                end
 
                        default:
 
                                cfg_dat[radr_i[7:3]] <= rdat_i;
 
                        endcase
 
                else
 
                        case(radr_i[7:3])
 
                        5'h00:  cfg_out <= {32'h0,CFG_DEVICE_ID,CFG_VENDOR_ID};
 
                        5'h01:  cfg_out <= {8'h00,8'h00,8'h00,8'd32,24'h0,8'h0};
 
                        5'h02:  cfg_out <= {tc_cbm_addr,tc_ram_addr};
 
                        5'h03:  cfg_out <= {32'hFFFFFFFF,tc_reg_addr};
 
                        5'h04:  cfg_out <= 64'hFFFFFFFFFFFFFFFF;
 
                        5'h05:  cfg_out <= {CFG_SUBSYSTEM_ID,CFG_SUBSYSTEM_VENDOR_ID,32'h0};
 
                        5'h06:  cfg_out <= {24'h00,8'h00,CFG_ROM_ADDR};
 
                        5'h07:  cfg_out <= {8'd8,8'd0,8'd0,8'd0,32'h0};
 
                        default:        cfg_out <= cfg_dat[radr_i[7:3]];
 
                        endcase
 
        end
 
end
 
 
 
 
 
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------
`ifdef USE_CLOCK_GATE
`ifdef USE_CLOCK_GATE
BUFHCE ucb1 (.I(dot_clk_i), .CE(controller_enable), .O(vclk));
BUFHCE ucb1 (.I(dot_clk_i), .CE(controller_enable), .O(vclk));
`else
`else
assign vclk = dot_clk_i;
assign vclk = dot_clk_i;
Line 397... Line 503...
  .we(rwr_i & rsel_i[7]),
  .we(rwr_i & rsel_i[7]),
  .i(rdat_i[63:56]),
  .i(rdat_i[63:56]),
  .o(rrm_o[63:56])
  .o(rrm_o[63:56])
);
);
 
 
wire [31:0] lfsr1_o;
wire [26:0] lfsr1_o;
lfsr #(32) ulfsr1(rst_i, dot_clk_i, 1'b1, 1'b0, lfsr1_o);
lfsr27 #(.WID(27)) ulfsr1(rst_i, dot_clk_i, 1'b1, 1'b0, lfsr1_o);
wire [63:0] lfsr_o = {6'h20,
wire [63:0] lfsr_o = {6'h10,
                                                                                                lfsr1_o[26:24],4'b0,lfsr1_o[23:21],4'b0,lfsr1_o[20:18],4'b0,
                                                                                                lfsr1_o[26:24],4'b0,lfsr1_o[23:21],4'b0,lfsr1_o[20:18],4'b0,
                                                                                                lfsr1_o[17:15],4'b0,lfsr1_o[14:12],4'b0,lfsr1_o[11:9],4'b0,
                                                                                                lfsr1_o[17:15],4'b0,lfsr1_o[14:12],4'b0,lfsr1_o[11:9],4'b0,
                                                                                                8'h00,lfsr1_o[8:0]
                                                                                                7'h00,lfsr1_o[8:0]
 
                                                                                };
 
wire [63:0] lfsr_o2 = {6'h10,
 
//                                                                                              lfsr1_o[26:24],4'b0,lfsr1_o[23:21],4'b0,lfsr1_o[20:18],4'b0,
 
//                                                                                              lfsr1_o[17:15],4'b0,lfsr1_o[14:12],4'b0,lfsr1_o[11:9],4'b0,
 
                                                                                                4'b0,lfsr1_o[26:24],4'b0,lfsr1_o[23:21],lfsr1_o[20:18],4'b0,
 
                                                                                                4'b0,lfsr1_o[17:15],4'b0,lfsr1_o[14:12],lfsr1_o[11:9],4'b0,
 
                                                                                                7'h00,lfsr1_o[8:0]
 
                                                                                };
 
wire [63:0] lfsr_o1 = {lfsr1_o[3:0],2'b00,
 
//                                                                                              lfsr1_o[26:24],4'b0,lfsr1_o[23:21],4'b0,lfsr1_o[20:18],4'b0,
 
//                                                                                              lfsr1_o[17:15],4'b0,lfsr1_o[14:12],4'b0,lfsr1_o[11:9],4'b0,
 
                                                                                                4'b0,lfsr1_o[26:24],4'b0,lfsr1_o[23:21],lfsr1_o[20:18],4'b0,
 
                                                                                                4'b0,lfsr1_o[17:15],lfsr1_o[14:12],4'b0,4'b0,lfsr1_o[11:9],
 
                                                                                                7'h00,lfsr1_o[8:0]
                                                                                };
                                                                                };
 
 
/* This snippit of code for performing burst accesses, under construction.
/* This snippit of code for performing burst accesses, under construction.
wire pe_cs;
wire pe_cs;
edge_det u1(.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(cs_text), .pe(pe_cs), .ne(), .ee() );
edge_det u1(.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(cs_text), .pe(pe_cs), .ne(), .ee() );
Line 431... Line 551...
*/
*/
 
 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// text screen RAM
// text screen RAM
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
rfTextScreenRam screen_ram1
rfTextScreenRam #(
 
        .TEXT_CELL_COUNT(TEXT_CELL_COUNT)
 
)
 
screen_ram1
(
(
        .clka_i(clk_i),
        .clka_i(clk_i),
        .csa_i(cs_text),
        .csa_i(cs_text),
        .wea_i(rwr_i),
        .wea_i(rwr_i),
        .sela_i(rsel_i),
        .sela_i(rsel_i),
        .adra_i(radr_i[15:3]),
        .adra_i(radr_i[16:3]),
        .data_i(rdat_i),
        .data_i(rdat_i),
        .data_o(tdat_o),
        .data_o(tdat_o),
        .clkb_i(vclk),
        .clkb_i(vclk),
        .csb_i(ld_shft|por),
        .csb_i(ld_shft|por),
        .web_i(por),
        .web_i(por),
        .selb_i(8'hFF),
        .selb_i(8'hFF),
        .adrb_i(txtAddr[12:0]),
        .adrb_i(txtAddr[13:0]),
        .datb_i(lfsr_o),
        .datb_i(lfsr_o),//txtAddr[12:0] > 13'd1664 ? lfsr_o1 : lfsr_o),
        .datb_o(screen_ram_out)
        .datb_o(screen_ram_out)
);
);
 
 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Character bitmap RAM
// Character bitmap RAM
Line 502... Line 625...
 
 
always_ff @(posedge clk_i)
always_ff @(posedge clk_i)
        if (rst_i) begin
        if (rst_i) begin
          por <= 1'b1;
          por <= 1'b1;
          mcm <= 1'b0;
          mcm <= 1'b0;
 
          aam <= 1'b0;
          controller_enable <= 1'b1;
          controller_enable <= 1'b1;
    xscroll              <= 5'd0;
    xscroll              <= 5'd0;
    yscroll              <= 5'd0;
    yscroll              <= 5'd0;
    txtTcCode    <= 24'h1ff;
    txtTcCode    <= 24'h1ff;
    bdrColor     <= 32'hFFBF2020;
    bdrColor     <= 32'hFFBF2020;
    startAddress <= 16'h0000;
    startAddress <= 16'h0000;
    fontAddress  <= 16'h0000;
    fontAddress  <= 16'h0008;
    font_locked  <= 1'b1;
    font_locked  <= 1'b1;
    fontAscent   <= 6'd12;
    fontAscent   <= 6'd12;
    cursorStart  <= 5'd00;
    cursorStart  <= 5'd00;
    cursorEnd    <= 5'd31;
    cursorEnd    <= 5'd31;
    cursorPos    <= 16'h0003;
    cursorPos    <= 16'h0003;
Line 533... Line 657...
                pixelHeight  <= 4'd1;           // 384 pixels
                pixelHeight  <= 4'd1;           // 384 pixels
*/
*/
                // 64x32
                // 64x32
                if (num==4'd1) begin
                if (num==4'd1) begin
      windowTop    <= 12'd4058;//12'd16;
      windowTop    <= 12'd4058;//12'd16;
      windowLeft   <= 12'd3956;//12'd86;
      windowLeft   <= 12'd3918;//12'd3956;//12'd86;
      pixelWidth   <= 4'd0;             // 800 pixels
      pixelWidth   <= 4'd0;             // 800 pixels
      pixelHeight  <= 4'd0;             // 600 pixels
      pixelHeight  <= 4'd0;             // 600 pixels
      numCols      <= COLS;
      numCols      <= COLS;
      numRows      <= ROWS;
      numRows      <= ROWS;
      maxRowScan   <= 6'd17;
      maxRowScan   <= 6'd17;
      maxScanpix   <= 6'd11;
      maxScanpix   <= 6'd11;
      rBlink       <= 3'b111;           // 01 = non display
      rBlink       <= 3'b111;           // 01 = non display
      charOutDelay <= 8'd7;
      charOutDelay <= 8'd5;
                end
                end
                else if (num==4'd2) begin
                else if (num==4'd2) begin
      windowTop    <= 12'd4032;//12'd16;
      windowTop    <= 12'd4032;//12'd16;
      windowLeft   <= 12'd3720;//12'd86;
      windowLeft   <= 12'd3720;//12'd86;
      pixelWidth   <= 4'd0;        // 800 pixels
      pixelWidth   <= 4'd0;        // 800 pixels
Line 583... Line 707...
                                                pixelWidth  <= rdat_i[11:8];    // horizontal pixel width
                                                pixelWidth  <= rdat_i[11:8];    // horizontal pixel width
                                        end
                                        end
                                        if (rsel_i[2]) maxScanpix <= rdat_i[20:16];
                                        if (rsel_i[2]) maxScanpix <= rdat_i[20:16];
                                        if (rsel_i[3]) por <= rdat_i[24];
                                        if (rsel_i[3]) por <= rdat_i[24];
                                        if (rsel_i[4]) controller_enable <= rdat_i[32];
                                        if (rsel_i[4]) controller_enable <= rdat_i[32];
                                        if (rsel_i[5]) mcm <= rdat_i[40];
                                        if (rsel_i[5])
 
                                                begin
 
                                                        mcm <= rdat_i[40];
 
                                                        aam <= rdat_i[41];
 
                                                end
                                        if (rsel_i[6]) yscroll <= rdat_i[52:48];
                                        if (rsel_i[6]) yscroll <= rdat_i[52:48];
                                        if (rsel_i[7]) xscroll <= rdat_i[60:56];
                                        if (rsel_i[7]) xscroll <= rdat_i[60:56];
                                end
                                end
                        4'd2:   // Color Control
                        4'd2:   // Color Control
                                begin
                                begin
                                        if (rsel_i[0]) txtTcCode[7:0] <= rdat_i[7:0];
                                        if (rsel_i[0]) txtTcCode[7:0] <= rdat_i[7:0];
                                        if (rsel_i[1]) txtTcCode[15:8] <= rdat_i[15:8];
                                        if (rsel_i[1]) txtTcCode[15:8] <= rdat_i[15:8];
                                        if (rsel_i[2]) txtTcCode[23:16] <= rdat_i[23:16];
                                        if (rsel_i[2]) txtTcCode[23:16] <= rdat_i[23:16];
                                        if (rsel_i[3]) txtTcCode[30:24] <= rdat_i[30:24];
                                        if (rsel_i[3]) txtTcCode[30:24] <= rdat_i[30:24];
                                        if (rsel_i[4]) bdrColor[7:0] <= dat_i[39:32];
                                        if (rsel_i[4]) bdrColor[7:0] <= rdat_i[39:32];
                                        if (rsel_i[5]) bdrColor[15:8] <= dat_i[47:40];
                                        if (rsel_i[5]) bdrColor[15:8] <= rdat_i[47:40];
                                        if (rsel_i[6]) bdrColor[23:16] <= dat_i[55:48];
                                        if (rsel_i[6]) bdrColor[23:16] <= rdat_i[55:48];
                                        if (rsel_i[7]) bdrColor[31:24] <= dat_i[63:56];
                                        if (rsel_i[7]) bdrColor[31:24] <= rdat_i[63:56];
                                end
                                end
                        4'd3:   // Color Control 2
                        4'd3:   // Color Control 2
                                begin
                                begin
                                        if (rsel_i[0]) tileColor1[7:0] <= rdat_i[7:0];
                                        if (rsel_i[0]) tileColor1[7:0] <= rdat_i[7:0];
                                        if (rsel_i[1]) tileColor1[15:8] <= rdat_i[15:8];
                                        if (rsel_i[1]) tileColor1[15:8] <= rdat_i[15:8];
Line 652... Line 780...
// hardware cursors are really simple. More sophisticated hardware
// hardware cursors are really simple. More sophisticated hardware
// cursors can be had via the sprite controller.
// cursors can be had via the sprite controller.
//--------------------------------------------------------------------
//--------------------------------------------------------------------
 
 
reg [31:0] curout;
reg [31:0] curout;
integer n2;
wire [31:0] curout1;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
if (ld_shft) begin
if (ld_shft) begin
        curout = 'd0;
        curout = 'd0;
        case(cursorType)
        case(cursorType)
        // No cursor
        // No cursor
Line 692... Line 820...
        3'd7:   curout = 32'hFFFFFFFF;
        3'd7:   curout = 32'hFFFFFFFF;
        default:        curout = 32'hFFFFFFFF;
        default:        curout = 32'hFFFFFFFF;
        endcase
        endcase
end
end
 
 
 
ft_delay
 
#(
 
        .WID(32),
 
        .DEP(3)
 
)
 
uftd1
 
(
 
        .clk(vclk),
 
        .ce(ld_shft),
 
        .i(curout),
 
        .o(curout1)
 
);
 
 
//-------------------------------------------------------------
//-------------------------------------------------------------
// Video Stuff
// Video Stuff
//-------------------------------------------------------------
//-------------------------------------------------------------
 
 
wire pe_hsync;
wire pe_hsync;
Line 852... Line 993...
                bcnt <= bcnt + 6'd1;
                bcnt <= bcnt + 6'd1;
end
end
 
 
reg blink_en;
reg blink_en;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        blink_en <= (cursorPos+3==txtAddr);// && (rowscan[4:0] >= cursorStart) && (rowscan[4:0] <= cursorEnd);
        blink_en <= (cursorPos+charOutDelay-2'd1==txtAddr);// && (rowscan[4:0] >= cursorStart) && (rowscan[4:0] <= cursorEnd);
 
 
VT151 ub2
VT151 ub2
(
(
        .e_n(!blink_en),
        .e_n(!blink_en),
        .s(rBlink),
        .s(rBlink),
Line 871... Line 1012...
                bkColor40 <= {txtZorder1[5:2],txtBkCode1[20:14],5'b0,txtBkCode1[13:7],5'b0,txtBkCode1[6:0],5'b0};
                bkColor40 <= {txtZorder1[5:2],txtBkCode1[20:14],5'b0,txtBkCode1[13:7],5'b0,txtBkCode1[6:0],5'b0};
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (ld_shft)
        if (ld_shft)
                bkColor40d <= bkColor40;
                bkColor40d <= bkColor40;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (nhp)
        if (ld_shft)
                bkColor40d2 <= bkColor40d;
                bkColor40d2 <= bkColor40d;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
 
        if (nhp)
 
                bkColor40d3 <= bkColor40d2;
 
always_ff @(posedge vclk)
        if (ld_shft)
        if (ld_shft)
                fgColor40 <= {txtZorder1[5:2],txtFgCode1[20:14],5'b0,txtFgCode1[13:7],5'b0,txtFgCode1[6:0],5'b0};
                fgColor40 <= {txtZorder1[5:2],txtFgCode1[20:14],5'b0,txtFgCode1[13:7],5'b0,txtFgCode1[6:0],5'b0};
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (ld_shft)
        if (ld_shft)
                fgColor40d <= fgColor40;
                fgColor40d <= fgColor40;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (nhp)
        if (ld_shft)
                fgColor40d2 <= fgColor40d;
                fgColor40d2 <= fgColor40d;
 
always_ff @(posedge vclk)
 
        if (nhp)
 
                fgColor40d3 <= fgColor40d2;
 
 
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (ld_shft)
        if (ld_shft)
                bgt <= txtBkCode1=={txtTcCode[26:20],txtTcCode[17:11],txtTcCode[8:2]};
                bgt <= txtBkCode1=={txtTcCode[26:20],txtTcCode[17:11],txtTcCode[8:2]};
always_ff @(posedge vclk)
always_ff @(posedge vclk)
Line 896... Line 1043...
                bgtd2 <= bgtd;
                bgtd2 <= bgtd;
 
 
// Convert character bitmap to pixels
// Convert character bitmap to pixels
reg [63:0] charout1;
reg [63:0] charout1;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        charout1 <= blink ? (char_bmp ^ curout) : char_bmp;
        charout1 <= blink ? (char_bmp ^ curout1) : char_bmp;
 
 
// Convert parallel to serial
// Convert parallel to serial
rfTextShiftRegister ups1
rfTextShiftRegister ups1
(
(
        .rst(rst_i),
        .rst(rst_i),
        .clk(vclk),
        .clk(vclk),
        .mcm(mcm),
        .mcm(mcm),
 
//      .aam(aam),
        .ce(nhp),
        .ce(nhp),
        .ld(ld_shft),
        .ld(ld_shft),
        .a(maxScanpix[5:0]),
        .a(maxScanpix[5:0]),
        .qin(2'b0),
        .qin(2'b0),
        .d(charout1),
        .d(charout1),
Line 922... Line 1070...
wire bpix = hctr[2] ^ rowscan[4];// ^ blink;
wire bpix = hctr[2] ^ rowscan[4];// ^ blink;
always_ff @(posedge vclk)
always_ff @(posedge vclk)
        if (nhp)
        if (nhp)
                iblank <= (row >= numRows) || (col >= numCols + charOutDelay) || (col < charOutDelay);
                iblank <= (row >= numRows) || (col >= numCols + charOutDelay) || (col < charOutDelay);
 
 
 
`ifdef SUPPORT_AAM
 
function [11:0] fnBlendComponent;
 
input [11:0] c1;
 
input [11:0] c2;
 
input [1:0] pix;
 
case(pix)
 
2'b00:  fnBlendComponent = c2;
 
2'b01:  fnBlendComponent = ((c1 * 4'd5) + (c2 * 4'd11)) >> 4;
 
2'b10:  fnBlendComponent = ((c1 * 4'd11) + (c2 * 4'd5)) >> 4;
 
2'b11:  fnBlendComponent = c1;
 
endcase
 
endfunction
 
 
 
function [39:0] fnBlend;
 
input [39:0] c1;
 
input [39:0] c2;
 
input [1:0] pix;
 
fnBlend = {
 
        |pix ? c1[39:36] : c2[39:36],
 
        fnBlendComponent(c1[35:24],c2[35:24]),
 
        fnBlendComponent(c1[23:12],c2[23:12]),
 
        fnBlendComponent(c1[11: 0],c2[11: 0])
 
};
 
endfunction
 
`endif
 
 
// Choose between input RGB and controller generated RGB
// Choose between input RGB and controller generated RGB
// Select between foreground and background colours.
// Select between foreground and background colours.
// Note the ungated dot clock must be used here, or output from other
// Note the ungated dot clock must be used here, or output from other
// controllers would not be visible if the clock were gated off.
// controllers would not be visible if the clock were gated off.
always_ff @(posedge dot_clk_i)
always_ff @(posedge dot_clk_i)
        casez({controller_enable&xonoff_i,blank_i,iblank,border_i,bpix,mcm,pix})
        casez({controller_enable&xonoff_i,blank_i,iblank,border_i,bpix,mcm,aam,pix})
        8'b01??????:    zrgb_o <= 40'h00000000;
        9'b01???????:   zrgb_o <= 40'h00000000;
        8'b11??????:    zrgb_o <= 40'h00000000;
        9'b11???????:   zrgb_o <= 40'h00000000;
        8'b1001????:    zrgb_o <= {bdrColor[30:27],bdrColor[26:18],3'b0,bdrColor[17:9],3'b0,bdrColor[8:0],3'b0};
        9'b1001?????:   zrgb_o <= {bdrColor[30:27],bdrColor[26:18],3'b0,bdrColor[17:9],3'b0,bdrColor[8:0],3'b0};
        8'b1000?00?:    zrgb_o <= (zrgb_i[39:36] > bkColor40d2[39:36]) ? zrgb_i : bkColor40d2;
`ifdef SUPPORT_AAM
        8'b1000?01?:    zrgb_o <= fgColor40d2; // ToDo: compare z-order
        9'b1000?01??:   zrgb_o <= fnBlend(fgColor40d3,zrgb_i[39:36] > bkColor40d3[39:36]) ? zrgb_i : bkColor40d3, pix);
        8'b1000?100:    zrgb_o <= (zrgb_i[39:36] > bkColor40d2[39:36]) ? zrgb_i : bkColor40d2;
`endif
        8'b1000?101:    zrgb_o <= fgColor40d2;
        9'b1000?000?:   zrgb_o <= (zrgb_i[39:36] > bkColor40d3[39:36]) ? zrgb_i : bkColor40d3;
        8'b1000?110:    zrgb_o <= {tileColor1[30:27],tileColor1[26:18],3'b0,tileColor1[17:9],3'b0,tileColor1[8:0],3'b0};
        9'b1000?001?:   zrgb_o <= fgColor40d3; // ToDo: compare z-order
        8'b1000?111:    zrgb_o <= {tileColor2[30:27],tileColor2[26:18],3'b0,tileColor2[17:9],3'b0,tileColor2[8:0],3'b0};
        9'b1000?1000:   zrgb_o <= (zrgb_i[39:36] > bkColor40d3[39:36]) ? zrgb_i : bkColor40d3;
 
        9'b1000?1001:   zrgb_o <= fgColor40d3;
 
        9'b1000?1010:   zrgb_o <= {tileColor1[30:27],tileColor1[26:18],3'b0,tileColor1[17:9],3'b0,tileColor1[8:0],3'b0};
 
        9'b1000?1011:   zrgb_o <= {tileColor2[30:27],tileColor2[26:18],3'b0,tileColor2[17:9],3'b0,tileColor2[8:0],3'b0};
//      6'b1010?0:      zrgb_o <= bgtd ? zrgb_i : bkColor32d;
//      6'b1010?0:      zrgb_o <= bgtd ? zrgb_i : bkColor32d;
        default:        zrgb_o <= zrgb_i;
        default:        zrgb_o <= zrgb_i;
        endcase
        endcase
 
 
endmodule
endmodule

powered by: WebSVN 2.1.0

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