OpenCores
URL https://opencores.org/ocsvn/funbase_ip_library/funbase_ip_library/trunk

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.accelerator/] [dctqidct/] [1.0/] [hdl/] [dctQidct/] [dctQidct_core_tester.vhd] - Rev 145

Compare with Previous | Blame | View Log

------------------------------------------------------------------------------
-- Author               : Timo Alho
-- e-mail               : timo.a.alho@tut.fi
-- Date                 : 07.07.2004 11:18:21
-- File                 : dctQidct_core_tester.vhd
-- Design               : VHDL Entity dctQidct_core_tester.beh
------------------------------------------------------------------------------
-- Description  : Tester for DCT+Quantizer+InverseQuantizer+IDCT
--
-- This tester reads test data from input file (dctQidct_test_input.txt and
-- dctQidct_quant_input.txt), and
-- feeds it to DUT. Data is fed "randomly" according to control file
-- (dctQidct_input_ctrl.txt) .
--
-- DUT outputs are collected to files (dctQidct_quant_output.txt and
-- dctQidct_idct_output.txt). Output control signal are controlled "randomly"
-- according to control files (dctQidct_output1_ctrl.txt and
-- dctQidct_output2_ctrl.txt).
-- 
------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
LIBRARY dct;
USE dct.DCT_pkg.all;
LIBRARY idct;
USE idct.IDCT_pkg.all;
LIBRARY quantizer;
USE quantizer.Quantizer_pkg.all;
LIBRARY common_da;
LIBRARY std;
USE std.TEXTIO.all;
 
ENTITY dctQidct_core_tester IS
   PORT( 
      data_idct_out         : IN     std_logic_vector (IDCT_resultw_co-1 DOWNTO 0);
      data_quant_out        : IN     std_logic_vector (QUANT_resultw_co-1 DOWNTO 0);
      dct_ready4column_out  : IN     std_logic;
      wr_IDCT_out           : IN     std_logic;
      wr_Q_out              : IN     std_logic;
      QP                    : OUT    std_logic_vector (4 DOWNTO 0);
      chroma                : OUT    std_logic;
      clk                   : OUT    std_logic;
      data_dct_in           : OUT    std_logic_vector (DCT_inputw_co-1 DOWNTO 0);
      idct_ready4column_in  : OUT    std_logic;
      intra                 : OUT    std_logic;
      loadQP                : OUT    std_logic;
      quant_ready4column_in : OUT    std_logic;
      rst_n                 : OUT    std_logic;
      wr_dct_in             : OUT    std_logic
   );
 
-- Declarations
 
END dctQidct_core_tester ;
 
--
ARCHITECTURE beh OF dctQidct_core_tester IS
  CONSTANT period : time := 50 ns;
  --internal clock signal
 
  SIGNAL test_clk   : std_logic := '0';
  --internal reset signal
  SIGNAL test_rst_n : std_logic := '0';
  SIGNAL counter    : integer   := 0;
 
  --registered signal for DUT data input
  SIGNAL data_dct_in_r           : std_logic_vector(DCT_inputw_co-1 DOWNTO 0);
  --registerd signal for DUT wr_in
  SIGNAL wr_dct_in_r             : std_logic;
  --registered signals for DUT ready4column inputs
  SIGNAL idct_ready4column_in_r  : std_logic := '1';
  SIGNAL quant_ready4column_in_r : std_logic := '1';
 
  SIGNAL input_counter   : integer := 0;
  SIGNAL element_counter : integer := 0;
  SIGNAL output1_counter : integer := 8;
  SIGNAL output2_counter : integer := 8;
 
  -- boolean value, required for initial reset
  SIGNAL system_reseted : std_logic := '0';
 
  SIGNAL InputFinished       : std_logic := '0';
  SIGNAL LastQuantOutCounter : integer   := 0;
  SIGNAL LastIdctOutCounter  : integer   := 0;
 
  SIGNAL QP_r : std_logic_vector(4 DOWNTO 0);
  SIGNAL intra_r : std_logic;
  SIGNAL chroma_r : std_logic;
  SIGNAL loadQP_r : std_logic;
 
BEGIN
 
  --generate clock signal
  Clock              : PROCESS
    VARIABLE clk_tmp : std_logic := '0';
  BEGIN
    WHILE (true) LOOP
      WAIT FOR PERIOD/2;
      clk_tmp                    := NOT (clk_tmp);
      test_clk <= clk_tmp;
    END LOOP;
  END PROCESS;
 
  --assign to DUT clk
  clk <= test_clk;
 
  --generate asynchronous reset
  reset : PROCESS (test_clk)
  BEGIN  -- PROCESS reset
 
    IF test_clk'event AND test_clk = '1' THEN  -- rising clock edge
      IF (system_reseted = '0') THEN
        --apply reset
        test_rst_n     <= '0';
        system_reseted <= '1';
      ELSE
        test_rst_n     <= '1';
      END IF;
    END IF;
  END PROCESS reset;
 
  --assign to DUT rst_n
  rst_n <= test_rst_n;
 
 
  --feed input data!
  datain                : PROCESS (test_clk, test_rst_n)
    FILE File_DataIn    : text;
    FILE File_QuantIn   : text;
    FILE File_ControlIn : text;
 
 
    VARIABLE files_open : integer := 0;
    --temporary variables
    VARIABLE integerin  : integer;
    VARIABLE linein     : line;
    VARIABLE temp_data  : signed(DCT_inputw_co-1 DOWNTO 0);
 
  BEGIN  -- PROCESS datain
    IF (test_rst_n = '0') THEN
      QP_r <= (OTHERS => '0');
      intra_r <= '0';
      chroma_r <= '0';
      --open files
      IF (files_open = 0) THEN
        File_open(File_DataIn, "testdata/dctQidct_data_input.txt", read_mode);
        File_open(File_QuantIn, "testdata/dctQidct_quant_input.txt", read_mode);
        File_open(File_ControlIn, "testdata/dctQidct_input_ctrl.txt", read_mode);
        files_open := 1;
      END IF;
 
    ELSIF (test_clk = '1' AND test_clk'event) THEN
      wr_dct_in_r <= '0';
 
      --if end of control -file is reached, re-read it.
      IF (endfile(File_ControlIn)) THEN
        File_close(File_ControlIn);
        File_open(File_ControlIn, "testdata/dctQidct_input_ctrl.txt", read_mode);
      END IF;
 
      --if end of input -file is reached, test is stopped
      IF (endfile(File_DataIn)) THEN
        InputFinished <= '1';
      END IF;
 
      loadQP_r <= '0';                  --default assingment
      QP_r <= (OTHERS => '0');
      intra_r <= '0';
      chroma_r <= '0';
 
      IF (element_counter = 64) THEN
        --entire block has been sent. Send block information.
 
          IF (NOT endfile(File_QuantIn)) THEN
            READLINE(File_QuantIn, linein);
 
            READ(linein, integerin);    --read QP
            QP_r   <= conv_std_logic_vector(integerin, 5);
 
            READ(linein, integerin);    --read intra
            IF (integerin = 1) THEN
              intra_r <= '1';
            ELSE
              intra_r <= '0';
            END IF;
 
            READ(linein, integerin);    --read chroma
            IF (integerin = 1) THEN
              chroma_r <= '1';
            ELSE
              chroma_r <= '0';
            END IF;
          END IF;
 
          loadQP_r     <= '1';          
          element_counter <= 0;
 
      ELSIF (input_counter /= 0) THEN
        --row/column transmission is not complete. Send new data if it is available.
 
        --read "random" '0' or '1' from control file
        READLINE(File_ControlIn, linein);
        READ(linein, integerin);
        IF (integerin = 1) THEN
          --new data available, send data value
          IF (NOT ENDFILE(File_DataIn)) THEN
            READLINE(File_DataIn, linein);
            READ(linein, integerin);    --read data value
            data_dct_in_r   <= conv_std_logic_vector(integerin, DCT_inputw_co);
            wr_dct_in_r     <= '1';
            input_counter   <= input_counter - 1;
            element_counter <= element_counter + 1;
          END IF;
        END IF;
 
      ELSIF (dct_ready4column_out = '1') THEN
        --DUT is ready to receive new column/row
        input_counter <= 8;
      ELSE
        --do nothing
      END IF;
    END IF;
  END PROCESS datain;
 
  --assign registers to DUT input
  wr_dct_in   <= wr_dct_in_r;
  data_dct_in <= data_dct_in_r;
 
  QP <= QP_r;
  intra <= intra_r;
  chroma <= chroma_r;
  loadQP <= loadQP_r;
 
 
  dataout : PROCESS (test_clk, test_rst_n)
    --quantized output values from DUT -> file
 
    FILE File_QuantOut : text;
    FILE File_IdctOut  : text;
    FILE Fileout1_ctrl : text;
    FILE Fileout2_ctrl : text;
 
    VARIABLE files_open : integer := 0;
    --temporary variables
    VARIABLE integerout : integer;
    VARIABLE LineOut    : line;
 
    VARIABLE integerin : integer;
    VARIABLE linein    : line;
 
  BEGIN  -- PROCESS dataout
 
    IF (test_rst_n = '0') THEN
      --open files
      IF (files_open = 0) THEN
        File_open(File_QuantOut, "testdata/dctQidct_quantized_test_output.txt", write_mode);
        File_open(File_IdctOut, "testdata/dctQidct_idct_test_output.txt", write_mode);
 
        File_open(Fileout1_ctrl, "testdata/dctQidct_output1_ctrl.txt", read_mode);
        File_open(Fileout2_ctrl, "testdata/dctQidct_output2_ctrl.txt", read_mode);
        files_open := 1;
      END IF;
 
    ELSIF (test_clk = '1' AND test_clk'event) THEN
 
 
      --if end of control -file is reached, re-read it.
      IF (endfile(fileout1_ctrl)) THEN
        File_close(fileout1_ctrl);
        File_open(fileout1_ctrl, "testdata/dctQidct_output1_ctrl.txt", read_mode);
      END IF;
 
      --if end of control -file is reached, re-read it.
      IF (endfile(fileout2_ctrl)) THEN
        File_close(fileout2_ctrl);
        File_open(fileout2_ctrl, "testdata/dctQidct_output2_ctrl.txt", read_mode);
      END IF;
 
      ASSERT (NOT (LastIdctOutCounter = 64))
        REPORT "TEST FINISHED : Analyze output data with matlab-script 'dctQidct_analyze_vectors'"
        SEVERITY failure;
 
      IF (wr_Q_out = '1') THEN
        --there is valid data on quantizer output!
        IF (output1_counter /= 0) THEN
          --write it to file, if we are capable of receiving it!
          integerout := conv_integer(signed(data_quant_out));
          WRITE(LineOut, integerout, left, 6);
          WRITELINE(File_QuantOut, lineout);
          output1_counter         <= output1_counter - 1;
          quant_ready4column_in_r <= '0';
 
          --if last block
          IF (InputFinished = '1') THEN
            LastQuantOutCounter <= LastQuantOutCounter + 1;
          END IF;
        END IF;
      END IF;
 
      IF (output1_counter = 0) THEN
        --column/row is received. Check if we are ready to receive another one.
 
        --read random '1' or '0' from input file
        READLINE(fileout1_ctrl, linein);
        READ(linein, integerin);
        IF (integerin = 1) THEN
          quant_ready4column_in_r <= '1';
          output1_counter         <= 8;
        END IF;
      END IF;
 
      IF (wr_IDCT_out = '1') THEN
        --there is valid data on IDCT output
        IF (output2_counter /= 0) THEN
          --write it to file, if we are capable of receiving it!
          integerout := conv_integer(signed(data_idct_out));
          WRITE(LineOut, integerout, left, 6);
          WRITELINE(File_IdctOut, lineout);
          output2_counter        <= output2_counter - 1;
          idct_ready4column_in_r <= '0';
 
          --last block
          IF (LastQuantOutCounter = 64) THEN
            LastIdctOutCounter <= LastIdctOutCounter + 1;
          END IF;
        END IF;
      END IF;
 
      IF (output2_counter = 0) THEN
        --column/row is received. Check if we are ready to receive another one.
 
        --read random '1' or '0' from input file
        READLINE(fileout2_ctrl, linein);
        READ(linein, integerin);
        IF (integerin = 1) THEN
          idct_ready4column_in_r <= '1';
          output2_counter        <= 8;
        END IF;
 
      END IF;
 
    END IF;
  END PROCESS dataout;
 
 
 
  idct_ready4column_in  <= idct_ready4column_in_r;
  quant_ready4column_in <= quant_ready4column_in_r;
 
END beh;
 
 
 
 
 
 
 
 
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.