[Balloon-svn] r1017 - balloon/branches/novlio/vhdl/fpga

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: subversion@balloonboard.org
Date:  
To: balloon-svn
Subject: [Balloon-svn] r1017 - balloon/branches/novlio/vhdl/fpga
Author: wookey
Date: 2010-03-11 18:13:24 +0000 (Thu, 11 Mar 2010)
New Revision: 1017

Modified:
balloon/branches/novlio/vhdl/fpga/balloon3.vhd
Log:
Bump version number now that FPGA works again


Modified: balloon/branches/novlio/vhdl/fpga/balloon3.vhd
===================================================================
--- balloon/branches/novlio/vhdl/fpga/balloon3.vhd    2010-03-11 14:06:58 UTC (rev 1016)
+++ balloon/branches/novlio/vhdl/fpga/balloon3.vhd    2010-03-11 18:13:24 UTC (rev 1017)
@@ -1,790 +1,790 @@
--- $HDR$--
---+++++++++--
---Source Archived--
---Version in Repository:--
--- $Log:  25084: balloon3.vhd 
---
---   Rev 1.18    2/13/2008 12:15:02 AM  David
--- Switches PCMCIA npwe to a dummy since we on't want the PCMCIA bus excluding
--- it from the back plane.
---
---
---   Rev 1.17    2/13/2008 12:06:52 AM  David
--- CJ's BTRX mod added
---
---+++++++++--
-----------------------------------------------------------------------------------
--- Company:
--- Engineer: 
--- 
--- Create Date:    14:00:50 06/30/2006 
--- Design Name: 
--- Module Name:    GenericL3 - Behavioral 
--- Project Name: 
--- Target Devices: 
--- Tool versions: 
--- Description: Generic Balloon 3 interface glue for both CPLD and FPGA variants
---
--- Dependencies: 
---
--- Revision: 
--- Revision 0.01 - File Created
---          0v1 - initial release with P2
---                ?? - CMJ further mods for E1 board: I2C pullups, LCD pixel clock
--- Additional Comments: 
--- The following functions are not implemented in this version:
--- -- RS232 forwarding to the pinko connector or diversion from the backplane
--- -- Backplane data handling other than that required for CF
-
-----------------------------------------------------------------------------------
-library IEEE;
-use IEEE.STD_LOGIC_1164.ALL;
-use IEEE.STD_LOGIC_ARITH.ALL;
-use IEEE.STD_LOGIC_UNSIGNED.ALL;
-
----- Uncomment the following library declaration if instantiating
----- any Xilinx primitives in this code.
---library UNISIM;
---use UNISIM.VComponents.all;
-
-entity Balloon3 is
-    generic ( Version : std_logic_vector(7 downto 0) := X"00"; --Top byte comes from wrapper
-                 CPU_Address_Bus_Size : integer := 26;
-                 CPU_Data_Bus_Size : integer := 32;
-                 Backplane_Address_Bus_Size : integer := 26;
-                 Backplane_Data_Bus_Size : integer := 32
-                );
-    Port (
-    cpu_a        : in std_logic_vector (CPU_Address_Bus_Size-1 downto 0);
-    cpu_data  : inout std_logic_vector (CPU_Data_Bus_Size-1 downto 0);
-    cpu_rdy     : out std_logic;
-    cpu_rdnwr : in std_logic;
-    cpu_noe     : in std_logic;
-    cpu_nwe     : in std_logic;
-    cpu_ncs5     : in std_logic;
-    cpu_ncs4     : in std_logic;
-    cpu_ncs3     : in std_logic;
-    cpu_ncs1     : in std_logic;
-    cpu_ncs0     : in std_logic;
-    cpu_ncs2     : in std_logic;
-    cpu_dqm0     : in std_logic;
-    cpu_dqm1     : in std_logic;
-    cpu_dqm2     : in std_logic;
-    cpu_dqm3     : in std_logic;
-    cpu_nsdcs3 : in std_logic;
-    cpu_nsdcs2 : in std_logic;
-    cpu_sdclk0 : in std_logic;
-    nreset      : in std_logic;
-    clk_48M      : in std_logic;
-    bb_ib_dat0     : out std_logic;
-    bb_ob_clk     : in std_logic;
-    bb_ob_stb     : in std_logic;
-    bb_ob_dat0     : in std_logic;
-    bb_ib_clk     : out std_logic;
-    msl_clk_ext     : inout std_logic;
-    bb_ib_stb     : out std_logic;
-    nand_d     : inout std_logic_vector (15 downto 0);
-    nand_rnb     : in std_logic;
-    nand_nwe     : out std_logic;
-    nand_nre     : out std_logic;
-    nand_nwp     : out std_logic;
-    nand_cle     : out std_logic;
-    nand_ale     : out std_logic;
-    nand_nce0     : out std_logic;
-    nand_nce1     : out std_logic;
-    nand_nce2     : out std_logic;
-    nand_nce3     : out std_logic;
-    nand_nce4     : out std_logic;
-    nand_nce5     : out std_logic;
-    bp_a        : out std_logic_vector (Backplane_Address_Bus_Size-1 downto 0);
-    bp_d        : inout std_logic_vector (Backplane_Data_Bus_Size-1 downto 0);
-    bp_noe     : out std_logic;
-    bp_nwe     : out std_logic;
-    bp_ncs2     : out std_logic;
-    bp_ncs3     : out std_logic;
-    bp_ncs4     : out std_logic;
-    bp_ncs5     : out std_logic;
-    bp_rd_nwr : out std_logic;
-    bp_sdclk1 : out std_logic;
-    bp_sdclk0 : out std_logic;
-    bp_dreq0     : in std_logic;
-    bp_dval0     : in std_logic;
-    bp_nreset     : out std_logic;
-    bp_ext_rdy     : in std_logic;
-    bp_nsktsel     : out std_logic;
-    bp_cf_nrdy     : in std_logic;
-    bp_npce1     : out std_logic;
-    bp_npce2     : out std_logic;
-    bp_npoe     : out std_logic;
-    bp_npwe     : out std_logic;
-    bp_npior     : out std_logic;
-    bp_npiow     : out std_logic;
-    bp_dqm0     : out std_logic;
-    bp_dqm1     : out std_logic;
-    bp_dqm2     : out std_logic;
-    bp_dqm3     : out std_logic;
-    bp_irq     : in std_logic;
-    bp_npwait     : in std_logic;
-    bp_niois16     : in std_logic;
-    bp_npreg        : out std_logic;
-    bp_nstschg     : in std_logic;
-    bp_cf_nreset : out std_logic;
-    cf_npoe     : in std_logic;
-    cf_npwe     : in std_logic;
-    cf_npce1     : in std_logic;
-    cf_npce2     : in std_logic;
-    cf_niois16     : out std_logic;
-    cf_npwait     : out std_logic;
-    cf_npreg     : in std_logic;
-    cf_npior     : in std_logic;
-    cf_npiow     : in std_logic;
-    cf_npsktsel     : in std_logic;
-    aux_nirq        : out std_logic;
-    aux_unsuspend     : out std_logic;
-    samosa_d        : inout std_logic_vector (15 downto 0);
-    samosa_rnb     : in std_logic;
-    samosa_absent     : in std_logic;
-    samosa_reset     : out std_logic;
-    samosa_irq     : in std_logic;
-    samosa_nwe     : out std_logic;
-    samosa_nre     : out std_logic;
-    samosa_nwp     : out std_logic;
-    samosa_cle     : out std_logic;
-    samosa_ale     : out std_logic;
-    samosa_nce     : out std_logic;
-    samosa_wp     : in std_logic;
-    cif_dd     : inout std_logic_vector (9 downto 0);
-    cif_pclk     : inout std_logic;
-    cif_fv     : inout std_logic;
-    cif_lv     : inout std_logic;
-    cif_mclk     : in std_logic;
-    pinko_txd     : out std_logic;
-    pinko_rxd     : in std_logic;
-    pinko_cts     : out std_logic;
-    com1_bttxd     : in std_logic;
-    com1_btrxd     : out std_logic;
-    pxa_scl     : in std_logic;
-    pxa_sda     : inout std_logic;
-    lcd_pclk     : in std_logic;
-    lpclk_out     : out std_logic;
-    green_led     : out std_logic
- );
-end Balloon3;
-
-architecture Behavioral of Balloon3 is
-
-    attribute init: string;
-    
-    constant Version_Minor : std_logic_vector(7 downto 0) := X"15";
-
-    constant CF_reset_state : std_logic_vector(7 downto 0)
-                    :=    -- '0' &
-                        -- '0' &
-                        -- '0' &
-                        -- '0' &
-                        -- '0' &
-                        -- '0' &     --(10) Card interrupt source ? should also assert AUX_IRQ BP_CF_NRDY
-                        -- '0' &     --( 9) Reserved for nBVD2
-                        -- '0' &     --( 8) nBVD1 signal from card (NSTSCHNG)
-                        '0' &     --( 7) VS2
-                        '0' &     --( 6) VS1
-                        '0' &     --( 5) Reserved for PCMCIA card detection on Mainstone (Balloon uses GPIO105)
-                        '0' &     --( 4) Reset signal for CF card
-                        '0' &     --( 3) Reserved for PCMCIA power management
-                        '0' &     --( 2) Reserved for PCMCIA power management
-                        '0' &     --( 1) Reserved for PCMCIA power management
-                        '0' ;   --( 0) Reserved for PCMCIA power management
-
-    constant cpu_Control_reset_state : std_logic_vector(7 downto 0)
-                    :=    '0' &     --(7) VS2
-                        '0' &     
-                        '0' &     --(5) Park NAND control lines.
-                        '0' &     --(4) Park IO ready for power off.
-                        '0' &     
-                        '1' &     --(2) PINKO CTS
-                        '0' &     --(1) PCMCIA Address Disable
-                       '0';     --(0) PCMCIA/CF Card Disable
-
---NAND Control
-    signal nand_select : std_logic;
-    signal nand_device_select : std_logic;
-    signal nand_control_select : std_logic;
-    signal nand_control2_select : std_logic;
-    signal nand_status_select : std_logic;
-    signal nand_data_out : std_logic_vector(15 downto 0);
-    
--- SAMOSA
-    signal samosa_irq_out : std_logic;
-    signal samosa_select : std_logic;
-    signal samosa_read_select : std_logic;
-     signal samosa_data_out  : std_logic_vector (15 downto 0);
-    signal samosa_int : std_logic;
-
---General Control Latch
-    signal control_latch : std_logic_vector (7 downto 0);
-    signal general_control_select : std_logic;
-
--- Park signals
-    signal samosa_park : std_logic;
-    signal nand_park : std_logic;
-    
---Version
-    signal version_select:    std_logic;
-    signal version_out : std_logic_vector (15 downto 0);
-    -- Upper nibble = 0x4 says I'm an FPGA = 0x8 says I'm a CPLD.
-    -- 0xf indicates not there or unprogrammed.
-    -- Next nibble = 0xf for debug/experimental version
-    -- Otherwise this is the major version number.
-    -- Upper byte comes from wrapper lower byte from here.
-    -- lower byte is release number.
-
--- Reset Latch
-
---Interupt Control Latch
-    signal interupt_control : std_logic_vector (7 downto 0);
-    signal interupt_control_select : std_logic;
-    signal interupt_status : std_logic_vector (7 downto 0);
-    signal pcmcia_nrdy_latch : std_logic;
-    signal pcmcia_nstschng_latch : std_logic;
-    
---MODULES
-    signal mod_add : std_logic_vector(7 downto 0);
-    signal internal_reg : std_logic;
-    signal samosa_reg : std_logic;
-    constant BALLOON_INTERNAL     : std_logic_vector ( 7 downto 0):= X"e0"; --a(23..16)
-    constant SAMOSA_ADDRESS       : std_logic_vector ( 7 downto 0):= X"c0"; --a(23..16)
-
---REGISTERS
-    constant NUM_DECODE_BITS : integer := 12;
-    signal reg_add : std_logic_vector(NUM_DECODE_BITS-1 downto 0);
-    
-    --Constants that define the internal register addresses
-    constant NAND_ADD             : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"000"; -- a(11..0)
-    constant CF_CONTROL_ADD       : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"008";
-    constant NAND_CONTROL2_ADD    : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"010";
-    constant NAND_CONTROL_ADD     : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"014";
-    constant NAND_STATUS_ADD      : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"014";
-    constant INTERUPT_CONTROL_ADD : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"00C";
-    constant VERSION_ADD          : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"01C";
-    constant GENERAL_CONTROL_ADD  : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"01C";
-        
-    signal internal_read_select   : std_logic;
-    signal internal_register_select : std_logic;
-
-    -- this signal is the reset/not set signal for set/clear registers
-    -- it's connected to A12
-    signal internal_RnS : std_logic;
---PCMCIA
-    signal pcmcia_select : std_logic;
-    signal cf_control : std_logic_vector (7 downto 0);
-    signal cf_control_select : std_logic;
-    signal pcmcia_status : std_logic_vector (7 downto 0);
-    signal pcmcia_nrdy : std_logic;
-    signal pcmcia_nstschg : std_logic;
-    signal pcmcia_enable_out : std_logic;
-    signal pcmcia_data_out : std_logic_vector (15 downto 0);
-    signal pcmcia_wants_bus : std_logic;
-    signal pcmcia_stschng_int : std_logic;
-    signal pcmcia_rdy_int : std_logic;
-    signal cf_card_data : std_logic_vector(15 downto 0);
-    signal cf_card_address : std_logic_vector(10 downto 0);
-    signal dummy : std_logic;
-    
---BACKPLANE
-    signal bp_enable  : std_logic;
-    signal backplane_read : std_logic;
-    
-    signal debug_data : std_logic_vector (15 downto 0);
-
---PXA BUS
-    signal internal_dout : std_logic_vector (15 downto 0);
-
--- VLIO signals
-    signal vlio_nstart : std_logic;
-    signal vlio_delay : std_logic_vector(3 downto 0);
-    signal vlio_rdy : std_logic;
-    signal vlio_disable : std_logic;
-    
-component single_sr_output_port is
-    Generic ( WIDTH : natural := 8 );
-     Port (
-                RESET_STATE : in STD_LOGIC_VECTOR(WIDTH-1 downto 0) := (others=>'0');
-                D : in  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
-              register_select : in  STD_LOGIC;
-              nWE : in  STD_LOGIC;
-              EN : in  STD_LOGIC;
-              RnS : in  STD_LOGIC;
-              Q : out  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
-              RESET : in  STD_LOGIC);
-end component;
-
-component Balloon_nand is
-    port (
-            data_bus_in  : in std_logic_vector (15 downto 0);
-            data_bus_out : out std_logic_vector (15 downto 0);
-            cpu_nwe : in std_logic;
-            cpu_noe : in std_logic;
-            cpu_rdnwr : in std_logic;
-            internal_RnS : in std_logic;
-            nand_device_select : in std_logic;
-            nand_control_select : in std_logic;
-            nand_control2_select : in std_logic;
-            nand_status_select : in std_logic;
-            park_nand : in std_logic;
-            nreset : in std_logic;
-            nand_nre : out std_logic;
-            nand_nwe : out std_logic;
-            nand_cle : out std_logic;
-            nand_ale : out std_logic;
-            nand_nce0 : out std_logic;
-            nand_nce1 : out std_logic;
-            nand_nce2 : out std_logic;
-            nand_nce3 : out std_logic;
-            nand_nce4 : out std_logic;
-            nand_nce5 : out std_logic;
-            nand_nwp  : out std_logic;
---            nand_rnb : inout std_logic;
-            nand_rnb : in std_logic;
-            nand_chip_data : inout std_logic_vector(15 downto 0)
-            );
-            
-end component;
-
-component Balloon_pcmcia is
-    port (
-            data_bus_in : in std_logic_vector(15 downto 0);
-            data_bus_out : out std_logic_vector(15 downto 0);
-            address_bus : in std_logic_vector(10 downto 0);
-            bus_rdnwr : in std_logic;
-            nreset : in std_logic;
-            want_bus : out std_logic;
-            card_data : inout std_logic_vector(15 downto 0);
-            card_address : out std_logic_vector(10 downto 0);
-            park_interface : in std_logic;
-            enable_pcmcia : in std_logic;
-            address_enable : in std_logic;
-            cpu_npoe : in std_logic;
-            cpu_npce1 : in std_logic;
-            cpu_npce2 : in std_logic;
-            cpu_npior : in std_logic;
-            cpu_npiow : in std_logic;
-            cpu_npreg : in std_logic;
-            cpu_npwe : in std_logic;
-            cpu_npsktsel : in std_logic;
-            cpu_niois16 : out std_logic;
-            cpu_npwait : out std_logic;
-            nstschng_out : out std_logic;
-            nrdy_out : out std_logic;
-            data_enable_out : out std_logic; --indicates when PCMCIA is driving the databus
-            card_reset_in : in std_logic; -- source of card reset
-            card_npoe : out std_logic;
-            card_npce1 : out std_logic; --lower byte lane enable
-            card_npce2 : out std_logic; --upper byte lane enable
-            card_npior : out std_logic;
-            card_npiow : out std_logic;
-            card_npreg : out std_logic; --effectively a11
-            card_npwe : out std_logic;  --card write enable
-            card_niois16 : in std_logic; --card is 16 bits
-            card_npwait : in std_logic; --wait from card
-            card_reset : out std_logic; --reset out to card
-            card_nstschng : in std_logic;
-            card_nrdy : in std_logic
-    );
-            
-end component;
-
-component Balloon_samosa is
-    port (
-            data_bus_in : in std_logic_vector (15 downto 0);
-            data_bus_out : out std_logic_vector (15 downto 0);
-            reg_add : in std_logic_vector (2 downto 0); --a4..a2 selects SAMOSA control Latches
-            cpu_nwe : in std_logic;
-            cpu_noe : in std_logic;
-            cpu_rdnwr : in std_logic;
-            samosa_select : in std_logic;
-            park_IO : in std_logic;
-            nreset : in std_logic;
-            samosa_reset_in : in std_logic;
-            irq_out : out std_logic;
-            samosa_irq : in std_logic;
-            samosa_absent: in std_logic;
-            samosa_nre : out std_logic;
-            samosa_nwe : out std_logic;
-            samosa_cle : out std_logic;
-            samosa_ale : out std_logic;
-            samosa_nce : out std_logic;
-            samosa_nwp : out std_logic;
-            samosa_reset_out : out std_logic;
-            samosa_skt_data : inout std_logic_vector(15 downto 0)
-            );
-end component;
-
-component vlio_timer is
-    Generic ( TIMER_WIDTH : NATURAL :=4);
-    Port ( clk : in  STD_LOGIC;
-           reset : in  STD_LOGIC;
-           rdy : out  STD_LOGIC;
-           nstart : in  STD_LOGIC;
-           delay : in  STD_LOGIC_VECTOR (TIMER_WIDTH-1 downto 0));
-end component;
-
-begin
-
-Nand_Interface : Balloon_nand
-    Port Map(
-            data_bus_in => cpu_data(15 downto 0),
-            data_bus_out => nand_data_out,
-            cpu_nwe => cpu_nwe,
-            cpu_noe => cpu_noe,
-            cpu_rdnwr => cpu_rdnwr,
-            internal_RnS => internal_RnS,
-            nand_device_select => nand_device_select,
-            nand_control_select => nand_control_select,
-            nand_control2_select => nand_control2_select,
-            nand_status_select => nand_status_select,
-            park_nand => nand_park,
-            nreset => nreset,
-            nand_nre => nand_nre,
-            nand_nwe => nand_nwe,
-            nand_cle => nand_cle,
-            nand_ale => nand_ale,
-            nand_nce0 => nand_nce0,
-            nand_nce1 => nand_nce1,
-            nand_nce2 => nand_nce2,
-            nand_nce3 => nand_nce3,
-            nand_nce4 => nand_nce4,
-            nand_nce5 => nand_nce5,
-            nand_nwp => nand_nwp,
-            nand_rnb => nand_rnb,
-            nand_chip_data => nand_d
-            );
-
-PCMCIA_Interface : Balloon_pcmcia
-    Port Map(
-            data_bus_in => cpu_data(15 downto 0),
-            data_bus_out => pcmcia_data_out,
-            address_bus => cpu_a(10 downto 0),
-            bus_rdnwr => cpu_rdnwr,
-            nreset => nreset,
-            want_bus => pcmcia_wants_bus,
-            card_data => bp_d(15 downto 0),
-            card_address => bp_a(10 downto 0),
-            park_interface => samosa_park,
-            enable_pcmcia => not control_latch(0),
-            address_enable => not control_latch(1),
-            cpu_npoe => cf_npoe,
-            cpu_npce1 => cf_npce1,
-            cpu_npce2 => cf_npce2,
-            cpu_npior => cf_npior,
-            cpu_npiow => cf_npiow,
-            cpu_npreg => cf_npreg,
-            cpu_npwe => cf_npwe, --npwe is also used for all IO
-            cpu_npsktsel => cf_npsktsel,
-            cpu_niois16 => cf_niois16,
-            cpu_npwait => cf_npwait,
-            nstschng_out => pcmcia_nstschg,
-            nrdy_out => pcmcia_nrdy,
-            data_enable_out => pcmcia_enable_out,
-            card_reset_in => cf_control(4),
-            card_npoe => bp_npoe,
-            card_npce1 => bp_npce1,
-            card_npce2 => bp_npce2,
-            card_npior => bp_npior,
-            card_npiow => bp_npiow,
-            card_npreg => bp_npreg,
-            card_npwe => dummy,
-            card_niois16 => bp_niois16,
-            card_npwait => bp_npwait,
-            card_reset => bp_cf_nreset,
-            card_nstschng => bp_nstschg,
-            card_nrdy => bp_cf_nrdy
-    );
-    
---The samosa bus is treated as a module with a specific address range
---Multiple SAMOSA buses can be created by creating multiple samosa_select lines from teh upper module addresses.
-samosa_Interface : Balloon_samosa
-    Port Map (
-            data_bus_in => cpu_data(15 downto 0),
---            data_bus_in => debug_data,
-            data_bus_out => samosa_data_out,
-            reg_add => cpu_a(4 downto 2),
-            cpu_nwe => cpu_nwe,
-            cpu_noe => cpu_noe,
-            cpu_rdnwr => cpu_rdnwr,
-            samosa_select => samosa_select,
-            park_IO => samosa_park,
-            nreset => nreset,
-            samosa_reset_in => '1',
-            irq_out => samosa_irq_out,
-            samosa_irq => samosa_irq,
-            samosa_absent => samosa_absent,
-            samosa_nre => samosa_nre,
-            samosa_nwe => samosa_nwe,
-            samosa_cle => samosa_cle,
-            samosa_ale => samosa_ale,
-            samosa_nce => samosa_nce,
-            samosa_nwp => samosa_nwp,
-            samosa_reset_out => samosa_reset,
-            samosa_skt_data => samosa_d
-            );
-
---edge triggered interupt acknowledge
---This is not currently used however it it kept as a template in case it is needed.
-pcmcia_nrdy_process : process (pcmcia_nrdy, interupt_control_select, nreset, cf_npwe)
-    begin
-        if (nreset = '0') or ((cf_npwe = '0') and (interupt_control_select = '1') and (cpu_data(0) = '1')) then
-             pcmcia_nrdy_latch <= '0';
-        elsif (pcmcia_nrdy'event and pcmcia_nrdy = '0')    then
-            pcmcia_nrdy_latch <= '1';
-        end if;
-    end process pcmcia_nrdy_process;
-    
-pcmcia_nstschng_process : process (pcmcia_nstschg, interupt_control_select, nreset, cf_npwe)
-    begin
-        if (nreset = '0') or ((cf_npwe = '0') and (interupt_control_select = '1') and (cpu_data(1) = '1')) then
-             pcmcia_nstschng_latch <= '0';
-        elsif (pcmcia_nstschg'event and pcmcia_nstschg = '0')    then
-            pcmcia_nstschng_latch <= '1';
-        end if;
-    end process pcmcia_nstschng_process;
-
--- version register at 0x10e0001c
-    version_out <= Version & Version_Minor when ( version_select = '1' ) else X"0000";
-                        
---CF Control Latch at 0x10e00008/0x10e01008
---Originally intended to imitate Mainstone PCMCIA0 register at 0x080000E0
---now balloonized
-CF_Control_Register : single_sr_output_port Port Map (
-    RESET_STATE => CF_reset_state,
-    D => cpu_data(7 downto 0),
-    register_select => cf_control_select,
-    nWE => cpu_nwe,
-    EN => '1',
-    RnS => internal_RnS,
-    Q => cf_control,
-    RESET => not nreset
-);
-
---Control latch at 0x10e0001c/0x10e0101c
-
-cpu_Control_Register : single_sr_output_port Port Map (
-    RESET_STATE => cpu_Control_reset_state,
-    D => cpu_data(7 downto 0),
-    register_select => general_control_select,
-    nWE => cpu_nwe,
-    EN => '1',
-    RnS => internal_RnS,
-    Q => control_latch,
-    RESET => not nreset
-);
-
---Interrupt Mask at 0x10e0000c/0x10e0100c
---zero in a bit enables the interrupt one masks it
-cpu_Interrupt_Register : single_sr_output_port Port Map (
-    RESET_STATE => X"00",
-    D => cpu_data(7 downto 0),
-    register_select => interupt_control_select,
-    nWE => cpu_nwe,
-    EN => '1',
-    RnS => internal_RnS,
-    Q => interupt_control,
-    RESET => not nreset
-);
-
---Interrupt STATUS Register Bits (read)
---interupt_status <= "000000" & pcmcia_nstschng_latch & pcmcia_nrdy_latch;
---Masked interrupt bits
-pcmcia_stschng_int <= ((not pcmcia_nstschg) and (not interupt_control(1)));
-pcmcia_rdy_int     <= ((not pcmcia_nrdy) and (not interupt_control(0)));
-samosa_int <= samosa_irq_out and not interupt_control(2);
-interupt_status <= "00000" & samosa_int & pcmcia_stschng_int & pcmcia_rdy_int;
---pcmcia_status <= "00000" & pcmcia_nrdy & '0' & pcmcia_nstschg & '1' & '0' & "000000";
-pcmcia_status <= "000000" & pcmcia_nstschg & pcmcia_nrdy;
-
--- VLIO
-vlio:vlio_timer
-    Generic map (TIMER_WIDTH => 4)
-    Port map (clk => clk_48m,
-                reset => not nreset,
-                rdy => vlio_rdy,
-                nstart => vlio_nstart,
-                delay => vlio_delay);
-                
--- we only do VLIO on nCS4
--- and when all IO is not parked. This is because the 48MHz clock
--- stops at standby/shutdown and VLIO operations can hang then.
-vlio_disable <= '1' when samosa_park='1' and nand_park='1' else '0';
+-- $HDR$--
+--+++++++++--
+--Source Archived--
+--Version in Repository:--
+-- $Log:  25084: balloon3.vhd 
+--
+--   Rev 1.18    2/13/2008 12:15:02 AM  David
+-- Switches PCMCIA npwe to a dummy since we on't want the PCMCIA bus excluding
+-- it from the back plane.
+--
+--
+--   Rev 1.17    2/13/2008 12:06:52 AM  David
+-- CJ's BTRX mod added
+--
+--+++++++++--
+----------------------------------------------------------------------------------
+-- Company:
+-- Engineer: 
+-- 
+-- Create Date:    14:00:50 06/30/2006 
+-- Design Name: 
+-- Module Name:    GenericL3 - Behavioral 
+-- Project Name: 
+-- Target Devices: 
+-- Tool versions: 
+-- Description: Generic Balloon 3 interface glue for both CPLD and FPGA variants
+--
+-- Dependencies: 
+--
+-- Revision: 
+-- Revision 0.01 - File Created
+--          0v1 - initial release with P2
+--                ?? - CMJ further mods for E1 board: I2C pullups, LCD pixel clock
+-- Additional Comments: 
+-- The following functions are not implemented in this version:
+-- -- RS232 forwarding to the pinko connector or diversion from the backplane
+-- -- Backplane data handling other than that required for CF
+
+----------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity Balloon3 is
+    generic ( Version : std_logic_vector(7 downto 0) := X"00"; --Top byte comes from wrapper
+                 CPU_Address_Bus_Size : integer := 26;
+                 CPU_Data_Bus_Size : integer := 32;
+                 Backplane_Address_Bus_Size : integer := 26;
+                 Backplane_Data_Bus_Size : integer := 32
+                );
+    Port (
+    cpu_a        : in std_logic_vector (CPU_Address_Bus_Size-1 downto 0);
+    cpu_data  : inout std_logic_vector (CPU_Data_Bus_Size-1 downto 0);
+    cpu_rdy     : out std_logic;
+    cpu_rdnwr : in std_logic;
+    cpu_noe     : in std_logic;
+    cpu_nwe     : in std_logic;
+    cpu_ncs5     : in std_logic;
+    cpu_ncs4     : in std_logic;
+    cpu_ncs3     : in std_logic;
+    cpu_ncs1     : in std_logic;
+    cpu_ncs0     : in std_logic;
+    cpu_ncs2     : in std_logic;
+    cpu_dqm0     : in std_logic;
+    cpu_dqm1     : in std_logic;
+    cpu_dqm2     : in std_logic;
+    cpu_dqm3     : in std_logic;
+    cpu_nsdcs3 : in std_logic;
+    cpu_nsdcs2 : in std_logic;
+    cpu_sdclk0 : in std_logic;
+    nreset      : in std_logic;
+    clk_48M      : in std_logic;
+    bb_ib_dat0     : out std_logic;
+    bb_ob_clk     : in std_logic;
+    bb_ob_stb     : in std_logic;
+    bb_ob_dat0     : in std_logic;
+    bb_ib_clk     : out std_logic;
+    msl_clk_ext     : inout std_logic;
+    bb_ib_stb     : out std_logic;
+    nand_d     : inout std_logic_vector (15 downto 0);
+    nand_rnb     : in std_logic;
+    nand_nwe     : out std_logic;
+    nand_nre     : out std_logic;
+    nand_nwp     : out std_logic;
+    nand_cle     : out std_logic;
+    nand_ale     : out std_logic;
+    nand_nce0     : out std_logic;
+    nand_nce1     : out std_logic;
+    nand_nce2     : out std_logic;
+    nand_nce3     : out std_logic;
+    nand_nce4     : out std_logic;
+    nand_nce5     : out std_logic;
+    bp_a        : out std_logic_vector (Backplane_Address_Bus_Size-1 downto 0);
+    bp_d        : inout std_logic_vector (Backplane_Data_Bus_Size-1 downto 0);
+    bp_noe     : out std_logic;
+    bp_nwe     : out std_logic;
+    bp_ncs2     : out std_logic;
+    bp_ncs3     : out std_logic;
+    bp_ncs4     : out std_logic;
+    bp_ncs5     : out std_logic;
+    bp_rd_nwr : out std_logic;
+    bp_sdclk1 : out std_logic;
+    bp_sdclk0 : out std_logic;
+    bp_dreq0     : in std_logic;
+    bp_dval0     : in std_logic;
+    bp_nreset     : out std_logic;
+    bp_ext_rdy     : in std_logic;
+    bp_nsktsel     : out std_logic;
+    bp_cf_nrdy     : in std_logic;
+    bp_npce1     : out std_logic;
+    bp_npce2     : out std_logic;
+    bp_npoe     : out std_logic;
+    bp_npwe     : out std_logic;
+    bp_npior     : out std_logic;
+    bp_npiow     : out std_logic;
+    bp_dqm0     : out std_logic;
+    bp_dqm1     : out std_logic;
+    bp_dqm2     : out std_logic;
+    bp_dqm3     : out std_logic;
+    bp_irq     : in std_logic;
+    bp_npwait     : in std_logic;
+    bp_niois16     : in std_logic;
+    bp_npreg        : out std_logic;
+    bp_nstschg     : in std_logic;
+    bp_cf_nreset : out std_logic;
+    cf_npoe     : in std_logic;
+    cf_npwe     : in std_logic;
+    cf_npce1     : in std_logic;
+    cf_npce2     : in std_logic;
+    cf_niois16     : out std_logic;
+    cf_npwait     : out std_logic;
+    cf_npreg     : in std_logic;
+    cf_npior     : in std_logic;
+    cf_npiow     : in std_logic;
+    cf_npsktsel     : in std_logic;
+    aux_nirq        : out std_logic;
+    aux_unsuspend     : out std_logic;
+    samosa_d        : inout std_logic_vector (15 downto 0);
+    samosa_rnb     : in std_logic;
+    samosa_absent     : in std_logic;
+    samosa_reset     : out std_logic;
+    samosa_irq     : in std_logic;
+    samosa_nwe     : out std_logic;
+    samosa_nre     : out std_logic;
+    samosa_nwp     : out std_logic;
+    samosa_cle     : out std_logic;
+    samosa_ale     : out std_logic;
+    samosa_nce     : out std_logic;
+    samosa_wp     : in std_logic;
+    cif_dd     : inout std_logic_vector (9 downto 0);
+    cif_pclk     : inout std_logic;
+    cif_fv     : inout std_logic;
+    cif_lv     : inout std_logic;
+    cif_mclk     : in std_logic;
+    pinko_txd     : out std_logic;
+    pinko_rxd     : in std_logic;
+    pinko_cts     : out std_logic;
+    com1_bttxd     : in std_logic;
+    com1_btrxd     : out std_logic;
+    pxa_scl     : in std_logic;
+    pxa_sda     : inout std_logic;
+    lcd_pclk     : in std_logic;
+    lpclk_out     : out std_logic;
+    green_led     : out std_logic
+ );
+end Balloon3;
+
+architecture Behavioral of Balloon3 is
+
+    attribute init: string;
+    
+    constant Version_Minor : std_logic_vector(7 downto 0) := X"16";
+
+    constant CF_reset_state : std_logic_vector(7 downto 0)
+                    :=    -- '0' &
+                        -- '0' &
+                        -- '0' &
+                        -- '0' &
+                        -- '0' &
+                        -- '0' &     --(10) Card interrupt source ? should also assert AUX_IRQ BP_CF_NRDY
+                        -- '0' &     --( 9) Reserved for nBVD2
+                        -- '0' &     --( 8) nBVD1 signal from card (NSTSCHNG)
+                        '0' &     --( 7) VS2
+                        '0' &     --( 6) VS1
+                        '0' &     --( 5) Reserved for PCMCIA card detection on Mainstone (Balloon uses GPIO105)
+                        '0' &     --( 4) Reset signal for CF card
+                        '0' &     --( 3) Reserved for PCMCIA power management
+                        '0' &     --( 2) Reserved for PCMCIA power management
+                        '0' &     --( 1) Reserved for PCMCIA power management
+                        '0' ;   --( 0) Reserved for PCMCIA power management
+
+    constant cpu_Control_reset_state : std_logic_vector(7 downto 0)
+                    :=    '0' &     --(7) VS2
+                        '0' &     
+                        '0' &     --(5) Park NAND control lines.
+                        '0' &     --(4) Park IO ready for power off.
+                        '0' &     
+                        '1' &     --(2) PINKO CTS
+                        '0' &     --(1) PCMCIA Address Disable
+                       '0';     --(0) PCMCIA/CF Card Disable
+
+--NAND Control
+    signal nand_select : std_logic;
+    signal nand_device_select : std_logic;
+    signal nand_control_select : std_logic;
+    signal nand_control2_select : std_logic;
+    signal nand_status_select : std_logic;
+    signal nand_data_out : std_logic_vector(15 downto 0);
+    
+-- SAMOSA
+    signal samosa_irq_out : std_logic;
+    signal samosa_select : std_logic;
+    signal samosa_read_select : std_logic;
+     signal samosa_data_out  : std_logic_vector (15 downto 0);
+    signal samosa_int : std_logic;
+
+--General Control Latch
+    signal control_latch : std_logic_vector (7 downto 0);
+    signal general_control_select : std_logic;
+
+-- Park signals
+    signal samosa_park : std_logic;
+    signal nand_park : std_logic;
+    
+--Version
+    signal version_select:    std_logic;
+    signal version_out : std_logic_vector (15 downto 0);
+    -- Upper nibble = 0x4 says I'm an FPGA = 0x8 says I'm a CPLD.
+    -- 0xf indicates not there or unprogrammed.
+    -- Next nibble = 0xf for debug/experimental version
+    -- Otherwise this is the major version number.
+    -- Upper byte comes from wrapper lower byte from here.
+    -- lower byte is release number.
+
+-- Reset Latch
+
+--Interupt Control Latch
+    signal interupt_control : std_logic_vector (7 downto 0);
+    signal interupt_control_select : std_logic;
+    signal interupt_status : std_logic_vector (7 downto 0);
+    signal pcmcia_nrdy_latch : std_logic;
+    signal pcmcia_nstschng_latch : std_logic;
+    
+--MODULES
+    signal mod_add : std_logic_vector(7 downto 0);
+    signal internal_reg : std_logic;
+    signal samosa_reg : std_logic;
+    constant BALLOON_INTERNAL     : std_logic_vector ( 7 downto 0):= X"e0"; --a(23..16)
+    constant SAMOSA_ADDRESS       : std_logic_vector ( 7 downto 0):= X"c0"; --a(23..16)
+
+--REGISTERS
+    constant NUM_DECODE_BITS : integer := 12;
+    signal reg_add : std_logic_vector(NUM_DECODE_BITS-1 downto 0);
+    
+    --Constants that define the internal register addresses
+    constant NAND_ADD             : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"000"; -- a(11..0)
+    constant CF_CONTROL_ADD       : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"008";
+    constant NAND_CONTROL2_ADD    : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"010";
+    constant NAND_CONTROL_ADD     : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"014";
+    constant NAND_STATUS_ADD      : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"014";
+    constant INTERUPT_CONTROL_ADD : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"00C";
+    constant VERSION_ADD          : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"01C";
+    constant GENERAL_CONTROL_ADD  : std_logic_vector (NUM_DECODE_BITS-1 downto 0):= X"01C";
+        
+    signal internal_read_select   : std_logic;
+    signal internal_register_select : std_logic;
+
+    -- this signal is the reset/not set signal for set/clear registers
+    -- it's connected to A12
+    signal internal_RnS : std_logic;
+--PCMCIA
+    signal pcmcia_select : std_logic;
+    signal cf_control : std_logic_vector (7 downto 0);
+    signal cf_control_select : std_logic;
+    signal pcmcia_status : std_logic_vector (7 downto 0);
+    signal pcmcia_nrdy : std_logic;
+    signal pcmcia_nstschg : std_logic;
+    signal pcmcia_enable_out : std_logic;
+    signal pcmcia_data_out : std_logic_vector (15 downto 0);
+    signal pcmcia_wants_bus : std_logic;
+    signal pcmcia_stschng_int : std_logic;
+    signal pcmcia_rdy_int : std_logic;
+    signal cf_card_data : std_logic_vector(15 downto 0);
+    signal cf_card_address : std_logic_vector(10 downto 0);
+    signal dummy : std_logic;
+    
+--BACKPLANE
+    signal bp_enable  : std_logic;
+    signal backplane_read : std_logic;
+    
+    signal debug_data : std_logic_vector (15 downto 0);
+
+--PXA BUS
+    signal internal_dout : std_logic_vector (15 downto 0);
+
+-- VLIO signals
+    signal vlio_nstart : std_logic;
+    signal vlio_delay : std_logic_vector(3 downto 0);
+    signal vlio_rdy : std_logic;
+    signal vlio_disable : std_logic;
+    
+component single_sr_output_port is
+    Generic ( WIDTH : natural := 8 );
+     Port (
+                RESET_STATE : in STD_LOGIC_VECTOR(WIDTH-1 downto 0) := (others=>'0');
+                D : in  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
+              register_select : in  STD_LOGIC;
+              nWE : in  STD_LOGIC;
+              EN : in  STD_LOGIC;
+              RnS : in  STD_LOGIC;
+              Q : out  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
+              RESET : in  STD_LOGIC);
+end component;
+
+component Balloon_nand is
+    port (
+            data_bus_in  : in std_logic_vector (15 downto 0);
+            data_bus_out : out std_logic_vector (15 downto 0);
+            cpu_nwe : in std_logic;
+            cpu_noe : in std_logic;
+            cpu_rdnwr : in std_logic;
+            internal_RnS : in std_logic;
+            nand_device_select : in std_logic;
+            nand_control_select : in std_logic;
+            nand_control2_select : in std_logic;
+            nand_status_select : in std_logic;
+            park_nand : in std_logic;
+            nreset : in std_logic;
+            nand_nre : out std_logic;
+            nand_nwe : out std_logic;
+            nand_cle : out std_logic;
+            nand_ale : out std_logic;
+            nand_nce0 : out std_logic;
+            nand_nce1 : out std_logic;
+            nand_nce2 : out std_logic;
+            nand_nce3 : out std_logic;
+            nand_nce4 : out std_logic;
+            nand_nce5 : out std_logic;
+            nand_nwp  : out std_logic;
+--            nand_rnb : inout std_logic;
+            nand_rnb : in std_logic;
+            nand_chip_data : inout std_logic_vector(15 downto 0)
+            );
+            
+end component;
+
+component Balloon_pcmcia is
+    port (
+            data_bus_in : in std_logic_vector(15 downto 0);
+            data_bus_out : out std_logic_vector(15 downto 0);
+            address_bus : in std_logic_vector(10 downto 0);
+            bus_rdnwr : in std_logic;
+            nreset : in std_logic;
+            want_bus : out std_logic;
+            card_data : inout std_logic_vector(15 downto 0);
+            card_address : out std_logic_vector(10 downto 0);
+            park_interface : in std_logic;
+            enable_pcmcia : in std_logic;
+            address_enable : in std_logic;
+            cpu_npoe : in std_logic;
+            cpu_npce1 : in std_logic;
+            cpu_npce2 : in std_logic;
+            cpu_npior : in std_logic;
+            cpu_npiow : in std_logic;
+            cpu_npreg : in std_logic;
+            cpu_npwe : in std_logic;
+            cpu_npsktsel : in std_logic;
+            cpu_niois16 : out std_logic;
+            cpu_npwait : out std_logic;
+            nstschng_out : out std_logic;
+            nrdy_out : out std_logic;
+            data_enable_out : out std_logic; --indicates when PCMCIA is driving the databus
+            card_reset_in : in std_logic; -- source of card reset
+            card_npoe : out std_logic;
+            card_npce1 : out std_logic; --lower byte lane enable
+            card_npce2 : out std_logic; --upper byte lane enable
+            card_npior : out std_logic;
+            card_npiow : out std_logic;
+            card_npreg : out std_logic; --effectively a11
+            card_npwe : out std_logic;  --card write enable
+            card_niois16 : in std_logic; --card is 16 bits
+            card_npwait : in std_logic; --wait from card
+            card_reset : out std_logic; --reset out to card
+            card_nstschng : in std_logic;
+            card_nrdy : in std_logic
+    );
+            
+end component;
+
+component Balloon_samosa is
+    port (
+            data_bus_in : in std_logic_vector (15 downto 0);
+            data_bus_out : out std_logic_vector (15 downto 0);
+            reg_add : in std_logic_vector (2 downto 0); --a4..a2 selects SAMOSA control Latches
+            cpu_nwe : in std_logic;
+            cpu_noe : in std_logic;
+            cpu_rdnwr : in std_logic;
+            samosa_select : in std_logic;
+            park_IO : in std_logic;
+            nreset : in std_logic;
+            samosa_reset_in : in std_logic;
+            irq_out : out std_logic;
+            samosa_irq : in std_logic;
+            samosa_absent: in std_logic;
+            samosa_nre : out std_logic;
+            samosa_nwe : out std_logic;
+            samosa_cle : out std_logic;
+            samosa_ale : out std_logic;
+            samosa_nce : out std_logic;
+            samosa_nwp : out std_logic;
+            samosa_reset_out : out std_logic;
+            samosa_skt_data : inout std_logic_vector(15 downto 0)
+            );
+end component;
+
+component vlio_timer is
+    Generic ( TIMER_WIDTH : NATURAL :=4);
+    Port ( clk : in  STD_LOGIC;
+           reset : in  STD_LOGIC;
+           rdy : out  STD_LOGIC;
+           nstart : in  STD_LOGIC;
+           delay : in  STD_LOGIC_VECTOR (TIMER_WIDTH-1 downto 0));
+end component;
+
+begin
+
+Nand_Interface : Balloon_nand
+    Port Map(
+            data_bus_in => cpu_data(15 downto 0),
+            data_bus_out => nand_data_out,
+            cpu_nwe => cpu_nwe,
+            cpu_noe => cpu_noe,
+            cpu_rdnwr => cpu_rdnwr,
+            internal_RnS => internal_RnS,
+            nand_device_select => nand_device_select,
+            nand_control_select => nand_control_select,
+            nand_control2_select => nand_control2_select,
+            nand_status_select => nand_status_select,
+            park_nand => nand_park,
+            nreset => nreset,
+            nand_nre => nand_nre,
+            nand_nwe => nand_nwe,
+            nand_cle => nand_cle,
+            nand_ale => nand_ale,
+            nand_nce0 => nand_nce0,
+            nand_nce1 => nand_nce1,
+            nand_nce2 => nand_nce2,
+            nand_nce3 => nand_nce3,
+            nand_nce4 => nand_nce4,
+            nand_nce5 => nand_nce5,
+            nand_nwp => nand_nwp,
+            nand_rnb => nand_rnb,
+            nand_chip_data => nand_d
+            );
+
+PCMCIA_Interface : Balloon_pcmcia
+    Port Map(
+            data_bus_in => cpu_data(15 downto 0),
+            data_bus_out => pcmcia_data_out,
+            address_bus => cpu_a(10 downto 0),
+            bus_rdnwr => cpu_rdnwr,
+            nreset => nreset,
+            want_bus => pcmcia_wants_bus,
+            card_data => bp_d(15 downto 0),
+            card_address => bp_a(10 downto 0),
+            park_interface => samosa_park,
+            enable_pcmcia => not control_latch(0),
+            address_enable => not control_latch(1),
+            cpu_npoe => cf_npoe,
+            cpu_npce1 => cf_npce1,
+            cpu_npce2 => cf_npce2,
+            cpu_npior => cf_npior,
+            cpu_npiow => cf_npiow,
+            cpu_npreg => cf_npreg,
+            cpu_npwe => cf_npwe, --npwe is also used for all IO
+            cpu_npsktsel => cf_npsktsel,
+            cpu_niois16 => cf_niois16,
+            cpu_npwait => cf_npwait,
+            nstschng_out => pcmcia_nstschg,
+            nrdy_out => pcmcia_nrdy,
+            data_enable_out => pcmcia_enable_out,
+            card_reset_in => cf_control(4),
+            card_npoe => bp_npoe,
+            card_npce1 => bp_npce1,
+            card_npce2 => bp_npce2,
+            card_npior => bp_npior,
+            card_npiow => bp_npiow,
+            card_npreg => bp_npreg,
+            card_npwe => dummy,
+            card_niois16 => bp_niois16,
+            card_npwait => bp_npwait,
+            card_reset => bp_cf_nreset,
+            card_nstschng => bp_nstschg,
+            card_nrdy => bp_cf_nrdy
+    );
+    
+--The samosa bus is treated as a module with a specific address range
+--Multiple SAMOSA buses can be created by creating multiple samosa_select lines from teh upper module addresses.
+samosa_Interface : Balloon_samosa
+    Port Map (
+            data_bus_in => cpu_data(15 downto 0),
+--            data_bus_in => debug_data,
+            data_bus_out => samosa_data_out,
+            reg_add => cpu_a(4 downto 2),
+            cpu_nwe => cpu_nwe,
+            cpu_noe => cpu_noe,
+            cpu_rdnwr => cpu_rdnwr,
+            samosa_select => samosa_select,
+            park_IO => samosa_park,
+            nreset => nreset,
+            samosa_reset_in => '1',
+            irq_out => samosa_irq_out,
+            samosa_irq => samosa_irq,
+            samosa_absent => samosa_absent,
+            samosa_nre => samosa_nre,
+            samosa_nwe => samosa_nwe,
+            samosa_cle => samosa_cle,
+            samosa_ale => samosa_ale,
+            samosa_nce => samosa_nce,
+            samosa_nwp => samosa_nwp,
+            samosa_reset_out => samosa_reset,
+            samosa_skt_data => samosa_d
+            );
+
+--edge triggered interupt acknowledge
+--This is not currently used however it it kept as a template in case it is needed.
+pcmcia_nrdy_process : process (pcmcia_nrdy, interupt_control_select, nreset, cf_npwe)
+    begin
+        if (nreset = '0') or ((cf_npwe = '0') and (interupt_control_select = '1') and (cpu_data(0) = '1')) then
+             pcmcia_nrdy_latch <= '0';
+        elsif (pcmcia_nrdy'event and pcmcia_nrdy = '0')    then
+            pcmcia_nrdy_latch <= '1';
+        end if;
+    end process pcmcia_nrdy_process;
+    
+pcmcia_nstschng_process : process (pcmcia_nstschg, interupt_control_select, nreset, cf_npwe)
+    begin
+        if (nreset = '0') or ((cf_npwe = '0') and (interupt_control_select = '1') and (cpu_data(1) = '1')) then
+             pcmcia_nstschng_latch <= '0';
+        elsif (pcmcia_nstschg'event and pcmcia_nstschg = '0')    then
+            pcmcia_nstschng_latch <= '1';
+        end if;
+    end process pcmcia_nstschng_process;
+
+-- version register at 0x10e0001c
+    version_out <= Version & Version_Minor when ( version_select = '1' ) else X"0000";
+                        
+--CF Control Latch at 0x10e00008/0x10e01008
+--Originally intended to imitate Mainstone PCMCIA0 register at 0x080000E0
+--now balloonized
+CF_Control_Register : single_sr_output_port Port Map (
+    RESET_STATE => CF_reset_state,
+    D => cpu_data(7 downto 0),
+    register_select => cf_control_select,
+    nWE => cpu_nwe,
+    EN => '1',
+    RnS => internal_RnS,
+    Q => cf_control,
+    RESET => not nreset
+);
+
+--Control latch at 0x10e0001c/0x10e0101c
+
+cpu_Control_Register : single_sr_output_port Port Map (
+    RESET_STATE => cpu_Control_reset_state,
+    D => cpu_data(7 downto 0),
+    register_select => general_control_select,
+    nWE => cpu_nwe,
+    EN => '1',
+    RnS => internal_RnS,
+    Q => control_latch,
+    RESET => not nreset
+);
+
+--Interrupt Mask at 0x10e0000c/0x10e0100c
+--zero in a bit enables the interrupt one masks it
+cpu_Interrupt_Register : single_sr_output_port Port Map (
+    RESET_STATE => X"00",
+    D => cpu_data(7 downto 0),
+    register_select => interupt_control_select,
+    nWE => cpu_nwe,
+    EN => '1',
+    RnS => internal_RnS,
+    Q => interupt_control,
+    RESET => not nreset
+);
+
+--Interrupt STATUS Register Bits (read)
+--interupt_status <= "000000" & pcmcia_nstschng_latch & pcmcia_nrdy_latch;
+--Masked interrupt bits
+pcmcia_stschng_int <= ((not pcmcia_nstschg) and (not interupt_control(1)));
+pcmcia_rdy_int     <= ((not pcmcia_nrdy) and (not interupt_control(0)));
+samosa_int <= samosa_irq_out and not interupt_control(2);
+interupt_status <= "00000" & samosa_int & pcmcia_stschng_int & pcmcia_rdy_int;
+--pcmcia_status <= "00000" & pcmcia_nrdy & '0' & pcmcia_nstschg & '1' & '0' & "000000";
+pcmcia_status <= "000000" & pcmcia_nstschg & pcmcia_nrdy;
+
+-- VLIO
+vlio:vlio_timer
+    Generic map (TIMER_WIDTH => 4)
+    Port map (clk => clk_48m,
+                reset => not nreset,
+                rdy => vlio_rdy,
+                nstart => vlio_nstart,
+                delay => vlio_delay);
+                
+-- we only do VLIO on nCS4
+-- and when all IO is not parked. This is because the 48MHz clock
+-- stops at standby/shutdown and VLIO operations can hang then.
+vlio_disable <= '1' when samosa_park='1' and nand_park='1' else '0';
 -- cpu_rdy <= vlio_rdy when cpu_ncs4 = '0' and vlio_disable = '0' else '1';
-cpu_rdy <= '1';
---vlio_nstart <= '0' when cpu_ncs4 = '0' and (cpu_noe = '0' or cf_npwe ='0') else '1';
-vlio_nstart <= '0' when cpu_ncs4 = '0' else '1';
--- choose the delay
--- slow for samosa, full tilt for everything else
-vlio_delay_choice: process (samosa_select)
-begin
-    if samosa_select='1' then
-        vlio_delay <= "1010"; -- 10 units of 20ns each for Samosa
-    else
-        vlio_delay <= "0001"; -- just over 20ns for everything else
-    end if;
-end process;
-
---------------------------------------------------------------------------------------
---CPU DATA BUS Registers
-  --ncs0 is Boot Rom
-  --nCS1-nCS3 are off-board
-  --nCS4 is NAND, latches and USB Host
-    --nCS5 is Backplane
-    
-   --Balloon internal registers @ 0x10e
-    --NAND   Data Bus         @ 0x10e00000
-    --CF Control/Status       @ 0x10e00008
-    --Interrupt Status/Ack    @ 0x10e0000c
-    --NAND Control 2          @ 0x10e00010
-    --NAND Control            @ 0x10e00014
-    --General Control/Version @ 0x10e0001c
-    
-    --SAMOSA Registers are set from the SAMOSA module
-    --SAMOSA base address @ 0x10c
-    --SAMOSA registers    @ 0x10c00000 - 0x10c0001c
-
--- Internal Write Register Selects
--- reg_add represents the address used to select internal registers
--- mod_add the address that select between internal modules.
--- This code is a single module selected by BALLOON_INTERNAL
--- Individual chip selects are decoded here for the sub components so that we don't have to pass
--- the full address bus to each component and address decoding is controlled centrally
-
-    reg_add <= cpu_a(11 downto 0) when (cpu_ncs4 = '0') else X"000"; -- Stops needless address select switching if it isnt for us
-    mod_add <= cpu_a(23 downto 16) when (cpu_ncs4 = '0') else X"00";
-
---Build module address ranges    
-    internal_reg    <= '1' when (mod_add = BALLOON_INTERNAL) else '0';
-    samosa_reg      <= '1' when (mod_add = SAMOSA_ADDRESS)   else '0';
-    
-    -- NAND Module
-    nand_device_select       <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_ADD) ) else '0';
-    nand_control2_select     <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_CONTROL2_ADD) ) else '0';
-    nand_control_select      <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_CONTROL_ADD) ) else '0';
-    nand_status_select       <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_STATUS_ADD) ) else '0';
-    
-    --PCMCIA Module
-    cf_control_select        <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = CF_CONTROL_ADD) ) else '0';
-    
-    --General Balloon Registers
-    interupt_control_select  <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = INTERUPT_CONTROL_ADD) ) else '0';
-    version_select           <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = VERSION_ADD) ) else '0';
-    general_control_select   <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = GENERAL_CONTROL_ADD) ) else '0';
-
-    --SAMOSA Module
-    samosa_select            <= '1' when ((cpu_ncs4 = '0') and (samosa_reg = '1')) else '0';
-    
-    
-    --Bunch together the selects within a component that has multiple registers
-    --(doing this just makes it easier to cut a module)
-    nand_select <= nand_device_select or nand_control_select or nand_control2_select or nand_status_select;
-    
-    --Bunch together all the component selects and generate the global reg read select
-    internal_register_select <= nand_select or cf_control_select or interupt_control_select or version_select;
-    internal_read_select <= '1' when (internal_register_select = '1' and cpu_noe = '0') else '0';
-    samosa_read_select <= '1'   when (samosa_select = '1' and cpu_noe = '0') else '0';
-    backplane_read <= '1' when ((cpu_ncs5 = '0') and (cpu_noe = '0')) else '0';
-
-    -- set/reset bit derived from a12
-    internal_RnS <= not cpu_a(12);
-    
-    -- park signals
-    samosa_park <= control_latch(4);
-    nand_park <= control_latch(5);
-    
---Internal Read Registers
-
-with reg_add select
-    internal_dout <=
-                        nand_data_out when NAND_ADD,
-                        X"00" & pcmcia_status when CF_CONTROL_ADD,
-                        X"00" & interupt_status when INTERUPT_CONTROL_ADD,
-                       version_out when VERSION_ADD,
-                        nand_data_out when NAND_STATUS_ADD,
-                        X"0000" when others;
-
-------------------------------------------------------------------------------
---CPU BUS Data Control
---FIXME These should scale to the bus size.
---Note the backplane is only 16 bits of data here.
-cpu_data(15 downto 0) <= internal_dout   when internal_read_select = '1' else "ZZZZZZZZZZZZZZZZ";
-cpu_data(15 downto 0) <= samosa_data_out when samosa_read_select = '1'   else "ZZZZZZZZZZZZZZZZ";
-cpu_data(15 downto 0) <= pcmcia_data_out when pcmcia_wants_bus = '1'     else "ZZZZZZZZZZZZZZZZ";
---cpu_data(CPU_Data_Bus_Size-1 downto 0) <= bp_d(CPU_Data_Bus_Size-1 downto 0) when backplane_read = '1' else "ZZZZZZZZZZZZZZZZ";
-cpu_data(15 downto 0) <= bp_d(15 downto 0) when backplane_read = '1' else "ZZZZZZZZZZZZZZZZ";
---debug_data(15 downto 0) <= internal_dout   when internal_read_select = '1' else "ZZZZZZZZZZZZZZZZ";
---debug_data <= cpu_data(15 downto 0);
-
-cpu_data(CPU_Data_Bus_Size-1 downto 16) <= (others => 'Z');
-
---BACKPLANE Data Control
-
---bp_enable <= '1' when (cf_npce1 = '0' or cf_npce2 = '0') else '0';
---bp_d(15 downto 0) <= cpu_d(15 downto 0) when (pcmcia_select = '1' and cf_npsktsel = '0' and cpu_rdnwr = '0') else "ZZZZZZZZZZZZZZZZ";
-
-bp_nsktsel <= '1';
-
-aux_unsuspend    <= '0';
---Direct Level Triggered Interrupts
---aux_nirq <= pcmcia_nrdy and pcmcia_nstschg;
-
---Masked interrupts
-aux_nirq <= not( samosa_int or pcmcia_stschng_int or pcmcia_rdy_int);
-
---Acknowledged interrupts
---aux_nirq <= (not pcmcia_nrdy_latch) and (not pcmcia_nstschng_latch);
-
-
-pxa_sda <= 'Z';
-
--- On tcl board com1 goes on to pinko
--- connect pinko wiring up. CTS is bit 2 of general control register.
-pinko_txd <= com1_bttxd;
-com1_btrxd <= pinko_rxd;
-pinko_cts <= control_latch(2);
-
--- On other boards com1 is not copied to pinko
---pinko_txd    <=  '0';
---pinko_cts    <=  '1';
----- allow external devices to talk to COM1
---com1_btrxd    <=  'Z';
-
---DEBUG
---green_led <= nand_select;
---green_led <= not( pcmcia_stschng_int or pcmcia_rdy_int);
-green_led <= not internal_register_select;
-
-bb_ib_dat0 <= '0';
-bb_ib_clk <= '0';
-bb_ib_stb <= '1';
---bp_noe <= '1';
-bp_noe <= '1' when (cpu_ncs5 = '1') else cpu_noe;
-bp_npwe <= '1' when (cpu_ncs5 = '1') else cf_npwe;
-lpclk_out <= lcd_pclk;
-bp_dqm0 <= '0';
-bp_dqm1 <= '0';
-bp_dqm2 <= '0';
-bp_dqm3 <= '0';
-bp_sdclk0 <= '0';
-bp_sdclk1 <= '0';
-bp_ncs2 <= '1';
-bp_ncs3 <= '1';
-bp_ncs4 <= cpu_ncs4;
---bp_ncs5 <= '1';
-bp_ncs5 <= cpu_ncs5;
-bp_rd_nwr <= '0';
-bp_nreset <= '1';
-
-bp_a(Backplane_Address_Bus_Size-1 downto 0) <= cpu_a(Backplane_Address_Bus_Size-1 downto 0) when cpu_ncs5 = '0' else (others=>'Z');
---bp_a(Backplane_Address_Bus_Size-1 downto 0) <= cf_card_address when cpu_ncs5 = '1' else (others => 'Z');
-
-bp_d(Backplane_Data_Bus_Size-1 downto 0) <= cpu_data(Backplane_Data_Bus_Size-1 downto 0) when (cpu_ncs5 = '0' and cf_npwe = '0') else (others=>'Z');
-
-end Behavioral;
-
-
+cpu_rdy <= '1';
+--vlio_nstart <= '0' when cpu_ncs4 = '0' and (cpu_noe = '0' or cf_npwe ='0') else '1';
+vlio_nstart <= '0' when cpu_ncs4 = '0' else '1';
+-- choose the delay
+-- slow for samosa, full tilt for everything else
+vlio_delay_choice: process (samosa_select)
+begin
+    if samosa_select='1' then
+        vlio_delay <= "1010"; -- 10 units of 20ns each for Samosa
+    else
+        vlio_delay <= "0001"; -- just over 20ns for everything else
+    end if;
+end process;
+
+--------------------------------------------------------------------------------------
+--CPU DATA BUS Registers
+  --ncs0 is Boot Rom
+  --nCS1-nCS3 are off-board
+  --nCS4 is NAND, latches and USB Host
+    --nCS5 is Backplane
+    
+   --Balloon internal registers @ 0x10e
+    --NAND   Data Bus         @ 0x10e00000
+    --CF Control/Status       @ 0x10e00008
+    --Interrupt Status/Ack    @ 0x10e0000c
+    --NAND Control 2          @ 0x10e00010
+    --NAND Control            @ 0x10e00014
+    --General Control/Version @ 0x10e0001c
+    
+    --SAMOSA Registers are set from the SAMOSA module
+    --SAMOSA base address @ 0x10c
+    --SAMOSA registers    @ 0x10c00000 - 0x10c0001c
+
+-- Internal Write Register Selects
+-- reg_add represents the address used to select internal registers
+-- mod_add the address that select between internal modules.
+-- This code is a single module selected by BALLOON_INTERNAL
+-- Individual chip selects are decoded here for the sub components so that we don't have to pass
+-- the full address bus to each component and address decoding is controlled centrally
+
+    reg_add <= cpu_a(11 downto 0) when (cpu_ncs4 = '0') else X"000"; -- Stops needless address select switching if it isnt for us
+    mod_add <= cpu_a(23 downto 16) when (cpu_ncs4 = '0') else X"00";
+
+--Build module address ranges    
+    internal_reg    <= '1' when (mod_add = BALLOON_INTERNAL) else '0';
+    samosa_reg      <= '1' when (mod_add = SAMOSA_ADDRESS)   else '0';
+    
+    -- NAND Module
+    nand_device_select       <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_ADD) ) else '0';
+    nand_control2_select     <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_CONTROL2_ADD) ) else '0';
+    nand_control_select      <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_CONTROL_ADD) ) else '0';
+    nand_status_select       <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = NAND_STATUS_ADD) ) else '0';
+    
+    --PCMCIA Module
+    cf_control_select        <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = CF_CONTROL_ADD) ) else '0';
+    
+    --General Balloon Registers
+    interupt_control_select  <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = INTERUPT_CONTROL_ADD) ) else '0';
+    version_select           <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = VERSION_ADD) ) else '0';
+    general_control_select   <= '1' when ((cpu_ncs4 = '0') and (internal_reg = '1') and (reg_add = GENERAL_CONTROL_ADD) ) else '0';
+
+    --SAMOSA Module
+    samosa_select            <= '1' when ((cpu_ncs4 = '0') and (samosa_reg = '1')) else '0';
+    
+    
+    --Bunch together the selects within a component that has multiple registers
+    --(doing this just makes it easier to cut a module)
+    nand_select <= nand_device_select or nand_control_select or nand_control2_select or nand_status_select;
+    
+    --Bunch together all the component selects and generate the global reg read select
+    internal_register_select <= nand_select or cf_control_select or interupt_control_select or version_select;
+    internal_read_select <= '1' when (internal_register_select = '1' and cpu_noe = '0') else '0';
+    samosa_read_select <= '1'   when (samosa_select = '1' and cpu_noe = '0') else '0';
+    backplane_read <= '1' when ((cpu_ncs5 = '0') and (cpu_noe = '0')) else '0';
+
+    -- set/reset bit derived from a12
+    internal_RnS <= not cpu_a(12);
+    
+    -- park signals
+    samosa_park <= control_latch(4);
+    nand_park <= control_latch(5);
+    
+--Internal Read Registers
+
+with reg_add select
+    internal_dout <=
+                        nand_data_out when NAND_ADD,
+                        X"00" & pcmcia_status when CF_CONTROL_ADD,
+                        X"00" & interupt_status when INTERUPT_CONTROL_ADD,
+                       version_out when VERSION_ADD,
+                        nand_data_out when NAND_STATUS_ADD,
+                        X"0000" when others;
+
+------------------------------------------------------------------------------
+--CPU BUS Data Control
+--FIXME These should scale to the bus size.
+--Note the backplane is only 16 bits of data here.
+cpu_data(15 downto 0) <= internal_dout   when internal_read_select = '1' else "ZZZZZZZZZZZZZZZZ";
+cpu_data(15 downto 0) <= samosa_data_out when samosa_read_select = '1'   else "ZZZZZZZZZZZZZZZZ";
+cpu_data(15 downto 0) <= pcmcia_data_out when pcmcia_wants_bus = '1'     else "ZZZZZZZZZZZZZZZZ";
+--cpu_data(CPU_Data_Bus_Size-1 downto 0) <= bp_d(CPU_Data_Bus_Size-1 downto 0) when backplane_read = '1' else "ZZZZZZZZZZZZZZZZ";
+cpu_data(15 downto 0) <= bp_d(15 downto 0) when backplane_read = '1' else "ZZZZZZZZZZZZZZZZ";
+--debug_data(15 downto 0) <= internal_dout   when internal_read_select = '1' else "ZZZZZZZZZZZZZZZZ";
+--debug_data <= cpu_data(15 downto 0);
+
+cpu_data(CPU_Data_Bus_Size-1 downto 16) <= (others => 'Z');
+
+--BACKPLANE Data Control
+
+--bp_enable <= '1' when (cf_npce1 = '0' or cf_npce2 = '0') else '0';
+--bp_d(15 downto 0) <= cpu_d(15 downto 0) when (pcmcia_select = '1' and cf_npsktsel = '0' and cpu_rdnwr = '0') else "ZZZZZZZZZZZZZZZZ";
+
+bp_nsktsel <= '1';
+
+aux_unsuspend    <= '0';
+--Direct Level Triggered Interrupts
+--aux_nirq <= pcmcia_nrdy and pcmcia_nstschg;
+
+--Masked interrupts
+aux_nirq <= not( samosa_int or pcmcia_stschng_int or pcmcia_rdy_int);
+
+--Acknowledged interrupts
+--aux_nirq <= (not pcmcia_nrdy_latch) and (not pcmcia_nstschng_latch);
+
+
+pxa_sda <= 'Z';
+
+-- On tcl board com1 goes on to pinko
+-- connect pinko wiring up. CTS is bit 2 of general control register.
+pinko_txd <= com1_bttxd;
+com1_btrxd <= pinko_rxd;
+pinko_cts <= control_latch(2);
+
+-- On other boards com1 is not copied to pinko
+--pinko_txd    <=  '0';
+--pinko_cts    <=  '1';
+---- allow external devices to talk to COM1
+--com1_btrxd    <=  'Z';
+
+--DEBUG
+--green_led <= nand_select;
+--green_led <= not( pcmcia_stschng_int or pcmcia_rdy_int);
+green_led <= not internal_register_select;
+
+bb_ib_dat0 <= '0';
+bb_ib_clk <= '0';
+bb_ib_stb <= '1';
+--bp_noe <= '1';
+bp_noe <= '1' when (cpu_ncs5 = '1') else cpu_noe;
+bp_npwe <= '1' when (cpu_ncs5 = '1') else cf_npwe;
+lpclk_out <= lcd_pclk;
+bp_dqm0 <= '0';
+bp_dqm1 <= '0';
+bp_dqm2 <= '0';
+bp_dqm3 <= '0';
+bp_sdclk0 <= '0';
+bp_sdclk1 <= '0';
+bp_ncs2 <= '1';
+bp_ncs3 <= '1';
+bp_ncs4 <= cpu_ncs4;
+--bp_ncs5 <= '1';
+bp_ncs5 <= cpu_ncs5;
+bp_rd_nwr <= '0';
+bp_nreset <= '1';
+
+bp_a(Backplane_Address_Bus_Size-1 downto 0) <= cpu_a(Backplane_Address_Bus_Size-1 downto 0) when cpu_ncs5 = '0' else (others=>'Z');
+--bp_a(Backplane_Address_Bus_Size-1 downto 0) <= cf_card_address when cpu_ncs5 = '1' else (others => 'Z');
+
+bp_d(Backplane_Data_Bus_Size-1 downto 0) <= cpu_data(Backplane_Data_Bus_Size-1 downto 0) when (cpu_ncs5 = '0' and cf_npwe = '0') else (others=>'Z');
+
+end Behavioral;
+
+