|
|
------------------------------------------------------------------------------
|
|
|
-- This file is a part of the LPP VHDL IP LIBRARY
|
|
|
-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS
|
|
|
--
|
|
|
-- This program is free software; you can redistribute it and/or modify
|
|
|
-- it under the terms of the GNU General Public License as published by
|
|
|
-- the Free Software Foundation; either version 3 of the License, or
|
|
|
-- (at your option) any later version.
|
|
|
--
|
|
|
-- This program is distributed in the hope that it will be useful,
|
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
-- GNU General Public License for more details.
|
|
|
--
|
|
|
-- You should have received a copy of the GNU General Public License
|
|
|
-- along with this program; if not, write to the Free Software
|
|
|
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
-------------------------------------------------------------------------------
|
|
|
-- Author : Jean-christophe Pellion
|
|
|
-- Mail : jean-christophe.pellion@lpp.polytechnique.fr
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
|
|
LIBRARY IEEE;
|
|
|
USE IEEE.STD_LOGIC_1164.ALL;
|
|
|
USE IEEE.MATH_REAL.ALL;
|
|
|
USE IEEE.NUMERIC_STD.ALL;
|
|
|
|
|
|
--LIBRARY lpp;
|
|
|
--USE lpp.iir_filter.ALL;
|
|
|
|
|
|
LIBRARY techmap;
|
|
|
USE techmap.gencomp.ALL;
|
|
|
|
|
|
ENTITY TB IS
|
|
|
|
|
|
|
|
|
END TB;
|
|
|
|
|
|
|
|
|
ARCHITECTURE beh OF TB IS
|
|
|
|
|
|
COMPONENT RAM_CEL
|
|
|
GENERIC (
|
|
|
DataSz : integer range 1 to 32;
|
|
|
abits : integer range 2 to 12);
|
|
|
PORT (
|
|
|
WD : in std_logic_vector(DataSz-1 downto 0);
|
|
|
RD : out std_logic_vector(DataSz-1 downto 0);
|
|
|
WEN, REN : in std_logic;
|
|
|
WADDR : in std_logic_vector(abits-1 downto 0);
|
|
|
RADDR : in std_logic_vector(abits-1 downto 0);
|
|
|
RWCLK, RESET : in std_logic);
|
|
|
END COMPONENT;
|
|
|
|
|
|
CONSTANT DATA_SIZE : INTEGER := 8;
|
|
|
CONSTANT ADDR_BIT_NUMBER : INTEGER := 8;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
SIGNAL clk : STD_LOGIC := '0';
|
|
|
SIGNAL rstn : STD_LOGIC := '0';
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
SIGNAL write_data : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL write_addr : STD_LOGIC_VECTOR(ADDR_BIT_NUMBER-1 DOWNTO 0);
|
|
|
SIGNAL write_enable : STD_LOGIC;
|
|
|
SIGNAL write_enable_n : STD_LOGIC;
|
|
|
|
|
|
SIGNAL read_data_ram : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL read_data_cel : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL read_addr : STD_LOGIC_VECTOR(ADDR_BIT_NUMBER-1 DOWNTO 0);
|
|
|
SIGNAL read_enable : STD_LOGIC;
|
|
|
SIGNAL read_enable_n : STD_LOGIC;
|
|
|
-----------------------------------------------------------------------------
|
|
|
CONSTANT RANDOM_VECTOR_SIZE : INTEGER := DATA_SIZE + ADDR_BIT_NUMBER + ADDR_BIT_NUMBER + 2;
|
|
|
CONSTANT TWO_POWER_RANDOM_VECTOR_SIZE : real := (2**RANDOM_VECTOR_SIZE)*1.0;
|
|
|
SIGNAL random_vector : STD_LOGIC_VECTOR(RANDOM_VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
SIGNAL error_value : STD_LOGIC;
|
|
|
SIGNAL warning_value : STD_LOGIC;
|
|
|
SIGNAL warning_value_clocked : STD_LOGIC;
|
|
|
|
|
|
CONSTANT READ_DATA_ALL_X : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0) := (OTHERS => 'X');
|
|
|
CONSTANT READ_DATA_ALL_U : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0) := (OTHERS => 'U');
|
|
|
CONSTANT READ_DATA_ALL_0 : STD_LOGIC_VECTOR(DATA_SIZE-1 DOWNTO 0) := (OTHERS => '0');
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN -- beh
|
|
|
|
|
|
clk <= NOT clk AFTER 10 ns;
|
|
|
rstn <= '1' AFTER 30 ns;
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
CEL: RAM_CEL
|
|
|
GENERIC MAP (
|
|
|
DataSz => DATA_SIZE,
|
|
|
abits => ADDR_BIT_NUMBER)
|
|
|
PORT MAP (
|
|
|
WD => write_data,
|
|
|
RD => read_data_cel,
|
|
|
WEN => write_enable_n,
|
|
|
REN => read_enable_n,
|
|
|
WADDR => write_addr,
|
|
|
RADDR => read_addr,
|
|
|
|
|
|
RWCLK => clk,
|
|
|
RESET => rstn);
|
|
|
|
|
|
RAM : syncram_2p
|
|
|
GENERIC MAP(tech => 0, abits => ADDR_BIT_NUMBER, dbits => DATA_SIZE)
|
|
|
PORT MAP(rclk => clk, renable => read_enable, raddress => read_addr, dataout => read_data_ram,
|
|
|
wclk => clk, write => write_enable, waddress => write_addr, datain => write_data);
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
VARIABLE seed1, seed2 : POSITIVE;
|
|
|
VARIABLE rand1 : REAL;
|
|
|
VARIABLE RANDOM_VECTOR_VAR : STD_LOGIC_VECTOR(RANDOM_VECTOR_SIZE-1 DOWNTO 0);
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
random_vector <= (OTHERS => '0');
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
UNIFORM(seed1,seed2,rand1);
|
|
|
RANDOM_VECTOR_VAR := STD_LOGIC_VECTOR(
|
|
|
to_unsigned(INTEGER(TRUNC(rand1*TWO_POWER_RANDOM_VECTOR_SIZE)),
|
|
|
RANDOM_VECTOR_VAR'LENGTH)
|
|
|
);
|
|
|
|
|
|
random_vector <= RANDOM_VECTOR_VAR ;
|
|
|
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
write_data <= random_vector(DATA_SIZE-1 DOWNTO 0);
|
|
|
write_addr <= random_vector(DATA_SIZE+ADDR_BIT_NUMBER-1 DOWNTO DATA_SIZE);
|
|
|
read_addr <= random_vector(DATA_SIZE+ADDR_BIT_NUMBER+ADDR_BIT_NUMBER-1 DOWNTO DATA_SIZE+ADDR_BIT_NUMBER);
|
|
|
read_enable <= random_vector(RANDOM_VECTOR_SIZE-2);
|
|
|
write_enable <= random_vector(RANDOM_VECTOR_SIZE-1);
|
|
|
|
|
|
read_enable_n <= NOT read_enable;
|
|
|
write_enable_n <= NOT write_enable;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
warning_value <= '0' WHEN read_data_ram = read_data_cel ELSE
|
|
|
'1';
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
error_value <= '0';
|
|
|
warning_value_clocked <= '0';
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
IF read_data_ram = read_data_cel THEN
|
|
|
error_value <= '0';
|
|
|
warning_value_clocked <= '0';
|
|
|
ELSE
|
|
|
warning_value_clocked <= '1';
|
|
|
IF read_data_ram = READ_DATA_ALL_U AND read_data_cel = READ_DATA_ALL_0 THEN
|
|
|
error_value <= '0';
|
|
|
ELSE
|
|
|
error_value <= '1';
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
END beh;
|
|
|
|
|
|
|