mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2025-01-09 09:00:16 +02:00
120 lines
4.0 KiB
VHDL
120 lines
4.0 KiB
VHDL
---------------------------------------------------------------------
|
|
-- TITLE: Test Bench
|
|
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
|
|
-- DATE CREATED: 4/21/01
|
|
-- FILENAME: tbench.vhd
|
|
-- PROJECT: Plasma CPU core
|
|
-- COPYRIGHT: Software placed into the public domain by the author.
|
|
-- Software 'as is' without warranty. Author liable for nothing.
|
|
-- DESCRIPTION:
|
|
-- This entity provides a test bench for testing the Plasma CPU core.
|
|
---------------------------------------------------------------------
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use work.mlite_pack.all;
|
|
use ieee.std_logic_unsigned.all;
|
|
|
|
entity tbench is
|
|
end; --entity tbench
|
|
|
|
architecture logic of tbench is
|
|
constant memory_type : string :=
|
|
"TRI_PORT_X";
|
|
-- "DUAL_PORT_";
|
|
-- "ALTERA_LPM";
|
|
-- "XILINX_16X";
|
|
|
|
constant log_file : string :=
|
|
-- "UNUSED";
|
|
"output.txt";
|
|
|
|
signal clk : std_logic := '1';
|
|
signal reset : std_logic := '1';
|
|
signal interrupt : std_logic := '0';
|
|
signal mem_write : std_logic;
|
|
signal address : std_logic_vector(31 downto 2);
|
|
signal data_write : std_logic_vector(31 downto 0);
|
|
signal data_read : std_logic_vector(31 downto 0);
|
|
signal pause1 : std_logic := '0';
|
|
signal pause2 : std_logic := '0';
|
|
signal pause : std_logic;
|
|
signal no_ddr_start: std_logic;
|
|
signal no_ddr_stop : std_logic;
|
|
signal byte_we : std_logic_vector(3 downto 0);
|
|
signal uart_write : std_logic;
|
|
signal gpioA_in : std_logic_vector(31 downto 0) := (others => '0');
|
|
begin --architecture
|
|
--Uncomment the line below to test interrupts
|
|
interrupt <= '1' after 20 us when interrupt = '0' else '0' after 445 ns;
|
|
|
|
clk <= not clk after 50 ns;
|
|
reset <= '0' after 500 ns;
|
|
pause1 <= '1' after 700 ns when pause1 = '0' else '0' after 200 ns;
|
|
pause2 <= '1' after 300 ns when pause2 = '0' else '0' after 200 ns;
|
|
pause <= pause1 or pause2;
|
|
gpioA_in(20) <= not gpioA_in(20) after 200 ns; --E_RX_CLK
|
|
gpioA_in(19) <= not gpioA_in(19) after 20 us; --E_RX_DV
|
|
gpioA_in(18 downto 15) <= gpioA_in(18 downto 15) + 1 after 400 ns; --E_RX_RXD
|
|
gpioA_in(14) <= not gpioA_in(14) after 200 ns; --E_TX_CLK
|
|
|
|
u1_plasma: plasma
|
|
generic map (memory_type => memory_type,
|
|
ethernet => '1',
|
|
use_cache => '1',
|
|
log_file => log_file)
|
|
PORT MAP (
|
|
clk => clk,
|
|
reset => reset,
|
|
uart_read => uart_write,
|
|
uart_write => uart_write,
|
|
|
|
address => address,
|
|
byte_we => byte_we,
|
|
data_write => data_write,
|
|
data_read => data_read,
|
|
mem_pause_in => pause,
|
|
no_ddr_start => no_ddr_start,
|
|
no_ddr_stop => no_ddr_stop,
|
|
|
|
gpio0_out => open,
|
|
gpioA_in => gpioA_in);
|
|
|
|
dram_proc: process(clk, address, byte_we, data_write, pause)
|
|
constant ADDRESS_WIDTH : natural := 16;
|
|
type storage_array is
|
|
array(natural range 0 to (2 ** ADDRESS_WIDTH) / 4 - 1) of
|
|
std_logic_vector(31 downto 0);
|
|
variable storage : storage_array;
|
|
variable data : std_logic_vector(31 downto 0);
|
|
variable index : natural := 0;
|
|
begin
|
|
index := conv_integer(address(ADDRESS_WIDTH-1 downto 2));
|
|
data := storage(index);
|
|
|
|
if byte_we(0) = '1' then
|
|
data(7 downto 0) := data_write(7 downto 0);
|
|
end if;
|
|
if byte_we(1) = '1' then
|
|
data(15 downto 8) := data_write(15 downto 8);
|
|
end if;
|
|
if byte_we(2) = '1' then
|
|
data(23 downto 16) := data_write(23 downto 16);
|
|
end if;
|
|
if byte_we(3) = '1' then
|
|
data(31 downto 24) := data_write(31 downto 24);
|
|
end if;
|
|
|
|
if rising_edge(clk) then
|
|
if address(30 downto 28) = "001" and byte_we /= "0000" then
|
|
storage(index) := data;
|
|
end if;
|
|
end if;
|
|
|
|
if pause = '0' then
|
|
data_read <= data;
|
|
end if;
|
|
end process;
|
|
|
|
|
|
end; --architecture logic
|