URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/System09/branches/mkfiles_rev1/rtl/System09_BurchED_B3
- from Rev 26 to Rev 66
- ↔ Reverse comparison
Rev 26 → Rev 66
/System09_BurchED_B3.ucf
0,0 → 1,321
#### UCF file created by Project Navigator |
# |
# PIN DEFINITION FOR BURCHED SPARTAN2 B3 |
# XC2S200. |
# |
# B3 Connector J3 |
# B5-X300 Connector C |
# |
#NET "b5_clk" LOC = "p185"; #pin 2 (Global clock input) |
NET "bus_addr<0>" LOC = "p181"; #pin 3 |
NET "bus_addr<1>" LOC = "p187"; #pin 4 |
NET "bus_addr<2>" LOC = "p188"; #pin 5 |
NET "bus_addr<3>" LOC = "p189"; #pin 6 |
NET "bus_addr<4>" LOC = "p191"; #pin 7 |
NET "bus_addr<5>" LOC = "p192"; #pin 8 |
NET "bus_addr<6>" LOC = "p193"; #pin 9 |
NET "bus_addr<7>" LOC = "p194"; #pin 10 |
NET "bus_addr<8>" LOC = "p195"; #pin 11 |
NET "bus_addr<9>" LOC = "p199"; #pin 12 |
NET "bus_addr<10>" LOC = "p200"; #pin 13 |
NET "bus_addr<11>" LOC = "p201"; #pin 14 |
NET "bus_addr<12>" LOC = "p202"; #pin 15 |
NET "bus_addr<13>" LOC = "p203"; #pin 16 |
NET "bus_addr<14>" LOC = "p204"; #pin 17 |
NET "bus_addr<15>" LOC = "p205"; #pin 18 |
NET "bus_csn" LOC = "p206"; #pin 19 |
# |
# B3 Connector J4 |
# B5-X300 Connector D |
# |
#NET "GCK2" LOC = "p182"; #pin 2 (Global clock input) |
NET "bus_clk" LOC = "p160"; #pin 3 |
NET "bus_reset" LOC = "p161"; #pin 4 |
#NET "bus_hold" LOC = "p162"; #pin 5 |
#NET "bus_irq" LOC = "p163"; #pin 6 |
NET "bus_addr<16>" LOC = "p164"; #pin 7 |
NET "bus_addr<17>" LOC = "p165"; #pin 8 |
NET "bus_addr<18>" LOC = "p166"; #pin 9 |
NET "bus_addr<19>" LOC = "p167"; #pin 10 |
NET "bus_data<0>" LOC = "p168"; #pin 11 |
NET "bus_data<1>" LOC = "p172"; #pin 12 |
NET "bus_data<2>" LOC = "p173"; #pin 13 |
NET "bus_data<3>" LOC = "p174"; #pin 14 |
NET "bus_data<4>" LOC = "p175"; #pin 15 |
NET "bus_data<5>" LOC = "p176"; #pin 16 |
NET "bus_data<6>" LOC = "p178"; #pin 17 |
NET "bus_data<7>" LOC = "p179"; #pin 18 |
NET "bus_rw" LOC = "p180"; #pin 19 |
# |
# Connector J3 |
# |
# For B5-Compact-Flash: |
# |
#NET "GCK3" LOC = "P185"; #J2-2 (Global Clock input) |
#NET "IO" LOC = "P181"; #J2-3 |
#NET "IO" LOC = "P187"; #J2-4 |
#NET "IO" LOC = "P188"; #J2-5 |
#NET "cf_a<2>" LOC = "P189"; #J2-6 |
#NET "cf_a<1>" LOC = "P191"; #J2-7 |
#NET "cf_a<0>" LOC = "P192"; #J2-8 |
#NET "cf_d<0>" LOC = "P193"; #J2-9 |
#NET "cf_d<1>" LOC = "P194"; #J2-10 |
#NET "cf_d<2>" LOC = "P195"; #J2-11 |
#NET "cf_cs16_n" LOC = "P199"; #J2-12 |
#NET "cf_d<10>" LOC = "P200"; #J2-13 |
#NET "cf_d<9>" LOC = "P201"; #J2-14 |
#NET "cf_d<8>" LOC = "P202"; #J2-15 |
#NET "cf_pdiag" LOC = "P203"; #J2-16 |
#NET "cf_dase" LOC = "P204"; #J2-17 |
#NET "cf_iordy" LOC = "P205"; #J2-18 |
#NET "cf_rst_n" LOC = "P206"; #J2-19 |
# |
# Connector J4 |
# |
# For B5-Compact-Flash: |
# |
#NET "GCK2" LOC = "P182"; #J1-2 (Global Clock Input) |
#NET "IO" LOC = "P160"; #J1-3 |
#NET "cf_intrq" LOC = "P161"; #J1-4 |
#NET "cf_wr_n" LOC = "P162"; #J1-5 |
#NET "cf_rd_n" LOC = "P163"; #J1-6 |
#NET "cf_cs1_n" LOC = "P164"; #J1-7 |
#NET "cf_d<15>" LOC = "P165"; #J1-8 |
#NET "cf_d<14>" LOC = "P166"; #J1-9 |
#NET "cf_d<13>" LOC = "P167"; #J1-10 |
#NET "cf_d<12>" LOC = "P168"; #J1-11 |
#NET "cf_d<11>" LOC = "P172"; #J1-12 |
#NET "cf_present" LOC = "P173"; #J1-13 |
#NET "cf_d<3>" LOC = "P174"; #J1-14 |
#NET "cf_d<4>" LOC = "P175"; #J1-15 |
#NET "cf_d<5>" LOC = "P176"; #J1-16 |
#NET "cf_d<6>" LOC = "P178"; #J1-17 |
#NET "cf_d<7>" LOC = "P179"; #J1-18 |
#NET "cf_cs0_n" LOC = "P180"; #J1-19 |
# |
# Connector J6 |
# |
# For modified B3-SRAM |
# Note: B3-SRAM must be fitted to J6/J9 |
# |
NET "ram_data<0>" LOC = "p133"; #J2-2 (I/O - not a global clock input) |
NET "ram_data<1>" LOC = "p134"; #J2-3 |
NET "ram_data<2>" LOC = "p135"; #J2-4 |
NET "ram_data<3>" LOC = "p136"; #J2-5 |
NET "ram_data<4>" LOC = "p138"; #J2-6 |
NET "ram_data<5>" LOC = "p139"; #J2-7 |
NET "ram_data<6>" LOC = "p140"; #J2-8 |
NET "ram_data<7>" LOC = "p141"; #J2-9 |
NET "ram_data<8>" LOC = "p142"; #J2-10 |
NET "ram_data<9>" LOC = "p146"; #J2-11 |
NET "ram_data<10>" LOC = "p147"; #J2-12 |
NET "ram_data<11>" LOC = "p148"; #J2-13 |
NET "ram_data<12>" LOC = "p149"; #J2-14 |
NET "ram_data<13>" LOC = "p150"; #J2-15 |
NET "ram_data<14>" LOC = "p151"; #J2-16 |
NET "ram_data<15>" LOC = "p152"; #J2-17 |
NET "ram_wrun" LOC = "p153"; #J2-18 |
NET "ram_wrln" LOC = "p154"; #J2-19 |
# |
# Connector J9 |
# |
# For modified B3-SRAM |
# Note: B3-SRAM must be fitted to J6/J9 |
# |
NET "ram_addr<0>" LOC = "p108"; #J1-2 (I/O - not a global clock input) |
NET "ram_addr<1>" LOC = "p109"; #J1-3 |
NET "ram_addr<2>" LOC = "p110"; #J1-4 |
NET "ram_addr<3>" LOC = "p111"; #J1-5 |
NET "ram_addr<4>" LOC = "p112"; #J1-6 |
NET "ram_addr<5>" LOC = "p113"; #J1-7 |
NET "ram_addr<6>" LOC = "p114"; #J1-8 |
NET "ram_addr<7>" LOC = "p115"; #J1-9 |
NET "ram_csn" LOC = "p119"; #J1-10 |
NET "ram_addr<8>" LOC = "p120"; #J1-11 |
NET "ram_addr<9>" LOC = "p121"; #J1-12 |
NET "ram_addr<10>" LOC = "p122"; #J1-13 |
NET "ram_addr<11>" LOC = "p123"; #J1-14 |
NET "ram_addr<12>" LOC = "p125"; #J1-15 |
NET "ram_addr<13>" LOC = "p126"; #J1-16 |
NET "ram_addr<14>" LOC = "p127"; #J1-17 |
NET "ram_addr<15>" LOC = "p129"; #J1-18 |
NET "ram_addr<16>" LOC = "p132"; #J1-19 |
# |
# Connector J10 |
# |
# |
NET "SysClk" LOC = "p77"; #pin 2 (GCK1 - global clock input) |
NET "led" LOC = "p49"; #pin 3 (LED output) |
#NET "uart_csn" LOC = "p57"; #pin 4 |
#NET "test_rw" LOC = "p58"; #pin 5 |
#NET "test_d0" LOC = "p59"; #pin 6 |
#NET "test_d1" LOC = "p60"; #pin 7 |
NET "reset_n" LOC = "p61"; #pin 8 (Test Input button) |
#NET "test_cc<0>" LOC = "p67"; #pin 11 |
#NET "test_cc<1>" LOC = "p68"; #pin 12 |
#NET "test_cc<2>" LOC = "p69"; #pin 13 |
#NET "test_cc<3>" LOC = "p70"; #pin 14 |
#NET "test_cc<4>" LOC = "p71"; #pin 15 |
#NET "test_cc<5>" LOC = "p73"; #pin 16 |
#NET "test_cc<6>" LOC = "p74"; #pin 17 |
#NET "test_cc<7>" LOC = "p75"; #pin 18 |
#NET "IO" LOC = "p81"; #pin 19 |
# |
# Connector J11 |
# |
#NET "GCK0" LOC = "p80"; #pin 2 (Global Clock input) |
NET "porta<0>" LOC = "p82"; #pin 3 |
NET "porta<1>" LOC = "p83"; #pin 4 |
NET "porta<2>" LOC = "p84"; #pin 5 |
NET "porta<3>" LOC = "p86"; #pin 6 |
NET "porta<4>" LOC = "p87"; #pin 7 |
NET "porta<5>" LOC = "p88"; #pin 8 |
NET "porta<6>" LOC = "p89"; #pin 9 |
NET "porta<7>" LOC = "p90"; #pin 10 |
NET "portb<0>" LOC = "p94"; #pin 11 |
NET "portb<1>" LOC = "p95"; #pin 12 |
NET "portb<2>" LOC = "p96"; #pin 13 |
NET "portb<3>" LOC = "p97"; #pin 14 |
NET "portb<4>" LOC = "p98"; #pin 15 |
NET "portb<5>" LOC = "p99"; #pin 16 |
NET "portb<6>" LOC = "p100"; #pin 17 |
NET "portb<7>" LOC = "p101"; #pin 18 |
NET "timer_out" LOC = "p102"; #pin 19 |
# |
# Connector J8 |
# |
# B3-FPGA-CPU-IO Module |
# |
#NET "aux_clock" LOC = "p24"; #J1-2 (Note this is an I/O pad ... not a clock input) |
#NET "buzzer" LOC = "p27"; #J1-3 |
#NET "mouse_clock" LOC = "p29"; #J1-4 |
#NET "mouse_data" LOC = "p30"; #J1-5 |
NET "cts_n" LOC = "p31"; #J1-6 |
NET "rts_n" LOC = "p33"; #J1-7 |
NET "txbit" LOC = "p34"; #J1-8 |
NET "rxbit" LOC = "p35"; #J1-9 |
NET "kb_clock" LOC = "p36"; #J1-10 |
NET "kb_data" LOC = "p37"; #J1-11 |
NET "v_drive" LOC = "p41"; #J1-12 |
NET "h_drive" LOC = "p42"; #J1-13 |
NET "blue_lo" LOC = "p43"; #J1-14 |
NET "blue_hi" LOC = "p44"; #J1-15 |
NET "green_lo" LOC = "p45"; #J1-16 |
NET "green_hi" LOC = "p46"; #J1-17 |
NET "red_lo" LOC = "p47"; #J1-18 |
NET "red_hi" LOC = "p48"; #J1-19 |
# |
# Connector J5 |
# |
# Printer port |
# |
#NET "strobe_n" LOC = "p3"; #J5-1 |
#NET "autofd_n" LOC = "p4"; #J5-2 |
#NET "pd<0>" LOC = "p5"; #J5-3 |
#NET "fault_n" LOC = "p6"; #J5-4 |
#NET "pd<1>" LOC = "p7"; #J5-5 |
#NET "init_n" LOC = "p8"; #J5-6 |
#NET "pd<2>" LOC = "p9"; #J5-7 |
#NET "selin" LOC = "p10"; #J5-8 |
#NET "pd<3>" LOC = "p14"; #J5-9 |
#NET "pd<4>" LOC = "p15"; #J5-11 |
#NET "pd<5>" LOC = "p16"; #J5-13 |
#NET "pd<6>" LOC = "p17"; #J5-15 |
#NET "pd<7>" LOC = "p18"; #J5-17 |
#NET "ack" LOC = "p20"; #J5-19 |
#NET "busy" LOC = "p21"; #J5-21 |
#NET "pe" LOC = "p22"; #J5-23 |
#NET "sel" LOC = "p23"; #J5-25 |
# |
# Timing Groups |
# |
INST "ram_addr<0>" TNM = "ram_addr"; |
INST "ram_addr<1>" TNM = "ram_addr"; |
INST "ram_addr<2>" TNM = "ram_addr"; |
INST "ram_addr<3>" TNM = "ram_addr"; |
INST "ram_addr<4>" TNM = "ram_addr"; |
INST "ram_addr<5>" TNM = "ram_addr"; |
INST "ram_addr<6>" TNM = "ram_addr"; |
INST "ram_addr<7>" TNM = "ram_addr"; |
INST "ram_addr<8>" TNM = "ram_addr"; |
INST "ram_addr<9>" TNM = "ram_addr"; |
INST "ram_addr<10>" TNM = "ram_addr"; |
INST "ram_addr<11>" TNM = "ram_addr"; |
INST "ram_addr<12>" TNM = "ram_addr"; |
INST "ram_addr<13>" TNM = "ram_addr"; |
INST "ram_addr<14>" TNM = "ram_addr"; |
INST "ram_addr<15>" TNM = "ram_addr"; |
INST "ram_addr<16>" TNM = "ram_addr"; |
# |
INST "ram_data<0>" TNM = "ram_data"; |
INST "ram_data<1>" TNM = "ram_data"; |
INST "ram_data<2>" TNM = "ram_data"; |
INST "ram_data<3>" TNM = "ram_data"; |
INST "ram_data<4>" TNM = "ram_data"; |
INST "ram_data<5>" TNM = "ram_data"; |
INST "ram_data<6>" TNM = "ram_data"; |
INST "ram_data<7>" TNM = "ram_data"; |
INST "ram_data<8>" TNM = "ram_data"; |
INST "ram_data<9>" TNM = "ram_data"; |
INST "ram_data<10>" TNM = "ram_data"; |
INST "ram_data<11>" TNM = "ram_data"; |
INST "ram_data<12>" TNM = "ram_data"; |
INST "ram_data<13>" TNM = "ram_data"; |
INST "ram_data<14>" TNM = "ram_data"; |
INST "ram_data<15>" TNM = "ram_data"; |
# |
INST "ram_wrln" TNM = "ram_wr"; |
INST "ram_wrun" TNM = "ram_wr"; |
#INST "ram_csn" TNM = "ram_cs"; |
# |
# |
# Timing Constraints |
# |
NET "SysClk" TNM_NET = "SysClk"; |
TIMESPEC "TS_SysClk" = PERIOD "SysClk" 20 ns HIGH 50 %; |
#TIMEGRP "ram_cs" OFFSET = OUT 40 ns AFTER "SysClk"; |
TIMEGRP "ram_wr" OFFSET = OUT 40 ns AFTER "SysClk"; |
TIMEGRP "ram_addr" OFFSET = OUT 40 ns AFTER "SysClk"; |
TIMEGRP "ram_data" OFFSET = OUT 40 ns AFTER "SysClk"; |
TIMEGRP "ram_data" OFFSET = IN 15 ns BEFORE "SysClk"; |
# |
# Fast I/O Pins |
# |
NET "ram_addr<0>" FAST; |
NET "ram_addr<1>" FAST; |
NET "ram_addr<2>" FAST; |
NET "ram_addr<3>" FAST; |
NET "ram_addr<4>" FAST; |
NET "ram_addr<5>" FAST; |
NET "ram_addr<6>" FAST; |
NET "ram_addr<7>" FAST; |
NET "ram_addr<8>" FAST; |
NET "ram_addr<9>" FAST; |
NET "ram_addr<10>" FAST; |
NET "ram_addr<11>" FAST; |
NET "ram_addr<12>" FAST; |
NET "ram_addr<13>" FAST; |
NET "ram_addr<14>" FAST; |
NET "ram_addr<15>" FAST; |
NET "ram_addr<16>" FAST; |
# |
NET "ram_wrln" FAST; |
NET "ram_wrun" FAST; |
NET "ram_csn" FAST; |
# |
NET "ram_data<0>" FAST; |
NET "ram_data<1>" FAST; |
NET "ram_data<2>" FAST; |
NET "ram_data<3>" FAST; |
NET "ram_data<4>" FAST; |
NET "ram_data<5>" FAST; |
NET "ram_data<6>" FAST; |
NET "ram_data<7>" FAST; |
NET "ram_data<8>" FAST; |
NET "ram_data<9>" FAST; |
NET "ram_data<10>" FAST; |
NET "ram_data<11>" FAST; |
NET "ram_data<12>" FAST; |
NET "ram_data<13>" FAST; |
NET "ram_data<14>" FAST; |
NET "ram_data<15>" FAST; |
/System09_BurchED_B3.ise
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
System09_BurchED_B3.ise
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: System09_BurchED_B3.vhd
===================================================================
--- System09_BurchED_B3.vhd (nonexistent)
+++ System09_BurchED_B3.vhd (revision 66)
@@ -0,0 +1,1191 @@
+--===========================================================================----
+--
+-- S Y N T H E Z I A B L E System09 - SOC.
+--
+-- www.OpenCores.Org - September 2003
+-- This core adheres to the GNU public license
+--
+-- File name : System09.vhd
+--
+-- Purpose : Top level file for 6809 compatible system on a chip
+-- Designed with Xilinx XC2S200 Spartan 2+ FPGA.
+-- Implemented With BurchED B3 FPGA board,
+-- B3-SRAM module and B3-FPGA-CPU-IO module
+--
+-- Dependencies : ieee.Std_Logic_1164
+-- ieee.std_logic_unsigned
+-- ieee.std_logic_arith
+-- ieee.numeric_std
+--
+-- Uses :
+-- cpu09 (cpu09.vhd) CPU core
+-- mon_rom (sys09bug_rom2k_b4.vhd) Monitor ROM
+-- dat_ram (datram.vhd) Dynamic Address Translation
+-- acia_6850 (ACIA_6850.vhd) ACIA / MiniUART
+-- (ACIA_RX.vhd)
+-- (ACIA_TX.vhd)
+-- ACIA_Clock (ACIA_Clock.vhd) ACIA Baud Clock Divider
+-- keyboard (keyboard.vhd) PS/2 Keyboard Interface
+-- vdu8 (vdu8.vhd) 80 x 25 Video Display
+-- timer (timer.vhd) Timer module
+-- trap (trap.vhd) Bus Trap interrupt
+-- ioport (ioport.vhd) Parallel I/O port.
+--
+-- Author : John E. Kent
+-- dilbert57@opencores.org
+-- Memory Map :
+--
+-- $E000 - ACIA (SWTPc)
+-- $E010 - Reserved for FD1771 FDC (SWTPc)
+-- $E020 - Keyboard
+-- $E030 - VDU
+-- $E040 - Compact Flash
+-- $E050 - Timer
+-- $E060 - Bus trap
+-- $E070 - Parallel I/O
+-- $E080 - Reserved for 6821 PIA (?) (SWTPc)
+-- $E090 - Reserved for 6840 PTM (?) (SWTPc)
+-- $E0A0
+-- $E0B0
+-- $E0C0 - Trace logic
+--
+--===========================================================================----
+--
+-- Revision History:
+--===========================================================================--
+-- Version 0.1 - 20 March 2003
+-- Version 0.2 - 30 March 2003
+-- Version 0.3 - 29 April 2003
+-- Version 0.4 - 29 June 2003
+--
+-- Version 0.5 - 19 July 2003
+-- prints out "Hello World"
+--
+-- Version 0.6 - 5 September 2003
+-- Runs SBUG
+--
+-- Version 1.0- 6 Sep 2003 - John Kent
+-- Inverted SysClk
+-- Initial release to Open Cores
+--
+-- Version 1.1 - 17 Jan 2004 - John Kent
+-- Updated miniUart.
+--
+-- Version 1.2 - 25 Jan 2004 - John Kent
+-- removed signals "test_alu" and "test_cc"
+-- Trap hardware re-instated.
+--
+-- Version 1.3 - 11 Feb 2004 - John Kent
+-- Designed forked off to produce System09_VDU
+-- Added VDU component
+-- VDU runs at 25MHz and divides the clock by 2 for the CPU
+-- UART Runs at 57.6 Kbps
+--
+-- Version 1.4 - 21 Nov 2004 - John Kent
+-- Changes to make compatible with Spartan3 starter kit version
+-- Designed to run with a 50MHz clock input.
+-- the VDU divides 50 MHz to generate a
+-- 25 MHz VDU Pixel Clock and a 12.5 MHz CPU clock
+-- Changed Monitor ROM signals to make it look like
+-- a standard 2K memory block
+-- Re-assigned I/O port assignments so it is possible to run KBUG9
+-- $E000 - ACIA
+-- $E010 - Keyboard
+-- $E020 - VDU
+-- $E030 - Compact Flash
+-- $E040 - Timer
+-- $E050 - Bus trap
+-- $E060 - Parallel I/O
+--
+-- Version 1.5 - 3rd February 2007 - John Kent
+-- Changed VDU8 to use external clock divider
+-- renamed miniUART to ACIA_6850
+-- Memory decoding of ROM & IO now uses DAT
+--
+-- Version 1.6 - 7th Februaury 2007 - John Kent
+-- Made ACIA Clock generator an external component
+-- Added Generics to VDU and Keyboard
+-- Changed decoding
+--
+-- Version 1.7 - 20th May 2007 - John Kent
+-- Added 4 wait states to CF access
+-- Removed DAT memory map control of ROM & IO
+-- to allow for full use of RAM as a RAM disk.
+-- Mapped in all 16 bits of the CF data bus.
+--
+-- Version 1.8 - 1st July 2007 - John Kent
+-- Copied B5-X300 top level to B3 version.
+--
+--===========================================================================
+--
+library ieee;
+ use ieee.std_logic_1164.all;
+ use IEEE.STD_LOGIC_ARITH.ALL;
+ use IEEE.STD_LOGIC_UNSIGNED.ALL;
+ use ieee.numeric_std.all;
+library unisim;
+ use unisim.vcomponents.all;
+
+entity System09 is
+ port(
+ SysClk : in Std_Logic; -- System Clock input
+ Reset_n : in Std_logic; -- Master Reset input (active low)
+ LED : out std_logic; -- Diagnostic LED Flasher
+
+ -- Memory Interface signals
+ ram_csn : out Std_Logic;
+ ram_wrln : out Std_Logic;
+ ram_wrun : out Std_Logic;
+ ram_addr : out Std_Logic_Vector(16 downto 0);
+ ram_data : inout Std_Logic_Vector(15 downto 0);
+
+ -- Stuff on the peripheral board
+
+ -- PS/2 Keyboard
+ kb_clock : inout Std_logic;
+ kb_data : inout Std_Logic;
+
+ -- PS/2 Mouse interface
+-- mouse_clock : in Std_Logic;
+-- mouse_data : in Std_Logic;
+
+ -- Uart Interface
+ rxbit : in Std_Logic;
+ txbit : out Std_Logic;
+ rts_n : out Std_Logic;
+ cts_n : in Std_Logic;
+
+ -- CRTC output signals
+ v_drive : out Std_Logic;
+ h_drive : out Std_Logic;
+ blue_lo : out std_logic;
+ blue_hi : out std_logic;
+ green_lo : out std_logic;
+ green_hi : out std_logic;
+ red_lo : out std_logic;
+ red_hi : out std_logic;
+-- buzzer : out std_logic;
+
+-- Compact Flash
+-- cf_rst_n : out std_logic;
+-- cf_cs0_n : out std_logic;
+-- cf_cs1_n : out std_logic;
+-- cf_rd_n : out std_logic;
+-- cf_wr_n : out std_logic;
+-- cf_cs16_n : out std_logic;
+-- cf_a : out std_logic_vector(2 downto 0);
+-- cf_d : inout std_logic_vector(15 downto 0);
+-- cf_d : inout std_logic_vector(7 downto 0);
+
+-- Parallel I/O port
+ porta : inout std_logic_vector(7 downto 0);
+ portb : inout std_logic_vector(7 downto 0);
+
+-- CPU bus
+ bus_clk : out std_logic;
+ bus_reset : out std_logic;
+ bus_rw : out std_logic;
+ bus_csn : out std_logic;
+ bus_addr : out std_logic_vector(19 downto 0);
+ bus_data : inout std_logic_vector(7 downto 0);
+
+-- timer
+ timer_out : out std_logic
+ );
+end System09;
+
+-------------------------------------------------------------------------------
+-- Architecture for System09
+-------------------------------------------------------------------------------
+architecture rtl of System09 is
+ -----------------------------------------------------------------------------
+ -- constants
+ -----------------------------------------------------------------------------
+ constant SYS_Clock_Frequency : integer := 50000000; -- FPGA System Clock
+ constant PIX_Clock_Frequency : integer := 25000000; -- VGA Pixel Clock
+ constant CPU_Clock_Frequency : integer := 12500000; -- CPU Clock
+ constant BAUD_Rate : integer := 57600; -- Baud Rate
+ constant ACIA_Clock_Frequency : integer := BAUD_Rate * 16;
+
+ type hold_state_type is ( hold_release_state, hold_request_state );
+
+ -----------------------------------------------------------------------------
+ -- Signals
+ -----------------------------------------------------------------------------
+ -- Monitor ROM
+ signal rom_data_out : Std_Logic_Vector(7 downto 0);
+ signal rom_cs : std_logic;
+
+ -- UART Interface signals
+ signal uart_data_out : Std_Logic_Vector(7 downto 0);
+ signal uart_cs : Std_Logic;
+ signal uart_irq : Std_Logic;
+ signal uart_clk : Std_Logic;
+ signal DCD_n : Std_Logic;
+
+ -- timer
+ signal timer_data_out : std_logic_vector(7 downto 0);
+ signal timer_cs : std_logic;
+ signal timer_irq : std_logic;
+
+ -- trap
+ signal trap_cs : std_logic;
+ signal trap_data_out : std_logic_vector(7 downto 0);
+ signal trap_irq : std_logic;
+
+
+ -- trace
+-- signal trace_cs : std_logic;
+-- signal trace_data_out : std_logic_vector(7 downto 0);
+-- signal trace_irq : std_logic;
+-- signal bank_cs : std_logic;
+-- signal bank_data_out : std_logic_vector(7 downto 0);
+
+ -- Parallel I/O port
+ signal ioport_data_out : std_logic_vector(7 downto 0);
+ signal ioport_cs : std_logic;
+
+ -- compact flash port
+-- signal cf_data_out : std_logic_vector(7 downto 0);
+-- signal cf_cs : std_logic;
+-- signal cf_rd : std_logic;
+-- signal cf_wr : std_logic;
+-- signal cf_hold : std_logic;
+-- signal cf_release : std_logic;
+-- signal cf_count : std_logic_vector(3 downto 0);
+-- signal cf_hold_state : hold_state_type;
+
+ -- keyboard port
+ signal keyboard_data_out : std_logic_vector(7 downto 0);
+ signal keyboard_cs : std_logic;
+ signal keyboard_irq : std_logic;
+
+ -- RAM
+ signal ram_cs : std_logic; -- memory chip select
+ signal ram_wrl : std_logic; -- memory write lower
+ signal ram_wru : std_logic; -- memory write upper
+ signal ram_data_out : std_logic_vector(7 downto 0);
+
+ -- CPU Interface signals
+ signal cpu_reset : Std_Logic;
+ signal cpu_clk : Std_Logic;
+ signal cpu_rw : std_logic;
+ signal cpu_vma : std_logic;
+ signal cpu_halt : std_logic;
+ signal cpu_hold : std_logic;
+ signal cpu_firq : std_logic;
+ signal cpu_irq : std_logic;
+ signal cpu_nmi : std_logic;
+ signal cpu_addr : std_logic_vector(15 downto 0);
+ signal cpu_data_in : std_logic_vector(7 downto 0);
+ signal cpu_data_out : std_logic_vector(7 downto 0);
+
+ -- Dynamic address translation
+ signal dat_cs : std_logic;
+ signal dat_addr : std_logic_vector(7 downto 0);
+
+ -- Video Display Unit
+ signal pix_clk : std_logic;
+ signal vdu_cs : std_logic;
+ signal vdu_data_out : std_logic_vector(7 downto 0);
+ signal vga_red : std_logic;
+ signal vga_green : std_logic;
+ signal vga_blue : std_logic;
+
+ -- external bus I/O
+ signal bus_cs : std_logic;
+
+ -- Flashing Led test signals
+ signal countL : std_logic_vector(23 downto 0);
+ signal clock_div : std_logic_vector(1 downto 0);
+
+-----------------------------------------------------------------
+--
+-- CPU09 CPU core
+--
+-----------------------------------------------------------------
+
+component cpu09
+ port (
+ clk: in std_logic;
+ rst: in std_logic;
+ rw: out std_logic; -- Asynchronous memory interface
+ vma: out std_logic;
+ address: out std_logic_vector(15 downto 0);
+ data_in: in std_logic_vector(7 downto 0);
+ data_out: out std_logic_vector(7 downto 0);
+ halt: in std_logic;
+ hold: in std_logic;
+ irq: in std_logic;
+ nmi: in std_logic;
+ firq: in std_logic
+ );
+end component;
+
+
+----------------------------------------
+--
+-- SBUG Block RAM Monitor ROM
+--
+----------------------------------------
+component mon_rom
+ port (
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ addr : in std_logic_vector (10 downto 0);
+ wdata : in std_logic_vector (7 downto 0);
+ rdata : out std_logic_vector (7 downto 0)
+ );
+end component;
+
+
+----------------------------------------
+--
+-- Dynamic Address Translation Registers
+--
+----------------------------------------
+component dat_ram
+ port (
+ clk: in std_logic;
+ rst: in std_logic;
+ cs: in std_logic;
+ rw: in std_logic;
+ addr_lo: in std_logic_vector(3 downto 0);
+ addr_hi: in std_logic_vector(3 downto 0);
+ data_in: in std_logic_vector(7 downto 0);
+ data_out: out std_logic_vector(7 downto 0)
+ );
+end component;
+
+-----------------------------------------------------------------
+--
+-- 6850 ACIA/UART
+--
+-----------------------------------------------------------------
+
+component ACIA_6850
+ port (
+ clk : in Std_Logic; -- System Clock
+ rst : in Std_Logic; -- Reset input (active high)
+ cs : in Std_Logic; -- miniUART Chip Select
+ rw : in Std_Logic; -- Read / Not Write
+ irq : out Std_Logic; -- Interrupt
+ Addr : in Std_Logic; -- Register Select
+ DataIn : in Std_Logic_Vector(7 downto 0); -- Data Bus In
+ DataOut : out Std_Logic_Vector(7 downto 0); -- Data Bus Out
+ RxC : in Std_Logic; -- Receive Baud Clock
+ TxC : in Std_Logic; -- Transmit Baud Clock
+ RxD : in Std_Logic; -- Receive Data
+ TxD : out Std_Logic; -- Transmit Data
+ DCD_n : in Std_Logic; -- Data Carrier Detect
+ CTS_n : in Std_Logic; -- Clear To Send
+ RTS_n : out Std_Logic ); -- Request To send
+end component;
+
+-----------------------------------------------------------------
+--
+-- ACIA Clock divider
+--
+-----------------------------------------------------------------
+
+component ACIA_Clock
+ generic (
+ SYS_Clock_Frequency : integer := SYS_Clock_Frequency;
+ ACIA_Clock_Frequency : integer := ACIA_Clock_Frequency
+ );
+ port (
+ clk : in Std_Logic; -- System Clock Input
+ ACIA_clk : out Std_logic -- ACIA Clock output
+ );
+end component;
+
+----------------------------------------
+--
+-- Timer module
+--
+----------------------------------------
+
+component timer
+ port (
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ addr : in std_logic;
+ data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ irq : out std_logic;
+ timer_in : in std_logic;
+ timer_out : out std_logic
+ );
+end component;
+
+------------------------------------------------------------
+--
+-- Bus Trap logic
+--
+------------------------------------------------------------
+
+component trap
+ port (
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ vma : in std_logic;
+ addr : in std_logic_vector(15 downto 0);
+ data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ irq : out std_logic
+ );
+end component;
+
+------------------------------------------------------------
+--
+-- Bus Trace logic
+--
+------------------------------------------------------------
+--component trace is
+-- port (
+-- clk : in std_logic;
+-- rst : in std_logic;
+-- rs : in std_logic; -- register select
+-- bs : in std_logic; -- bank select
+-- rw : in std_logic;
+-- vma : in std_logic;
+-- addr : in std_logic_vector(15 downto 0);
+-- data_in : in std_logic_vector(7 downto 0);
+-- reg_data_out : out std_logic_vector(7 downto 0);
+-- buff_data_out : out std_logic_vector(7 downto 0);
+-- cpu_data_in : in std_logic_vector(7 downto 0);
+-- irq : out std_logic
+-- );
+--end component;
+
+----------------------------------------
+--
+-- Dual 8 bit Parallel I/O module
+--
+----------------------------------------
+component ioport
+ port (
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ addr : in std_logic_vector(1 downto 0);
+ data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ porta_io : inout std_logic_vector(7 downto 0);
+ portb_io : inout std_logic_vector(7 downto 0)
+ );
+end component;
+
+----------------------------------------
+--
+-- PS/2 Keyboard
+--
+----------------------------------------
+
+component keyboard
+ generic(
+ KBD_Clock_Frequency : integer := CPU_Clock_Frequency
+ );
+ port(
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ addr : in std_logic;
+ data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ irq : out std_logic;
+ kbd_clk : inout std_logic;
+ kbd_data : inout std_logic
+ );
+end component;
+
+----------------------------------------
+--
+-- Video Display Unit.
+--
+----------------------------------------
+component vdu8_mono
+ generic(
+ VDU_CLOCK_FREQUENCY : integer := CPU_Clock_Frequency; -- HZ
+ VGA_CLOCK_FREQUENCY : integer := PIX_Clock_Frequency; -- HZ
+ VGA_HOR_CHARS : integer := 80; -- CHARACTERS
+ VGA_VER_CHARS : integer := 25; -- CHARACTERS
+ VGA_PIXELS_PER_CHAR : integer := 8; -- PIXELS
+ VGA_LINES_PER_CHAR : integer := 16; -- LINES
+ VGA_HOR_BACK_PORCH : integer := 40; -- PIXELS
+ VGA_HOR_SYNC : integer := 96; -- PIXELS
+ VGA_HOR_FRONT_PORCH : integer := 24; -- PIXELS
+ VGA_VER_BACK_PORCH : integer := 13; -- LINES
+ VGA_VER_SYNC : integer := 1; -- LINES
+ VGA_VER_FRONT_PORCH : integer := 36 -- LINES
+ );
+ port(
+ -- control register interface
+ vdu_clk : in std_logic; -- CPU Clock - 12.5MHz
+ vdu_rst : in std_logic;
+ vdu_cs : in std_logic;
+ vdu_rw : in std_logic;
+ vdu_addr : in std_logic_vector(2 downto 0);
+ vdu_data_in : in std_logic_vector(7 downto 0);
+ vdu_data_out : out std_logic_vector(7 downto 0);
+
+ -- vga port connections
+ vga_clk : in std_logic; -- VGA Pixel Clock - 25 MHz
+ vga_red_o : out std_logic;
+ vga_green_o : out std_logic;
+ vga_blue_o : out std_logic;
+ vga_hsync_o : out std_logic;
+ vga_vsync_o : out std_logic
+ );
+end component;
+
+
+component BUFG
+ port (
+ i: in std_logic;
+ o: out std_logic
+ );
+end component;
+
+begin
+ -----------------------------------------------------------------------------
+ -- Instantiation of internal components
+ -----------------------------------------------------------------------------
+
+----------------------------------------
+--
+-- CPU09 CPU Core
+--
+----------------------------------------
+my_cpu : cpu09 port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ rw => cpu_rw,
+ vma => cpu_vma,
+ address => cpu_addr(15 downto 0),
+ data_in => cpu_data_in,
+ data_out => cpu_data_out,
+ halt => cpu_halt,
+ hold => cpu_hold,
+ irq => cpu_irq,
+ nmi => cpu_nmi,
+ firq => cpu_firq
+ );
+
+----------------------------------------
+--
+-- SBUG / KBUG / SYS09BUG Monitor ROM
+--
+----------------------------------------
+my_rom : mon_rom port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => rom_cs,
+ rw => '1',
+ addr => cpu_addr(10 downto 0),
+ wdata => cpu_data_out,
+ rdata => rom_data_out
+ );
+
+----------------------------------------
+--
+-- Dynamic Address Translation Registers
+--
+----------------------------------------
+my_dat : dat_ram port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => dat_cs,
+ rw => cpu_rw,
+ addr_hi => cpu_addr(15 downto 12),
+ addr_lo => cpu_addr(3 downto 0),
+ data_in => cpu_data_out,
+ data_out => dat_addr(7 downto 0)
+ );
+
+----------------------------------------
+--
+-- ACIA/UART Serial interface
+--
+----------------------------------------
+my_ACIA : ACIA_6850 port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => uart_cs,
+ rw => cpu_rw,
+ irq => uart_irq,
+ Addr => cpu_addr(0),
+ Datain => cpu_data_out,
+ DataOut => uart_data_out,
+ RxC => uart_clk,
+ TxC => uart_clk,
+ RxD => rxbit,
+ TxD => txbit,
+ DCD_n => dcd_n,
+ CTS_n => cts_n,
+ RTS_n => rts_n
+ );
+
+----------------------------------------
+--
+-- ACIA Clock
+--
+----------------------------------------
+my_ACIA_Clock : ACIA_Clock
+ generic map(
+ SYS_Clock_Frequency => SYS_Clock_Frequency,
+ ACIA_Clock_Frequency => ACIA_Clock_Frequency
+ )
+ port map(
+ clk => SysClk,
+ acia_clk => uart_clk
+ );
+
+----------------------------------------
+--
+-- PS/2 Keyboard Interface
+--
+----------------------------------------
+my_keyboard : keyboard
+ generic map (
+ KBD_Clock_Frequency => CPU_Clock_frequency
+ )
+ port map(
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => keyboard_cs,
+ rw => cpu_rw,
+ addr => cpu_addr(0),
+ data_in => cpu_data_out(7 downto 0),
+ data_out => keyboard_data_out(7 downto 0),
+ irq => keyboard_irq,
+ kbd_clk => kb_clock,
+ kbd_data => kb_data
+ );
+
+----------------------------------------
+--
+-- Video Display Unit instantiation
+--
+----------------------------------------
+my_vdu : vdu8_mono
+ generic map(
+ VDU_CLOCK_FREQUENCY => CPU_Clock_Frequency, -- HZ
+ VGA_CLOCK_FREQUENCY => PIX_Clock_Frequency, -- HZ
+ VGA_HOR_CHARS => 80, -- CHARACTERS
+ VGA_VER_CHARS => 25, -- CHARACTERS
+ VGA_PIXELS_PER_CHAR => 8, -- PIXELS
+ VGA_LINES_PER_CHAR => 16, -- LINES
+ VGA_HOR_BACK_PORCH => 40, -- PIXELS
+ VGA_HOR_SYNC => 96, -- PIXELS
+ VGA_HOR_FRONT_PORCH => 24, -- PIXELS
+ VGA_VER_BACK_PORCH => 13, -- LINES
+ VGA_VER_SYNC => 1, -- LINES
+ VGA_VER_FRONT_PORCH => 36 -- LINES
+ )
+ port map(
+
+ -- Control Registers
+ vdu_clk => cpu_clk, -- 12.5 MHz System Clock in
+ vdu_rst => cpu_reset,
+ vdu_cs => vdu_cs,
+ vdu_rw => cpu_rw,
+ vdu_addr => cpu_addr(2 downto 0),
+ vdu_data_in => cpu_data_out,
+ vdu_data_out => vdu_data_out,
+
+ -- vga port connections
+ vga_clk => pix_clk, -- 25 MHz VDU pixel clock
+ vga_red_o => vga_red,
+ vga_green_o => vga_green,
+ vga_blue_o => vga_blue,
+ vga_hsync_o => h_drive,
+ vga_vsync_o => v_drive
+ );
+
+----------------------------------------
+--
+-- Timer Module
+--
+----------------------------------------
+my_timer : timer port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => timer_cs,
+ rw => cpu_rw,
+ addr => cpu_addr(0),
+ data_in => cpu_data_out,
+ data_out => timer_data_out,
+ irq => timer_irq,
+ timer_in => CountL(5),
+ timer_out => timer_out
+ );
+
+----------------------------------------
+--
+-- Bus Trap Interrupt logic
+--
+----------------------------------------
+my_trap : trap port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => trap_cs,
+ rw => cpu_rw,
+ vma => cpu_vma,
+ addr => cpu_addr,
+ data_in => cpu_data_out,
+ data_out => trap_data_out,
+ irq => trap_irq
+ );
+
+----------------------------------------
+--
+-- Bus Trace logic
+--
+----------------------------------------
+--my_trace : trace port map (
+-- clk => SysClk,
+-- rst => cpu_reset,
+-- rs => trace_cs,
+-- bs => bank_cs,
+-- rw => cpu_rw,
+-- vma => cpu_vma,
+-- addr => cpu_addr,
+-- data_in => cpu_data_out,
+-- reg_data_out => trace_data_out,
+-- buff_data_out => bank_data_out,
+-- cpu_data_in => cpu_data_in,
+-- irq => trace_irq
+-- );
+
+
+----------------------------------------
+--
+-- Parallel I/O Port
+--
+----------------------------------------
+my_ioport : ioport port map (
+ clk => cpu_clk,
+ rst => cpu_reset,
+ cs => ioport_cs,
+ rw => cpu_rw,
+ addr => cpu_addr(1 downto 0),
+ data_in => cpu_data_out,
+ data_out => ioport_data_out,
+ porta_io => porta,
+ portb_io => portb
+ );
+
+--
+-- 12.5 MHz CPU clock
+--
+cpu_clk_buffer : BUFG port map(
+ i => clock_div(1),
+ o => cpu_clk
+ );
+
+--
+-- 25 MHz VGA Pixel clock
+--
+vga_clk_buffer : BUFG port map(
+ i => clock_div(0),
+ o => pix_clk
+ );
+
+----------------------------------------------------------------------
+--
+-- Process to decode memory map
+--
+----------------------------------------------------------------------
+
+mem_decode: process( cpu_clk, Reset_n, dat_addr,
+ cpu_addr, cpu_rw, cpu_vma,
+ rom_data_out,
+ ram_data_out,
+-- cf_data_out,
+ timer_data_out,
+ trap_data_out,
+ ioport_data_out,
+ uart_data_out,
+ keyboard_data_out,
+ vdu_data_out,
+-- trace_data_out,
+ bus_data )
+variable decode_addr : std_logic_vector(4 downto 0);
+begin
+ decode_addr := dat_addr(3 downto 0) & cpu_addr(11);
+-- decode_addr := cpu_addr(15 downto 11);
+
+ if cpu_addr( 15 downto 8 ) = "11111111" then
+ cpu_data_in <= rom_data_out;
+ rom_cs <= cpu_vma; -- read ROM
+ dat_cs <= cpu_vma; -- write DAT
+ ram_cs <= '0';
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+ else
+ case decode_addr is
+ --
+ -- SBUG/KBUG/SYS09BUG Monitor ROM $F800 - $FFFF
+ --
+ when "11111" => -- $F800 - $FFFF
+ cpu_data_in <= rom_data_out;
+ rom_cs <= cpu_vma; -- read ROM
+ dat_cs <= '0';
+ ram_cs <= '0';
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- IO Devices $E000 - $E7FF
+ --
+ when "11100" => -- $E000 - $E7FF
+ rom_cs <= '0';
+ dat_cs <= '0';
+ ram_cs <= '0';
+ case cpu_addr(7 downto 4) is
+ --
+ -- UART / ACIA $E000
+ --
+ when "0000" => -- $E000
+ cpu_data_in <= uart_data_out;
+ uart_cs <= cpu_vma;
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- WD1771 FDC sites at $E010-$E01F
+ --
+
+ --
+ -- Keyboard port $E020 - $E02F
+ --
+ when "0010" => -- $E020
+ cpu_data_in <= keyboard_data_out;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= cpu_vma;
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- VDU port $E030 - $E03F
+ --
+ when "0011" => -- $E030
+ cpu_data_in <= vdu_data_out;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= cpu_vma;
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+
+ --
+ -- Compact Flash $E040 - $E04F
+ --
+-- when "0100" => -- $E040
+-- cpu_data_in <= cf_data_out;
+-- uart_cs <= '0';
+-- cf_cs <= cpu_vma;
+-- timer_cs <= '0';
+-- trap_cs <= '0';
+-- ioport_cs <= '0';
+-- keyboard_cs <= '0';
+-- vdu_cs <= '0';
+-- bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- Timer $E050 - $E05F
+ --
+ when "0101" => -- $E050
+ cpu_data_in <= timer_data_out;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= cpu_vma;
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- Bus Trap Logic $E060 - $E06F
+ --
+-- when "0110" => -- $E060
+-- cpu_data_in <= trap_data_out;
+-- uart_cs <= '0';
+-- cf_cs <= '0';
+-- timer_cs <= '0';
+-- trap_cs <= cpu_vma;
+-- ioport_cs <= '0';
+-- keyboard_cs <= '0';
+-- vdu_cs <= '0';
+-- bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- I/O port $E070 - $E07F
+ --
+ when "0111" => -- $E070
+ cpu_data_in <= ioport_data_out;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= cpu_vma;
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+
+ --
+ -- Bus Trace Logic $E0C00 - $E0CF
+ --
+-- when "1100" => -- $E0C0
+-- cpu_data_in <= trace_data_out;
+-- uart_cs <= '0';
+-- keyboard_cs <= '0';
+-- timer_cs <= '0';
+-- vdu_cs <= '0';
+-- ioport_cs <= '0';
+-- cf_cs <= '0';
+-- trap_cs <= '0';
+-- trace_cs <= cpu_vma;
+
+
+ when others => -- $E080 to $E7FF
+ cpu_data_in <= bus_data;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= cpu_vma;
+-- trace_cs <= '0';
+ end case;
+ --
+ -- Everything else is RAM
+ --
+ when others =>
+ cpu_data_in <= ram_data_out;
+ rom_cs <= '0';
+ dat_cs <= '0';
+ ram_cs <= cpu_vma;
+ uart_cs <= '0';
+-- cf_cs <= '0';
+ timer_cs <= '0';
+ trap_cs <= '0';
+ ioport_cs <= '0';
+ keyboard_cs <= '0';
+ vdu_cs <= '0';
+ bus_cs <= '0';
+-- trace_cs <= '0';
+ end case;
+ end if;
+end process;
+
+
+--
+-- B5-SRAM Control
+-- Processes to read and write memory based on bus signals
+--
+ram_process: process( cpu_clk, Reset_n,
+ cpu_addr, cpu_rw, cpu_vma, cpu_data_out,
+ dat_addr,
+ ram_cs, ram_wrl, ram_wru, ram_data_out )
+begin
+ ram_csn <= not( ram_cs and Reset_n );
+ ram_wrl <= (not cpu_addr(0)) and (not cpu_rw) and cpu_clk;
+ ram_wrln <= not (ram_wrl);
+ ram_wru <= cpu_addr(0) and (not cpu_rw) and cpu_clk;
+ ram_wrun <= not (ram_wru);
+ ram_addr(16 downto 11) <= dat_addr(5 downto 0);
+ ram_addr(10 downto 0) <= cpu_addr(11 downto 1);
+
+ if ram_wrl = '1' then
+ ram_data(7 downto 0) <= cpu_data_out;
+ else
+ ram_data(7 downto 0) <= "ZZZZZZZZ";
+ end if;
+
+ if ram_wru = '1' then
+ ram_data(15 downto 8) <= cpu_data_out;
+ else
+ ram_data(15 downto 8) <= "ZZZZZZZZ";
+ end if;
+
+ if cpu_addr(0) = '1' then
+ ram_data_out <= ram_data(15 downto 8);
+ else
+ ram_data_out <= ram_data(7 downto 0);
+ end if;
+end process;
+
+--
+-- Compact Flash Control
+--
+--compact_flash: process( Reset_n,
+-- cpu_addr, cpu_rw, cpu_vma, cpu_data_out,
+-- cf_cs, cf_rd, cf_wr, cf_d )
+--begin
+-- cf_rst_n <= Reset_n;
+-- cf_cs0_n <= not( cf_cs ) or cpu_addr(3);
+-- cf_cs1_n <= not( cf_cs and cpu_addr(3));
+-- cf_cs16_n <= '1';
+-- cf_wr <= cf_cs and (not cpu_rw);
+-- cf_rd <= cf_cs and cpu_rw;
+-- cf_wr_n <= not cf_wr;
+-- cf_rd_n <= not cf_rd;
+-- cf_a <= cpu_addr(2 downto 0);
+-- if cf_wr = '1' then
+-- cf_d(7 downto 0) <= cpu_data_out;
+-- else
+-- cf_d(7 downto 0) <= "ZZZZZZZZ";
+-- end if;
+-- cf_data_out <= cf_d(7 downto 0);
+-- cf_d(15 downto 8) <= "ZZZZZZZZ";
+--end process;
+
+--
+-- Hold CF access for a few cycles
+--
+--cf_hold_proc: process( cpu_clk, Reset_n )
+--begin
+-- if Reset_n = '0' then
+-- cf_release <= '0';
+-- cf_count <= "0000";
+-- cf_hold_state <= hold_release_state;
+-- elsif cpu_clk'event and cpu_clk='0' then
+-- case cf_hold_state is
+-- when hold_release_state =>
+-- cf_release <= '0';
+-- if cf_cs = '1' then
+-- cf_count <= "0011";
+-- cf_hold_state <= hold_request_state;
+-- end if;
+--
+-- when hold_request_state =>
+-- cf_count <= cf_count - "0001";
+-- if cf_count = "0000" then
+-- cf_release <= '1';
+-- cf_hold_state <= hold_release_state;
+-- end if;
+-- when others =>
+-- null;
+-- end case;
+-- end if;
+--end process;
+
+--
+-- Interrupts and other bus control signals
+--
+interrupts : process( Reset_n,
+-- cf_cs, cf_hold, cf_release,
+ uart_irq,
+ trap_irq,
+ timer_irq, keyboard_irq
+ )
+begin
+-- cf_hold <= cf_cs and (not cf_release);
+ cpu_reset <= not Reset_n; -- CPU reset is active high
+ cpu_irq <= uart_irq or keyboard_irq;
+ cpu_nmi <= trap_irq;
+ cpu_firq <= timer_irq;
+ cpu_halt <= '0';
+-- cpu_hold <= cf_hold;
+ cpu_hold <= '0';
+end process;
+
+--
+-- CPU bus signals
+--
+my_bus : process( cpu_clk, cpu_reset, cpu_rw, cpu_addr, cpu_data_out, bus_cs )
+begin
+ bus_clk <= cpu_clk;
+ bus_reset <= cpu_reset;
+ bus_rw <= cpu_rw;
+ bus_csn <= not bus_cs;
+ bus_addr <= dat_addr(7 downto 0) & cpu_addr(11 downto 0);
+ if( cpu_rw = '1' ) then
+ bus_data <= "ZZZZZZZZ";
+ else
+ bus_data <= cpu_data_out;
+ end if;
+end process;
+
+ --
+ -- flash led to indicate code is working
+ --
+my_LED_Flasher: process (cpu_clk, CountL )
+begin
+ if(cpu_clk'event and cpu_clk = '0') then
+ countL <= countL + 1;
+ end if;
+ LED <= countL(23);
+ dcd_n <= '0';
+end process;
+
+--
+-- Clock divider
+--
+my_clock_divider: process( SysClk )
+begin
+ if SysClk'event and SysClk='0' then
+ clock_div <= clock_div + "01";
+ end if;
+end process;
+--
+-- Assign VDU VGA colour output
+-- only 8 colours are handled.
+--
+my_vga_out: process( vga_red, vga_green, vga_blue )
+begin
+ red_lo <= vga_red;
+ red_hi <= vga_red;
+ green_lo <= vga_green;
+ green_hi <= vga_green;
+ blue_lo <= vga_blue;
+ blue_hi <= vga_blue;
+end process;
+
+end rtl; --===================== End of architecture =======================--