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

Subversion Repositories cascaded_fir_filter

[/] [cascaded_fir_filter/] [trunk/] [FIR_cascaded_tb.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Juzujka
`timescale 1 ns/ 1 ns
2
module FIR_cascaded_tb
3
#(
4
        // uncomment selected test
5
        //`define test_saw              // test with I -4, -3, ..., 4, 5 ; and Q 1, 2, ..., 9, 10, 10 complex samples of ping total
6
        //`define test_tone             // tone pulse
7
        //`define test_rect             // rectangle pulse
8
        //`define test_delta    // test with delta-function
9
        //`define test_chirp    // test with chirp. It is long test, pulse response length is 2048
10
        `define test_chirp_short
11
 
12
        `ifdef test_saw
13
        //Test short signal
14
        parameter       INP_SAMP_WIDTH = 14,                            // imput samples width
15
        parameter       PING_ADDR_WIDTH = 4,                            // address width of pulse response characteristic samples
16
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 3,          //address width of block
17
        parameter       FRAME_ADDR_WIDTH = 14,                          // address width of counter of samples in frame
18
        parameter       OUT_SAMP_WIDTH = 18,                            // output samples width
19
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 12,           // inp_samp counter width, it counts clk 
20
        parameter       CLK_TO_SAMP_RATIO = 25,                         // clk -> inp_clk divider
21
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,      // address in frame counter
22
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,           // number of frame counter
23
        parameter       PARAM_INP_PING_LENGTH = 10,                     // ping length
24
        parameter       FRAME_PERIOD = 100,                                     // frame period
25
        parameter       OUT_SAMP_A_SQ_WIDTH = 16,                       // |output|^2 word width
26
        parameter       OUT_SAMP_A_SQ_OFFS = 4,                         // offset of |output|^2 word, OUT_SAMP_A_SQ_WIDTH bits from OUT_SAMP_A_SQ_OFFS writes to output
27
        parameter       INP_FILE = "inp_signal_saw_s_IQ.txt",   // input signal samples file
28
        parameter       PING_FILE = "ping_signal_saw_s_IQ.txt", // ping samples file
29
        parameter       SIM_DURATION = 100000                                   // simulation duration after reset duration
30
        // input file example with -4,-3... in I and 1, 2, 3 in Q:
31
        // fffc
32
        // 0001
33
        // fffd
34
        // 0002
35
        // fffe
36
        // 0003
37
        `endif
38
 
39
        `ifdef test_tone
40
        parameter       INP_SAMP_WIDTH = 14,                            // imput samples width
41
        parameter       PING_ADDR_WIDTH = 7,                            // address width of pulse response characteristic samples
42
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 3,          //address width of block
43
        parameter       FRAME_ADDR_WIDTH = 14,                          // address width of counter of samples in frame
44
        parameter       OUT_SAMP_WIDTH = 18,                            // output samples width
45
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 12,           // inp_samp counter width, it counts clk 
46
        parameter       CLK_TO_SAMP_RATIO = 100,                        // clk -> inp_clk divider
47
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,      // address in frame counter
48
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,           // number of frame counter
49
        parameter       PARAM_INP_PING_LENGTH = 100,            // ping length
50
        parameter       FRAME_PERIOD = 2500,                            // frame period
51
        parameter       OUT_SAMP_A_SQ_WIDTH = 16,                       // |output|^2 word width
52
        parameter       OUT_SAMP_A_SQ_OFFS = 16,                                // offset of |output|^2 word, OUT_SAMP_A_SQ_WIDTH bits from OUT_SAMP_A_SQ_OFFS writes to output
53
        parameter       INP_FILE = "IQ_tone_signal.txt",        // input signal samples file
54
        parameter       PING_FILE = "IQ_tone_ping.txt",         // ping samples file
55
        parameter       SIM_DURATION = 5000000                                  // simulation duration after reset duration
56
        `endif
57
 
58
        `ifdef test_rect
59
        //Test short signal
60
        parameter       INP_SAMP_WIDTH = 14,                            // imput samples width
61
        parameter       PING_ADDR_WIDTH = 7,                            // address width of pulse response characteristic samples
62
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 3,          //address width of block
63
        parameter       FRAME_ADDR_WIDTH = 14,                          // address width of counter of samples in frame
64
        parameter       OUT_SAMP_WIDTH = 18,                            // output samples width
65
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 12,           // inp_samp counter width, it counts clk 
66
        parameter       CLK_TO_SAMP_RATIO = 100,                        // clk -> inp_clk divider
67
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,      // address in frame counter
68
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,           // number of frame counter
69
        parameter       PARAM_INP_PING_LENGTH = 100,            // ping length
70
        parameter       FRAME_PERIOD = 2500,                            // frame period
71
        parameter       OUT_SAMP_A_SQ_WIDTH = 16,                       // |output|^2 word width
72
        parameter       OUT_SAMP_A_SQ_OFFS = 4,                         // offset of |output|^2 word, OUT_SAMP_A_SQ_WIDTH bits from OUT_SAMP_A_SQ_OFFS writes to output
73
        parameter       INP_FILE = "IQ_rect_signal.txt",        // input signal samples file
74
        parameter       PING_FILE = "IQ_rect_ping.txt",         // ping samples file
75
        parameter       SIM_DURATION = 4000000                                  // simulation duration after reset duration
76
        `endif
77
 
78
        `ifdef test_delta
79
        //Test delta function
80
        parameter       INP_SAMP_WIDTH = 14,
81
        parameter       PING_ADDR_WIDTH = 4,
82
        parameter       FRAME_ADDR_WIDTH = 14,
83
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 3,
84
        parameter       OUT_SAMP_WIDTH = 18,
85
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 12,
86
        parameter       CLK_TO_SAMP_RATIO = 25,
87
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,
88
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,
89
        parameter       PARAM_INP_PING_LENGTH = 1,
90
        parameter       FRAME_PERIOD = 50,
91
        parameter       OUT_SAMP_A_SQ_WIDTH = 16,
92
        parameter       OUT_SAMP_A_SQ_OFFS = 4,
93
        parameter       INP_FILE = "inp_signal_delta_IQ.txt",
94
        parameter       PING_FILE = "ping_delta_IQ.txt",
95
        parameter       SIM_DURATION = 1000000                                  // simulation duration after reset duration
96
        `endif
97
        /*
98
        `ifdef test_chirp_short
99
        parameter       INP_SAMP_WIDTH = 14,    // разрядность входных отсчётов
100
        parameter       PING_ADDR_WIDTH = 6,    // разрядность длительности зондирующего импульса, длительность в отсчётах
101
        parameter       FRAME_ADDR_WIDTH = 18,  // разрядность длительности дальности, длительность в отсчётах
102
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 3,  //разрядность шины адреса ячейки вычисления свёртки
103
        parameter       OUT_SAMP_WIDTH = 28,    // разрядность выходных отсчётов
104
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 12,   // разрядность счётчика inp_samp в тактах clk
105
        parameter       CLK_TO_SAMP_RATIO = 100,                // коэффициент деления clk -> inp_clk
106
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,              // разрядность счётчика отсчётов для симуляции
107
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,           // разрядность счётчика отсчётов для симуляции
108
        parameter       PARAM_INP_PING_LENGTH = 10,             // длина зондирующего импульса, в отсчётах
109
        parameter       FRAME_PERIOD = 8000,                                    // период фреймов, в отсчётах
110
        parameter       OUT_SAMP_A_SQ_WIDTH = 16,                               // разрядность суммы квадратов выходных отсчётов
111
        parameter       OUT_SAMP_A_SQ_OFFS = 4,                         // смещение разрядов суммы квадратов выходных отсчётов
112
        //parameter     INP_FILE = "inp_signal_saw_s_IQ.txt"
113
        //parameter     PING_FILE = "ping_signal_saw_s_IQ.txt"
114
        parameter       INP_FILE = "inp_signal_chirp_2.txt",
115
        parameter       PING_FILE = "ping_chirp.txt"
116
        `endif
117
        */
118
        `ifdef test_chirp_short
119
        parameter       INP_SAMP_WIDTH = 14,
120
        parameter       PING_ADDR_WIDTH = 9,
121
        parameter       FRAME_ADDR_WIDTH = 18,
122
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 6,
123
        parameter       OUT_SAMP_WIDTH = 18,
124
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 11,
125
        parameter       CLK_TO_SAMP_RATIO = 500,
126
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,
127
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,
128
        parameter       PARAM_INP_PING_LENGTH = 50,
129
        parameter       FRAME_PERIOD = 8000,
130
        parameter       OUT_SAMP_A_SQ_WIDTH = 20,
131
        parameter       OUT_SAMP_A_SQ_OFFS = 18,
132
        parameter       INP_FILE = "inp_signal_chirp_2.txt",
133
        parameter       PING_FILE = "ping_chirp.txt",
134
        parameter       SIM_DURATION = 8000000                                  // simulation duration after reset duration
135
        `endif
136
        `ifdef test_chirp
137
        parameter       INP_SAMP_WIDTH = 14,
138
        parameter       PING_ADDR_WIDTH = 11,
139
        parameter       FRAME_ADDR_WIDTH = 18,
140
        parameter       CONV_MEM_BLOCK_ADDR_WIDTH = 10,
141
        parameter       OUT_SAMP_WIDTH = 18,
142
        parameter       CLK_TO_SAMP_ADDR_WIDTH  = 11,
143
        parameter       CLK_TO_SAMP_RATIO = 2000,
144
        parameter       SIM_FRAME_ADDR_COUNTER_WIDTH = 18,
145
        parameter       SIM_FRAME_COUNTER_WIDTH = 18,
146
        parameter       PARAM_INP_PING_LENGTH = 50,
147
        parameter       FRAME_PERIOD = 8000,
148
        parameter       OUT_SAMP_A_SQ_WIDTH = 20,
149
        parameter       OUT_SAMP_A_SQ_OFFS = 16,
150
        parameter       INP_FILE = "inp_signal_chirp_2.txt",
151
        parameter       PING_FILE = "ping_chirp.txt",
152
        parameter       SIM_DURATION = 24000000                                 // simulation duration after reset duration
153
        `endif
154
);
155
        reg     clk;                                                                            // тактовая частота
156
        reg     reset;                                                                          // сброс
157
        reg     inp_clk;                                                                        // стробы отсчётов
158
        wire    [3:0] count;
159
        reg                                                                     inp_ping_start;         // начало зондирующего импулься
160
        reg                     [INP_SAMP_WIDTH - 1:0]   inp_samp_I;                     // входные отсчёты
161
        reg                     [INP_SAMP_WIDTH - 1:0]   inp_samp_Q;                     // входные отсчёты
162
        reg                     [PING_ADDR_WIDTH - 1:0] inp_ping_length; // длительность зондирующего импульса, во входных отсчётах
163
        // parallel interface to coefficients RAM
164
        reg                                                                     IOB_ping_from_Rx;       // 1 - получать ЗИ из входных отсчётов, 0 - не получать ЗИ из входных отсчётов, подразумевается запись напрямую в RAM
165
        reg                                                             IOB_ping_RAM_CS;        // RAM зондирующего импульса, выбор RAM, должен быть 1, чтобы RAM не заполнялась входными отсчётами ЗИ
166
        wire signed     [INP_SAMP_WIDTH - 1:0]   IOB_ping_RAM_D;         // RAM зондирующего импульса, data Re
167
        reg signed      [INP_SAMP_WIDTH - 1:0]   IOB_ping_RAM_D_reg;     // RAM зондирующего импульса, data Re
168
        //reg   signed  [INP_SAMP_WIDTH - 1:0]  IOB_ping_RAM_D_I;               // RAM зондирующего импульса, data Re
169
        //reg   signed  [INP_SAMP_WIDTH - 1:0]  IOB_ping_RAM_D_Q;               // RAM зондирующего импульса, data Im
170
        reg signed      [PING_ADDR_WIDTH - 1:0]  IOB_ping_RAM_A;         // RAM зондирующего импульса, address
171
        reg                                                                     IOB_ping_RAM_IQ;        // RAM зондирующего импульса, write enable
172
        reg                                                                     IOB_ping_RAM_WR;        // RAM зондирующего импульса, write enable
173
        reg                                                                     IOB_ping_RAM_RD;        // RAM зондирующего импульса, write enable
174
        wire            [OUT_SAMP_WIDTH - 1:0]   out_samp_I;                     // выходные отсчёты, результат обработки
175
        wire            [OUT_SAMP_WIDTH - 1:0]   out_samp_Q;                     // выходные отсчёты, результат обработки
176
        wire signed     [OUT_SAMP_A_SQ_WIDTH - 1:0]      out_samp_A_sq;  // сумма квадратов выходных отсчётов, для отладки
177
        wire                                                            out_samp_strobe;        // стробы выходных отсчётов
178
        wire                                                            out_frame_strobe;       // стробы периода зондирования
179
        //reg   [INP_SAMP_WIDTH - 1:0]  inp_signal_file [0:32767];
180
        reg     [15:0]   inp_signal_file [0:8191];                                        // хранение входного сигнала
181
        reg     [15:0]   ping_file       [0:4095];                                                // хранение ЗИ
182
 
183
        reg     [CLK_TO_SAMP_ADDR_WIDTH - 1:0]                   clk_to_samp_counter;    // счётчик номера отсчёта в периоде зондирования
184
        reg     [SIM_FRAME_ADDR_COUNTER_WIDTH - 1:0]     frame_addr_counter;             // счётчик адреса в frame
185
        reg     [SIM_FRAME_COUNTER_WIDTH - 1:0]                  frame_counter;                  // счётчик номера frame
186
        integer cpu_io_counter;
187
        FIR_cascaded
188
#(
189
        .INP_SAMP_WIDTH                         (INP_SAMP_WIDTH),
190
        .PING_ADDR_WIDTH                        (PING_ADDR_WIDTH),
191
        .FRAME_ADDR_WIDTH                       (FRAME_ADDR_WIDTH),
192
        .CONV_MEM_BLOCK_ADDR_WIDTH      (CONV_MEM_BLOCK_ADDR_WIDTH),
193
        .OUT_SAMP_WIDTH                         (OUT_SAMP_WIDTH),
194
        .CLK_TO_SAMP_ADDR_WIDTH         (CLK_TO_SAMP_ADDR_WIDTH),
195
        .OUT_SAMP_A_SQ_WIDTH            (OUT_SAMP_A_SQ_WIDTH),
196
        .OUT_SAMP_A_SQ_OFFS                     (OUT_SAMP_A_SQ_OFFS)
197
)
198
        FIR_cascaded_DUT (
199
                .clk                            (clk),
200
                .reset                          (reset),
201
                .inp_clk                        (inp_clk),
202
                .inp_ping_start         (inp_ping_start),
203
                .inp_samp_I                     (inp_samp_I),
204
                .inp_samp_Q                     (inp_samp_Q),
205
                .inp_ping_length        (inp_ping_length),
206
                .IOB_ping_from_Rx       (IOB_ping_from_Rx),
207
                .IOB_ping_RAM_CS        (IOB_ping_RAM_CS),
208
                .IOB_ping_RAM_D         (IOB_ping_RAM_D),
209
                .IOB_ping_RAM_IQ        (IOB_ping_RAM_IQ),
210
                .IOB_ping_RAM_A         (IOB_ping_RAM_A),
211
                .IOB_ping_RAM_WR        (IOB_ping_RAM_WR),
212
                .IOB_ping_RAM_RD        (IOB_ping_RAM_RD),
213
                .out_samp_I                     (out_samp_I),
214
                .out_samp_Q                     (out_samp_Q),
215
                .out_samp_A_sq          (out_samp_A_sq),
216
                .out_samp_strobe        (out_samp_strobe),
217
                .out_frame_strobe       (out_frame_strobe)
218
        );
219
 
220
        initial begin
221
                $dumpfile("test.vcd");
222
                $dumpvars(1, FIR_cascaded_DUT,
223
                FIR_cascaded_DUT.out_samp_Q_reg,
224
                FIR_cascaded_DUT.multiplier_ping_Q[0], FIR_cascaded_DUT.out_samp_acc_Q[0], FIR_cascaded_DUT.multiplier_echo_Q[0]
225
                //,FIR_cascaded_DUT.multiplier_ping_Q[1], FIR_cascaded_DUT.out_samp_acc_Q[1], FIR_cascaded_DUT.multiplier_echo_Q[1]
226
                //,FIR_cascaded_DUT.multiplier_ping_Q[2], FIR_cascaded_DUT.out_samp_acc_Q[2], FIR_cascaded_DUT.multiplier_echo_Q[2]
227
                //,FIR_cascaded_DUT.multiplier_ping_Q[3], FIR_cascaded_DUT.out_samp_acc_Q[3], FIR_cascaded_DUT.multiplier_echo_Q[3]
228
                );
229
                clk = 0;
230
                reset = 0;
231
                inp_clk = 0;
232
                inp_ping_start = 0;
233
                clk_to_samp_counter = 0;
234
                frame_addr_counter = 0;
235
                frame_counter = 0;
236
                inp_ping_length = PARAM_INP_PING_LENGTH;
237
                IOB_ping_from_Rx = 1;
238
                IOB_ping_RAM_CS = 1;
239
                IOB_ping_RAM_D_reg = {INP_SAMP_WIDTH{1'bZ}};
240
                IOB_ping_RAM_IQ = 0;
241
                IOB_ping_RAM_A = 0;
242
                IOB_ping_RAM_WR = 1;
243
                IOB_ping_RAM_RD = 0;
244
                cpu_io_counter = 0;
245
                $readmemh(INP_FILE, inp_signal_file);
246
                $readmemh(PING_FILE, ping_file);
247
                IOB_ping_RAM_D_reg = ping_file[cpu_io_counter];
248
                IOB_ping_RAM_IQ = cpu_io_counter[0];
249
                IOB_ping_RAM_A = cpu_io_counter[PING_ADDR_WIDTH:1];
250
                inp_samp_I <= inp_signal_file[frame_addr_counter*2];
251
                inp_samp_Q <= inp_signal_file[frame_addr_counter*2 + 1];
252
                #20 reset = 1;
253
                #20 reset = 0;
254
                #SIM_DURATION $finish;
255
        end
256
 
257
        always
258
                #10 clk = !clk;
259
        always@(negedge clk)
260
        begin
261
                if (clk_to_samp_counter == CLK_TO_SAMP_RATIO - 1) begin // generate sample
262
                        clk_to_samp_counter <= 0;
263
                        inp_clk <= 1;
264
                        inp_samp_I <= inp_signal_file[(frame_addr_counter)*2];
265
                        inp_samp_Q <= inp_signal_file[(frame_addr_counter)*2 + 1];
266
                        if (frame_addr_counter == FRAME_PERIOD) begin           // ping start
267
                                frame_addr_counter <= 0;
268
                                frame_counter <= frame_counter + 1;
269
                        end else begin
270
                                frame_addr_counter <= frame_addr_counter + 1;
271
                        end
272
                        inp_ping_start <= frame_addr_counter == 0;
273
                end else begin
274
                        if (clk_to_samp_counter == CLK_TO_SAMP_RATIO / 2) begin
275
                                inp_clk <= 0;
276
                        end
277
                        clk_to_samp_counter <= clk_to_samp_counter + 1;
278
                end
279
                if (clk_to_samp_counter == 0) begin
280
                end else if (clk_to_samp_counter == CLK_TO_SAMP_RATIO / 2) begin
281
                end
282
        end
283
 
284
        assign  IOB_ping_RAM_D = IOB_ping_RAM_WR ? IOB_ping_RAM_D_reg : {INP_SAMP_WIDTH{1'bZ}};
285
 
286
        always @ (negedge clk) begin
287
                if (reset) begin
288
                        cpu_io_counter <= 0;
289
                end else begin
290
                        if (cpu_io_counter <= (PING_ADDR_WIDTH**2) * 2) begin
291
                                cpu_io_counter <= cpu_io_counter + 1;
292
                        end
293
                        if (cpu_io_counter < (PING_ADDR_WIDTH**2) * 2) begin
294
                                IOB_ping_RAM_CS = 1;
295
                                IOB_ping_RAM_D_reg = ping_file[cpu_io_counter];
296
                                IOB_ping_RAM_IQ = cpu_io_counter[0];
297
                                IOB_ping_RAM_A = cpu_io_counter[PING_ADDR_WIDTH:1];
298
                                IOB_ping_RAM_WR = 1;
299
                                IOB_ping_RAM_RD = 0;
300
                        end else begin
301
                                IOB_ping_RAM_CS = 0;
302
                                IOB_ping_RAM_IQ = 0;
303
                                IOB_ping_RAM_A = 0;
304
                                IOB_ping_RAM_WR = 0;
305
                                IOB_ping_RAM_RD = 0;
306
                        end
307
                end
308
        end //always
309
endmodule

powered by: WebSVN 2.1.0

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