|
|
|
|
|
LIBRARY ieee;
|
|
|
USE ieee.std_logic_1164.ALL;
|
|
|
USE IEEE.MATH_REAL.ALL;
|
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
|
|
LIBRARY lpp;
|
|
|
USE lpp.cic_pkg.ALL;
|
|
|
USE lpp.data_type_pkg.ALL;
|
|
|
USE lpp.chirp_pkg.ALL;
|
|
|
|
|
|
ENTITY testbench IS
|
|
|
|
|
|
END;
|
|
|
|
|
|
ARCHITECTURE behav OF testbench IS
|
|
|
|
|
|
SIGNAL clk : STD_LOGIC := '0';
|
|
|
SIGNAL clk_24k : STD_LOGIC := '0';
|
|
|
SIGNAL clk_24k_r : STD_LOGIC := '0';
|
|
|
SIGNAL rstn : STD_LOGIC;
|
|
|
SIGNAL run : STD_LOGIC;
|
|
|
SIGNAL data_in : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
|
SIGNAL data_in_v : sample_vector(5 DOWNTO 0,15 DOWNTO 0);
|
|
|
SIGNAL data_in_valid : STD_LOGIC;
|
|
|
-----------------------------------------------------------------------------
|
|
|
CONSTANT CARRY : STD_LOGIC := '1';
|
|
|
CONSTANT CARRY_NO : STD_LOGIC := '0';
|
|
|
CONSTANT ADD : STD_LOGIC := '0';
|
|
|
CONSTANT SUB : STD_LOGIC := '1';
|
|
|
SIGNAL OP : STD_LOGIC;
|
|
|
SIGNAL OP_0 : STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
|
SIGNAL OP_1 : STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
|
SIGNAL data_out_verif : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_out_verif_s : STD_LOGIC_VECTOR(32 DOWNTO 0);
|
|
|
SIGNAL data_in_A_reg : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_in_B_reg : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_in_A : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_in_B : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_out_s : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
|
SIGNAL data_out : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_out_pre : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_out_diff : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
SIGNAL data_out_Carry : STD_LOGIC;
|
|
|
|
|
|
SIGNAL COUNTER_A : INTEGER;
|
|
|
SIGNAL COUNTER_B : INTEGER;
|
|
|
CONSTANT COUNTER_MIN : INTEGER := INTEGER'LOW;
|
|
|
CONSTANT COUNTER_MAX : INTEGER := INTEGER'HIGH;
|
|
|
CONSTANT COUNTER_STEP : INTEGER := INTEGER'HIGH/100;
|
|
|
|
|
|
SIGNAL ALL_is_OK : STD_LOGIC;
|
|
|
BEGIN
|
|
|
|
|
|
clk <= NOT clk AFTER 5 ns;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
PROCESS
|
|
|
BEGIN -- PROCESS
|
|
|
WAIT UNTIL clk = '1';
|
|
|
rstn <= '0';
|
|
|
run <= '0';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
rstn <= '1';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
run <= '1';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
OP <= ADD;
|
|
|
WAIT FOR 500 us;
|
|
|
OP <= SUB;
|
|
|
WAIT FOR 500 us;
|
|
|
REPORT "*** END simulation ***" SEVERITY failure;
|
|
|
WAIT;
|
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
COUNTER_A <= COUNTER_MIN;
|
|
|
COUNTER_B <= COUNTER_MIN;
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
IF COUNTER_A < COUNTER_MAX - COUNTER_STEP THEN
|
|
|
COUNTER_A <= COUNTER_A + COUNTER_STEP;
|
|
|
ELSE
|
|
|
COUNTER_A <= COUNTER_MIN;
|
|
|
IF COUNTER_B < COUNTER_MAX - COUNTER_STEP THEN
|
|
|
COUNTER_B <= COUNTER_B + COUNTER_STEP;
|
|
|
ELSE
|
|
|
COUNTER_B <= COUNTER_MIN;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
data_in_A <= STD_LOGIC_VECTOR(to_signed(COUNTER_A,32));
|
|
|
data_in_B <= STD_LOGIC_VECTOR(to_signed(COUNTER_B,32));
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
OP_0 <= CARRY_NO & OP;
|
|
|
OP_1 <= CARRY & OP;
|
|
|
cic_lfr_add_sub_1: cic_lfr_add_sub
|
|
|
PORT MAP (
|
|
|
clk => clk,
|
|
|
rstn => rstn,
|
|
|
run => run,
|
|
|
OP => OP_0,
|
|
|
data_in_A => data_in_A(15 DOWNTO 0),
|
|
|
data_in_B => data_in_B(15 DOWNTO 0),
|
|
|
data_in_Carry => '0',
|
|
|
data_out => data_out_s,
|
|
|
data_out_Carry => data_out_Carry);
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
data_in_A_reg <= (OTHERS => '0');
|
|
|
data_in_B_reg <= (OTHERS => '0');
|
|
|
data_out(15 DOWNTO 0) <= (OTHERS => '0');
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
data_in_A_reg <= data_in_A;
|
|
|
data_in_B_reg <= data_in_B;
|
|
|
data_out(15 DOWNTO 0) <= data_out_s;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
cic_lfr_add_sub_2: cic_lfr_add_sub
|
|
|
PORT MAP (
|
|
|
clk => clk,
|
|
|
rstn => rstn,
|
|
|
run => run,
|
|
|
OP => OP_1,
|
|
|
data_in_A => data_in_A_reg(31 DOWNTO 16),
|
|
|
data_in_B => data_in_B_reg(31 DOWNTO 16),
|
|
|
data_in_Carry => data_out_Carry,
|
|
|
data_out => data_out(31 DOWNTO 16),
|
|
|
data_out_Carry => OPEN);
|
|
|
-----------------------------------------------------------------------------
|
|
|
data_out_verif_s <= STD_LOGIC_VECTOR(to_signed(to_integer(SIGNED(data_in_A_reg)) + to_integer(SIGNED(data_in_B_reg)),33)) WHEN OP = ADD ELSE
|
|
|
STD_LOGIC_VECTOR(to_signed(to_integer(SIGNED(data_in_A_reg)) - to_integer(SIGNED(data_in_B_reg)),33));
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
data_out_verif <= (OTHERS => '0');
|
|
|
ALL_is_OK <= '0';
|
|
|
data_out_pre <= (OTHERS => '0');
|
|
|
data_out_diff <= (OTHERS => '0');
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
data_out_verif <= data_out_verif_s(31 DOWNTO 0);
|
|
|
IF data_out_verif = data_out THEN
|
|
|
ALL_is_OK <= '1';
|
|
|
ELSE
|
|
|
ALL_is_OK <= '0';
|
|
|
END IF;
|
|
|
-------------------------------------------------------------------------
|
|
|
data_out_pre <= data_out;
|
|
|
IF OP = ADD THEN
|
|
|
data_out_diff <= STD_LOGIC_VECTOR(to_signed(to_integer(SIGNED(data_out)) - to_integer(SIGNED(data_out_pre) ),32));
|
|
|
ELSE
|
|
|
data_out_diff <= STD_LOGIC_VECTOR(to_signed(to_integer(SIGNED(data_out)) - to_integer(SIGNED(data_out_pre) ),32));
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
END;
|
|
|
|