@@ -88,15 +88,17 @@ module axi_dac_interpolate_filter #(
88
88
reg cic_change_rate;
89
89
reg [31 :0 ] interpolation_counter;
90
90
91
- reg filter_enable = 1'b0 ;
92
91
reg [15 :0 ] dma_valid_m = 16'd0 ;
92
+ reg [15 :0 ] reset_filt_m = 16'd0 ;
93
93
reg stop_transfer = 1'd0 ;
94
94
reg clear_stop_flag = 1'd0 ;
95
95
96
96
reg transfer = 1'd0 ;
97
97
reg [ 1 :0 ] transfer_sm = 2'd0 ;
98
98
reg [ 1 :0 ] transfer_sm_next = 2'd0 ;
99
99
reg raw_dma_n = 1'd0 ;
100
+ reg last_m = 1'd0 ;
101
+ reg dac_int_ready_residual;
100
102
101
103
// internal signals
102
104
@@ -128,8 +130,6 @@ module axi_dac_interpolate_filter #(
128
130
raw_dma_n <= raw_transfer_en | flush_dma ? 1'b1 : raw_dma_n & ! dma_valid;
129
131
end
130
132
131
- assign reset_filt = ! raw_dma_n & dma_transfer_suspend;
132
-
133
133
assign iqcor_data_in = raw_dma_n ? dac_raw_ch_data : dac_data;
134
134
assign iqcor_valid_in = raw_dma_n ? 1'b1 : dac_valid;
135
135
@@ -175,10 +175,6 @@ module axi_dac_interpolate_filter #(
175
175
end
176
176
end
177
177
178
- // - for start synchronized, wait until the DMA has valid data on both channels
179
- // - for non synchronized channels the start of transmission gets the 2 data
180
- // paths randomly ready, only when using data buffers
181
-
182
178
always @(posedge dac_clk) begin
183
179
if (dac_filt_int_valid & transfer_ready) begin
184
180
if (interpolation_counter == interpolation_ratio) begin
@@ -194,13 +190,22 @@ module axi_dac_interpolate_filter #(
194
190
end
195
191
end
196
192
193
+ always @(posedge dac_clk) begin
194
+ last_m <= last;
195
+ end
196
+
197
+ // - for start synchronized, wait until the DMA has valid data on both channels
198
+ // - for non synchronized channels the start of transmission gets the 2 data
199
+ // paths randomly ready, only when using data buffers
200
+
197
201
assign transfer_ready = start_sync_channels ?
198
202
dma_valid & dma_valid_adjacent :
199
203
dma_valid;
200
204
assign transfer_start = ! (en_start_trigger ^ trigger) &
201
205
transfer_ready & ! dma_transfer_suspend;
202
206
203
- assign rearm_channel = last & rearm_on_last;
207
+ assign rearm_channel = ~ last_m & last & rearm_on_last; // re-arm on last rise
208
+
204
209
always @(posedge dac_clk) begin
205
210
stop_transfer <= transfer_sm == IDLE ? 1'b0 :
206
211
(stop_transfer & ! clear_stop_flag) |
@@ -258,29 +263,38 @@ module axi_dac_interpolate_filter #(
258
263
259
264
always @(posedge dac_clk) begin
260
265
if (dac_rst == 1'b1 ) begin
261
- dma_valid_m <= 'd0 ;
266
+ dma_valid_m <= 16'h0 ;
262
267
end else begin
263
- dma_valid_m <= {dma_valid_m[14 :0 ], dma_valid_ch};
268
+ if (dac_filt_int_valid == 1'b1 ) begin
269
+ dma_valid_m <= {dma_valid_m[14 :0 ], dma_valid_ch};
270
+ end
264
271
end
265
272
end
266
273
267
- assign dac_valid_out = dma_valid_m[2 ];
268
-
269
274
always @(posedge dac_clk) begin
270
- case (filter_mask)
271
- 3'b000 : filter_enable <= 1'b0 ;
272
- default : filter_enable <= 1'b1 ;
273
- endcase
275
+ if (dac_rst == 1'b1 ) begin
276
+ reset_filt_m <= 16'hffff ;
277
+ end else begin
278
+ if (dac_filt_int_valid == 1'b1 ) begin
279
+ reset_filt_m <= {reset_filt_m[14 :0 ], dma_transfer_suspend};
280
+ end else if (dma_transfer_suspend == 1'b0 ) begin
281
+ reset_filt_m <= 16'h0 ;
282
+ end
283
+ end
274
284
end
275
285
286
+ // compensate fir cic filter
287
+ assign dac_valid_out = | filter_mask ? dma_valid_m[13 ] : dma_valid_m[2 ];
288
+ assign reset_filt = ! raw_dma_n & reset_filt_m[13 ];
289
+
276
290
always @(* ) begin
277
- case (filter_enable )
278
- 1'b0 : dac_int_data = dac_data_corrected;
291
+ case (filter_mask )
292
+ 3'b000 : dac_int_data = dac_data_corrected;
279
293
default : dac_int_data = dac_cic_data[31 :16 ];
280
294
endcase
281
295
282
296
case (filter_mask)
283
- 1'b0 : dac_filt_int_valid = dac_valid_corrected & ! dma_transfer_suspend ;
297
+ 1'b0 : dac_filt_int_valid = dac_valid_corrected;
284
298
default : dac_filt_int_valid = dac_fir_valid;
285
299
endcase
286
300
0 commit comments