From 5c1f7686f615fcbdd7fdebc2b43f71fbc14e9e87 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 10 Oct 2017 14:01:58 +0200 Subject: [PATCH] ADD: FPGA code to support FeliCa / ISO 18092. Thanks to @satsuoni --- fpga/Makefile | 9 +- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/fpga_nfc.v | 121 ++++++++++++++ fpga/hi_flite.v | 427 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 555 insertions(+), 2 deletions(-) create mode 100644 fpga/fpga_nfc.v create mode 100644 fpga/hi_flite.v diff --git a/fpga/Makefile b/fpga/Makefile index c1ff5087a..f0b058eeb 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -1,14 +1,19 @@ include ../common/Makefile.common -all: fpga_lf.bit fpga_hf.bit +all: fpga_lf.bit fpga_hf.bit fpga_nfc.bit clean: $(DELETE) *.bgn *.drc *.ncd *.ngd *_par.xrpt *-placed.* *-placed_pad.* *_usage.xml xst_hf.srp xst_lf.srp $(DELETE) *.map *.ngc *.xrpt *.pcf *.rbt *_auto_* *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst xst -fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v +fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v hi_flite.v $(DELETE) $@ $(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr +fpga_nfc.ngc: fpga_nfc.v fpga.ucf xst_nfc.scr util.v hi_flite.v + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)xst -ifn xst_nfc.scr + + fpga_lf.ngc: fpga_lf.v fpga.ucf xst_lf.scr util.v clk_divider.v lo_edge_detect.v lo_read.v lo_passthru.v lp20khz_1MSa_iir_filter.v min_max_tracker.v lf_edge_detect.v $(DELETE) $@ $(XILINX_TOOLS_PREFIX)xst -ifn xst_lf.scr diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 864b52394dcb821b24bb42ac9b8d6d01a34832f8..59b25f924a37e36c9b668cc23740be76f2f440ec 100644 GIT binary patch literal 42175 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

|gHZ)&{b9>V1}z7j3EZj;o=i3Y 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%0A@9YuME}> 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 diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index bd4d821bbd7db5d6ff01190fc2204e259e467c50..43fbee16c4e7af230f1c5dfb2c31feffe47f3d5d 100644 GIT binary patch literal 42175 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

(nf50up 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 Ao&W#< diff --git a/fpga/fpga_nfc.v b/fpga/fpga_nfc.v new file mode 100644 index 000000000..dbc608fb5 --- /dev/null +++ b/fpga/fpga_nfc.v @@ -0,0 +1,121 @@ +//----------------------------------------------------------------------------- +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +// +// I am not really an FPGA/ASIC designer, so I am sure that a lot of this +// could be improved. +// +// Jonathan Westhues, March 2006 +// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 +// iZsh , June 2014 +// Satsuoni <>, October 2017 , added FeliCa support. +//----------------------------------------------------------------------------- + +`include "hi_flite.v" +`include "util.v" + +module fpga_nfc( + input spck, output miso, input mosi, input ncs, + input pck0, input ck_1356meg, input ck_1356megb, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + input [7:0] adc_d, output adc_clk, output adc_noe, + output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, + input cross_hi, input cross_lo, + output dbg +); + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +reg [15:0] shift_reg; +reg [7:0] conf_word; + +// We switch modes between transmitting to the 13.56 MHz tag and receiving +// from it, which means that we must make sure that we can do so without +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + case(shift_reg[15:12]) + 4'b0001: conf_word <= shift_reg[7:0]; // FPGA_CMD_SET_CONFREG + endcase +end + +always @(posedge spck) +begin + if(~ncs) + begin + shift_reg[15:1] <= shift_reg[14:0]; + shift_reg[0] <= mosi; + end +end + +wire [2:0] major_mode; +assign major_mode = conf_word[7:5]; + +// For the high-frequency transmit configuration: modulation depth, either +// 100% (just quite driving antenna, steady LOW), or shallower (tri-state +// some fraction of the buffers) +//wire hi_read_tx_shallow_modulation = conf_word[0]; + +// For the high-frequency receive correlator: frequency against which to +// correlate. +//wire hi_read_rx_xcorr_848 = conf_word[0]; +// and whether to drive the coil (reader) or just short it (snooper) +//wire hi_read_rx_xcorr_snoop = conf_word[1]; +// divide subcarrier frequency by 4 +//wire hi_read_rx_xcorr_quarter = conf_word[2]; + +// For the high-frequency simulated tag: what kind of modulation to use. +wire [2:0] hi_simulate_mod_type = conf_word[2:0]; + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + + +hi_flite hfl( + pck0, ck_1356meg, ck_1356megb, + hfl_pwr_lo, hfl_pwr_hi, hfl_pwr_oe1, hfl_pwr_oe2, hfl_pwr_oe3, hfl_pwr_oe4, + adc_d, hfl_adc_clk, + hfl_ssp_frame, hfl_ssp_din, ssp_dout, hfl_ssp_clk, + cross_hi, cross_lo, + hfl_dbg, + hi_simulate_mod_type +); + +// Major modes: +// no major modes here for now, except NFC demod/sim. Maybe I should remove mux at some point, unless I can think of more modes +// 000 -- +// 001 -- +// 010 -- +// 011 -- +// 100 -- +// 101 -- HF NFC demod, just to copy it for now +// 111 -- everything off + +mux8 mux_ssp_clk (major_mode, ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_clk, 1'b0, 1'b0); +mux8 mux_ssp_din (major_mode, ssp_din, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_din, 1'b0, 1'b0); +mux8 mux_ssp_frame (major_mode, ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_ssp_frame, 1'b0, 1'b0); +mux8 mux_pwr_oe1 (major_mode, pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe1, 1'b0, 1'b0); +mux8 mux_pwr_oe2 (major_mode, pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe2, 1'b0, 1'b0); +mux8 mux_pwr_oe3 (major_mode, pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe3, 1'b0, 1'b0); +mux8 mux_pwr_oe4 (major_mode, pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_oe4, 1'b0, 1'b0); +mux8 mux_pwr_lo (major_mode, pwr_lo, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_lo, 1'b0, 1'b0); +mux8 mux_pwr_hi (major_mode, pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_pwr_hi, 1'b0, 1'b0); +mux8 mux_adc_clk (major_mode, adc_clk, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_adc_clk, 1'b0, 1'b0); +mux8 mux_dbg (major_mode, dbg, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, hfl_dbg, 1'b0, 1'b0); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga/hi_flite.v b/fpga/hi_flite.v new file mode 100644 index 000000000..c7b9d4648 --- /dev/null +++ b/fpga/hi_flite.v @@ -0,0 +1,427 @@ +// Satsuoni, October 2017, Added FeliCa support +// +//this code demodulates and modulates signal as described in ISO/IEC 18092. That includes packets used for Felica, NFC Tag 3, etc. (which do overlap) +//simple envelope following algorithm is used (modification of fail0verflow LF one) is used to combat some nasty aliasing effect with testing phone (envelope looked like sine wave) +// only 212 kbps (fc/64) for now 414 is relatively straightforward... +// modulation waits for + +//market sprocket -doesn't really mean anything ;) +`define SNIFFER 3'b000 +`define TAGSIM_LISTEN 3'b001 //same as SNIFFER, really. demod does not distinguish tag from reader +`define TAGSIM_MODULATE 3'b010 +`define TAGSIM_MOD_NODELAY 3'b011 //not implemented yet. for use with commands other than polling, which might require different timing, as per Felica standard + +module hi_flite( + pck0, ck_1356meg, ck_1356megb, + pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, + adc_d, adc_clk, + ssp_frame, ssp_din, ssp_dout, ssp_clk, + cross_hi, cross_lo, + dbg, + mod_type // maybe used +); + input pck0, ck_1356meg, ck_1356megb; + output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; + input [7:0] adc_d; + output adc_clk; + input ssp_dout; + output ssp_frame, ssp_din, ssp_clk; + input cross_hi, cross_lo; + output dbg; + input [2:0] mod_type; // maybe used. +assign dbg=0; + +// Most off, oe4 for modulation; No reader emulation (would presumably just require switching power on, but I am not sure) +assign pwr_hi = 1'b0; +assign pwr_lo = 1'b0; +assign pwr_oe1 = 1'b0; +assign pwr_oe2 = 1'b0; +assign pwr_oe3 = 1'b0; + + +//512x64/fc -wait before ts0, 32768 ticks +//tslot: 256*64/fc + +assign adc_clk = ck_1356meg; + + +///heuristic values for initial thresholds. seem to work OK +`define imin 70//(13'd256) +`define imax 180//(-13'd256) +`define ithrmin 91//-13'd8 +`define ithrmax 160// 13'd8 + + +//minimum values and corresponding thresholds +reg [8:0] curmin=`imin; + +reg [8:0] curminthres=`ithrmin; + +reg [8:0] curmaxthres=`ithrmax; +reg [8:0] curmax=`imax; + + +//signal state, 1-not modulated, 0 -modulated +reg after_hysteresis = 1'b1; + +//state machine for envelope tracking +reg [1:0] state=1'd0; + + +//lower edge detected, trying to detect first bit of SYNC (b24d, 1011001001001101) +reg try_sync=1'b0; + +//detected first sync bit, phase frozen +reg did_sync=0; + + +`define bithalf_212 32 //half-bit length for 212 kbit +`define bitlen_212 64 //full-bit length for 212 kbit +`define bitmlen_212 63 //bit transition edge +`define bitmhalf_212 31 //mod flip + + +//ssp clock and current values +reg ssp_clk; +reg ssp_frame; +reg curbit=1'b0; + +reg [7:0] fccount=8'd0; // in-bit tick counter. Counts carrier cycles from the first lower edge detected, reset on every manchester bit detected + +reg [7:0] tsinceedge=8'd0;// ticks from last edge, desync if the valye is too large + +reg zero=1'b0; // Manchester first halfbit low second high corresponds to this value. It has been known to change. SYNC is used to set it + +//ssp counter for transfer and framing +reg [8:0] ssp_cnt=9'd0; + +always @(posedge adc_clk) + ssp_cnt <= (ssp_cnt + 1); + + +reg getting_arm_data=1'b0; + + +reg [47:0] delayline=48'd0; //48-bit preamble delay line. Just push the data into it starting from first SYNC (1) bit coming from ARM Made this long to keep all ARM data received during preamble +reg [5:0] delay_read_ptr=6'd0; // this is supposed to count ARM delay in the buffer. +reg preamble=0; // whether we are sending preamble + + + +always @(negedge adc_clk) +begin + //count fc/64 - transfer bits to ARM at the rate they are received + if(ssp_cnt[5:0] == 6'b000000) + begin + ssp_clk <= 1'b1; + ssp_din <= curbit; + + //sample ssp_dout? + if(mod_type==`TAGSIM_MODULATE||mod_type==`TAGSIM_MOD_NODELAY) + begin + delayline<={delayline[46:0],ssp_dout}; + if ((~getting_arm_data) && ssp_dout) + begin + getting_arm_data <=1'b1; + delay_read_ptr<=delay_read_ptr+1; + end + else + begin + if (getting_arm_data & preamble) + begin + delay_read_ptr<=delay_read_ptr+1; + end + end + end + else + begin + getting_arm_data <=1'b0; + delay_read_ptr<=6'd0; + end + + end + if(ssp_cnt[5:0] == 6'b100000) + ssp_clk <= 1'b0; + //create frame pulses. TBH, I still don't know what they do exactly, but they are crucial for ARM->FPGA transfer. If the frame is in the beginning of the byte, transfer slows to a crawl for some reason + // took me a day to figure THAT out. + if(ssp_cnt[8:0] == 9'd31) + begin + ssp_frame <= 1'b1; + end + if(ssp_cnt[8:0] == 9'b1011111) + begin + ssp_frame <= 1'b0; + end +end + + + + +//send current bit (detected in SNIFF mode or the one being modulated in MOD mode, 0 otherwise) +reg ssp_din; + + + +//previous signal value, mostly to detect SYNC +reg prv =1'b1; + + +reg[7:0] mid=8'd128; //for simple error correction in mod/demod detection, use maximum of modded/demodded in given interval. Maybe 1 bit is extra? but better safe than sorry. + +//modulated coil. set to 1 to modulate low, 0 to keep signal high +reg mod_sig_coil=1'b0; + +// set TAGSIM__MODULATE on ARM if we want to write... (frame would get lost if done mid-frame...) +// start sending over 1s on ssp->arm when we start sending preamble + +reg counting_desync=1'b0; // are we counting bits since last frame? +reg sending=1'b0; // are we actively modulating? +reg [11:0] bit_counts=12'd0;///for timeslots... only support ts=0 for now, at 212 speed -512 fullbits from end of frame. One hopes. + + +always @(negedge adc_clk) //every data ping? +begin + //envelope follow code... + //////////// + if ((mod_type==`SNIFFER )||(mod_type==`TAGSIM_LISTEN)) + begin + if (adc_d>curmaxthres) //rising edge + begin + case (state) + 0: begin + curmax <= adc_d>155? adc_d :155; + state <= 2; + end + 1: begin + curminthres <= ( (curmin>>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); //threshold: 0.1875 max + 0.8125 min + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + curmax <= adc_d>155? adc_d :155; // to hopefully prevent overflow from spikes going up to 255 + state <= 2; + end + 2: begin + if (adc_d>curmax) + curmax <= adc_d; + end + default: + begin + end + endcase + after_hysteresis <=1'b1; + if(try_sync) + tsinceedge<=0; + end + else if (adc_d>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + curmin <=adc_d<96? adc_d :96; + state <=1; + end + default: + begin + end + endcase + after_hysteresis <=0; + if (~try_sync ) //begin modulation, lower edge... + begin + try_sync <=1; + counting_desync<=1'b0; + fccount <= 1; + did_sync<=0; + curbit<=0; + mid <=8'd127; + tsinceedge<=0; + prv <=1; + end + else + begin + tsinceedge<=0; + end + end + else //stable state, low or high + begin + curminthres <= ( (curmin>>1)+(curmin>>2)+(curmin>>4)+(curmax>>3)+(curmax>>4)); + curmaxthres <= ( (curmax>>1)+(curmax>>2)+(curmax>>4)+(curmin>>3)+(curmin>>4)); + state <=0; + + if (try_sync ) + begin + if (tsinceedge>=(128)) + begin + //we might need to start counting... assuming ARM wants to reply to the frame. + counting_desync<=1'b1; + bit_counts<=1;// i think? 128 is about 2 bits passed... but 1 also works + try_sync<=0; + did_sync<=0;//desync + curmin <=`imin; //reset envelope + curmax <=`imax; + curminthres <=`ithrmin; + curmaxthres <=`ithrmax; + prv <=1; + tsinceedge <=0; + after_hysteresis <=1'b1; + curbit <=0; + mid <=8'd128; + end + else + tsinceedge<=(tsinceedge+1); + end + end + + //move the counter to the outside... + if (adc_d>=curminthres||try_sync) + if(fccount==`bitmlen_212) + begin + fccount<=0; + if (counting_desync) + begin + + if(bit_counts>768) // should be over ts0 now, without ARM interference... stop counting... + begin + bit_counts<=0; + counting_desync<=0; + end + else + bit_counts<=bit_counts+1; + end + end + else + begin + fccount<=fccount+1; + end + + if (try_sync && tsinceedge<128) + begin + //detect bits in their middle ssp sampling is in sync, so it would sample all bits in order + if (fccount==`bithalf_212) + begin + if ((~did_sync) && ((prv==1&&(mid>128))||(prv==0&&(mid<=128)))) + begin + //sync the Zero, and set curbit roperly + did_sync <=1'b1; + zero <= ~prv;// 1-prv + curbit <=1; + end + else + curbit <= (mid>128) ? (~zero):zero; + + prv <=(mid>128) ?1:0; + + if(adc_d>curmaxthres) + mid <=8'd129; + else if (adc_d128)?1:0; + mid <=128; + end + else + begin + // minimum-maximum calc + if(adc_d>curmaxthres) + mid <=mid+1; + else if (adc_d512) + curbit<=mod_sig_coil;//delayline[delay_read_ptr];//bit_counts[0]; + else + curbit<=0; + end + + fccount<=0; + if (bit_counts<=576) //we don't need to count after that... + begin + bit_counts<=bit_counts+1; + if (bit_counts== 512) //should start sending from next tick... i think? + begin + sending <=1; + mod_sig_coil <=1;//modulate... down? + preamble<=1; + end + else + if (bit_counts== 559) + begin + preamble<=0; + end + end + if (sending) + begin //need next bit + if(preamble) + mod_sig_coil<=1; + else + mod_sig_coil<=~delayline[delay_read_ptr]; + end + end + else + begin + fccount<=fccount+1; + + if ((fccount==`bitmhalf_212)&&(sending)) //flip modulation mid-bit + begin + mod_sig_coil<=~mod_sig_coil;//flip + end + end + end //sim mode end + +end + +assign pwr_oe4 = mod_sig_coil & (mod_type == `TAGSIM_MODULATE)&sending; + +endmodule