Linear addressing from Cn00
This commit is contained in:
parent
b0df142692
commit
cf98c54e77
|
@ -41,17 +41,18 @@ entity AddressDecoder is
|
||||||
NRESET : in std_logic;
|
NRESET : in std_logic;
|
||||||
DATA_EN : out std_logic; -- to CPLD
|
DATA_EN : out std_logic; -- to CPLD
|
||||||
NG : out std_logic; -- to bus transceiver
|
NG : out std_logic; -- to bus transceiver
|
||||||
NOE : out std_logic); -- to EPROM
|
NOE : out std_logic;
|
||||||
|
LED : out std_logic); -- to EPROM
|
||||||
end AddressDecoder;
|
end AddressDecoder;
|
||||||
|
|
||||||
architecture Behavioral of AddressDecoder is
|
architecture Behavioral of AddressDecoder is
|
||||||
|
|
||||||
signal cfxx : std_logic; -- $C800 - $CFFF disable
|
signal cfxx : std_logic; -- $C800 - $CFFF disable
|
||||||
signal noe_int : std_logic;
|
|
||||||
signal ndev_sel_int : std_logic;
|
signal ndev_sel_int : std_logic;
|
||||||
signal nio_sel_int : std_logic;
|
signal nio_sel_int : std_logic;
|
||||||
signal nio_stb_int : std_logic;
|
signal nio_stb_int : std_logic;
|
||||||
signal ncs : std_logic; -- $C800 - $CFFF enabled
|
signal ncs : std_logic; -- $C800 - $CFFF enabled
|
||||||
|
signal a_int : std_logic_vector (11 downto 8);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
||||||
|
@ -61,17 +62,27 @@ begin
|
||||||
-- only from the first rising edge of 7M when any select
|
-- only from the first rising edge of 7M when any select
|
||||||
-- line is low (Phi0 high) to the falling edge of Phi0
|
-- line is low (Phi0 high) to the falling edge of Phi0
|
||||||
|
|
||||||
B(8) <= A(8) or not A(11);
|
-- $C0xx to $C7xx is mapped to EEPROM bank 0
|
||||||
B(9) <= A(9) or not A(11);
|
-- $C8xx to $CExx is mapped to banks 1 to 7
|
||||||
B(10) <= A(10) or not A(11);
|
|
||||||
DATA_EN <= RNW and not ndev_sel_int and PHI0;
|
|
||||||
NG <= (ndev_sel_int and noe_int) or not PHI0;
|
|
||||||
NOE <= noe_int or not PHI0;
|
|
||||||
noe_int <= not RNW or not ndev_sel_int
|
|
||||||
or (nio_sel_int and nio_stb_int)
|
|
||||||
or (nio_sel_int and ncs);
|
|
||||||
|
|
||||||
cfxx <= A(8) and A(9) and A(10) and not nio_stb_int;
|
LED <= ncs;
|
||||||
|
B(8) <= (a_int(11) and not a_int(8))
|
||||||
|
or (a_int(11) and a_int(10) and a_int(9));
|
||||||
|
B(9) <= (a_int(11) and not a_int(9) and a_int(8))
|
||||||
|
or (a_int(11) and a_int(9) and not a_int(8))
|
||||||
|
or (a_int(11) and a_int(10) and a_int(9));
|
||||||
|
B(10) <= (a_int(11) and a_int(10))
|
||||||
|
or (a_int(11) and a_int(9) and a_int(8));
|
||||||
|
|
||||||
|
DATA_EN <= RNW and not NDEV_SEL;
|
||||||
|
NG <= (ndev_sel_int and nio_sel_int and nio_stb_int)
|
||||||
|
or (ndev_sel_int and nio_sel_int and ncs)
|
||||||
|
or not PHI0;
|
||||||
|
NOE <= not RNW
|
||||||
|
or not NDEV_SEL
|
||||||
|
or (not NIO_STB and ncs);
|
||||||
|
|
||||||
|
cfxx <= a_int(8) and a_int(9) and a_int(10) and not nio_stb_int;
|
||||||
|
|
||||||
process(NRESET, nio_sel_int, cfxx)
|
process(NRESET, nio_sel_int, cfxx)
|
||||||
begin
|
begin
|
||||||
|
@ -88,10 +99,12 @@ begin
|
||||||
ndev_sel_int <= '1';
|
ndev_sel_int <= '1';
|
||||||
nio_sel_int <= '1';
|
nio_sel_int <= '1';
|
||||||
nio_stb_int <= '1';
|
nio_stb_int <= '1';
|
||||||
|
a_int <= "0000";
|
||||||
elsif rising_edge(CLK) then
|
elsif rising_edge(CLK) then
|
||||||
ndev_sel_int <= NDEV_SEL;
|
ndev_sel_int <= NDEV_SEL;
|
||||||
nio_sel_int <= NIO_SEL;
|
nio_sel_int <= NIO_SEL;
|
||||||
nio_stb_int <= NIO_STB;
|
nio_stb_int <= NIO_STB;
|
||||||
|
a_int <= A;
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,8 @@ ARCHITECTURE behavior OF AddressDecoder_Test IS
|
||||||
NRESET : IN std_logic;
|
NRESET : IN std_logic;
|
||||||
DATA_EN : OUT std_logic;
|
DATA_EN : OUT std_logic;
|
||||||
NG : OUT std_logic;
|
NG : OUT std_logic;
|
||||||
NOE : OUT std_logic
|
NOE : OUT std_logic;
|
||||||
|
LED : OUT std_logic
|
||||||
);
|
);
|
||||||
END COMPONENT;
|
END COMPONENT;
|
||||||
|
|
||||||
|
@ -72,6 +73,7 @@ ARCHITECTURE behavior OF AddressDecoder_Test IS
|
||||||
signal DATA_EN : std_logic;
|
signal DATA_EN : std_logic;
|
||||||
signal NG : std_logic;
|
signal NG : std_logic;
|
||||||
signal NOE : std_logic;
|
signal NOE : std_logic;
|
||||||
|
signal LED : std_logic;
|
||||||
|
|
||||||
-- Clock period definitions
|
-- Clock period definitions
|
||||||
constant CLK_period : time := 142 ns;
|
constant CLK_period : time := 142 ns;
|
||||||
|
@ -91,7 +93,8 @@ BEGIN
|
||||||
NRESET => NRESET,
|
NRESET => NRESET,
|
||||||
DATA_EN => DATA_EN,
|
DATA_EN => DATA_EN,
|
||||||
NG => NG,
|
NG => NG,
|
||||||
NOE => NOE
|
NOE => NOE,
|
||||||
|
LED => LED
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Clock process definitions
|
-- Clock process definitions
|
||||||
|
@ -127,7 +130,7 @@ BEGIN
|
||||||
|
|
||||||
-- insert stimulus here
|
-- insert stimulus here
|
||||||
-- C0nX access
|
-- C0nX access
|
||||||
A <= "0000"; -- must become "111"
|
A <= "0000"; -- must become "000"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NDEV_SEL <= '0';
|
NDEV_SEL <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
@ -135,7 +138,7 @@ BEGIN
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
|
|
||||||
-- CnXX access
|
-- CnXX access
|
||||||
A <= "0100"; -- must become "111"
|
A <= "0100"; -- must become "000"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NIO_SEL <= '0';
|
NIO_SEL <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
@ -143,7 +146,7 @@ BEGIN
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
|
|
||||||
-- C8xx access, selected
|
-- C8xx access, selected
|
||||||
A <= "1000"; -- must become "000"
|
A <= "1000"; -- must become "001"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NIO_STB <= '0';
|
NIO_STB <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
@ -151,7 +154,7 @@ BEGIN
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
|
|
||||||
-- C9xx access, selected
|
-- C9xx access, selected
|
||||||
A <= "1001"; -- must become "001"
|
A <= "1001"; -- must become "010"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NIO_STB <= '0';
|
NIO_STB <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
@ -159,7 +162,7 @@ BEGIN
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
|
|
||||||
-- CPLD access
|
-- CPLD access
|
||||||
A <= "0101"; -- must become "111"
|
A <= "0101"; -- must become "000"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NDEV_SEL <= '0';
|
NDEV_SEL <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
@ -175,7 +178,7 @@ BEGIN
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
|
|
||||||
-- C8xx access, unselected
|
-- C8xx access, unselected
|
||||||
A <= "1000"; -- must become "000"
|
A <= "1000"; -- must become "001"
|
||||||
wait until rising_edge(PHI0);
|
wait until rising_edge(PHI0);
|
||||||
NIO_STB <= '0';
|
NIO_STB <= '0';
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
|
|
1188
VHDL/AppleIISd.jed
1188
VHDL/AppleIISd.jed
File diff suppressed because it is too large
Load Diff
|
@ -67,9 +67,6 @@ architecture Behavioral of AppleIISd is
|
||||||
signal data_in : std_logic_vector (7 downto 0);
|
signal data_in : std_logic_vector (7 downto 0);
|
||||||
signal data_out : std_logic_vector (7 downto 0);
|
signal data_out : std_logic_vector (7 downto 0);
|
||||||
signal addr_low_int : std_logic_vector (1 downto 0);
|
signal addr_low_int : std_logic_vector (1 downto 0);
|
||||||
signal wp_int : std_logic;
|
|
||||||
signal card_int : std_logic;
|
|
||||||
signal miso_int : std_logic;
|
|
||||||
|
|
||||||
signal data_en : std_logic;
|
signal data_en : std_logic;
|
||||||
|
|
||||||
|
@ -106,7 +103,8 @@ Port (
|
||||||
NRESET : in std_logic;
|
NRESET : in std_logic;
|
||||||
DATA_EN : out std_logic;
|
DATA_EN : out std_logic;
|
||||||
NG : out std_logic;
|
NG : out std_logic;
|
||||||
NOE : out std_logic
|
NOE : out std_logic;
|
||||||
|
LED : out std_logic
|
||||||
);
|
);
|
||||||
end component;
|
end component;
|
||||||
|
|
||||||
|
@ -120,12 +118,12 @@ begin
|
||||||
phi0 => PHI0,
|
phi0 => PHI0,
|
||||||
ndev_sel => NDEV_SEL,
|
ndev_sel => NDEV_SEL,
|
||||||
clk => CLK,
|
clk => CLK,
|
||||||
miso => miso_int,
|
miso => MISO,
|
||||||
mosi => MOSI,
|
mosi => MOSI,
|
||||||
sclk => SCLK,
|
sclk => SCLK,
|
||||||
nsel => NSEL,
|
nsel => NSEL,
|
||||||
wp => wp_int,
|
wp => WP,
|
||||||
card => card_int,
|
card => CARD,
|
||||||
led => LED
|
led => LED
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -142,21 +140,9 @@ begin
|
||||||
DATA_EN => data_en,
|
DATA_EN => data_en,
|
||||||
NOE => NOE,
|
NOE => NOE,
|
||||||
NG => NG
|
NG => NG
|
||||||
|
--LED => LED
|
||||||
);
|
);
|
||||||
|
|
||||||
ctrl_latch: process(CLK, NRESET)
|
|
||||||
begin
|
|
||||||
if(NRESET = '0') then
|
|
||||||
wp_int <= '1';
|
|
||||||
card_int <= '1';
|
|
||||||
miso_int <= '1';
|
|
||||||
elsif falling_edge(CLK) then
|
|
||||||
wp_int <= WP;
|
|
||||||
card_int <= CARD;
|
|
||||||
miso_int <= MISO;
|
|
||||||
end if;
|
|
||||||
end process;
|
|
||||||
|
|
||||||
DATA <= data_out when (data_en = '1') else (others => 'Z'); -- data bus tristate
|
DATA <= data_out when (data_en = '1') else (others => 'Z'); -- data bus tristate
|
||||||
|
|
||||||
-- synthesis translate_off
|
-- synthesis translate_off
|
||||||
|
|
|
@ -190,6 +190,25 @@ BEGIN
|
||||||
wait for ADD_hold;
|
wait for ADD_hold;
|
||||||
ADD_LOW <= (others => 'U');
|
ADD_LOW <= (others => 'U');
|
||||||
|
|
||||||
|
-- select card
|
||||||
|
wait until falling_edge(PHI0);
|
||||||
|
wait for ADD_valid;
|
||||||
|
ADD_LOW <= (others => '1');
|
||||||
|
RNW <= '0';
|
||||||
|
DATA <= (others => 'U');
|
||||||
|
wait until rising_edge(PHI0);
|
||||||
|
NDEV_SEL <= '0';
|
||||||
|
DATA <= (others => 'Z');
|
||||||
|
wait for DATA_valid;
|
||||||
|
DATA <= X"00";
|
||||||
|
wait until falling_edge(PHI0);
|
||||||
|
NDEV_SEL <= '1';
|
||||||
|
wait for ADD_hold;
|
||||||
|
--wait for CLK_period;
|
||||||
|
ADD_LOW <= (others => 'U');
|
||||||
|
RNW <= '1';
|
||||||
|
DATA <= (others => 'Z');
|
||||||
|
|
||||||
-- send data
|
-- send data
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
wait for ADD_valid;
|
wait for ADD_valid;
|
||||||
|
@ -208,9 +227,28 @@ BEGIN
|
||||||
ADD_LOW <= (others => 'U');
|
ADD_LOW <= (others => 'U');
|
||||||
RNW <= '1';
|
RNW <= '1';
|
||||||
DATA <= (others => 'Z');
|
DATA <= (others => 'Z');
|
||||||
|
wait for 20 us;
|
||||||
|
|
||||||
|
-- deselect card
|
||||||
|
wait until falling_edge(PHI0);
|
||||||
|
wait for ADD_valid;
|
||||||
|
ADD_LOW <= (others => '1');
|
||||||
|
RNW <= '0';
|
||||||
|
DATA <= (others => 'U');
|
||||||
|
wait until rising_edge(PHI0);
|
||||||
|
NDEV_SEL <= '0';
|
||||||
|
DATA <= (others => 'Z');
|
||||||
|
wait for DATA_valid;
|
||||||
|
DATA <= X"01";
|
||||||
|
wait until falling_edge(PHI0);
|
||||||
|
NDEV_SEL <= '1';
|
||||||
|
wait for ADD_hold;
|
||||||
|
--wait for CLK_period;
|
||||||
|
ADD_LOW <= (others => 'U');
|
||||||
|
RNW <= '1';
|
||||||
|
DATA <= (others => 'Z');
|
||||||
|
|
||||||
-- write ece
|
-- write ece
|
||||||
wait for 20 us;
|
|
||||||
wait until falling_edge(PHI0);
|
wait until falling_edge(PHI0);
|
||||||
wait for ADD_valid;
|
wait for ADD_valid;
|
||||||
ADD_LOW <= "01";
|
ADD_LOW <= "01";
|
||||||
|
|
Loading…
Reference in New Issue