URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 54 to Rev 55
- ↔ Reverse comparison
Rev 54 → Rev 55
/branches/mkfiles_rev1/rtl/System09_Memec_XC2V1000/my_system09.xst
0,0 → 1,54
set -tmpdir "./xst/projnav.tmp" |
set -xsthdpdir "./xst" |
run |
-ifn my_system09.prj |
-ifmt mixed |
-ofn my_system09 |
-ofmt NGC |
-p xc2v1000-4-fg256 |
-top my_system09 |
-opt_mode Speed |
-opt_level 1 |
-iuc NO |
-lso my_system09.lso |
-keep_hierarchy NO |
-rtlview Yes |
-glob_opt AllClockNets |
-read_cores YES |
-write_timing_constraints NO |
-cross_clock_analysis NO |
-hierarchy_separator / |
-bus_delimiter <> |
-case maintain |
-slice_utilization_ratio 100 |
-verilog2001 YES |
-fsm_extract YES -fsm_encoding Auto |
-safe_implementation No |
-fsm_style lut |
-ram_extract Yes |
-ram_style Distributed |
-rom_extract Yes |
-mux_style Auto |
-decoder_extract YES |
-priority_extract YES |
-shreg_extract YES |
-shift_extract YES |
-xor_collapse YES |
-rom_style Distributed |
-mux_extract YES |
-resource_sharing YES |
-mult_style auto |
-iobuf YES |
-max_fanout 500 |
-bufg 16 |
-register_duplication YES |
-register_balancing No |
-slice_packing YES |
-optimize_primitives NO |
-tristate2logic Yes |
-use_clock_enable Yes |
-use_sync_set Yes |
-use_sync_reset Yes |
-iob auto |
-equivalent_register_removal YES |
-slice_utilization_ratio_maxmargin 5 |
/branches/mkfiles_rev1/rtl/System09_Memec_XC2V1000/System09_Memec_XC2V1000.vhd
0,0 → 1,958
--===========================================================================---- |
-- |
-- 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 XC3S200 Spartan 3 FPGA. |
-- Implemented With Digilent Xilinx Starter FPGA board, |
-- |
-- Dependencies : ieee.Std_Logic_1164 |
-- ieee.std_logic_unsigned |
-- ieee.std_logic_arith |
-- ieee.numeric_std |
-- |
-- Uses : mon_rom (sys09bug_rom4k_b16.vhd) Monitor ROM |
-- cpu09 (cpu09.vhd) CPU core |
-- dat_ram (datram.vhd) Dynamic Address Translation |
-- acia_6850 (acia_6850.vhd) ACIA (UART) |
-- (acia_rx.vhd) |
-- (acia_tx.vhd) |
-- keyboard (keyboard.vhd) PS/2 Keyboard |
-- (ps2_keyboard.vhd) |
-- (keymap_rom) |
-- vdu8 (vdu8.vhd) Video Display Unit |
-- (char_rom2K_b16.vhd) |
-- (ram2k_b16.vhd) |
-- seven_segment (SevenSegment.vhd) Seven Segment Display |
-- |
-- Author : John E. Kent |
-- dilbert57@opencores.org |
-- |
--===========================================================================---- |
-- |
-- 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 sys_clk |
-- 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 2.0 - 2 September 2004 - John Kent |
-- ported to Digilent Xilinx Spartan3 starter board |
-- removed Compaact Flash and Trap Logic. |
-- Replaced SBUG with KBug9s |
-- |
-- Version 2.1 - 21 November 2006 - John Kent |
-- Replaced KBug9s with Sys09bug 1.0 |
-- Inverted bottom nybble of DAT register outputs |
-- Changed ROM & I/O decoding to be compatible with SWTPc |
-- Upped the serial baud rate to 115.2 KBd |
-- added multiple global clock buffers |
-- (Uart would not operate correctly) |
-- |
-- Version 2.2 - 22 December 2006 - John Kent |
-- Increased CPU clock from 12.5MHz to 25 MHz. |
-- Removed some of the global clock buffers |
-- Added LED output register |
-- Changed address decoding to 4K Blocks |
-- |
-- Version 2.3 - 1 June 2007 - John Kent |
-- Updated VDU & ACIA |
-- Changed decoding for Sys09Bug |
-- |
-- Version 2.4 - 31 January 2008 - John Kent |
-- ACIA does not appear to work. |
-- Made RAM OE and WE strobes synchonous to sys_clk |
-- |
--===========================================================================-- |
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; |
|
entity my_system09 is |
port( |
sys_clk : in Std_Logic; -- System Clock input |
rst_sw : in Std_logic; -- Master Reset input (active high) |
nmi_sw : in Std_logic; |
|
-- Memory Interface signals |
ram_addr : out Std_Logic_Vector(17 downto 0); |
ram_wen : out Std_Logic; |
ram_oen : out Std_Logic; |
|
ram1_cen : out Std_Logic; |
ram1_ubn : out Std_Logic; |
ram1_lbn : out Std_Logic; |
ram1_data : inout Std_Logic_Vector(15 downto 0); |
|
ram2_cen : out Std_Logic; |
ram2_ubn : out Std_Logic; |
ram2_lbn : out Std_Logic; |
ram2_data : inout Std_Logic_Vector(15 downto 0); |
|
-- PS/2 Keyboard |
ps2c : inout Std_logic; |
ps2d : inout Std_Logic; |
|
-- ACIA Interface |
rxd : in Std_Logic; |
txd : out Std_Logic; |
|
-- CRTC output signals |
vs : out Std_Logic; |
hs : out Std_Logic; |
blue : out std_logic; |
green : out std_logic; |
red : out std_logic; |
|
-- LEDS & Switches |
leds : out std_logic_vector(7 downto 0); |
switches : in std_logic_vector(7 downto 0); |
|
-- seven segment display |
segments : out std_logic_vector(7 downto 0); |
digits : out std_logic_vector(3 downto 0) |
); |
end my_system09; |
|
------------------------------------------------------------------------------- |
-- Architecture for System09 |
------------------------------------------------------------------------------- |
architecture my_computer of my_system09 is |
----------------------------------------------------------------------------- |
-- constants |
----------------------------------------------------------------------------- |
constant SYS_Clock_Frequency : integer := 50000000; -- FPGA System Clock |
constant VGA_Clock_Frequency : integer := 25000000; -- VGA Pixel Clock |
constant CPU_Clock_Frequency : integer := 25000000; -- 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 |
----------------------------------------------------------------------------- |
-- BOOT ROM |
signal rom_cs : Std_logic; |
signal rom_data_out : Std_Logic_Vector(7 downto 0); |
|
-- FLEX9 RAM |
signal flex_cs : Std_logic; |
signal flex_data_out : Std_Logic_Vector(7 downto 0); |
|
-- ACIA Interface signals |
signal acia_clk : std_logic; |
signal acia_data_out : Std_Logic_Vector(7 downto 0); |
signal acia_cs : Std_Logic; |
signal acia_irq : Std_Logic; |
signal acia_rxd : Std_Logic; |
signal acia_txd : Std_Logic; |
signal acia_dcd_n : Std_Logic; |
-- signal acia_rts_n : Std_Logic; |
signal acia_cts_n : Std_Logic; |
|
-- keyboard port |
signal keyboard_data_out : std_logic_vector(7 downto 0); |
signal keyboard_cs : std_logic; |
signal keyboard_irq : std_logic; |
|
-- LEDs |
signal leds_data_out : std_logic_vector(7 downto 0); |
signal leds_cs : std_logic; |
|
-- RAM |
signal ram_cs : std_logic; -- memory chip select |
signal ram_data_out : std_logic_vector(7 downto 0); |
signal ram1_ce : std_logic; |
signal ram1_ub : std_logic; |
signal ram1_lb : std_logic; |
signal ram2_ce : std_logic; |
signal ram2_ub : std_logic; |
signal ram2_lb : std_logic; |
signal ram_we : std_logic; |
signal ram_oe : std_logic; |
|
-- 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 vdu_cs : std_logic; |
signal vdu_data_out : std_logic_vector(7 downto 0); |
signal vga_clk : std_logic; |
|
-- 7 Segment Display |
signal seg_cs : std_logic; |
signal seg_data_out : std_logic_vector(7 downto 0); |
|
-- System Clock Prescaler |
signal clk_count : std_logic; |
|
----------------------------------------------------------------- |
-- |
-- 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; |
|
|
---------------------------------------- |
-- |
-- 4KByte 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 (11 downto 0); |
rdata : out std_logic_vector (7 downto 0); |
wdata : in std_logic_vector (7 downto 0) |
); |
end component; |
|
---------------------------------------- |
-- |
-- 8KBytes Block RAM for FLEX9 |
-- $C000 - $DFFF |
-- |
---------------------------------------- |
component flex_ram |
Port ( |
clk : in std_logic; |
rst : in std_logic; |
cs : in std_logic; |
rw : in std_logic; |
addr : in std_logic_vector (12 downto 0); |
rdata : out std_logic_vector (7 downto 0); |
wdata : in 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 |
-- |
----------------------------------------------------------------- |
|
component ACIA_6850 |
port ( |
clk : in Std_Logic; -- System Clock |
rst : in Std_Logic; -- Reset input (active high) |
cs : in Std_Logic; -- ACIA 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; |
|
|
---------------------------------------- |
-- |
-- 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 |
generic( |
VDU_CLOCK_FREQUENCY : integer := CPU_Clock_Frequency; -- HZ |
VGA_CLOCK_FREQUENCY : integer := VGA_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; |
|
---------------------------------------- |
-- |
-- Seven Segment Display driver |
-- |
---------------------------------------- |
|
component seven_segment is |
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); |
segments : out std_logic_vector(7 downto 0); |
digits : out std_logic_vector(3 downto 0) |
); |
end component; |
|
component BUFG |
port ( |
i : in std_logic; |
o : out std_logic |
); |
end component; |
|
begin |
----------------------------------------------------------------------------- |
-- Instantiation of internal components |
----------------------------------------------------------------------------- |
|
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 |
); |
|
my_rom : mon_rom port map ( |
clk => cpu_clk, |
rst => cpu_reset, |
cs => rom_cs, |
rw => '1', |
addr => cpu_addr(11 downto 0), |
rdata => rom_data_out, |
wdata => cpu_data_out |
); |
|
my_flex : flex_ram port map ( |
clk => cpu_clk, |
rst => cpu_reset, |
cs => flex_cs, |
rw => cpu_rw, |
addr => cpu_addr(12 downto 0), |
rdata => flex_data_out, |
wdata => cpu_data_out |
); |
|
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) |
); |
|
my_acia : ACIA_6850 port map ( |
clk => cpu_clk, |
rst => cpu_reset, |
cs => acia_cs, |
rw => cpu_rw, |
irq => acia_irq, |
Addr => cpu_addr(0), |
Datain => cpu_data_out, |
DataOut => acia_data_out, |
RxC => acia_clk, |
TxC => acia_clk, |
RxD => acia_rxd, |
TxD => acia_txd, |
DCD_n => acia_dcd_n, |
CTS_n => acia_cts_n, |
RTS_n => open |
); |
|
|
---------------------------------------- |
-- |
-- ACIA Clock |
-- |
---------------------------------------- |
my_ACIA_Clock : ACIA_Clock |
generic map( |
SYS_Clock_Frequency => SYS_Clock_Frequency, |
ACIA_Clock_Frequency => ACIA_Clock_Frequency |
) |
port map( |
clk => sys_clk, |
acia_clk => acia_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 => ps2c, |
kbd_data => ps2d |
); |
|
---------------------------------------- |
-- |
-- Video Display Unit instantiation |
-- |
---------------------------------------- |
my_vdu : vdu8 |
generic map( |
VDU_CLOCK_FREQUENCY => CPU_Clock_Frequency, -- HZ |
VGA_CLOCK_FREQUENCY => VGA_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 => vga_clk, -- 25 MHz VDU pixel clock |
vga_red_o => red, |
vga_green_o => green, |
vga_blue_o => blue, |
vga_hsync_o => hs, |
vga_vsync_o => vs |
); |
|
|
---------------------------------------- |
-- |
-- Seven Segment Display instantiation |
-- |
---------------------------------------- |
|
my_seg : seven_segment port map ( |
clk => cpu_clk, |
rst => cpu_reset, |
cs => seg_cs, |
rw => cpu_rw, |
addr => cpu_addr(1 downto 0), |
data_in => cpu_data_out, |
data_out => seg_data_out, |
segments => segments, |
digits => digits |
); |
|
|
vga_clk_buffer : BUFG port map( |
i => clk_count, |
o => vga_clk |
); |
|
cpu_clk_buffer : BUFG port map( |
i => clk_count, |
o => cpu_clk |
); |
|
-- |
-- Clock divider |
-- Assumes 50 MHz system clock |
-- 25MHz pixel clock |
-- 25MHz CPU clock |
-- |
sys09_clock : process( sys_clk, clk_count ) |
begin |
if sys_clk'event and sys_clk='1' then |
clk_count <= not clk_count; |
end if; |
end process; |
|
---------------------------------------------------------------------- |
-- |
-- Process to decode memory map |
-- |
---------------------------------------------------------------------- |
|
mem_decode: process( cpu_addr, cpu_rw, cpu_vma, |
dat_cs, dat_addr, |
rom_data_out, |
acia_data_out, |
keyboard_data_out, |
vdu_data_out, |
seg_data_out, |
leds_data_out, |
flex_data_out, |
ram_data_out |
) |
begin |
cpu_data_in <= (others=>'0'); |
dat_cs <= '0'; |
rom_cs <= '0'; |
acia_cs <= '0'; |
keyboard_cs <= '0'; |
vdu_cs <= '0'; |
seg_cs <= '0'; |
leds_cs <= '0'; |
flex_cs <= '0'; |
ram_cs <= '0'; |
-- timer_cs <= '0'; |
-- trap_cs <= '0'; |
-- pb_cs <= '0'; |
-- ide_cs <= '0'; |
-- ether_cs <= '0'; |
-- slot1_cs <= '0'; |
-- slot2_cs <= '0'; |
|
if cpu_addr( 15 downto 8 ) = "11111111" then |
cpu_data_in <= rom_data_out; |
dat_cs <= cpu_vma; -- write DAT |
rom_cs <= cpu_vma; -- read ROM |
-- |
-- Sys09Bug Monitor ROM $F000 - $FFFF |
-- |
elsif dat_addr(3 downto 0) = "1111" then -- $XF000 - $XFFFF |
-- |
-- Monitor ROM $F000 - $FFFF |
-- |
cpu_data_in <= rom_data_out; |
rom_cs <= cpu_vma; -- read ROM |
|
-- |
-- IO Devices $E000 - $EFFF |
-- |
elsif dat_addr(3 downto 0) = "1110" then -- $XE000 - $XEFFF |
case cpu_addr(11 downto 8) is |
-- |
-- SWTPC peripherals from $E000 to $E0FF |
-- |
when "0000" => |
case cpu_addr(7 downto 4) is |
-- |
-- ACIA ($E000 - $E00F) |
-- |
when "0000" => |
cpu_data_in <= acia_data_out; |
acia_cs <= cpu_vma; |
|
-- |
-- Reserved - FD1771 FDC ($E010 - $E01F) (SWTPC) |
-- |
|
-- |
-- Keyboard port ($E020 - $E02F) |
-- |
when "0010" => |
cpu_data_in <= keyboard_data_out; |
keyboard_cs <= cpu_vma; |
|
-- |
-- VDU port ($E030 - $E03F) |
-- |
when "0011" => |
cpu_data_in <= vdu_data_out; |
vdu_cs <= cpu_vma; |
|
-- |
-- Reserved - SWTPc MP-T ($E040 - $E04F) |
-- |
|
-- |
-- Reserved - Timer ($E050 - $E05F) (B5-X300) |
-- |
|
-- |
-- Reserved - Bus Trap Logic ($E060 - $E06F) (B5-X300) |
-- |
|
-- |
-- Reserved - I/O port ($E070 - $E07F) (B5-X300) |
-- |
|
-- |
-- Reserved - PTM 6840 ($E080 - $E08F) (SWTPC) |
-- |
|
-- |
-- Reserved - PIA Timer ($E090 - $E09F) (SWTPC) |
-- |
|
-- |
-- Read Switched port ($E0A0 - $E0AF) |
-- Write LEDS |
-- |
when "1010" => |
cpu_data_in <= leds_data_out; |
leds_cs <= cpu_vma; |
|
-- |
-- 7 segment display port ($E0B0 - $E0BF) |
-- |
when "1011" => |
cpu_data_in <= seg_data_out; |
seg_cs <= cpu_vma; |
|
|
when others => -- $EXC0 to $EXFF |
null; |
end case; |
-- |
-- XST-3.0 Peripheral Bus goes here |
-- $E100 to $E1FF |
-- Four devices |
-- IDE, Ethernet, Slot1, Slot2 |
-- |
-- when "0001" => |
-- cpu_data_in <= pb_data_out; |
-- pb_cs <= cpu_vma; |
-- case cpu_addr(7 downto 6) is |
-- |
-- IDE Interface $E100 to $E13F |
-- |
-- when "00" => |
-- ide_cs <= cpu_vma; |
-- |
-- Ethernet Interface $E140 to $E17F |
-- |
-- when "01" => |
-- ether_cs <= cpu_vma; |
-- |
-- Slot 1 Interface $E180 to $E1BF |
-- |
-- when "10" => |
-- slot1_cs <= cpu_vma; |
-- |
-- Slot 2 Interface $E1C0 to $E1FF |
-- |
-- when "11" => |
-- slot2_cs <= cpu_vma; |
-- |
-- Nothing else |
-- |
-- when others => |
-- null; |
-- end case; |
-- |
-- $E200 to $EFFF reserved for future use |
-- |
when others => |
null; |
end case; |
-- |
-- FLEX RAM $0C000 - $0DFFF |
-- |
elsif dat_addr(7 downto 1) = "0000110" then -- $0C000 - $0DFFF |
cpu_data_in <= flex_data_out; |
flex_cs <= cpu_vma; |
-- |
-- Everything else is RAM |
-- |
else |
cpu_data_in <= ram_data_out; |
ram_cs <= cpu_vma; |
end if; |
end process; |
|
|
-- |
-- 1M byte SRAM Control |
-- Processes to read and write memory based on bus signals |
-- |
ram_process: process( cpu_reset, sys_clk, |
cpu_addr, cpu_rw, cpu_vma, cpu_data_out, |
dat_addr, ram_cs, |
ram1_ce, ram1_ub, ram1_lb, ram1_data, |
ram2_ce, ram2_ub, ram2_lb, ram2_data, |
ram_we, ram_oe ) |
begin |
-- |
-- ram_hold signal helps |
-- |
if( cpu_reset = '1' ) then |
ram_we <= '0'; |
ram_oe <= '0'; |
-- |
-- Clock Hold on rising edge |
-- |
elsif( sys_clk'event and sys_clk='1' ) then |
if (ram_cs = '1') and (ram_we = '0') and (ram_oe = '0') then |
ram_we <= not cpu_rw; |
ram_oe <= cpu_rw; |
else |
ram_we <= '0'; |
ram_oe <= '0'; |
end if; |
end if; |
|
ram_wen <= not ram_we; |
ram_oen <= not ram_oe; |
|
ram1_ce <= ram_cs and (not cpu_addr(1)); |
ram1_ub <= not cpu_addr(0); |
ram1_lb <= cpu_addr(0); |
ram1_cen <= not ram1_ce; |
ram1_ubn <= not ram1_ub; |
ram1_lbn <= not ram1_lb; |
|
ram2_ce <= ram_cs and cpu_addr(1); |
ram2_ub <= not cpu_addr(0); |
ram2_lb <= cpu_addr(0); |
ram2_cen <= not ram2_ce; |
ram2_ubn <= not ram2_ub; |
ram2_lbn <= not ram2_lb; |
|
ram_addr(17 downto 10) <= dat_addr(7 downto 0); |
ram_addr(9 downto 0) <= cpu_addr(11 downto 2); |
|
if ram_we = '1' and ram1_ce = '1' and ram1_lb = '1' then |
ram1_data(7 downto 0) <= cpu_data_out; |
else |
ram1_data(7 downto 0) <= "ZZZZZZZZ"; |
end if; |
|
if ram_we = '1' and ram1_ce = '1' and ram1_ub = '1' then |
ram1_data(15 downto 8) <= cpu_data_out; |
else |
ram1_data(15 downto 8) <= "ZZZZZZZZ"; |
end if; |
|
if ram_we = '1' and ram2_ce = '1' and ram2_lb = '1' then |
ram2_data(7 downto 0) <= cpu_data_out; |
else |
ram2_data(7 downto 0) <= "ZZZZZZZZ"; |
end if; |
|
if ram_we = '1' and ram2_ce = '1' and ram2_ub = '1' then |
ram2_data(15 downto 8) <= cpu_data_out; |
else |
ram2_data(15 downto 8) <= "ZZZZZZZZ"; |
end if; |
|
case cpu_addr(1 downto 0) is |
when "00" => |
ram_data_out <= ram1_data(15 downto 8); |
when "01" => |
ram_data_out <= ram1_data(7 downto 0); |
when "10" => |
ram_data_out <= ram2_data(15 downto 8); |
when others => |
ram_data_out <= ram2_data(7 downto 0); |
end case; |
end process; |
|
-- |
-- LEDS output register |
-- |
leds_output : process( cpu_clk, cpu_reset, switches ) |
begin |
if cpu_reset = '1' then |
leds <= "00000000"; |
elsif cpu_clk'event and cpu_clk='0' then |
if leds_cs = '1' and cpu_rw = '0' then |
leds <= cpu_data_out; |
end if; |
end if; |
leds_data_out <= switches; |
end process; |
|
-- |
-- Interrupts and other bus control signals |
-- |
interrupts : process( rst_sw, |
acia_irq, |
keyboard_irq, |
nmi_sw |
) |
begin |
if sys_clk'event and sys_clk = '1' then |
cpu_reset <= rst_sw; -- CPU reset is active high |
end if; |
cpu_firq <= keyboard_irq; |
cpu_nmi <= nmi_sw; |
cpu_irq <= acia_irq; |
cpu_halt <= '0'; |
cpu_hold <= '0'; |
end process; |
|
-- |
-- ACIA pin assignments |
-- |
acia_assignments : process( rxd, acia_txd ) |
begin |
acia_dcd_n <= '0'; |
acia_cts_n <= '0'; |
acia_rxd <= rxd; |
txd <= acia_txd; |
end process; |
|
|
end my_computer; --===================== End of architecture =======================-- |
|
/branches/mkfiles_rev1/rtl/System09_Memec_XC2V1000/my_system09.prj
13,4 → 13,4
vhdl work "../VHDL/cpu09.vhd" |
vhdl work "../VHDL/SevenSegment.vhd" |
vhdl work "../VHDL/ACIA_6850.vhd" |
vhdl work "System09_Digilent_3S200.vhd" |
vhdl work "System09_Memec_XC2V1000.vhd" |
/branches/mkfiles_rev1/rtl/System09_Memec_XC2V1000/my_system09.ucf
0,0 → 1,75
#PACE: Start of Constraints generated by PACE |
|
#PACE: Start of PACE I/O Pin Assignments |
# 100 MHz clock |
NET "sys_clk" LOC = "B8" ; |
# |
# PUSH BUTTONS |
# |
# SW3 - pushbutton 1 |
NET "rst_sw" LOC = "M4" ; |
# SW4 - pushbutton 2 |
NET "nmi_sw" LOC = "T7" ; |
# |
# LEDs |
# |
#NET "leds<0>" LOC = "K12"; |
#NET "leds<1>" LOC = "P14"; |
#NET "leds<2>" LOC = "L12"; |
#NET "leds<3>" LOC = "N14"; |
#NET "leds<4>" LOC = "P13"; |
#NET "leds<5>" LOC = "N12"; |
#NET "leds<6>" LOC = "P12"; |
#NET "leds<7>" LOC = "P11"; |
# |
# Switches |
# |
NET "switches<0>" LOC = "D8"; |
NET "switches<1>" LOC = "R13"; |
NET "switches<2>" LOC = "T14"; |
NET "switches<3>" LOC = "P16"; |
NET "switches<4>" LOC = "N16"; |
NET "switches<5>" LOC = "M13"; |
NET "switches<6>" LOC = "J16"; |
NET "switches<7>" LOC = "J15"; |
# |
# PS/2 KEYBOARD |
# |
#NET "ps2c" LOC = "M16" ; |
#NET "ps2d" LOC = "M15" ; |
# |
# UART |
# |
NET "rxd" LOC = "T9" ; |
NET "txd" LOC = "T10" ; |
# |
# VDU |
# |
NET "red" LOC = "M2" ; |
NET "green" LOC = "T5" ; |
NET "blue" LOC = "N7" ; |
NET "hs" LOC = "L1" ; |
NET "vs" LOC = "L2" ; |
# |
# 7 SEGMENT DISPLAY |
# |
NET "segments<0>" LOC = "D12"; |
NET "segments<1>" LOC = "C12"; |
NET "segments<2>" LOC = "B13"; |
NET "segments<3>" LOC = "A9"; |
NET "segments<4>" LOC = "B9"; |
NET "segments<5>" LOC = "C9"; |
NET "segments<6>" LOC = "D9"; |
NET "segments<7>" LOC = "A10"; |
|
# |
# Timing Constraints |
# |
NET "sys_clk" TNM_NET = "sys_clk"; |
TIMESPEC "TS_sys_clk" = PERIOD "sys_clk" 20 ns LOW 50 %; |
|
#PACE: Start of PACE Area Constraints |
|
#PACE: Start of PACE Prohibit Constraints |
|
#PACE: End of Constraints generated by PACE |