|
|
LIBRARY ieee;
|
|
|
USE ieee.std_logic_1164.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 rstn : STD_LOGIC;
|
|
|
|
|
|
CONSTANT VECTOR_SIZE : INTEGER := 4*2;
|
|
|
SIGNAL VECTOR_1 : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL VECTOR_MIN : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL VECTOR_MAX : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
SIGNAL all_done : STD_LOGIC;
|
|
|
SIGNAL all_ok : STD_LOGIC;
|
|
|
SIGNAL all_ok_E : STD_LOGIC;
|
|
|
|
|
|
SIGNAL A : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL B : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
SIGNAL C : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
SIGNAL D_0 : STD_LOGIC_VECTOR(VECTOR_SIZE/2 DOWNTO 0);
|
|
|
SIGNAL D_1 : STD_LOGIC_VECTOR(VECTOR_SIZE/2-1 DOWNTO 0);
|
|
|
SIGNAL D : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
SIGNAL E : STD_LOGIC_VECTOR(VECTOR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
VECTOR_1(0) <= '1';
|
|
|
VECTOR_1(VECTOR_SIZE-1 DOWNTO 1) <= (OTHERS => '0') ;
|
|
|
|
|
|
VECTOR_MIN(VECTOR_SIZE-1) <= '1';
|
|
|
VECTOR_MIN(VECTOR_SIZE-2 DOWNTO 0) <= (OTHERS => '0') ;
|
|
|
VECTOR_MAX(VECTOR_SIZE-1) <= '0';
|
|
|
VECTOR_MAX(VECTOR_SIZE-2 DOWNTO 0) <= (OTHERS => '1') ;
|
|
|
|
|
|
clk <= NOT clk AFTER 5 ns;
|
|
|
|
|
|
PROCESSD_0(VECTOR_SIZE/2)
|
|
|
BEGIN -- PROCESS
|
|
|
WAIT UNTIL clk = '1';
|
|
|
rstn <= '0';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
rstn <= '1';
|
|
|
WAIT UNTIL clk = '1';
|
|
|
|
|
|
|
|
|
WAIT FOR 2 ms;
|
|
|
REPORT "*** END simulation ***" SEVERITY failure;
|
|
|
WAIT;
|
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
A <= VECTOR_MIN;
|
|
|
B <= VECTOR_MIN;
|
|
|
all_done <= '0';
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
all_done <= '0';
|
|
|
IF A = VECTOR_MAX THEN
|
|
|
A <= VECTOR_MIN;
|
|
|
IF B = VECTOR_MAX THEN
|
|
|
B <= VECTOR_MIN;
|
|
|
all_done <= '1';
|
|
|
ELSE
|
|
|
B <= STD_LOGIC_VECTOR(signed(B) + signed(VECTOR_1));
|
|
|
END IF;
|
|
|
ELSE
|
|
|
A <= STD_LOGIC_VECTOR(signed(A) + signed(VECTOR_1));
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
|
|
|
C <= STD_LOGIC_VECTOR(SIGNED(A) - SIGNED(B));
|
|
|
|
|
|
E <= STD_LOGIC_VECTOR(UNSIGNED(A) - UNSIGNED(B));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D_0 <= STD_LOGIC_VECTOR(SIGNED('0'&A(VECTOR_SIZE/2-1 DOWNTO 0)) - SIGNED('0' & B(VECTOR_SIZE/2-1 DOWNTO 0)));
|
|
|
|
|
|
D_1 <= STD_LOGIC_VECTOR( SIGNED(A(VECTOR_SIZE-1 DOWNTO VECTOR_SIZE/2))
|
|
|
- SIGNED(B(VECTOR_SIZE-1 DOWNTO VECTOR_SIZE/2))
|
|
|
- SIGNED(VECTOR_1(VECTOR_SIZE/2-1 DOWNTO 1) & D_0(VECTOR_SIZE/2) ));
|
|
|
|
|
|
D <= D_1(VECTOR_SIZE/2-1 DOWNTO 0) & D_0(VECTOR_SIZE/2-1 DOWNTO 0);
|
|
|
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
all_ok <= '1';
|
|
|
all_ok_E <= '1';
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
IF D = C THEN
|
|
|
all_ok <= '1';
|
|
|
ELSE
|
|
|
all_ok <= '0';
|
|
|
END IF;
|
|
|
|
|
|
IF E = C THEN
|
|
|
all_ok_E <= '1';
|
|
|
ELSE
|
|
|
all_ok_E <= '0';
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
END;
|
|
|
|
|
|
|