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

Subversion Repositories z80soc

[/] [z80soc/] [trunk/] [V0.7.3/] [DE1/] [vhdl/] [z80soc.vhd.bak] - 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 Clock_357Mhz
        PORT (
                clock_50Mhz                             : IN    STD_LOGIC;
                clock_357Mhz                    : OUT   STD_LOGIC);
        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 charram2k
        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: charram2k
                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
                );

        -- PLL below is used to generate the pixel clock frequency
        -- Uses DE1 50Mhz clock for PLL's input clock
        PLL_Clocks_inst: PLL_Clocks 
        port map (
                inclk0   => CLOCK_50,
                c0                      => clk25mhz,
                c1                      => clk10mhz,
                c2                      => clk100mhz
        );
 
    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.