mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			314 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Verilog
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Verilog
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  *  VGA top level file
 | |
|  *  Copyright (C) 2010  Zeus Gomez Marmolejo <zeus@aluzina.org>
 | |
|  *
 | |
|  *  This file is part of the Zet processor. This processor is free
 | |
|  *  hardware; you can redistribute it and/or modify it under the terms of
 | |
|  *  the GNU General Public License as published by the Free Software
 | |
|  *  Foundation; either version 3, or (at your option) any later version.
 | |
|  *
 | |
|  *  Zet is distrubuted 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 General Public
 | |
|  *  License for more details.
 | |
|  *
 | |
|  *  You should have received a copy of the GNU General Public License
 | |
|  *  along with Zet; see the file COPYING. If not, see
 | |
|  *  <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| module vga (
 | |
|     // Wishbone signals
 | |
|     input         wb_clk_i,     // 25 Mhz VDU clock
 | |
|     input         wb_rst_i,
 | |
|     input  [15:0] wb_dat_i,
 | |
|     output [15:0] wb_dat_o,
 | |
|     input  [16:1] wb_adr_i,
 | |
|     input         wb_we_i,
 | |
|     input         wb_tga_i,
 | |
|     input  [ 1:0] wb_sel_i,
 | |
|     input         wb_stb_i,
 | |
|     input         wb_cyc_i,
 | |
|     output        wb_ack_o,
 | |
| 
 | |
|     // VGA pad signals
 | |
|     output [ 3:0] vga_red_o,
 | |
|     output [ 3:0] vga_green_o,
 | |
|     output [ 3:0] vga_blue_o,
 | |
|     output        horiz_sync,
 | |
|     output        vert_sync,
 | |
| 
 | |
|     // CSR SRAM master interface
 | |
|     output [17:1] csrm_adr_o,
 | |
|     output [ 1:0] csrm_sel_o,
 | |
|     output        csrm_we_o,
 | |
|     output [15:0] csrm_dat_o,
 | |
|     input  [15:0] csrm_dat_i
 | |
|   );
 | |
| 
 | |
| 
 | |
|   // Registers and nets
 | |
|   //
 | |
|   // csr address
 | |
|   reg  [17:1] csr_adr_i;
 | |
|   reg         csr_stb_i;
 | |
| 
 | |
|   // Config wires
 | |
|   wire [15:0] conf_wb_dat_o;
 | |
|   wire        conf_wb_ack_o;
 | |
| 
 | |
|   // Mem wires
 | |
|   wire [15:0] mem_wb_dat_o;
 | |
|   wire        mem_wb_ack_o;
 | |
| 
 | |
|   // LCD wires
 | |
|   wire [17:1] csr_adr_o;
 | |
|   wire [15:0] csr_dat_i;
 | |
|   wire        csr_stb_o;
 | |
|   wire        v_retrace;
 | |
|   wire        vh_retrace;
 | |
|   wire        w_vert_sync;
 | |
| 
 | |
|   // VGA configuration registers
 | |
|   wire        shift_reg1;
 | |
|   wire        graphics_alpha;
 | |
|   wire        memory_mapping1;
 | |
|   wire [ 1:0] write_mode;
 | |
|   wire [ 1:0] raster_op;
 | |
|   wire        read_mode;
 | |
|   wire [ 7:0] bitmask;
 | |
|   wire [ 3:0] set_reset;
 | |
|   wire [ 3:0] enable_set_reset;
 | |
|   wire [ 3:0] map_mask;
 | |
|   wire        x_dotclockdiv2;
 | |
|   wire        chain_four;
 | |
|   wire [ 1:0] read_map_select;
 | |
|   wire [ 3:0] color_compare;
 | |
|   wire [ 3:0] color_dont_care;
 | |
| 
 | |
|   // Wishbone master to SRAM
 | |
|   wire [17:1] wbm_adr_o;
 | |
|   wire [ 1:0] wbm_sel_o;
 | |
|   wire        wbm_we_o;
 | |
|   wire [15:0] wbm_dat_o;
 | |
|   wire [15:0] wbm_dat_i;
 | |
|   wire        wbm_stb_o;
 | |
|   wire        wbm_ack_i;
 | |
| 
 | |
|   wire        stb;
 | |
| 
 | |
|   // CRT wires
 | |
|   wire [ 5:0] cur_start;
 | |
|   wire [ 5:0] cur_end;
 | |
|   wire [15:0] start_addr;
 | |
|   wire [ 4:0] vcursor;
 | |
|   wire [ 6:0] hcursor;
 | |
|   wire [ 6:0] horiz_total;
 | |
|   wire [ 6:0] end_horiz;
 | |
|   wire [ 6:0] st_hor_retr;
 | |
|   wire [ 4:0] end_hor_retr;
 | |
|   wire [ 9:0] vert_total;
 | |
|   wire [ 9:0] end_vert;
 | |
|   wire [ 9:0] st_ver_retr;
 | |
|   wire [ 3:0] end_ver_retr;
 | |
| 
 | |
|   // attribute_ctrl wires
 | |
|   wire [3:0] pal_addr;
 | |
|   wire       pal_we;
 | |
|   wire [7:0] pal_read;
 | |
|   wire [7:0] pal_write;
 | |
| 
 | |
|   // dac_regs wires
 | |
|   wire       dac_we;
 | |
|   wire [1:0] dac_read_data_cycle;
 | |
|   wire [7:0] dac_read_data_register;
 | |
|   wire [3:0] dac_read_data;
 | |
|   wire [1:0] dac_write_data_cycle;
 | |
|   wire [7:0] dac_write_data_register;
 | |
|   wire [3:0] dac_write_data;
 | |
| 
 | |
|   // Module instances
 | |
|   //
 | |
|   vga_config_iface config_iface (
 | |
|     .wb_clk_i (wb_clk_i),
 | |
|     .wb_rst_i (wb_rst_i),
 | |
|     .wb_dat_i (wb_dat_i),
 | |
|     .wb_dat_o (conf_wb_dat_o),
 | |
|     .wb_adr_i (wb_adr_i[4:1]),
 | |
|     .wb_we_i  (wb_we_i),
 | |
|     .wb_sel_i (wb_sel_i),
 | |
|     .wb_stb_i (stb & wb_tga_i),
 | |
|     .wb_ack_o (conf_wb_ack_o),
 | |
| 
 | |
|     .shift_reg1       (shift_reg1),
 | |
|     .graphics_alpha   (graphics_alpha),
 | |
|     .memory_mapping1  (memory_mapping1),
 | |
|     .write_mode       (write_mode),
 | |
|     .raster_op        (raster_op),
 | |
|     .read_mode        (read_mode),
 | |
|     .bitmask          (bitmask),
 | |
|     .set_reset        (set_reset),
 | |
|     .enable_set_reset (enable_set_reset),
 | |
|     .map_mask         (map_mask),
 | |
|     .x_dotclockdiv2   (x_dotclockdiv2),
 | |
|     .chain_four       (chain_four),
 | |
|     .read_map_select  (read_map_select),
 | |
|     .color_compare    (color_compare),
 | |
|     .color_dont_care  (color_dont_care),
 | |
| 
 | |
|     .pal_addr  (pal_addr),
 | |
|     .pal_we    (pal_we),
 | |
|     .pal_read  (pal_read),
 | |
|     .pal_write (pal_write),
 | |
| 
 | |
|     .dac_we                  (dac_we),
 | |
|     .dac_read_data_cycle     (dac_read_data_cycle),
 | |
|     .dac_read_data_register  (dac_read_data_register),
 | |
|     .dac_read_data           (dac_read_data),
 | |
|     .dac_write_data_cycle    (dac_write_data_cycle),
 | |
|     .dac_write_data_register (dac_write_data_register),
 | |
|     .dac_write_data          (dac_write_data),
 | |
| 
 | |
|     .cur_start  (cur_start),
 | |
|     .cur_end    (cur_end),
 | |
|     .start_addr (start_addr),
 | |
|     .vcursor    (vcursor),
 | |
|     .hcursor    (hcursor),
 | |
| 
 | |
|     .horiz_total  (horiz_total),
 | |
|     .end_horiz    (end_horiz),
 | |
|     .st_hor_retr  (st_hor_retr),
 | |
|     .end_hor_retr (end_hor_retr),
 | |
|     .vert_total   (vert_total),
 | |
|     .end_vert     (end_vert),
 | |
|     .st_ver_retr  (st_ver_retr),
 | |
|     .end_ver_retr (end_ver_retr),
 | |
| 
 | |
|     .v_retrace  (v_retrace),
 | |
|     .vh_retrace (vh_retrace)
 | |
|   );
 | |
| 
 | |
|   vga_lcd lcd (
 | |
|     .clk (wb_clk_i),
 | |
|     .rst (wb_rst_i),
 | |
| 
 | |
|     .shift_reg1     (shift_reg1),
 | |
|     .graphics_alpha (graphics_alpha),
 | |
| 
 | |
|     .pal_addr  (pal_addr),
 | |
|     .pal_we    (pal_we),
 | |
|     .pal_read  (pal_read),
 | |
|     .pal_write (pal_write),
 | |
| 
 | |
|     .dac_we                  (dac_we),
 | |
|     .dac_read_data_cycle     (dac_read_data_cycle),
 | |
|     .dac_read_data_register  (dac_read_data_register),
 | |
|     .dac_read_data           (dac_read_data),
 | |
|     .dac_write_data_cycle    (dac_write_data_cycle),
 | |
|     .dac_write_data_register (dac_write_data_register),
 | |
|     .dac_write_data          (dac_write_data),
 | |
| 
 | |
|     .csr_adr_o (csr_adr_o),
 | |
|     .csr_dat_i (csr_dat_i),
 | |
|     .csr_stb_o (csr_stb_o),
 | |
| 
 | |
|     .vga_red_o   (vga_red_o),
 | |
|     .vga_green_o (vga_green_o),
 | |
|     .vga_blue_o  (vga_blue_o),
 | |
|     .horiz_sync  (horiz_sync),
 | |
|     .vert_sync   (w_vert_sync),
 | |
| 
 | |
|     .cur_start  (cur_start),
 | |
|     .cur_end    (cur_end),
 | |
|     .vcursor    (vcursor),
 | |
|     .hcursor    (hcursor),
 | |
| 
 | |
|     .horiz_total  (horiz_total),
 | |
|     .end_horiz    (end_horiz),
 | |
|     .st_hor_retr  (st_hor_retr),
 | |
|     .end_hor_retr (end_hor_retr),
 | |
|     .vert_total   (vert_total),
 | |
|     .end_vert     (end_vert),
 | |
|     .st_ver_retr  (st_ver_retr),
 | |
|     .end_ver_retr (end_ver_retr),
 | |
| 
 | |
|     .x_dotclockdiv2 (x_dotclockdiv2),
 | |
| 
 | |
|     .v_retrace  (v_retrace),
 | |
|     .vh_retrace (vh_retrace)
 | |
|   );
 | |
| 
 | |
|   vga_cpu_mem_iface cpu_mem_iface (
 | |
|     .wb_clk_i (wb_clk_i),
 | |
|     .wb_rst_i (wb_rst_i),
 | |
| 
 | |
|     .wbs_adr_i (wb_adr_i),
 | |
|     .wbs_sel_i (wb_sel_i),
 | |
|     .wbs_we_i  (wb_we_i),
 | |
|     .wbs_dat_i (wb_dat_i),
 | |
|     .wbs_dat_o (mem_wb_dat_o),
 | |
|     .wbs_stb_i (stb & !wb_tga_i),
 | |
|     .wbs_ack_o (mem_wb_ack_o),
 | |
| 
 | |
|     .wbm_adr_o (wbm_adr_o),
 | |
|     .wbm_sel_o (wbm_sel_o),
 | |
|     .wbm_we_o  (wbm_we_o),
 | |
|     .wbm_dat_o (wbm_dat_o),
 | |
|     .wbm_dat_i (wbm_dat_i),
 | |
|     .wbm_stb_o (wbm_stb_o),
 | |
|     .wbm_ack_i (wbm_ack_i),
 | |
| 
 | |
|     .chain_four       (chain_four),
 | |
|     .memory_mapping1  (memory_mapping1),
 | |
|     .write_mode       (write_mode),
 | |
|     .raster_op        (raster_op),
 | |
|     .read_mode        (read_mode),
 | |
|     .bitmask          (bitmask),
 | |
|     .set_reset        (set_reset),
 | |
|     .enable_set_reset (enable_set_reset),
 | |
|     .map_mask         (map_mask),
 | |
|     .read_map_select  (read_map_select),
 | |
|     .color_compare    (color_compare),
 | |
|     .color_dont_care  (color_dont_care)
 | |
|   );
 | |
| 
 | |
|   vga_mem_arbitrer mem_arbitrer (
 | |
|     .clk_i (wb_clk_i),
 | |
|     .rst_i (wb_rst_i),
 | |
| 
 | |
|     .wb_adr_i (wbm_adr_o),
 | |
|     .wb_sel_i (wbm_sel_o),
 | |
|     .wb_we_i  (wbm_we_o),
 | |
|     .wb_dat_i (wbm_dat_o),
 | |
|     .wb_dat_o (wbm_dat_i),
 | |
|     .wb_stb_i (wbm_stb_o),
 | |
|     .wb_ack_o (wbm_ack_i),
 | |
| 
 | |
|     .csr_adr_i (csr_adr_i),
 | |
|     .csr_dat_o (csr_dat_i),
 | |
|     .csr_stb_i (csr_stb_i),
 | |
| 
 | |
|     .csrm_adr_o (csrm_adr_o),
 | |
|     .csrm_sel_o (csrm_sel_o),
 | |
|     .csrm_we_o  (csrm_we_o),
 | |
|     .csrm_dat_o (csrm_dat_o),
 | |
|     .csrm_dat_i (csrm_dat_i)
 | |
|   );
 | |
| 
 | |
|   // Continous assignments
 | |
|   assign wb_dat_o  = wb_tga_i ? conf_wb_dat_o : mem_wb_dat_o;
 | |
|   assign wb_ack_o  = wb_tga_i ? conf_wb_ack_o : mem_wb_ack_o;
 | |
|   assign stb       = wb_stb_i & wb_cyc_i;
 | |
|   assign vert_sync = ~graphics_alpha ^ w_vert_sync;
 | |
| 
 | |
|   // Behaviour
 | |
|   // csr_adr_i
 | |
|   always @(posedge wb_clk_i)
 | |
|     csr_adr_i <= wb_rst_i ? 17'h0 : csr_adr_o + start_addr[15:1];
 | |
| 
 | |
|   // csr_stb_i
 | |
|   always @(posedge wb_clk_i)
 | |
|     csr_stb_i <= wb_rst_i ? 1'b0 : csr_stb_o;
 | |
| 
 | |
| endmodule
 |