From c59bdec4f20070b2e7ae55c519833e3255615915 Mon Sep 17 00:00:00 2001 From: d18c7db Date: Tue, 30 May 2023 19:47:27 +0200 Subject: [PATCH] Unified fpga folders --- .gitignore | 12 +- armsrc/Makefile | 3 - armsrc/fpgaloader.c | 20 +- common_arm/Makefile.common | 2 +- common_arm/Makefile.hal | 9 + fpga-xc2s30/Makefile | 60 -- fpga-xc2s30/fpga.ucf | 54 -- fpga-xc2s30/fpga_felica.bit | Bin 42179 -> 0 bytes fpga-xc2s30/fpga_felica.v | 240 ------- fpga-xc2s30/fpga_hf.bit | Bin 42175 -> 0 bytes fpga-xc2s30/fpga_hf.v | 255 -------- fpga-xc2s30/fpga_hf_15.bit | Bin 42178 -> 0 bytes fpga-xc2s30/fpga_hf_15.v | 233 ------- fpga-xc2s30/fpga_lf.bit | Bin 42175 -> 0 bytes fpga-xc2s30/fpga_lf.v | 245 -------- fpga-xc2s30/go.bat | 68 -- fpga-xc2s30/xst_felica.scr | 1 - fpga-xc2s30/xst_hf.scr | 1 - fpga-xc2s30/xst_hf_15.scr | 1 - fpga-xc2s30/xst_lf.scr | 1 - fpga-xc3s100e/.gitignore | 68 -- fpga-xc3s100e/clk_divider.v | 25 - fpga-xc3s100e/compile.sh | 9 - fpga-xc3s100e/define.v | 49 -- fpga-xc3s100e/fpga.ucf | 56 -- fpga-xc3s100e/fpga_hf.bit | Bin 72742 -> 0 bytes fpga-xc3s100e/fpga_hfmod.v | 193 ------ fpga-xc3s100e/fpga_lfmod.v | 236 ------- fpga-xc3s100e/hi_flite.v | 368 ----------- fpga-xc3s100e/hi_get_trace.v | 164 ----- fpga-xc3s100e/hi_iso14443a.v | 584 ------------------ fpga-xc3s100e/hi_reader.v | 335 ---------- fpga-xc3s100e/hi_simulate.v | 152 ----- fpga-xc3s100e/hi_sniffer.v | 50 -- fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise | Bin 257463 -> 0 bytes fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl | 479 -------------- fpga-xc3s100e/lf_edge_detect.v | 77 --- fpga-xc3s100e/lo_adc.v | 91 --- fpga-xc3s100e/lo_edge_detect.v | 70 --- fpga-xc3s100e/lo_passthru.v | 29 - fpga-xc3s100e/lo_read.v | 74 --- fpga-xc3s100e/lp20khz_1MSa_iir_filter.v | 81 --- fpga-xc3s100e/min_max_tracker.v | 65 -- fpga-xc3s100e/util.v | 27 - fpga/Makefile | 221 +++++++ {fpga-xc2s30 => fpga}/clk_divider.v | 7 +- fpga/define.v | 155 +++++ .../fpga_icopyx_felica.bit | 0 fpga/fpga_icopyx_hf.bit | Bin 0 -> 72749 bytes fpga/fpga_icopyx_hf.v | 227 +++++++ .../fpga_lf.bit => fpga/fpga_icopyx_hf_15.bit | 0 fpga/fpga_icopyx_lf.bit | 0 fpga/fpga_icopyx_lf.v | 218 +++++++ .../fpga_allinone.v => fpga/fpga_icopyx_top.v | 80 ++- fpga/fpga_pm3_felica.bit | Bin 0 -> 42176 bytes fpga/fpga_pm3_hf.bit | Bin 0 -> 42172 bytes fpga/fpga_pm3_hf_15.bit | Bin 0 -> 42175 bytes fpga/fpga_pm3_lf.bit | Bin 0 -> 42172 bytes fpga/fpga_pm3_top.v | 438 +++++++++++++ {fpga-xc2s30 => fpga}/hi_flite.v | 66 +- {fpga-xc2s30 => fpga}/hi_get_trace.v | 40 +- {fpga-xc2s30 => fpga}/hi_iso14443a.v | 55 +- {fpga-xc2s30 => fpga}/hi_reader.v | 42 +- {fpga-xc2s30 => fpga}/hi_reader_15.v | 43 +- {fpga-xc2s30 => fpga}/hi_simulate.v | 37 +- {fpga-xc2s30 => fpga}/hi_sniffer.v | 49 +- {fpga-xc2s30 => fpga}/lf_edge_detect.v | 49 +- {fpga-xc2s30 => fpga}/lo_adc.v | 50 +- {fpga-xc2s30 => fpga}/lo_edge_detect.v | 56 +- {fpga-xc2s30 => fpga}/lo_passthru.v | 29 +- {fpga-xc2s30 => fpga}/lo_read.v | 36 +- {fpga-xc2s30 => fpga}/lo_simulate.v | 42 +- .../lp20khz_1MSa_iir_filter.v | 7 +- {fpga-xc2s30 => fpga}/min_max_tracker.v | 9 +- fpga/mux16.v | 50 ++ {fpga-xc3s100e => fpga}/mux2_onein.v | 13 +- {fpga-xc3s100e => fpga}/mux2_oneout.v | 13 +- fpga-xc2s30/util.v => fpga/mux8.v | 30 +- {fpga-xc2s30 => fpga}/tests/Makefile | 0 .../tests/plot_edgedetect.py | 0 {fpga-xc2s30 => fpga/tests}/sim.tcl | 0 .../pcf7931_read_1MSA_data.filtered.gold | 0 .../tb_data/pcf7931_read_1MSA_data.high.gold | 0 .../tb_data/pcf7931_read_1MSA_data.highz.gold | 0 .../tests/tb_data/pcf7931_read_1MSA_data.in | 0 .../tb_data/pcf7931_read_1MSA_data.low.gold | 0 .../tb_data/pcf7931_read_1MSA_data.lowz.gold | 0 .../tb_data/pcf7931_read_1MSA_data.max.gold | Bin .../tb_data/pcf7931_read_1MSA_data.min.gold | 0 .../tb_data/pcf7931_read_1MSA_data.state.gold | Bin .../tests/tb_data/pcf7931_read_1MSA_data.time | Bin .../pcf7931_read_1MSA_data.toggle.gold | Bin ...pcf7931_write1byte_1MSA_data.filtered.gold | 0 .../pcf7931_write1byte_1MSA_data.high.gold | 0 .../pcf7931_write1byte_1MSA_data.highz.gold | 0 .../tb_data/pcf7931_write1byte_1MSA_data.in | 0 .../pcf7931_write1byte_1MSA_data.low.gold | 0 .../pcf7931_write1byte_1MSA_data.lowz.gold | 0 .../pcf7931_write1byte_1MSA_data.max.gold | Bin .../pcf7931_write1byte_1MSA_data.min.gold | 0 .../pcf7931_write1byte_1MSA_data.state.gold | Bin .../tb_data/pcf7931_write1byte_1MSA_data.time | Bin .../pcf7931_write1byte_1MSA_data.toggle.gold | Bin .../tests/tb_lf_edge_detect.v | 0 .../tests/tb_lp20khz_1MSa_iir_filter.v | 0 .../tests/tb_min_max_tracker.v | 0 {fpga-xc2s30 => fpga/tests}/testbed_fpga.v | 0 .../tests}/testbed_hi_read_tx.v | 0 .../tests}/testbed_hi_simulate.v | 0 {fpga-xc2s30 => fpga/tests}/testbed_lo_read.v | 0 .../tests}/testbed_lo_simulate.v | 0 fpga/xc2s30-5-vq100.ucf | 45 ++ fpga/xc3s100e-4-vq100.ucf | 48 ++ tools/fpga_compress/fpga_compress.c | 24 +- 114 files changed, 1852 insertions(+), 4814 deletions(-) delete mode 100644 fpga-xc2s30/Makefile delete mode 100644 fpga-xc2s30/fpga.ucf delete mode 100644 fpga-xc2s30/fpga_felica.bit delete mode 100644 fpga-xc2s30/fpga_felica.v delete mode 100644 fpga-xc2s30/fpga_hf.bit delete mode 100644 fpga-xc2s30/fpga_hf.v delete mode 100644 fpga-xc2s30/fpga_hf_15.bit delete mode 100644 fpga-xc2s30/fpga_hf_15.v delete mode 100644 fpga-xc2s30/fpga_lf.bit delete mode 100644 fpga-xc2s30/fpga_lf.v delete mode 100644 fpga-xc2s30/go.bat delete mode 100644 fpga-xc2s30/xst_felica.scr delete mode 100644 fpga-xc2s30/xst_hf.scr delete mode 100644 fpga-xc2s30/xst_hf_15.scr delete mode 100644 fpga-xc2s30/xst_lf.scr delete mode 100644 fpga-xc3s100e/.gitignore delete mode 100644 fpga-xc3s100e/clk_divider.v delete mode 100755 fpga-xc3s100e/compile.sh delete mode 100644 fpga-xc3s100e/define.v delete mode 100644 fpga-xc3s100e/fpga.ucf delete mode 100644 fpga-xc3s100e/fpga_hf.bit delete mode 100644 fpga-xc3s100e/fpga_hfmod.v delete mode 100644 fpga-xc3s100e/fpga_lfmod.v delete mode 100644 fpga-xc3s100e/hi_flite.v delete mode 100644 fpga-xc3s100e/hi_get_trace.v delete mode 100644 fpga-xc3s100e/hi_iso14443a.v delete mode 100644 fpga-xc3s100e/hi_reader.v delete mode 100644 fpga-xc3s100e/hi_simulate.v delete mode 100644 fpga-xc3s100e/hi_sniffer.v delete mode 100644 fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise delete mode 100644 fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl delete mode 100644 fpga-xc3s100e/lf_edge_detect.v delete mode 100644 fpga-xc3s100e/lo_adc.v delete mode 100644 fpga-xc3s100e/lo_edge_detect.v delete mode 100644 fpga-xc3s100e/lo_passthru.v delete mode 100644 fpga-xc3s100e/lo_read.v delete mode 100644 fpga-xc3s100e/lp20khz_1MSa_iir_filter.v delete mode 100644 fpga-xc3s100e/min_max_tracker.v delete mode 100644 fpga-xc3s100e/util.v create mode 100644 fpga/Makefile rename {fpga-xc2s30 => fpga}/clk_divider.v (91%) create mode 100644 fpga/define.v rename fpga-xc3s100e/fpga_felica.bit => fpga/fpga_icopyx_felica.bit (100%) create mode 100644 fpga/fpga_icopyx_hf.bit create mode 100644 fpga/fpga_icopyx_hf.v rename fpga-xc3s100e/fpga_lf.bit => fpga/fpga_icopyx_hf_15.bit (100%) create mode 100644 fpga/fpga_icopyx_lf.bit create mode 100644 fpga/fpga_icopyx_lf.v rename fpga-xc3s100e/fpga_allinone.v => fpga/fpga_icopyx_top.v (61%) create mode 100644 fpga/fpga_pm3_felica.bit create mode 100644 fpga/fpga_pm3_hf.bit create mode 100644 fpga/fpga_pm3_hf_15.bit create mode 100644 fpga/fpga_pm3_lf.bit create mode 100644 fpga/fpga_pm3_top.v rename {fpga-xc2s30 => fpga}/hi_flite.v (92%) rename {fpga-xc2s30 => fpga}/hi_get_trace.v (86%) rename {fpga-xc2s30 => fpga}/hi_iso14443a.v (97%) rename {fpga-xc2s30 => fpga}/hi_reader.v (95%) rename {fpga-xc2s30 => fpga}/hi_reader_15.v (96%) rename {fpga-xc2s30 => fpga}/hi_simulate.v (91%) rename {fpga-xc2s30 => fpga}/hi_sniffer.v (69%) rename {fpga-xc2s30 => fpga}/lf_edge_detect.v (72%) rename {fpga-xc2s30 => fpga}/lo_adc.v (74%) rename {fpga-xc2s30 => fpga}/lo_edge_detect.v (67%) rename {fpga-xc2s30 => fpga}/lo_passthru.v (82%) rename {fpga-xc2s30 => fpga}/lo_read.v (80%) rename {fpga-xc2s30 => fpga}/lo_simulate.v (79%) rename {fpga-xc2s30 => fpga}/lp20khz_1MSa_iir_filter.v (96%) rename {fpga-xc2s30 => fpga}/min_max_tracker.v (95%) create mode 100644 fpga/mux16.v rename {fpga-xc3s100e => fpga}/mux2_onein.v (70%) rename {fpga-xc3s100e => fpga}/mux2_oneout.v (68%) rename fpga-xc2s30/util.v => fpga/mux8.v (68%) rename {fpga-xc2s30 => fpga}/tests/Makefile (100%) rename {fpga-xc2s30 => fpga}/tests/plot_edgedetect.py (100%) mode change 100755 => 100644 rename {fpga-xc2s30 => fpga/tests}/sim.tcl (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.high.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.highz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.in (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.low.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.max.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.min.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.state.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.time (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.in (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.time (100%) rename {fpga-xc2s30 => fpga}/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold (100%) rename {fpga-xc2s30 => fpga}/tests/tb_lf_edge_detect.v (100%) rename {fpga-xc2s30 => fpga}/tests/tb_lp20khz_1MSa_iir_filter.v (100%) rename {fpga-xc2s30 => fpga}/tests/tb_min_max_tracker.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_fpga.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_hi_read_tx.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_hi_simulate.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_lo_read.v (100%) rename {fpga-xc2s30 => fpga/tests}/testbed_lo_simulate.v (100%) create mode 100644 fpga/xc2s30-5-vq100.ucf create mode 100644 fpga/xc3s100e-4-vq100.ucf diff --git a/.gitignore b/.gitignore index 8469c8449..30cc1020a 100644 --- a/.gitignore +++ b/.gitignore @@ -80,17 +80,7 @@ tools/mfd_aes_brute/mfd_aes_brute tools/mfd_aes_brute/mfd_multi_brute tools/mfd_aes_brute/brute_key -fpga/* -!fpga/tests -!fpga/fpga_lf.bit -!fpga/fpga_hf.bit -!fpga/*.v -!fpga/Makefile -!fpga/fpga.ucf -!fpga/xst_lf.scr -!fpga/xst_hf.scr -!fpga/go.bat -!fpga/sim.tcl +fpga/__build* # offcial dumps folder dumps/* diff --git a/armsrc/Makefile b/armsrc/Makefile index 5203b0292..c481a6f22 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -103,9 +103,6 @@ endif # Generic standalone Mode injection of source code include Standalone/Makefile.inc -#the FPGA bitstream files. Note: order matters! -FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit fpga_felica.bit fpga_hf_15.bit - #the lz4 source files required for decompressing the fpga config at run time SRC_LZ4 = lz4.c #additional defines required to compile lz4 diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 6f8dd7a0b..6715aa962 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -404,16 +404,22 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 /* Four byte length field */ current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 24; current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 16; - numbytes += 2; - default: /* Fall through, two byte length field */ + current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 8; + current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 0; + numbytes += 4; + if (current_length > 300*1024) { + /* section e should never exceed about 300KB, if the length is too big limit it but still send the bitstream just in case */ + current_length = 300*1024; + } + break; + default: /* Two byte length field */ current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 8; current_length += get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer) << 0; numbytes += 2; - } - - if (current_name != 'e' && current_length > 255) { - /* Maybe a parse error */ - break; + if (current_length > 64) { + /* if text field is too long, keep it but truncate it */ + current_length = 64; + } } if (current_name == section_name) { diff --git a/common_arm/Makefile.common b/common_arm/Makefile.common index 99f4d9ecd..18d931b46 100644 --- a/common_arm/Makefile.common +++ b/common_arm/Makefile.common @@ -44,7 +44,7 @@ OBJDIR = obj INCLUDE = -I../include -I../common_arm -I../common_fpga -I../common -I. # Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the lz4 directory -VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga-$(PLATFORM_FPGA) ../armsrc/Standalone +VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga ../armsrc/Standalone INCLUDES = ../include/proxmark3_arm.h ../include/at91sam7s512.h ../include/config_gpio.h ../include/pm3_cmd.h diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index a65514784..9679382ce 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -92,18 +92,26 @@ PLTNAME = Unknown Platform PLATFORM_FPGA = fpga-undefined ifeq ($(PLATFORM),PM3RDV4) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DRDV4 PLTNAME = Proxmark3 RDV4 PLATFORM_FPGA = xc2s30 RDV4 = yes else ifeq ($(PLATFORM),PM3OTHER) $(warning PLATFORM=PM3OTHER is deprecated, please use PLATFORM=PM3GENERIC) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLTNAME = Proxmark3 generic target PLATFORM_FPGA = xc2s30 else ifeq ($(PLATFORM),PM3GENERIC) + # FPGA bitstream files, the order matters! + FPGA_BITSTREAMS = fpga_pm3_lf.bit fpga_pm3_hf.bit fpga_pm3_felica.bit fpga_pm3_hf_15.bit PLTNAME = Proxmark3 generic target PLATFORM_FPGA = xc2s30 else ifeq ($(PLATFORM),PM3ICOPYX) + # FPGA bitstream files, the order matters - only hf has a bitstream, the other 3 files are 0 bytes + FPGA_BITSTREAMS = fpga_icopyx_lf.bit fpga_icopyx_hf.bit fpga_icopyx_felica.bit fpga_icopyx_hf_15.bit PLATFORM_DEFS = -DWITH_FLASH -DICOPYX -DXC3 PLTNAME = iCopy-X with XC3S100E PLATFORM_FPGA = xc3s100e @@ -246,6 +254,7 @@ export PLATFORM_DEFS export PLATFORM_DEFS_INFO export PLATFORM_DEFS_INFO_STANDALONE export PLATFORM_CHANGED +export FPGA_BITSTREAMS $(info ===================================================================) $(info Version info: $(shell tools/mkversion.sh --short 2>/dev/null || ../tools/mkversion.sh --short 2>/dev/null)) diff --git a/fpga-xc2s30/Makefile b/fpga-xc2s30/Makefile deleted file mode 100644 index 2bf9273ba..000000000 --- a/fpga-xc2s30/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# -# FPGA Makefile -# -RMDIR = rm -rf -# rmdir only if dir is empty, tolerate failure -RMDIR_SOFT = -rmdir -# -all: fpga_lf.bit fpga_hf.bit fpga_felica.bit fpga_hf_15.bit -clean: - $(Q)$(RM) *.bgn *.drc *.ncd *.ngd *_par.xrpt *-placed.* *-placed_pad.* *_usage.xml xst_hf.srp xst_lf.srp xst_felica.srp xst_hf_15.srp - $(Q)$(RM) *.map *.ngc *.xrpt *.pcf *.rbt *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst - $(Q)$(RMDIR) *_auto_* xst - -#fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_reader.v hi_iso14443a.v hi_sniffer.v hi_flite.v hi_get_trace.v -fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_reader.v hi_iso14443a.v hi_sniffer.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr - -fpga_felica.ngc: fpga_felica.v fpga.ucf xst_felica.scr util.v hi_simulate.v hi_reader.v hi_sniffer.v hi_flite.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_felica.scr - -fpga_hf_15.ngc: fpga_hf_15.v fpga.ucf xst_hf_15.scr util.v hi_simulate.v hi_reader_15.v hi_sniffer.v hi_get_trace.v - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_hf_15.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 - $(Q)$(RM) $@ - $(info [-] XST $@) - $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_lf.scr - -%.ngd: %.ngc - $(Q)$(RM) $@ - $(info [-] NGD $@) - $(Q)$(XILINX_TOOLS_PREFIX)ngdbuild -aul -p xc2s30-5-vq100 -nt timestamp -uc fpga.ucf $< $@ - -%.ncd: %.ngd - $(Q)$(RM) $@ - $(info [-] MAP $@) - $(Q)$(XILINX_TOOLS_PREFIX)map -p xc2s30-5-vq100 $< - -%-placed.ncd: %.ncd - $(Q)$(RM) $@ - $(info [-] PAR $@) - $(Q)$(XILINX_TOOLS_PREFIX)par $< $@ - -%.bit: %-placed.ncd - $(Q)$(RM) $@ $*.drc $*.rbt - $(info [=] BITGEN $@) - $(Q)$(XILINX_TOOLS_PREFIX)bitgen $< $@ - -.PHONY: all clean help -help: - @echo Possible targets: - @echo + all - Make fpga.bit, the FPGA bitstream - @echo + clean - Clean intermediate files, does not clean fpga.bit - diff --git a/fpga-xc2s30/fpga.ucf b/fpga-xc2s30/fpga.ucf deleted file mode 100644 index f20e2da02..000000000 --- a/fpga-xc2s30/fpga.ucf +++ /dev/null @@ -1,54 +0,0 @@ -# See the schematic for the pin assignment. - -NET "adc_d<0>" LOC = "P62" ; -NET "adc_d<1>" LOC = "P60" ; -NET "adc_d<2>" LOC = "P58" ; -NET "adc_d<3>" LOC = "P57" ; -NET "adc_d<4>" LOC = "P56" ; -NET "adc_d<5>" LOC = "P55" ; -NET "adc_d<6>" LOC = "P54" ; -NET "adc_d<7>" LOC = "P53" ; -#NET "cross_hi" LOC = "P88" ; -#NET "miso" LOC = "P40" ; -#PACE: Start of Constraints generated by PACE - -#PACE: Start of PACE I/O Pin Assignments -NET "adc_clk" LOC = "P46" ; -NET "adc_noe" LOC = "P47" ; -NET "ck_1356meg" LOC = "P91" ; -NET "ck_1356megb" LOC = "P93" ; -NET "cross_lo" LOC = "P87" ; -NET "dbg" LOC = "P22" ; -NET "mosi" LOC = "P43" ; -NET "ncs" LOC = "P44" ; -NET "pck0" LOC = "P36" ; -NET "pwr_hi" LOC = "P80" ; -NET "pwr_lo" LOC = "P81" ; -NET "pwr_oe1" LOC = "P82" ; -NET "pwr_oe2" LOC = "P83" ; -NET "pwr_oe3" LOC = "P84" ; -NET "pwr_oe4" LOC = "P86" ; -NET "spck" LOC = "P39" ; -NET "ssp_clk" LOC = "P71" ; -NET "ssp_din" LOC = "P32" ; -NET "ssp_dout" LOC = "P34" ; -NET "ssp_frame" LOC = "P31" ; - -#PACE: Start of PACE Area Constraints - -#PACE: Start of PACE Prohibit Constraints - -#PACE: End of Constraints generated by PACE - -# definition of Clock nets: -NET "ck_1356meg" TNM_NET = "clk_net_1356" ; -NET "ck_1356megb" TNM_NET = "clk_net_1356b" ; -NET "pck0" TNM_NET = "clk_net_pck0" ; -NET "spck" TNM_NET = "clk_net_spck" ; - -# Timing specs of clock nets: -TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; -TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; -TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; -TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; - diff --git a/fpga-xc2s30/fpga_felica.bit b/fpga-xc2s30/fpga_felica.bit deleted file mode 100644 index 30ea16e332b8d28b03a80605bc0531fd5864d0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42179 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 TrnK247mrmE101D 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%0A(wY9V~hc935OrEgcL>47@1) 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 QRvj=hFdRfoOF<0*0AvjO_5c6? diff --git a/fpga-xc2s30/fpga_hf.v b/fpga-xc2s30/fpga_hf.v deleted file mode 100644 index 8ee85e26b..000000000 --- a/fpga-xc2s30/fpga_hf.v +++ /dev/null @@ -1,255 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// -// 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 -// - - -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_TRACE_ENABLE 2 - -// Major modes: -`define FPGA_MAJOR_MODE_HF_READER 0 -`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 -`define FPGA_MAJOR_MODE_HF_ISO14443A 2 -`define FPGA_MAJOR_MODE_HF_SNIFF 3 -`define FPGA_MAJOR_MODE_HF_ISO18092 4 -`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 -`define FPGA_MAJOR_MODE_OFF 7 - -// Options for the generic HF reader -`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 -`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 -`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 -`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 -`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 -`define FPGA_HF_READER_MODE_SNIFF_IQ 5 -`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 -`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 -`define FPGA_HF_READER_MODE_SEND_JAM 8 - -`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 -`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 -`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 - -// Options for the HF simulated tag, how to modulate -`define FPGA_HF_SIMULATOR_NO_MODULATION 0 -`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 -`define FPGA_HF_SIMULATOR_MODULATE_212K 2 -`define FPGA_HF_SIMULATOR_MODULATE_424K 4 -`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 - -// Options for ISO14443A -`define FPGA_HF_ISO14443A_SNIFFER 0 -`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 -`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 -`define FPGA_HF_ISO14443A_READER_LISTEN 3 -`define FPGA_HF_ISO14443A_READER_MOD 4 - -//options for ISO18092 / Felica -`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module -`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect -`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag - -`include "hi_reader.v" -`include "hi_simulate.v" -`include "hi_iso14443a.v" -`include "hi_sniffer.v" -`include "util.v" -// `include "hi_flite.v" -`include "hi_get_trace.v" - -module fpga_hf( - 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. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. - / Iceman, 2020 - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x x x -sub | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [8:0] conf_word; -reg trace_enable; - -// 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]) - `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; - `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; - endcase -end - -always @(posedge spck) -begin - if(~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -// select module (outputs) based on major mode -wire [2:0] major_mode = conf_word[8:6]; - -// configuring the HF reader -wire [1:0] subcarrier_frequency = conf_word[5:4]; -wire [3:0] minor_mode = conf_word[3: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. -//----------------------------------------------------------------------------- - -// 000 - HF reader -hi_reader hr( - ck_1356megb, - hr_pwr_lo, hr_pwr_hi, hr_pwr_oe1, hr_pwr_oe2, hr_pwr_oe3, hr_pwr_oe4, - adc_d, hr_adc_clk, - hr_ssp_frame, hr_ssp_din, ssp_dout, hr_ssp_clk, - hr_dbg, - subcarrier_frequency, minor_mode -); - -// 001 - HF simulated tag -hi_simulate hs( - ck_1356meg, - hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, - adc_d, hs_adc_clk, - hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, - hs_dbg, - minor_mode -); - -// 010 - HF ISO14443-A -hi_iso14443a hisn( - ck_1356meg, - hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, - adc_d, hisn_adc_clk, - hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, - hisn_dbg, - minor_mode -); - -// 011 - HF sniff -hi_sniffer he( - ck_1356megb, - he_pwr_lo, he_pwr_hi, he_pwr_oe1, he_pwr_oe2, he_pwr_oe3, he_pwr_oe4, - adc_d, he_adc_clk, - he_ssp_frame, he_ssp_din, he_ssp_clk -); - -// 100 - HF ISO18092 FeliCa -/* -hi_flite hfl( - 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, - hfl_dbg, - minor_mode -); -*/ - -// 101 - HF get trace -hi_get_trace gt( - ck_1356megb, - adc_d, trace_enable, major_mode, - gt_ssp_frame, gt_ssp_din, gt_ssp_clk -); - -// Major modes: -// 000 -- HF reader; subcarrier frequency and modulation depth selectable -// 001 -- HF simulated tag -// 010 -- HF ISO14443-A -// 011 -- HF sniff -// 100 -- HF ISO18092 FeliCa -// 101 -- HF get trace -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF - -// 000 001 010 011 100 101 110 111 - -mux8 mux_ssp_clk (major_mode, ssp_clk, hr_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, gt_ssp_clk, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, hr_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, gt_ssp_din, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, hr_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, gt_ssp_frame, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, hr_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, hr_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, hr_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, hr_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, hr_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, hr_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, hr_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, hr_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc2s30/fpga_hf_15.bit b/fpga-xc2s30/fpga_hf_15.bit deleted file mode 100644 index 5d99a0032db6c1aab1844c8e6596fd38bcc7fa4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42178 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 diff --git a/fpga-xc2s30/fpga_lf.v b/fpga-xc2s30/fpga_lf.v deleted file mode 100644 index bb9116f10..000000000 --- a/fpga-xc2s30/fpga_lf.v +++ /dev/null @@ -1,245 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// See LICENSE.txt for the text of the license. -//----------------------------------------------------------------------------- -// - - -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_SET_DIVISOR 2 -`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 - -// Major modes: -`define FPGA_MAJOR_MODE_LF_READER 0 -`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 -`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 -`define FPGA_MAJOR_MODE_LF_ADC 3 - -// Options for LF_READER -`define FPGA_LF_ADC_READER_FIELD 1 - -// Options for LF_EDGE_DETECT -`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 -`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 - -`include "lo_read.v" -`include "lo_passthru.v" -`include "lo_edge_detect.v" -`include "lo_adc.v" -`include "util.v" -`include "clk_divider.v" - -module fpga_lf( - 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. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - LF command - ---------- - shift_reg[15:12] == 4bit command - LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) - Current commands uses only 2bits. We have room for up to 4bits of commands total (7). - - LF data - ------- - shift_reg[11:0] == 12bit data - lf data is divided into MAJOR MODES and configuration values. - - The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) - 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) - 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF - 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening - 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling - 111 FPGA_MAJOR_MODE_OFF = turn off sampling. - - Each one of this major modes can have options. Currently these two major modes uses options. - - FPGA_MAJOR_MODE_LF_READER - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - - FPGA_MAJOR_MODE_LF_READER - ------------------------------------- - lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) - - You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at - divisor = 8bits shift_reg[7:0] - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - ------------------------------------------ - lf_ed_toggle_mode = 1bits - lf_ed_threshold = 8bits threshold defaults to 127 - - You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold - lf_ed_threshold = 8bits threshold value. - - conf_word 12bits - conf_word[8:6] = 3bit major mode. - conf_word[0] = 1bit lf_field - conf_word[1] = 1bit lf_ed_toggle_mode - conf_word[7:0] = 8bit divisor - conf_word[7:0] = 8bit threshold - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [7:0] divisor; -reg [7:0] lf_ed_threshold; -reg [11:0] conf_word; - -wire [2:0] major_mode = conf_word[8:6]; -wire lf_field = conf_word[0]; -wire lf_ed_toggle_mode = conf_word[1]; - -// Handles cmd / data frame from ARM -always @(posedge ncs) -begin - // 4 bit command - case (shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: - begin - // 12 bit data - conf_word <= shift_reg[11:0]; - if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) - begin - lf_ed_threshold <= 127; // default threshold - end - end - - `FPGA_CMD_SET_DIVISOR: - divisor <= shift_reg[7:0]; // 8bits - - `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: - lf_ed_threshold <= shift_reg[7:0]; // 8 bits - endcase -end - -// Receive 16bits of data from ARM here. -always @(posedge spck) -begin - if (~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- -wire [7:0] pck_cnt; -wire pck_divclk; -clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); - -lo_read lr( - pck0, pck_cnt, pck_divclk, - lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, - adc_d, lr_adc_clk, - lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg, lf_field -); - -lo_passthru lp( - pck_divclk, - lp_pwr_lo, lp_pwr_hi, lp_pwr_oe1, lp_pwr_oe2, lp_pwr_oe3, lp_pwr_oe4, - lp_adc_clk, - lp_ssp_din, ssp_dout, - cross_lo, - lp_dbg -); - -lo_edge_detect le( - pck0, pck_divclk, - le_pwr_lo, le_pwr_hi, le_pwr_oe1, le_pwr_oe2, le_pwr_oe3, le_pwr_oe4, - adc_d, le_adc_clk, - le_ssp_frame, ssp_dout, le_ssp_clk, - cross_lo, - le_dbg, - lf_field, - lf_ed_toggle_mode, lf_ed_threshold -); - -lo_adc la( - pck0, - la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4, - adc_d, la_adc_clk, - la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk, - la_dbg, divisor, - lf_field -); - -// Major modes: -// 000 -- LF reader (generic) -// 001 -- LF edge detect (generic) -// 010 -- LF passthrough -// 011 -- LF ADC (read/write) -// 100 -- unused -// 101 -- unused -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF -// 000 001 010 011 100 101 110 111 -mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, le_ssp_clk, 1'b0, la_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, lr_ssp_din, 1'b0, lp_ssp_din, la_ssp_din, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, lr_ssp_frame, le_ssp_frame, 1'b0, la_ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, lr_pwr_oe1, le_pwr_oe1, lp_pwr_oe1, la_pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, lr_pwr_oe2, le_pwr_oe2, lp_pwr_oe2, la_pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, lr_pwr_oe3, le_pwr_oe3, lp_pwr_oe3, la_pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, lr_pwr_oe4, le_pwr_oe4, lp_pwr_oe4, la_pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, lr_pwr_lo, le_pwr_lo, lp_pwr_lo, la_pwr_lo, 1'b0, 1'b0, 1'b1, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, lr_pwr_hi, le_pwr_hi, lp_pwr_hi, la_pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, lr_adc_clk, le_adc_clk, lp_adc_clk, la_adc_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, lr_dbg, le_dbg, lp_dbg, la_dbg, 1'b0, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc2s30/go.bat b/fpga-xc2s30/go.bat deleted file mode 100644 index d9704e08d..000000000 --- a/fpga-xc2s30/go.bat +++ /dev/null @@ -1,68 +0,0 @@ -@echo off - -rmdir/s/q xst - -del fpga_lf.ngc -xst -ifn xst_lf.scr -if errorlevel 0 goto ok1 -goto done -:ok1 - -del fpga_lf.ngd -ngdbuild -aul -p xc2s30-6vq100 -nt timestamp -uc fpga.ucf fpga_lf.ngc fpga_lf.ngd -if errorlevel 0 goto ok2 -goto done -:ok2 - -del fpga_lf.ncd -map -p xc2s30-6vq100 fpga_lf.ngd -if errorlevel 0 goto ok3 -goto done -:ok3 - -del fpga_lf-placed.ncd -par fpga_lf.ncd fpga_lf-placed.ncd -if errorlevel 0 goto ok4 -goto done -:ok4 - -del fpga_lf.bit fpga_lf.drc fpga_lf.rbt -bitgen -b fpga_lf-placed.ncd fpga_lf.bit -if errorlevel 0 goto ok5 -goto done -:ok5 - -del fpga_hf.ngc -xst -ifn xst_hf.scr -if errorlevel 0 goto ok6 -goto done -:ok6 - -del fpga_hf.ngd -ngdbuild -aul -p xc2s30-6vq100 -nt timestamp -uc fpga.ucf fpga_hf.ngc fpga_hf.ngd -if errorlevel 0 goto ok7 -goto done -:ok7 - -del fpga_hf.ncd -map -p xc2s30-6vq100 fpga_hf.ngd -if errorlevel 0 goto ok8 -goto done -:ok8 - -del fpga_hf-placed.ncd -par fpga_hf.ncd fpga_hf-placed.ncd -if errorlevel 0 goto ok9 -goto done -:ok9 - -del fpga_hf.bit fpga_hf.drc fpga_hf.rbt -bitgen -b fpga_hf-placed.ncd fpga_hf.bit -if errorlevel 0 goto ok10 -goto done -:ok10 - -echo okay -perl ..\tools\rbt2c.pl fpga_lf.rbt > ..\armsrc\fpgaimg.c - -:done diff --git a/fpga-xc2s30/xst_felica.scr b/fpga-xc2s30/xst_felica.scr deleted file mode 100644 index b069fab13..000000000 --- a/fpga-xc2s30/xst_felica.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_felica.v -ifmt Verilog -ofn fpga_felica.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_felica -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_hf.scr b/fpga-xc2s30/xst_hf.scr deleted file mode 100644 index dd2fdc859..000000000 --- a/fpga-xc2s30/xst_hf.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_hf.v -ifmt Verilog -ofn fpga_hf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_hf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_hf_15.scr b/fpga-xc2s30/xst_hf_15.scr deleted file mode 100644 index d8bb5ae7c..000000000 --- a/fpga-xc2s30/xst_hf_15.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_hf_15.v -ifmt Verilog -ofn fpga_hf_15.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_hf_15 -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc2s30/xst_lf.scr b/fpga-xc2s30/xst_lf.scr deleted file mode 100644 index 2d6c7e951..000000000 --- a/fpga-xc2s30/xst_lf.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga_lf.v -ifmt Verilog -ofn fpga_lf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_lf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga-xc3s100e/.gitignore b/fpga-xc3s100e/.gitignore deleted file mode 100644 index b21d41545..000000000 --- a/fpga-xc3s100e/.gitignore +++ /dev/null @@ -1,68 +0,0 @@ -# intermediate build files -*.bgn -*.bit -*.bld -*.cmd_log -*.drc -*.ll -*.lso -*.msd -*.msk -*.ncd -*.ngc -*.ngd -*.ngr -*.pad -*.par -*.pcf -*.prj -*.ptwx -*.rbb -*.rbd -*.stx -*.syr -*.twr -*.twx -*.unroutes -*.ut -*.xpi -*.xst -*_bitgen.xwbt -*_envsettings.html -*_map.map -*_map.mrp -*_map.ngm -*_map.xrpt -*_ngdbuild.xrpt -*_pad.csv -*_pad.txt -*_par.xrpt -*_summary.html -*_summary.xml -*_usage.xml -*_xst.xrpt - -# iMPACT generated files -_impactbatch.log -impact.xsl -impact_impact.xwbt -ise_impact.cmd -webtalk_impact.xml - -# Core Generator generated files -xaw2verilog.log - -# project-wide generated files -*.gise -par_usage_statistics.html -usage_statistics_webtalk.html -webtalk.log -webtalk_pn.xml - -# generated folders -iseconfig/ -xlnx_auto_0_xdb/ -xst/ -_ngo/ -_xmsgs/ -fpga_hf_xdb/tmp/ diff --git a/fpga-xc3s100e/clk_divider.v b/fpga-xc3s100e/clk_divider.v deleted file mode 100644 index 9a57879b0..000000000 --- a/fpga-xc3s100e/clk_divider.v +++ /dev/null @@ -1,25 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -module clk_divider(input clk, input [7:0] divisor, output [7:0] div_cnt, output div_clk); - - reg [7:0] div_cnt_ = 0; - reg div_clk_; - assign div_cnt = div_cnt_; - assign div_clk = div_clk_; - - always @(posedge clk) - begin - if(div_cnt == divisor) begin - div_cnt_ <= 8'd0; - div_clk_ = !div_clk_; - end else - div_cnt_ <= div_cnt_ + 1; - end - -endmodule - diff --git a/fpga-xc3s100e/compile.sh b/fpga-xc3s100e/compile.sh deleted file mode 100755 index 741ed0bb8..000000000 --- a/fpga-xc3s100e/compile.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -( - cd iseproj/fpga_hf - xtclsh fpga_hf.tcl run_process - mv fpga_hf.bit ../.. - git checkout fpga_hf.ise - git clean -dfx . -) diff --git a/fpga-xc3s100e/define.v b/fpga-xc3s100e/define.v deleted file mode 100644 index adced9003..000000000 --- a/fpga-xc3s100e/define.v +++ /dev/null @@ -1,49 +0,0 @@ -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_TRACE_ENABLE 2 - -// Major modes: -`define FPGA_MAJOR_MODE_HF_READER 0 -`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 -`define FPGA_MAJOR_MODE_HF_ISO14443A 2 -`define FPGA_MAJOR_MODE_HF_SNIFF 3 -`define FPGA_MAJOR_MODE_HF_ISO18092 4 -`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 -`define FPGA_MAJOR_MODE_OFF 7 - -// Options for the generic HF reader -`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 -`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 -`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 -`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 -`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 -`define FPGA_HF_READER_MODE_SNIFF_IQ 5 -`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 -`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 -`define FPGA_HF_READER_MODE_SEND_JAM 8 - -`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 -`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 -`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 - -// Options for the HF simulated tag, how to modulate -`define FPGA_HF_SIMULATOR_NO_MODULATION 0 -`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 -`define FPGA_HF_SIMULATOR_MODULATE_212K 2 -`define FPGA_HF_SIMULATOR_MODULATE_424K 4 -`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 - -// Options for ISO14443A -`define FPGA_HF_ISO14443A_SNIFFER 0 -`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 -`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 -`define FPGA_HF_ISO14443A_READER_LISTEN 3 -`define FPGA_HF_ISO14443A_READER_MOD 4 - -//options for ISO18092 / Felica -`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module -`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect -`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag diff --git a/fpga-xc3s100e/fpga.ucf b/fpga-xc3s100e/fpga.ucf deleted file mode 100644 index 4cb06a9d6..000000000 --- a/fpga-xc3s100e/fpga.ucf +++ /dev/null @@ -1,56 +0,0 @@ -# See the schematic for the pin assignment. - -#NET "cross_hi" LOC = "P88" ; -#NET "miso" LOC = "P40" ; - -# definition of Clock nets: -NET "ck_1356meg" TNM_NET = "clk_net_1356" ; -NET "ck_1356megb" TNM_NET = "clk_net_1356b" ; -NET "pck0" TNM_NET = "clk_net_pck0" ; -NET "spck" TNM_NET = "clk_net_spck" ; - -# Timing specs of clock nets: -TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; -TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; -TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; -TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; -NET "FPGA_SWITCH" CLOCK_DEDICATED_ROUTE = FALSE ; -#PACE: Start of Constraints generated by PACE - -#PACE: Start of PACE I/O Pin Assignments -NET "adc_clk" LOC = "P65" ; -NET "adc_d<0>" LOC = "P79" ; -NET "adc_d<1>" LOC = "P78" ; -NET "adc_d<2>" LOC = "P71" ; -NET "adc_d<3>" LOC = "P70" ; -NET "adc_d<4>" LOC = "P69" ; -NET "adc_d<5>" LOC = "P68" ; -NET "adc_d<6>" LOC = "P67" ; -NET "adc_d<7>" LOC = "P66" ; -NET "adc_noe" LOC = "P62" ; -NET "ck_1356meg" LOC = "p88" ; -NET "ck_1356megb" LOC = "p89" ; -NET "cross_lo" LOC = "P90" ; -NET "dbg" LOC = "P22" ; -NET "FPGA_SWITCH" LOC = "P38" ; -NET "mosi" LOC = "P43" ; -NET "ncs" LOC = "P40" ; -NET "pck0" LOC = "P36" ; -NET "pwr_hi" LOC = "P85" ; -NET "pwr_lo" LOC = "P83" ; -NET "PWR_LO_EN" LOC = "P94" ; -NET "pwr_oe1" LOC = "P84" ; -NET "pwr_oe2" LOC = "P91" ; -NET "pwr_oe3" LOC = "P92" ; -NET "pwr_oe4" LOC = "P86" ; -NET "spck" LOC = "P39" ; -NET "ssp_clk" LOC = "P33" ; -NET "ssp_din" LOC = "P32" ; -NET "ssp_dout" LOC = "P34" ; -NET "ssp_frame" LOC = "P27" ; - -#PACE: Start of PACE Area Constraints - -#PACE: Start of PACE Prohibit Constraints - -#PACE: End of Constraints generated by PACE diff --git a/fpga-xc3s100e/fpga_hf.bit b/fpga-xc3s100e/fpga_hf.bit deleted file mode 100644 index df1fb45f68487469f520ec7b21916ebd11098bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72742 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 D7Q&#N diff --git a/fpga-xc3s100e/fpga_hfmod.v b/fpga-xc3s100e/fpga_hfmod.v deleted file mode 100644 index 53040aead..000000000 --- a/fpga-xc3s100e/fpga_hfmod.v +++ /dev/null @@ -1,193 +0,0 @@ -//----------------------------------------------------------------------------- -// 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 -// Piwi, Feb 2019 -//----------------------------------------------------------------------------- - -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - - -//For ISE 10.1 PROJ,IDE auto include -//`include "hi_reader.v" -//`include "hi_simulate.v" -//`include "hi_iso14443a.v" -//`include "hi_sniffer.v" -//`include "util.v" -//`include "hi_flite.v" -//`include "hi_get_trace.v" - -module fpga_hfmod( - 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. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [8:0] conf_word; -reg trace_enable; - -// 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]) - `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; - `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; - endcase -end - -always @(posedge spck) -begin - if(~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -// select module (outputs) based on major mode -wire [2:0] major_mode = conf_word[8:6]; - -// configuring the HF reader -wire [1:0] subcarrier_frequency = conf_word[5:4]; -wire [3:0] minor_mode = conf_word[3: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. -//----------------------------------------------------------------------------- - -// 000 - HF reader -hi_reader hr( - ck_1356megb, - hr_pwr_lo, hr_pwr_hi, hr_pwr_oe1, hr_pwr_oe2, hr_pwr_oe3, hr_pwr_oe4, - adc_d, hr_adc_clk, - hr_ssp_frame, hr_ssp_din, ssp_dout, hr_ssp_clk, - hr_dbg, - subcarrier_frequency, minor_mode -); - -// 001 - HF simulated tag -hi_simulate hs( - ck_1356meg, - hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, - adc_d, hs_adc_clk, - hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, - hs_dbg, - minor_mode -); - -// 010 - HF ISO14443-A -hi_iso14443a hisn( - ck_1356meg, - hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, - adc_d, hisn_adc_clk, - hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, - hisn_dbg, - minor_mode -); - -// 011 - HF sniff -hi_sniffer he( - ck_1356megb, - he_pwr_lo, he_pwr_hi, he_pwr_oe1, he_pwr_oe2, he_pwr_oe3, he_pwr_oe4, - adc_d, he_adc_clk, - he_ssp_frame, he_ssp_din, he_ssp_clk -); - -// 100 - HF ISO18092 FeliCa - -hi_flite hfl( - 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, - hfl_dbg, - minor_mode -); - - -// 101 - HF get trace -hi_get_trace gt( - ck_1356megb, - adc_d, trace_enable, major_mode, - gt_ssp_frame, gt_ssp_din, gt_ssp_clk -); - -// Major modes: -// 000 -- HF reader; subcarrier frequency and modulation depth selectable -// 001 -- HF simulated tag -// 010 -- HF ISO14443-A -// 011 -- HF sniff -// 100 -- HF ISO18092 FeliCa -// 101 -- HF get trace -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF - -// 000 001 010 011 100 101 110 111 - -mux8 mux_ssp_clk (major_mode, ssp_clk, hr_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, gt_ssp_clk, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, hr_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, gt_ssp_din, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, hr_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, gt_ssp_frame, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, hr_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, hr_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, hr_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, hr_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, hr_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, hr_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, hr_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, hr_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc3s100e/fpga_lfmod.v b/fpga-xc3s100e/fpga_lfmod.v deleted file mode 100644 index 5982a74e8..000000000 --- a/fpga-xc3s100e/fpga_lfmod.v +++ /dev/null @@ -1,236 +0,0 @@ -//----------------------------------------------------------------------------- -// Jonathan Westhues, March 2006 -// iZsh , June 2014 -// Piwi, Feb 2019 -// Anon, 2019 -//----------------------------------------------------------------------------- -// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h -// Note: the definitions here are without shifts - -// Commands: -`define FPGA_CMD_SET_CONFREG 1 -`define FPGA_CMD_SET_DIVISOR 2 -`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 - -// Major modes: -`define FPGA_MAJOR_MODE_LF_READER 0 -`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 -`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 -`define FPGA_MAJOR_MODE_LF_ADC 3 - -// Options for LF_READER -`define FPGA_LF_ADC_READER_FIELD 1 - -// Options for LF_EDGE_DETECT -`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 -`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 - -//For ISE 10.1 PROJ,IDE auto include -//`include "lo_read.v" -//`include "lo_passthru.v" -//`include "lo_edge_detect.v" -//`include "lo_adc.v" -//`include "util.v" -//`include "clk_divider.v" - -module fpga_lfmod( - 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, - output PWR_LO_EN -); - -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -/* - Attempt to write up how its hooked up. Iceman 2020. - - Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() - Send 16 bit command / data pair to FPGA - The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - where - C is 4bit command - D is 12bit data - - shift_reg receive this 16bit frame - - LF command - ---------- - shift_reg[15:12] == 4bit command - LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) - Current commands uses only 2bits. We have room for up to 4bits of commands total (7). - - LF data - ------- - shift_reg[11:0] == 12bit data - lf data is divided into MAJOR MODES and configuration values. - - The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) - 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) - 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF - 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening - 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling - 111 FPGA_MAJOR_MODE_OFF = turn off sampling. - - Each one of this major modes can have options. Currently these two major modes uses options. - - FPGA_MAJOR_MODE_LF_READER - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - - FPGA_MAJOR_MODE_LF_READER - ------------------------------------- - lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) - - You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at - divisor = 8bits shift_reg[7:0] - - FPGA_MAJOR_MODE_LF_EDGE_DETECT - ------------------------------------------ - lf_ed_toggle_mode = 1bits - lf_ed_threshold = 8bits threshold defaults to 127 - - You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold - lf_ed_threshold = 8bits threshold value. - - conf_word 12bits - conf_word[7:5] = 3bit major mode. - conf_word[0] = 1bit lf_field - conf_word[1] = 1bit lf_ed_toggle_mode - conf_word[7:0] = 8bit divisor - conf_word[7:0] = 8bit threshold - ------+--------- frame layout -------------------- -bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ------+------------------------------------------- -cmd | x x x x -major| x x x -opt | x x -divi | x x x x x x x x -thres| x x x x x x x x ------+------------------------------------------- -*/ - -reg [15:0] shift_reg; -reg [7:0] divisor; -reg [7:0] lf_ed_threshold; -reg [11:0] conf_word; - -wire [2:0] major_mode = conf_word[8:6]; -wire lf_field = conf_word[0]; -wire lf_ed_toggle_mode = conf_word[1]; - -// Handles cmd / data frame from ARM -always @(posedge ncs) -begin - // 4 bit command - case (shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: - begin - // 12 bit data - conf_word <= shift_reg[11:0]; - if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) - begin - lf_ed_threshold <= 127; // default threshold - end - end - - `FPGA_CMD_SET_DIVISOR: - divisor <= shift_reg[7:0]; // 8bits - - `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: - lf_ed_threshold <= shift_reg[7:0]; // 8 bits - endcase -end - -// Receive 16bits of data from ARM here. -always @(posedge spck) -begin - if (~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- -wire [7:0] pck_cnt; -wire pck_divclk; -clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); - -lo_read lr( - pck0, pck_cnt, pck_divclk, - lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, - adc_d, lr_adc_clk, - lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg, lf_field -); - -lo_passthru lp( - pck_divclk, - lp_pwr_lo, lp_pwr_hi, lp_pwr_oe1, lp_pwr_oe2, lp_pwr_oe3, lp_pwr_oe4, - lp_adc_clk, - lp_ssp_din, ssp_dout, - cross_lo, - lp_dbg -); - -lo_edge_detect le( - pck0, pck_divclk, - le_pwr_lo, le_pwr_hi, le_pwr_oe1, le_pwr_oe2, le_pwr_oe3, le_pwr_oe4, - adc_d, le_adc_clk, - le_ssp_frame, ssp_dout, le_ssp_clk, - cross_lo, - le_dbg, - lf_field, - lf_ed_toggle_mode, lf_ed_threshold -); - -lo_adc la( - pck0, - la_pwr_lo, la_pwr_hi, la_pwr_oe1, la_pwr_oe2, la_pwr_oe3, la_pwr_oe4, - adc_d, la_adc_clk, - la_ssp_frame, la_ssp_din, ssp_dout, la_ssp_clk, - la_dbg, divisor, - lf_field -); - -// Major modes: -// 000 -- LF reader (generic) -// 001 -- LF edge detect (generic) -// 010 -- LF passthrough -// 011 -- LF ADC (read/write) -// 100 -- unused -// 101 -- unused -// 110 -- unused -// 111 -- FPGA_MAJOR_MODE_OFF -// 000 001 010 011 100 101 110 111 -mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, le_ssp_clk, 1'b0, la_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, lr_ssp_din, 1'b0, lp_ssp_din, la_ssp_din, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, lr_ssp_frame, le_ssp_frame, 1'b0, la_ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, lr_pwr_oe1, le_pwr_oe1, lp_pwr_oe1, la_pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, lr_pwr_oe2, le_pwr_oe2, lp_pwr_oe2, la_pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, lr_pwr_oe3, le_pwr_oe3, lp_pwr_oe3, la_pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, lr_pwr_oe4, le_pwr_oe4, lp_pwr_oe4, la_pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, lr_pwr_lo, le_pwr_lo, lp_pwr_lo, la_pwr_lo, 1'b0, 1'b0, 1'b1, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, lr_pwr_hi, le_pwr_hi, lp_pwr_hi, la_pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, lr_adc_clk, le_adc_clk, lp_adc_clk, la_adc_clk, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, lr_dbg, le_dbg, lp_dbg, la_dbg, 1'b0, 1'b0, 1'b0, 1'b0); -mux8 mux_ant (major_mode, PWR_LO_EN, 1'b1, 1'b1, 1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga-xc3s100e/hi_flite.v b/fpga-xc3s100e/hi_flite.v deleted file mode 100644 index 6cb87825e..000000000 --- a/fpga-xc3s100e/hi_flite.v +++ /dev/null @@ -1,368 +0,0 @@ -/* - 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) - - Speeds supported: only 212 kbps (fc/64) for now. Todo: 414 kbps - though for reader, the selection has to come from ARM. modulation waits for market sprocket -doesn't really mean anything - - mod_type: bits 210: - bit 2 : reader drive/power on/off - bit 1 : speed bit, 0 : 212, 1 :424 - bit 0 : listen or modulate -*/ - -module hi_flite( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - 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; - output dbg; - input [3:0] mod_type; - -assign dbg = 0; - -wire power = mod_type[2]; -wire speed = mod_type[1]; -wire disabl = mod_type[0]; - -// Most off, oe4 for modulation; -// Trying reader emulation (would presumably just require switching power on, but I am not sure) -assign pwr_lo = 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 - -`define min_bitdelay_212 8 -//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 bitmlen_212 63 // bit transition edge - -`define bithalf_424 16 // half-bit length for 212 kbit -`define bitmlen_424 31 // bit transition edge - -wire [7:0] bithalf = speed ? `bithalf_424 : `bithalf_212; -wire [7:0] bitmlen = speed ? `bitmlen_424 : `bitmlen_212; - - -//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); - -//maybe change it so that ARM sends preamble as well. -//then: ready bits sent to ARM, 8 bits sent from ARM (all ones), then preamble (all zeros, presumably) - which starts modulation - -always @(negedge adc_clk) -begin - //count fc/64 - transfer bits to ARM at the rate they are received - if( ((~speed) && (ssp_cnt[5:0] == 6'b000000)) || (speed && (ssp_cnt[4:0] == 5'b00000))) - begin - ssp_clk <= 1'b1; - ssp_din <= curbit; - end - if( ( (~speed) && (ssp_cnt[5:0] == 6'b100000)) ||(speed && ssp_cnt[4:0] == 5'b10000)) - 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(( (~speed) && (ssp_cnt[8:0] == 9'd31)) || (speed && ssp_cnt[7:0] == 8'd15)) - begin - ssp_frame <= 1'b1; - end - if(( (~speed) && (ssp_cnt[8:0] == 9'b1011111)) || (speed &&ssp_cnt[7:0] == 8'b101111) ) - 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; - -// 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. -reg[7:0] mid = 8'd128; - -// 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 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. might remove those? - - -//we need some way to flush bit_counts triggers on mod_type changes don't compile -reg dlay; -always @(negedge adc_clk) // every data ping? -begin - //envelope follow code... - //////////// - if (fccount == bitmlen) - begin - if ((~try_sync) && (adc_d < curminthres) && disabl ) - begin - fccount <= 1; - end - else - begin - fccount <= 0; - end - dlay <= ssp_dout; - if (bit_counts > 768) // should be over ts0 now, without ARM interference... stop counting... - begin - bit_counts <= 0; - end - else - if (power) - bit_counts <= 0; - else - bit_counts <= bit_counts + 1; - end - else - begin - if((~try_sync) && (adc_d < curminthres) && disabl) - begin - fccount <= 1; - end - else - begin - fccount <= fccount + 1; - end - end - - // rising edge - if (adc_d > curmaxthres) - begin - case (state) - 0: begin - curmax <= adc_d > `imax? adc_d : `imax; - 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 < `imin ? adc_d : `imin; - state <= 1; - end - default: - begin - end - endcase - after_hysteresis <= 0; - if (~try_sync ) //begin modulation, lower edge... - begin - try_sync <= 1; - 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. - 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 - - - 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) - 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_d < curminthres) - mid <= 8'd127; - else - begin - if (after_hysteresis) - begin - mid <= 8'd129; - end - else - begin - mid <= 8'd127; - end - end - - end - else - begin - if (fccount==bitmlen) - begin - // fccount <= 0; - prv <= (mid > 128) ? 1 : 0; - mid <= 128; - end - else - begin - // minimum-maximum calc - if(adc_d > curmaxthres) - mid <= mid + 1; - else if (adc_d < curminthres) - mid <= mid - 1; - else - begin - if (after_hysteresis) - begin - mid <= mid + 1; - end - else - begin - mid <= mid - 1; - end - end - end - end - end - else - begin - end -// sending <= 0; -end -//put modulation here to maintain the correct clock. Seems that some readers are sensitive to that -reg pwr_hi; -reg pwr_oe1; -reg pwr_oe2; -reg pwr_oe3; -reg pwr_oe4; - -wire mod = ((fccount >= bithalf) ^ dlay) & (~disabl); - -always @(ck_1356meg or ssp_dout or power or disabl or mod) -begin - if (power) - begin - pwr_hi <= ck_1356meg; - pwr_oe1 <= 1'b0;//mod; - pwr_oe2 <= 1'b0;//mod; - pwr_oe3 <= 1'b0;//mod; - pwr_oe4 <= mod;//1'b0; - end - else - begin - pwr_hi <= 1'b0; - pwr_oe1 <= 1'b0; - pwr_oe2 <= 1'b0; - pwr_oe3 <= 1'b0; - pwr_oe4 <= mod; - end -end - -endmodule diff --git a/fpga-xc3s100e/hi_get_trace.v b/fpga-xc3s100e/hi_get_trace.v deleted file mode 100644 index 2b1cf393b..000000000 --- a/fpga-xc3s100e/hi_get_trace.v +++ /dev/null @@ -1,164 +0,0 @@ -//----------------------------------------------------------------------------- -// -// piwi, Feb 2019 -//----------------------------------------------------------------------------- -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - -module hi_get_trace( - ck_1356megb, - adc_d, trace_enable, major_mode, - ssp_frame, ssp_din, ssp_clk -); - input ck_1356megb; - input [7:0] adc_d; - input trace_enable; - input [2:0] major_mode; - output ssp_frame, ssp_din, ssp_clk; - -// clock divider -reg [6:0] clock_cnt; -always @(negedge ck_1356megb) -begin - clock_cnt <= clock_cnt + 1; -end - -// sample at 13,56MHz / 8. The highest signal frequency (subcarrier) is 848,5kHz, i.e. in this case we oversample by a factor of 2 -reg [2:0] sample_clock; -always @(negedge ck_1356megb) -begin - if (sample_clock == 3'd7) - sample_clock <= 3'd0; - else - sample_clock <= sample_clock + 1; -end - - -reg [11:0] addr; -reg [11:0] start_addr; -reg [2:0] previous_major_mode; -reg write_enable1; -reg write_enable2; -always @(negedge ck_1356megb) -begin - previous_major_mode <= major_mode; - if (major_mode == `FPGA_MAJOR_MODE_HF_GET_TRACE) - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - if (previous_major_mode != `FPGA_MAJOR_MODE_HF_GET_TRACE) // just switched into GET_TRACE mode - addr <= start_addr; - if (clock_cnt == 7'd0) - begin - if (addr == 12'd3071) - addr <= 12'd0; - else - addr <= addr + 1; - end - end - else if (major_mode != `FPGA_MAJOR_MODE_OFF) - begin - if (trace_enable) - begin - if (addr[11] == 1'b0) - begin - write_enable1 <= 1'b1; - write_enable2 <= 1'b0; - end - else - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b1; - end - if (sample_clock == 3'b000) - begin - if (addr == 12'd3071) - begin - addr <= 12'd0; - write_enable1 <= 1'b1; - write_enable2 <= 1'b0; - end - else - begin - addr <= addr + 1; - end - end - end - else - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - start_addr <= addr; - end - end - else // major_mode == `FPGA_MAJOR_MODE_OFF - begin - write_enable1 <= 1'b0; - write_enable2 <= 1'b0; - if (previous_major_mode != `FPGA_MAJOR_MODE_OFF && previous_major_mode != `FPGA_MAJOR_MODE_HF_GET_TRACE) // just switched off - begin - start_addr <= addr; - end - end -end - - -// (2+1)k RAM -reg [7:0] D_out1, D_out2; -reg [7:0] ram1 [2047:0]; // 2048 u8 -reg [7:0] ram2 [1023:0]; // 1024 u8 - -always @(negedge ck_1356megb) -begin - if (write_enable1) - begin - ram1[addr[10:0]] <= adc_d; - D_out1 <= adc_d; - end - else - D_out1 <= ram1[addr[10:0]]; - if (write_enable2) -begin - ram2[addr[9:0]] <= adc_d; - D_out2 <= adc_d; - end - else - D_out2 <= ram2[addr[9:0]]; -end - - -// SSC communication to ARM -reg ssp_clk; -reg ssp_frame; -reg [7:0] shift_out; - -always @(negedge ck_1356megb) -begin - if (clock_cnt[3:0] == 4'd0) // update shift register every 16 clock cycles - begin - if (clock_cnt[6:4] == 3'd0) // either load new value - begin - if (addr[11] == 1'b0) - shift_out <= D_out1; - else - shift_out <= D_out2; - end - else - begin - // or shift left - shift_out[7:1] <= shift_out[6:0]; - end - end - - ssp_clk <= ~clock_cnt[3]; // ssp_clk frequency = 13,56MHz / 16 = 847,5 kHz - - if (clock_cnt[6:4] == 3'b000) // set ssp_frame for 0...31 - ssp_frame <= 1'b1; - else - ssp_frame <= 1'b0; - -end - -assign ssp_din = shift_out[7]; - -endmodule diff --git a/fpga-xc3s100e/hi_iso14443a.v b/fpga-xc3s100e/hi_iso14443a.v deleted file mode 100644 index 26ab0f9d9..000000000 --- a/fpga-xc3s100e/hi_iso14443a.v +++ /dev/null @@ -1,584 +0,0 @@ -//----------------------------------------------------------------------------- -// ISO14443-A support for the Proxmark III -// Gerhard de Koning Gans, April 2008 -//----------------------------------------------------------------------------- - -module hi_iso14443a( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - 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; - output dbg; - input [3:0] mod_type; - - -wire adc_clk = ck_1356meg; - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Reader -> PM3: -// detecting and shaping the reader's signal. Reader will modulate the carrier by 100% (signal is either on or off). Use a -// hysteresis (Schmitt Trigger) to avoid false triggers during slowly increasing or decreasing carrier amplitudes -reg after_hysteresis; -reg [11:0] has_been_low_for; - -always @(negedge adc_clk) -begin - if(adc_d >= 16) after_hysteresis <= 1'b1; // U >= 1,14V -> after_hysteresis = 1 - else if(adc_d < 8) after_hysteresis <= 1'b0; // U < 1,04V -> after_hysteresis = 0 - // Note: was >= 3,53V and <= 1,19V. The new trigger values allow more reliable detection of the first bit - // (it might not reach 3,53V due to the high time constant of the high pass filter in the analogue RF part). - // In addition, the new values are more in line with ISO14443-2: "The PICC shall detect the ”End of Pause” after the field exceeds - // 5% of H_INITIAL and before it exceeds 60% of H_INITIAL." Depending on the signal strength, 60% might well be less than 3,53V. - - - // detecting a loss of reader's field (adc_d < 192 for 4096 clock cycles). If this is the case, - // set the detected reader signal (after_hysteresis) to '1' (unmodulated) - if(adc_d >= 192) - begin - has_been_low_for <= 12'd0; - end - else - begin - if(has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - begin - has_been_low_for <= has_been_low_for + 1; - end - end - -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Reader -> PM3 -// detect when a reader is active (modulating). We assume that the reader is active, if we see the carrier off for at least 8 -// carrier cycles. We assume that the reader is inactive, if the carrier stayed high for at least 256 carrier cycles. -reg deep_modulation; -reg [2:0] deep_counter; -reg [8:0] saw_deep_modulation; - -always @(negedge adc_clk) -begin - if(~(| adc_d[7:0])) // if adc_d == 0 (U <= 0,94V) - begin - if(deep_counter == 3'd7) // adc_d == 0 for 8 adc_clk ticks -> deep_modulation (by reader) - begin - deep_modulation <= 1'b1; - saw_deep_modulation <= 8'd0; - end - else - deep_counter <= deep_counter + 1; - end - else - begin - deep_counter <= 3'd0; - if(saw_deep_modulation == 8'd255) // adc_d != 0 for 256 adc_clk ticks -> deep_modulation is over, probably waiting for tag's response - deep_modulation <= 1'b0; - else - saw_deep_modulation <= saw_deep_modulation + 1; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3 -// filter the input for a tag's signal. The filter box needs the 4 previous input values and is a gaussian derivative filter -// for noise reduction and edge detection. -// store 4 previous samples: -reg [7:0] input_prev_4, input_prev_3, input_prev_2, input_prev_1; - -always @(negedge adc_clk) -begin - input_prev_4 <= input_prev_3; - input_prev_3 <= input_prev_2; - input_prev_2 <= input_prev_1; - input_prev_1 <= adc_d; -end - -// 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}; - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// internal FPGA timing. Maximum required period is 128 carrier clock cycles for a full 8 Bit transfer to ARM. (i.e. we need a -// 7 bit counter). Adjust its frequency to external reader's clock when simulating a tag or sniffing. -reg pre_after_hysteresis; -reg [3:0] reader_falling_edge_time; -reg [6:0] negedge_cnt; - -always @(negedge adc_clk) -begin - // detect a reader signal's falling edge and remember its timing: - pre_after_hysteresis <= after_hysteresis; - if (pre_after_hysteresis && ~after_hysteresis) - begin - reader_falling_edge_time[3:0] <= negedge_cnt[3:0]; - end - - // adjust internal timer counter if necessary: - if (negedge_cnt[3:0] == 4'd13 && (mod_type == `FPGA_HF_ISO14443A_SNIFFER || mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN) && deep_modulation) - begin - if (reader_falling_edge_time == 4'd1) // reader signal changes right after sampling. Better sample earlier next time. - begin - negedge_cnt <= negedge_cnt + 2; // time warp - end - else if (reader_falling_edge_time == 4'd0) // reader signal changes right before sampling. Better sample later next time. - begin - negedge_cnt <= negedge_cnt; // freeze time - end - else - begin - negedge_cnt <= negedge_cnt + 1; // Continue as usual - end - reader_falling_edge_time[3:0] <= 4'd8; // adjust only once per detected edge - end - else if (negedge_cnt == 7'd127) // normal operation: count from 0 to 127 - begin - negedge_cnt <= 0; - end - else - begin - negedge_cnt <= negedge_cnt + 1; - end -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3: -// determine best possible time for starting/resetting the modulation detector. -reg [3:0] mod_detect_reset_time; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN) - // (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'd4; - end - else - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - // detect a rising edge of reader's signal and sync modulation detector to the tag's answer: - 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. - // Then the same as above. - // - 9 - 3 - 1 + 4 + 3 + 7 - 4 = -3 - begin - mod_detect_reset_time <= negedge_cnt[3:0] - 4'd3; - end - end -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag -> PM3: -// modulation detector. Looks for the steepest falling and rising edges within a 16 clock period. If there is both a significant -// falling and rising edge (in any order), a modulation is detected. -reg signed [10:0] rx_mod_falling_edge_max; -reg signed [10:0] rx_mod_rising_edge_max; -reg curbit; - -`define EDGE_DETECT_THRESHOLD 3 -`define EDGE_DETECT_THRESHOLDHIGH 20 - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == mod_detect_reset_time) - begin - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - if ((rx_mod_falling_edge_max > `EDGE_DETECT_THRESHOLDHIGH) && (rx_mod_rising_edge_max < -`EDGE_DETECT_THRESHOLDHIGH)) - curbit <= 1'b1; // modulation - else - curbit <= 1'b0; // no modulation - end - else - begin - // detect modulation signal: if modulating, there must have been a falling AND a rising edge - 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 - end - // reset modulation detector - rx_mod_rising_edge_max <= 0; - rx_mod_falling_edge_max <= 0; - end - else // look for steepest edges (slopes) - begin - if (adc_d_filtered > 0) - begin - if (adc_d_filtered > rx_mod_falling_edge_max) - rx_mod_falling_edge_max <= adc_d_filtered; - end - else - begin - if (adc_d_filtered < rx_mod_rising_edge_max) - rx_mod_rising_edge_max <= adc_d_filtered; - end - end - -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tag+Reader -> PM3 -// sample 4 bits reader data and 4 bits tag data for sniffing -reg [3:0] reader_data; -reg [3:0] tag_data; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) - begin - reader_data[3:0] <= {reader_data[2:0], after_hysteresis}; - tag_data[3:0] <= {tag_data[2:0], curbit}; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 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; -reg mod_sig; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) // sample data at rising edge of ssp_clk - ssp_dout changes at the falling edge. - begin - mod_sig_buf[31:2] <= mod_sig_buf[30:1]; // shift - if (~ssp_dout && ~mod_sig_buf[1]) - mod_sig_buf[1] <= 1'b0; // delete the correction bit (a single 1 preceded and succeeded by 0) - else - mod_sig_buf[1] <= mod_sig_buf[0]; - mod_sig_buf[0] <= ssp_dout; // add new data to the delay line - - mod_sig = mod_sig_buf[mod_sig_ptr]; // the delayed signal. - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 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 -// a correction bit (before the start bit). The correction bit will be coded as 00010000, i.e. it adds 4 bits to the -// transmission stream, causing the required additional delay. -reg [10:0] fdt_counter; -reg fdt_indicator, fdt_elapsed; -reg [3:0] mod_sig_flip; -reg [3:0] sub_carrier_cnt; - -// we want to achieve a delay of 1172. The RF part already has delayed the reader signals's rising edge -// by 9 ticks, the ADC took 3 ticks and there is always a delay of 32 ticks by the mod_sig_buf. Therefore need to -// count to 1172 - 9 - 3 - 32 = 1128 -`define FDT_COUNT 11'd1128 - -// The ARM must not send too early, otherwise the mod_sig_buf will overflow, therefore signal that we are ready -// with fdt_indicator. The mod_sig_buf can buffer 29 excess data bits, i.e. a maximum delay of 29 * 16 = 464 adc_clk ticks. -// fdt_indicator is assigned to sendbit after at least 1 tick, the transfer to ARM needs minimum 8 ticks. Response from -// ARM could appear at ssp_dout 8 ticks later. -// 1128 - 464 - 1 - 8 - 8 = 647 -`define FDT_INDICATOR_COUNT 11'd647 -// Note: worst case, assignment to sendbit takes 15 ticks more, and transfer to ARM needs 7*16 = 112 ticks more. -// When the ARM's response then appears, the fdt_count is already 647 + 15 + 112 = 774, which still allows the ARM a possible -// response window of 1128 - 774 = 354 ticks. - -// reset on a pause in listen mode. I.e. the counter starts when the pause is over: -assign fdt_reset = ~after_hysteresis && mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN; - -always @(negedge adc_clk) -begin - if (fdt_reset) - begin - fdt_counter <= 11'd0; - fdt_elapsed <= 1'b0; - fdt_indicator <= 1'b0; - end - else - begin - if(fdt_counter == `FDT_COUNT) - begin - if(~fdt_elapsed) // just reached fdt. - begin - mod_sig_flip <= negedge_cnt[3:0]; // start modulation at this time - sub_carrier_cnt <= 4'd0; // subcarrier phase in sync with start of modulation - fdt_elapsed <= 1'b1; - end - else - begin - sub_carrier_cnt <= sub_carrier_cnt + 1; - end - end - else - begin - fdt_counter <= fdt_counter + 1; - end - end - - if(fdt_counter == `FDT_INDICATOR_COUNT) fdt_indicator <= 1'b1; -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader or Tag -// assign a modulation signal to the antenna. This signal is either a delayed signal (to achieve fdt when sending to a reader) -// or undelayed when sending to a tag -reg mod_sig_coil; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD) // need to take care of proper fdt timing - begin - if(fdt_counter == `FDT_COUNT) - begin - if(fdt_elapsed) - begin - if(negedge_cnt[3:0] == mod_sig_flip) mod_sig_coil <= mod_sig; - end - else - begin - mod_sig_coil <= mod_sig; // just reached fdt. Immediately assign signal to coil - end - end - end - else // other modes: don't delay - begin - mod_sig_coil <= ssp_dout; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PM3 -> Reader -// determine the required delay in the mod_sig_buf (set mod_sig_ptr). -reg temp_buffer_reset; - -always @(negedge adc_clk) -begin - if(fdt_reset) - begin - mod_sig_ptr <= 5'd0; - temp_buffer_reset = 1'b0; - end - else - begin - if(fdt_counter == `FDT_COUNT && ~fdt_elapsed) // if we just reached fdt - if(~(| mod_sig_ptr[4:0])) - mod_sig_ptr <= 5'd8; // ... but didn't buffer a 1 yet, delay next 1 by n*128 ticks. - else - temp_buffer_reset = 1'b1; // else no need for further delays. - - if(negedge_cnt[3:0] == 4'd0) // at rising edge of ssp_clk - ssp_dout changes at the falling edge. - begin - if((ssp_dout || (| mod_sig_ptr[4:0])) && ~fdt_elapsed) // buffer a 1 (and all subsequent data) until fdt is reached. - if (mod_sig_ptr == 5'd31) - mod_sig_ptr <= 5'd0; // buffer overflow - data loss. - else - mod_sig_ptr <= mod_sig_ptr + 1; // increase buffer (= increase delay by 16 adc_clk ticks). mod_sig_ptr always points ahead of first 1. - else if(fdt_elapsed && ~temp_buffer_reset) - begin - // wait for the next 1 after fdt_elapsed before fixing the delay and starting modulation. This ensures that the response can only happen - // at intervals of 8 * 16 = 128 adc_clk ticks (as defined in ISO14443-3) - if(ssp_dout) - temp_buffer_reset = 1'b1; - if(mod_sig_ptr == 5'd1) - mod_sig_ptr <= 5'd8; // still nothing received, need to go for the next interval - else - mod_sig_ptr <= mod_sig_ptr - 1; // decrease buffer. - end - end - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: -// buffer 8 bits data to be sent to ARM. Shift them out bit by bit. -reg [7:0] to_arm; - -always @(negedge adc_clk) -begin - if (negedge_cnt[5:0] == 6'd63) // fill the buffer - begin - if (mod_type == `FPGA_HF_ISO14443A_SNIFFER) - begin - if(deep_modulation) // a reader is sending (or there's no field at all) - begin - to_arm <= {reader_data[3:0], 4'b0000}; // don't send tag data - end - else - begin - to_arm <= {reader_data[3:0], tag_data[3:0]}; - end - end - else - begin - to_arm[7:0] <= {mod_sig_ptr[4:0], mod_sig_flip[3:1]}; // feedback timing information - end - end - - if(negedge_cnt[2:0] == 3'b000 && mod_type == `FPGA_HF_ISO14443A_SNIFFER) // shift at double speed - begin - // Don't shift if we just loaded new data, obviously. - if(negedge_cnt[5:0] != 6'd0) - begin - to_arm[7:1] <= to_arm[6:0]; - end - end - - if(negedge_cnt[3:0] == 4'b0000 && mod_type != `FPGA_HF_ISO14443A_SNIFFER) - begin - // Don't shift if we just loaded new data, obviously. - if(negedge_cnt[6:0] != 7'd0) - begin - to_arm[7:1] <= to_arm[6:0]; - end - end - -end - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// 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; - -always @(negedge adc_clk) -begin - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) - // FPGA_HF_ISO14443A_SNIFFER mode (ssp_clk = adc_clk / 8, ssp_frame clock = adc_clk / 64)): - begin - if(negedge_cnt[2:0] == 3'd0) - ssp_clk <= 1'b1; - if(negedge_cnt[2:0] == 3'd4) - ssp_clk <= 1'b0; - - if(negedge_cnt[5:0] == 6'd0) // ssp_frame rising edge indicates start of frame - ssp_frame <= 1'b1; - if(negedge_cnt[5:0] == 6'd8) - ssp_frame <= 1'b0; - end - else - // all other modes (ssp_clk = adc_clk / 16, ssp_frame clock = adc_clk / 128): - begin - if(negedge_cnt[3:0] == 4'd0) - ssp_clk <= 1'b1; - if(negedge_cnt[3:0] == 4'd8) - ssp_clk <= 1'b0; - - if(negedge_cnt[6:0] == 7'd7) // ssp_frame rising edge indicates start of frame, sampled on falling edge of ssp_clk - ssp_frame <= 1'b1; - if(negedge_cnt[6:0] == 7'd23) - ssp_frame <= 1'b0; - end -end - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FPGA -> ARM communication: -// select the data to be sent to ARM -reg bit_to_arm; -reg sendbit; - -always @(negedge adc_clk) -begin - if(negedge_cnt[3:0] == 4'd0) - begin - // What do we communicate to the ARM - if(mod_type == `FPGA_HF_ISO14443A_TAGSIM_LISTEN) - sendbit = after_hysteresis; - else if(mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD) - /* if(fdt_counter > 11'd772) sendbit = mod_sig_coil; // huh? - else */ - sendbit = fdt_indicator; - else if (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN) - sendbit = curbit; - else - sendbit = 1'b0; - end - - - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) - // send sampled reader and tag data: - bit_to_arm = to_arm[7]; - else if (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD && fdt_elapsed && temp_buffer_reset) - // send timing information: - bit_to_arm = to_arm[7]; - else - // send data or fdt_indicator - bit_to_arm = sendbit; -end - - - - -assign ssp_din = bit_to_arm; - -// Subcarrier (adc_clk/16, for FPGA_HF_ISO14443A_TAGSIM_MOD only). -wire sub_carrier; -assign sub_carrier = ~sub_carrier_cnt[3]; - -// in FPGA_HF_ISO14443A_READER_MOD: drop carrier for mod_sig_coil==1 (pause); in FPGA_HF_ISO14443A_READER_LISTEN: carrier always on; in other modes: carrier always off -assign pwr_hi = (ck_1356meg & (((mod_type == `FPGA_HF_ISO14443A_READER_MOD) & ~mod_sig_coil) || (mod_type == `FPGA_HF_ISO14443A_READER_LISTEN))); - - -// Enable HF antenna drivers: -assign pwr_oe1 = 1'b0; -assign pwr_oe3 = 1'b0; - -// FPGA_HF_ISO14443A_TAGSIM_MOD: short circuit antenna with different resistances (modulated by sub_carrier modulated by mod_sig_coil) -// for pwr_oe4 = 1 (tristate): antenna load = 10k || 33 = 32,9 Ohms -// for pwr_oe4 = 0 (active): antenna load = 10k || 33 || 33 = 16,5 Ohms -assign pwr_oe4 = mod_sig_coil & sub_carrier & (mod_type == `FPGA_HF_ISO14443A_TAGSIM_MOD); - -// This is all LF, so doesn't matter. -assign pwr_oe2 = 1'b0; -assign pwr_lo = 1'b0; - - -assign dbg = negedge_cnt[3]; - -endmodule diff --git a/fpga-xc3s100e/hi_reader.v b/fpga-xc3s100e/hi_reader.v deleted file mode 100644 index c5ffa7b85..000000000 --- a/fpga-xc3s100e/hi_reader.v +++ /dev/null @@ -1,335 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Jonathan Westhues, April 2006 -//----------------------------------------------------------------------------- - -module hi_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode -); - input ck_1356meg; - 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; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; - -assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz - -// When we're a reader, we just need to do the BPSK demod; but when we're an -// eavesdropper, we also need to pick out the commands sent by the reader, -// using AM. Do this the same way that we do it for the simulated tag. -reg after_hysteresis, after_hysteresis_prev, after_hysteresis_prev_prev; -reg [11:0] has_been_low_for; -always @(negedge adc_clk) -begin - if (& adc_d[7:0]) after_hysteresis <= 1'b1; - else if (~(| adc_d[7:0])) after_hysteresis <= 1'b0; - - if (after_hysteresis) - begin - has_been_low_for <= 12'd0; - end - else - begin - if (has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - has_been_low_for <= has_been_low_for + 1; - end -end - - -// Let us report a correlation every 64 samples. I.e. -// one Q/I pair after 4 subcarrier cycles for the 848kHz subcarrier, -// one Q/I pair after 2 subcarrier cycles for the 424kHz subcarriers, -// one Q/I pair for each subcarrier cyle for the 212kHz subcarrier. -// We need a 6-bit counter for the timing. -reg [5:0] corr_i_cnt; -always @(negedge adc_clk) -begin - corr_i_cnt <= corr_i_cnt + 1; -end - - -// 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. -// 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; - - -// the amplitude of the subcarrier is sqrt(ci^2 + cq^2). -// approximate by amplitude = max(|ci|,|cq|) + 1/2*min(|ci|,|cq|) -reg [13:0] corr_amplitude, abs_ci, abs_cq, max_ci_cq; -reg [12:0] min_ci_cq_2; // min_ci_cq / 2 - -always @(*) -begin - if (corr_i_accum[13] == 1'b0) - abs_ci <= corr_i_accum; - else - abs_ci <= -corr_i_accum; - - if (corr_q_accum[13] == 1'b0) - abs_cq <= corr_q_accum; - else - abs_cq <= -corr_q_accum; - - if (abs_ci > abs_cq) - begin - max_ci_cq <= abs_ci; - min_ci_cq_2 <= abs_cq / 2; - end - else - begin - max_ci_cq <= abs_cq; - min_ci_cq_2 <= abs_ci / 2; - end - - corr_amplitude <= max_ci_cq + min_ci_cq_2; - -end - - -// The subcarrier reference signals -reg subcarrier_I; -reg subcarrier_Q; - -always @(*) -begin - if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_848_KHZ) - begin - subcarrier_I = ~corr_i_cnt[3]; - subcarrier_Q = ~(corr_i_cnt[3] ^ corr_i_cnt[2]); - end - else if (subcarrier_frequency == `FPGA_HF_READER_SUBCARRIER_212_KHZ) - begin - subcarrier_I = ~corr_i_cnt[5]; - subcarrier_Q = ~(corr_i_cnt[5] ^ corr_i_cnt[4]); - end - else - begin // 424 kHz - subcarrier_I = ~corr_i_cnt[4]; - subcarrier_Q = ~(corr_i_cnt[4] ^ corr_i_cnt[3]); - end -end - - -// ADC data appears on the rising edge, so sample it on the falling edge -always @(negedge adc_clk) -begin - // These are the correlators: we correlate against in-phase and quadrature - // versions of our reference signal, and keep the (signed) results or the - // resulting amplitude to send out later over the SSP. - if (corr_i_cnt == 6'd0) - begin - if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE) - begin - // send amplitude plus 2 bits reader signal - corr_i_out <= corr_amplitude[13:6]; - corr_q_out <= {corr_amplitude[5:0], after_hysteresis_prev_prev, after_hysteresis_prev}; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) - begin - - // Send 7 most significant bits of in phase tag signal (signed), plus 1 bit reader signal - 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}; - - // Send 7 most significant bits of quadrature phase tag signal (signed), plus 1 bit reader signal - 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}; - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE) - begin - // send amplitude - corr_i_out <= {2'b00, corr_amplitude[13:8]}; - corr_q_out <= corr_amplitude[7:0]; - end - else if (minor_mode == `FPGA_HF_READER_MODE_RECEIVE_IQ) - begin - - // Send 8 bits of in phase 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; - - // Send 8 bits of quadrature phase tag signal - 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 - - // for each Q/I pair report two reader signal samples when sniffing. Store the 1st. - after_hysteresis_prev_prev <= after_hysteresis; - - // Initialize next correlation. - // Both I and Q reference signals are high when corr_i_nct == 0. Therefore need to accumulate. - 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 + $signed({1'b0, adc_d}); - else - corr_i_accum <= corr_i_accum - $signed({1'b0, adc_d}); - - if (subcarrier_Q) - corr_q_accum <= corr_q_accum + $signed({1'b0, adc_d}); - else - corr_q_accum <= corr_q_accum - $signed({1'b0, adc_d}); - end - - // for each Q/I pair report two reader signal samples when sniffing. Store the 2nd. - if (corr_i_cnt == 6'd32) - after_hysteresis_prev <= after_hysteresis; - - // Then the result from last time is serialized and send out to the ARM. - // We get one report each cycle, and each report is 16 bits, so the - // ssp_clk should be the adc_clk divided by 64/16 = 4. - // ssp_clk frequency = 13,56MHz / 4 = 3.39MHz - - if (corr_i_cnt[1:0] == 2'b00) - begin - // Don't shift if we just loaded new data, obviously. - if (corr_i_cnt != 6'd0) - begin - corr_i_out[7:0] <= {corr_i_out[6:0], corr_q_out[7]}; - corr_q_out[7:1] <= corr_q_out[6:0]; - end - end - -end - - -// ssp clock and frame signal for communication to and from ARM -// _____ _____ _____ _ -// ssp_clk | |_____| |_____| |_____| -// _____ -// ssp_frame ___| |____________________________ -// ___________ ___________ ___________ _ -// ssp_d_in X___________X___________X___________X_ -// -// corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... -// - -reg ssp_clk; -reg ssp_frame; - -always @(negedge adc_clk) -begin - if (corr_i_cnt[1:0] == 2'b00) - ssp_clk <= 1'b1; - - if (corr_i_cnt[1:0] == 2'b10) - ssp_clk <= 1'b0; - - // set ssp_frame signal for corr_i_cnt = 1..3 - // (send one frame with 16 Bits) - if (corr_i_cnt == 6'd1) - ssp_frame <= 1'b1; - - if (corr_i_cnt == 6'd3) - ssp_frame <= 1'b0; -end - - -assign ssp_din = corr_i_out[7]; - - -// a jamming signal -reg jam_signal; -reg [3:0] jam_counter; - -always @(negedge adc_clk) -begin - if (corr_i_cnt == 6'd0) - begin - jam_counter <= jam_counter + 1; - jam_signal <= jam_counter[1] ^ jam_counter[3]; - end -end - -// Antenna drivers -reg pwr_hi, pwr_oe4; - -always @(*) -begin - if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) - begin - pwr_hi = ck_1356meg; - pwr_oe4 = ssp_dout; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_FULL_MOD) - begin - pwr_hi = ck_1356meg & ~ssp_dout; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SEND_JAM) - begin - pwr_hi = ck_1356meg & jam_signal; - pwr_oe4 = 1'b0; - end - else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_AMPLITUDE - || minor_mode == `FPGA_HF_READER_MODE_SNIFF_PHASE) - begin // all off - pwr_hi = 1'b0; - pwr_oe4 = 1'b0; - end - else // receiving from tag - begin - pwr_hi = ck_1356meg; - pwr_oe4 = 1'b0; - end -end - -// always on -assign pwr_oe1 = 1'b0; -assign pwr_oe3 = 1'b0; - -// Unused. -assign pwr_lo = 1'b0; -assign pwr_oe2 = 1'b0; - -// Debug Output -assign dbg = corr_i_cnt[3]; - -endmodule diff --git a/fpga-xc3s100e/hi_simulate.v b/fpga-xc3s100e/hi_simulate.v deleted file mode 100644 index cf951279a..000000000 --- a/fpga-xc3s100e/hi_simulate.v +++ /dev/null @@ -1,152 +0,0 @@ -//----------------------------------------------------------------------------- -// Pretend to be an ISO 14443 tag. We will do this by alternately short- -// circuiting and open-circuiting the antenna coil, with the tri-state -// pins. -// -// We communicate over the SSP, as a bitstream (i.e., might as well be -// unframed, though we still generate the word sync signal). The output -// (ARM -> FPGA) tells us whether to modulate or not. The input (FPGA -// -> ARM) is us using the A/D as a fancy comparator; this is with -// (software-added) hysteresis, to undo the high-pass filter. -// -// At this point only Type A is implemented. This means that we are using a -// bit rate of 106 kbit/s, or fc/128. Oversample by 4, which ought to make -// things practical for the ARM (fc/32, 423.8 kbits/s, ~50 kbytes/s) -// -// Jonathan Westhues, October 2006 -//----------------------------------------------------------------------------- - -//For ISE 10.1 PROJ,IDE cannot apply definition to all files -`include "define.v" - - -module hi_simulate( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type -); - input ck_1356meg; - 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; - output dbg; - input [3:0] mod_type; - -// Power amp goes between LOW and tri-state, so pwr_hi (and pwr_lo) can -// always be low. -assign pwr_hi = 1'b0; // HF antenna connected to GND -assign pwr_lo = 1'b0; // LF antenna connected to GND - -// This one is all LF, so doesn't matter -assign pwr_oe2 = 1'b0; - -assign adc_clk = ck_1356meg; -assign dbg = ssp_frame; - -// The comparator with hysteresis on the output from the peak detector. -reg after_hysteresis; -reg [11:0] has_been_low_for; - -always @(negedge adc_clk) -begin - if (& adc_d[7:5]) after_hysteresis <= 1'b1; // if (adc_d >= 224) - else if (~(| adc_d[7:5])) after_hysteresis <= 1'b0; // if (adc_d <= 31) - - if (adc_d >= 224) - begin - has_been_low_for <= 12'd0; - end - else - begin - if (has_been_low_for == 12'd4095) - begin - has_been_low_for <= 12'd0; - after_hysteresis <= 1'b1; - end - else - begin - has_been_low_for <= has_been_low_for + 1; - end - end -end - - -// Divide 13.56 MHz to produce various frequencies for SSP_CLK -// and modulation. -reg [8:0] ssp_clk_divider; - -always @(negedge adc_clk) - ssp_clk_divider <= (ssp_clk_divider + 1); - -reg ssp_clk; - -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) - // Get bit every at 53KHz (every 8th carrier bit of 424kHz) - ssp_clk <= ~ssp_clk_divider[7]; - else if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - // Get next bit at 212kHz - ssp_clk <= ~ssp_clk_divider[5]; - else - // Get next bit at 424kHz - ssp_clk <= ~ssp_clk_divider[4]; -end - - -// Produce the byte framing signal; the phase of this signal -// is arbitrary, because it's just a bit stream in this module. -reg ssp_frame; -always @(negedge adc_clk) -begin - if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - begin - if (ssp_clk_divider[8:5] == 4'd1) - ssp_frame <= 1'b1; - if (ssp_clk_divider[8:5] == 4'd5) - ssp_frame <= 1'b0; - end - else - begin - if (ssp_clk_divider[7:4] == 4'd1) - ssp_frame <= 1'b1; - if (ssp_clk_divider[7:4] == 4'd5) - ssp_frame <= 1'b0; - end -end - - -// Synchronize up the after-hysteresis signal, to produce DIN. -reg ssp_din; -always @(posedge ssp_clk) - ssp_din = after_hysteresis; - -// Modulating carrier frequency is fc/64 (212kHz) to fc/16 (848kHz). Reuse ssp_clk divider for that. -reg modulating_carrier; -always @(*) - if(mod_type == `FPGA_HF_SIMULATOR_NO_MODULATION) - modulating_carrier <= 1'b0; // no modulation - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_BPSK) - modulating_carrier <= ssp_dout ^ ssp_clk_divider[3]; // XOR means BPSK - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) - modulating_carrier <= ssp_dout & ssp_clk_divider[5]; // switch 212kHz subcarrier on/off - else if(mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K || mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) - modulating_carrier <= ssp_dout & ssp_clk_divider[4]; // switch 424kHz modulation on/off - else - modulating_carrier <= 1'b0; // yet unused - - - -// Load modulation. Toggle only one of these, since we are already producing much deeper -// modulation than a real tag would. -assign pwr_oe1 = 1'b0; // 33 Ohms Load -assign pwr_oe4 = modulating_carrier; // 33 Ohms Load -// This one is always on, so that we can watch the carrier. -assign pwr_oe3 = 1'b0; // 10k Load - -endmodule diff --git a/fpga-xc3s100e/hi_sniffer.v b/fpga-xc3s100e/hi_sniffer.v deleted file mode 100644 index c2dc844a7..000000000 --- a/fpga-xc3s100e/hi_sniffer.v +++ /dev/null @@ -1,50 +0,0 @@ -module hi_sniffer( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_clk -); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - output ssp_frame, ssp_din, ssp_clk; - -// We are only snooping, all off. -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; -assign pwr_oe4 = 1'b0; - -reg ssp_frame; -reg [7:0] adc_d_out = 8'd0; -reg [2:0] ssp_cnt = 3'd0; - -assign adc_clk = ck_1356meg; -assign ssp_clk = ~ck_1356meg; - -always @(posedge ssp_clk) -begin - if(ssp_cnt[2:0] == 3'd7) - ssp_cnt[2:0] <= 3'd0; - else - ssp_cnt <= ssp_cnt + 1; - - if(ssp_cnt[2:0] == 3'b000) // set frame length - begin - adc_d_out[7:0] <= adc_d; - ssp_frame <= 1'b1; - end - else - begin - adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; - ssp_frame <= 1'b0; - end - -end - -assign ssp_din = adc_d_out[0]; - -endmodule diff --git a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise b/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.ise deleted file mode 100644 index 40e5eeffdff1dad9e67d8e59ede83f95cc6f6c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257463 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

L)+prH;ENp%B9W@bsHA7p7A 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 diff --git a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl b/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl deleted file mode 100644 index 114f0df18..000000000 --- a/fpga-xc3s100e/iseproj/fpga_hf/fpga_hf.tcl +++ /dev/null @@ -1,479 +0,0 @@ -# -# Project automation script for fpga_hf -# -# Created for ISE version 10.1 -# -# This file contains several Tcl procedures (procs) that you can use to automate -# your project by running from xtclsh or the Project Navigator Tcl console. -# If you load this file (using the Tcl command: source fpga_hf.tcl, then you can -# run any of the procs included here. -# You may also edit any of these procs to customize them. See comments in each -# proc for more instructions. -# -# This file contains the following procedures: -# -# Top Level procs (meant to be called directly by the user): -# run_process: you can use this top-level procedure to run any processes -# that you choose to by adding and removing comments, or by -# adding new entries. -# rebuild_project: you can alternatively use this top-level procedure -# to recreate your entire project, and the run selected processes. -# -# Lower Level (helper) procs (called under in various cases by the top level procs): -# show_help: print some basic information describing how this script works -# add_source_files: adds the listed source files to your project. -# set_project_props: sets the project properties that were in effect when this -# script was generated. -# create_libraries: creates and adds file to VHDL libraries that were defined when -# this script was generated. -# create_partitions: adds any partitions that were defined when this script was generated. -# set_process_props: set the process properties as they were set for your project -# when this script was generated. -# - -set myProject "fpga_hf.ise" -set myScript "fpga_hf.tcl" - -# -# Main (top-level) routines -# - -# -# run_process -# This procedure is used to run processes on an existing project. You may comment or -# uncomment lines to control which processes are run. This routine is set up to run -# the Implement Design and Generate Programming File processes by default. This proc -# also sets process properties as specified in the "set_process_props" proc. Only -# those properties which have values different from their current settings in the project -# file will be modified in the project. -# -proc run_process {} { - - global myScript - global myProject - - ## put out a 'heartbeat' - so we know something's happening. - puts "\n$myScript: running ($myProject)...\n" - - if { ! [ open_project ] } { - return false - } - - set_process_props - # - # Remove the comment characters (#'s) to enable the following commands - # process run "Synthesize" - # process run "Translate" - # process run "Map" - # process run "Place & Route" - # - puts "Running 'Implement Design'" - if { ! [ process run "Implement Design" ] } { - puts "$myScript: Implementation run failed, check run output for details." - project close - return - } - puts "Running 'Generate Programming File'" - if { ! [ process run "Generate Programming File" ] } { - puts "$myScript: Generate Programming File run failed, check run output for details." - project close - return - } - - puts "Run completed." - project close - -} - -# -# rebuild_project -# -# This procedure renames the project file (if it exists) and recreates the project. -# It then sets project properties and adds project sources as specified by the -# set_project_props and add_source_files support procs. It recreates VHDL libraries -# and partitions as they existed at the time this script was generated. -# -# It then calls run_process to set process properties and run selected processes. -# -proc rebuild_project {} { - - global myScript - global myProject - - ## put out a 'heartbeat' - so we know something's happening. - puts "\n$myScript: rebuilding ($myProject)...\n" - - if { [ file exists $myProject ] } { - puts "$myScript: Removing existing project file." - file delete $myProject - } - - puts "$myScript: Rebuilding project $myProject" - project new $myProject - set_project_props - add_source_files - create_libraries - create_partitions - puts "$myScript: project rebuild completed." - - run_process - -} - -# -# Support Routines -# - -# -# show_help: print information to help users understand the options available when -# running this script. -# -proc show_help {} { - - global myScript - - puts "" - puts "usage: xtclsh $myScript " - puts " or you can run xtclsh and then enter 'source $myScript'." - puts "" - puts "options:" - puts " run_process - set properties and run processes." - puts " rebuild_project - rebuild the project from scratch and run processes." - puts " set_project_props - set project properties (device, speed, etc.)" - puts " add_source_files - add source files" - puts " create_libraries - create vhdl libraries" - puts " create_partitions - create partitions" - puts " set_process_props - set process property values" - puts " show_help - print this message" - puts "" -} - -proc open_project {} { - - global myScript - global myProject - - if { ! [ file exists $myProject ] } { - ## project file isn't there, rebuild it. - puts "Project $myProject not found. Use ${myProject}_rebuild to recreate it." - return false - } - - project open $myProject - - return true - -} -# -# set_project_props -# -# This procedure sets the project properties as they were set in the project -# at the time this script was generated. -# -proc set_project_props {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Setting project properties..." - - project set family "Spartan3E" - project set device "xc3s100e" - project set package "vq100" - project set speed "-4" - project set top_level_module_type "HDL" - project set synthesis_tool "XST (VHDL/Verilog)" - project set simulator "ISE Simulator (VHDL/Verilog)" - project set "Preferred Language" "Verilog" - project set "Enable Message Filtering" "false" - project set "Display Incremental Messages" "false" - -} - - -# -# add_source_files -# -# This procedure add the source files that were known to the project at the -# time this script was generated. -# -proc add_source_files {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Adding sources to project..." - - xfile add "../../clk_divider.v" - xfile add "../../define.v" - xfile add "../../fpga.ucf" - xfile add "../../fpga_allinone.v" - xfile add "../../fpga_hfmod.v" - xfile add "../../fpga_lfmod.v" - xfile add "../../hi_flite.v" - xfile add "../../hi_get_trace.v" - xfile add "../../hi_iso14443a.v" - xfile add "../../hi_reader.v" - xfile add "../../hi_simulate.v" - xfile add "../../hi_sniffer.v" - xfile add "../../lf_edge_detect.v" - xfile add "../../lo_adc.v" - xfile add "../../lo_edge_detect.v" - xfile add "../../lo_passthru.v" - xfile add "../../lo_read.v" - xfile add "../../lp20khz_1MSa_iir_filter.v" - xfile add "../../mux2_onein.v" - xfile add "../../mux2_oneout.v" - xfile add "../../util.v" - - # Set the Top Module as well... - project set top "fpga_hf" - - puts "$myScript: project sources reloaded." - -} ; # end add_source_files - -# -# create_libraries -# -# This procedure defines VHDL libraries and associates files with those libraries. -# It is expected to be used when recreating the project. Any libraries defined -# when this script was generated are recreated by this procedure. -# -proc create_libraries {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Creating libraries..." - - - # must close the project or library definitions aren't saved. - project close - -} ; # end create_libraries - -# -# create_partitions -# -# This procedure creates partitions on instances in your project. -# It is expected to be used when recreating the project. Any partitions -# defined when this script was generated are recreated by this procedure. -# -proc create_partitions {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: Creating Partitions..." - - - # must close the project or partition definitions aren't saved. - project close - -} ; # end create_partitions - -# -# set_process_props -# -# This procedure sets properties as requested during script generation (either -# all of the properties, or only those modified from their defaults). -# -proc set_process_props {} { - - global myScript - - if { ! [ open_project ] } { - return false - } - - puts "$myScript: setting process properties..." - - project set "Compiled Library Directory" "\$XILINX//" - project set "Use SmartGuide" "false" - project set "SmartGuide Filename" "fpga_hf_guide.ncd" - project set "Multiplier Style" "Auto" -process "Synthesize - XST" - project set "Configuration Rate" "Default (1)" -process "Generate Programming File" - project set "Map to Input Functions" "4" -process "Map" - project set "Number of Clock Buffers" "24" -process "Synthesize - XST" - project set "Max Fanout" "500" -process "Synthesize - XST" - project set "Case Implementation Style" "None" -process "Synthesize - XST" - project set "Decoder Extraction" "true" -process "Synthesize - XST" - project set "Priority Encoder Extraction" "Yes" -process "Synthesize - XST" - project set "Mux Extraction" "Yes" -process "Synthesize - XST" - project set "RAM Extraction" "true" -process "Synthesize - XST" - project set "ROM Extraction" "true" -process "Synthesize - XST" - project set "FSM Encoding Algorithm" "Auto" -process "Synthesize - XST" - project set "Logical Shifter Extraction" "true" -process "Synthesize - XST" - project set "Optimization Goal" "Speed" -process "Synthesize - XST" - project set "Optimization Effort" "Normal" -process "Synthesize - XST" - project set "Resource Sharing" "true" -process "Synthesize - XST" - project set "Shift Register Extraction" "true" -process "Synthesize - XST" - project set "XOR Collapsing" "true" -process "Synthesize - XST" - project set "Other Bitgen Command Line Options" "" -process "Generate Programming File" - project set "Show All Models" "false" -process "Generate IBIS Model" - project set "Target UCF File Name" "" -process "Back-annotate Pin Locations" - project set "Ignore User Timing Constraints" "false" -process "Map" - project set "Use RLOC Constraints" "true" -process "Map" - project set "Other Map Command Line Options" "" -process "Map" - project set "Use LOC Constraints" "true" -process "Translate" - project set "Other Ngdbuild Command Line Options" "" -process "Translate" - project set "Ignore User Timing Constraints" "false" -process "Place & Route" - project set "Other Place & Route Command Line Options" "" -process "Place & Route" - project set "UserID Code (8 Digit Hexadecimal)" "0xFFFFFFFF" -process "Generate Programming File" - project set "Reset DCM if SHUTDOWN & AGHIGH performed" "false" -process "Generate Programming File" - project set "Configuration Pin Done" "Pull Up" -process "Generate Programming File" - project set "Create ASCII Configuration File" "false" -process "Generate Programming File" - project set "Create Binary Configuration File" "false" -process "Generate Programming File" - project set "Create Bit File" "true" -process "Generate Programming File" - project set "Enable BitStream Compression" "false" -process "Generate Programming File" - project set "Run Design Rules Checker (DRC)" "true" -process "Generate Programming File" - project set "Enable Cyclic Redundancy Checking (CRC)" "true" -process "Generate Programming File" - project set "Create IEEE 1532 Configuration File" "false" -process "Generate Programming File" - project set "Configuration Pin Program" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TCK" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TDI" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TDO" "Pull Up" -process "Generate Programming File" - project set "JTAG Pin TMS" "Pull Up" -process "Generate Programming File" - project set "Unused IOB Pins" "Pull Down" -process "Generate Programming File" - project set "Security" "Enable Readback and Reconfiguration" -process "Generate Programming File" - project set "FPGA Start-Up Clock" "CCLK" -process "Generate Programming File" - project set "Done (Output Events)" "Default (4)" -process "Generate Programming File" - project set "Drive Done Pin High" "false" -process "Generate Programming File" - project set "Enable Outputs (Output Events)" "Default (5)" -process "Generate Programming File" - project set "Release DLL (Output Events)" "Default (NoWait)" -process "Generate Programming File" - project set "Release Write Enable (Output Events)" "Default (6)" -process "Generate Programming File" - project set "Enable Internal Done Pipe" "false" -process "Generate Programming File" - project set "Allow Logic Optimization Across Hierarchy" "false" -process "Map" - project set "Optimization Strategy (Cover Mode)" "Area" -process "Map" - project set "Disable Register Ordering" "false" -process "Map" - project set "Pack I/O Registers/Latches into IOBs" "Off" -process "Map" - project set "Replicate Logic to Allow Logic Level Reduction" "true" -process "Map" - project set "Generate Detailed MAP Report" "false" -process "Map" - project set "Map Slice Logic into Unused Block RAMs" "false" -process "Map" - project set "Perform Timing-Driven Packing and Placement" "false" -process "Map" - project set "Trim Unconnected Signals" "true" -process "Map" - project set "Create I/O Pads from Ports" "false" -process "Translate" - project set "Macro Search Path" "" -process "Translate" - project set "Netlist Translation Type" "Timestamp" -process "Translate" - project set "User Rules File for Netlister Launcher" "" -process "Translate" - project set "Allow Unexpanded Blocks" "false" -process "Translate" - project set "Allow Unmatched LOC Constraints" "false" -process "Translate" - project set "Starting Placer Cost Table (1-100)" "1" -process "Place & Route" - project set "Placer Effort Level (Overrides Overall Level)" "None" -process "Place & Route" - project set "Router Effort Level (Overrides Overall Level)" "None" -process "Place & Route" - project set "Place And Route Mode" "Normal Place and Route" -process "Place & Route" - project set "Use Bonded I/Os" "false" -process "Place & Route" - project set "Add I/O Buffers" "true" -process "Synthesize - XST" - project set "Global Optimization Goal" "AllClockNets" -process "Synthesize - XST" - project set "Keep Hierarchy" "No" -process "Synthesize - XST" - project set "Register Balancing" "No" -process "Synthesize - XST" - project set "Register Duplication" "true" -process "Synthesize - XST" - project set "Asynchronous To Synchronous" "false" -process "Synthesize - XST" - project set "Automatic BRAM Packing" "false" -process "Synthesize - XST" - project set "BRAM Utilization Ratio" "100" -process "Synthesize - XST" - project set "Bus Delimiter" "<>" -process "Synthesize - XST" - project set "Case" "Maintain" -process "Synthesize - XST" - project set "Cores Search Directories" "" -process "Synthesize - XST" - project set "Cross Clock Analysis" "false" -process "Synthesize - XST" - project set "Equivalent Register Removal" "true" -process "Synthesize - XST" - project set "FSM Style" "LUT" -process "Synthesize - XST" - project set "Generate RTL Schematic" "Yes" -process "Synthesize - XST" - project set "Generics, Parameters" "" -process "Synthesize - XST" - project set "Hierarchy Separator" "/" -process "Synthesize - XST" - project set "HDL INI File" "" -process "Synthesize - XST" - project set "Library Search Order" "" -process "Synthesize - XST" - project set "Netlist Hierarchy" "As Optimized" -process "Synthesize - XST" - project set "Optimize Instantiated Primitives" "false" -process "Synthesize - XST" - project set "Pack I/O Registers into IOBs" "Auto" -process "Synthesize - XST" - project set "Read Cores" "true" -process "Synthesize - XST" - project set "Slice Packing" "true" -process "Synthesize - XST" - project set "Slice Utilization Ratio" "100" -process "Synthesize - XST" - project set "Use Clock Enable" "Yes" -process "Synthesize - XST" - project set "Use Synchronous Reset" "Yes" -process "Synthesize - XST" - project set "Use Synchronous Set" "Yes" -process "Synthesize - XST" - project set "Use Synthesis Constraints File" "true" -process "Synthesize - XST" - project set "Custom Compile File List" "" -process "Synthesize - XST" - project set "Verilog Include Directories" "" -process "Synthesize - XST" - project set "Verilog 2001" "true" -process "Synthesize - XST" - project set "Verilog Macros" "" -process "Synthesize - XST" - project set "Work Directory" "./xst" -process "Synthesize - XST" - project set "Write Timing Constraints" "false" -process "Synthesize - XST" - project set "Other XST Command Line Options" "" -process "Synthesize - XST" - project set "Map Effort Level" "Medium" -process "Map" - project set "Combinatorial Logic Optimization" "false" -process "Map" - project set "Starting Placer Cost Table (1-100)" "1" -process "Map" - project set "Power Reduction" "false" -process "Map" - project set "Register Duplication" "false" -process "Map" - project set "Synthesis Constraints File" "" -process "Synthesize - XST" - project set "Mux Style" "Auto" -process "Synthesize - XST" - project set "RAM Style" "Auto" -process "Synthesize - XST" - project set "Timing Mode" "Non Timing Driven" -process "Map" - project set "Generate Asynchronous Delay Report" "false" -process "Place & Route" - project set "Generate Clock Region Report" "false" -process "Place & Route" - project set "Generate Post-Place & Route Simulation Model" "false" -process "Place & Route" - project set "Generate Post-Place & Route Static Timing Report" "true" -process "Place & Route" - project set "Nodelist File (Unix Only)" "" -process "Place & Route" - project set "Number of PAR Iterations (0-100)" "3" -process "Place & Route" - project set "Save Results in Directory (.dir will be appended)" "" -process "Place & Route" - project set "Number of Results to Save (0-100)" "" -process "Place & Route" - project set "Power Reduction" "false" -process "Place & Route" - project set "Timing Mode" "Performance Evaluation" -process "Place & Route" - project set "Enable Debugging of Serial Mode BitStream" "false" -process "Generate Programming File" - project set "CLB Pack Factor Percentage" "100" -process "Map" - project set "Place & Route Effort Level (Overall)" "Standard" -process "Place & Route" - project set "Move First Flip-Flop Stage" "true" -process "Synthesize - XST" - project set "Move Last Flip-Flop Stage" "true" -process "Synthesize - XST" - project set "ROM Style" "Auto" -process "Synthesize - XST" - project set "Safe Implementation" "No" -process "Synthesize - XST" - project set "Extra Effort" "None" -process "Map" - project set "Power Activity File" "" -process "Map" - project set "Power Activity File" "" -process "Place & Route" - project set "Extra Effort (Highest PAR level only)" "None" -process "Place & Route" - - puts "$myScript: project property values set." - -} ; # end set_process_props - -proc main {} { - - if { [llength $::argv] == 0 } { - show_help - return true - } - - foreach option $::argv { - switch $option { - "show_help" { show_help } - "run_process" { run_process } - "rebuild_project" { rebuild_project } - "set_project_props" { set_project_props } - "add_source_files" { add_source_files } - "create_libraries" { create_libraries } - "create_partitions" { create_partitions } - "set_process_props" { set_process_props } - default { puts "unrecognized option: $option"; show_help } - } - } -} - -if { $tcl_interactive } { - show_help -} else { - if {[catch {main} result]} { - puts "$myScript failed: $result." - } -} - diff --git a/fpga-xc3s100e/lf_edge_detect.v b/fpga-xc3s100e/lf_edge_detect.v deleted file mode 100644 index d086f95fc..000000000 --- a/fpga-xc3s100e/lf_edge_detect.v +++ /dev/null @@ -1,77 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// input clk is 24MHz -`include "min_max_tracker.v" - -module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, - output [7:0] max, output [7:0] min, - output [7:0] high_threshold, output [7:0] highz_threshold, - output [7:0] lowz_threshold, output [7:0] low_threshold, - output edge_state, output edge_toggle); - - min_max_tracker tracker(clk, adc_d, lf_ed_threshold, min, max); - - // auto-tune - assign high_threshold = (max + min) / 2 + (max - min) / 4; - assign highz_threshold = (max + min) / 2 + (max - min) / 8; - assign lowz_threshold = (max + min) / 2 - (max - min) / 8; - assign low_threshold = (max + min) / 2 - (max - min) / 4; - - // heuristic to see if it makes sense to try to detect an edge - wire enabled = - (high_threshold > highz_threshold) - & (highz_threshold > lowz_threshold) - & (lowz_threshold > low_threshold) - & ((high_threshold - highz_threshold) > 8) - & ((highz_threshold - lowz_threshold) > 16) - & ((lowz_threshold - low_threshold) > 8); - - // Toggle the output with hysteresis - // Set to high if the ADC value is above the threshold - // Set to low if the ADC value is below the threshold - reg is_high = 0; - reg is_low = 0; - reg is_zero = 0; - reg trigger_enabled = 1; - reg output_edge = 0; - reg output_state; - - always @(posedge clk) - begin - is_high <= (adc_d >= high_threshold); - is_low <= (adc_d <= low_threshold); - is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); - end - - // all edges detection - always @(posedge clk) - if (enabled) begin - // To enable detecting two consecutive peaks at the same level - // (low or high) we check whether or not we went back near 0 in-between. - // This extra check is necessary to prevent from noise artifacts - // around the threshold values. - if (trigger_enabled & (is_high | is_low)) begin - output_edge <= ~output_edge; - trigger_enabled <= 0; - end else - trigger_enabled <= trigger_enabled | is_zero; - end - - // edge states - always @(posedge clk) - if (enabled) begin - if (is_high) - output_state <= 1'd1; - else if (is_low) - output_state <= 1'd0; - end - - assign edge_state = output_state; - assign edge_toggle = output_edge; - -endmodule diff --git a/fpga-xc3s100e/lo_adc.v b/fpga-xc3s100e/lo_adc.v deleted file mode 100644 index bba090afb..000000000 --- a/fpga-xc3s100e/lo_adc.v +++ /dev/null @@ -1,91 +0,0 @@ -//----------------------------------------------------------------------------- -// The way that we connect things in low-frequency simulation mode. In this -// case just pass everything through to the ARM, which can bit-bang this -// (because it is so slow). -// -// Jonathan Westhues, April 2006 -//----------------------------------------------------------------------------- - -module lo_adc( - pck0, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, divisor, - lf_field -); - input pck0; - 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; - output dbg; - input [7:0] divisor; - input lf_field; - -reg [7:0] to_arm_shiftreg; -reg [7:0] pck_divider; -reg clk_state; - -// Antenna logic, depending on "lf_field" (in arm defined as FPGA_LF_READER_FIELD) -wire tag_modulation = ssp_dout & !lf_field; -wire reader_modulation = !ssp_dout & lf_field & clk_state; - -// always on (High Frequency outputs, unused) -assign pwr_oe1 = 1'b0; -assign pwr_hi = 1'b0; - -// low frequency outputs -assign pwr_lo = reader_modulation; -assign pwr_oe2 = 1'b0; // 33 Ohms -assign pwr_oe3 = tag_modulation; // base antenna load = 33 Ohms -assign pwr_oe4 = 1'b0; // 10k Ohms - -// Debug Output ADC clock -assign dbg = adc_clk; - -// ADC clock out of phase with antenna driver -assign adc_clk = ~clk_state; - -// serialized SSP data is gated by clk_state to suppress unwanted signal -assign ssp_din = to_arm_shiftreg[7] && !clk_state; - -// SSP clock always runs at 24MHz -assign ssp_clk = pck0; - -// SSP frame is gated by clk_state and goes high when pck_divider=8..15 -assign ssp_frame = (pck_divider[7:3] == 5'd1) && !clk_state; - -// divide 24mhz down to 3mhz -always @(posedge pck0) -begin - if (pck_divider == divisor[7:0]) - begin - pck_divider <= 8'd0; - clk_state = !clk_state; - end - else - begin - pck_divider <= pck_divider + 1; - end -end - -// this task also runs at pck0 frequency (24Mhz) and is used to serialize -// the ADC output which is then clocked into the ARM SSP. -always @(posedge pck0) -begin - if ((pck_divider == 8'd7) && !clk_state) - to_arm_shiftreg <= adc_d; - else begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit - to_arm_shiftreg[0] <= 1'b0; - end -end - -endmodule diff --git a/fpga-xc3s100e/lo_edge_detect.v b/fpga-xc3s100e/lo_edge_detect.v deleted file mode 100644 index d91bf3845..000000000 --- a/fpga-xc3s100e/lo_edge_detect.v +++ /dev/null @@ -1,70 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// -// There are two modes: -// - lf_ed_toggle_mode == 0: the output is set low (resp. high) when a low -// (resp. high) edge/peak is detected, with hysteresis -// - lf_ed_toggle_mode == 1: the output is toggling whenever an edge/peak -// is detected. -// That way you can detect two consecutive edges/peaks at the same level (L/H) -// -// Output: -// - ssp_frame (wired to TIOA1 on the arm) for the edge detection/state -// - ssp_clk: cross_lo - -//For ISE 10.1 PROJ,IDE auto include -//`include "lp20khz_1MSa_iir_filter.v" -//`include "lf_edge_detect.v" - -module lo_edge_detect( - input pck0, input pck_divclk, - 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 ssp_frame, input ssp_dout, output ssp_clk, - input cross_lo, - output dbg, - input lf_field, - input lf_ed_toggle_mode, input [7:0] lf_ed_threshold -); - -wire tag_modulation = ssp_dout & !lf_field; -wire reader_modulation = !ssp_dout & lf_field & pck_divclk; - -// No logic, straight through. -assign pwr_oe1 = 1'b0; // not used in LF mode -assign pwr_oe3 = 1'b0; // base antenna load = 33 Ohms -// when modulating, add another 33 Ohms and 10k Ohms in parallel: -assign pwr_oe2 = tag_modulation; -assign pwr_oe4 = tag_modulation; - -assign ssp_clk = cross_lo; -assign pwr_lo = reader_modulation; -assign pwr_hi = 1'b0; - -// filter the ADC values -wire data_rdy; -wire [7:0] adc_filtered; -assign adc_clk = pck0; -lp20khz_1MSa_iir_filter adc_filter(pck0, adc_d, data_rdy, adc_filtered); - -// detect edges -wire [7:0] high_threshold, highz_threshold, lowz_threshold, low_threshold; -wire [7:0] max, min; -wire edge_state, edge_toggle; -lf_edge_detect lf_ed(pck0, adc_filtered, lf_ed_threshold, - max, min, - high_threshold, highz_threshold, lowz_threshold, low_threshold, - edge_state, edge_toggle); - -assign dbg = lf_ed_toggle_mode ? edge_toggle : edge_state; - -assign ssp_frame = lf_ed_toggle_mode ? edge_toggle : edge_state; - -endmodule - diff --git a/fpga-xc3s100e/lo_passthru.v b/fpga-xc3s100e/lo_passthru.v deleted file mode 100644 index f0f2847a0..000000000 --- a/fpga-xc3s100e/lo_passthru.v +++ /dev/null @@ -1,29 +0,0 @@ -//----------------------------------------------------------------------------- -// For reading TI tags, we need to place the FPGA in pass through mode -// and pass everything through to the ARM -//----------------------------------------------------------------------------- -// iZsh , June 2014 - -module lo_passthru( - input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - output adc_clk, - output ssp_din, input ssp_dout, - input cross_lo, - output dbg -); - -// the antenna is modulated when ssp_dout = 1, when 0 the -// antenna drivers stop modulating and go into listen mode -assign pwr_oe3 = 1'b0; -assign pwr_oe1 = ssp_dout; -assign pwr_oe2 = ssp_dout; -assign pwr_oe4 = ssp_dout; -assign pwr_lo = pck_divclk && ssp_dout; -assign pwr_hi = 1'b0; -assign adc_clk = 1'b0; -assign ssp_din = cross_lo; -assign dbg = cross_lo; - -endmodule diff --git a/fpga-xc3s100e/lo_read.v b/fpga-xc3s100e/lo_read.v deleted file mode 100644 index 8ac58721e..000000000 --- a/fpga-xc3s100e/lo_read.v +++ /dev/null @@ -1,74 +0,0 @@ -//----------------------------------------------------------------------------- -// The way that we connect things in low-frequency read mode. In this case -// we are generating the unmodulated low frequency carrier. -// The A/D samples at that same rate and the result is serialized. -// -// Jonathan Westhues, April 2006 -// iZsh , June 2014 -//----------------------------------------------------------------------------- - -module lo_read( - input pck0, input [7:0] pck_cnt, input pck_divclk, - 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 ssp_frame, output ssp_din, output ssp_clk, - output dbg, - input lf_field -); - -reg [7:0] to_arm_shiftreg; - -// this task also runs at pck0 frequency (24MHz) and is used to serialize -// the ADC output which is then clocked into the ARM SSP. - -// because pck_divclk always transitions when pck_cnt = 0 we use the -// pck_div counter to sync our other signals off it -// we read the ADC value when pck_cnt=7 and shift it out on counts 8..15 -always @(posedge pck0) -begin - if((pck_cnt == 8'd7) && !pck_divclk) - to_arm_shiftreg <= adc_d; - else begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit - to_arm_shiftreg[0] <= 1'b0; - end -end - -// ADC samples on falling edge of adc_clk, data available on the rising edge - -// example of ssp transfer of binary value 1100101 -// start of transfer is indicated by the rise of the ssp_frame signal -// ssp_din changes on the rising edge of the ssp_clk clock and is clocked into -// the ARM by the falling edge of ssp_clk -// _______________________________ -// ssp_frame__| |__ -// _______ ___ ___ -// ssp_din __| |_______| |___| |______ -// _ _ _ _ _ _ _ _ _ _ -// ssp_clk |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ - -// serialized SSP data is gated by ant_lo to suppress unwanted signal -assign ssp_din = to_arm_shiftreg[7] && !pck_divclk; -// SSP clock always runs at 24MHz -assign ssp_clk = pck0; -// SSP frame is gated by ant_lo and goes high when pck_divider=8..15 -assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; -// unused signals tied low -assign pwr_hi = 1'b0; -assign pwr_oe1 = 1'b0; -assign pwr_oe2 = 1'b0; -assign pwr_oe3 = 1'b0; -assign pwr_oe4 = 1'b0; -// this is the antenna driver signal -assign pwr_lo = lf_field & pck_divclk; -// ADC clock out of phase with antenna driver -assign adc_clk = ~pck_divclk; -// ADC clock also routed to debug pin -assign dbg = adc_clk; -endmodule diff --git a/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v b/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v deleted file mode 100644 index 2dbfd6945..000000000 --- a/fpga-xc3s100e/lp20khz_1MSa_iir_filter.v +++ /dev/null @@ -1,81 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// Butterworth low pass IIR filter -// input: 8bit ADC signal, 1MS/s -// output: 8bit value, Fc=20khz -// -// coef: (using http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html) -// Recurrence relation: -// y[n] = ( 1 * x[n- 2]) -// + ( 2 * x[n- 1]) -// + ( 1 * x[n- 0]) - -// + ( -0.8371816513 * y[n- 2]) -// + ( 1.8226949252 * y[n- 1]) -// -// therefore: -// a = [1,2,1] -// b = [-0.8371816513, 1.8226949252] -// b is approximated to b = [-0xd6/0x100, 0x1d3 / 0x100] (for optimization) -// gain = 2.761139367e2 -// -// See details about its design see -// https://fail0verflow.com/blog/2014/proxmark3-fpga-iir-filter.html -module lp20khz_1MSa_iir_filter(input clk, input [7:0] adc_d, output rdy, output [7:0] out); - - // clk is 24MHz, the IIR filter is designed for 1MS/s - // hence we need to divide it by 24 - // using a shift register takes less area than a counter - reg [23:0] cnt = 1; - assign rdy = cnt[0]; - always @(posedge clk) - cnt <= {cnt[22:0], cnt[23]}; - - reg [7:0] x0 = 0; - reg [7:0] x1 = 0; - reg [16:0] y0 = 0; - reg [16:0] y1 = 0; - - always @(posedge clk) - begin - if (rdy) - begin - x0 <= x1; - x1 <= adc_d; - y0 <= y1; - y1 <= - // center the signal: - // input range is [0; 255] - // We want "128" to be at the center of the 17bit register - // (128+z)*gain = 17bit center - // z = (1<<16)/gain - 128 = 109 - // We could use 9bit x registers for that, but that would be - // a waste, let's just add the constant during the computation - // (x0+109) + 2*(x1+109) + (x2+109) = x0 + 2*x1 + x2 + 436 - x0 + {x1, 1'b0} + adc_d + 436 - // we want "- y0 * 0xd6 / 0x100" using only shift and add - // 0xd6 == 0b11010110 - // so *0xd6/0x100 is equivalent to - // ((x << 1) + (x << 2) + (x << 4) + (x << 6) + (x << 7)) >> 8 - // which is also equivalent to - // (x >> 7) + (x >> 6) + (x >> 4) + (x >> 2) + (x >> 1) - - ((y0 >> 7) + (y0 >> 6) + (y0 >> 4) + (y0 >> 2) + (y0 >> 1)) // - y0 * 0xd6 / 0x100 - // we want "+ y1 * 0x1d3 / 0x100" - // 0x1d3 == 0b111010011 - // so this is equivalent to - // ((x << 0) + (x << 1) + (x << 4) + (x << 6) + (x << 7) + (x << 8)) >> 8 - // which is also equivalent to - // (x >> 8) + (x >> 7) + (x >> 4) + (x >> 2) + (x >> 1) + (x >> 0) - + ((y1 >> 8) + (y1 >> 7) + (y1 >> 4) + (y1 >> 2) + (y1 >> 1) + y1); - end - end - - // output: reduce to 8bit - assign out = y1[16:9]; - -endmodule diff --git a/fpga-xc3s100e/min_max_tracker.v b/fpga-xc3s100e/min_max_tracker.v deleted file mode 100644 index 5e8bbedf1..000000000 --- a/fpga-xc3s100e/min_max_tracker.v +++ /dev/null @@ -1,65 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (C) 2014 iZsh -// -// This code is licensed to you under the terms of the GNU GPL, version 2 or, -// at your option, any later version. See the LICENSE.txt file for the text of -// the license. -//----------------------------------------------------------------------------- -// track min and max peak values (envelope follower) -// -// NB: the min value (resp. max value) is updated only when the next high peak -// (resp. low peak) is reached/detected, since you can't know it isn't a -// local minima (resp. maxima) until then. -// This also means the peaks are detected with an unpredictable delay. -// This algorithm therefore can't be used directly for realtime peak detections, -// but it can be used as a simple envelope follower. -module min_max_tracker(input clk, input [7:0] adc_d, input [7:0] threshold, - output [7:0] min, output [7:0] max); - - reg [7:0] min_val = 255; - reg [7:0] max_val = 0; - reg [7:0] cur_min_val = 255; - reg [7:0] cur_max_val = 0; - reg [1:0] state = 0; - - always @(posedge clk) - begin - case (state) - 0: // initialize - begin - if (cur_max_val >= ({1'b0, adc_d} + threshold)) - state <= 2; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) - state <= 1; - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (adc_d <= cur_min_val) - cur_min_val <= adc_d; - end - 1: // high phase - begin - if (cur_max_val <= adc_d) - cur_max_val <= adc_d; - else if (({1'b0, adc_d} + threshold) <= cur_max_val) begin - state <= 2; - cur_min_val <= adc_d; - max_val <= cur_max_val; - end - end - 2: // low phase - begin - if (adc_d <= cur_min_val) - cur_min_val <= adc_d; - else if (adc_d >= ({1'b0, cur_min_val} + threshold)) begin - state <= 1; - cur_max_val <= adc_d; - min_val <= cur_min_val; - end - end - endcase - end - - assign min = min_val; - assign max = max_val; - -endmodule diff --git a/fpga-xc3s100e/util.v b/fpga-xc3s100e/util.v deleted file mode 100644 index 0842ac64f..000000000 --- a/fpga-xc3s100e/util.v +++ /dev/null @@ -1,27 +0,0 @@ -//----------------------------------------------------------------------------- -// General-purpose miscellany. -// -// Jonathan Westhues, April 2006. -//----------------------------------------------------------------------------- - -module mux8(sel, y, x0, x1, x2, x3, x4, x5, x6, x7); - input [2:0] sel; - input x0, x1, x2, x3, x4, x5, x6, x7; - output y; - reg y; - -always @(x0 or x1 or x2 or x3 or x4 or x5 or x6 or x7 or sel) -begin - case (sel) - 3'b000: y = x0; - 3'b001: y = x1; - 3'b010: y = x2; - 3'b011: y = x3; - 3'b100: y = x4; - 3'b101: y = x5; - 3'b110: y = x6; - 3'b111: y = x7; - endcase -end - -endmodule diff --git a/fpga/Makefile b/fpga/Makefile new file mode 100644 index 000000000..e5bca0dfb --- /dev/null +++ b/fpga/Makefile @@ -0,0 +1,221 @@ +# +# FPGA Makefile for all targets +# +# The top part of this Makefile is used to define custom options for a number of compilation targets +# To define an additional target simply look at the other defined targets and add a new TARGET entry with a unique number and the custom options required + +XILINX_TOOLS_PREFIX= + +# Copy update (only when destination is older or missing) +CP = cp -u + +# Make directory, no error if already existing +MKDIR = mkdir -p + +# Remove recursive, force +RMDIR = rm -rf + +# Path to make +MAKE = make + +# Custom prefix for build directories, each target is built into its own separate directory name formed by combining the PREFIX and TARGET names. +# This way the source is not polluted with build files and the build directories are left behind after compilation so logs and reports can be +# examined or can be easily deleted with "make clean" +PREFIX = __ + +# Options to be passed to XST +XST_OPTS_BASE = run +XST_OPTS_BASE += -ifn xst.prj +XST_OPTS_BASE += -ifmt mixed +XST_OPTS_BASE += -ofmt NGC +XST_OPTS_BASE += -lso xst.lso +XST_OPTS_BASE += -top fpga_top +XST_OPTS_BASE += -resource_sharing yes + +# Optimizations for speed (default) +XST_OPTS_SPEED = -opt_mode Speed +XST_OPTS_SPEED += -opt_level 1 +XST_OPTS_SPEED += -fsm_style lut +XST_OPTS_SPEED += -fsm_encoding auto + +# Optimization for reduced space +XST_OPTS_AREA = -opt_mode area +XST_OPTS_AREA += -opt_level 2 +XST_OPTS_AREA += -fsm_style bram +XST_OPTS_AREA += -fsm_encoding compact + +# Types of selective module compilation: +# WITH_LF Enables selection of LF modules (and disables all HF) + +# To enable these modules WITH_LF _MUST_ be defined +# WITH_LF0 enable LF reader (generic) +# WITH_LF1 enable LF edge detect (generic) +# WITH_LF2 enable LF passthrough +# WITH_LF3 enable LF ADC (read/write) + +# To enable these modules WITH_LF _MUST_NOT_ be defined +# WITH_HF0 enable HF reader (see also WITH_HF_15 below) +# WITH_HF_15 select "iso15 2sc mode" extensions instead of original +# WITH_HF1 enable HF simulated tag +# WITH_HF2 enable HF ISO14443-A +# WITH_HF3 enable sniff +# WITH_HF4 enable HF ISO18092 FeliCa +# WITH_HF5 enable HF get trace + +# RDV40/Generic - Enable LF and all the LF modules +TARGET1_OPTIONS = -define \{WITH_LF WITH_LF0 WITH_LF1 WITH_LF2 WITH_LF3\} +# RDV40/Generic - Enable all HF modules except Felica +TARGET2_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF2 WITH_HF3 WITH_HF5\} +# RDV40/Generic - Enable all HF modules except Felica and ISO14443, select HF_15 instead of HF +TARGET3_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF3 WITH_HF5 WITH_HF_15\} +# RDV40/Generic - Enable all HF modules except ISO14443 +TARGET4_OPTIONS = -define \{WITH_HF0 WITH_HF1 WITH_HF3 WITH_HF4 WITH_HF5\} +# ICOPYX +TARGET5_OPTIONS = -define {PM3ICOPYX} -rtlview Yes + +# Here we list the target names +TARGET1_NAME = fpga_pm3_lf +TARGET2_NAME = fpga_pm3_hf +TARGET3_NAME = fpga_pm3_hf_15 +TARGET4_NAME = fpga_pm3_felica +TARGET5_NAME = fpga_icopyx_hf + +# Targets can be compiled for different FPGA flavours +TARGET1_FPGA = xc2s30-5-vq100 +TARGET2_FPGA = $(TARGET1_FPGA) +TARGET3_FPGA = $(TARGET1_FPGA) +TARGET4_FPGA = $(TARGET1_FPGA) +TARGET5_FPGA = xc3s100e-4-vq100 + +# Assemble the final XST options for each target +TARGET1_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET1_FPGA) -ofn $(TARGET1_NAME) $(TARGET1_OPTIONS) +TARGET2_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET2_FPGA) -ofn $(TARGET2_NAME) $(TARGET2_OPTIONS) +TARGET3_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET3_FPGA) -ofn $(TARGET3_NAME) $(TARGET3_OPTIONS) +TARGET4_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_AREA) -p $(TARGET4_FPGA) -ofn $(TARGET4_NAME) $(TARGET4_OPTIONS) +TARGET5_XST_OPTS = $(XST_OPTS_BASE) $(XST_OPTS_SPEED) -p $(TARGET5_FPGA) -ofn $(TARGET5_NAME) $(TARGET5_OPTIONS) + +# these files are common for all targets +TARGET_COMMON_FILES = define.v +TARGET_COMMON_FILES += mux8.v +TARGET_COMMON_FILES += clk_divider.v +TARGET_COMMON_FILES += lp20khz_1MSa_iir_filter.v +TARGET_COMMON_FILES += min_max_tracker.v +TARGET_COMMON_FILES += hi_flite.v +TARGET_COMMON_FILES += hi_get_trace.v +TARGET_COMMON_FILES += hi_iso14443a.v +TARGET_COMMON_FILES += hi_reader.v +TARGET_COMMON_FILES += hi_reader_15.v +TARGET_COMMON_FILES += hi_simulate.v +TARGET_COMMON_FILES += hi_sniffer.v +TARGET_COMMON_FILES += lf_edge_detect.v +TARGET_COMMON_FILES += lo_adc.v +TARGET_COMMON_FILES += lo_edge_detect.v +TARGET_COMMON_FILES += lo_passthru.v +TARGET_COMMON_FILES += lo_read.v + +# Add the files that are unique per target and all the common files +TARGET1_FILES = $(TARGET_COMMON_FILES) fpga_pm3_top.v +TARGET2_FILES = $(TARGET1_FILES) +TARGET3_FILES = $(TARGET1_FILES) +TARGET4_FILES = $(TARGET1_FILES) +TARGET5_FILES = $(TARGET_COMMON_FILES) mux2_onein.v mux2_oneout.v fpga_icopyx_hf.v fpga_icopyx_lf.v fpga_icopyx_top.v + +# List of all valid target FPGA images to build +TARGETS = $(TARGET1_NAME) $(TARGET2_NAME) $(TARGET3_NAME) $(TARGET4_NAME) $(TARGET5_NAME) + +# Verbosity type for ISE tools ise|xflow|silent +VERBOSITY = -intstyle silent +# Echo (Q=) or not echo (Q=@) build commands to the terminal +Q=@ + +# Pass the custom variables to the lower make rules +$(TARGET1_NAME).bit: TARGET_FPGA = $(TARGET1_FPGA) +$(TARGET1_NAME).bit: TARGET_FILES = $(TARGET1_FILES) +$(TARGET1_NAME).bit: TARGET_XST_OPTS = $(TARGET1_XST_OPTS) + +$(TARGET2_NAME).bit: TARGET_FPGA = $(TARGET2_FPGA) +$(TARGET2_NAME).bit: TARGET_FILES = $(TARGET2_FILES) +$(TARGET2_NAME).bit: TARGET_XST_OPTS = $(TARGET2_XST_OPTS) + +$(TARGET3_NAME).bit: TARGET_FPGA = $(TARGET3_FPGA) +$(TARGET3_NAME).bit: TARGET_FILES = $(TARGET3_FILES) +$(TARGET3_NAME).bit: TARGET_XST_OPTS = $(TARGET3_XST_OPTS) + +$(TARGET4_NAME).bit: TARGET_FPGA = $(TARGET4_FPGA) +$(TARGET4_NAME).bit: TARGET_FILES = $(TARGET4_FILES) +$(TARGET4_NAME).bit: TARGET_XST_OPTS = $(TARGET4_XST_OPTS) + +$(TARGET5_NAME).bit: TARGET_FPGA = $(TARGET5_FPGA) +$(TARGET5_NAME).bit: TARGET_FILES = $(TARGET5_FILES) +$(TARGET5_NAME).bit: TARGET_XST_OPTS = $(TARGET5_XST_OPTS) + +$(TARGETS): + $(Q)$(MKDIR) $(PREFIX)build_$@ + $(Q)$(MAKE) -C $(PREFIX)build_$@ -f ../Makefile $(notdir $@).bit + +work: + $(Q)$(RM) xst.prj + $(Q)for item in $(TARGET_FILES); do echo verilog work ../$$item>>xst.prj; done + $(Q)echo work> xst.lso + +%.xst: work + $(Q)$(RM) $@ + $(Q)echo $(TARGET_XST_OPTS)> $@ + +%.ngc: %.xst + $(Q)$(RM) $@ + $(info [-] XST $@) + $(Q)$(XILINX_TOOLS_PREFIX)xst $(VERBOSITY) -ifn $< + +%.ngd: %.ngc + $(Q)$(RM) $@ + $(info [-] NGD $@) + $(Q)$(XILINX_TOOLS_PREFIX)ngdbuild $(VERBOSITY) -quiet -p $(TARGET_FPGA) -nt timestamp -uc ../$(TARGET_FPGA).ucf $< $@ + +%_map.ncd: %.ngd + $(Q)$(RM) $@ + $(info [-] MAP $@) + $(Q)$(XILINX_TOOLS_PREFIX)map $(VERBOSITY) -p $(TARGET_FPGA) -o $*_map $* + +%.ncd: %_map.ncd + $(Q)$(RM) $@ + $(info [-] PAR $@) + $(Q)$(XILINX_TOOLS_PREFIX)par $(VERBOSITY) -w $< $@ + +%.bit: %.ncd + # Hacky hack, make empty files for icopyx + if echo "$@" | grep -qi "icopyx"; then \ + truncate -s0 ../fpga_icopyx_lf.bit; \ + truncate -s0 ../fpga_icopyx_hf_15.bit; \ + truncate -s0 ../fpga_icopyx_felica.bit; \ + fi + $(Q)$(RM) $@ $*.drc $*.rbt + $(info [=] BITGEN $@) + $(Q)$(XILINX_TOOLS_PREFIX)bitgen $(VERBOSITY) -w $* $@ + $(Q)$(CP) $@ .. + +# Build all targets +all: $(TARGETS) + +# ALWAYS have some hardcoded text after $(PREFIX) to avoid rm -rf * or rm -rf /* situations if PREFIX is incorrectly set to empty "" or just "/" +clean: + $(Q)$(RMDIR) $(PREFIX)build_* + $(info [-] Build files deleted) + +.DEFAULT: + @if [ "$@" != "all" ] && [ ! "$(filter $@,$(TARGETS))" ]; then \ + make help; \ + else \ + make all; \ + fi + +.PHONY: all help clean + +help: + @echo "################################################################" + @echo "# Valid targets are: $(TARGETS)" + @echo "# - Builds only one of the above listed targets" + @echo "# all - Builds the FPGA bitstreams for all targets" + @echo "# clean - Keeps .bit files but cleans intermediate build files for all targets" + @echo "################################################################" + diff --git a/fpga-xc2s30/clk_divider.v b/fpga/clk_divider.v similarity index 91% rename from fpga-xc2s30/clk_divider.v rename to fpga/clk_divider.v index fbb3250f1..0bcc2e608 100644 --- a/fpga-xc2s30/clk_divider.v +++ b/fpga/clk_divider.v @@ -14,7 +14,12 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- -module clk_divider(input clk, input [7:0] divisor, output [7:0] div_cnt, output div_clk); +module clk_divider( + input clk, + input [7:0] divisor, + output [7:0] div_cnt, + output div_clk +); reg [7:0] div_cnt_ = 0; reg div_clk_; diff --git a/fpga/define.v b/fpga/define.v new file mode 100644 index 000000000..b7423278b --- /dev/null +++ b/fpga/define.v @@ -0,0 +1,155 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// 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. +//----------------------------------------------------------------------------- + +/* + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() + Send 16 bit command / data pair to FPGA with the bit format: + ++------ frame layout circa 2020 ------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M M P P P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ + ++------ frame layout current ---------------------+ +| 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ++-------------------------------------------------+ +| C C C C M M M P P P P P P | C = FPGA_CMD_SET_CONFREG, M = FPGA_MAJOR_MODE_*, P = FPGA_LF_* or FPGA_HF_* parameter +| C C C C D D D D D D D D | C = FPGA_CMD_SET_DIVISOR, D = divisor +| C C C C T T T T T T T T | C = FPGA_CMD_SET_EDGE_DETECT_THRESHOLD, T = threshold +| C C C C E | C = FPGA_CMD_TRACE_ENABLE, E=0 off, E=1 on ++-------------------------------------------------+ + + shift_reg receive this 16bit frame + + LF command + ---------- + shift_reg[15:12] == 4bit command + LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) + Current commands uses only 2bits. We have room for up to 4bits of commands total (7). + + LF data + ------- + shift_reg[11:0] == 12bit data + lf data is divided into MAJOR MODES and configuration values. + + The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) + 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) + 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF + 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening + 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling + 111 FPGA_MAJOR_MODE_OFF = turn off sampling. + + Each one of this major modes can have options. Currently these two major modes uses options. + - FPGA_MAJOR_MODE_LF_READER + - FPGA_MAJOR_MODE_LF_EDGE_DETECT + + FPGA_MAJOR_MODE_LF_READER + ------------------------------------- + lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) + + You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at + divisor = 8bits shift_reg[7:0] + + FPGA_MAJOR_MODE_LF_EDGE_DETECT + ------------------------------------------ + lf_ed_toggle_mode = 1bits + lf_ed_threshold = 8bits threshold defaults to 127 + + You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold + lf_ed_threshold = 8bits threshold value. + + conf_word 12bits + conf_word[7:5] = 3bit major mode. + conf_word[0] = 1bit lf_field + conf_word[1] = 1bit lf_ed_toggle_mode + conf_word[7:0] = 8bit divisor + conf_word[7:0] = 8bit threshold + +*/ +// Defining commands, modes and options. This must be aligned to the definitions in armsrc/fpgaloader.h +// Note: the definitions here are without shifts + +// Definitions for the FPGA commands. +`define FPGA_CMD_SET_CONFREG 1 +`define FPGA_CMD_SET_DIVISOR 2 +`define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD 3 +`define FPGA_CMD_TRACE_ENABLE 2 + +// Major modes +`define FPGA_MAJOR_MODE_LF_READER 0 +`define FPGA_MAJOR_MODE_LF_EDGE_DETECT 1 +`define FPGA_MAJOR_MODE_LF_PASSTHRU 2 +`define FPGA_MAJOR_MODE_LF_ADC 3 +`define FPGA_MAJOR_MODE_HF_READER 0 +`define FPGA_MAJOR_MODE_HF_SIMULATOR 1 +`define FPGA_MAJOR_MODE_HF_ISO14443A 2 +`define FPGA_MAJOR_MODE_HF_SNIFF 3 +`define FPGA_MAJOR_MODE_HF_ISO18092 4 +`define FPGA_MAJOR_MODE_HF_GET_TRACE 5 +`define FPGA_MAJOR_MODE_OFF 7 + +// Options for LF_READER +`define FPGA_LF_ADC_READER_FIELD 1 + +// Options for LF_EDGE_DETECT +`define FPGA_LF_EDGE_DETECT_READER_FIELD 1 +`define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 2 + +// Options for the generic HF reader +`define FPGA_HF_READER_MODE_RECEIVE_IQ 0 +`define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE 1 +`define FPGA_HF_READER_MODE_RECEIVE_PHASE 2 +`define FPGA_HF_READER_MODE_SEND_FULL_MOD 3 +`define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD 4 +`define FPGA_HF_READER_MODE_SNIFF_IQ 5 +`define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE 6 +`define FPGA_HF_READER_MODE_SNIFF_PHASE 7 +`define FPGA_HF_READER_MODE_SEND_JAM 8 + +`define FPGA_HF_READER_SUBCARRIER_848_KHZ 0 +`define FPGA_HF_READER_SUBCARRIER_424_KHZ 1 +`define FPGA_HF_READER_SUBCARRIER_212_KHZ 2 +`define FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ 3 + +// Options for the HF simulated tag, how to modulate +`define FPGA_HF_SIMULATOR_NO_MODULATION 0 +`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 +`define FPGA_HF_SIMULATOR_MODULATE_212K 2 +`define FPGA_HF_SIMULATOR_MODULATE_424K 4 +`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 + +// Options for ISO14443A +`define FPGA_HF_ISO14443A_SNIFFER 0 +`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 +`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 +`define FPGA_HF_ISO14443A_READER_LISTEN 3 +`define FPGA_HF_ISO14443A_READER_MOD 4 + +// Options for ISO18092 / Felica +`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module +`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect +`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag diff --git a/fpga-xc3s100e/fpga_felica.bit b/fpga/fpga_icopyx_felica.bit similarity index 100% rename from fpga-xc3s100e/fpga_felica.bit rename to fpga/fpga_icopyx_felica.bit diff --git a/fpga/fpga_icopyx_hf.bit b/fpga/fpga_icopyx_hf.bit new file mode 100644 index 0000000000000000000000000000000000000000..b62cdace60a2f3d95eac23c61b26a334a08dc47a GIT binary patch literal 72749 zcmZSJ51`~$@vA974aEqdU?qy3`q<;#>IvP2B~F*h6V-<$qd{^ z21dsE2B!MP1`H_-oQ9TGCMH%Uh773;jM8`h|NsAg)y&W|1BM1h1_lOp1I7dpZD7Et zz{tR0_|$;$03+i;hRFsD2SDNsP<5OJ3?O+17@yIA!GR%w!EGS}4FMAa1A{07LjwZ? zYXA+cp}En54j@0U(AW=p0v-w-j7$zR_YSo!;6OHTNW?T70~3uS6FEre$ku9*prdV6 zvWiiFN(K#}G2pUx0PP>OdNc$^Ltr!nMnhmU1V%$(7>9t!;P4xwm(qabAW(-7iOayi zfKUe(9|SEul->&1Q3!$y!Nkonz%4~18F*g><~~Gg6A_@u&cgH~LLH6VI4F!A4!%Uo zF@qvpsp5#JsI)ZWGoh=}(xRelY|_&H{soO?y;}AEKLZ0u1|*)A29me20m;BH!v>CB z>(}!${8{m5#k&W;PW=D(kMYA9CBl24%CCS{b4?Hl9BPe z0hj|NKCC+PVbz&GAhF*dq1e0s|NsBRzzAZ0U2y)u|L-g;3=O;X|Nr;@KSR>r|JXde ziP31T5u?#uD9sBRPXl8{1CdRPMzSC|DCT8UDPRC&h5`m51_Kr$9t##uh6)A{W?-pc z;NUP|;8ZYR0I3I=2hzWZ(Wn<>9;1c<1E)#_14td%45(QkIT!|sV`GEFK=y%XY<>`8 zWDqf8WSYAPf@L=`GW9YtI504(I4~G7GJ*IYIawnlaUli<7N{IZ93;=n$>71jsldR% zz{oZgW*$^cFUV|=7!>z{^uydDt?M`Sx31q@G~5fapMljwD3Y1FB==Na=3Nr7E@zSMtKXiO(U|?YRuxizrRjbx7_^|5K zskX z2IQigfq}CDGSurRVZgx115wS$zyJz)DBq%ik(EJ(frWtqj3G);NJbF`2F3{t3?Le$ z21NTXXf!Y|Xf$vh&}d*3&}iTQ^CcM$@MtuE)PUq5hJe&TSYQ&*c#RS?jt+noA_!&< z0R{#R28M$z3}6}@3>*wDj3762FfcT;Feor6GB_}RF7_ zL3|E|0}U)Z3=NE@7l8fca{Ms^1M3ln4v?fE0|Ub&=EDyjF)&+rq~WGAK7N z96fbdx%u*mhKEWF$_&j649pCZPdc<7U^xBwdLx4})JzbCk{=iqKmptUOBf()9T-62 z$;_a^z`(%)3OWWRMGkP2%z;6`0ix1@d4d1~g9DR*0uO@#BSQlNi=qG%DBu_bpkW8H ziJ<`$K@1Emi~9re3N{o(ApF4iKp_rfgU|y8IR*v>PKOT+3rxVN1*DFFFKH16 z2NQz=Iw6j($U7!NQo{a|zuU~UNNU~XvOndqRy;GmXJz`(%C z;qz`(=Az|X+Lc%7etL0`m#fgQ7r1#+eXJBJ8^0FS_f6deWz z240X51Ef{VW5K{A!SO)EL4cuwrvfYi&h9cA3``6~8Vo!lhZ`6`{t!uM<|}x>z##Bg zi;;ncpTmHqL5ATCyMO@$10$0YGb0BB16u+EJA(me5Sx*KL4#qc0}GP^M4N!5##K6SBsleDEz|g|t$im{l;ON4^z`(@hw7@`y1vE`0z@g^A#K57z zz|z#j^tT>wti4k`==wgRFcBLy@-p#x55>6EzsXsfm$+ft|03fq_AzfQ3nlfkBoDlzurJ3Nje@9U2a`H8e0!m2qL< z;@H4EA>Khzq^lvhTOMRMIKo*QM8JV?fK$Ljg_$FPje(PqfnU~vt--*fx!*y8fkBMn z1Cs+N-YXQ}XE-r3X#9M9prJvHFNom_vj+o%h(iS^&l?CZ*n-22&!OUh0G9l~*Z`V0 zV_gG#DHt7#tKhIC{9a8ax;nI64>@ zI2pJYID9-9SXdZ5Sa^Jz8kiVbK=JLs!qVc>!pOtX#K8b+gLrUwF?29E@UU<=GB7kW zfLt`CfrW{Qg{7l~0o-Ha;n8ql5pZDAXaQvq1_uonkpCGO6dV*7L_kht0>v;WeDGp6 zP?5vHz`?`=N_AWuEDS6RJUm=1JPa%>Y&;AsYz!(43=BLh3>+*BJPd3gJ3y(Eg@uKK zfeEA*#A9H9R^cF*v9K`kaDYr@0UO3N1tbXycLo*)Rt7GH1*{AVtRQnh`dL7!734dJ zBSHEhEO0>#Wn!f`1cD400vG}m7z(0f0sttbI0GWi4ryUFC7;x(o#DV$*W+SX%fYDHK9#A+#*=Q70B?~xfpvj?e zDVQz?^#W{cK<)j|RiOUBe+Edu;qYNluVLoQ4XU+KkbXu5190CK#0F!Y3IXJcYsBtDs(JR1|nTgX2E~WMt#rga7|SLqRgeXQHB_ zqCjS3X8!+gYz*q_BKoIkGe3aAnKP?aff%4(CaAB;&(F{G;A8p!{~uS){QvI%e~3J& zCkj#rqCb2H4TXm~mUw{65y60J2QNcnn4r+Wz$?JOIKcqiH)A{l>1#5sfzmw?8e}XZ zD}xf01{Yf3?j)#E1eG12;RJAPz|p`c!sy1JqHuswgoBHNLE!)cgCqllM(U4(HG@ne z9fRG^0qR~s`ld}R5)6zC8Z3=03=E*YC1VSec7f75P#WY;0S0$)`Krj^4l)NM1nO&n z`kYX{3o{FYB8#HH$;T{>3M`5mN4ppr!F^R2jo-x%9H34q>j7}OVq#%n1vM~1jSm)v z0}KqT2Q(QP7#ms+fO=C0m>C#uGc+*>GcpQ4UUcY$%jCyG$C;Vg84etQ*Z~f15Yt78 zfeB;|Gdq(KGXn!Vq%(Ga9n>XbW)=Ze?92>G4D5_x2?Yia#U#KW4C<>sW^6ccf`PfA z`QVAm4os&{9KQ_dGlR@!V8Dn64h8`h2L=aFgMyI-RLwInG%$gJhCza%K>@6lkwHO$ zMS($pfrEoVfP;aBp`odPfz^?Lg-N7=iHU`QMbLqP5u8Lotxc#sAc~RE0aS&vFmQmD zmNjrR1WXVCSs?)8cYt~lpoUBXLjxy+0;7yVF(ame!#`U07}S=4IBm!8Dt!o90Z&WFfiya2f!3K7Y4kiXhrZWzV1{}OioDUg1EI@ierY1KqF>naTaIj3!FkoPi0ryE6 z7(ji|X$cIB0S3$oI~W+)4lytYNH9EL;1GR~0BY^YI6h#IV7NG$mw`bvjfa6@f(Qes zD-ALb(vWpvT%gARj$KIK2_l0a7l4waf&vSJAb50xgVzDnxK?0nU|aTz{BNnvXkL+gA5bP0R{`jW;QMbHj$kr44^>}2MbVB zdf@{ZYi4Bz0R{nC3)bci1_t2{{{h2`jX*q5MVZq z%VA()Fem_Jd8j)%K(24byKu~a$$`se0XGBV35FmW1_m~UN1z@PJA(rw8_0g11O`41 zfe*}}dS1kqv4Nq0iB;B$v7fQP36w)mdk8Qv`ZR!gu?!3{E0S6jJ}5WH?P1`OVNi^V z*^|J)z;J+1U=QPg1rDHO!5Z8E4#@;?=5%0SKH$K>z{g|5z`zfZW?%qCBnyKbdv^rX z2Mr7k;HIz#gwGA3(8&e|P`5)tKtRDmrGcS=!-GM>fq|ie!HdVm!NH}8hr!3mfx!jT zO=SWF38NE(01E>r3j-I20#6H<0?2MgCJq)B2N6&rY+(@L;ox9mWZ?j1T^6l|ElutI==$Ak~m0%Bm{;VEHY zoxsMx!^30Xz`$UTz`(;W2NVL3@mmEhCI(IhPKG=#28L~X6AHk6J8)+Y>@r-00|P@t zzy$%&C}Ds?0ch}O186u5tXzPBhed@!fklReK}2U2g9@mY09E`992^b&JPbUbfh4UM z3l>luGJqnULxG{8ft5j^0hD}sIT!*sco-OX8h8RG#IS%kH4F?4pw2EMLjb6c4;tD8 zTLj9rUVtz_zyM;wgt5}#%8r2n zQt5#@JD`XLl__A0p!#8KtR~aMA&kd%-+#^8(C5B0w%@ z1i2WL&cWiG;H(H9djeH_PzhXVGtV}{|qeP+yP^Q#PQ$;Xn28)geXI>AUOjpiXsR~O<++h1gODM|DWLx zsGkSI{Gp-zAR5#MfX!8bdJw-B%$)XX!MhF+1j+w7@UG+k|Nr&78B9U*ng4khe*b3( zVNnCg!SG!{Jv|WH-d^t=?_WdkY%8aB$sc=Jds&b;46CbiFzoJVV1V)e*MqvA|Nl2M z?BD;t{(opa!-WQh20?}fhO40*0rLAXya5gq0|s!PP{9B^*U7+I0hLH*KCj7+^?c_acfp9#ha z4B)v{&>Se3pMb_!abREsi77BJz|?^HwIHK7SAa-}yWn%8p!recc~M44=44<<1ZQ_p zJc8!aL48P2Is)}Oe=Yd60F-7{hE2`-{~t86ac1UoiD{Y0aAw-7P==KF{|pN2*K;u3 z2N|;pL?GjL|Nny}U}6FB{AXZn7=8B+10*fo|NsBPhF?B^zn=Zi;jo(<)E@=)QXzfO zRjXF5GB$?#jsaYIgE*jY5P-~gg2qC@7$gpA>4IotFlZDOqz+VrDljl`iYx%lk1}{q zSkS--o;Za>Iui@17GYrEg4)L@ppd}G#lYYQnkNMUl!!jzcG%zr9vrGUrSQ$DQl)!YCgQ@}(3&R2?4n_s028ISE z2GBeT14ENYBd8C?+04)g(g$jRfemE<+X7)SGB7YQgF2hwdJoh`fcGOo4K}ckJQgs6 zEC-FKE?{7GSis44@`! zqta)GhRdhfA2J9t2sEAmDZYIK(ywJW%y5{M;lPoGgUrnChZ$HL7@SWCGcYK$GO{wV zIyAapW?*g-KF!SRz{tR$d;;QXSk(mLIe;>T0|&${;MO`w6oDNW6hQSc!vaumk^$6< zU|>>UPymhYgW?|?@(c00V;q2c(e->KrpLGP5u#Ft#wTI68PZHh^6L zbseMy4B|8}JOEh%N|YTuCZG(#+z%3$NnzAyXkc=PEqb75!@%sq(D)#(kAu<0Q-t{d zk46d;lOyXw84ke);R>b&G8a<#`EC@5%vC)gPn48X-h0|N^SD+9wp1{Mn@ z2XMrL`eFhqA`BcHklIHS92+{Ic{Bws21Z6UP}85oS%HD6osof=K>%zF2Lpp1C#ZmH z5CC;tKuSQa1`mfo7~tH^)WF=pP{JU{Q1F0ZtqbD;9)=6dpm}E*M$o)H0~-^A0s}uI z^8tow%pVLI7&2tU7&sV@9AM+KkYFidU=X~(z`#67-~oeR1tcwj(+JZ8&>&6&L&5?! z872Ut|8`OA~F@!Ez0LME6i$M(scs@*ogMo|Bhk=37fVqjmZ3Tma%?AcK1__3M z22hJkg7Je017b51Qg0QM=0r3=qecuIG8QZhJOvC43N|1QUT$Du02S947)2R17#JCp z7=$=PS{y)A_$Ddr8U;)WB6cbq91M&N3>+E^9!v%d3_Bpre;H_m$5b#VFeGhYG-v>2 zWd;)_==y`87AA0U%L68b!K4NQQ-gyU0|R3rcZ0(Z!Bq|k3%CS8`!yLDxOfs1&vIzaUo1BU|#2a7`kho(bA10xqBkAV{d4;PmP2Nw$u3l|Fy z2L~uuG6_gA7%(yj2rw{#%1}gt5&-u<1vY^CFyN7eJvJLeCou3Z@bd65@NqD3@bK~Q z@Nn^P@^CWn@N%+ofo4E?7`V7NcqMolWI-Y_7rqPz350A&ak7A{ceFn~JVpuRK%9|JEB!x{w!P;V6!lOVi@ zgTZ&g+*z?~99|3?Y-Md3;&>()FjxkZf{HLujm9M)!^G9Wz{9}N(7*>;p3uP1zym5? zLApU@3#b|p0dYWrpxItU4FOgj4sIS*9*7T285neU40sqA3IrIeYz!ng6gU_ZK(Xi` z5@5x^RluSIGMxdu?gG62i5C=<3`_}W z6+_BbFcV6Ef&$6}+YV;4fQmyf2I&M%aD#-w%>s}mAPz_ZECBKcm;r8jfmz^DKae8Q zFvw_-As`x}6TC2l0knnzv?s_tNL~hI zeUJn*Xp9@g0LKlO0h&nV0dYAL7#Khe4X`LShd?E8QB$-29C-0!at^2;@oT~V|9=jw z41@GbXHNV7f9bS82S7aykPM_ZP`j^oU;elM|MI`(f8$|*tj$I4LA-N$^5mV%uYh+h zzqoz{oH_;TUi|m~>4V~O2f8>9xa)*2ii;1bi3np*{}F`2{YUUTCPWWN4AkEQ^)*3Q zh|$mm1v411fW$%iK>br(uD}pyWDo`=HUU^)6hi^3KoBDXXdV>QM+ME7g62)(7`ZQlmWqO85u@#6&dM^zj^^RFyIj0`N?iVR>HEDq|6LHnjK{dj2b3=kuvFY4gL;E0}y zFtk3Dd)Kjh_rnV0J}3%%+RT}t)VBZs{r@~XJUp0cNBu-oT&$Zt^uwPyiqAz`!7&fFzA<5GEV!ZUGrg3Ccu3Ylb;MEmNp5P2jRp zqoIifwDwD*ptqcvvFCTAY zynUcy@$tvU8-!0VGM{+NaJ~5uie1bM43`gsTA<7fk53CTGaNVp;-DzO;6S_%S`o_v z+62YK1R37PP=_o4nwkU^(o7&73ZS7z1qTME1_ll$29|~ep!K+nAYX#CNPyIV3UdY) z1|}9J2UZ7ASCENC0knkF0o3*905w zNSbRT_!$IPFUch=I;AL}eud!y(-#h=>?=J2jto;66}mYX8A0tBCWZtC1{;te zEeuS$=Q%*_F9t?;83qO^8w*eipMgOG)NV33+GcB@7{b8txQ~N_MTrCC79++3piZBF z0ca`&$!@$%P}3Q&0)(Uh<1vOcuP3NYT5}*~LvfSCCs%e6PQ_-16v-|Y+zu}VqjoqQD89ON&t-nISVj>rm-3s zK$F%C42=w%1VHNxIXD;&uyC<}*o*>@#*zrA-Os|n!qTBAsF1+GFf)Y=Ffb@NfXjOa zhX?@&2Mz`Yhky`p(Z*oWz{J477$U&X1YTh+0CEnf@M&RaU{GREU}|s>U;-6m3=9rR z;JLR31_jV`cz{3$xEsgdz{mt??J9u=Mv$#WV}qRuCcq;ZaM=I`fr17Bfrbg-ekoiS zg`qG36vGCfX&A26?T47+p zvw(wvj{%$q`1rUO_!z37`2u197IFgv57-YI7#KjEM-~RqNC^WEDA>Rlix!v=$jK_u z62kzrw5AQz1y^AKt;J_h0PV}*&|pX~fi@llm>EnM7#K_#1Q>J}6gUJFm{~!Iorys} z17r|ru`VbA1h@?#bHWB3;2MPiJOv6`U;wig8x2l35D7*Br1}sPju2tOB-j<;b`GXm z^uchDOHou|w+IqA;53M$8jZsPF2dkzu|cxf%>&7hjX^~ZB&|V>KngUd2sR3wIv60? z4Vyev4CY`M4HYJu0$T%~Rv=uQfny5IWL&x+;vC>C4;paApQs_K(Trx`Xau_sT^NNA zYTJLWw`N#6ZCcdKY17g`_{EE9Ht#y7X8l?)E$YvK_KIH%9?F5#@&7ma_5J@prayoF z*PEI$@c&_6wepNHNCvdq6OO?GFyht!&7T_>-YbLn0lz@IR8g$Q$$`W=1E^BPsRkwi z>Pv#=EkXGb9|rX&L48ipx?PYu5F509ms16lPeH{N1cTHeV+IazD+;_;7h(_0W&$*E zDHUP}XpE87LquBDLlzTz&E2i)CHq^|3$nixG=IPVUZ27O+B=HUABF7+Me3Kr`k^3; zz-$#9#RW(K8s;Fu53geP|6e+7+0=)+CzH3dpR`<=I%o2n$x9C}n|d<&WHO{zIx}tQ zQczm>|Nq5{00v{O1z#D?fYK0TpC_m<3Yy&n@m8%mb0!qN?-Ziv|9|^c|5w4-Ximk+ zWg;RUz%+YLQD^}7(HKB|OVHj(2+e`U2k$S1B~l&+hDHH}21Wr+(8`ws3@nnM8sz{3 zgJlD+1gK9cz;F`YHw|E5VqswNVqifXeuOyy2Mt>QgF_lcxLaik2WahW7r3nf@&lwC zK<9UWXFL!qE4mq4LH*-~CXq%(21SjACg@t*W^kWWg8|kzZ2(P@GBPlCinutiAWvta zxB`>zm; z1_cI&2Mo@iAGa+2bfzF92guJTNoEGwJ@_VA7F7{ zJiz3@;J_jPn$-k_iXyn_#sVA7ZDL?xYyhpZWMN?ejYB$sX23z?stk?-;8}Fg1Q}=> zC#YUzVo+oNt=w&5wa-@RDzkAUON1 za%3=IoR9(X2??$OX@_FSyeO1|m8xKHcVH-B*EzrtEMn2_8fT(7g(2hdRF4D)Mj69H z;tT}}oD2;K4HFm`m^ndpw1MGt87>9}HjrZt*uis43>M4{0vw>eDFZvmnKB?b1_lNl z5QmAuZAu7Z1E`G~0BJg5bq1y&TrtQLOlf2h2Zjy?CI$l)1}zpP9sxB0hG{C246I5F zTuO`)EJ_WGOiT?546dNoIZKNGXveSug99ULffGXmXc43fXzrnbgM|^ag0+Ex5j57s zzyZoPpuKirzZkGsFmN>RFfcHJ#&tl664`p3Y^DYVLC`P?P6bF3HjIJ?G!n#R5n~N zCSyYdXy+@`Ob!MHL1+Oj)04Gdlp zEF3SMvIqpkFw4GR6%k-cV3v5n$e>}u_-I1ILk<(+kF!D3P$Cr!{Ge%NABHau3?2%a zpbg!!AS0LneZ@hJA?XWULeK9V^AW3ngm`&2U^>W zRkwnNlK=w;gHsR#g8_?xfMkFMgM)&Th=d>$XlhkNA^_auF)$EN5HJ*C5MU4i9S<;p zMS#JBflI@qfrUYYfkS|ap^ISxiwFagM+2jRB9jn<0u!TxAOiynQ$q)XfKU^I!VHxL z5dj7Zkh8El15{w6NI)H5z_0-fK}7;o2t^r~V*ncM;$dLWO#qiP90C~(409bAcoZ@i zK#S&ig!n*ZV9=ewA~%I0fMGA6UI9pBfq(#m9w$QpgTcND z0ib2|mRSN5K)d=GKpQv%7+4Gv{y zpw)jMnmGJ{;lls-|3CaW@c;k+fB(VjdH)=koC9j_r=_Kxu{Zz!eO21bRsa9|FR-__ z*J@z6`{$p)#|QsAUcFFIsQ=%<@ZrJ#KL(I>lb{p6&zxTs!~ezyr2ovSKRkbUc6aR9 z@lFZE4-RJjOq`=gRRubg0+iVx7}PffC<{bCNIeLH_LGA8 zt1vc*55izRg8}vk#O7pDQy`BA1E-D$gAk7gRy#obNKoIC6SQv>l+IW@KRxPu;2BnW)i`LcrX;97 zL}2hr1lXt$q>l=!7{Ecq!qC73nk3{gXkcQ|XkeIO0G_pQU{P=Y&5v@*fcm5i48C(9 zGzSN0u`ejSVsis!VoW07Gl?3Spl1w$dNQDuZD1O-_5#{Rh0KG3cK1Q{kurg1Oc)s& zn!vP1L!$@-152X@L#Ids189B}))$4*4FW9=3@)(l24!wW*UiibIufIisp;_JX2t`` zp#7krvqKmd9y2U*V1RTT8zpXo`mDmxl|3LW%);D^jKYtU7%!hb>@3{i$iQ$|f%%aO z`$6z(mm>@ybC?(z+>e0jH(`c@3=F~yZkG?72S*{g8?f`iZ3FC5XriE068DLU>BsbfuV^5H1y*jpuh;)NU6Z&pvcP5pa_~eWnp1( zFaQnxg1bXZ3@nVGmK3;@Py|)-EG&?Pe;{+HiW?ZX49rCR85mdu6igIAO?(9=69v#2 zAtH?e49q+Y4vHccLIHe291INx$*y87g6p}mnf#T67}yxCnG*Dv9x(7|fYxfVFxYA^ zFf=eSX)sy{wDK``6o$#a2@PL`2En#w=#8Pnvf%aA=jt9&R97*gFoD2+1 zIn3$$91IK`I~bT5IGFMocCgFKaWEbTWjMej2U<_Y`0;=`C?;Ky*FqEL6CzcCoXEiB z#sJ=N4BAM?(h$JFz{BVOTDsEEpuqq-R*1oX;erE$4S0jABLjy)3xk5d0TIv)JUEjG zfHn?;N-5CUYz$7G3<5k10!)kwLV^km%uNE2r5iY!ghV=Agtn#{of+F#1f;Ap_WD8SeNI?gMDO*zOxP(*^m?2$ts#|H+3jE4sV7zH>Q z1-Kgw7#I&|Ffgz)q->lb;?U%7z`*2Y!=b?B@c?vYlrkuzftzq7q!4_LMwROj;AB|A z)S$s|M1mnZLV?49k&D;%0qB$)1|gOY3~mex3>*!N3uF^6w&^e^Fv*D=;^1OnY0zO{ z;51+Wtv3NVl3_Ln11p1!83VtA0IOIxLq&rJ10zF&83Vh_2M0c;tjq^83=HZbTTrbg z#KW?F9fuYN0|y5O1@Lh=0-%Xn(7I~@7A6Lb01lymfB+^30fq<$K~UwS0b0_*C;;lE zF*L9UfX2hPAkoDF+E?wu09w8QN>!loFp(e~gBH-v)1ttXnApr%D@i<&Tp|Ao2 zLjq`tFQ_;L6^06YpkhRTLxDp<0mK4{3kXbz1+VS}AHe|fkO1g-Ej|VghJq~&3{GO; zDbIic20noeptI5hA~-?o)^|(*<*x#UDu%5Jpf$9<3LsJZ?gdR}fLsJo1xkbv79J85 zOdyxT6@wfII!%CqfuTl00kl7#kAVTaW|x73fsuiO;Si$}1A{>aR}TYt!7s>cmI*wd zFc#o4U@2f=;OJqv!@wY+qh-L$06s|!GEPL3tN^kd1%v&AB7(``fvl0il)x$CKyGF{9pfn=Kqubz`H*G|38!V!KS03qaiKl|9}1{n;d@r58!o^ z|Cktz{|kcqtpET2{_p_A0?l%*S@VnQ@Bapdzr0)w=kL}3|Nr|BL;e4M|EupcFwC3@ zS(^*)gw(HsuBS(FG*%9H%{xe@5kwHepiFGQz^PLK-cJhZGlKe^=$H|7PA;ejW`OQH zg|5>Dokaxdn}YhOpm|RY(4ruy9Lx+*{}ya6xZg_1Jy3a4QXr@w3ToCfGKe6~8e);% z#K-{MKMGmD3qEHTq>dNu%pn~=PEHN*!e($<1G|97g8{ZT6x2Tj^+VzPSg-=Z1gLRL zSQSKti|hZT{~v<(1~dHU=QlPsHfH!A8Y(Aeb2!T8@U*CVK|U_2C1IHa1>0lR>cl|Nj5~Km7mCz;WjP``rr~e(id->hE39ygMX;{$f3I^6+7M zdx)(>kR;5Dg4fxC&$a~(M1mTgpqT@#b~G^Za5DIS&l<99I0mLA8E!Br9AFmFWCEX` z%K%;~1L~uKmd-(oYK{g*21s9*k(82#gtP?jgMw0mA_Ft54~p&!X3!}n91P8{Glm`^ z=0O!%7&V$fR)VHLnOGP>`#+mO+ebksgfcTQfcAklG>fz-uz*Tsbc1p5LFVC*!W0%} zWe~oue3)S|JA)F_BW3}2<^>E&kC>S`1i*`9nVAF_Kr>>@34J@Bpe1 z(;4U@B+ZLLG_!(xpe>-IWk1QGr45L^7y{t-zq6zz&)x0vSL8 zW+j*cS(w;GI4awF50BD|>2eiA$gMo!dQ1Au=!(p!#2@5CiFeG;{BrtG*=FY+G ze+$qybWn0-Z(v~Hk)FuFz|5Fn!BCKq=Acly!LdP;xm~VRg}Ig^Ik}%f0D3qm1G6Ec z0Qg*J5?oJY(qrOpc=3RlgMo#Mfr0S>V*&?g5|Mwd!2$*@j|Gbunzo4fd3?VlCjwf6 z7y*i0K87s}+Tdn{2ZOf^s7A11;P%N;U@+P7#euD06$cjs^A%49B{l(ur=X4Q3=Db~ zK;;BOhaIS}CEf?1Nlju^3or;cIe<40g3}-aXq`G}3R8grG>r)E%P}Yj7(iy<0t5^g z7(oYNflkz8VBi4t4qUi&7*rYz7?>O!l@z@MRRkCmoLm}p7?>P7z^6zt1SklAcCafL zfL8C~cNQpN;#YwwYrw#&;9%gefde$V>M()Hpa67UQv!p9frA666K2cc%K+*cS{NjN zdY=pe3ZO*9z_4Kh3j@Oj0~UrH(7Y)qqbqEgFu{On2NL&k!Ehrs}p0>L#4sJajUor?xG0XKo^ zO@c)$Zo?>&0mTbN1`Gnt;MxNgrO-Gf*;(L0HIj9qXuuwppr#>;G9oyb=>wl8NPfeo z0$uLEJoDn2XLh^1c=46%#S5O#%a(oR`nBN2i_rg3-tRhIya4SM{d3^Yfn&$!%vlw+ zbk#qB)ho`NTCf?^m-xkX>QqC+`2*`0{NZU>boaua6~BJHyBiOZ`v3pT|1_}}5f|NsAC{{IJb>P!AN1&05I z|H1R^5B}fi09^$1=g$d-_fP+?Uzz$)xBUMCknf1|1_^#R2VILxoWWpK4WOOoJfJxr z5m4Jhqk&Nbv_==Sn+voMhf#r6(FbHGAJ;xf_998yLikFtdK(Q@CjxmP*d)N00YD28y}p79hj9_92^*! z84fTX&;s>V4}fJVAkQ)~LT1(kKn+m`2L{kB@k|UNT%hCr zm_YLYpr8N^=d&;ffVyy?K;)SOxMXw~9QZ_C7)1*hm}HqY zuJ&LE(D7(;$a3g?=p>i|8n7?nonvyagOQ1O3IoIMhYl;0=kN%yFfa-xFf%bQ@H6gU zVCN_jo4{dkC6wXS2L?V+1#Q3}=fPCn#K81v3ZGGc3rEJT1B@#QKx+jc_EMER!0f}o zen3vZ;ef2*lLj7#WrszzKo_T|91CGM5W~jtumQ9Ij)Cdq!WaR@7SN5!bh_{`Ffd6lF`QszU=ZN|ot(qZ99FcWB7Sp#T4Gs8g%2L?t5!ubKo zVZ<{JFc|TGw?Q8;v0&g}a5&1wz{tSO=CF}P%pjvd!9nAgf#GXa4kOK%Jq!;x*rpt8 z;bolJ&hNnBXv-kL(Z?acF$Hw;`xg<8E`blspxh(s(E{3I$?V|B(jf5ggS1(Pm`}fe zzya9$W8&RLq)Mg>3>*wh6Kq`B1e%OKHuE_gVhdxaJj~$2%5Y(AWtM~M(OC>rG+o z2ZIa0z!C;Vffiv>Is@R5O>n1@kYAJxloSk@SeOJr+eKJF>$e$Lm{=4%6a+wLA2YZx zflE6D0Rhks;|2i^4o?9?0Z^w8bVdSClK|x48wDW+7SMiWhDi(pTmqm*6X;-DP~R5Z zO;TcD5OC070G%*S$USKCpw=9k5GFSPJgqx{2Q;h;lLf64U{Khnkl+B?1j+^4#BODv z#Ky&7pum#DBEVp4H-UkHZ^8ry8_+;S$^?daWuV3sFM~n=AA>=G!UPWkJ_d#Yh5*os zN1&j$V&KvP`FkJC2I|rR3=#qY;G@Mr=f8mCfdRC;L4kq60JI1LbW{-opA^Va&?QC; z3>sV(3=N=jyBRoGKz9={fLzPK18xZ^fHoe3BQ8K820X$EQ2{<>3UmYySQW@Ds$x(u z5o;jWb$AtHQ9+6YFtfpWK=};$6qmRqx(4)IWF-2JT0$5BSQ}!0>+w&`WhI*R{ekXVeLD?Kgu5t%Dg61tjd}zNDG+zmtw*>bWp<>wB zAa!tYP`?tnzsXa<0yzU0R1zX#kUdZg>Zii`t6+0L;voA#Gzf#(U<~yFGKJPBgh`>V zuLa%B0-6g2-OU0$a~E`e(Ol5kMW8!cVB%n!fr*oWkx3LZk6OgYHn)h84Sc64Y>h8y z9u(9kh4n*WG`JBD-E#^P1Jf`!!W;*pk#bgA@}d=I&;EFD`}S*wHz!`a_r(!(}0XM*l> zF$PVaGZ-8HXNZsg^WnpmfB!ZZC_v8J{lD4x0K>a?2O8F|`4{r**MSD+&j#SNpX-~{nO(+{8(D4-G;>K@-YpuQ|VTS51Qwt(+q=@5b3=gA1V08o*E z33ktC`;is}9@yM2KBGYPg7%7lYC=$%0dfx`18A))=&&3YCK1SdDD-^X2Jn0+Xqr)k z0n}$@U}k~P;CWX?1_qdWxkaI@B^N8SiUeFD3pk62_8bAg@En{L3I>5vP>g+HuJ2W`5 zD1x?;f*Km2OGz1689@CE1_nj&00*cU$|wL@Mg(rvC@_GQ`Z6>u0PQ>iB}u4}APP~o za{N$W;CL`!mH~85r}BNq1m<-NCK^l}3=hN(FcpAplLdt*6R5kw(Cx9|V4DELBk8~m zC-pfPQkoccIj}IAFgP$7uw7c8Qr}F5qKeW#9xKk-1PGv?^RLV+X&2iDDBQ z(*kZ=1||_DLQ?e&me)T!GM8ThJisrpn*}G0kq_V;Sp#Y-~3Ml|s8O#|s7#Mgs;jgBR=>jLZoPoPq~rc&b2G4YN&QC^;av zg@JDZhfFhL3wVs9g_%u(Z3<(;5?%(z<2noskI~`+;u98$KmpK3%>bn)5k>|91vh3T z&~`yKh7JY}1{cunOAZX+McNFYQk?;G4+N6}mjZ(jg98(fBZmNkB6AB1GdMkgt~69& za9{%U0@xau1R4&2Is_Vw3^Q1n95|d9m^eh5nL0uFiNS%vNq~i80)s+ACj;p6SRsc7 z7KVfd(Bz#)fS)6mN&|zyqXUerl?o!N0)e1R!Q=!=Yc3E+qmc~)j0PHv9bzUD3=S3_ zk26%Tup5*JFw6n>mRZ2r(*Sh#O6lhZBB0Hw9G?_7m^^IaVB<*a1sw?6AmG@;slXsm z!ost`-~fkAgD`_Y$sq{|1_ovW4+aLtL>ZZM-B?## zIWR6TVEZJk!N9`6b1`vtLjmJF27?4`bpn(h-QV0PeS_{i;JAmGgGqR1e#=W7s0!lD@l z2Fm>$jtdyLelP@sY7dZ;kT7`VMgxNYBZESN1L$B|(4liY3=BREUZBI*nHU@zKoyq= zk01*R6Sy-9O5zL-Ob!eUpf$A&42&F%3@i+SLLvg71H!;_w4m#rKm%alkw}gy z27}as#^j(h3I#e;3o5_@*(3uR1K?rs0F`f`+gK9#`1s^l7_t~R9e5HrD;X377$y`5 z6o~F)*dX8_5Fo%}Fe!I~0iS^y6NAAvh9U;G4Gh~X1id`_nu#N&`#H|2yqf!F{M+pzecvcorx3U4W0#~5H z0JNdFfuV^nio}z{fo^uoM_XfQt791_luZ zK3;|f2@V?>9R>yg5gr8r3my&z865)y9!3KW7OoJ10#HL2Vhnf&6~@G%!S~*R;sNAV z3|a6JGAyEu;7zcgDh(QIU^UpwKd=;$1bE63RIPv-FhuGBtr3AL#p(d490tV!ZQr3v zfFl=G2&+1DC0O_*xdy5qG*AKZKe*2g6@yTqCJcmyog^fWT^Dsk`9AJr03EaV=FEkL z=l}mph_ZzI+0W9$qOW9c&BD@f;9bYG%y;iX8LYYZ{@?w#d)NOzuU7r}^X?U>e~OID z%aM;U1x-r`iXzLOIr9Ji8Ef!b-hT}L8GeK2Mem=x!SMOlg$DaSfBx*)@#xY2`ZKG( zF6ig`v*HB9*9E@<{_tE4dFOI9sVAutd=LF5OLY<9Ff$nC3_ATdb0^QNV$R-NqgU-$c^*4Jt6(CJ5*nB5Q z|0l@(E+Bc?O$0^I=wx}z3!BPgg3nU)5+y%uyUC`9!C8HO_*cS1w{p8>71 z-QDrx#fumJ84e#_6$-k|7D5{v+e5GR0o_0fTCoedQ50k{$kfnP|Nnz}tPl*k@%9(j znGd^v9a!+|*SmLX)_hp?FNA;Qtf_M*&zcG%Ie!{2<)5i1TjI_?bLQbQt3IrH@3p&|j4y6AI zk^z?@kUl6g=wM4m1_lSl9`JmqBS<}HJ`vL60jb6ue*!rRyp|U!sl)I8fgHdL(ujc> zK{rQ$`g))SHi(9*09}y?IHxlE z(1j6nzi15~U}k1!U}9kgoh1TwI!a`LYzBD~EXN4C?=XN7G%LUg+P>+)09sZH zn&xa!U}0zh-A@Q|321jBXwM#K10V|rQwvK2sN(>dqyWwIfLCmBa5QjmFoM?dvM_Kc zG$=AKF*qDxY~nb;09hx^zyZ3o0klt%0d(3FLklYdqeFlrLjy+xlLPpaOBMx2CKg6e z2LQAIxWVB70|$Cz3G8Mj(1Zr#0S+c6MF#=a3v3JrKu7i{=rBA`5wT!y=3r#v5Mf}P zz#yI2b|K?}1&7O1LO6dhTF&;K=YofJ3D5fI7ngHck=F1|BBR zC;&@qg}{+O2M)#t4k1N$4~D}NcpV&AI2c%u=t5RFgX5FY2)v??k->-=bQ|jd5m+s+ z!2!C%4-YFatUe;b@qvZuBWTZ8 z0<$6mBZ~-=0xQQh55I;Ajs*=Y9BgYD5|)6LETeh=%;Rw4WMD855MXo^;Lu=T&=8xz z!o;A$IDv^vkb{xIv5A9&i=lzbO_|ZHK^2rkK+Qu?pMim6h689}@dSnt1{Q_@MGh7b zR!7kI8>q$R(FiJ(z@11?|CNb>g9+Rx1SLvWkhM$J3O2@DEtD`gZk444{N7#R*SFo6~zCuyP1_73y381-u4F+b=G#03& zVMt*HjRgoeI)I18n8EY^p!r}>A)s*p)MIC4U|?Rr$FY@}qk@BhCxKPq0K?%9836%q zK8B2T1qKlg0Ye6MF_sUG3``FiWDFNLP7uowwb-B_upv;ei!X8011E+9tnhq`>-w27w1$3`QCZvMfxXbnMU6z{15)71+?hz}CRT!+e1$VNr{SL1KeE!@_BNOpA|z zE)524({%v#(oGl`8bG%g*)X*7u`n<+*f217FfuR**+qCaFfcWU*?{i$5ng4mg@Hj9 zv|fAyqqi)mG-6=j=VZ9JPKGh_fP=`U4l$+=Oq~LU7#%zXvovy+vB)wow(uk{u$fpe zPh~b)+#tgE@iNc7I3>5+y~%b;Lvhl;@|+Upw|JNmE*<31ELrl7&<&a$CCh+$6Qnpnv!Vjyway1~xV(CN{{a$RJxG*`tAhj{$Uw zF9$;rtiPur06v_zfS~|fW{WVifa8Io05k#sx(!f4fI&bJG${+p1)!ieVBiAx{UA*T z1JG$k2B1_1vBm^qX9r|r8?<5{EDj324w)V(pPvI%U~_;j!Pej~;8EZZ0WY)$7seJ` zkOMFTFfaK4n}mk|xei5|1ytIgh@f&HUO*MY%>(%Xn=FR4*c6d123qF@*G$Tm7q}*5 z1~~g63qaXeiyf#O(G)B%!f0@F7DG2E(BUc|vY@6PghhYy-Mjz)85#KBzk3%D;NtRs z6~meTs~8v=KK%bbEpwm78RMC0ca>iB&77Gzt?$LO%wG%s|9^zs#YAH>Fo5os1ob~4 zJ&3fl%xRFdx4SodSn&Vf|6l*#6+HOx;Qzl5piaSucT9f_c6WgKnmcwpd9q`N`wq~Y zXlN*8FCjla!++48LJ(S;4@`0>K#lQcz0=ioxd$X<+t6L48sN z-U<d5)x>a*Qw6tzjFR$7U2CzL)GeB%mzY<2n`kF9Wh|z57Cq}cmSTJbW z2a-RaOh&e;puQ&(=4D{;U;y?1gcv+nKy#Zx;C?5AENBiCJU|bhr-Yn4^ofxP*5{Np zVqoe7^+!Q{T-ZINkp3lP4X?DW*VNs*UUNYhDi7+bf-u;9xYq%r-DL{uFhRZW|3AZj zQ2c{>jG!JUi2na~LBp?K|5t&Ih55B=?U#pg)26Koeb_!TZCWNM@st|y{jdLjreXJv z1(3OPhNVl-7%yEqb0(;lxhnL3Jt#GS`mrDrZEQehf_R|a$f+w4aN4wK(`KeYAc(zw z!5;%bIrkmj6;Ww6U<4v;(xPl^(qtc{rF~d+<^$B(pmrIY37W%W6k%Xs1obIFeNPd{ zJf$Cwc|<-Q$UG&F07nC84wYesf&-Waow~^aF^8FjL5cAUxDUzz+Rg#)gMvoRK=Knb z8bGHGfVyXlBA~(nRM8-uLo^Gi2m`qv)aQiJ%+PsC$h;_~iOpgy3OtG&EFg8DLaR{( zbQmjWy%p$eA_f<*IiNmg3z+W?DwA0n8Jt031v>MnnW062r9q>ikp(m#s{v|cfac;b zEh0sP8PpsGj}|krgZhICj7*FS?F|eJjm!;=jLZxRIs_Cz^*_|#%!d{oK5+OT=)hu7 zYnoY!nSp`5h1s2znL&}^z@mi=4nhp>?ne)?GPAoYJ!W3O;Lh-f;Q<4vX~@71x<7I= z!{Nt=Pbw-f9B_Gj_%KME={Tc1xCtV_$l%bT(8a_c$SUZ--~!%<%D~{Hz{2PXno$C| z0?B94a!G*!)aPVkWOQf%pIidIGmnu4eA6lea{$u;Mo`lMbYcu>c{U3u4KRu@NiYR4 zGc+6kEplrB^*TY9CxA|bRA6CdQQ%+%-C)B4I(dr2fy0A|gTsNT0W_EaYQ%%9Hh~TW za2K7$fh7Pm2?kmu2i{cVz_0*xSv`0`F!+iWu!99acTPAkC^F)?R7yYt6v9m4c~MX} zaWV32Vc=I_U~DWgVCeQ?5>R29(8fJMfUC`hW#VkmP4xl{44|!f3=9?u{9tPeAR)vk zP{6>zaFD-|fq4Q469Z#UhJpYGgVJhVh6xO8OiX=DObh}JMjIO&8I(b%X0h}#C~*6f zus3qCFi&7$66@f3@r0kxWl@){z>}5^78V9x%>ousFI|)&gqSs=#E21#sypk3LK!FA_7iIJPeHrCJamr2~8XV91V|{ z88{qdK^+DsrUfEF4WOl54WK~;kpDD59U~4#(A_RfOst@N#SR=ytdcCOj4Ys@KOYMt zLjsco(*lkT(9NeDYziD)9104I0^sdw4Gax48dw+tgqS9<1~Irem@o<`I60&=I57n9 z$}xB-ure&*WCES11$8$H#dvUz0jPhlz=4V306T*VtFVY6LyHWu;73Uj{*}kBZGYa3T7~afvo}5$p;;iAj9wg)amAHuz1kR z!N?`Wu%gAe34E61vgQUBua*M_Doz}r)MLZo>X5+1AY+yQF3$q&7`Pb{m_RG085|7Q z8boXv+d-44OdD938yH+zI2st#GfEV=I7})6G)mYT7&#bLdlVS5@o2ER%QbA!VBmV- z&{42Lijm_3Lr02H1A_^};)VpKC;^55XEqn+2A+%u;8oY4kcRiWz>Wvm31)!q?G#X9 zXz^%K;Q?Rh0h&YsExllnm?Po?>fflSFfeF<&M#)*;FzKUPW(*`piwdg1<g z07C*p45(BoV5s6OVA{YpfkA*Tz{W;^gR39`~i#04oEB zErS6AXgzCyg203TE(cBq7ZwAC4WQxH6ozS~psQRGz-22$4+{g=22dT%z{9{|%V01; zmw|_u7i9A`g3~ZWP96)xLDX2^+U@%~d+gFkV?qz}pxoB;9fU!4f@tC~2WSif ztQ@2lguxsH0ZKUt9>{wnZi$42Es7ynIgmUJYRq7j#w`fZ2$~GQt_IUvpkZE6HHuw5 z(W0a3>;^q6ndIKy5yRIvgxi9SB7jRzsz5sYm2xs6qr45b)>EVVe&& zANXH4{W&l#^IgZ!Z<*6Jz4&t=bJ}4W5Fdm=yF!0{d+`6n{{^f6hAud;;{OAN@Ny-s zQ;_}xs8fL-|N9SGWBLF8zg4S1=g@%e<^ZkS1hGNuH;s)~ospCKeBhnSjvcxcANWD* zGiO2ow0{BVWz0-NxExVcaKh#yLD`4^2K667^P>no72vyAc-4M@X;6O@v`-YqhtaS; zCWw~St(*E=w{9*9)~N#xTZ38#U@Wa$B?{}y8ZjEph2c$%M&Q04*dJ)g6WZUL3!0Ba z-uDSsi-mypEkXTH(7b3bXpR)r_k@b~g4X4N%ml5?MOo{Mbgv7{SkU@jkXkGl?p{#8 z7=&SZz%)u)*fs@BY6FT?Lx&1odD+ea@(;GiS~igJK`l8wJs4&YU^(|KIb^$sK$=EnF6vAfs52E?`KYaMZBX{Z4so*tFp4{yK^+P|LY4`_rKZro` z18B(%qzDH|;KuOzO3-{LsD(5E(WM3VH9>1tLHU#e+y@26G(=njbXE}qY&^+vc#|}&k+~D>vsP(YmFsRKAnrA)4&dknmfa#>L0BEjzGV}2V z%*r4+sHJEWC?r7*IZ$hXS)qXi++zYY{5V=bjW!lgyGvjK!vT&4h6$VwEEAX*m=r`n zvk0J?u7QJrqk)5g#X+Khg^`Itp+Ud{-2HBWRvs)YETDC73ZND)=3jv=H!0klpnVSQthf)|5DnbW+=MW+}TnAQi- zz~`AV$nZ5V=rJ%b_<$N@2@G63TNoJh9x!k@6a=t?#2Ez`*!e(hkOJm*(8YZm43IOB z6f88D_!t-)Kua$`_rW(XFdkqw0{eD>AA|6EG0p`47={BX3``0PjRJ@G8JHEpcTA#1 z0jODc05o*R12SmS0|uso2kZh251V*+9vom`P;B9SB5spa!r5 z0|O%y3x|Rt3n)E0z$P|8i(6S37#$Q8!Tn$cE(Ik4RtA9vE(T^sRSgCP4i82KmTRDb z4eD?Nv$in!5#}IU0 zFH95Y*eMwM69QUWjy1;%YFGSgygq%E#cjfC02$)xfR-bh;Xshz+>gq$#qY1Y(H=0|V%a z4hD_~AU}h}KqDCp44=Ef93}=~2GHH|Vi^J)3?CTe7??qO5J2}zf)?H|Fo-Mw4dgX2 zh%qjQ%&dWRfkzG@EKnC8oQ}C5K4;Ki;NW0k;b8FK0bS|?3P&ae4h{|QDt1tJiG@po zLx6=rfI&irg+YKt0oYE78VhK5FRG*eVowZ9%2wWX#m>s$pEz(bOzuA3kHTc z417D7I2hO%IQSSGK<*A;NnqoFqz68R4Jr%@AYGtzuK@0(2PE*#12Y&D6c|`Q2RBb( z2$%r9Fa~5J+XgOh2b6(f1NaVaPA{lR$QEeP5f5m3oC)Gk9?*JQ7RdZAwD$_`gMh@L z1wY6bkSU;y37P~34PS%X5FkNtsuqCi1gV5#uzs*g$V6!a3kM5mK#YTd1$5;L4+8^e z`zh$wBMue@jt&+E3DD|asAh0C70$+8-yta>h6#2rF$zgjL!7aoQW;?`_EHxik6@vj zj?PD@q=W@(G?A*GBtJm1CBzC)Ismhf1;GMCo`5x;VID!}!^BCYsbvl^_M)c+bUra= zU{gaabFi5`DmEGdBRB*=l>%sCD`@y1#2#uv0WKOG7!*M3Y#Ts5Ux3!z`(EoJiP%Pk5~Zhih?XJ;ALP~fN2dxCj&zPNDYLu0o<1a^^GBXWD;~BSQD}U zj13+yfN@|nbZ;(<3-10S^-tmASQs$#U||g7GeGV~M$rMqnV)5K!jCb^+c$nKuIGj3j=ru1k4Q3@Cu9#qG8z>9QPmr5at058-o~w1B257 za^NGgu{aTw>#+#q6e3kUPJ_@TL>O2=BdZK742&%d5^M|)83b4oppH*qP@E9p0vVkH z34xZlLG^>SctMzuvH-#+gG4hIWCC=Q3dAH5!%{bBvIWcrnF`el=0iu7AZ(}vSPaAl z4|stXWMa_v3y4+`2IxvZ2p2;B|9=28AcKPg0zl{3f~LP=fdiVM zL$66eV}^{Nlia{_)q}v{NKOFl{{`L81Df{+vB6Rx&%nwJ1_lPu8fn)jL!raLF?@q1P^U^0IJ0?)eNKv(+N=J25Lz#1ZWh1mNa0xMu52i zR4X_*FtUjlEnyMIR58FJ2N-y47`VaxC(uz)sICExmV%aZC@2_!u76el&C8;y7#uwC zeLLVnNP!8*q#LYN&&$ONz9wgII2^?l2@DLN3t%CG6)2@YXfl|AM*!5o2TcltHpZgp z95ftIS_eDEfI|SXfDOzWIs{6v<48(F$2SZ-DD~P9ayY0N0d+150~2Un29yV*7zG$W zD^x*yY(c#T<1;ppGtXf1gMj{Z;?<4+|Nb#BFs@n&>Puiai4k-!pph(SE%GKtFb!YZ zi=lSF1VDpS5De;%!kvNCfq?Fv1)UcK+B@3|S2M^Mu(Ob{ISX{+6Qn;1Spkhr%|MF% z`~RQg|DXRH=i~qX5ARq68Vwjo=TKxf;{gQ+M(8>&iVPY+&7Gj`bb|)c03xbm7#YBW zkf?%#hIfF00d$V-;ls`cjwr)j1zN}r=YX~yA#(;B+X1=)Rzd=L0THGHZ7+b96?zCl z_HH@M#Z)n{BA&wc8kj_V|9#!0=t0-g9A^=2he&_@XBSZ>IO=X#et1s z)4{7eT)qMf4%teuRyK-rz*PlkpFdcX;sZ>;rcjpvyUBr3#DSp!y!0N6>C6lo3<6vl z44iG6j0VDkZruB!&@n;2Cl|y(_kU_MiJ*Bv48mt)(AfhzPizT8j}4Y_eTbrgBPVEb zPH+%m(ExSiOc+wo>o`UQ&?#*U3ZTxO68MbnLD(HNXi#tn1l_zE;LsEh0P3(Y;JaB^ z0MgkTxG=|NGql^|AfN>v022T;N^PME`4|{D48U{10s=e?3>KhaG662oiBeDngM~5x zA2R~-fds@q2?p@a>0ogqk?w#Ls-V+yiPSKNl)?JbkT?J>SsO%-Bho1_KVVZ1TXww4 z{{N5v|NeugmhJ8TBOlU)O&i_CK>g2m495TeLwEjy9Kg{i06wl9Tt9=(Q3sC#g8F(4 z&~u(Zss;~cOfX;o&4?MXTakeU z)E5O|BzM8v6rjE+XgmXSdT~_L;2YQ2|DT27e?5c3ga7sS57#24b>tcwRM>(rXyYW3 zCkGL;fq{#G!G}QsbfY8O<*>W}b|7X#=fNj&!yb+qHT zxMqMoBFu0?_(8*hhNBFPk8zF|gHECZZFd`Bx8k*)g@MHZv}Y4}85gJ}3(+L9h+lz& zd9nekQF=)9t+-*XO7#MgM8^B8vjX*bvz-0yr zgXIE)oq|xA00V=_t_Mq?ITkvq0ck`rFsFd$>zEiB7(sX9AR=gxctL@|NkYJYfq`*? zBWUrZ5>l2xEMZ~^7GYp)FaYhvW;g)#<{)uD%o%J4L?l3iW3J4ts9hXrJTNS5Z)8|J zfy04=3$%(BrftyB9h?nf3<0c*zzHM*lpo;XECg!Hf^NfMPyn};KzD5o&e1YZSPL*P zI0y(B2?&7B6-EzUkncbk-0)*y;N60*V8HpHeZ>X}3>$J81o$`w6m~H%@bNKlfNE}t z(;!U@0nicApspxHaFCIp#svr~fY;4{>N04f2;8t3WR4}>Ip73Dy0(GS0m`)?40k~T zqW=IF8{`ZH1_qRaDG-&zAb0qv^F~8p6pV(zXb6mkz-S1JhQMeDjE2By2#kinXb23; z5cvNebf<~^|NsBroIx2(Cg9uS{c<)HA0NZ09z!@2RRYSxkSAa~T$;c9fBF6Y49wrZ zzkmOK|NrlB2^0osv;Y~SND|3uU|4AQ2j376wDSrn4|0 z-4BXaC1FV#j8!&(7FH-K;B+HY-j}fB$Wn2j0W>SR0K7(vECYzqqyQh4MxclpXnGlWK({0^Fo13w0fi=-GznbLiNp-xt2(fl1GgTF99}yV7(m;{@T48^ zq6hFY6m13#25;24BD_W;4mkxWYhd7$YXI-mWaNQf3IP%ZP2BL9fR89)lQ94tOv}K> z&;Xji0m~9WXrC5hV07WAIKaigP(42htB!*Qz_AS4dgj3ZK3f^9G8}@CDGcZVp$*`( zy%?An1mFi!fPx4Vf}oounHnJK95}$M@^F}lF06Qffq`3JjqL8o%Z9H4`MK<7+@)Pc^Q7GU5IA*u9W758c2Fp6PNVzvZMihKyV z0)Mh>26HfQ@q&Vsi-8Zcwk(zhbb%`<_duFm1)K(48$id3FlZ<+Ff332 z75V`@27CB8L8+0)VGkbzLlsAW1P@<<9#28s0uE3q#uuj(!obAGz`)A@TAmFm4|w4x zLh*uHc8~%Kxm*K@BrphYC4d+p=YnpXg&!F&z{B9c-~+yrRe=F?k!wJJ2EjGDT;MrM zNC^z_4F`j64;MoN_*~*H1_O=`aE9RE;o;!m;A!CCVc-E}5RiKrI1mvEcM;fGU;=!g z40zQrD5$_fplIh|F=1d}u?YZgYz;5~g$2@j2beNA4K8HhJPZaxnhpDYats}ivKCz! za~m{vb?Ex2%SZSI#ay&RiXw-^0UhIw#3h!ARD2Mt1r+Z@tA!}U>j%7&5d9;OteS1W m&;W`aE-1|m%4S0yL;b>Pz_0-1H&FkTk%1vT94gL>?mqx{mZ13n literal 0 HcmV?d00001 diff --git a/fpga/fpga_icopyx_hf.v b/fpga/fpga_icopyx_hf.v new file mode 100644 index 000000000..b7730875d --- /dev/null +++ b/fpga/fpga_icopyx_hf.v @@ -0,0 +1,227 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// 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. +//----------------------------------------------------------------------------- +//`include "define.v" + +//`include "hi_reader.v" +//`include "hi_simulate.v" +//`include "hi_iso14443a.v" +//`include "hi_flite.v" +//`include "hi_sniffer.v" +//`include "hi_get_trace.v" + +module fpga_hf( + 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 debug +); + +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +// Receive 16bits of data from ARM here. +reg [15:0] shift_reg; +always @(posedge spck) if (~ncs) shift_reg <= {shift_reg[14:0], mosi}; + +reg [8:0] conf_word; +reg trace_enable; + +// select module (outputs) based on major mode +wire [2:0] major_mode = conf_word[8:6]; +// parameter to be passed to modules +wire [3:0] minor_mode = conf_word[3:0]; + +// configuring the HF reader +wire [1:0] subcarrier_frequency = conf_word[5:4]; + +// 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 + // 4 bit command + case (shift_reg[15:12]) + `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[8:0]; + `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; + endcase +end + +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +// 0 - HF reader +hi_reader hr( + .ck_1356meg (ck_1356megb), + .pwr_lo (hr_pwr_lo), + .pwr_hi (hr_pwr_hi), + .pwr_oe1 (hr_pwr_oe1), + .pwr_oe2 (hr_pwr_oe2), + .pwr_oe3 (hr_pwr_oe3), + .pwr_oe4 (hr_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hr_adc_clk), + .ssp_frame (hr_ssp_frame), + .ssp_din (hr_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hr_ssp_clk), + .debug (hr_debug), + .subcarrier_frequency (subcarrier_frequency), + .minor_mode (minor_mode) +); + +// 1 - HF simulated tag +hi_simulate hs( + .ck_1356meg (ck_1356meg), + .pwr_lo (hs_pwr_lo), + .pwr_hi (hs_pwr_hi), + .pwr_oe1 (hs_pwr_oe1), + .pwr_oe2 (hs_pwr_oe2), + .pwr_oe3 (hs_pwr_oe3), + .pwr_oe4 (hs_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hs_adc_clk), + .ssp_frame (hs_ssp_frame), + .ssp_din (hs_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hs_ssp_clk), + .debug (hs_debug), + .mod_type (minor_mode) +); + +// 2 - HF ISO14443-A +hi_iso14443a hisn( + .ck_1356meg (ck_1356meg), + .pwr_lo (hisn_pwr_lo), + .pwr_hi (hisn_pwr_hi), + .pwr_oe1 (hisn_pwr_oe1), + .pwr_oe2 (hisn_pwr_oe2), + .pwr_oe3 (hisn_pwr_oe3), + .pwr_oe4 (hisn_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hisn_adc_clk), + .ssp_frame (hisn_ssp_frame), + .ssp_din (hisn_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hisn_ssp_clk), + .debug (hisn_debug), + .mod_type (minor_mode) +); + +// 3 - HF sniff +hi_sniffer he( + .ck_1356meg (ck_1356megb), + .pwr_lo (he_pwr_lo), + .pwr_hi (he_pwr_hi), + .pwr_oe1 (he_pwr_oe1), + .pwr_oe2 (he_pwr_oe2), + .pwr_oe3 (he_pwr_oe3), + .pwr_oe4 (he_pwr_oe4), + .adc_d (adc_d), + .adc_clk (he_adc_clk), + .ssp_frame (he_ssp_frame), + .ssp_din (he_ssp_din), + .ssp_clk (he_ssp_clk) +); + +// 4 - HF ISO18092 FeliCa +hi_flite hfl( + .ck_1356meg (ck_1356megb), + .pwr_lo (hfl_pwr_lo), + .pwr_hi (hfl_pwr_hi), + .pwr_oe1 (hfl_pwr_oe1), + .pwr_oe2 (hfl_pwr_oe2), + .pwr_oe3 (hfl_pwr_oe3), + .pwr_oe4 (hfl_pwr_oe4), + .adc_d (adc_d), + .adc_clk (hfl_adc_clk), + .ssp_frame (hfl_ssp_frame), + .ssp_din (hfl_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (hfl_ssp_clk), + .debug (hfl_debug), + .mod_type (minor_mode) +); + +// 5 - HF get trace +hi_get_trace gt( + .ck_1356megb (ck_1356megb), + .adc_d (adc_d), + .trace_enable (trace_enable), + .major_mode (major_mode), + .ssp_frame (gt_ssp_frame), + .ssp_din (gt_ssp_din), + .ssp_clk (gt_ssp_clk) +); + +// Major modes: +// x0 = HF reader +// x1 = HF simulated tag +// x2 = HF ISO14443-A +// x3 = HF sniff +// x4 = HF ISO18092 FeliCa +// x5 = HF get trace +// x6 = unused +// x7 = FPGA_MAJOR_MODE_OFF + +mux8 mux_ssp_clk (.sel(major_mode), .y(ssp_clk ), .x0(hr_ssp_clk ), .x1(hs_ssp_clk ), .x2(hisn_ssp_clk ), .x3(he_ssp_clk ), .x4(hfl_ssp_clk ), .x5(gt_ssp_clk ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_din (.sel(major_mode), .y(ssp_din ), .x0(hr_ssp_din ), .x1(hs_ssp_din ), .x2(hisn_ssp_din ), .x3(he_ssp_din ), .x4(hfl_ssp_din ), .x5(gt_ssp_din ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_frame (.sel(major_mode), .y(ssp_frame), .x0(hr_ssp_frame ), .x1(hs_ssp_frame), .x2(hisn_ssp_frame), .x3(he_ssp_frame), .x4(hfl_ssp_frame), .x5(gt_ssp_frame), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe1 (.sel(major_mode), .y(pwr_oe1 ), .x0(hr_pwr_oe1 ), .x1(hs_pwr_oe1 ), .x2(hisn_pwr_oe1 ), .x3(he_pwr_oe1 ), .x4(hfl_pwr_oe1 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe2 (.sel(major_mode), .y(pwr_oe2 ), .x0(hr_pwr_oe2 ), .x1(hs_pwr_oe2 ), .x2(hisn_pwr_oe2 ), .x3(he_pwr_oe2 ), .x4(hfl_pwr_oe2 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe3 (.sel(major_mode), .y(pwr_oe3 ), .x0(hr_pwr_oe3 ), .x1(hs_pwr_oe3 ), .x2(hisn_pwr_oe3 ), .x3(he_pwr_oe3 ), .x4(hfl_pwr_oe3 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe4 (.sel(major_mode), .y(pwr_oe4 ), .x0(hr_pwr_oe4 ), .x1(hs_pwr_oe4 ), .x2(hisn_pwr_oe4 ), .x3(he_pwr_oe4 ), .x4(hfl_pwr_oe4 ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_lo (.sel(major_mode), .y(pwr_lo ), .x0(hr_pwr_lo ), .x1(hs_pwr_lo ), .x2(hisn_pwr_lo ), .x3(he_pwr_lo ), .x4(hfl_pwr_lo ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_hi (.sel(major_mode), .y(pwr_hi ), .x0(hr_pwr_hi ), .x1(hs_pwr_hi ), .x2(hisn_pwr_hi ), .x3(he_pwr_hi ), .x4(hfl_pwr_hi ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_adc_clk (.sel(major_mode), .y(adc_clk ), .x0(hr_adc_clk ), .x1(hs_adc_clk ), .x2(hisn_adc_clk ), .x3(he_adc_clk ), .x4(hfl_adc_clk ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); +mux8 mux_dbg (.sel(major_mode), .y(debug ), .x0(hr_debug ), .x1(hs_debug ), .x2(hisn_debug ), .x3(he_debug ), .x4(hfl_debug ), .x5(1'b0 ), .x6(1'b0), .x7(1'b0) ); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga-xc3s100e/fpga_lf.bit b/fpga/fpga_icopyx_hf_15.bit similarity index 100% rename from fpga-xc3s100e/fpga_lf.bit rename to fpga/fpga_icopyx_hf_15.bit diff --git a/fpga/fpga_icopyx_lf.bit b/fpga/fpga_icopyx_lf.bit new file mode 100644 index 000000000..e69de29bb diff --git a/fpga/fpga_icopyx_lf.v b/fpga/fpga_icopyx_lf.v new file mode 100644 index 000000000..0ca4739b7 --- /dev/null +++ b/fpga/fpga_icopyx_lf.v @@ -0,0 +1,218 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// 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. +//----------------------------------------------------------------------------- +//`include "define.v" + +//`include "lo_read.v" +//`include "lo_passthru.v" +//`include "lo_edge_detect.v" +//`include "lo_adc.v" +//`include "clk_divider.v" + +module fpga_lf( + 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 debug, + output PWR_LO_EN +); + +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +// Receive 16bits of data from ARM here. +reg [15:0] shift_reg; +always @(posedge spck) if (~ncs) shift_reg <= {shift_reg[14:0], mosi}; + +reg [11:0] conf_word; + +// select module (outputs) based on major mode +wire [2:0] major_mode = conf_word[8:6]; +// parameter to be passed to modules +wire lf_field = conf_word[0]; +wire lf_ed_toggle_mode = conf_word[1]; +reg [7:0] lf_ed_threshold; + +wire [7:0] pck_cnt; +wire pck_divclk; +reg [7:0] divisor; +clk_divider div_clk(pck0, divisor, pck_cnt, pck_divclk); + +// 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 + // 4 bit command + case (shift_reg[15:12]) + `FPGA_CMD_SET_CONFREG: + begin + // 12 bit data + conf_word <= shift_reg[11:0]; + if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) + begin + lf_ed_threshold <= 127; // default threshold + end + end + + `FPGA_CMD_SET_DIVISOR: + divisor <= shift_reg[7:0]; // 8bits + + `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: + lf_ed_threshold <= shift_reg[7:0]; // 8 bits + endcase +end + +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +// 0 -- LF reader (generic) +lo_read lr( + .pck0 (pck0), + .pck_cnt (pck_cnt), + .pck_divclk (pck_divclk), + .pwr_lo (lr_pwr_lo), + .pwr_hi (lr_pwr_hi), + .pwr_oe1 (lr_pwr_oe1), + .pwr_oe2 (lr_pwr_oe2), + .pwr_oe3 (lr_pwr_oe3), + .pwr_oe4 (lr_pwr_oe4), + .adc_d (adc_d), + .adc_clk (lr_adc_clk), + .ssp_frame (lr_ssp_frame), + .ssp_din (lr_ssp_din), + .ssp_clk (lr_ssp_clk), + .debug (lr_debug), + .lf_field (lf_field) +); + +// 1 -- LF edge detect (generic) +lo_edge_detect le( + .pck0 (pck0), + .pck_divclk (pck_divclk), + .pwr_lo (le_pwr_lo), + .pwr_hi (le_pwr_hi), + .pwr_oe1 (le_pwr_oe1), + .pwr_oe2 (le_pwr_oe2), + .pwr_oe3 (le_pwr_oe3), + .pwr_oe4 (le_pwr_oe4), + .adc_d (adc_d), + .adc_clk (le_adc_clk), + .ssp_frame (le_ssp_frame), + .ssp_dout (ssp_dout), + .ssp_clk (le_ssp_clk), + .cross_lo (cross_lo), + .debug (le_debug), + .lf_field (lf_field), + .lf_ed_toggle_mode (lf_ed_toggle_mode), + .lf_ed_threshold (lf_ed_threshold) +); + +// 2 -- LF passthrough +lo_passthru lp( + .pck_divclk (pck_divclk), + .pwr_lo (lp_pwr_lo), + .pwr_hi (lp_pwr_hi), + .pwr_oe1 (lp_pwr_oe1), + .pwr_oe2 (lp_pwr_oe2), + .pwr_oe3 (lp_pwr_oe3), + .pwr_oe4 (lp_pwr_oe4), + .adc_clk (lp_adc_clk), + .ssp_din (lp_ssp_din), + .ssp_dout (ssp_dout), + .cross_lo (cross_lo), + .debug (lp_debug) +); + +// 3 -- LF ADC (read/write) +lo_adc la( + .pck0 (pck0), + .pwr_lo (la_pwr_lo ), + .pwr_hi (la_pwr_hi ), + .pwr_oe1 (la_pwr_oe1), + .pwr_oe2 (la_pwr_oe2), + .pwr_oe3 (la_pwr_oe3), + .pwr_oe4 (la_pwr_oe4), + .adc_d (adc_d), + .adc_clk (la_adc_clk), + .ssp_frame (la_ssp_frame), + .ssp_din (la_ssp_din), + .ssp_dout (ssp_dout), + .ssp_clk (la_ssp_clk), + .debug (la_debug), + .divisor (divisor), + .lf_field (lf_field) +); + +// Major modes: +// x0 = LF reader (generic) +// x1 = LF edge detect (generic) +// x2 = LF passthrough +// x3 = LF ADC (read/write) +// x4 = SPARE +// x5 = SPARE +// x6 = SPARE +// x7 = FPGA_MAJOR_MODE_OFF + +mux8 mux_ssp_clk (.sel(major_mode), .y(ssp_clk ), .x0(lr_ssp_clk ), .x1(le_ssp_clk ), .x2(1'b0 ), .x3(la_ssp_clk ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_din (.sel(major_mode), .y(ssp_din ), .x0(lr_ssp_din ), .x1(1'b0 ), .x2(lp_ssp_din), .x3(la_ssp_din ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ssp_frame (.sel(major_mode), .y(ssp_frame), .x0(lr_ssp_frame), .x1(le_ssp_frame), .x2(1'b0 ), .x3(la_ssp_frame), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe1 (.sel(major_mode), .y(pwr_oe1 ), .x0(lr_pwr_oe1 ), .x1(le_pwr_oe1 ), .x2(lp_pwr_oe1), .x3(la_pwr_oe1 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe2 (.sel(major_mode), .y(pwr_oe2 ), .x0(lr_pwr_oe2 ), .x1(le_pwr_oe2 ), .x2(lp_pwr_oe2), .x3(la_pwr_oe2 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe3 (.sel(major_mode), .y(pwr_oe3 ), .x0(lr_pwr_oe3 ), .x1(le_pwr_oe3 ), .x2(lp_pwr_oe3), .x3(la_pwr_oe3 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_oe4 (.sel(major_mode), .y(pwr_oe4 ), .x0(lr_pwr_oe4 ), .x1(le_pwr_oe4 ), .x2(lp_pwr_oe4), .x3(la_pwr_oe4 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_pwr_lo (.sel(major_mode), .y(pwr_lo ), .x0(lr_pwr_lo ), .x1(le_pwr_lo ), .x2(lp_pwr_lo ), .x3(la_pwr_lo ), .x4(1'b0), .x5(1'b0), .x6(1'b1), .x7(1'b0) ); +mux8 mux_pwr_hi (.sel(major_mode), .y(pwr_hi ), .x0(lr_pwr_hi ), .x1(le_pwr_hi ), .x2(lp_pwr_hi ), .x3(la_pwr_hi ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_adc_clk (.sel(major_mode), .y(adc_clk ), .x0(lr_adc_clk ), .x1(le_adc_clk ), .x2(lp_adc_clk), .x3(la_adc_clk ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_dbg (.sel(major_mode), .y(debug ), .x0(lr_debug ), .x1(le_debug ), .x2(lp_debug ), .x3(la_debug ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); +mux8 mux_ant (.sel(major_mode), .y(PWR_LO_EN), .x0(1'b1 ), .x1(1'b1 ), .x2(1'b1 ), .x3(1'b1 ), .x4(1'b0), .x5(1'b0), .x6(1'b0), .x7(1'b0) ); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga-xc3s100e/fpga_allinone.v b/fpga/fpga_icopyx_top.v similarity index 61% rename from fpga-xc3s100e/fpga_allinone.v rename to fpga/fpga_icopyx_top.v index e766181f2..81aacb73c 100644 --- a/fpga-xc3s100e/fpga_allinone.v +++ b/fpga/fpga_icopyx_top.v @@ -1,37 +1,61 @@ -////////////////////////////////////////////////////////////////////////////////// -// Company: -// Engineer: +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. // -// Create Date: 16:09:14 05/13/2020 -// Design Name: -// Module Name: fpga_all_in_one -// Project Name: -// Target Devices: -// Tool versions: -// Description: +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// Dependencies: +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// Revision: -// Revision 0.01 - File Created -// Additional Comments: +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- // -////////////////////////////////////////////////////////////////////////////////// -module fpga_hf( - 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, +// 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. +//----------------------------------------------------------------------------- +//`include "fpga_lf.v" +//`include "fpga_hf.v" +//`include "mux2_onein.v" +//`include "mux2_oneout.v" +//`include "util.v" + +module fpga_top( + 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, output PWR_LO_EN, input FPGA_SWITCH ); -fpga_hfmod hfmod( +fpga_hf hfmod( hfspck, hfmiso, hfmosi, hfncs, hfpck0, hfck_1356meg, hfck_1356megb, hfpwr_lo, hfpwr_hi, @@ -39,10 +63,10 @@ fpga_hfmod hfmod( adc_d, hfadc_clk, hfadc_noe, hfssp_frame, hfssp_din, hfssp_dout, hfssp_clk, hfcross_hi, hfcross_lo, - hfdbg + hfdebug ); -fpga_lfmod lfmod( +fpga_lf lfmod( lfspck, lfmiso, lfmosi, lfncs, lfpck0, lfck_1356meg, lfck_1356megb, lfpwr_lo, lfpwr_hi, @@ -50,7 +74,7 @@ fpga_lfmod lfmod( adc_d, lfadc_clk, lfadc_noe, lfssp_frame, lfssp_din, lfssp_dout, lfssp_clk, lfcross_hi, lfcross_lo, - lfdbg, + lfdebug, lfPWR_LO_EN ); @@ -75,7 +99,7 @@ mux2_oneout mux_ssp_dout_all (FPGA_SWITCH, ssp_dout, hfss mux2_one mux_ssp_clk_all (FPGA_SWITCH, ssp_clk, hfssp_clk, lfssp_clk); mux2_oneout mux_cross_hi_all (FPGA_SWITCH, cross_hi, hfcross_hi, lfcross_hi); mux2_oneout mux_cross_lo_all (FPGA_SWITCH, cross_lo, hfcross_lo, lfcross_lo); -mux2_one mux_dbg_all (FPGA_SWITCH, dbg, hfdbg, lfdbg); +mux2_one mux_dbg_all (FPGA_SWITCH, dbg, hfdebug, lfdebug); mux2_one mux_PWR_LO_EN_all (FPGA_SWITCH, PWR_LO_EN, 1'b0, lfPWR_LO_EN); endmodule diff --git a/fpga/fpga_pm3_felica.bit b/fpga/fpga_pm3_felica.bit new file mode 100644 index 0000000000000000000000000000000000000000..a903f180ead332a29b109b75c0bc01e7ce0b6c51 GIT binary patch literal 42176 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

08tu>UpJ4vQ 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 literal 0 HcmV?d00001 diff --git a/fpga/fpga_pm3_hf_15.bit b/fpga/fpga_pm3_hf_15.bit new file mode 100644 index 0000000000000000000000000000000000000000..92a00a357b0340c87409980c35784ee15b38f2ac GIT binary patch literal 42175 zcmZSJ51_LxyJDsY4L`pdU?qy3`q=JM#aVkWrcXMoCc8Zamz^BD~o92f!^RFWBl1Q>7wmIkmK5o#Ejz$$SO5Oau8BZSKc zkT}deAT}-xRU?c`9wg2JA{hP&Ff=eEFi0@4F)%_I9*mP1QW_)`*cj}O8~`agz;;A&_}P?*7>cYt$3Qvpi?$Q%aIa}2Lp^bhbpV6tgA#9*?4r-wP2 z;Rb_!LTn3j01Mch2aG#d{xjGK@n7J6$Z(fI-;w_(^S*?440dUJ3C=qhz~(pztYJ9K zV03|}fq6~CO9!h1JX@OIdi)Tuap_sge1Sy)WY-B+4T*jR1qKcSCI*Hs1|SfVsHSddBEzx(443sz+vFk$gq(?;Q@yw(;0>h4LS)N985nL0zhgM7|os9 z8x$XCcreXlXgi>&z~CWtiD6rVY63?D(+P+<9vln`hZzhQbOe|i7#=xT%wl0+KEU&V zp~m5i0{bOM!g1i;BJiKX`~d$0<{E~t47LvZADRC+{9&+9;lIdyfeGxd6|6594zrjs z>MAfhFx+OaaNyk_{LbJ+hTRFi3Cyn;z~SQ|ID?^`LGb`b0Fw+u3xi? zFNj?p3=cVeFxWEiJ26jS_`_h&5`RGP1H%sn8wL&r=1UCV^ur;L!f=sclY`C#?qv-x z8H^l!rU*X~sAjNp;F-Y81hK1u#YLc#Ny&j@0+R|$C!>M`#|)+vhMf$0Adv+O;EXQ8 zs>U>vQOS|(65AGrwGGM+92c0rz|^oo;(~)kg`tr_(Sa*KO@v`7gR%oh08?3tlj6V$f+|2D#ZzOQ)+@j~N{AGi0v_{A93m;GMwy zgyAxS-2wgy%q|Q+8SEYSFEBr21IL8~>l=oj3}y-ZvzpzMPJ+GTtitejIYu<6eeDkmCJ1f~~|{H4LL#^EEw9tVCI<|hn49qk-+Cow-^`Kh4i zz(0Zc6eNFX2rN+e!LW%zzk#`d;{-z;1OFN2%?x)MY!!S?IG=*#FAWwAfn5wr4IH4f z(Z#6Kz^ov&f?*Sb9!R7M5*He*{tg=$6d1G^m>8HE7<3r81(+HbHZbTgXfQCHg5@s( zhOG>W4jc?jAq=eyx((a`LQ@2`Gw2@RC}4U4HHSk^;Y)*of?fu*6vMG5T?PIM<4Fu5 z4K@lq9?Y*G`HMq#!Gw(rb`E?Cm~#YvGuSoo8!)FZ{02qb2IeL&{pWC|!CHau z1alF?kp^Q0{u9jK7|u4>C-B^0J^+cY6@pV7S{W1_6kM1@7+P5rCvZC$UvT&)pxeNa z$n**l&I}9_yjuh`8MG9bJQ(IND6(AQ+VNrul1BVLJ2}r!J5M97xKQ^H&37hQlfb zwFZs}ObVd1>cG{&q{p(mCGP?E4yFf?xZq%5VA#x{aezaBiG_J0i^>7c1_lmroN_Y= z9fIU9296YlR}5wiJsY?+K*fav&jMy1SX>-{4)0m)wnSU)hGVGwsnL5{^y=EeDPTOiviP81xo+fEd;cN(VSLFnxf;yMyQpj#CVF3c3rJ4>=BbX~7`O86| zhv7BDE(V?j%sLD&1Z85Sw5c*eBuK-U4iNR91VpF9+Ev41XDHAMih5{^0PR!M=e%f%%KT-3#^y_-`^_faEVw{q>8%u7Pg_vme84 zhD{B;E12^Zopvxf!?TH53)0^35S+o(#-Q7vk>(`B&q1Q2oW3Z-WP0APbAeI-#|)+?3_A}PC2)u^DZuJ4m4;ppWhagapsGzs$ys88(-VfB z4oV&zQ<&iOmk0x>{NWG~Is$5wI9LcU9dXzwpy0zHCKN-Lx8j$>@!MH@=C#e3K!2FEqr=U#%{{-ge z3_m$+9P*LsuZc`Y95yrY9^f`)_;SElLFd5Z2Mj+Lb}8sIF>^ukmj#lD>#@K4m21(;EiCCWBAly@_;9U z`JTYX2Gax{3vMk){^F2b11cdI*cF%`F#Ke)V&I>^{D$ENgPa5Z2IfPM{Kdffi{X8v zu|m%a=1&ZN8n!F&-%!5Ba=y{{0nZI#21x!|0m@$jiU&FZnC>`iXHY!BoxpsB;R=KD z0ga1HT99yNV3@$LfI;yPM*-6vhOG>$j@$)IUqH2<3r7GG10;Vbh@4?)W>ApOU|>4H zu!%uo0ym>m8^a_91xJnsCJspcS|PfE;T6Ls0iFit2LeA8%ozAPn4U3oGi*A*vw<6G zR|CUAj*kpB2l%%zzhU?UVr*c3;_wSpFHc~80Ld4O0uLF^G8i%NJYfFB@QcB?N#{`T zcY%Wp8y$4MFf+jFuQY}ZCZz*h6PVtBvWx@A2Bjkm9iRr@1*Qei`ioUZp}Rrp0mn3^ zw+*`wC_UiV!1RWpn?Wf7T%&>8{2VMS3=Itn6u1QGfjsc*9i8z*E4yhvB%Q^$ETU%t8!D8Vo`0mI6rrY7ltE(0L$fgGR5iGE>I{ zB^8bdOnMApU+fTq_rG2+ED&5E$icwX;nK{I;gBW3rogb0QRx6j1A`JIe;p8A$!h=|qCnhIu=fH5pccLcRyl z|JoJsyTR@O|A)h?1pYJFd+`=9e_^-_s;Pf4!~0(g87?atIPf$uD>9v6*e0N}!&$T8 zG$?#pl;QOk2S;~8(g}|Zi}W3uixynsSi|hX(y%~5gu|i?g0)5 zA$b357sK)f#Rps-OqW=eG-N7xMzF;(wKwQK)IjQgon-)3TOAfmeoW0D6fR_LU}9is zXwYHcU_kW0W;i@LXfQ!frTJCEs{__8ybrpw6b>!0Yv55p>VJ8>kg#LoKfpYJ;R~ZR z10Sd_14)^P`s)e9Nk$_F-U*Fq4ksCuQg|kGgZe2(pf*3O|HY8Pu#!Q^iDQCrI#Vap zf&$(NOezkbz5_R?H3%-}C0JFMIvJD?bb`8Fy$sq8ToahqFzjVfcIf`#1h2nT7?(0E zbl?bJi(zVI$UGn|$uxywD?_6La{vdt{>otJSYf2a+tvJN!HE^Swe0UE5dANP4hAL$ zjs;wxHmx#a2LsarhFuJL4crG9;Qg;B3{ydUkN~bJY)csx9i%2mg)nYq&~@MrU_$i2 zI69e>9XKutnKJY;DSLQKU|7Pimx14f`vScGC3=kECb*x=4C;t&aNwK94R&(^{{&}P z|BG==!$$@i2mTq%PXsYg7&`_Fxr5I5ga%im;^u!2JQl;ISktwbPsaF`(GWxVFbgpp zZ`i27pTRtf;Y)+8B0Ez5tG5Z#YT`b_V8CE=fOi9;{{^qV{xRKe-1va!2D2Q~(T2?+ zhMB|PM*9SQr2f|&kTV=O61W5y+87iWG!nQZ61K7Ew(uvw`a}#2a~#?Q6dO1Km;^u( zr@-ORBqIQcuO?{!OF`tEK!Xzl3xfg^uf!waSjf(@X{r zmMrAfZ@462^g_p!S;^s-husqHrLewU1H;>f7ocYRROSa9F9Yo$_3}>!I~RUX{RQqj zFbe!(IL~O_z_WnaK;a*Q5d;4UZVQHU6O0$|yoC3^7;+dI7?c<^1iEt=c5)~k;GV$5 z!qC_N9_WDezgTq`x*60Ca5OOKFzjGZI>0@VNkyQWMd>KV1}9kmi$zDUfl0x!!+^}SwN>VMs1_}*yzpyvm39mDa4%?tPsFdHzOXE8jW6QTS8R)4)=*xjJi zz+u3|!O+#9w1B&VNextgec{-_^Z*jh9js>*64Xf!iZk z{k2A52cuF0#|9=10nm6I_XZ{%#%@smYa^on^%PVcgSwMGpbENyf03|4({V=`ltefdG-*0CFeuq@?_|<<=x5M>#IXy}|MFsLez5F;#tb1g z0Z?JiEx^UVFc~y1YQR(hX&)*uTCucus4mcmU=k8&JE-`8+k=VAVS1zP1CJj}9*}(M z!NI|BfYI!PjsPi^?Au{xRAofIH6b z8SD?}e_);fX&=^tTm=`eo042x<<_8=< z80;AM8noME`u&;*iZyChUUaIf$0fDXG@+3#{{NhkhtJr5pif` z&~@>+$OL9Ma0@UUVQ6g7@!}9*g66Lsyon4q80-XiSeO+VPJrADsmSa&cp8}BLE48i zWS=$sX0XfPpT+#F`s3d2o?4G#Phm{b@}HW)kl zUr>hkzaB7jFeoT-a4<0~>0nS|;BH_tVCryCV(@NY;)D2|gY^kRH-n->_XQ`B382oS zcZ8dmK%>I~kmC{kFNRJAC5Ma)Tp+(IJ8)lMGXaZmPhf)gzm6~*bTD$zpCGKlbdo{H z!G8+3x&x?V$UlP_x&Jj`pMyTM+DhS!W)>*aM&~O z9B4LR0L3X!1ET)2VA#i~H-STeNrR#3v0lT8HOv|gyBPF0abzIsFDHk^40;b%8MO5< zG#}7;qG7@03mR*hpehl+XXxo++hx1CfGjUsX&Y$u3-4ZV8@`pfEm|m zKT7}WY=f}^&kJWe&@@T{&k5#F4Cf};Kj8Vn%m675R|rmIXk$@4pmBlA&}BJ;ZUaY& z&>e<02Hgu9h0Iy7{?`tMRsm%e4hJsK7``qGhXd0Mh88CMBN_#W{?`MBCQ#|Ofk{DO zF@w$x4-=-NpuwvH92QI-ka!36zrd~T4crP0Cm3`%czT#$Go1jJW6kjX*8_&1EOs3H z4bE>Feka%+;J0Bu&hf*+E`WanGkpB;2g5lA`vZO#m^U??VX#l(Ink`3aDIX90iF-= z`imu*spEk@gT@0U8>Vg%y-gfDm~;iY9rO}8Hp0gbS+y8C8`T)N76>h1=;qLC@Yuwp z%FxB5_W-&6Vqj=w&^e$Xpu__j6L#QW;NswD0*%ib!15OZZwA8&1~Ue~2JQvm;;Uza zunrTX97EJ!7Z|=U+Cs(;|FGCH^n*HL|5(_XgPf*9q1)3{3(W zC%{uAn;8^Na4Rr@+h>f@3T*KH*BXW{g;giGHnF{7*vz1G%o{X*xRXH-RM8ti;@v^? z4bv$Givv3QnBOw|b{6`;zkvB6<4=Y<1AZ2E0a*RDhv8R)`2pS!%zqjFE7%|4f7Sel z^&g}96aEkK(E2MtU;)D^5vxOd8<^KJ{C2Rqz`wxxHN)=)I|I2T%o8Bv8z)#91ezO| z9&m4Pdc&}r!RR3O0;XpyJ3#)LE(Gm=ya{CC}OZV!e_vI308m2VfqK@fBkXzuVQ|L8#F-rSHPYH)N_H=U*{MOF<2eowP4l} z_|0N;kbeQQ3d>K(Sb-KKzD@|vVQ67gJm68l9K*1mLGb{05|aeWHbz|r?gZHQVFSY? zg}w&m2OJem^I5hxBtGEQQj%lX-k|${y8ZUrU=jtvev zpvDP&{BRe;xdTSaeAX&=GyIydX$!xHwg$s52E7LU1?=$g!v}0X43;tQH83S8R4~{v z_%||t5ctDk&(MDWss3X4xL{KT-$dpo0Vfr}1e$;1)z0KLj@&r7kf2Vd!U2_TZSnrNhw6sDF_A17iG;g=Hgyq6Qx=;6K6)>wigp0gd-& zg1RRxKNnhM^dDe;!U3LlkV5pozA&6+Fm~X%zzk*x@Xu;iVF34T0+`VIUkywzm^v7g zG`d@u7BK8!&}ZmwfX#n-u%2OPWK?qC5MVkY(8!?R!F_>AgaO>12i3XYadipNB~0Cn zp#Evw6NY9MB`59xrY#J674#jrCn5S@&lFB77zOA|U_Rz@a)D9+{{&|>hMx_3pxzd= z|CPbG#N*?FJ;nT!n4fX{oU@OEe+u)nhMx^}phg9}{#wZJgTqLGr@?t4!w&~50e(<9 z|EI-Rk*C2KK7Pm{u zC~RiXSm4dzbbu8!Bj#bm1Rp$c>VQ;;g^Hm5m0T# zQo&%?!@q&?38+SMU~fUxU*8!1acoxL`NRAJ)bwA#1DZ?v$6?>V|Dc({1>8q#U`cb> zbwJ6PV}sC3hFuIgEgTy_n%GUEsZjX#pfI zI9OOjHbD9^E({x(bQ(Amm=1vE{z2si6Jq@E2ZIrK{E+1bgIxm;WFXP*0RIB!21xsG zf$SAfj~-foG1xcgKVXIoB=S4J>o3-C3|AU#LDQ6%7>+O)FYxnF{?~Lr!So5s0VQbt z)gbVUp`%4l!Fh$yBc_f9r3c&{On(iQA5?n5v4Lp;q@B>g`UEty@4(H#^n_s%Lq-F) z0Mi+V<^;6^91KoMg5dmhKy;Z(cY~e+_X4G7467Bi4scIldc&}qLFpjJCZ-LL`invI zIK#~bJB9v9%#RvgGFTnpUnu;B=`@4M0i7ew46yoZi^^X{dk6mu%s&|Juz(jl{9*de zV1I&t2BQD9hT#R15vaGNIN>yd(GmU~%sLFO8H_IQOhAkus(?mr4{+>g;AChHQ2M~V zgUN=WpF!ym?*!%|NL)N%bz@khpwht2z~sTu;IL*BH=B@-z+$Ea4>%Vf`d?xSJq_v$ zI5U~57}_SNKH&brB*)O+p!|@tg2_X`0kp;gH2?L8(c}QXAhVA{gMiKiegd;C8FC(4+B)?IOlDEIqLh}=blMY51{1b##7&sZN5_G08H$l=^1B+WjXQGk=#~h~T44n*S z2e_v(sW5ahEO7Cdf?R*CWKeSKn$h%RK_`P!VCMt|6^@k*s}68XVQPcKDQNvhCxe0m zmjKfdrbb2;2hcc4+d_>+4jdB^^Is1@=?65_`GDcX3L%Ex25tt97bR69J$=pVAo**C zfb)Kw~nD9t}(k0u2my4IEvF{?`$Pi3};A;ZQb)jSOla$G0#n zWKi%rG0n*dGQJ@px+JjkfKsybL?#u`{DqUp1g0enE1A}S`kt`7WZ0+h9yI?2UfZJ~ zuz=x5f*qqyL$iXz35HDq{0-a+3@;eW7o=?z_C3&VU`S!MV(4o~>fnCBqybte z#mJG<%mvC73=A5qzKNR;>MUR|QS#$zj!gK#X~4k4pv<80gu{ZZ3pTzXz_^V;e*$L# zmmEVgL*fDMBTh05(-jm?XnbITj?Zgwh%tNtb-N;%!x)Y>C?@e%Fv~SQe_;JXr-Hc) z(mv#nT>@G))WEmF`2oXE2D=D;0p>RfuN`*X(l>z3e>sR=VmQ`htiu0-*^c>qgYg6T zN^U!q^9K~4@Z4Y)fW+4d$q5YCgcNzW6S!m;+7uM0a3?d#H1rE7p5X{U^uM-%#uz7f z2e8R7EN4<=;Qk;48q8Ne&=JDqzyJ=z1eT)>6CNZqa2q&rF)U(G5ac#!;$doLP&uG6 zfhhu#=2wWWVmQrV)WE-?S)<_-!RNm+7&;mB7`;~{{jsourO?3QUDd6JWP{8HJSt)Z2pTwhv6iH9V2%GvjWRchE0sz4Z=1|=NXI- z@GM|vU;?j?S|Iy@;SY;F1HXgv1yDuSzz>=KvOfTt|6+&KDXgDB-DCw`aPz6bUV-NX zX#B9*_(0DASpN&Oexn=ID}hwCI;VJNFsZS0HYh#dXn^&w$q7uVoZSLS2RJ&I;Qg%X67djKOF21@U$>1Fq{-HI>cjvSbwPKu)9OAgu8?36@xXSo(9)GCQX;_0Od~} z8-x(+4;?mp=p=BnFrAoSY@nyWsnW#7FtI`904IYGeEp%2z?KHx1>6-(*BG{dx-gzf zVhU3mR3C8qFr9$aUyKZ&L30WU%x4%rtJpa3Dll_6Tx2jgz-!e{EvuZqNkvw(dc?U4NMFG45|se!x}X1Ydu6j-i1;gMpic z3DhLkQIxb{@>ST(pm0D6dHtcnDTZB5{0o_1fCgup_}?&B_WWvC)WG)wG5_^|;SYnl zfd2vJj|_ht>>2pmK;wr2b^`1jNc}Hx&&7X&^ApCOOm+eMbC{nnykxL*;6NHbOaZSX zfR-i-@Jw)gB5;$zE`jF)()tb1 zQZ5E*(E5!%3_2RTAVvp+z6ghc0(|`N3qvalc(&_`;8unl2XN;R)Sl-MK&;=`!qf}$ z`$eWN40{=L95^QkePQTT(s$t4h&+A>S_a8If%$32PbTp4&L<2v8TcH0W(dQ_50^QB zdyz9h>kk?17}zH;A7S{(V&kAMffzsB$Z!TUta_OF1LGeCD*?U(kVMPi-_Q*2e`z{& zb?7y5uV8w?va3U1iDQAlE0$dhdL4WZoVXxu2@O^UrUnlk1#Si=&|JU90tN=ALk$}k zco?`X5dAM3g?0wr1Kgms5Zf7aTR@8<6hZ3`xk{KcAm*�L|LlCh&VOUt`$XV7Z8| zg835T*9O}Je&qfaB+G1I1gF&*>l=jMfD&y3^7tWW7|MPDFR1^uZi4*+-IL664rdzb zm*~7itUsKjT># zjaCNz11B7m;PYP~FY5?!b1kY$i0lNqM8s}8X*0zMwT3g-Jn_54NMOhz|*e{Om7%=FzGbtE+0Vg2uk= zK~Vr&$YFOtrvcvo;sv{zfghZ-7;PK)9l&YK79;{+fB22zdV}Euz8}nT4EGxhAMpHG zY}0TCQjx*eZ-AB^Dk*SuFewRiG-xSs{9&>WS*(Wb4ok zTEMJ;=zsY!G%&C%=u%sv;Hwg1EJqC506_C~+3jAlWZsbc~u5tL! zApgMcEAtkY$ah7An53z&UCtCkM%Z)Mh1IKcoeX`$nX9)dGCwm{a; z3xF2VGjJO)@ir`Bv1H(OV44K!=N@2~#ki$GQGx3O(*%sO|#p7l`r0 zbBvoWD17lS5bI@V7EpL}+JK3NVL^k20=ELwBuM-4h3Kk=PoViPE#{XErx=Vk@GoH2 zU^*9}zk@%c89sjaf#DB_JqI6XyzGyUJp;H>_`zVs#E)EmHJlXKSxe);F!P#o-6~cv1fynbsQ`*485SW5Eqza73+yxa1K{I_ zj9(b8G8jAXLdFjb9e6+;pOc^w#Q>!B^8%o0uMSAHWyi?Tz@@;@waSQr13rGp!TOA0 zCWDd#rvTG4hUP{E2MGZt7KTm+9Y^q-9k?wjA-cq&Q$WeVV-je}Pe3n#Ljcr26i!>YljtPhfu5^pn9X z13b?5v%$=ve-bl%{BQxo4+Sd*9#FUI2SX7PPXjXp!wH8?AQ5=|CDpLaL3sklBPI!k zeGH}zJPVjK7%nj=H*!2}MjAid%%E{XL#2rav|RZDr-2gVnPvut1`Q5G{UyU;%b@Ha z@j^_7VLwCa0gfUj35MxR${idiWDEFW-0I14d+Z%|Cowc=)SINxBni^qdm3)cSv ztv|Fmz^@?u0yLcm$~zAlelyt2;9mgie=)HBWBA`#hp`{DndJat{P1kUCI*EQ-3m=S4VxJhAPWqd6*Lxcupo~g{#symfqx2fF2m;q zMlHM_xD~k0I~aHHh#-$2{&28M;9tZ1jN!L}RS5qEP~%p>u7Q7pG<^OGQWwZy09OH< z8Tdai3oxB$uy5eG02@DSWJzY&(V%D8y}~J(VaEZbM9}n*zp3gMSTk ziNHSweFy%Zi1EXv4W|Q)9C%uoRTxeu*opDYXx3qP&1nRhS%dHY(rxN)P|Dy?P*O-} zZqQTUPylagP-5cPf!P1$!7%xRLIVc_Q#w<#gAN0if&&x7f(r@>944^&F9k*+hv^N9 z3pj2tRe_d3JmI*>BoA7VxP+quvHy#e;WC2(Xtlf#!(j~@7CuF8mXucln^<^|=D+qZ zycMuL!heBzhr@pc+avrJy>Br5Ww1ZO{}EAtonScKV6=e8fSHHk^a(Ri_di46CqrEW z&kk;Q{WXE1onc`EM*)`vOS^*N0SyNx5r%D`RSgA9@b&ZC7*>Op%~vqlF|=<;f5cJ2 z6sNGgLHC14MG|8DJi`JG@cu6jhh_zZ2OMln4h%aS^b|N05$oq?GQ4syYS4MnY{hg& z(Y&E&33C=`G=7858)kU@^+0I`C>^#jKLjOO&_cuw0)G@h6&cd_p~FcQ@Ujgx(87s; zei3aIho1~aNj#Gf>o?L{Ivw-^yhWH)7*;yy1#nN1Qe)W3s0126gsKPhW-X+1(qKUn+19rlo9lKEx zpr!Soa^vIz&;m>5Ck%HOj2U?*Ak|;s{ulQGrbi4n9F!P18kjdQbgWU*Lax7#fmWC} zfSR%kS{)S~I0KZfFic=j0L_TO*B>qs0M7aS%TKNakp_$MeoX!$r16e-Q1kvBUA_8pFh`m5mt zgPj0>2lE4tI|-W^cn&as0I$#FX=#S9KeS}%YtY}p{XpqMLYITm0xn56T8+kojk!vqHfCJr8^g9@7;ENam(M6BPCVQ6*Gb?^o)n{Q`OzQ9$`1Zux3 zHgW_o!PjqyF&%5LeZZf={9oZhgW&=m59Uh@{}&i9KwiHA_Jsrg0?^z#XfOmk=fYXn z!oLl<{`%Tr{Gk7a@;}J5*9m4jhW{PLEBOB+`d@PywmU2g;|>tI!?4XmcLH|-lK{hh z4#fuULRg=OfnkaQs0|6~qk%g6pp|nnpfQjR?*iEVF9ngK3Y$0-BDi^&&N^&5pd-S~ z(Zs~C`GLX)ZX?A0uXPN+9~eF0pT_(i)KwJV-@vWZ@VjBt1pZAhyBZk4?I;KS3C(X9 zekRym;BRGq16o-N2&jIE?3jYP{i~Mbvts4Fd7&q|zVP=5!zkC@w z9CQk}8kpWE>^Pt|fxCfAg<sRE3}#H+ADCV+TvAY)z_A9=|8i{D z?4*#utpnO_)1*+uZNT(~p^-tMAVY==zJ6XPV*dig6lu`-;hq_(DcluI_ZTNmSeV2S zF$uo@kcHthgMk3I3G;{07W#8V(B>IOs4S`d?cZzAMN>;;V$k{s8|M;Xj~} zQWyRci2CaZ!-+qAF43*GAKJ}TyTQVfAKIiv*>_U z?t#WP6dbgKnphY?i~2YMVEJnYZ_)w}Mmq-n1*uX`XJ#9+P~b$pmTr|v{Z5r%NmSJ41O}$edL|s{G{O{lMQ6>^Wy?L2mcAoU6A#?8UhOgelXZc@Ha3& z1TCbO;AdcF05_!h+PUHVFH3=a3VIW{pECVo=weZB;9kJAf}x8=aS`tWCiwWFAH!xv z9S3FshBHc&88ko@84oCpHE`)5`d{GnhX=S_obEHsXH=ZPUBEVnrIA7L0A~doeEd+3 z;d_g1Lca&|J%;HGmJj$V*!dW)Hf(&LXMnVR12leki@$;S48vmvvjdGQPpUFqdJggr*C(BhwuP@EWQDB^d|MdK*oo^@nE|HXhJu;MQn5!?5{8257(V z8is|8Iu4u$T=4aWix_@6Sh?`;Xnw=+`G65oR_c|q+% z=bWbJ3_BZ?3b;22=P-4$C_UuZ;RLV06hPIM1NRK3Cjz?}v<`sQkTb1RT2#QXqY1u# zg8{U&0+hebaBOB$05!UNK;;kUPz%`n7jF*7PX_Rg_y-KX8LUA5(&2as+9|mKK7I(A z|6(#fzzJHmVGHV>d|>{=_LspHv>rQytpGGoa)9+4!CAZJXgZWz~sQN0M!3d zU^>A#nLz`zkVB~fJYNa!e<>_Fkg-8ZhoRd+=>Yc*rWXyn6SEpLb}$$~@(zRGL52ei z7L$5anllw1F_<;*w=ln8xXoa-fNxF{eEr4-hTjeL4*C~_zks?Y4*Un0e@T3Av0tM9 zp&MR*tzkI9VAaC6fKh|vmjig+jt0YR2cw3b35fYG9focer4o**%GcY(ezD9GIFxV~m1KEDRGHavY=um^v6HGpRK&%w>ble?4FnV(tO;zcQGjnA#e3 z7jQ>#?P6$dR9>J^!FB?&f6#-2hv6`zg@YET*ty7HfTXZSnuWe1RQ2F1mvC0mEZZKMvIYI?Mp>e`zrMHZW@7 zfzPd<5CqMCEoAU;U=mJ{2{L!wz%UQI|4X6*ywoK10p|;* zD8}t8G#5xjutCS?Jw(p3G_WWra&Ry)F*G!&C~)o&@?zM0V8H^8eN2}ibNw&C`zsAr z@Mt-6HJn;twu1K&cU8k52J00(Pnr?yHyHk~fOc(ww{PrbSO;22|AAp1==28o`i(aV z2N|p!cqS;TaDdL=@CS{vo!~HX;F*Ime#oE%T8*H>(5Rpkz&*uDmEoj=NdV6rX88VP z9VXDQVa5d}6Na@6k1t41absodwlMU9w!sD* z5@}uApy2*XQofHSKwymT-EjUQ@2;xq#?e(2yo!5O?Y z%z=NV@)M4m4Er4TCve|_q#w}wjS~&V4EzV04HV9R+EJj5JSUipKpio7{l&r1v_PSO zTY*V~p$)VVY=Mv#0~do?gT@19FHq?NTEF4L)ZCzOgxi3FhiS6Ff(Kj{Onn^Ipt*hp zCN4a*8U|2XJ_6rRU7(5_qKzE++8aKCk_}l=v-iCZ~>Rk z4GbA9yIB+*ycC!{7&;mB8#o>~S1|N67&mAHAk|-tI~cSaIGThMCah%8bC8%I^n?L) zDh}5ICiwadCeXI!1`PuyA4br!c@NNG0*wqx4i*czm{`CO-@u!|@PlC$0}p7Z`~`y@ z15X2U0t;xxI?n`V21tA@ko~~&g~9d!e*vf&&tT7>e}EaZ|I3nr{{lC3tos1#2Zl2m z*1SAFltJUh#wvWDn~NO&TNoeUeV|+b4IhEW3>^ooSUGku>v8OA(Bk0u;>6I>o}hG) zBTZ-nB%C`~4+<_|(ox{rz{JC_n?b{ImXVSJ!)6ABQyeNyMv(ka@Zz+cBA)@ba>MV2T`YVXnDZHaGZ-J>U7+j& zS^x8Zv4!a_gC(QxFXn9x_Z!R;_&;!eR`||fe^CE{FueX+%5cKd&Ov7b^HWfjq`15C=V%Wy?w4s?rset1HlMcsy0p$Z+51F<>`oa%bojMu> zbtJjW*g%`*7jn4T?`Vt(k-vrZ+5o zz?H$Y2V#x~2aCc%13LyOBjz&>hXssU_>H)E7JwRoJPOQ{Amj56vU?cb3+W$Wzo7iX z;XecaRlZNne;D=)SRdhkf>?j}09euXAv`^|HT2C-R2Hp zx&j`%;P}KOz|bt9cz`2`%Lr1A9bf=0JJe0^t`NG$u>FAU0__T>I+p1RavpeOGChEV zkB7(^#m!857o-K4PBCmgpm&4YfGdw-HbdG0js;9Xka&L~x?AC&gZ&ErRm`^<{vEKJ zz`uaGQtcMQz6Om4Oi1c9Ph?hMy2)VWqB99ze=(#r>`YK{(U_?GoT0Nx4|M*9Izy*|kq6Hd<^_;) zOoCN~VJB$BY{DW?w$cmG7U0w8oGGB?z%ii-KL5qSxRGH&3WosG8>U7U9Ty2fCKks= zfdwv_f{67SNeh0gF|y(T^@%zdbOiYO7ArE`cwuG5!-qIO>I>-DjST+_%v%`#GT6Of zpT+#Ip>mOR2Hz~^Wsv$yf)&)n0?&V$F#KdOa^RWBt-^GY!7PDy0<#(W z#GujOw18s=gM!iu4ko3h8x1A~9H+RU^%n>05yp)S2@aq$c^GywBsy>fFoh^=@g0niq z&wx!1d=r?{9Y7~a@lHUDA1+z&lflM;dk*t6P>02VSAZFGB8Qzr-vs6;NO=gZzY;cq zR**hqI1ykczz43sSgbhs8k)Nx^`Hi;g-Y82Hq{E&gufawUsE(TDP zGkGv<0Ie$!fVB@9cyky|FzPY%gVsL%Vz4^E)4;rd}K#g&c1l^d&5c;+Vv=08;*d_AfUwta8?9XwqR=&7tKW1v)FQD?z1!Q(ysX z{f6KghGyt~J%$bjrG{Az3~v~^n3N81On|SS7kndefw{~G==*gNuHM9hD!VK}Lv=D^p$oa^vf!7PAx z1M^#!QwxS^ypg<}EJJB4cpls<4HogbCMIDsLBLCcWK zp<#i8&IC>trZ)_W7&HvHcf!_hBrwV`%$tzBfa3&Hox}cy)s*C;{P z_k#Lg7a6uVXfbg+Fg#$fVc<1me8ccaz~U17MsDbtn4tRWIk>&Se23vWgYAR93(S8V z?n#(~c0j<_&%a>;AIG*wb%v@s|*XgDy*u(X2~ zDiko?6=>5iW#K^Dzr2rOZG&b4hX<1p)075f1N zy8@-AI4u=ed;nDSIdlpvaFI4d%zq^^oN(ABz{A44kYRy?F=!#Z@`@8L46Jxs5c`*} zHGEuPm%+b_*{$K`0y_u(3(B85{w~;;fmnYygB7%j5_J9sw+how22%%}3*1Hxe;kYj zdM+U5zYcJ8fX+Ptt)K4!9Y@o^titr1cwL7}ho@CU68WnK0~SP;uazz~rj1 zK|z55W&H+6FKFG)Ck9a8QwgL-MPVU>LIU>$CdBw5!%K!u4n1=iRX9E}nI-TEG=nx` zYzokspbTx(Le_8W1MLWVqI8qNE`WCq=)5luI|e>bA0IpppdqlJ;RK^GgU%6d1BNpU zMofI|%nAZ0ARRGy|4Re3KevHn1rrBDUxVUAjwehT7c2nm_{!%7-Ki*rX0j=TJSsS%Xx6F`aKTd~oK6 z(msyHI(*Km5g@16n==YW&+V@EI_^V0bNH1vp!OV z4fYRoelYK2cn_Kgd%;}A@c)4E1D+qs2VnKrT!wZ5T?P&ZE&-=C3=3Ph6NP64d}lB} z!htmZwS{3jgZ=@IFI+nqmNlpz;C5lU!LXS@@qi|L{wqP`2-7469?%LmRfUBfDjnS% zLfs0B8JB@ZiQ(rTg4UeK9pKr;xP~E_!R!LNK+}tc-3&%YcxS-YI)X~k*9~?G{te8J z7=AQaJ?L*>?f^ABF7nNRjUP4${9!ojV9cQRgvpfYyn{6Z&o5>RhVu-@FE~K`FK`{# z$l%M>z^L#+LWVhmp@Tt#rDFw?7SrJgN|!je5c6Lepgl(?x9k#h}2T)FIWuFq>h)K`HqB7pVVrl3^2r7HBBu1cQ}B&jeu& z#?zpag^=dIK+EQ35AcKbvHoYUXW%`+T)_Z3&w&@I{`#=skB0dZo=?sn6wWhQC-9$O zwt*a$coI>6J!aUEpm)M!i_>G!_+bL~B%yT-yBqYsa3igsKfthoL(fsmc+vrZ<^~N1 zZh@Y8T@}S|6%ygVSf;L{ozv3HX;X} z4a}+yrxol1_$M%Huz*jU+JYEARAuN~r1XI4Ba>>w=>vQU+?HHg6F}Wm?hT0XL#Kv@ zhY1fkOqduMHcZfQ;1(6)X)tEcImEp|2|9kLz$oT2wITTnR|TIK!;%KwSKJj$ax9>| zz}_ALi1T}u4lryu#AC$F!1O`D=79V}W{!r>pxJ)~#QxNju{F(z z^lrm;1;r!W0f_Y*^FT{Y9(Yx<-BZ}!pud14qUl!4_6dog&1;DHFNbahoeNr^rpV?d zorN4?Oea8n>I2*ci1iyg8P1)woxrz1`6t6K4*MpZ2g)xvelcun;D6H%U%&CN>j#G& z17m~p1BDL_c1->ap!&!lXu@z3vXDasJm~F% zyncgY2Ln@s2Lou?A%h+RH@G9ls0W(=f}bA+>VIj0mmP96GUz053owCpVdsE)WbpMH z%Pe+sXdU1Xa8hUJRMK?fPaJY5ry9jc18SCoS!iKWCqWF!PjprZ1|C41X^~e!0^Li69ahv*N+D9 zKoETWhPA>zM&*qhON1;Nc0Ewu!JW&b;jphkf5D0ci1Rmm7&bRBT;#N3;sq^TP~f&; zVr1CNpmT`BKnZ?+lnl#u2jvT#B}@_wTbmRayi1rw6t;8dT;M1|tlyAh_}j2CLAR1y zjNwy*p#pyew~)iv23rN5nr3+aYXxYSw~=oV^8c`pcBPS5bF;Y zG5l<>OW*+=uk@Q?lR-ads2qGE#~)^>T@4H`6n?1Kx$w6zzXYwToWMUr7<7secy&5_ z{o!YDs^jTlw&eIf!MK3`0<$7$MofYKLor14RAB2kLD(Xb3p5fDZBn^(%Qm zE9x1z4PfU3Fz}`@{9v>Lo!6}a%I~1Qum%hG%*GFh^&6nxmMw!m_}C550x;12FVI4c z{sP4M!+#8SCKxO5d}KFrIRiR4gX^J(rM^cR64<7 zp`^{!H9=2>V;f@q{2PV|DhkXVMxZT<97;?b8-z628d-E0I3^>`pI-w$1=x}gzFr9F)Yv7rJSU*1}1=RoQ z|E2r`bpA#H{}1LDYX2DQn~>|TH4MK%yOj-uHCax&8HM<4=3c>Y(!u5eKT`dr!>|j| zA7o`{0v!U-;bhs+y+H3Hw*jL5@@3e_sNl$9r{rwV=%G*{!Q#}((7>ouz|DYIe<;VW z6}0l9qDfAntwV8%#1AGZr?!K-3EUMz@cN6F;isq(1CI%Fj=(7eqXRrb%pD8|7;J+0 z1(E76hQFZwdLNiSfD#)6KX{KkBWV9JqW%K!k^oJ2st6>57OrbBYdD--VFcQ}h}8cA zj~{;MvS4XpP;}4;2$E=NW>9S54nUlLI1Myx_<*~bNlv1_L-7H}A0{iN)&|7~-W5zA zAmbYzB8OOv8Fa32+cYsYHFT(maDdMQb5MA}ZG_mrypo}+#eM?+0Y(jmQ%oBgcouM5 zaGYW=TEYJa(f@jQvT zP` z4jeb&=WjT{>#sEon;Dc7I|7_!Aj?re=SS^j&=26Agcv`3%J363A2+vIRpI0eqc9%O zI+>pdb^-j8U~>u@jO!eJGVF8mpTYc;?I-B`Lva1Y06q)F3o(8OI<}7I2(ux>83$v~ zw3mUz83$138tMFAk6oZ;;S0Mo6uLmm=2tjrF?BWQHFPU5aY6P)YOsRpFNF`FsRV|} zpmjtHOb!AKpo8cQkk9Yk?x1*q!-2_w0W_(^@rB8srQJdI0CzE>|0M=KK1k;Wvm6s> z97!jFJBaB>gKdKU4|e$a`GufWd7v%-2N*zeF8m74pxzB=ojGFs@ITA{M*9csKe+7} zK>L^1yl|FcI0xGKi*$a}443T;x`((OngkqL926Ne0=T9!fzB7@E?|e&DGUr#7`962 zvT!>vi72%*EKlJ0!eqhJ#-Z!NjkJE_K*Po(Ittu2Ok4~N9x9tSIFwpIJAWIv%@Ot2 z8qldh2mJSF>pPrIFuTOl07^&=b_ck>z}D(FFuY^|9~;Hw3|il7#Ry(M|I5KnfPVus zbbO3a;0tKX>VWSCW(&|kQVskUm`y;1OoRUh#Q9N)0=pb^4t6v!u?lpC=ml~w0G(IK zsF%RK0danm4!Fm`xq(Rsl&ubVD=_IW?B>ur22ul=E8$?_5ZTP2cff;zNr9<}A&0?x zf)sd17-%6qbbloSX#R`Qj*+*4n}Oi~XmOVTq@U6-AL;zVFART}z{~SMhaTD<^*N z@xx~fT@CslIaVOfKRmKvLxKW>h5-|Y!UE7HAqJ)+Obra+`%~cS=a+Eo0BPUArJ>Nl zq13?9(DX#1Q$g>5!~*#Fhk{QWel%>-(AmJO$?zb+$bqMo`KiMR2Acyq3lQt)_bL1Y zoz@FlfB2)r)d* zP-x*YV1DheL&4|(cLR7&js5|icTSriaq)oFpRvP3;Q@z%kv_xb14|gV4fr~kz$?MD zVB?1hjB*UE6BM6nRWRLKu)RT1fxA*{7DIcZ?gNJmrVfZX9vm!A2R$~p`518XFl<&Z zY2Y_x?qE3NU~@nhY5&(2hW`wpZ~~Q1v-fS5OV+P4a1LyO`uZ~^%zbw zY;fS&!3@5D;1K^p#Qx^Wcj)Kofabf4+Gr<|+LH-HKp#5+R3=9?m2N-s+=)tNjJ%$cQ{k4dJ8|D6#jf^@D76M$L z%{989Wg8+4dl?i_&hK5qu`@*vH2i3AXs{7<5F&j1Q1A%@$f=NOi@`2I z2ekeWRHOAH&3~;|_{m@gI(8nkFx$q1UqJW?!%qcp{RQuTEnqm|XeR(Vf1}|9gAq#) z=z#Pe97YWM2b$sIhnft19J&n}ub8VD`WToNa4cYY$zZg=Yy$HFrY=an&|vjvY);T= z;8bAZ1D)UdK*B)iOvmN}3OATl5bF=c8QK~2n>-Vg;uKmAC>+!PZDiihpn8B?g9(2A zyp+??2HOX`6-;alhZ{CN(8*xF$MC(y5VWEmUVkkBpTD7J!2E<6eB{~!W^ilp0P6m) zbD(oPs+H{o{x?`B@Kq>VFg2}}|WQy3H*Bq|X7uLBGn3_43R6u1;X{S*fd1uibe4HF<6!C>=W z>zGb9*iF#cz^nr5TQ%@aU{+_i-C*Rv!+_|2J#qNSVb=&cKZ@Zug9xZ8`{clG&<249 z*!Ur%z`usSpj8B*YU^}^aRbi@W)p|~JjyOS2RY&WuXKhT4GIf5B)F6qx*sS_;9%fV z10D1Sx^P6n0lWsLfmIc}?Td3qlNv*}f)WGAMDU?8S_~Z%Q1>r`eZc@a0v9yI4XVF1 z7&s;{!Pg(UfL5!5#?U~=w;F-gZzwSQV6bA~nZOJ`KMK_U+TXzcLHPryU}S*SU)ve@ zFEGQ`AO2u?(_jrccH@)4pH}-6o(N`>hWnt6%muLV!vg{@4s6J0L?`*=y`CgU{Yb21-dE5fC;{SV+BJOgTe)k z2?B2zEE)6|IaV-fFmy8MIdC+<=f6Z>IlN}D3ef31{OZ7u2D?o<4a^Komm4-XfEbYV zBo7#Ofp!6`;Q!$Kh2j4S`vCp}&VN|`s8~1ggK9MJ_`HL_3ed=alkOh&H;g|R>{$3W zFe^B`Vz6T1V{8_I%rBo{)kxUPptpddf$0(BZbqF0+;&WQpo57%@NPkz-fMZ7kp8>ZJZ2iUx(5N-^d{F_r1MCx+ zUosSfCS*Gh{jV1er`jwUcr}ET7%n$}4{&B+038h5+u)o98J|BPI0JMnHmHb`0k1#g z`oJZ_(8mB;f5>D68K-Svn8m`|p#8w}hm)N^e}ifQhYy<(19&3r3{wKE|8;_)*+D^o zgQtm6p`k(T2iFEBUY5xWNl!d%n&9i_Hz=Glw3xuVrb)Bm6o>f&od?Vs47V7J8hD>D zS3&IZV0b9>!@*vN|A6;LhBpjWBK&R49~#~`*faPaLCk+0VmLX$EN=fK^nCGZ5OX!)yPKUe%jtR`J4Hp}fDmdhr6F`$#3=EL-=k?q; zE-`&k*~^gU#4({sMX;Ac+kxW(()ouDjSTvr@By8tr{kg_C{*GyS5VP~#)0393E0P2YG z!_PmQ!TQPIErWprzW}!i!$k&T0iGk^gM2rEHZsH4Z#)J~2Qx5(sx2M{1q}`^rv{c4 z3knHPIvEx_a9?0BVdzy* za^l#)w1itygiIb2{$|J4)Jec)>nGH!0dv~9_}ni{%T-&LD?{j|9@PosSgTIMc0kS@!LEsLkS8_n-L-QYoKMeYZc>XZUFx>~8*A&AA zUBA)5lEc!`p$A$A`#@wjgWfUT4WJGS=w_c4i1iyf4xNfR3>*z?4+M5Q=pEoN5Ymx= ztZHC`ub<~(Xax1Y44lqzY+%qizzJIO#=y7$6wA>1tARI%v4g=5eEuQBFDAPKJOLGKj?P0AI#qvzBL#p z@E>LdZ`^z0e+aRE`5m~==mEOwWfz0eLGI~H?-+JA=$+v1MfAVUFl=VXIlyJWbcSOW zgTeuB2DUSTiy3qdcr&oU`(JAqb~ET4<=VjX#$gx3q9fcB+CV4U>m878KpAo^c>81^&RKWP2H{Ey)ugZu;V2DiVk9vQU$TEp;~ zp$;5AOs7BxMJ{Oux3xeC-~z1v(qY-npm%@)ASs5L1N;KWL?3BI+-&FCOrLwqBkB zA4AOyI+4TZ0RNh1`25!#P?PTf2dJ6a2AcmWbOK#MWD4px!S^rEW7yuH|3JEe=^jH{ zgYE;a8m4;;`ynSvA?Ck8em}x#z;uqOi9zRq7U=xLjSe~oxJ?oD*9wMT%ytX<7cjqS zILBbOf^P})3x;nCts3~(AnyNq06L-*v;+dYY=eQbq4@#B4-Pd@j|{2*1?mOxgO<&M zjzi}GH8_6?7&-E6K%W1ybOJ4#XHsS8bSMLLG*lRNGH`)5ULmbNG;~l3kQQNLQD}70 zaN-bPQeoN6!GN}Zd830u0JjL}91jPL01iPm76wZO4VO*b`H8dKS9x!#Vn1Ln^{2=8RX#dw%4n+r! z03j2Vr5wyopu-y(IvFxR8#-X)hk{EOHZmxBNCYsMG_*1(dvI-Fc*4+`pawc0+YM6I zEf58DsX*OZVHS>;3ffqE{3O?;;f-_S83lu)! z`!7y_#%&rv;p1S(z~90Qpa0Te*u|jK;IV*7gXI>3c>~7+CJUBb7xg;$K$kLt`@+!i z!v~TUpgZOo6&5hqFm*6&xS;cb*#LR}@^*(r(EOJyL%W0O1dbZE8Q_UsF68@D82&YE zUZDGe+lr~LVe6M{$fuMju@DG%ZISAwMu@NZyv!(h!I*TBDk@dd+=2JpBjeEthm zq!>5IKVY^H_{U-lS`zky;hzAQaR9b|Ifr2%gK`7+111ZGe+M}D!d}R52PAU9 z5WL2fp@E4(p}|8zh=T>xSVv_*wtq1&G%zqGFhnqjF|aluGXlUOicq^eSc@2A8p0Js zPe2*0Cm5k3FuRUApj|7?0J>k=0dmna%*`GwN{k#0P6`4YPzGr34I5jLJx=}7zDw~4jCC47#yK$jwUdHR+TC=a3~-#Sern-B1foQM;#awm?9ab zF|anUCNM@aggJ;du%|FaFoZFP!rkn^oWO8{!Hj{o0n7+v5baVl!v~i@?ILfq}t*fd{nd6m&E+gdt!A6#;JtVPI%rVl-&*Q4r=}IRs_| zbFds{G&%qh5jgF@Rji z#KC~%=7dHG1vd`CCKeEbjf1g?!K9H>!OcSut|oysf-#ICv_TZY5N%*dV3c5VV+d_v zb%5H{z{cp<5Rf1u!HU8N0f|7mm0*7{G&m>-aIi25GPF1-1aOEn39>XeDhhZ&mo_sn z9Cc$3Y`BtOD!~h5u(~k^HckPF!0bBe##z`9lOQf3dW;ps2$v8%##-1IlMpT;3d=jL zZpbVz{Z%^5|JP#!P>@<*Z^WMwy{DOtPK#W7+f7#3m9V6Wi&={Z)!Xe58Vi<(-1Trx=91H=8FhK2MU}g+B5Mm(8!|IG+1T};xh;lH3YdDa* zIT)N61sYfs1UVR-7z7wu6c|DI3nT*REi*7MxH>U`GPnW<19-FI0tlnA0dy@*1Jo{8 z2i62=Zh|w|VIoj}9Yx7sGZ@MkWE&U@7$G?hjaIqzuA(L}78t0NPN-!N3G6VHFrS8kj)0XM*ek zi$Lw-a7hxBXmC>$>;N%X*g%W~5s4NzML~o)t^tA}ETN2|4q%2TBddc$fB-}UY77I1 zq7z3zlZZkqgdwWX>Y?bw69N)}DPiDZWNL6&AfUklW-JuY0Erv`i@??JFb6YSIbdqQ z>jP$}8gTe92eVEAi6G*gv4{aw7qG(W0?`xfMUEg5K}7gScpMWjZ0Sia2`ZvoDonL z;e`90g|!e~FC!Q};CdNm5JtHHtDq%V5b=(!K4pN^r!aFkSc({B8r&5GPoOb05OKjk zlsRbiGOU755P-W!i^Z!^Xo1TLK}-hJIUEOg7=jr@4zL<9`d~01L*3wfhFmYhD`*B5 z2S&)S1Ovwb2XH1)0IdRs<{x-QLZ|`NGYoDFg5U}Vl>uJ5%OJq$z?8r+gF%gfvjK_0 z2o`CAINHG#qh5wr&;kb_WfUmsLyHSUy$mWzAT>4EAO{8}2Jk);4u(TWj7A;>W)4`n z0kR8Jje?711fv05!$QkL2S#l5GPH#Pjf((ACvbI)-5juU7#v(3SOOSD7+e_ykr@mk z3;_%xOb~y0Ft9N=HV7oJNHAhDAjU9wFfcK~>SYi^5mZ5g7@(ROs>Z<;Rvp9ZWiaCi zxL$_X#lYysQrIYy;4Z;<49XA$F?Dma zy+QB+1_PEh7}4rwcm>VI!3Z_Sff21m50$8g8@pU44|ei2dFx309VIO4B+Y*E&}#B1A_y&UT#oOfF2@%!hqSu=zu4G zK@4)hp1+_u4ywjAfyIK6kHNV?-~k2$8ioN3j0^@2JOa!t3Ae}N9_N7T!Ras^!EfDLkB^Z-@IpjsGQFQYJEaq8;e z5+EqT;>sw9g#k;4NNq9XIB#N6fVYuAwJ=h>46mR;46tiJ@#V`L>~Q6RsR=J8!vSg+ zqX$|QfK(|!!;paiR2>V!>SYv$Bh)VH*2}2XF|2~Fh1-Q$9m7Qa!qtGPV|cxc%7Ck3 zYGGK&q2bIWpwz;$kVC_XQ{oWlA`Kk}F7N~^L>&tQBMYc~=)l6l$im>rAi==G!sr0* zB|;Q1FbK5pC~|N(GYK@bC@6ApI5CNU4y|wCae!=o2P>0cVS@BnJ6MziK}Dm)2^Ka+ zhE@j!B)ggnV3ik#0tbgNC~dJQFvx&X8`uzN&E^18#iAepN|T`M%D@3p!N9=5AkoMM zIW%cT1D66vhZ5*K3MB;&(0(Y$^dLwL0~=5T=h<)9#-!NSJK0qTlHu&FURfO_jt2XQbcv~Vc0 za5yjtD70`Wuy8mr2~21;P;B6EWP;lzAi!?J2wGq&bAa7|k%7U9LFNIgieLjn5d#DC zoB@zI8W3{~z(=7JGYK%X8zeG-!Wrrw1_sb|DLf$0FfrIPuqZfiFf_3!G%$d=8Bq5y zFeo&rDDZ$zLJbXW$^PuRWUFekc2WF7#bKDBpVo{!A%~hAcTSqy)ZO@ z)PTj{z6SF^T?c5tSb;$R((xB$P=q-WqQ?IJ|Nr2OEe~VZ*WZVTKoo%6*ibe0_n{2= ze^3S%HE?tO*}n&yj86?rF;+G8VD0w*|3es9)j*tT|NsAQuwu9xNM3g25@2d!S;(N_ z#3j(wqO;IJ!x1GfgR-y_gMb4I12hY>2!InCB8&uDI1D*B96@=R#jt?~lvZ056dgcm z3~m=BFM~%N7#JHsNqq(=FE=z!C9E0 zfdi6g6&f5sX%(u9gF&K!&48gp0kkDw&434#g*h7Z6c~D#lpu){l;1fR*cccZKpPlA zTg4g~6dEKLlt5!6D0x|FLBk3MEt#$su7wOMinT1lR=_eHe-vWE$8F7|$>i zGD>`47hpWYP|N_jWe^mMpuEhW$N?%75?TZlLFNc7Xkk%o0Es}&0p~SHi{uc4N&~p8 zb7BxU-~kFKXno26ZZvc7FflP~Xkanm;80>}n9!hNz{1PG1X(S?z`!8T0Lj3hW{wC0 z1A`JP11Qu$?qG1hl9!=o!!tElAp?VrjX(k{FFU{(FcGA@>;P@JGczzcNP^8e02YC; z!G>{wg+WYsUWPM3q7V$t!V(M;kmM=Apa99#5NS}I3(b}AObutilrX?W5Da{I`935I z+rR%0Vc;>x7H?jL=Tis+yE)+2C&*!723!qch5>^DBPf{|FgSSGz3ONU^E0q zLtr!nMnhmU1V&y6fZIz_WhR0kpVJ o|DXXw186#p*?_@;lNe7z)w3EfECA^Ptten*U^s}FmVz1r0KJf4Hvj+t literal 0 HcmV?d00001 diff --git a/fpga/fpga_pm3_lf.bit b/fpga/fpga_pm3_lf.bit new file mode 100644 index 0000000000000000000000000000000000000000..593a9031f9bc0765bcbf12e5b1b63a0e88037c42 GIT binary patch literal 42172 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 bithalf) ^ dlay) & (~disabl); @@ -365,21 +354,22 @@ always @(ck_1356meg or ssp_dout or power or disabl or mod) begin if (power) begin - pwr_hi <= ck_1356meg; + pwr_hi <= ck_1356meg; + pwr_lo <= 1'b0; pwr_oe1 <= 1'b0;//mod; + pwr_oe2 <= 1'b0;//mod; pwr_oe3 <= 1'b0;//mod; pwr_oe4 <= mod;//1'b0; end else begin - pwr_hi <= 1'b0; + pwr_hi <= 1'b0; + pwr_lo <= 1'b0; pwr_oe1 <= 1'b0; + pwr_oe2 <= 1'b0; pwr_oe3 <= 1'b0; pwr_oe4 <= mod; end end - - - endmodule diff --git a/fpga-xc2s30/hi_get_trace.v b/fpga/hi_get_trace.v similarity index 86% rename from fpga-xc2s30/hi_get_trace.v rename to fpga/hi_get_trace.v index 6e4369e14..9bf32bc64 100644 --- a/fpga-xc2s30/hi_get_trace.v +++ b/fpga/hi_get_trace.v @@ -13,17 +13,18 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +//`include "define.v" module hi_get_trace( - ck_1356megb, - adc_d, trace_enable, major_mode, - ssp_frame, ssp_din, ssp_clk + input ck_1356megb, + input [7:0] adc_d, + input trace_enable, + input [2:0] major_mode, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk ); - input ck_1356megb; - input [7:0] adc_d; - input trace_enable; - input [2:0] major_mode; - output ssp_frame, ssp_din, ssp_clk; // clock divider reg [6:0] clock_cnt; @@ -88,9 +89,9 @@ begin write_enable2 <= 1'b0; end else - begin + begin addr <= addr + 1; - end + end end end else @@ -136,9 +137,6 @@ begin end -// SSC communication to ARM -reg ssp_clk; -reg ssp_frame; reg [7:0] shift_out; always @(negedge ck_1356megb) @@ -147,16 +145,16 @@ begin begin if (clock_cnt[6:4] == 3'd0) // either load new value begin - if (addr[11] == 1'b0) - shift_out <= D_out1; - else - shift_out <= D_out2; + if (addr[11] == 1'b0) + shift_out <= D_out1; + else + shift_out <= D_out2; end else - begin - // or shift left - shift_out[7:1] <= shift_out[6:0]; - end + begin + // or shift left + shift_out[7:1] <= shift_out[6:0]; + end end ssp_clk <= ~clock_cnt[3]; // ssp_clk frequency = 13,56MHz / 16 = 847,5 kHz diff --git a/fpga-xc2s30/hi_iso14443a.v b/fpga/hi_iso14443a.v similarity index 97% rename from fpga-xc2s30/hi_iso14443a.v rename to fpga/hi_iso14443a.v index d52ab4000..7ccd7f610 100644 --- a/fpga-xc2s30/hi_iso14443a.v +++ b/fpga/hi_iso14443a.v @@ -14,29 +14,28 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- // ISO14443-A support for the Proxmark III -// +//`include "define.v" module hi_iso14443a( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type + input ck_1356meg, + input [7:0] adc_d, + input [3:0] mod_type, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input ck_1356meg; - 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; - output dbg; - input [3:0] mod_type; - - -wire adc_clk = ck_1356meg; - +assign adc_clk = ck_1356meg; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Reader -> PM3: @@ -76,8 +75,6 @@ begin end - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Reader -> PM3 // detect when a reader is active (modulating). We assume that the reader is active, if we see the carrier off for at least 8 @@ -137,7 +134,6 @@ wire [9:0] tmp2 = adc_d_times_2 + input_prev_1; wire signed [10:0] adc_d_filtered = {1'b0, tmp1} - {1'b0, tmp2}; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // internal FPGA timing. Maximum required period is 128 carrier clock cycles for a full 8 Bit transfer to ARM. (i.e. we need a // 7 bit counter). Adjust its frequency to external reader's clock when simulating a tag or sniffing. @@ -222,7 +218,11 @@ reg signed [10:0] rx_mod_falling_edge_max; reg signed [10:0] rx_mod_rising_edge_max; reg curbit; +`ifdef PM3ICOPYX +`define EDGE_DETECT_THRESHOLD 3 +`else `define EDGE_DETECT_THRESHOLD 5 +`endif `define EDGE_DETECT_THRESHOLDHIGH 20 always @(negedge adc_clk) @@ -266,7 +266,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tag+Reader -> PM3 // sample 4 bits reader data and 4 bits tag data for sniffing @@ -283,7 +282,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader: // a delay line to ensure that we send the (emulated) tag's answer at the correct time according to ISO14443-3 @@ -307,7 +305,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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. @@ -400,7 +397,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PM3 -> Reader // determine the required delay in the mod_sig_buf (set mod_sig_ptr). @@ -444,7 +440,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // buffer 8 bits data to be sent to ARM. Shift them out bit by bit. @@ -495,8 +490,6 @@ end //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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; always @(negedge adc_clk) begin @@ -529,7 +522,6 @@ begin end - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FPGA -> ARM communication: // select the data to be sent to ARM @@ -553,7 +545,6 @@ begin sendbit = 1'b0; end - if(mod_type == `FPGA_HF_ISO14443A_SNIFFER) // send sampled reader and tag data: bit_to_arm = to_arm[7]; @@ -589,6 +580,6 @@ assign pwr_oe4 = mod_sig_coil & sub_carrier & (mod_type == `FPGA_HF_ISO14443A_TA assign pwr_oe2 = 1'b0; assign pwr_lo = 1'b0; -assign dbg = negedge_cnt[3]; +assign debug = negedge_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_reader.v b/fpga/hi_reader.v similarity index 95% rename from fpga-xc2s30/hi_reader.v rename to fpga/hi_reader.v index dbc38a8a7..ffa2634d8 100644 --- a/fpga-xc2s30/hi_reader.v +++ b/fpga/hi_reader.v @@ -13,24 +13,27 @@ // // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- +//`include "define.v" module hi_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode + input ck_1356meg, + input [7:0] adc_d, + input [1:0] subcarrier_frequency, + input [3:0] minor_mode, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output reg pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output reg pwr_oe4, + output debug ); - input ck_1356meg; - 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; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz @@ -160,7 +163,6 @@ begin end else if (minor_mode == `FPGA_HF_READER_MODE_SNIFF_IQ) begin - // Send 7 most significant bits of in phase tag signal (signed), plus 1 bit reader signal 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}; @@ -261,9 +263,6 @@ end // corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... // -reg ssp_clk; -reg ssp_frame; - always @(negedge adc_clk) begin if (corr_i_cnt[1:0] == 2'b00) @@ -298,9 +297,6 @@ begin end end -// Antenna drivers -reg pwr_hi, pwr_oe4; - always @(*) begin if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) @@ -341,6 +337,6 @@ assign pwr_lo = 1'b0; assign pwr_oe2 = 1'b0; // Debug Output -assign dbg = corr_i_cnt[3]; +assign debug = corr_i_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_reader_15.v b/fpga/hi_reader_15.v similarity index 96% rename from fpga-xc2s30/hi_reader_15.v rename to fpga/hi_reader_15.v index 0db4fe2a3..ad41e771c 100644 --- a/fpga-xc2s30/hi_reader_15.v +++ b/fpga/hi_reader_15.v @@ -14,25 +14,26 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- // modified to add support for iso15 2sc mode -// -module hi_15_reader( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - subcarrier_frequency, minor_mode +module hi_reader_15( + input ck_1356meg, + input [7:0] adc_d, + input [1:0] subcarrier_frequency, + input [3:0] minor_mode, + input ssp_dout, + + output ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output reg pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output reg pwr_oe4, + output debug ); - input ck_1356meg; - 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; - output dbg; - input [1:0] subcarrier_frequency; - input [3:0] minor_mode; assign adc_clk = ck_1356meg; // sample frequency is 13,56 MHz @@ -379,9 +380,6 @@ end // corr_i_cnt 0 1 2 3 4 5 6 7 8 9 10 11 12 ... // -reg ssp_clk; -reg ssp_frame; - always @(negedge adc_clk) begin if (corr_i_cnt[1:0] == 2'b00) @@ -416,9 +414,6 @@ begin end end -// Antenna drivers -reg pwr_hi, pwr_oe4; - always @(*) begin if (minor_mode == `FPGA_HF_READER_MODE_SEND_SHALLOW_MOD) @@ -459,6 +454,6 @@ assign pwr_lo = 1'b0; assign pwr_oe2 = 1'b0; // Debug Output -assign dbg = corr_i_cnt[3]; +assign debug = corr_i_cnt[3]; endmodule diff --git a/fpga-xc2s30/hi_simulate.v b/fpga/hi_simulate.v similarity index 91% rename from fpga-xc2s30/hi_simulate.v rename to fpga/hi_simulate.v index 2232aedd9..97346eb9b 100644 --- a/fpga-xc2s30/hi_simulate.v +++ b/fpga/hi_simulate.v @@ -30,23 +30,26 @@ // // Jonathan Westhues, October 2006 //----------------------------------------------------------------------------- +//`include "define.v" module hi_simulate( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, - mod_type + input ck_1356meg, + input [7:0] adc_d, + input [3:0] mod_type, + input ssp_dout, + + output reg ssp_din, + output reg ssp_frame, + output reg ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input ck_1356meg; - 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; - output dbg; - input [3:0] mod_type; // Power amp goes between LOW and tri-state, so pwr_hi (and pwr_lo) can // always be low. @@ -57,7 +60,7 @@ assign pwr_lo = 1'b0; // LF antenna connected to GND assign pwr_oe2 = 1'b0; assign adc_clk = ck_1356meg; -assign dbg = ssp_frame; +assign debug = ssp_frame; // The comparator with hysteresis on the output from the peak detector. reg after_hysteresis; @@ -94,8 +97,6 @@ reg [8:0] ssp_clk_divider; always @(negedge adc_clk) ssp_clk_divider <= (ssp_clk_divider + 1); -reg ssp_clk; - always @(negedge adc_clk) begin if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_424K_8BIT) @@ -112,7 +113,6 @@ end // Produce the byte framing signal; the phase of this signal // is arbitrary, because it's just a bit stream in this module. -reg ssp_frame; always @(negedge adc_clk) begin if (mod_type == `FPGA_HF_SIMULATOR_MODULATE_212K) @@ -133,7 +133,6 @@ end // Synchronize up the after-hysteresis signal, to produce DIN. -reg ssp_din; always @(posedge ssp_clk) ssp_din = after_hysteresis; diff --git a/fpga-xc2s30/hi_sniffer.v b/fpga/hi_sniffer.v similarity index 69% rename from fpga-xc2s30/hi_sniffer.v rename to fpga/hi_sniffer.v index ed62191f1..11781ca5a 100644 --- a/fpga-xc2s30/hi_sniffer.v +++ b/fpga/hi_sniffer.v @@ -15,16 +15,20 @@ //----------------------------------------------------------------------------- module hi_sniffer( - ck_1356meg, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_clk + input ck_1356meg, + input [7:0] adc_d, + + output ssp_din, + output reg ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4 ); - input ck_1356meg; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - output ssp_frame, ssp_din, ssp_clk; // We are only snooping, all off. assign pwr_hi = 1'b0; @@ -34,12 +38,13 @@ assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; -reg ssp_frame; +//reg ssp_frame; reg [7:0] adc_d_out = 8'd0; -reg [2:0] ssp_cnt = 3'd0; +reg [2:0] ssp_cnt = 3'd0; -assign adc_clk = ck_1356meg; +assign adc_clk = ck_1356meg; assign ssp_clk = ~ck_1356meg; +assign ssp_din = adc_d_out[0]; always @(posedge ssp_clk) begin @@ -49,18 +54,16 @@ begin ssp_cnt <= ssp_cnt + 1; if(ssp_cnt[2:0] == 3'b000) // set frame length - begin - adc_d_out[7:0] <= adc_d; - ssp_frame <= 1'b1; - end + begin + adc_d_out[7:0] <= adc_d; + ssp_frame <= 1'b1; + end else - begin - adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; - ssp_frame <= 1'b0; - end + begin + // shift value right one bit + adc_d_out[7:0] <= {1'b0, adc_d_out[7:1]}; + ssp_frame <= 1'b0; + end end - -assign ssp_din = adc_d_out[0]; - endmodule diff --git a/fpga-xc2s30/lf_edge_detect.v b/fpga/lf_edge_detect.v similarity index 72% rename from fpga-xc2s30/lf_edge_detect.v rename to fpga/lf_edge_detect.v index 4b6c0ac01..2a58331d1 100644 --- a/fpga-xc2s30/lf_edge_detect.v +++ b/fpga/lf_edge_detect.v @@ -15,23 +15,37 @@ // See LICENSE.txt for the text of the license. //----------------------------------------------------------------------------- - // input clk is 24MHz -`include "min_max_tracker.v" +//`include "min_max_tracker.v" -module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, - output [7:0] max, output [7:0] min, - output [7:0] high_threshold, output [7:0] highz_threshold, - output [7:0] lowz_threshold, output [7:0] low_threshold, - output edge_state, output edge_toggle); +module lf_edge_detect( + input clk, + input [7:0] adc_d, + input [7:0] lf_ed_threshold, - min_max_tracker tracker(clk, adc_d, lf_ed_threshold, min, max); + output [7:0] max, + output [7:0] min, + output [7:0] low_threshold, + output [7:0] high_threshold, + output [7:0] lowz_threshold, + output [7:0] highz_threshold, + output edge_state, + output edge_toggle +); + + min_max_tracker tracker( + .clk (clk), + .adc_d (adc_d), + .threshold (lf_ed_threshold), + .min (min), + .max (max) +); // auto-tune - assign high_threshold = (max + min) / 2 + (max - min) / 4; + assign high_threshold = (max + min) / 2 + (max - min) / 4; assign highz_threshold = (max + min) / 2 + (max - min) / 8; - assign lowz_threshold = (max + min) / 2 - (max - min) / 8; - assign low_threshold = (max + min) / 2 - (max - min) / 4; + assign lowz_threshold = (max + min) / 2 - (max - min) / 8; + assign low_threshold = (max + min) / 2 - (max - min) / 4; // heuristic to see if it makes sense to try to detect an edge wire enabled = @@ -55,18 +69,20 @@ module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, always @(posedge clk) begin is_high <= (adc_d >= high_threshold); - is_low <= (adc_d <= low_threshold); + is_low <= (adc_d <= low_threshold); is_zero <= ((adc_d > lowz_threshold) & (adc_d < highz_threshold)); end // all edges detection always @(posedge clk) - if (enabled) begin + if (enabled) + begin // To enable detecting two consecutive peaks at the same level // (low or high) we check whether or not we went back near 0 in-between. // This extra check is necessary to prevent from noise artifacts // around the threshold values. - if (trigger_enabled & (is_high | is_low)) begin + if (trigger_enabled & (is_high | is_low)) + begin output_edge <= ~output_edge; trigger_enabled <= 0; end else @@ -75,14 +91,15 @@ module lf_edge_detect(input clk, input [7:0] adc_d, input [7:0] lf_ed_threshold, // edge states always @(posedge clk) - if (enabled) begin + if (enabled) + begin if (is_high) output_state <= 1'd1; else if (is_low) output_state <= 1'd0; end - assign edge_state = output_state; + assign edge_state = output_state; assign edge_toggle = output_edge; endmodule diff --git a/fpga-xc2s30/lo_adc.v b/fpga/lo_adc.v similarity index 74% rename from fpga-xc2s30/lo_adc.v rename to fpga/lo_adc.v index 808ec96ed..475cc869f 100644 --- a/fpga-xc2s30/lo_adc.v +++ b/fpga/lo_adc.v @@ -22,22 +22,24 @@ //----------------------------------------------------------------------------- module lo_adc( - pck0, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - dbg, divisor, - lf_field + input pck0, + input [7:0] adc_d, + input [7:0] divisor, + input lf_field, + input ssp_dout, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - input pck0; - 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; - output dbg; - input [7:0] divisor; - input lf_field; reg [7:0] to_arm_shiftreg; reg [7:0] pck_divider; @@ -49,16 +51,16 @@ wire reader_modulation = !ssp_dout & lf_field & clk_state; // always on (High Frequency outputs, unused) assign pwr_oe1 = 1'b0; -assign pwr_hi = 1'b0; +assign pwr_hi = 1'b0; // low frequency outputs -assign pwr_lo = reader_modulation; +assign pwr_lo = reader_modulation; assign pwr_oe2 = 1'b0; // 33 Ohms assign pwr_oe3 = tag_modulation; // base antenna load = 33 Ohms assign pwr_oe4 = 1'b0; // 10k Ohms // Debug Output ADC clock -assign dbg = adc_clk; +assign debug = adc_clk; // ADC clock out of phase with antenna driver assign adc_clk = ~clk_state; @@ -76,10 +78,10 @@ assign ssp_frame = (pck_divider[7:3] == 5'd1) && !clk_state; always @(posedge pck0) begin if (pck_divider == divisor[7:0]) - begin + begin pck_divider <= 8'd0; clk_state = !clk_state; - end + end else begin pck_divider <= pck_divider + 1; @@ -92,13 +94,9 @@ always @(posedge pck0) begin if ((pck_divider == 8'd7) && !clk_state) to_arm_shiftreg <= adc_d; - else begin + else + begin to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit to_arm_shiftreg[0] <= 1'b0; end end diff --git a/fpga-xc2s30/lo_edge_detect.v b/fpga/lo_edge_detect.v similarity index 67% rename from fpga-xc2s30/lo_edge_detect.v rename to fpga/lo_edge_detect.v index 462dfcc46..c820466f7 100644 --- a/fpga-xc2s30/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -25,19 +25,29 @@ // - ssp_frame (wired to TIOA1 on the arm) for the edge detection/state // - ssp_clk: cross_lo -`include "lp20khz_1MSa_iir_filter.v" -`include "lf_edge_detect.v" +//`include "lp20khz_1MSa_iir_filter.v" +//`include "lf_edge_detect.v" module lo_edge_detect( - input pck0, input pck_divclk, - 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 ssp_frame, input ssp_dout, output ssp_clk, + input pck0, + input pck_divclk, + input [7:0] adc_d, input cross_lo, - output dbg, input lf_field, - input lf_ed_toggle_mode, input [7:0] lf_ed_threshold + input lf_ed_toggle_mode, + input [7:0] lf_ed_threshold, + input ssp_dout, + + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); wire tag_modulation = ssp_dout & !lf_field; @@ -58,18 +68,34 @@ assign pwr_hi = 1'b0; wire data_rdy; wire [7:0] adc_filtered; assign adc_clk = pck0; -lp20khz_1MSa_iir_filter adc_filter(pck0, adc_d, data_rdy, adc_filtered); + +lp20khz_1MSa_iir_filter adc_filter( + .clk (pck0), + .adc_d (adc_d), + .rdy (data_rdy), + .out (adc_filtered) +); // detect edges wire [7:0] high_threshold, highz_threshold, lowz_threshold, low_threshold; wire [7:0] max, min; wire edge_state, edge_toggle; -lf_edge_detect lf_ed(pck0, adc_filtered, lf_ed_threshold, - max, min, - high_threshold, highz_threshold, lowz_threshold, low_threshold, - edge_state, edge_toggle); -assign dbg = lf_ed_toggle_mode ? edge_toggle : edge_state; +lf_edge_detect lf_ed( + .clk (pck0), + .adc_d (adc_filtered), + .lf_ed_threshold (lf_ed_threshold), + .max (max), + .min (min), + .high_threshold (high_threshold), + .highz_threshold (highz_threshold), + .lowz_threshold (lowz_threshold), + .low_threshold (low_threshold), + .edge_state (edge_state), + .edge_toggle (edge_toggle) +); + +assign debug = lf_ed_toggle_mode ? edge_toggle : edge_state; assign ssp_frame = lf_ed_toggle_mode ? edge_toggle : edge_state; diff --git a/fpga-xc2s30/lo_passthru.v b/fpga/lo_passthru.v similarity index 82% rename from fpga-xc2s30/lo_passthru.v rename to fpga/lo_passthru.v index 52e56d4c5..a5ae1d4e2 100644 --- a/fpga-xc2s30/lo_passthru.v +++ b/fpga/lo_passthru.v @@ -17,27 +17,32 @@ // For reading TI tags, we need to place the FPGA in pass through mode // and pass everything through to the ARM - module lo_passthru( input pck_divclk, - output pwr_lo, output pwr_hi, - output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, - output adc_clk, - output ssp_din, input ssp_dout, input cross_lo, - output dbg + input ssp_dout, + + output ssp_din, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); // the antenna is modulated when ssp_dout = 1, when 0 the // antenna drivers stop modulating and go into listen mode -assign pwr_oe3 = 1'b0; +assign ssp_din = cross_lo; +assign adc_clk = 1'b0; +assign pwr_lo = pck_divclk && ssp_dout; +assign pwr_hi = 1'b0; assign pwr_oe1 = ssp_dout; assign pwr_oe2 = ssp_dout; +assign pwr_oe3 = 1'b0; assign pwr_oe4 = ssp_dout; -assign pwr_lo = pck_divclk && ssp_dout; -assign pwr_hi = 1'b0; -assign adc_clk = 1'b0; -assign ssp_din = cross_lo; -assign dbg = cross_lo; +assign debug = cross_lo; endmodule diff --git a/fpga-xc2s30/lo_read.v b/fpga/lo_read.v similarity index 80% rename from fpga-xc2s30/lo_read.v rename to fpga/lo_read.v index a7e481654..06bd0ae5a 100644 --- a/fpga-xc2s30/lo_read.v +++ b/fpga/lo_read.v @@ -22,13 +22,23 @@ //----------------------------------------------------------------------------- module lo_read( - input pck0, input [7:0] pck_cnt, input pck_divclk, - 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 ssp_frame, output ssp_din, output ssp_clk, - output dbg, - input lf_field + input pck0, + input pck_divclk, + input [7:0] pck_cnt, + input [7:0] adc_d, + input lf_field, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); reg [7:0] to_arm_shiftreg; @@ -43,13 +53,9 @@ always @(posedge pck0) begin if((pck_cnt == 8'd7) && !pck_divclk) to_arm_shiftreg <= adc_d; - else begin + else + begin to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; - // simulation showed a glitch occurring due to the LSB of the shifter - // not being set as we shift bits out - // this ensures the ssp_din remains low after a transfer and suppresses - // the glitch that would occur when the last data shifted out ended in - // a 1 bit and the next data shifted out started with a 0 bit to_arm_shiftreg[0] <= 1'b0; end end @@ -74,7 +80,7 @@ assign ssp_clk = pck0; // SSP frame is gated by ant_lo and goes high when pck_divider=8..15 assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; // unused signals tied low -assign pwr_hi = 1'b0; +assign pwr_hi = 1'b0; assign pwr_oe1 = 1'b0; assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; @@ -84,5 +90,5 @@ assign pwr_lo = lf_field & pck_divclk; // ADC clock out of phase with antenna driver assign adc_clk = ~pck_divclk; // ADC clock also routed to debug pin -assign dbg = adc_clk; +assign debug = adc_clk; endmodule diff --git a/fpga-xc2s30/lo_simulate.v b/fpga/lo_simulate.v similarity index 79% rename from fpga-xc2s30/lo_simulate.v rename to fpga/lo_simulate.v index 89b548c73..c3f819cd7 100644 --- a/fpga-xc2s30/lo_simulate.v +++ b/fpga/lo_simulate.v @@ -22,23 +22,27 @@ //----------------------------------------------------------------------------- module lo_simulate( - 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, - divisor + input pck0, + input ck_1356meg, + input ck_1356megb, + input [7:0] adc_d, + input [7:0] divisor, + input cross_hi, + input cross_lo, + input ssp_dout, + + output ssp_din, + output ssp_frame, + output ssp_clk, + output adc_clk, + output pwr_lo, + output pwr_hi, + output pwr_oe1, + output pwr_oe2, + output pwr_oe3, + output pwr_oe4, + output debug ); - 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 [7:0] divisor; // No logic, straight through. assign pwr_oe3 = 1'b0; @@ -46,9 +50,9 @@ assign pwr_oe1 = ssp_dout; assign pwr_oe2 = ssp_dout; assign pwr_oe4 = ssp_dout; assign ssp_clk = cross_lo; -assign pwr_lo = 1'b0; -assign pwr_hi = 1'b0; -assign dbg = ssp_frame; +assign pwr_lo = 1'b0; +assign pwr_hi = 1'b0; +assign debug = ssp_frame; // Divide the clock to be used for the ADC reg [7:0] pck_divider; diff --git a/fpga-xc2s30/lp20khz_1MSa_iir_filter.v b/fpga/lp20khz_1MSa_iir_filter.v similarity index 96% rename from fpga-xc2s30/lp20khz_1MSa_iir_filter.v rename to fpga/lp20khz_1MSa_iir_filter.v index 8bc6cca4f..d4a16cde1 100644 --- a/fpga-xc2s30/lp20khz_1MSa_iir_filter.v +++ b/fpga/lp20khz_1MSa_iir_filter.v @@ -36,7 +36,12 @@ // See details about its design see // https://fail0verflow.com/blog/2014/proxmark3-fpga-iir-filter.html -module lp20khz_1MSa_iir_filter(input clk, input [7:0] adc_d, output rdy, output [7:0] out); +module lp20khz_1MSa_iir_filter( + input clk, + input [7:0] adc_d, + output rdy, + output [7:0] out +); // clk is 24MHz, the IIR filter is designed for 1MS/s // hence we need to divide it by 24 diff --git a/fpga-xc2s30/min_max_tracker.v b/fpga/min_max_tracker.v similarity index 95% rename from fpga-xc2s30/min_max_tracker.v rename to fpga/min_max_tracker.v index 210d3c666..2f6e06017 100644 --- a/fpga-xc2s30/min_max_tracker.v +++ b/fpga/min_max_tracker.v @@ -23,8 +23,13 @@ // This algorithm therefore can't be used directly for realtime peak detections, // but it can be used as a simple envelope follower. -module min_max_tracker(input clk, input [7:0] adc_d, input [7:0] threshold, - output [7:0] min, output [7:0] max); +module min_max_tracker( + input clk, + input [7:0] adc_d, + input [7:0] threshold, + output [7:0] min, + output [7:0] max +); reg [7:0] min_val = 255; reg [7:0] max_val = 0; diff --git a/fpga/mux16.v b/fpga/mux16.v new file mode 100644 index 000000000..1d9777706 --- /dev/null +++ b/fpga/mux16.v @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// +// General-purpose miscellany. +// + +// 16 inputs to 1 output multiplexer +module mux16( + input [3:0] sel, + output reg y, + input x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 +); + +always @(*) +begin + // y = x[sel]; + case (sel) + 4'd0: y = x0; + 4'd1: y = x1; + 4'd2: y = x2; + 4'd3: y = x3; + 4'd4: y = x4; + 4'd5: y = x5; + 4'd6: y = x6; + 4'd7: y = x7; + 4'd8: y = x8; + 4'd9: y = x9; + 4'd10: y = x10; + 4'd11: y = x11; + 4'd12: y = x12; + 4'd13: y = x13; + 4'd14: y = x14; + 4'd15: y = x15; + endcase +end + +endmodule diff --git a/fpga-xc3s100e/mux2_onein.v b/fpga/mux2_onein.v similarity index 70% rename from fpga-xc3s100e/mux2_onein.v rename to fpga/mux2_onein.v index 86f17a553..baefa72c8 100644 --- a/fpga-xc3s100e/mux2_onein.v +++ b/fpga/mux2_onein.v @@ -4,13 +4,14 @@ // kombi, 2020.05 //----------------------------------------------------------------------------- -module mux2_one(sel, y, x0, x1); - input [1:0] sel; - input x0, x1; - output y; - reg y; +module mux2_one( + input [1:0] sel, + output reg y, + input x0, + input x1 +); -always @(x0 or x1 or sel) +always @(*) begin case (sel) 1'b0: y = x1; diff --git a/fpga-xc3s100e/mux2_oneout.v b/fpga/mux2_oneout.v similarity index 68% rename from fpga-xc3s100e/mux2_oneout.v rename to fpga/mux2_oneout.v index 3cbc0fd6b..fa61205a2 100644 --- a/fpga-xc3s100e/mux2_oneout.v +++ b/fpga/mux2_oneout.v @@ -4,13 +4,14 @@ // kombi, 2020.05 //----------------------------------------------------------------------------- -module mux2_oneout(sel, y, x0, x1); - input [1:0] sel; - output x0, x1; - input y; - reg x0, x1; +module mux2_oneout( + input [1:0] sel, + input y, + output reg x0, + output reg x1 +); -always @(x0 or x1 or sel) +always @(*) begin case (sel) 1'b0: x1 = y; diff --git a/fpga-xc2s30/util.v b/fpga/mux8.v similarity index 68% rename from fpga-xc2s30/util.v rename to fpga/mux8.v index 66361ca59..d9118d243 100644 --- a/fpga-xc2s30/util.v +++ b/fpga/mux8.v @@ -17,23 +17,25 @@ // General-purpose miscellany. // -module mux8(sel, y, x0, x1, x2, x3, x4, x5, x6, x7); - input [2:0] sel; - input x0, x1, x2, x3, x4, x5, x6, x7; - output y; - reg y; +// 8 inputs to 1 output multiplexer +module mux8( + input [2:0] sel, + output reg y, + input x0, x1, x2, x3, x4, x5, x6, x7 +); -always @(x0 or x1 or x2 or x3 or x4 or x5 or x6 or x7 or sel) +always @(*) begin + // y = x[sel]; case (sel) - 3'b000: y = x0; - 3'b001: y = x1; - 3'b010: y = x2; - 3'b011: y = x3; - 3'b100: y = x4; - 3'b101: y = x5; - 3'b110: y = x6; - 3'b111: y = x7; + 3'd0: y = x0; + 3'd1: y = x1; + 3'd2: y = x2; + 3'd3: y = x3; + 3'd4: y = x4; + 3'd5: y = x5; + 3'd6: y = x6; + 3'd7: y = x7; endcase end diff --git a/fpga-xc2s30/tests/Makefile b/fpga/tests/Makefile similarity index 100% rename from fpga-xc2s30/tests/Makefile rename to fpga/tests/Makefile diff --git a/fpga-xc2s30/tests/plot_edgedetect.py b/fpga/tests/plot_edgedetect.py old mode 100755 new mode 100644 similarity index 100% rename from fpga-xc2s30/tests/plot_edgedetect.py rename to fpga/tests/plot_edgedetect.py diff --git a/fpga-xc2s30/sim.tcl b/fpga/tests/sim.tcl similarity index 100% rename from fpga-xc2s30/sim.tcl rename to fpga/tests/sim.tcl diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.filtered.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.high.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.high.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.high.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.high.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.highz.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.highz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.highz.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.highz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.in b/fpga/tests/tb_data/pcf7931_read_1MSA_data.in similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.in rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.in diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.low.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.low.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.low.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.low.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.lowz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.max.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.max.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.max.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.max.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.min.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.min.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.min.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.min.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.state.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.state.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.state.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.state.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.time b/fpga/tests/tb_data/pcf7931_read_1MSA_data.time similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.time rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.time diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold b/fpga/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold rename to fpga/tests/tb_data/pcf7931_read_1MSA_data.toggle.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.filtered.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.high.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.highz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.in b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.in similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.in rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.in diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.low.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.lowz.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.max.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.min.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.state.gold diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.time b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.time similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.time rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.time diff --git a/fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold b/fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold similarity index 100% rename from fpga-xc2s30/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold rename to fpga/tests/tb_data/pcf7931_write1byte_1MSA_data.toggle.gold diff --git a/fpga-xc2s30/tests/tb_lf_edge_detect.v b/fpga/tests/tb_lf_edge_detect.v similarity index 100% rename from fpga-xc2s30/tests/tb_lf_edge_detect.v rename to fpga/tests/tb_lf_edge_detect.v diff --git a/fpga-xc2s30/tests/tb_lp20khz_1MSa_iir_filter.v b/fpga/tests/tb_lp20khz_1MSa_iir_filter.v similarity index 100% rename from fpga-xc2s30/tests/tb_lp20khz_1MSa_iir_filter.v rename to fpga/tests/tb_lp20khz_1MSa_iir_filter.v diff --git a/fpga-xc2s30/tests/tb_min_max_tracker.v b/fpga/tests/tb_min_max_tracker.v similarity index 100% rename from fpga-xc2s30/tests/tb_min_max_tracker.v rename to fpga/tests/tb_min_max_tracker.v diff --git a/fpga-xc2s30/testbed_fpga.v b/fpga/tests/testbed_fpga.v similarity index 100% rename from fpga-xc2s30/testbed_fpga.v rename to fpga/tests/testbed_fpga.v diff --git a/fpga-xc2s30/testbed_hi_read_tx.v b/fpga/tests/testbed_hi_read_tx.v similarity index 100% rename from fpga-xc2s30/testbed_hi_read_tx.v rename to fpga/tests/testbed_hi_read_tx.v diff --git a/fpga-xc2s30/testbed_hi_simulate.v b/fpga/tests/testbed_hi_simulate.v similarity index 100% rename from fpga-xc2s30/testbed_hi_simulate.v rename to fpga/tests/testbed_hi_simulate.v diff --git a/fpga-xc2s30/testbed_lo_read.v b/fpga/tests/testbed_lo_read.v similarity index 100% rename from fpga-xc2s30/testbed_lo_read.v rename to fpga/tests/testbed_lo_read.v diff --git a/fpga-xc2s30/testbed_lo_simulate.v b/fpga/tests/testbed_lo_simulate.v similarity index 100% rename from fpga-xc2s30/testbed_lo_simulate.v rename to fpga/tests/testbed_lo_simulate.v diff --git a/fpga/xc2s30-5-vq100.ucf b/fpga/xc2s30-5-vq100.ucf new file mode 100644 index 000000000..e42ce0d88 --- /dev/null +++ b/fpga/xc2s30-5-vq100.ucf @@ -0,0 +1,45 @@ +# See the schematic for the pin assignment. + +NET "adc_d<0>" LOC = "P62" ; +NET "adc_d<1>" LOC = "P60" ; +NET "adc_d<2>" LOC = "P58" ; +NET "adc_d<3>" LOC = "P57" ; +NET "adc_d<4>" LOC = "P56" ; +NET "adc_d<5>" LOC = "P55" ; +NET "adc_d<6>" LOC = "P54" ; +NET "adc_d<7>" LOC = "P53" ; +#NET "cross_hi" LOC = "P88" ; +#NET "miso" LOC = "P40" ; +NET "adc_clk" LOC = "P46" ; +NET "adc_noe" LOC = "P47" ; +NET "ck_1356meg" LOC = "P91" ; +NET "ck_1356megb" LOC = "P93" ; +NET "cross_lo" LOC = "P87" ; +NET "dbg" LOC = "P22" ; +NET "mosi" LOC = "P43" ; +NET "ncs" LOC = "P44" ; +NET "pck0" LOC = "P36" ; +NET "pwr_hi" LOC = "P80" ; +NET "pwr_lo" LOC = "P81" ; +NET "pwr_oe1" LOC = "P82" ; +NET "pwr_oe2" LOC = "P83" ; +NET "pwr_oe3" LOC = "P84" ; +NET "pwr_oe4" LOC = "P86" ; +NET "spck" LOC = "P39" ; +NET "ssp_clk" LOC = "P71" ; +NET "ssp_din" LOC = "P32" ; +NET "ssp_dout" LOC = "P34" ; +NET "ssp_frame" LOC = "P31" ; + +# definition of Clock nets: +NET "ck_1356meg" TNM_NET = "clk_net_1356" ; +NET "ck_1356megb" TNM_NET = "clk_net_1356b"; +NET "pck0" TNM_NET = "clk_net_pck0" ; +NET "spck" TNM_NET = "clk_net_spck" ; + +# Timing specs of clock nets: +TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; +TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; +TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; +TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; + diff --git a/fpga/xc3s100e-4-vq100.ucf b/fpga/xc3s100e-4-vq100.ucf new file mode 100644 index 000000000..b259af2ed --- /dev/null +++ b/fpga/xc3s100e-4-vq100.ucf @@ -0,0 +1,48 @@ +# See the schematic for the pin assignment. + +NET "adc_d<0>" LOC = "P79" ; +NET "adc_d<1>" LOC = "P78" ; +NET "adc_d<2>" LOC = "P71" ; +NET "adc_d<3>" LOC = "P70" ; +NET "adc_d<4>" LOC = "P69" ; +NET "adc_d<5>" LOC = "P68" ; +NET "adc_d<6>" LOC = "P67" ; +NET "adc_d<7>" LOC = "P66" ; +#NET "cross_hi" LOC = "P88" ; +#NET "miso" LOC = "P40" ; +NET "adc_clk" LOC = "P65" ; +NET "adc_noe" LOC = "P62" ; +NET "ck_1356meg" LOC = "P88" ; +NET "ck_1356megb" LOC = "P89" ; +NET "cross_lo" LOC = "P90" ; +NET "dbg" LOC = "P22" ; +NET "mosi" LOC = "P43" ; +NET "ncs" LOC = "P40" ; +NET "pck0" LOC = "P36" ; +NET "pwr_hi" LOC = "P85" ; +NET "pwr_lo" LOC = "P83" ; +NET "pwr_oe1" LOC = "P84" ; +NET "pwr_oe2" LOC = "P91" ; +NET "pwr_oe3" LOC = "P92" ; +NET "pwr_oe4" LOC = "P86" ; +NET "spck" LOC = "P39" ; +NET "ssp_clk" LOC = "P33" ; +NET "ssp_din" LOC = "P32" ; +NET "ssp_dout" LOC = "P34" ; +NET "ssp_frame" LOC = "P27" ; +NET "FPGA_SWITCH" LOC = "P38" ; +NET "PWR_LO_EN" LOC = "P94" ; + +# definition of Clock nets: +NET "ck_1356meg" TNM_NET = "clk_net_1356" ; +NET "ck_1356megb" TNM_NET = "clk_net_1356b"; +NET "pck0" TNM_NET = "clk_net_pck0" ; +NET "spck" TNM_NET = "clk_net_spck" ; +NET "FPGA_SWITCH" CLOCK_DEDICATED_ROUTE = FALSE ; + +# Timing specs of clock nets: +TIMEGRP "clk_net_1356_all" = "clk_net_1356" "clk_net_1356b" ; +TIMESPEC "TS_1356MHz" = PERIOD "clk_net_1356_all" 74 ns HIGH 37 ns ; +TIMESPEC "TS_24MHz" = PERIOD "clk_net_pck0" 42 ns HIGH 21 ns ; +TIMESPEC "TS_4MHz" = PERIOD "clk_net_spck" 250 ns HIGH 125 ns ; + diff --git a/tools/fpga_compress/fpga_compress.c b/tools/fpga_compress/fpga_compress.c index 58b3a2162..0a66142ac 100644 --- a/tools/fpga_compress/fpga_compress.c +++ b/tools/fpga_compress/fpga_compress.c @@ -282,7 +282,8 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * /* Four byte length field */ for (int i = 0; i < 4; i++) { tmp = fgetc(infile); - if (tmp < 0) { + /* image length sanity check, should be under 300KB */ + if ( (tmp < 0) || (tmp > 300*1024) ) { break; } current_length += tmp << (24 - (i * 8)); @@ -292,7 +293,8 @@ static int bitparse_find_section(FILE *infile, char section_name, unsigned int * default: /* Fall through, two byte length field */ for (int i = 0; i < 2; i++) { tmp = fgetc(infile); - if (tmp < 0) { + /* if name, date or time fields are too long, we probably shouldn't parse them */ + if ( (tmp < 0) || (tmp > 64) ){ break; } current_length += tmp << (8 - (i * 8)); @@ -334,14 +336,16 @@ static int FpgaGatherVersion(FILE *infile, char *infile_name, char *dst, int len } } - if (!memcmp("fpga_lf", basename(infile_name), 7)) - strncat(dst, "LF", len - strlen(dst) - 1); - else if (!memcmp("fpga_hf_15", basename(infile_name), 10)) - strncat(dst, "HF 15", len - strlen(dst) - 1); - else if (!memcmp("fpga_hf.", basename(infile_name), 8)) - strncat(dst, "HF", len - strlen(dst) - 1); - else if (!memcmp("fpga_felica", basename(infile_name), 7)) - strncat(dst, "HF FeliCa", len - strlen(dst) - 1); + if (bitparse_find_section(infile, 'a', &fpga_info_len)) { + for (uint32_t i = 0; i < fpga_info_len; i++) { + char c = (char)fgetc(infile); + if (i < sizeof(tempstr)) { + tempstr[i] = c; + } + } + + strncat(dst, tempstr, len - strlen(dst) - 1); + } strncat(dst, " image ", len - strlen(dst) - 1); if (bitparse_find_section(infile, 'b', &fpga_info_len)) {