From 290cc01525a4e94413b490775bad6ef7fbf07b87 Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Mon, 13 Aug 2018 21:24:42 +0200 Subject: [PATCH] fix FGPA hi_read_r_xcorr.v: * avoid overflows during accumulation and truncation * explicitely cast unsigned ADC samples to signed --- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/hi_read_rx_xcorr.v | 59 +++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index ac99b9ee5d31a14d038018e946c5ac6ebfc77dc0..939ba93a54ce00e9425a1156d3900f1af58c4c8e 100644 GIT binary patch literal 42175 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 literal 42175 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 H#h3iQz8y}h diff --git a/fpga/hi_read_rx_xcorr.v b/fpga/hi_read_rx_xcorr.v index 26ee8426..f637abf2 100644 --- a/fpga/hi_read_rx_xcorr.v +++ b/fpga/hi_read_rx_xcorr.v @@ -71,12 +71,15 @@ begin corr_i_cnt <= corr_i_cnt + 1; end -// And a couple of registers in which to accumulate the correlations. -// We would add at most 32 times the difference between unmodulated and modulated signal. It should +// And a couple of registers in which to accumulate the correlations. From the 64 samples +// we would add at most 32 times the difference between unmodulated and modulated signal. It should // be safe to assume that a tag will not be able to modulate the carrier signal by more than 25%. // 32 * 255 * 0,25 = 2040, which can be held in 11 bits. Add 1 bit for sign. -reg signed [11:0] corr_i_accum; -reg signed [11:0] corr_q_accum; +// Temporary we might need more bits. For the 212kHz subcarrier we could possible add 32 times the +// maximum signal value before a first subtraction would occur. 32 * 255 = 8160 can be held in 13 bits. +// Add one bit for sign -> need 14 bit registers but final result will fit into 12 bits. +reg signed [13:0] corr_i_accum; +reg signed [13:0] corr_q_accum; // we will report maximum 8 significant bits reg signed [7:0] corr_i_out; reg signed [7:0] corr_q_out; @@ -104,7 +107,7 @@ begin else begin // 424 kHz subcarrier_I = ~corr_i_cnt[4]; - subcarrier_Q = ~(corr_i_cnt[4]^corr_i_cnt[3]); + subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); end end @@ -119,32 +122,56 @@ begin if(snoop) begin // Send 7 most significant bits of tag signal (signed), plus 1 bit reader signal - corr_i_out <= {corr_i_accum[11:5], after_hysteresis_prev_prev}; - corr_q_out <= {corr_q_accum[11:5], after_hysteresis_prev}; + if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) + corr_i_out <= {corr_i_accum[11:5], after_hysteresis_prev_prev}; + else // truncate to maximum value + if (corr_i_accum[13] == 1'b0) + corr_i_out <= {7'b0111111, after_hysteresis_prev_prev}; + else + corr_i_out <= {7'b1000000, after_hysteresis_prev_prev}; + if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) + corr_q_out <= {corr_q_accum[11:5], after_hysteresis_prev}; + else // truncate to maximum value + if (corr_q_accum[13] == 1'b0) + corr_q_out <= {7'b0111111, after_hysteresis_prev}; + else + corr_q_out <= {7'b1000000, after_hysteresis_prev}; after_hysteresis_prev_prev <= after_hysteresis; end else begin - // Send 8 most significant bits of tag signal - corr_i_out <= corr_i_accum[11:4]; - corr_q_out <= corr_q_accum[11:4]; + // Send 8 bits of tag signal + if (corr_i_accum[13:11] == 3'b000 || corr_i_accum[13:11] == 3'b111) + corr_i_out <= corr_i_accum[11:4]; + else // truncate to maximum value + if (corr_i_accum[13] == 1'b0) + corr_i_out <= 8'b01111111; + else + corr_i_out <= 8'b10000000; + if (corr_q_accum[13:11] == 3'b000 || corr_q_accum[13:11] == 3'b111) + corr_q_out <= corr_q_accum[11:4]; + else // truncate to maximum value + if (corr_q_accum[13] == 1'b0) + corr_q_out <= 8'b01111111; + else + corr_q_out <= 8'b10000000; end // Initialize next correlation. // Both I and Q reference signals are high when corr_i_nct == 0. Therefore need to accumulate. - corr_i_accum <= adc_d; - corr_q_accum <= adc_d; + corr_i_accum <= $signed({1'b0,adc_d}); + corr_q_accum <= $signed({1'b0,adc_d}); end else begin if (subcarrier_I) - corr_i_accum <= corr_i_accum + adc_d; + corr_i_accum <= corr_i_accum + $signed({1'b0,adc_d}); else - corr_i_accum <= corr_i_accum - adc_d; + corr_i_accum <= corr_i_accum - $signed({1'b0,adc_d}); if (subcarrier_Q) - corr_q_accum <= corr_q_accum + adc_d; + corr_q_accum <= corr_q_accum + $signed({1'b0,adc_d}); else - corr_q_accum <= corr_q_accum - adc_d; + corr_q_accum <= corr_q_accum - $signed({1'b0,adc_d}); end