summaryrefslogtreecommitdiff
path: root/vhdl/TEST_AS7C256A.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'vhdl/TEST_AS7C256A.vhd')
-rw-r--r--vhdl/TEST_AS7C256A.vhd264
1 files changed, 264 insertions, 0 deletions
diff --git a/vhdl/TEST_AS7C256A.vhd b/vhdl/TEST_AS7C256A.vhd
new file mode 100644
index 0000000..5f49d4e
--- /dev/null
+++ b/vhdl/TEST_AS7C256A.vhd
@@ -0,0 +1,264 @@
+-- Testbench for Alliance Semiconductors ASync SRAM
+
+LIBRARY ieee;
+ USE ieee.std_logic_1164.ALL;
+
+ENTITY testbench IS
+END testbench;
+
+ARCHITECTURE testbench_arch OF testbench IS
+ -- Clock
+ CONSTANT tCYC : TIME := 12 ns;
+ CONSTANT tWC : TIME := 10 ns;
+ CONSTANT tRC : TIME := 10 ns;
+ CONSTANT t1 : TIME := 1 ns;
+ CONSTANT twz : TIME := 5 ns;
+ CONSTANT tcw : TIME := 7 ns;
+ -- Bus Width and Data Bus
+ CONSTANT addr_bits : INTEGER := 15;
+ CONSTANT data_bits : INTEGER := 8;
+
+ COMPONENT AS7C256A
+ PORT (
+ Address : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ DataIO : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
+ OE_bar : IN STD_LOGIC;
+ CE_bar : IN STD_LOGIC;
+ WE_bar : IN STD_LOGIC
+ );
+ END COMPONENT;
+
+ FOR ALL: AS7C256A USE ENTITY WORK.AS7C256A (behave);
+
+ SIGNAL Address : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ SIGNAL DataIO : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
+ SIGNAL OE_bar : STD_LOGIC;
+ SIGNAL CE_bar : STD_LOGIC;
+ SIGNAL WE_bar : STD_LOGIC;
+
+ SIGNAL Done : BOOLEAN := FALSE;
+
+ BEGIN
+ U1 : AS7C256A PORT MAP (Address, DataIO, OE_bar, CE_bar, WE_bar);
+
+ Stimulus : PROCESS
+ -- Deselect
+ PROCEDURE deselect IS
+ BEGIN
+ OE_bar <= '1';
+ CE_bar <= '1';
+ WE_bar <= '1';
+ Address <= (OTHERS => '0');
+ DataIO <= (OTHERS => 'Z');
+
+ WAIT FOR tCYC;
+ END;
+
+ PROCEDURE write_ce (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ data_in : IN STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ WAIT FOR t1;
+ OE_bar <= '1';
+ CE_bar <= '0';
+ WE_bar <= '0';
+
+ WAIT FOR twz;
+ DataIO <= data_in;
+ WAIT FOR (tCYC-twz);
+
+ CE_bar <= '1';
+ WAIT FOR t1;
+
+ END;
+
+ PROCEDURE write_we (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ data_in : IN STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ WAIT FOR t1;
+ OE_bar <= '1';
+ CE_bar <= '0';
+ WE_bar <= '0';
+
+ WAIT FOR twz;
+ DataIO <= data_in;
+ WAIT FOR tCYC;
+
+ WE_bar <= '1';
+ WAIT FOR t1;
+
+ END;
+
+
+ PROCEDURE write_wece (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ data_in : IN STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ WAIT FOR t1;
+ OE_bar <= '1';
+ CE_bar <= '0';
+ WE_bar <= '0';
+
+ WAIT FOR twz;
+ DataIO <= data_in;
+ WAIT FOR tCYC;
+
+ WE_bar <= '1';
+ CE_bar <= '1';
+ WAIT FOR t1;
+
+ END;
+
+ PROCEDURE write_add (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ data_in : IN STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ OE_bar <= '1';
+ CE_bar <= '0';
+ WE_bar <= '0';
+
+ DataIO <= data_in;
+ WAIT FOR tWC;
+
+
+ END;
+
+ PROCEDURE write_data (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ data_in : IN STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ OE_bar <= '1';
+ CE_bar <= '0';
+ WE_bar <= '0';
+
+ WAIT FOR twz;
+ DataIO <= data_in;
+ WAIT FOR (tWC/2);
+
+
+ END;
+
+
+
+ PROCEDURE read_ce (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ WAIT FOR t1;
+ OE_bar <= '0';
+ CE_bar <= '0';
+ WE_bar <= '1';
+ DataIO <= (OTHERS => 'Z');
+ WAIT FOR tCYC;
+
+ END;
+
+ PROCEDURE read_add (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ OE_bar <= '0';
+ CE_bar <= '0';
+ WE_bar <= '1';
+ DataIO <= (OTHERS => 'Z');
+ WAIT FOR tRC;
+
+ END;
+
+
+ PROCEDURE read_oe (addr_in : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0)) IS
+ BEGIN
+ Address <= addr_in;
+ CE_bar <= '0';
+ WE_bar <= '1';
+ DataIO <= (OTHERS => 'Z');
+ WAIT FOR (7*t1);
+ OE_bar <= '0';
+ WAIT FOR tCYC;
+
+ END;
+
+
+
+
+
+
+
+
+ BEGIN
+ -- Test vectors
+ deselect;
+ --deselect;
+
+ --WWRR (we/ce controlled)
+ write_ce("000000000000001",
+ "00000001");
+
+ write_we("000000000000010",
+ "00000010");
+
+ read_ce ("000000000000001");
+
+
+ read_ce ("000000000000010");
+ deselect;
+ --WWRR ( only address controlled)
+ write_add("000000000000011",
+ "00000011");
+
+ write_add("000000000000100",
+ "00000100");
+
+ read_add ("000000000000011");
+
+
+ read_add ("000000000000100");
+ deselect;
+
+ --WRWR (oe read controlled)
+ write_wece("000000000000101",
+ "00000101");
+
+ read_oe ("000000000000101");
+
+
+ write_we("000000000000110",
+ "00000110");
+
+ read_oe ("000000000000110");
+
+ deselect;
+ --WRWR ( Data change)
+ write_add("000000000000111",
+ "00000001");
+
+ write_add("000000000000111",
+ "00000111");
+
+ read_ce ("000000000000111");
+
+
+ write_data("000000000001000",
+ "00000011");
+
+ write_add("000000000001000",
+ "00001000");
+
+ read_ce ("000000000001000");
+
+
+
+ deselect;
+
+
+
+ Done <= TRUE;
+
+
+ assert false report "end of test" severity note;
+
+ WAIT;
+ END PROCESS;
+
+
+ END testbench_arch;
+