221 lines
4.4 KiB
VHDL
221 lines
4.4 KiB
VHDL
--------------------------------------------------------------------------------
|
|
-- Company:
|
|
-- Engineer:
|
|
--
|
|
-- Create Date: 17:16:42 13.05.2007
|
|
-- Design Name: tb_nco
|
|
-- Module Name: tb_nco.vhd
|
|
-- Project Name: nco
|
|
-- Target Device:
|
|
-- Tool versions:
|
|
-- Description:
|
|
--
|
|
-----------------------------------------------------------------------
|
|
-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/tb_sync_fifo_ctrl.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
|
|
-----------------------------------------------------------------------
|
|
LIBRARY IEEE;
|
|
USE IEEE.STD_LOGIC_1164.ALL;
|
|
USE IEEE.MATH_REAL.ALL;
|
|
USE IEEE.NUMERIC_STD.ALL;
|
|
USE STD.TEXTIO.ALL;
|
|
|
|
-- LIBRARY WORK;
|
|
-- USE.YOURLIB.WHATELSE
|
|
|
|
ENTITY tb_sync_fifo_ctrl IS
|
|
END tb_sync_fifo_ctrl;
|
|
|
|
ARCHITECTURE behavior OF tb_sync_fifo_ctrl IS
|
|
|
|
--Constants
|
|
constant PERIOD : time := 10 ns;
|
|
constant ADDR_WIDTH : integer := 3;
|
|
|
|
--Inputs
|
|
signal rst : STD_LOGIC := '1';
|
|
signal clk : STD_LOGIC := '0';
|
|
signal we : STD_LOGIC := '0';
|
|
signal re : STD_LOGIC := '0';
|
|
signal din : unsigned (7 downto 0);
|
|
--Outputs
|
|
|
|
signal ptr_w : unsigned (ADDR_WIDTH-1 downto 0);
|
|
signal ptr_r : unsigned (ADDR_WIDTH-1 downto 0);
|
|
signal dout : unsigned (7 downto 0);
|
|
signal fifo_full : STD_LOGIC;
|
|
signal fifo_empty : STD_LOGIC;
|
|
signal fifo_almost_full : STD_LOGIC;
|
|
signal fifo_almost_empty : STD_LOGIC;
|
|
signal mem_we : STD_LOGIC;
|
|
|
|
signal write_en : STD_LOGIC := '0';
|
|
signal read_en : STD_LOGIC := '0';
|
|
|
|
signal wdata : unsigned (7 downto 0) := (others => '0');
|
|
signal rdata : unsigned (7 downto 0) := (others => '0');
|
|
signal rdata2 : unsigned (7 downto 0) := (others => '0');
|
|
|
|
BEGIN
|
|
|
|
din <= wdata;
|
|
|
|
-- Instantiate the Unit Under Test (UUT)
|
|
uut: entity work.sync_fifo_ctrl
|
|
GENERIC MAP
|
|
(
|
|
addr_width => ADDR_WIDTH,
|
|
almost_full_thresh => 6,
|
|
almost_empty_thresh => 2
|
|
)
|
|
PORT MAP
|
|
(
|
|
rst => rst,
|
|
clk => clk,
|
|
we => we,
|
|
re => re,
|
|
ptr_w => ptr_w,
|
|
ptr_r => ptr_r,
|
|
fifo_full => fifo_full,
|
|
fifo_empty => fifo_empty,
|
|
fifo_afull => fifo_almost_full,
|
|
fifo_aempty => fifo_almost_empty
|
|
|
|
);
|
|
|
|
inst_dpram: entity work.dpram
|
|
GENERIC MAP (
|
|
addr_width => ADDR_WIDTH,
|
|
data_width => 8
|
|
)
|
|
PORT MAP(
|
|
clka => clk,
|
|
clkb => clk,
|
|
en_a => '1',
|
|
en_b => '1',
|
|
we_a => mem_we,
|
|
addr_a => ptr_w,
|
|
addr_b => ptr_r,
|
|
din_a => din,
|
|
dout_b => dout
|
|
);
|
|
|
|
tb_clk : PROCESS
|
|
BEGIN
|
|
clk <= not clk;
|
|
wait for PERIOD/2;
|
|
END PROCESS;
|
|
|
|
tb_write : PROCESS
|
|
BEGIN
|
|
|
|
-- Wait 100 ns for global reset to finish
|
|
wait for 5*PERIOD;
|
|
rst <= '0';
|
|
wait for 7*PERIOD;
|
|
write_en <= '1';
|
|
wait for 25*PERIOD;
|
|
write_en <= '0';
|
|
wait for 7*PERIOD;
|
|
write_en <= '1';
|
|
wait for 25*PERIOD;
|
|
write_en <= '0';
|
|
wait for 7*PERIOD;
|
|
write_en <= '1';
|
|
wait for 1*PERIOD;
|
|
write_en <= '0';
|
|
wait for 1*PERIOD;
|
|
write_en <= '1';
|
|
wait for 1*PERIOD;
|
|
write_en <= '0';
|
|
wait for 3*PERIOD;
|
|
write_en <= '1';
|
|
wait for 4*PERIOD;
|
|
write_en <= '0';
|
|
wait for 17*PERIOD;
|
|
write_en <= '1';
|
|
wait for 25*PERIOD;
|
|
write_en <= '0';
|
|
|
|
wait;
|
|
|
|
END PROCESS;
|
|
|
|
tb_read : PROCESS
|
|
BEGIN
|
|
|
|
-- Wait 100 ns for global reset to finish
|
|
wait for 25*PERIOD;
|
|
read_en <= '1';
|
|
wait for 25*PERIOD;
|
|
read_en <= '0';
|
|
wait for 25*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 5*PERIOD;
|
|
read_en <= '1';
|
|
wait for 1*PERIOD;
|
|
read_en <= '0';
|
|
wait for 7*PERIOD;
|
|
read_en <= '1';
|
|
wait for 15*PERIOD;
|
|
read_en <= '0';
|
|
|
|
wait;
|
|
|
|
END PROCESS;
|
|
|
|
we <= write_en and not fifo_full;
|
|
mem_we <= we;
|
|
|
|
tb_w : PROCESS(rst, clk)
|
|
BEGIN
|
|
|
|
if rst = '1' then
|
|
wdata <= (others => '0');
|
|
elsif rising_edge(clk) then
|
|
if we = '1' then
|
|
wdata <= wdata + 1;
|
|
end if;
|
|
end if;
|
|
|
|
END PROCESS;
|
|
|
|
re <= read_en and not fifo_empty;
|
|
|
|
tb_r : PROCESS(rst, clk)
|
|
BEGIN
|
|
|
|
if rst = '1' then
|
|
rdata <= (others => '0');
|
|
elsif rising_edge(clk) then
|
|
rdata2 <= rdata;
|
|
if re = '1' then
|
|
assert rdata = dout report "FIFO read error!" severity failure;
|
|
rdata <= rdata + 1;
|
|
end if;
|
|
end if;
|
|
|
|
END PROCESS;
|
|
|
|
END behavior; |