From 30364d271166fd7359ff88d4b4fc22d63395ed9d Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Mon, 9 Mar 2015 20:01:37 +0100 Subject: [PATCH] fix: broken edge detector implementation in hi_iso14443a.v resulted in decreased sensitivity --- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/hi_iso14443a.v | 61 ++++++++++++++++++++------------------------ 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 4910e6ac50d6e3cb405bacee3eef47de443b0147..20fb2bd4401254d899d6273451bfccbd827f562b 100644 GIT binary patch literal 42175 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

&2;hNH}XLHl1DLF*4C z_&}3N3I{w;=f5B=2T>u#{VEzOuGZT9cG21chZ?Ffg7sXt^aiC#;f?fj0v?e`<-A#HA(CRP9 zT;vgj%@TSCI9b3GVc=Oj%=H_O7QF9U%MgeNuDwE zcQ80`fG6e-=ztc5qORWnrKqC}%`6-a8Vq26senXK>M!v4;U$Ll2JMF&5}-*X$cQ59 z`VCP1b%g0KgT(=Y*#MphGXhP}9D?<~VD%T%bB4|qr2vizLZH?1 zT1niP_16TZ9tY48S&0cuDjYi*lsvexjUOImYCNixz#+oL!m^P;1F{wZ+%W*xU*I(- z%qtiUG;Ct<>0nmifUcRu96$WV@biGZBdEi|@R13;HUnk-2Dn}ZRnP_wx)YdH82*9= zOeQd+)?c9Y^Pq|hv_^_a0o?!MfR7&{)^9K!e9?tnH%{RJLh z{n20tS%3J0!44FsDC;*sy)B`a47*r#S~M0gX$b6lpa)vffmVNU8!(-2*vz1Fg~Nc0 zhhftL9U*Q5wDlXHvACNo+Ze&)hp-j(nCmx~Zz+6juzkQ|!7Rt{t-)3a+xiXX7Y)A? z?QZaI1?L?*4%GRt|Bz+abqxOx8UE?{16mjW5kXzQ0U9>E;j)E6@d(F9CK-mU47yji zvD9Bo5e!=xv`=UhFu~o7QGY3&aM-}0afQQ#i3c9C^a1-umJiK;82$@@ zMKJ5HlWN_dX2u4gHw?Q$^(nUc>xD-*gWfT&4NPx9lP{pLIL!L%1w#X9dlYCb1ax&D zw0+0`TE78yGxH13M3{r#2jw@QavoGKBd_0p)L%b9^_K%Lc<~8D1ipU$AE??o!2hZF z$AaTbn-}PSmTlaJ#238°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 CM>mK7 literal 42175 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%0DFjfQJp0 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 e3=W*cgacGPs{z9TkUr3=14aghgNSJ 0; i = i - 1) - // begin - // input_shift[i] <= input_shift[i-1]; - // end - // input_shift[0] <= adc_d; input_prev_4 <= input_prev_3; input_prev_3 <= input_prev_2; input_prev_2 <= input_prev_1; input_prev_1 <= adc_d; end -// assign adc_d_filtered = (input_shift[3] << 1) + input_shift[2] - input_shift[0] - (adc_d << 1); -assign adc_d_filtered = tmp_1 - tmp_2; +// adc_d_filtered = 2*input_prev4 + 1*input_prev3 + 0*input_prev2 - 1*input_prev1 - 2*input +// = (2*input_prev4 + input_prev3) - (2*input + input_prev1) +wire [8:0] input_prev_4_times_2 = input_prev_4 << 1; +wire [8:0] adc_d_times_2 = adc_d << 1; + +wire [9:0] tmp1 = input_prev_4_times_2 + input_prev_3; +wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; + +// convert intermediate signals to signed and calculate the filter output +wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -194,11 +186,13 @@ reg [3:0] mod_detect_reset_time; always @(negedge adc_clk) begin if (mod_type == `READER_LISTEN) - // (our) reader signal changes at t=1, tag response expected n*16+4 ticks later, further delayed by - // 3 ticks ADC conversion. - // 1 + 4 + 3 = 8 + // (our) reader signal changes at negedge_cnt[3:0]=9, tag response expected to start n*16+4 ticks later, further delayed by + // 3 ticks ADC conversion. The maximum filter output (edge detected) will be detected after subcarrier zero crossing (+7 ticks). + // To allow some timing variances, we want to have the maximum filter outputs well within the detection window, i.e. + // at mod_detect_reset_time+4 and mod_detect_reset_time+12 (-4 ticks). + // 9 + 4 + 3 + 7 - 4 = 19. 19 mod 16 = 3 begin - mod_detect_reset_time <= 4'd8; + mod_detect_reset_time <= 4'd4; end else if (mod_type == `SNIFFER) @@ -207,10 +201,10 @@ begin if (~pre_after_hysteresis && after_hysteresis && deep_modulation) // reader signal rising edge detected at negedge_cnt[3:0]. This signal had been delayed // 9 ticks by the RF part + 3 ticks by the A/D converter + 1 tick to assign to after_hysteresis. - // The tag will respond n*16 + 4 ticks later + 3 ticks A/D converter delay. - // - 9 - 3 - 1 + 4 + 3 = -6 + // Then the same as above. + // - 9 - 3 - 1 + 4 + 3 + 7 - 4 = -3 begin - mod_detect_reset_time <= negedge_cnt[3:0] - 4'd4; + mod_detect_reset_time <= negedge_cnt[3:0] - 4'd3; end end end @@ -224,12 +218,14 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; +`define EDGE_DETECT_THRESHOLD 5 + always @(negedge adc_clk) begin if(negedge_cnt[3:0] == mod_detect_reset_time) begin // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if (rx_mod_falling_edge_max > 5 && rx_mod_rising_edge_max > 5) + if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLD) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLD)) curbit <= 1'b1; // modulation else curbit <= 1'b0; // no modulation @@ -246,8 +242,8 @@ begin end else begin - if (-adc_d_filtered > rx_mod_rising_edge_max) - rx_mod_rising_edge_max <= -adc_d_filtered; + if (adc_d_filtered < rx_mod_rising_edge_max) + rx_mod_rising_edge_max <= adc_d_filtered; end end @@ -273,7 +269,7 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Tag: +// PM3 -> Reader: // a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 reg [31:0] mod_sig_buf; reg [4:0] mod_sig_ptr; @@ -297,7 +293,7 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Tag, internal timing: +// PM3 -> Reader, internal timing: // a timer for the 1172 cycles fdt (Frame Delay Time). Start the timer with a rising edge of the reader's signal. // set fdt_elapsed when we no longer need to delay data. Set fdt_indicator when we can start sending data. // Note: the FPGA only takes care for the 1172 delay. To achieve an additional 1236-1172=64 ticks delay, the ARM must send @@ -477,11 +473,10 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: +// FPGA <-> ARM communication: // generate a ssp clock and ssp frame signal for the synchronous transfer from/to the ARM reg ssp_clk; reg ssp_frame; -reg [2:0] ssp_frame_counter; always @(negedge adc_clk) begin