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

Subversion Repositories z80soc

[/] [z80soc/] [trunk/] [V0.7.3/] [DE1/] [vhdl/] [z80soc..01.vhd] - Rev 46

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------------------------
-- Z80SoC (Z80 System on Chip)
-- Ronivon Candido Costa
-- ronivon.costa@gmail.com
--
-- Version history:
-------------------
-- version 0.7.1
-- 2010 / 11 / 22
-- Change memory layout and increased Rom, using Megawizard plug in manager
-- Memory cores redefined
-- Fixed bug in the video.vhd
-- New rom demo in C (SDCC)
--
-- version 0.7
-- Release Date: 2010 / 02 / 17
-- version 0.6 for for Altera DE1
-- Release Date: 2008 / 05 / 21
--
-- Version 0.5 Beta for Altera DE1
-- Developer: Ronivon Candido Costa
-- Release Date: 2008 / 04 / 16
--
-- Based on the T80 core: http://www.opencores.org/projects.cgi/web/t80
-- This version developed and tested on: Altera DE1 Development Board
--
-- Peripherals configured (Using Ports):
--
--	16 KB Internal ROM	Read		(0x0000h - 0x3FFFh)
--	08 KB INTERNAL VRAM	Write		(0x4000h - 0x5FFFh)
-- 	32 KB External SRAM	Read/Write	(0x8000h - 0xFFFFh)
--	08 Green Leds		Out		(Port 0x01h)
--	08 Red Leds			Out		(Port 0x02h)
--	04 Seven Seg displays	Out		(Ports 0x11h and 0x10h)
--	36 Pins GPIO0 		In/Out	(Ports 0xA0h, 0xA1h, 0xA2h, 0xA3h, 0xA4h, 0xC0h)
--	36 Pins GPIO1 		In/Out	(Ports 0xB0h, 0xB1h, 0xB2h, 0xB3h, 0xB4h, 0xC1h)
--	08 Switches			In		(Port 0x20h)
--	04 Push buttons		In		(Port 0x30h)
--	01 PS/2 keyboard 		In		(Port 0x80h)
--	01 Video write port	In		(Port 0x90h)
--
--  Revision history:
--
-- 2008/05/23 - Modified RAM layout to support new and future improvements
--            - Added port 0x90 to write a character to video.
--            - Cursor x,y automatically updated after writing to port 0x90
--            - Added port 0x91 for video cursor X
--            - Added port 0x92 for video cursor Y
--	          - Updated ROM to demonstrate how to use these new resources
--            - Changed ROM to support 14 bit addresses (16 Kb)
--
-- 2008/05/12 - Added support for the Rotary Knob
--            - ROT_CENTER push button (Knob) reserved for RESET
--            - The four push buttons are now available for the user (Port 0x30)
--
-- 2008/05/11 - Fixed access to RAM and VRAM,
--              Released same ROM version for DE1 and S3E
--
-- 2008/05/01 - Added LCD support for Spartan 3E
--
-- 2008/04(21 - Release of Version 0.5-S3E-Beta for Diligent Spartan 3E
--
--	2008/04/17 - Added Video support for 40x30 mode
--
-- 2008/04/16 - Release of Version 0.5-DE1-Beta for Altera DE1
--
-- TO-DO:
-- - Implement hardware control for the A/D and IO pins
-- - Monitor program to introduce Z80 Assmebly codes and run
-- - Serial communication, to download assembly code from PC
-- - Add hardware support for 80x40 Video out
-- - SD/MMC card interface to read/store data and programs
-------------------------------------------------------------------------------------------------
 
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use work.z80soc_pack.all;
 
entity 	Z80SOC is
	port(
    -- Clocks
    CLOCK_50 : in std_logic;              -- 50 MHz
 
    -- Buttons and switches
    KEY : in std_logic_vector(3 downto 0);         -- Push buttons
    SW : in std_logic_vector(17 downto 0);          -- Switches
 
    -- LED displays
    HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, HEX6, HEX7  -- 7-segment displays
			: out std_logic_vector(6 downto 0);
    LEDG : out std_logic_vector(8 downto 0);       -- Green LEDs
    LEDR : out std_logic_vector(17 downto 0);       -- Red LEDs
 
    -- RS-232 interface
    UART_TXD : out std_logic;                      -- UART transmitter   
    UART_RXD : in std_logic;                       -- UART receiver
    UART_RTS : in std_logic;                       -- UART RTS
	 UART_CTS : in std_logic;                       -- UART CTS
 
    -- IRDA interface
 
    -- IRDA_TXD : out std_logic;                      -- IRDA Transmitter
    IRDA_RXD : in std_logic;                       -- IRDA Receiver
 
    -- SDRAM
    DRAM_BA_0,                                     -- Bank Address 0
    DRAM_BA_1,                                     -- Bank Address 0   
    DRAM_DQM_0,                                     -- Byte Data Mask 0
    DRAM_DQM_1,                                     -- Byte Data Mask 1
    DRAM_DQM_2,                                     -- Byte Data Mask 2
    DRAM_DQM_3,                                     -- Byte Data Mask 3
    DRAM_WE_N,                                     -- Write Enable
    DRAM_CAS_N,                                    -- Column Address Strobe
    DRAM_RAS_N,                                    -- Row Address Strobe
    DRAM_CS_N :   out std_logic;                   -- Chip Select
    DRAM_DQ : inout std_logic_vector(31 downto 0); -- Data Bus
    DRAM_ADDR : out std_logic_vector(12 downto 0); -- Address Bus 
    DRAM_CLK,                                      -- Clock
    DRAM_CKE : out std_logic;                      -- Clock Enable
 
    -- FLASH
    FL_DQ : inout std_logic_vector(7 downto 0);      -- Data bus
    FL_ADDR : out std_logic_vector(22 downto 0);     -- Address bus
	 FL_RY : in std_logic;
	 FL_WP_N,
    FL_WE_N,                                         -- Write Enable
    FL_RST_N,                                        -- Reset
    FL_OE_N,                                         -- Output Enable
    FL_CE_N : out std_logic;                         -- Chip Enable
 
    -- SRAM
    SRAM_DQ : inout std_logic_vector(15 downto 0); -- Data bus 16 Bits
    SRAM_ADDR : out std_logic_vector(SRAM_width - 1 downto 0); -- Address bus 18 Bits
    SRAM_UB_N,                                     -- High-byte Data Mask 
    SRAM_LB_N,                                     -- Low-byte Data Mask 
    SRAM_WE_N,                                     -- Write Enable
    SRAM_CE_N,                                     -- Chip Enable
    SRAM_OE_N : out std_logic;                     -- Output Enable
 
    -- SD card interface
    SD_DAT0 : in std_logic;      -- SD Card Data      SD "DAT 0/DataOut"
    SD_DAT1 : inout std_logic;      -- SD Card Data   SD "DAT 1"
    SD_DAT2 : inout std_logic;    -- SD Card Data 3   SD "DAT 2"
    SD_DAT3 : out std_logic;    -- SD Card Data 3    SD "DAT 3/nCS"    
	 SD_CMD : out std_logic;     -- SD Card Command   SD "CMD/DataIn"
    SD_CLK : out std_logic;     -- SD Card Clock     SD "CLK"
 
    -- PS/2 port
    PS2_DAT,                    -- Data
    PS2_CLK : inout std_logic;     -- Clock
	 PS2_DAT2,                    -- Data
    PS2_CLK2 : inout std_logic;     -- Clock
 
    -- VGA output
 	 VGA_SYNC_N,
	 VGA_CLK,
	 VGA_BLANK_N,
    VGA_HS,                                             -- H_SYNC
    VGA_VS : out std_logic;                             -- SYNC
    VGA_R,                                              -- Red[7:0]
    VGA_G,                                              -- Green[7:0]
    VGA_B : out std_logic_vector(7 downto 0);           -- Blue[7:0]
 
    -- Audio CODEC
    AUD_ADCLRCK : inout std_logic;                      -- ADC LR Clock
    AUD_ADCDAT : in std_logic;                          -- ADC Data
    AUD_DACLRCK : inout std_logic;                      -- DAC LR Clock
    AUD_DACDAT : out std_logic;                         -- DAC Data
    AUD_BCLK : inout std_logic;                         -- Bit-Stream Clock
    AUD_XCK : out std_logic;									  -- Chip Clock
    LCD_RS             : OUT    std_logic;
    LCD_EN             : OUT    std_logic;
    LCD_RW             : OUT    std_logic;
	 LCD_ON             : OUT    std_logic;
    LCD_BLON           : OUT    std_logic; -- lcd on DE2 do not support this signal
    LCD_DATA           : INOUT  STD_LOGIC_VECTOR(7 DOWNTO 0));
end Z80SOC;
 
architecture rtl of Z80SOC is
 
	component T80se
	generic(
		Mode : integer := 0;	-- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB
		T2Write : integer := 1;	-- 0 => WR_n active in T3, /=0 => WR_n active in T2
		IOWait : integer := 1	-- 0 => Siomngle cycle I/O, 1 => Std I/O cycle
	);
	port(
		RESET_n	: in std_logic;
		CLK_n		: in std_logic;
		CLKEN		: in std_logic;
		WAIT_n	: in std_logic;
		INT_n		: in std_logic;
		NMI_n		: in std_logic;
		BUSRQ_n	: in std_logic;
		M1_n		: out std_logic;
		MREQ_n	: out std_logic;
		IORQ_n	: out std_logic;
		RD_n		: out std_logic;
		WR_n		: out std_logic;
		RFSH_n	: out std_logic;
		HALT_n	: out std_logic;
		BUSAK_n	: out std_logic;
		A			: out std_logic_vector(15 downto 0);
		DI			: in std_logic_vector(7 downto 0);
		DO			: out std_logic_vector(7 downto 0)
	);
	end component;
 
	component rom
	port (
		clock	: in std_logic;
		address	: in std_logic_vector(13 downto 0);
		q	: out std_logic_vector(7 downto 0));
	end component;
 
    component clk_div
    PORT
    (
        clock_in_50Mhz          : IN    STD_LOGIC;
        clock_25MHz             : OUT   STD_LOGIC;
		clock_10MHz             : OUT   STD_LOGIC;
		clock_357MHz            : OUT   STD_LOGIC;
        clock_1MHz              : OUT   STD_LOGIC;
        clock_100KHz            : OUT   STD_LOGIC;
        clock_10KHz             : OUT   STD_LOGIC;
        clock_1KHz              : OUT   STD_LOGIC;
        clock_100Hz             : OUT   STD_LOGIC;
        clock_10Hz              : OUT   STD_LOGIC;
        clock_1Hz               : OUT   STD_LOGIC);
    end component;
 
	component decoder_7seg
	port (
		NUMBER		: in   std_logic_vector(3 downto 0);
		HEX_DISP		: out  std_logic_vector(6 downto 0));
	end component;
 
	component ps2kbd
	port (	
			keyboard_clk	: inout std_logic;
			keyboard_data	: inout std_logic;
			clock				: in std_logic;
			clkdelay			: in std_logic;
			reset				: in std_logic;
			read				: in std_logic;
			scan_ready		: out std_logic;
			ps2_ascii_code	: out std_logic_vector(7 downto 0));
	end component;
 
	component vram
	port
	(
		rdaddress		: IN STD_LOGIC_VECTOR (12 DOWNTO 0);
		wraddress		: IN STD_LOGIC_VECTOR (12 DOWNTO 0);
		rdclock			: IN STD_LOGIC;
		wrclock			: IN STD_LOGIC;
		data			: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		wren			: IN STD_LOGIC;
		q				: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
	);
	end component;
 
	component charram
	port (
		data			: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		rdaddress		: IN STD_LOGIC_VECTOR (10 DOWNTO 0);
		rdclock			: IN STD_LOGIC ;
		wraddress		: IN STD_LOGIC_VECTOR (10 DOWNTO 0);
		wrclock			: IN STD_LOGIC;
		wren			: IN STD_LOGIC;
		q				: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
	end component;
 
	COMPONENT video
	PORT (		
		CLOCK_25		: IN STD_LOGIC;
		VRAM_DATA		: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
		VRAM_ADDR		: OUT STD_LOGIC_VECTOR(13 DOWNTO 0);
		VRAM_CLOCK		: OUT STD_LOGIC;
		VRAM_WREN		: OUT STD_LOGIC;
		CRAM_DATA		: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
		CRAM_ADDR		: OUT STD_LOGIC_VECTOR(10 DOWNTO 0);
		CRAM_WEB		: OUT STD_LOGIC;
		VGA_R,
		VGA_G,
		VGA_B			: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
		VGA_HS,
		VGA_VS			: OUT STD_LOGIC);
	END COMPONENT;
 
	COMPONENT PLL_Clocks
	PORT
	(
		inclk0		: IN STD_LOGIC  := '0';
		c0			: OUT STD_LOGIC;
		c1			: OUT STD_LOGIC;
		c2			: OUT STD_LOGIC
	);
	END COMPONENT;
 
	COMPONENT LCD
   PORT( 
      reset             : IN     std_logic;  -- Map this Port to a Switch within your [Port Declarations / Pin Planer]  
      CLOCK_50          : IN     std_logic;  -- Using the DE2 50Mhz Clk, in order to Genreate the 400Hz signal... clk_count_400hz reset count value must be set to:  <= x"0F424"
      LCD_RS            : OUT    std_logic;
      LCD_EN            : OUT    std_logic;
      LCD_RW            : OUT    std_logic;
      LCD_ON            : OUT    std_logic;
      LCD_BLON          : OUT    std_logic;
      LCD_DATA         	: INOUT 	STD_LOGIC_VECTOR(7 DOWNTO 0);
		lcd_on_sig			: IN		STD_LOGIC;
	   next_char			: IN 		STD_LOGIC_VECTOR(7 DOWNTO 0);
		char_count			: OUT		STD_LOGIC_VECTOR(4 downto 0);
		clk400hz				: OUT		STD_LOGIC);
	END COMPONENT;
 
	signal MREQ_n	: std_logic;
	signal IORQ_n	: std_logic;
	signal RD_n		: std_logic;
	signal WR_n		: std_logic;
	signal MWr_n	: std_logic;
	signal Rst_n_s	: std_logic;
	signal Clk_Z80	: std_logic;
	signal DI_CPU	: std_logic_vector(7 downto 0);
	signal DO_CPU	: std_logic_vector(7 downto 0);
	signal A		: std_logic_vector(15 downto 0);
	signal One		: std_logic;
 
	signal D_ROM	: std_logic_vector(7 downto 0);
	signal rom_data : std_logic_vector(7 downto 0);
	signal rom_wren	: std_logic;
 
	signal clk_count_400hz: std_logic_vector(19 downto 0);
	signal clk100mhz	: std_logic;
	signal clk25mhz	: std_logic;
	signal clk1mhz		: std_logic;
	signal clk10mhz	: std_logic;
	signal clk100hz	: std_logic;
	signal clk10hz		: std_logic;
	signal clk1hz		: std_logic;
	signal clk357mhz   : std_logic;
 
 
	signal HEX_DISP0	: std_logic_vector(6 downto 0);
	signal HEX_DISP1	: std_logic_vector(6 downto 0);
	signal HEX_DISP2	: std_logic_vector(6 downto 0);
	signal HEX_DISP3	: std_logic_vector(6 downto 0);
	signal HEX_DISP4	: std_logic_vector(6 downto 0);
	signal HEX_DISP5	: std_logic_vector(6 downto 0);
	signal HEX_DISP6	: std_logic_vector(6 downto 0);
	signal HEX_DISP7	: std_logic_vector(6 downto 0);
 
	signal NUMBER0		: std_logic_vector(3 downto 0);
	signal NUMBER1		: std_logic_vector(3 downto 0);	
	signal NUMBER2		: std_logic_vector(3 downto 0);
	signal NUMBER3		: std_logic_vector(3 downto 0);
	signal NUMBER4		: std_logic_vector(3 downto 0);
	signal NUMBER5		: std_logic_vector(3 downto 0);	
	signal NUMBER6		: std_logic_vector(3 downto 0);
	signal NUMBER7		: std_logic_vector(3 downto 0);
 
	--signal GPIO_0_buf_in	: std_logic_vector(35 downto 0);
	--signal GPIO_1_buf_in	: std_logic_vector(35 downto 0);
 
	signal 	vram_addra		: std_logic_vector(15 downto 0);
	signal 	vram_addrb		: std_logic_vector(13 downto 0);
	signal 	vram_dina		: std_logic_vector(7 downto 0);
	signal 	vram_dinb		: std_logic_vector(7 downto 0);
	signal 	vram_douta		: std_logic_vector(7 downto 0);
	signal 	vram_doutb		: std_logic_vector(7 downto 0);
	signal  vram_wea		: std_logic;
	signal  vram_web		: std_logic;
	signal  vram_clka		: std_logic;
	signal  vram_clkb		: std_logic;
 
--	signal vram_douta_reg	: std_logic_vector(7 downto 0);	
 
	signal cram_addra		: std_logic_vector(15 downto 0);
	signal cram_addrb		: std_logic_vector(15 downto 0);
	signal cram_dina		: std_logic_vector(7 downto 0);
	signal cram_dinb		: std_logic_vector(7 downto 0);
	signal cram_douta		: std_logic_vector(7 downto 0);
	signal cram_doutb		: std_logic_vector(7 downto 0);
	signal cram_wea			: std_logic;
	signal cram_web			: std_logic;
	signal cram_clka		: std_logic;
	signal cram_clkb		: std_logic;
 
	-- PS/2 Keyboard
	signal ps2_read				: std_logic;
	signal ps2_scan_ready		: std_logic;
	signal ps2_ascii_sig		: std_logic_vector(7 downto 0);
	signal ps2_ascii_reg1		: std_logic_vector(7 downto 0);
	signal ps2_ascii_reg		: std_logic_vector(7 downto 0);
 
	-- LCD signals
	type character_string is array ( 0 to 31 ) of STD_LOGIC_VECTOR( 7 downto 0 );
	signal lcdvram          		: character_string;
	signal lcdaddr_w_sig		: std_logic_vector(15 downto 0);
	signal lcdaddr_sig				: std_logic_vector(15 downto 0) := LCD_value;
	signal clk400hz					: std_logic;
	signal char_count_sig			: std_logic_vector(4 downto 0);
	signal next_char_sig				: std_logic_vector(7 downto 0);
	signal temp							: std_logic;
 
	signal Z80SOC_Arch_reg			: std_logic_vector(2 downto 0)  := Z80SOC_Arch_value;   -- "000" = DE1, "001" = S3E, "010" = DE2115
	signal RAMTOP_reg					: std_logic_vector(15 downto 0) := RAMTOP_value;
	signal RAMBOTT_reg				: std_logic_vector(15 downto 0) := RAMBOTT_value;
	signal LCD_reg						: std_logic_vector(15 downto 0) := LCD_value;	
	signal VRAM_reg					: std_logic_vector(15 downto 0) := VRAM_value;
	signal STACK_reg					: std_logic_vector(15 downto 0) := STACK_value;
	signal CHARRAM_reg				: std_logic_vector(15 downto 0) := CHARRAM_value;
	signal VRAMNXTCHAR_reg			: std_logic_vector(15 downto 0);
	signal CURX_reg					: std_logic_vector(7 downto 0);
	signal CURY_reg					: std_logic_vector(7 downto 0);
	signal STDOUT_reg					: std_logic_vector(7 downto 0);	
	signal LCDON_reg					: std_logic;
begin
 
	-- required signals for DE2-115
	VGA_BLANK_N <= '1';
	VGA_CLK <= clk25mhz;
	-- 
	STDOUT_reg <= DO_CPU when (A = x"57CD" and Wr_n = '0' and MReq_n = '0');
	CURX_reg   <= DO_CPU when (A = x"57CF" and Wr_n = '0' and MReq_n = '0');
	CURY_reg   <= DO_CPU when (A = x"57CE" and Wr_n = '0' and MReq_n = '0');
	VRAMNXTCHAR_reg(7 DOWNTO 0)  <= DO_CPU when (A = x"57D0" and Wr_n = '0' and MReq_n = '0');
	VRAMNXTCHAR_reg(15 DOWNTO 8) <= DO_CPU when (A = x"57D1" and Wr_n = '0' and MReq_n = '0');
 
	-- Modo Turbo 10Mhz
	Clk_Z80 <= clk357mhz when SW(16) = '0' else clk10mhz;
	LEDR(17) <= SW(17);	
	LEDR(16) <= SW(16);
 
	--Z80SOC_Arch_reg <= Z80SOC_Arch_addr;	-- "000" = DE1, "001" = S3E, "010" = DE2115
	Rst_n_s <= not SW(17);
 
	HEX0 <= HEX_DISP0;
	HEX1 <= HEX_DISP1;
	HEX2 <= HEX_DISP2;
	HEX3 <= HEX_DISP3;
	HEX4 <= HEX_DISP4;
	HEX5 <= HEX_DISP5;
	HEX6 <= HEX_DISP6;
	HEX7 <= HEX_DISP7;
 
--	Write into VRAM and System Variables
	vram_addra <= A - VRAM_value;
	vram_dina  <= DO_CPU;
	vram_wea   <= '0' when (A >= VRAM_value and A < LCD_value and Wr_n = '0' and MReq_n = '0') else 
             	  '1';
 
-- Write into char ram
	cram_addra	<= A - CHARRAM_value;
	cram_dina	<= DO_CPU;
	cram_wea 	<= '0' when (A >= CHARRAM_value and A < RAMBOTT_value and Wr_n = '0' and MReq_n = '0') else '1';
 
-- Write into LCD video ram
	--LCD_ON <= KEY(3);
	lcdvram(CONV_INTEGER(A - LCD_value)) <= DO_CPU when A >= LCD_value and (A < LCD_value + 32) and Wr_n = '0' and MReq_n = '0';
 
	-- SRAM control signals
	-- SRAM will store data for video, characters patterns and RAM (only on DE1 version)
	-- Due to limitation in dual-port block rams on this platform
 
	SRAM_ADDR(15 downto 0) <= A - RAMBOTT_value;
	SRAM_DQ(7 downto 0) <= DO_CPU when (Wr_n = '0' and MREQ_n = '0' and A >= RAMBOTT_value) else (others => 'Z');                      
	SRAM_WE_N <= '0' when (Wr_n = '0' and MREQ_n = '0' and A >= RAMBOTT_value) else '1';            
	SRAM_OE_N <= '0' when (Rd_n = '0' and MREQ_n = '0' and A >= RAMBOTT_value) else '1';
	SRAM_DQ(15 downto 8) <= (others => 'Z');
	SRAM_ADDR(19 downto 16) <= "0000";
	SRAM_UB_N <= '1';
	SRAM_LB_N <= '0';
	SRAM_CE_N <= '0';
 
	-- Input to Z80
	DI_CPU <= ("00000" & Z80SOC_Arch_reg) when (Rd_n = '0' and MREQ_n = '0' and A = Z80SOC_Arch_addr) else
			ps2_ascii_reg when (Rd_n = '0' and MREQ_n = '0' and A = KEYPRESS_addr) else
			RAMTOP_reg(7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = RAMTOP_addr) else
			RAMTOP_reg(15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = RAMTOP_addr + 1)) else
			RAMBOTT_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = RAMBOTT_addr) else
			RAMBOTT_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = RAMBOTT_addr + 1)) else
			LCD_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = LCD_addr) else
			LCD_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = LCD_addr + 1)) else
			VRAM_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = VRAM_addr) else
			VRAM_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = VRAM_addr + 1)) else
			CHARRAM_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = CHARRAM_addr) else
			CHARRAM_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = CHARRAM_addr + 1)) else
			STACK_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = STACK_addr) else
			STACK_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = STACK_addr + 1)) else
			VRAMNXTCHAR_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = x"57D0") else
			VRAMNXTCHAR_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and A = x"57D1") else
			CURX_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CF") else
			CURY_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CE") else
			STDOUT_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CD") else			
			D_ROM when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A < VRAM_value) else
			--vram_doutb when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and (A >= VRAM_value + 4800) and A < LCD_value) else
			SRAM_DQ(7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A >= RAMBOTT_value) else
			SW(7 downto 0) when (IORQ_n = '0' and MREQ_n = '1' and Rd_n = '0' and A(7 downto 0) = x"20") else
			SW(15 downto 8) when (IORQ_n = '0' and MREQ_n = '1' and Rd_n = '0' and A(7 downto 0) = x"21") else			
			("0000" & not KEY) when (IORQ_n = '0' and MREQ_n = '1' and Rd_n = '0' and A(7 downto 0) = x"30") else
			--ps2_ascii_reg when (IORQ_n = '0' and MREQ_n = '1' and Rd_n = '0' and A(7 downto 0) = x"80") else
			"ZZZZZZZZ";
 
	-- Process to latch leds and hex displays
	pinout_process: process(Clk_Z80)
	variable NUMBER0_sig	: std_logic_vector(3 downto 0);
	variable NUMBER1_sig	: std_logic_vector(3 downto 0);	
	variable NUMBER2_sig	: std_logic_vector(3 downto 0);
	variable NUMBER3_sig	: std_logic_vector(3 downto 0);
	variable NUMBER4_sig	: std_logic_vector(3 downto 0);
	variable NUMBER5_sig	: std_logic_vector(3 downto 0);	
	variable NUMBER6_sig	: std_logic_vector(3 downto 0);
	variable NUMBER7_sig	: std_logic_vector(3 downto 0);	
	variable LEDG_sig		: std_logic_vector(7 downto 0);
	variable LEDR_sig		: std_logic_vector(15 downto 0);
	--variable GPIO_0_buf_out: std_logic_vector(35 downto 0);
	--variable GPIO_1_buf_out: std_logic_vector(35 downto 0);
	begin		
		if Clk_Z80'event and Clk_Z80 = '1' then
		  if IORQ_n = '0' and MREQ_n = '1' and Wr_n = '0' then
			-- LEDG
			if A(7 downto 0) = x"01" then
				LEDG_sig := DO_CPU;
			-- LEDR
			elsif A(7 downto 0) = x"02" then
				LEDR_sig(7 downto 0) := DO_CPU;
			elsif A(7 downto 0) = x"03" then
				LEDR_sig(15 downto 8) := DO_CPU;				
			-- HEX1 and HEX0
			elsif A(7 downto 0) = x"10" then
				NUMBER0_sig := DO_CPU(3 downto 0);
				NUMBER1_sig := DO_CPU(7 downto 4);
			-- HEX3 and HEX2
			elsif A(7 downto 0) = x"11" then
				NUMBER2_sig := DO_CPU(3 downto 0);
				NUMBER3_sig := DO_CPU(7 downto 4);
			-- HEX5 and HEX4
			elsif A(7 downto 0) = x"12" then
				NUMBER4_sig := DO_CPU(3 downto 0);
				NUMBER5_sig := DO_CPU(7 downto 4);
			-- HEX7 and HEX6
			elsif A(7 downto 0) = x"13" then
				NUMBER6_sig := DO_CPU(3 downto 0);
				NUMBER7_sig := DO_CPU(7 downto 4);
			elsif A(7 downto 0) = x"15" then
				LCDON_reg <= DO_CPU(0);
			end if;
		  end if;
		end if;		
		-- Latches the signals
		NUMBER0 <= NUMBER0_sig;
		NUMBER1 <= NUMBER1_sig;
		NUMBER2 <= NUMBER2_sig;
		NUMBER3 <= NUMBER3_sig;
		NUMBER4 <= NUMBER4_sig;
		NUMBER5 <= NUMBER5_sig;
		NUMBER6 <= NUMBER6_sig;
		NUMBER7 <= NUMBER7_sig;		
		LEDR(15 downto 0) <= LEDR_sig;
		LEDG(7 downto 0) <= LEDG_sig;
	end process;		
 
	-- the following three processes deals with different clock domain signals
	ps2_process1: process(CLOCK_50)
	begin
		if CLOCK_50'event and CLOCK_50 = '1' then
			if ps2_read = '1' then
				if ps2_ascii_sig /= x"FF" then
					ps2_read <= '0';
					ps2_ascii_reg1 <= "00000000";
				end if;
			elsif ps2_scan_ready = '1' then
				if ps2_ascii_sig = x"FF" then
					ps2_read <= '1';
				else
					ps2_ascii_reg1 <= ps2_ascii_sig;
				end if;
			end if;
		end if;
	end process;
 
	ps2_process2: process(Clk_Z80)
	begin
		if Clk_Z80'event and Clk_Z80 = '1' then
			ps2_ascii_reg <= ps2_ascii_reg1;
		end if;
	end process;
 
	lcd_printchar: process(char_count_sig)
	begin
		next_char_sig <= lcdvram(CONV_INTEGER(char_count_sig));
	end process;
 
	One <= '1';
	z80_inst: T80se
		port map (
			M1_n => open,
			MREQ_n => MREQ_n,
			IORQ_n => IORQ_n,
			RD_n => Rd_n,
			WR_n => Wr_n,
			RFSH_n => open,
			HALT_n => open,
			WAIT_n => One,
			INT_n => One,
			NMI_n => One,
			RESET_n => Rst_n_s,
			BUSRQ_n => One,
			BUSAK_n => open,
			CLK_n => Clk_Z80,
			CLKEN => One,
			A => A,
			DI => DI_CPU,
			DO => DO_CPU
		);
 
	video_inst: video port map (
			CLOCK_25       => clk25mhz,
			VRAM_DATA		=> vram_doutb,
			VRAM_ADDR		=> vram_addrb(13 downto 0),
			VRAM_CLOCK		=> vram_clkb,
			VRAM_WREN		=> vram_web,
			CRAM_DATA		=> cram_doutb,
			CRAM_ADDR		=> cram_addrb(10 downto 0),
			CRAM_WEB		=> cram_web,
			VGA_R			=> VGA_R(7 downto 4),
			VGA_G			=> VGA_G(7 downto 4),
			VGA_B			=> VGA_B(7 downto 4),
			VGA_HS			=> VGA_HS,
			VGA_VS			=> VGA_VS
	);
 
	vram_inst : vram
		port map (
		rdclock	 	=> vram_clkb,
		wrclock 	=> Clk_Z80,	
		wren	 	=> not vram_wea, -- inverted logic so code is similar to SRAM and S3E port
		wraddress	=> vram_addra(12 downto 0),
		rdaddress	=> vram_addrb(12 downto 0),
		data	 	=> vram_dina,
		q	 		=> vram_doutb
	);
 
	cram: charram
		port map (	
		rdaddress	=> cram_addrb(10 downto 0),
		wraddress	=> cram_addra(10 downto 0),
		wrclock		=> Clk_Z80,
		rdclock		=> vram_clkb,
		data		=> cram_dina,
		q			=> cram_doutb,
		wren		=> NOT cram_wea		
	);
 
	rom_inst: rom
		port map (
			clock => clk25mhz,
			address	=> A(13 downto 0),
			q 	=> D_ROM
		);
 
    clkdiv_inst: clk_div
    port map (
        clock_in_50mhz          => CLOCK_50,
        clock_25mhz             => clk25mhz,
        clock_10MHz             => clk10mhz,
        clock_357Mhz            => clk357mhz,
        clock_1MHz              => clk1mhz,
        clock_100KHz            => open,
        clock_10KHz             => open,
        clock_1KHz              => open,
        clock_100Hz             => clk100hz,
        clock_10Hz              => clk10hz,
        clock_1Hz               => clk1hz
    );
 
	DISPHEX0 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER0,
		HEX_DISP		=>	HEX_DISP0
	);		
 
	DISPHEX1 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER1,
		HEX_DISP		=>	HEX_DISP1
	);		
 
	DISPHEX2 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER2,
		HEX_DISP		=>	HEX_DISP2
	);		
 
	DISPHEX3 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER3,
		HEX_DISP		=>	HEX_DISP3
	);
 
		DISPHEX4 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER4,
		HEX_DISP		=>	HEX_DISP4
	);		
 
	DISPHEX5 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER5,
		HEX_DISP		=>	HEX_DISP5
	);		
 
	DISPHEX6 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER6,
		HEX_DISP		=>	HEX_DISP6
	);		
 
	DISPHEX7 : decoder_7seg PORT MAP (
		NUMBER			=>	NUMBER7,
		HEX_DISP		=>	HEX_DISP7
	);
 
	ps2_kbd_inst : ps2kbd PORT MAP (
		keyboard_clk	=> PS2_CLK,
		keyboard_data	=> PS2_DAT,
		clock			=> CLOCK_50,
		clkdelay		=> clk100hz,
		reset			=> Rst_n_s,
		read			=> ps2_read,
		scan_ready		=> ps2_scan_ready,
		ps2_ascii_code	=> ps2_ascii_sig
	);
 
	  -- Component instantiation
	lcd_inst: lcd PORT MAP (
		reset			=> Rst_n_s,
		CLOCK_50		=> CLOCK_50,
		LCD_RS		=> LCD_RS,
		LCD_EN		=> LCD_EN,
		LCD_RW		=> LCD_RW,
		LCD_ON		=> LCD_ON,
		LCD_DATA		=> LCD_DATA(7 DOWNTO 0),
		lcd_on_sig	=> LCDON_reg,
		next_char	=> next_char_sig,
		char_count	=> char_count_sig,
		clk400hz		=> clk400hz
	);
 
	--
	UART_TXD <= 'Z';
	DRAM_ADDR <= (others => '0');
	DRAM_DQM_0 <= '0';
	DRAM_DQM_1 <= '0';
	DRAM_DQM_2 <= '0';
	DRAM_DQM_3 <= '0';	
	DRAM_WE_N <= '1';
	DRAM_CAS_N <= '1';
	DRAM_RAS_N <= '1';
	DRAM_CS_N <= '1';
	DRAM_BA_0 <= '0';
	DRAM_BA_1 <= '0';
	DRAM_CLK <= '0';
	DRAM_CKE <= '0';
	FL_ADDR <= (others => '0');
	FL_WE_N <= '1';
	FL_RST_N <= '0';
	FL_OE_N <= '1';
	FL_CE_N <= '1';
	AUD_DACDAT <= '0';
	AUD_XCK <= '0';
	-- Set all bidirectional ports to tri-state
	DRAM_DQ     <= (others => 'Z');
	FL_DQ       <= (others => 'Z');
 
	AUD_ADCLRCK <= 'Z';
	AUD_DACLRCK <= 'Z';
	AUD_BCLK    <= 'Z';
	--GPIO_0 <= (others => 'Z');
	--GPIO_1 <= (others => 'Z');	
end;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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