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/] [dct/] [DCT_core_tester.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
------------------------------------------------------------------------------
2
-- Author               : Timo Alho
3
-- e-mail               : timo.a.alho@tut.fi
4
-- Date                 : 23.06.2004 16:14:32
5
-- File                 : DCT_core_tester.vhd
6
-- Design               : VHDL Entity DCT_core_tester.beh
7
------------------------------------------------------------------------------
8
-- Description  :
9
------------------------------------------------------------------------------
10
-- Version history:
11
-- 1.0 initial version
12
-- 1.1 Quantizer parameter is no longer passed through DCT
13
------------------------------------------------------------------------------
14
LIBRARY ieee;
15
USE ieee.std_logic_1164.ALL;
16
USE ieee.std_logic_arith.ALL;
17
LIBRARY dct;
18
USE dct.DCT_pkg.ALL;
19
LIBRARY STD;
20
USE STD.TEXTIO.ALL;
21
USE IEEE.STD_LOGIC_TEXTIO.ALL;
22
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
23
 
24
ENTITY DCT_core_tester IS
25
  PORT(
26
    DC               : IN  std_logic;
27
    data_out         : IN  std_logic_vector (DCT_resultw_co-1 DOWNTO 0);
28
    ready_for_rx     : IN  std_logic;
29
    wr_out           : IN  std_logic;
30
    clk              : OUT std_logic;
31
    data_in          : OUT std_logic_vector (DCT_inputw_co-1 DOWNTO 0);
32
    next_block_ready : OUT std_logic;
33
    rst_n            : OUT std_logic;
34
    wr_new_data      : OUT std_logic
35
    );
36
 
37
-- Declarations
38
 
39
END DCT_core_tester;
40
 
41
--
42
ARCHITECTURE beh OF DCT_core_tester IS
43
  CONSTANT period : time := 50 ns;
44
 
45
  SIGNAL test_clk   : std_logic := '0';
46
  SIGNAL test_rst_n : std_logic := '0';
47
  SIGNAL counter    : integer   := 0;
48
 
49
  SIGNAL input_counter  : integer := 0;
50
  SIGNAL output_counter : integer := 8;
51
 
52
  SIGNAL wr_new_data_r      : std_logic;
53
  SIGNAL next_block_ready_r : std_logic := '1';
54
  SIGNAL data_in_r          : std_logic_vector (DCT_inputw_co-1 DOWNTO 0);
55
 
56
 
57
  SIGNAL InputFinished     : std_logic := '0';
58
  SIGNAL LastOutputCounter : integer   := 0;
59
BEGIN
60
 
61
  --generate clock signal
62
  Clock : PROCESS
63
 
64
    VARIABLE clk_tmp : std_logic := '0';
65
  BEGIN
66
    WHILE (true) LOOP
67
      WAIT FOR PERIOD/2;
68
      clk_tmp                    := NOT (clk_tmp);
69
      test_clk <= clk_tmp;
70
    END LOOP;
71
  END PROCESS;
72
 
73
  --generate reset signal
74
  reset                     : PROCESS (test_clk)
75
    VARIABLE system_reseted : std_logic := '0';
76
  BEGIN  -- PROCESS reset
77
    IF test_clk'event AND test_clk = '1' THEN  -- rising clock edge
78
      IF (system_reseted = '0') THEN
79
        test_rst_n <= '0';
80
        system_reseted                  := '1';
81
      ELSE
82
        test_rst_n <= '1';
83
      END IF;
84
    END IF;
85
  END PROCESS reset;
86
 
87
  --feed input data!
88
  datain             : PROCESS (test_clk)
89
    FILE FileIn      : text;
90
    FILE FileIn_ctrl : text;
91
 
92
    VARIABLE files_open : std_logic := '0';
93
    -- Väliaikaismuutuja, johon luetaan kokonaisluku luetusta rivistä
94
    VARIABLE integerin  : integer;
95
 
96
    -- Välimuuttuja, johon luetaan tekstirivi tiedostosta
97
    VARIABLE linein : line;
98
 
99
    --temporary index variable
100
    VARIABLE temp_data : signed(DCT_inputw_co-1 DOWNTO 0);
101
 
102
  BEGIN  -- PROCESS datain
103
    IF (test_rst_n = '0') THEN
104
      --open files
105
      IF (files_open = '0') THEN
106
        File_open(Filein, "testdata/dct_test_input.txt", read_mode);
107
        File_open(FileIn_ctrl, "testdata/dct_input_ctrl.txt", read_mode);
108
        files_open := '1';
109
      END IF;
110
 
111
      -- execute the testing cycle in every test_clk cycle
112
    ELSIF (test_clk = '1' AND test_clk'event) THEN
113
      wr_new_data_r <= '0';
114
 
115
      IF (endfile(filein_ctrl)) THEN
116
        --if control file EOF is reached, reopen file.
117
        File_close(filein_ctrl);
118
        File_open(filein_ctrl, "testdata/dct_input_ctrl.txt", read_mode);
119
      END IF;
120
 
121
      IF (endfile(FileIn)) THEN
122
        --finished reading input data
123
        InputFinished <= '1';
124
      END IF;
125
 
126
      IF (input_counter /= 0) THEN
127
        --DCT can receive some data!
128
        READLINE(filein_ctrl, linein);
129
        READ(linein, integerin);
130
        IF (integerin = 1) THEN
131
          --new data is available
132
          IF (NOT ENDFILE(filein)) THEN
133
            READLINE(filein, linein);
134
            READ(linein, integerin);
135
            temp_data := conv_signed(integerin, DCT_inputw_co);
136
            data_in_r     <= conv_std_logic_vector(temp_data, DCT_inputw_co);
137
            wr_new_data_r <= '1';
138
            input_counter <= input_counter-1;
139
          END IF;
140
        ELSE
141
          --no new data available
142
          wr_new_data_r   <= '0';
143
          input_counter   <= input_counter;
144
        END IF;
145
 
146
      ELSIF (ready_for_rx = '1') THEN
147
        --DCT can receive entire column
148
        input_counter <= 8;
149
      END IF;
150
    END IF;
151
  END PROCESS datain;
152
 
153
  dataout              : PROCESS (test_clk)
154
    FILE FileOut       : text;
155
    FILE FileReference : text;
156
    FILE FileOut_ctrl  : text;
157
 
158
    VARIABLE files_open : std_logic := '0';
159
 
160
    VARIABLE tmp       : integer;
161
    VARIABLE lineout   : line;
162
    VARIABLE tmp2      : signed(DCT_resultw_co-1 DOWNTO 0);
163
    VARIABLE integerin : integer;
164
 
165
    VARIABLE linein : line;
166
 
167
  BEGIN  -- PROCESS dataout
168
    IF (test_rst_n = '0') THEN
169
      IF (files_open = '0') THEN
170
        files_open := '1';
171
        File_open(FileOut, "testdata/dct_test_output.txt", write_mode);
172
        File_open(FileReference, "testdata/dct_reference_output.txt", read_mode);
173
        File_open(FileOut_ctrl, "testdata/dct_output_ctrl.txt", read_mode);
174
      END IF;
175
 
176
 
177
    ELSIF (test_clk = '1' AND test_clk'event) THEN
178
 
179
      --reopen ctrl file if EOF reached
180
      IF (endfile(fileout_ctrl)) THEN
181
        File_close(fileout_ctrl);
182
        File_open(fileout_ctrl, "testdata/dct_output_ctrl.txt", read_mode);
183
      END IF;
184
 
185
      --check whether test is finished
186
      ASSERT (NOT (LastOutputCounter = 64))
187
        REPORT "TEST PASSED : Peak error is no more than 1. Run matlab-script 'dct_analyze_vectors' if you want more accurate analysis."
188
        SEVERITY failure;
189
 
190
      IF (wr_out = '1') THEN
191
        --DCT is writing data out. Lets chech if we can receive it
192
        IF (output_counter /= 0) THEN
193
          --write output data to file
194
          tmp2 := signed(data_out);
195
          tmp  := conv_integer(tmp2);
196
          WRITE(LineOut, tmp, left, 6);
197
          WRITELINE(FileOut, lineout);
198
 
199
          --compare output data with reference data
200
          readline(FileReference, linein);
201
          read(linein, integerin);
202
          ASSERT (ABS(tmp-integerin) < 2)
203
            REPORT "TEST FAILED : Peak error is more than 1"
204
            SEVERITY failure;
205
 
206
          --if this is last block
207
          IF (InputFinished = '1') THEN
208
            LastOutputCounter <= LastOutputCounter + 1;
209
          END IF;
210
 
211
        END IF;
212
 
213
        READLINE(fileout_ctrl, linein);
214
        READ(linein, integerin);
215
        IF (integerin = 1) THEN
216
          --we can still receive entire column
217
          next_block_ready_r <= '1';
218
          output_counter     <= 8;
219
        ELSE
220
          --we can no longer receive entire column
221
          IF (output_counter > 0) THEN
222
            output_counter   <= output_counter - 1;
223
          END IF;
224
          next_block_ready_r <= '0';
225
        END IF;
226
 
227
      ELSIF (next_block_ready_r = '0') THEN
228
        --check if new data can be received
229
        READLINE(fileout_ctrl, linein);
230
        READ(linein, integerin);
231
        IF (integerin = 1) THEN
232
          --new data can be received (during next clk)
233
          next_block_ready_r <= '1';
234
          output_counter     <= 8;
235
        ELSE
236
          next_block_ready_r <= '0';
237
        END IF;
238
      END IF;
239
    END IF;
240
 
241
  END PROCESS dataout;
242
 
243
  next_block_ready <= next_block_ready_r;
244
  rst_n            <= test_rst_n;
245
  clk              <= test_clk;
246
  wr_new_data      <= wr_new_data_r;
247
  data_in          <= data_in_r;
248
 
249
 
250
END beh;
251
 
252
 
253
 
254
 

powered by: WebSVN 2.1.0

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