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 5

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

powered by: WebSVN 2.1.0

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