From 83a4259ddcba946457bf4d8085d7fd6933d4457e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Dr=C3=B6scher?= Date: Fri, 10 Aug 2018 00:49:43 +0200 Subject: [PATCH] change: fixed xcorrelation for strong signal The initial code assumed phase shift modulation only. Lately, xcorrelation is also used for load modulation. But the initial the assumption that 11 bits are enough isn't true for load modulation. This change extends the registers by 2 bits and compresses the uper bits to preserve the sensitivity on the lower end. --- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/hi_read_rx_xcorr.v | 59 ++++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index f86820525980ac5282b8c35eb476d489ad7d7c98..37ce028b01a5bf206f7aa690b5ae7f1968388d82 100644 GIT binary patch literal 42175 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 literal 42175 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 z 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 NKcA7(vQ&`Ce*xCU&(i<^ diff --git a/fpga/hi_read_rx_xcorr.v b/fpga/hi_read_rx_xcorr.v index 6e4c261bf..94a798a86 100644 --- a/fpga/hi_read_rx_xcorr.v +++ b/fpga/hi_read_rx_xcorr.v @@ -72,15 +72,21 @@ end // Let us report a correlation every 4 subcarrier cycles, or 4*16=64 samples, // so we need a 6-bit counter. reg [5:0] corr_i_cnt; -// 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 -// 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; + +// And a couple of registers in which to accumulate the correlations. Since +// load modulation saturates the ADC we have to use a large enough register +// 32 * 255 = 8160, which can be held in 13 bits. Add 1 bit for sign. +// +// The initial code assumed a phase shift of up to 25% and the accumulators were +// 11 bits (32 * 255 * 0,25 = 2040), we will pack all bits exceeding 11 bits into +// MSB. This prevents under/-overflows but preserves sensitivity on the lower end. +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; + // clock and frame signal for communication to ARM reg ssp_clk; reg ssp_frame; @@ -100,19 +106,36 @@ begin // send out later over the SSP. if(corr_i_cnt == 6'd0) 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}; - after_hysteresis_prev_prev <= after_hysteresis; - end + // send 10 bits of tag signal, 4 MSBs are stuffed into 2 MSB + if(~corr_i_accum[13]) + corr_i_out <= {corr_i_accum[13], + corr_i_accum[12] | corr_i_accum[11] | corr_i_accum[10], + corr_i_accum[12] | corr_i_accum[11] | corr_i_accum[9], + corr_i_accum[8:4]}; else - begin - // 8 bits of tag signal - corr_i_out <= corr_i_accum[11:4]; - corr_q_out <= corr_q_accum[11:4]; - end + corr_i_out <= {corr_i_accum[13], + corr_i_accum[12] & corr_i_accum[11] & corr_i_accum[10], + corr_i_accum[12] & corr_i_accum[11] & corr_i_accum[9], + corr_i_accum[8:4]}; + + if(~corr_q_accum[13]) + corr_q_out <= {corr_q_accum[13], + corr_q_accum[12] | corr_q_accum[11] | corr_q_accum[10], + corr_q_accum[12] | corr_q_accum[11] | corr_q_accum[9], + corr_q_accum[8:4]}; + else + corr_q_out <= {corr_q_accum[13], + corr_q_accum[12] & corr_q_accum[11] & corr_q_accum[10], + corr_q_accum[12] & corr_q_accum[11] & corr_q_accum[9], + corr_q_accum[8:4]}; + + if(snoop) + begin + // replace LSB with 1 bit reader signal + corr_i_out[0] <= after_hysteresis_prev_prev; + corr_q_out[0] <= after_hysteresis_prev; + after_hysteresis_prev_prev <= after_hysteresis; + end corr_i_accum <= adc_d; corr_q_accum <= adc_d;