URL
https://opencores.org/ocsvn/z80soc/z80soc/trunk
Subversion Repositories z80soc
[/] [z80soc/] [trunk/] [V0.7.3/] [DE2115/] [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 isport(-- ClocksCLOCK_50 : in std_logic; -- 50 MHz-- Buttons and switchesKEY : in std_logic_vector(3 downto 0); -- Push buttonsSW : in std_logic_vector(17 downto 0); -- Switches-- LED displaysHEX0, 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 LEDsLEDR : out std_logic_vector(17 downto 0); -- Red LEDs-- RS-232 interfaceUART_TXD : out std_logic; -- UART transmitterUART_RXD : in std_logic; -- UART receiverUART_RTS : in std_logic; -- UART RTSUART_CTS : in std_logic; -- UART CTS-- IRDA interface-- IRDA_TXD : out std_logic; -- IRDA TransmitterIRDA_RXD : in std_logic; -- IRDA Receiver-- SDRAMDRAM_BA_0, -- Bank Address 0DRAM_BA_1, -- Bank Address 0DRAM_DQM_0, -- Byte Data Mask 0DRAM_DQM_1, -- Byte Data Mask 1DRAM_DQM_2, -- Byte Data Mask 2DRAM_DQM_3, -- Byte Data Mask 3DRAM_WE_N, -- Write EnableDRAM_CAS_N, -- Column Address StrobeDRAM_RAS_N, -- Row Address StrobeDRAM_CS_N : out std_logic; -- Chip SelectDRAM_DQ : inout std_logic_vector(31 downto 0); -- Data BusDRAM_ADDR : out std_logic_vector(12 downto 0); -- Address BusDRAM_CLK, -- ClockDRAM_CKE : out std_logic; -- Clock Enable-- FLASHFL_DQ : inout std_logic_vector(7 downto 0); -- Data busFL_ADDR : out std_logic_vector(22 downto 0); -- Address busFL_RY : in std_logic;FL_WP_N,FL_WE_N, -- Write EnableFL_RST_N, -- ResetFL_OE_N, -- Output EnableFL_CE_N : out std_logic; -- Chip Enable-- SRAMSRAM_DQ : inout std_logic_vector(15 downto 0); -- Data bus 16 BitsSRAM_ADDR : out std_logic_vector(SRAM_width - 1 downto 0); -- Address bus 18 BitsSRAM_UB_N, -- High-byte Data MaskSRAM_LB_N, -- Low-byte Data MaskSRAM_WE_N, -- Write EnableSRAM_CE_N, -- Chip EnableSRAM_OE_N : out std_logic; -- Output Enable-- SD card interfaceSD_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 portPS2_DAT, -- DataPS2_CLK : inout std_logic; -- ClockPS2_DAT2, -- DataPS2_CLK2 : inout std_logic; -- Clock-- VGA outputVGA_SYNC_N,VGA_CLK,VGA_BLANK_N,VGA_HS, -- H_SYNCVGA_VS : out std_logic; -- SYNCVGA_R, -- Red[7:0]VGA_G, -- Green[7:0]VGA_B : out std_logic_vector(7 downto 0); -- Blue[7:0]-- Audio CODECAUD_ADCLRCK : inout std_logic; -- ADC LR ClockAUD_ADCDAT : in std_logic; -- ADC DataAUD_DACLRCK : inout std_logic; -- DAC LR ClockAUD_DACDAT : out std_logic; -- DAC DataAUD_BCLK : inout std_logic; -- Bit-Stream ClockAUD_XCK : out std_logic; -- Chip ClockLCD_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 signalLCD_DATA : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));end Z80SOC;architecture rtl of Z80SOC iscomponent T80segeneric(Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GBT2Write : integer := 1; -- 0 => WR_n active in T3, /=0 => WR_n active in T2IOWait : 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 romport (clock : in std_logic;address : in std_logic_vector(13 downto 0);q : out std_logic_vector(7 downto 0));end component;component Clock_357MhzPORT (clock_50Mhz : IN STD_LOGIC;clock_357Mhz : OUT STD_LOGIC);end component;component clk_divPORT(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_7segport (NUMBER : in std_logic_vector(3 downto 0);HEX_DISP : out std_logic_vector(6 downto 0));end component;component ps2kbdport (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 vramport(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 charram2kport (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 videoPORT (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_ClocksPORT(inclk0 : IN STD_LOGIC := '0';c0 : OUT STD_LOGIC;c1 : OUT STD_LOGIC;c2 : OUT STD_LOGIC);END COMPONENT;COMPONENT LCDPORT(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 Keyboardsignal 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 signalstype 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" = DE2115signal 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-115VGA_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 10MhzClk_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" = DE2115Rst_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 Variablesvram_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 ramcram_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 platformSRAM_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 Z80DI_CPU <= ("00000" & Z80SOC_Arch_reg) when (Rd_n = '0' and MREQ_n = '0' and A = Z80SOC_Arch_addr) elseps2_ascii_reg when (Rd_n = '0' and MREQ_n = '0' and A = KEYPRESS_addr) elseRAMTOP_reg(7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = RAMTOP_addr) elseRAMTOP_reg(15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = RAMTOP_addr + 1)) elseRAMBOTT_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = RAMBOTT_addr) elseRAMBOTT_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = RAMBOTT_addr + 1)) elseLCD_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = LCD_addr) elseLCD_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = LCD_addr + 1)) elseVRAM_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = VRAM_addr) elseVRAM_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = VRAM_addr + 1)) elseCHARRAM_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = CHARRAM_addr) elseCHARRAM_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = CHARRAM_addr + 1)) elseSTACK_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = STACK_addr) elseSTACK_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and (A = STACK_addr + 1)) elseVRAMNXTCHAR_reg (7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and A = x"57D0") elseVRAMNXTCHAR_reg (15 downto 8) when (Rd_n = '0' and MREQ_n = '0' and A = x"57D1") elseCURX_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CF") elseCURY_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CE") elseSTDOUT_reg when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A = x"57CD") elseD_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) elseSRAM_DQ(7 downto 0) when (Rd_n = '0' and MREQ_n = '0' and IORQ_n = '1' and A >= RAMBOTT_value) elseSW(7 downto 0) when (IORQ_n = '0' and MREQ_n = '1' and Rd_n = '0' and A(7 downto 0) = x"20") elseSW(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 displayspinout_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);beginif Clk_Z80'event and Clk_Z80 = '1' thenif IORQ_n = '0' and MREQ_n = '1' and Wr_n = '0' then-- LEDGif A(7 downto 0) = x"01" thenLEDG_sig := DO_CPU;-- LEDRelsif A(7 downto 0) = x"02" thenLEDR_sig(7 downto 0) := DO_CPU;elsif A(7 downto 0) = x"03" thenLEDR_sig(15 downto 8) := DO_CPU;-- HEX1 and HEX0elsif A(7 downto 0) = x"10" thenNUMBER0_sig := DO_CPU(3 downto 0);NUMBER1_sig := DO_CPU(7 downto 4);-- HEX3 and HEX2elsif A(7 downto 0) = x"11" thenNUMBER2_sig := DO_CPU(3 downto 0);NUMBER3_sig := DO_CPU(7 downto 4);-- HEX5 and HEX4elsif A(7 downto 0) = x"12" thenNUMBER4_sig := DO_CPU(3 downto 0);NUMBER5_sig := DO_CPU(7 downto 4);-- HEX7 and HEX6elsif A(7 downto 0) = x"13" thenNUMBER6_sig := DO_CPU(3 downto 0);NUMBER7_sig := DO_CPU(7 downto 4);elsif A(7 downto 0) = x"15" thenLCDON_reg <= DO_CPU(0);end if;end if;end if;-- Latches the signalsNUMBER0 <= 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 signalsps2_process1: process(CLOCK_50)beginif CLOCK_50'event and CLOCK_50 = '1' thenif ps2_read = '1' thenif ps2_ascii_sig /= x"FF" thenps2_read <= '0';ps2_ascii_reg1 <= "00000000";end if;elsif ps2_scan_ready = '1' thenif ps2_ascii_sig = x"FF" thenps2_read <= '1';elseps2_ascii_reg1 <= ps2_ascii_sig;end if;end if;end if;end process;ps2_process2: process(Clk_Z80)beginif Clk_Z80'event and Clk_Z80 = '1' thenps2_ascii_reg <= ps2_ascii_reg1;end if;end process;lcd_printchar: process(char_count_sig)beginnext_char_sig <= lcdvram(CONV_INTEGER(char_count_sig));end process;One <= '1';z80_inst: T80seport 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 : vramport map (rdclock => vram_clkb,wrclock => Clk_Z80,wren => not vram_wea, -- inverted logic so code is similar to SRAM and S3E portwraddress => vram_addra(12 downto 0),rdaddress => vram_addrb(12 downto 0),data => vram_dina,q => vram_doutb);cram: charram2kport 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: romport 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 clockPLL_Clocks_inst: PLL_Clocksport map (inclk0 => CLOCK_50,c0 => clk25mhz,c1 => clk10mhz,c2 => clk100mhz);clkdiv_inst: clk_divport 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 instantiationlcd_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-stateDRAM_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;
