|
| 1 | +library IEEE; |
| 2 | +use IEEE.STD_LOGIC_1164.ALL; |
| 3 | +use IEEE.NUMERIC_STD.ALL; |
| 4 | + |
| 5 | +entity bbc_micro_tb is |
| 6 | +end entity; |
| 7 | + |
| 8 | +architecture tb of bbc_micro_tb is |
| 9 | +component bbc_micro_de1 is |
| 10 | +port ( |
| 11 | + -- Clocks |
| 12 | + CLOCK_24 : in std_logic_vector(1 downto 0); |
| 13 | + CLOCK_27 : in std_logic_vector(1 downto 0); |
| 14 | + CLOCK_50 : in std_logic; |
| 15 | + EXT_CLOCK : in std_logic; |
| 16 | + |
| 17 | + -- Switches |
| 18 | + SW : in std_logic_vector(9 downto 0); |
| 19 | + -- Buttons |
| 20 | + KEY : in std_logic_vector(3 downto 0); |
| 21 | + |
| 22 | + -- 7 segment displays |
| 23 | + HEX0 : out std_logic_vector(6 downto 0); |
| 24 | + HEX1 : out std_logic_vector(6 downto 0); |
| 25 | + HEX2 : out std_logic_vector(6 downto 0); |
| 26 | + HEX3 : out std_logic_vector(6 downto 0); |
| 27 | + -- Red LEDs |
| 28 | + LEDR : out std_logic_vector(9 downto 0); |
| 29 | + -- Green LEDs |
| 30 | + LEDG : out std_logic_vector(7 downto 0); |
| 31 | + |
| 32 | + -- VGA |
| 33 | + VGA_R : out std_logic_vector(3 downto 0); |
| 34 | + VGA_G : out std_logic_vector(3 downto 0); |
| 35 | + VGA_B : out std_logic_vector(3 downto 0); |
| 36 | + VGA_HS : out std_logic; |
| 37 | + VGA_VS : out std_logic; |
| 38 | + |
| 39 | + -- Serial |
| 40 | + UART_RXD : in std_logic; |
| 41 | + UART_TXD : out std_logic; |
| 42 | + |
| 43 | + -- PS/2 Keyboard |
| 44 | + PS2_CLK : inout std_logic; |
| 45 | + PS2_DAT : inout std_logic; |
| 46 | + |
| 47 | + -- I2C |
| 48 | + I2C_SCLK : inout std_logic; |
| 49 | + I2C_SDAT : inout std_logic; |
| 50 | + |
| 51 | + -- Audio |
| 52 | + AUD_XCK : out std_logic; |
| 53 | + AUD_BCLK : out std_logic; |
| 54 | + AUD_ADCLRCK : out std_logic; |
| 55 | + AUD_ADCDAT : in std_logic; |
| 56 | + AUD_DACLRCK : out std_logic; |
| 57 | + AUD_DACDAT : out std_logic; |
| 58 | + |
| 59 | + -- SRAM |
| 60 | + SRAM_ADDR : out std_logic_vector(17 downto 0); |
| 61 | + SRAM_DQ : inout std_logic_vector(15 downto 0); |
| 62 | + SRAM_CE_N : out std_logic; |
| 63 | + SRAM_OE_N : out std_logic; |
| 64 | + SRAM_WE_N : out std_logic; |
| 65 | + SRAM_UB_N : out std_logic; |
| 66 | + SRAM_LB_N : out std_logic; |
| 67 | + |
| 68 | + -- SDRAM |
| 69 | + DRAM_ADDR : out std_logic_vector(11 downto 0); |
| 70 | + DRAM_DQ : inout std_logic_vector(15 downto 0); |
| 71 | + DRAM_BA_0 : in std_logic; |
| 72 | + DRAM_BA_1 : in std_logic; |
| 73 | + DRAM_CAS_N : in std_logic; |
| 74 | + DRAM_CKE : in std_logic; |
| 75 | + DRAM_CLK : in std_logic; |
| 76 | + DRAM_CS_N : in std_logic; |
| 77 | + DRAM_LDQM : in std_logic; |
| 78 | + DRAM_RAS_N : in std_logic; |
| 79 | + DRAM_UDQM : in std_logic; |
| 80 | + DRAM_WE_N : in std_logic; |
| 81 | + |
| 82 | + -- Flash |
| 83 | + FL_ADDR : out std_logic_vector(21 downto 0); |
| 84 | + FL_DQ : inout std_logic_vector(7 downto 0); |
| 85 | + FL_RST_N : in std_logic; |
| 86 | + FL_OE_N : in std_logic; |
| 87 | + FL_WE_N : in std_logic; |
| 88 | + |
| 89 | + -- GPIO |
| 90 | + GPIO_0 : inout std_logic_vector(35 downto 0); |
| 91 | + GPIO_1 : inout std_logic_vector(35 downto 0) |
| 92 | + ); |
| 93 | +end component; |
| 94 | + |
| 95 | + |
| 96 | +signal clock_24 : std_logic_vector(1 downto 0) := "00"; |
| 97 | +signal clock_27 : std_logic_vector(1 downto 0) := "00"; |
| 98 | +signal clock_50 : std_logic := '0'; |
| 99 | +signal ext_clock : std_logic := '0'; |
| 100 | +signal sw : std_logic_vector(9 downto 0); |
| 101 | +signal key : std_logic_vector(3 downto 0); |
| 102 | +signal hex0 : std_logic_vector(6 downto 0); |
| 103 | +signal hex1 : std_logic_vector(6 downto 0); |
| 104 | +signal hex2 : std_logic_vector(6 downto 0); |
| 105 | +signal hex3 : std_logic_vector(6 downto 0); |
| 106 | +signal ledr : std_logic_vector(9 downto 0); |
| 107 | +signal ledg : std_logic_vector(7 downto 0); |
| 108 | +signal vga_r : std_logic_vector(3 downto 0); |
| 109 | +signal vga_g : std_logic_vector(3 downto 0); |
| 110 | +signal vga_b : std_logic_vector(3 downto 0); |
| 111 | +signal vga_hs : std_logic; |
| 112 | +signal vga_vs : std_logic; |
| 113 | +signal uart_rxd : std_logic; |
| 114 | +signal uart_txd : std_logic; |
| 115 | +signal ps2_clk : std_logic; |
| 116 | +signal ps2_dat : std_logic; |
| 117 | +signal i2c_sclk : std_logic; |
| 118 | +signal i2c_sdat : std_logic; |
| 119 | +signal aud_xck : std_logic; |
| 120 | +signal aud_bclk : std_logic; |
| 121 | +signal aud_adclrck : std_logic; |
| 122 | +signal aud_adcdat : std_logic; |
| 123 | +signal aud_daclrck : std_logic; |
| 124 | +signal aud_dacdat : std_logic; |
| 125 | +signal sram_addr : std_logic_vector(17 downto 0); |
| 126 | +signal sram_dq : std_logic_vector(15 downto 0); |
| 127 | +signal sram_ce_n : std_logic; |
| 128 | +signal sram_oe_n : std_logic; |
| 129 | +signal sram_we_n : std_logic; |
| 130 | +signal sram_ub_n : std_logic; |
| 131 | +signal sram_lb_n : std_logic; |
| 132 | +signal dram_addr : std_logic_vector(11 downto 0); |
| 133 | +signal dram_dq : std_logic_vector(15 downto 0); |
| 134 | +signal dram_ba_0 : std_logic; |
| 135 | +signal dram_ba_1 : std_logic; |
| 136 | +signal dram_cas_n : std_logic; |
| 137 | +signal dram_cke : std_logic; |
| 138 | +signal dram_clk : std_logic; |
| 139 | +signal dram_cs_n : std_logic; |
| 140 | +signal dram_ldqm : std_logic; |
| 141 | +signal dram_ras_n : std_logic; |
| 142 | +signal dram_udqm : std_logic; |
| 143 | +signal dram_we_n : std_logic; |
| 144 | +signal fl_addr : std_logic_vector(21 downto 0); |
| 145 | +signal fl_dq : std_logic_vector(7 downto 0); |
| 146 | +signal fl_rst_n : std_logic; |
| 147 | +signal fl_oe_n : std_logic; |
| 148 | +signal fl_we_n : std_logic; |
| 149 | +signal gpio_0 : std_logic_vector(35 downto 0); |
| 150 | +signal gpio_1 : std_logic_vector(35 downto 0); |
| 151 | + |
| 152 | +signal n_reset : std_logic := '0'; |
| 153 | +signal slow : std_logic := '0'; |
| 154 | + |
| 155 | +type ram_t is array(0 to 65535) of std_logic_vector(15 downto 0); |
| 156 | +signal ram : ram_t; |
| 157 | +signal ram_a : std_logic_vector(15 downto 0); |
| 158 | +begin |
| 159 | + |
| 160 | + uut: bbc_micro_de1 port map ( |
| 161 | + clock_24, |
| 162 | + clock_27, |
| 163 | + clock_50, |
| 164 | + ext_clock, |
| 165 | + sw, |
| 166 | + key, |
| 167 | + hex0, |
| 168 | + hex1, |
| 169 | + hex2, |
| 170 | + hex3, |
| 171 | + ledr, |
| 172 | + ledg, |
| 173 | + vga_r, |
| 174 | + vga_g, |
| 175 | + vga_b, |
| 176 | + vga_hs, |
| 177 | + vga_vs, |
| 178 | + uart_rxd, |
| 179 | + uart_txd, |
| 180 | + ps2_clk, |
| 181 | + ps2_dat, |
| 182 | + i2c_sclk, |
| 183 | + i2c_sdat, |
| 184 | + aud_xck, |
| 185 | + aud_bclk, |
| 186 | + aud_adclrck, |
| 187 | + aud_adcdat, |
| 188 | + aud_daclrck, |
| 189 | + aud_dacdat, |
| 190 | + sram_addr, |
| 191 | + sram_dq, |
| 192 | + sram_ce_n, |
| 193 | + sram_oe_n, |
| 194 | + sram_we_n, |
| 195 | + sram_ub_n, |
| 196 | + sram_lb_n, |
| 197 | + dram_addr, |
| 198 | + dram_dq, |
| 199 | + dram_ba_0, |
| 200 | + dram_ba_1, |
| 201 | + dram_cas_n, |
| 202 | + dram_cke, |
| 203 | + dram_clk, |
| 204 | + dram_cs_n, |
| 205 | + dram_ldqm, |
| 206 | + dram_ras_n, |
| 207 | + dram_udqm, |
| 208 | + dram_we_n, |
| 209 | + fl_addr, |
| 210 | + fl_dq, |
| 211 | + fl_rst_n, |
| 212 | + fl_oe_n, |
| 213 | + fl_we_n, |
| 214 | + gpio_0, |
| 215 | + gpio_1 |
| 216 | + ); |
| 217 | + |
| 218 | + sw <= n_reset & slow & "00000000"; |
| 219 | + clock_50 <= not clock_50 after 10 ns; |
| 220 | + clock_27(0) <= not clock_27(0) after 18.5 ns; |
| 221 | + clock_27(1) <= not clock_27(1) after 18.5 ns; |
| 222 | + clock_24(0) <= not clock_24(0) after 20.8 ns; |
| 223 | + clock_24(1) <= not clock_24(1) after 20.8 ns; |
| 224 | + |
| 225 | + reset: process |
| 226 | + begin |
| 227 | + wait for 100 ns; |
| 228 | + n_reset <= '1'; |
| 229 | + end process; |
| 230 | + |
| 231 | + sram: process(sram_addr,sram_dq,sram_ce_n,sram_oe_n,sram_we_n,sram_ub_n,sram_lb_n) |
| 232 | + begin |
| 233 | + if sram_ce_n = '0' then |
| 234 | + if sram_oe_n = '0' and sram_we_n = '1' then |
| 235 | + if sram_ub_n = '0' then |
| 236 | + sram_dq(15 downto 8) <= ram(to_integer(unsigned(sram_addr(15 downto 0))))(15 downto 8); |
| 237 | + else |
| 238 | + sram_dq(15 downto 8) <= (others => 'Z'); |
| 239 | + end if; |
| 240 | + if sram_lb_n = '0' then |
| 241 | + sram_dq(7 downto 0) <= ram(to_integer(unsigned(sram_addr(15 downto 0))))(7 downto 0); |
| 242 | + else |
| 243 | + sram_dq(7 downto 0) <= (others => 'Z'); |
| 244 | + end if; |
| 245 | + else |
| 246 | + sram_dq(15 downto 0) <= (others => 'Z'); |
| 247 | + if sram_we_n = '0' then |
| 248 | + if sram_ub_n = '0' then |
| 249 | + ram(to_integer(unsigned(sram_addr(15 downto 0))))(15 downto 8) <= sram_dq(15 downto 8); |
| 250 | + end if; |
| 251 | + if sram_lb_n = '0' then |
| 252 | + ram(to_integer(unsigned(sram_addr(15 downto 0))))(7 downto 0) <= sram_dq(7 downto 0); |
| 253 | + end if; |
| 254 | + end if; |
| 255 | + end if; |
| 256 | + else |
| 257 | + sram_dq <= (others => 'Z'); |
| 258 | + end if; |
| 259 | + end process; |
| 260 | + |
| 261 | + |
| 262 | +end architecture; |
0 commit comments