From d372569b45b7ce862d2ed2db192eead861806251 Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Thu, 7 Sep 2017 09:33:32 +0200 Subject: [PATCH] FPGA changes ISO14443B: * slightly increase reader field strength * increase sensitivity when reading, allowing increased reading distance --- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/hi_read_rx_xcorr.v | 31 +++++++++++++++++-------------- fpga/hi_read_tx.v | 16 +++++++++------- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index b9f2e6292e42801a73b57aa3e43dff00191ec8b9..bd8cf8e7dcf7ae80756e29f2417a94da7e9dd290 100644 GIT binary patch literal 42175 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�{n79a~&>|uqF{t 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

N^drwI3p?g=l3-PrH` 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 We*cOjW%&2Fq5%IME~cgYm;B#7qqOM& diff --git a/fpga/hi_read_rx_xcorr.v b/fpga/hi_read_rx_xcorr.v index afa46c44..433d6736 100644 --- a/fpga/hi_read_rx_xcorr.v +++ b/fpga/hi_read_rx_xcorr.v @@ -34,13 +34,13 @@ always @(negedge ck_1356megb) (* clock_signal = "yes" *) reg adc_clk; // sample frequency, always 16 * fc always @(ck_1356megb, xcorr_is_848, xcorr_quarter_freq, fc_div) - if (xcorr_is_848 & ~xcorr_quarter_freq) // fc = 847.5 kHz + if (xcorr_is_848 & ~xcorr_quarter_freq) // fc = 847.5 kHz, standard ISO14443B adc_clk <= ck_1356megb; - else if (~xcorr_is_848 & ~xcorr_quarter_freq) // fc = 424.25 kHz + else if (~xcorr_is_848 & ~xcorr_quarter_freq) // fc = 423.75 kHz adc_clk <= fc_div[0]; - else if (xcorr_is_848 & xcorr_quarter_freq) // fc = 212.125 kHz + else if (xcorr_is_848 & xcorr_quarter_freq) // fc = 211.875 kHz adc_clk <= fc_div[1]; - else // fc = 106.0625 kHz + else // fc = 105.9375 kHz adc_clk <= fc_div[2]; // When we're a reader, we just need to do the BPSK demod; but when we're an @@ -69,13 +69,16 @@ begin end end -// Let us report a correlation every 4 subcarrier cycles, or 4*16 samples, +// 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/sub at most 32 times adc_d, the signed result can be held in 14 bits. -reg signed [13:0] corr_i_accum; -reg signed [13:0] corr_q_accum; +// 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; +// 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 @@ -99,16 +102,16 @@ begin begin if(snoop) begin - // Send only 7 most significant bits of tag signal (signed), LSB is reader signal: - corr_i_out <= {corr_i_accum[13:7], after_hysteresis_prev_prev}; - corr_q_out <= {corr_q_accum[13:7], after_hysteresis_prev}; + // 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 else begin - // 8 most significant bits of tag signal - corr_i_out <= corr_i_accum[13:6]; - corr_q_out <= corr_q_accum[13:6]; + // 8 bits of tag signal + corr_i_out <= corr_i_accum[11:4]; + corr_q_out <= corr_q_accum[11:4]; end corr_i_accum <= adc_d; diff --git a/fpga/hi_read_tx.v b/fpga/hi_read_tx.v index f12e64eb..fc309cde 100644 --- a/fpga/hi_read_tx.v +++ b/fpga/hi_read_tx.v @@ -24,33 +24,36 @@ module hi_read_tx( output dbg; input shallow_modulation; +// low frequency outputs, not relevant +assign pwr_lo = 1'b0; +assign pwr_oe2 = 1'b0; + // The high-frequency stuff. For now, for testing, just bring out the carrier, // and allow the ARM to modulate it over the SSP. reg pwr_hi; reg pwr_oe1; -reg pwr_oe2; reg pwr_oe3; reg pwr_oe4; + always @(ck_1356megb or ssp_dout or shallow_modulation) begin if(shallow_modulation) begin pwr_hi <= ck_1356megb; - pwr_oe1 <= ~ssp_dout; - pwr_oe2 <= ~ssp_dout; - pwr_oe3 <= ~ssp_dout; - pwr_oe4 <= 1'b0; + pwr_oe1 <= 1'b0; + pwr_oe3 <= 1'b0; + pwr_oe4 <= ~ssp_dout; end else begin pwr_hi <= ck_1356megb & ssp_dout; pwr_oe1 <= 1'b0; - pwr_oe2 <= 1'b0; pwr_oe3 <= 1'b0; pwr_oe4 <= 1'b0; end end + // Then just divide the 13.56 MHz clock down to produce appropriate clocks // for the synchronous serial port. @@ -83,7 +86,6 @@ end assign ssp_din = after_hysteresis; -assign pwr_lo = 1'b0; assign dbg = ssp_din; endmodule -- 2.39.5