##// END OF EJS Templates
Correction de la FSM qui regule les données entrant dans la FFT
Correction de la FSM qui regule les données entrant dans la FFT

File last commit:

r543:cacd7252f42c JC
r557:7faec0eb9fbb (MINI-LFR) WFP_MS-0-1-67 (LFR-EM) WFP_MS_1-1-67 JC
Show More
tb_cic_lfr_add_sub.vhd
173 lines | 5.6 KiB | text/x-vhdl | VhdlLexer
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;