Skip to content

Commit

Permalink
axi_dac_interpolate: Fix low sampling rate issues
Browse files Browse the repository at this point in the history
Intermittently DAC channel data is 0 after multiple new buffers.
Due to the low sampling rate and DMA flushing, it happens that the
transfer SM gets stuck in flushing mode right before the transmission
should start.

Another frequent issue happens when a new transmission is started.
A buffer must be pushed independently for each channel because of
separate DMAs.
After the first buffer is pushed the Linux driver deactivates the
start_sync flag. Not knowing if the other channel/buffer will be
active/pushed. The start_sync will be re-enabled with the second buffer.
The issue was that the SM of the first buffer went one step further
before the push if the second buffer,not being stopped by the
start_sync.

Signed-off-by: AndreiGrozav <andrei.grozav@analog.com>
  • Loading branch information
AndreiGrozav committed Apr 19, 2024
1 parent 4fc6922 commit faf88ad
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 7 deletions.
13 changes: 7 additions & 6 deletions library/axi_dac_interpolate/axi_dac_interpolate_filter.v
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,10 @@ module axi_dac_interpolate_filter #(
reg cic_change_rate;
reg [31:0] interpolation_counter;

reg dma_data_valid = 1'b0;
reg dma_data_valid_adjacent = 1'b0;

reg filter_enable = 1'b0;
reg [15:0] dma_valid_m = 16'd0;
reg stop_transfer = 1'd0;
reg clear_stop_flag = 1'd0;

reg transfer = 1'd0;
reg [ 1:0] transfer_sm = 2'd0;
Expand Down Expand Up @@ -196,11 +194,12 @@ module axi_dac_interpolate_filter #(
assign transfer_ready = start_sync_channels ?
dma_valid & dma_valid_adjacent :
dma_valid;
assign transfer_start = !(en_start_trigger ^ trigger) & transfer_ready;
assign transfer_start = !(en_start_trigger ^ trigger) &
transfer_ready & !dma_transfer_suspend;

always @(posedge dac_clk) begin
stop_transfer <= transfer_sm == IDLE ? 1'b0 :
stop_transfer |
(stop_transfer & !clear_stop_flag) |
dma_transfer_suspend |
(en_stop_trigger & trigger) |
(sync_stop_channels & dma_valid & dma_valid_adjacent);
Expand All @@ -211,17 +210,19 @@ module axi_dac_interpolate_filter #(
case (transfer_sm)
IDLE: begin
transfer <= 1'b0;
if (dac_int_ready) begin
if (dac_int_ready & !dma_transfer_suspend) begin
transfer_sm_next <= WAIT;
end
end
WAIT: begin
transfer <= 1'b0;
if (transfer_start) begin
clear_stop_flag <= 1'b1;
transfer_sm_next <= TRANSFER;
end
end
TRANSFER: begin
clear_stop_flag <= 1'b0;
transfer <= 1'b1;
if (stop_transfer) begin
if (flush_dma_in) begin
Expand Down
2 changes: 1 addition & 1 deletion library/axi_dac_interpolate/axi_dac_interpolate_reg.v
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ module axi_dac_interpolate_reg(
// internal registers

reg [31:0] up_version = {16'h0002, /* MAJOR */
8'h03, /* MINOR */
8'h04, /* MINOR */
8'h00}; /* PATCH */
reg [31:0] up_scratch = 32'h0;

Expand Down

0 comments on commit faf88ad

Please sign in to comment.