1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity bus_test is
|
6 | end entity bus_test;
|
7 |
|
8 | architecture behaviorial of bus_test is
|
9 | signal done : boolean := false;
|
10 | signal clk, reset : std_logic := '0';
|
11 | signal address : unsigned(7 downto 0);
|
12 | signal data : std_logic_vector(7 downto 0);
|
13 | signal my_data : std_logic_vector(data'range);
|
14 | signal rd, wr : std_logic;
|
15 | constant MY_ADDRESS1 : unsigned(address'range) := b"1000_0000";
|
16 | constant MY_ADDRESS2 : unsigned(address'range) := b"1001_0000";
|
17 | constant TST_DATA1 : std_logic_vector(data'range)
|
18 | := b"10101010";
|
19 | constant TST_DATA2 : std_logic_vector(data'range)
|
20 | := b"01010101";
|
21 | begin
|
22 |
|
23 | clk_proc : process is
|
24 | constant PERIOD : time := 10 ns;
|
25 | begin
|
26 | clk <= '0';
|
27 | if done then wait; end if;
|
28 | wait for PERIOD/2;
|
29 | clk <= '1';
|
30 | wait for PERIOD/2;
|
31 | end process clk_proc;
|
32 |
|
33 | rst : reset <= '1', '0' after 15 ns;
|
34 |
|
35 | register_set : block is
|
36 | signal m_register1 : std_logic_vector(data'range);
|
37 | signal m_register2 : std_logic_vector(data'range);
|
38 | begin
|
39 | rdwr_proc : process (clk, reset) is
|
40 | begin
|
41 | if (reset = '1') then
|
42 | data <= (others => 'Z');
|
43 | elsif rising_edge(clk) then
|
44 | if (wr = '1') and (rd = '0') then
|
45 | case address is
|
46 | when MY_ADDRESS1 => m_register1 <= data;
|
47 | when MY_ADDRESS2 => m_register2 <= data;
|
48 | when others => null;
|
49 | end case;
|
50 | elsif (wr = '0') and (rd = '1') then
|
51 | case address is
|
52 | when MY_ADDRESS1 => data <= m_register1;
|
53 | when MY_ADDRESS2 => data <= m_register2;
|
54 | when others => null;
|
55 | end case;
|
56 | else
|
57 | data <= (others => 'Z');
|
58 | end if;
|
59 | end if;
|
60 | end process rdwr_proc;
|
61 | end block register_set;
|
62 |
|
63 | TB : process is
|
64 | ------------------------------------------
|
65 | procedure tic is
|
66 | begin
|
67 | wait until rising_edge(clk);
|
68 | end procedure tic;
|
69 | ------------------------------------------
|
70 | procedure do_wr (
|
71 | constant addr : in unsigned;
|
72 | constant dat : in std_logic_vector) is
|
73 | begin
|
74 | wr <= '1';
|
75 | address <= addr;
|
76 | data <= dat;
|
77 | tic;
|
78 | wr <= '0';
|
79 | data <= (others => 'Z');
|
80 | end procedure do_wr;
|
81 | ------------------------------------------
|
82 | procedure do_rd (
|
83 | constant addr : in unsigned;
|
84 | signal dat : out std_logic_vector) is
|
85 | begin
|
86 | rd <= '1';
|
87 | address <= addr;
|
88 | tic;tic;
|
89 | dat <= data;
|
90 | rd <= '0';
|
91 | end procedure do_rd;
|
92 | ------------------------------------------
|
93 | begin
|
94 | my_data <= (others => '0');
|
95 | rd <= '0';
|
96 | wr <= '0';
|
97 | address <= (others => '0');
|
98 | data <= (others => '0');
|
99 | wait until (reset = '0');
|
100 | tic; tic;
|
101 |
|
102 | do_wr(MY_ADDRESS1, TST_DATA1);
|
103 | do_wr(MY_ADDRESS2, TST_DATA2);
|
104 |
|
105 | do_rd(MY_ADDRESS1, my_data);
|
106 | do_rd(MY_ADDRESS2, my_data);
|
107 |
|
108 | assert (my_data = TST_DATA1)
|
109 | report "* missmatch 1 *" severity error;
|
110 | tic;
|
111 | assert (my_data = TST_DATA2)
|
112 | report "* missmatch 2 *" severity error;
|
113 |
|
114 | tic;
|
115 | done <= true;
|
116 |
|
117 | end process TB;
|
118 | end architecture behaviorial;
|