From 58918f81c19aa1f626b27af005bbffcf9c6dc182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sun, 7 Aug 2022 03:01:22 +0200 Subject: [PATCH] WIP: device synchronization --- Documentation/DeveloperInfo/FPGA_protocol.pdf | Bin 164479 -> 177006 bytes Documentation/DeveloperInfo/FPGA_protocol.tex | 44 +- FPGA/AMAttenuationCalculator.py | 45 ++ FPGA/Generator/ipcore_dir/AMMult.gise | 53 ++ FPGA/Generator/ipcore_dir/AMMult.vhd | 102 ++++ FPGA/Generator/ipcore_dir/DFT_CLK.gise | 31 + FPGA/Generator/ipcore_dir/DFT_CLK.ucf | 59 ++ FPGA/Generator/ipcore_dir/DFT_CLK.vhd | 169 ++++++ .../DFT_CLK/example_design/DFT_CLK_exdes.ucf | 60 ++ .../DFT_CLK/example_design/DFT_CLK_exdes.vhd | 192 ++++++ .../DFT_CLK/simulation/DFT_CLK_tb.vhd | 197 +++++++ .../DFT_CLK/simulation/timing/DFT_CLK_tb.vhd | 220 +++++++ FPGA/Generator/ipcore_dir/DSP48.gise | 32 + FPGA/Generator/ipcore_dir/DSP48.vhd | 139 +++++ FPGA/Generator/ipcore_dir/DSP_SLICE.gise | 32 + FPGA/Generator/ipcore_dir/DSP_SLICE.vhd | 139 +++++ .../ipcore_dir/ModulationMemory.gise | 53 ++ .../Generator/ipcore_dir/ModulationMemory.vhd | 149 +++++ FPGA/Generator/ipcore_dir/PLL.gise | 52 ++ FPGA/Generator/ipcore_dir/PLL.ucf | 59 ++ FPGA/Generator/ipcore_dir/PLL.vhd | 172 ++++++ .../PLL/example_design/PLL_exdes.ucf | 60 ++ .../PLL/example_design/PLL_exdes.vhd | 182 ++++++ .../ipcore_dir/PLL/simulation/PLL_tb.vhd | 197 +++++++ .../PLL/simulation/timing/PLL_tb.vhd | 220 +++++++ FPGA/Generator/ipcore_dir/SampleMemory.gise | 53 ++ FPGA/Generator/ipcore_dir/SampleMemory.vhd | 149 +++++ FPGA/Generator/ipcore_dir/SinCos.gise | 53 ++ FPGA/Generator/ipcore_dir/SinCos.vhd | 106 ++++ FPGA/Generator/ipcore_dir/SweepConfigMem.gise | 53 ++ FPGA/Generator/ipcore_dir/SweepConfigMem.vhd | 152 +++++ .../example_design/SweepConfigMem_exdes.ucf | 61 ++ .../example_design/SweepConfigMem_exdes.vhd | 182 ++++++ .../example_design/SweepConfigMem_prod.vhd | 277 +++++++++ .../simulation/SweepConfigMem_synth.vhd | 329 +++++++++++ .../simulation/SweepConfigMem_tb.vhd | 142 +++++ .../SweepConfigMem/simulation/addr_gen.vhd | 117 ++++ .../simulation/bmg_stim_gen.vhd | 436 ++++++++++++++ .../SweepConfigMem/simulation/bmg_tb_pkg.vhd | 200 +++++++ .../SweepConfigMem/simulation/checker.vhd | 161 +++++ .../SweepConfigMem/simulation/data_gen.vhd | 140 +++++ .../SweepConfigMem/simulation/random.vhd | 112 ++++ FPGA/Generator/ipcore_dir/VCO_Mem.gise | 53 ++ FPGA/Generator/ipcore_dir/VCO_Mem.vhd | 149 +++++ FPGA/Generator/ipcore_dir/result_bram.gise | 32 + FPGA/Generator/ipcore_dir/result_bram.vhd | 149 +++++ .../example_design/result_bram_exdes.ucf | 61 ++ .../example_design/result_bram_exdes.vhd | 179 ++++++ .../example_design/result_bram_prod.vhd | 275 +++++++++ .../result_bram/simulation/addr_gen.vhd | 117 ++++ .../result_bram/simulation/bmg_stim_gen.vhd | 434 ++++++++++++++ .../result_bram/simulation/bmg_tb_pkg.vhd | 200 +++++++ .../result_bram/simulation/checker.vhd | 161 +++++ .../result_bram/simulation/data_gen.vhd | 140 +++++ .../result_bram/simulation/random.vhd | 112 ++++ .../simulation/result_bram_synth.vhd | 322 ++++++++++ .../result_bram/simulation/result_bram_tb.vhd | 142 +++++ FPGA/Generator/ipcore_dir/wide_mult.gise | 53 ++ FPGA/Generator/ipcore_dir/wide_mult.vhd | 102 ++++ FPGA/VNA/SPIConfig.vhd | 4 +- FPGA/VNA/Sweep.vhd | 87 ++- FPGA/VNA/VNA.gise | 16 +- FPGA/VNA/top.bin | Bin 341712 -> 341712 bytes FPGA/VNA/top.ucf | 4 + FPGA/VNA/top.vhd | 16 +- .../PC_Application/Device/compounddevice.cpp | 10 + .../PC_Application/Device/compounddevice.h | 1 + Software/PC_Application/Device/device.cpp | 28 +- Software/PC_Application/Device/device.h | 5 + .../PC_Application/Device/virtualdevice.cpp | 549 +++++++++++++----- .../PC_Application/Device/virtualdevice.h | 34 +- Software/PC_Application/Generator/generator.h | 2 +- .../Generator/signalgenwidget.cpp | 20 +- .../Generator/signalgenwidget.ui | 29 + Software/PC_Application/appwindow.cpp | 4 +- Software/VNA_embedded/Application/App.cpp | 57 +- .../Communication/Communication.cpp | 10 +- .../Application/Communication/Communication.h | 1 + .../Application/Communication/Protocol.cpp | 2 + .../Application/Communication/Protocol.hpp | 2 + .../Application/Drivers/Si5351C.cpp | 1 - .../Application/SpectrumAnalyzer.cpp | 6 +- Software/VNA_embedded/Application/Trigger.cpp | 73 +++ Software/VNA_embedded/Application/Trigger.hpp | 25 + Software/VNA_embedded/Application/VNA.cpp | 157 ++--- Software/VNA_embedded/Inc/FreeRTOSConfig.h | 2 +- Software/VNA_embedded/Inc/main.h | 4 + Software/VNA_embedded/Src/app_freertos.c | 18 + Software/VNA_embedded/Src/main.c | 12 +- Software/VNA_embedded/VNA_embedded.ioc | 39 +- 90 files changed, 8970 insertions(+), 310 deletions(-) create mode 100644 FPGA/AMAttenuationCalculator.py create mode 100644 FPGA/Generator/ipcore_dir/AMMult.gise create mode 100644 FPGA/Generator/ipcore_dir/AMMult.vhd create mode 100644 FPGA/Generator/ipcore_dir/DFT_CLK.gise create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK.ucf create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK.vhd create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK/example_design/DFT_CLK_exdes.ucf create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK/example_design/DFT_CLK_exdes.vhd create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK/simulation/DFT_CLK_tb.vhd create mode 100755 FPGA/Generator/ipcore_dir/DFT_CLK/simulation/timing/DFT_CLK_tb.vhd create mode 100644 FPGA/Generator/ipcore_dir/DSP48.gise create mode 100644 FPGA/Generator/ipcore_dir/DSP48.vhd create mode 100644 FPGA/Generator/ipcore_dir/DSP_SLICE.gise create mode 100644 FPGA/Generator/ipcore_dir/DSP_SLICE.vhd create mode 100644 FPGA/Generator/ipcore_dir/ModulationMemory.gise create mode 100644 FPGA/Generator/ipcore_dir/ModulationMemory.vhd create mode 100644 FPGA/Generator/ipcore_dir/PLL.gise create mode 100755 FPGA/Generator/ipcore_dir/PLL.ucf create mode 100755 FPGA/Generator/ipcore_dir/PLL.vhd create mode 100755 FPGA/Generator/ipcore_dir/PLL/example_design/PLL_exdes.ucf create mode 100755 FPGA/Generator/ipcore_dir/PLL/example_design/PLL_exdes.vhd create mode 100755 FPGA/Generator/ipcore_dir/PLL/simulation/PLL_tb.vhd create mode 100755 FPGA/Generator/ipcore_dir/PLL/simulation/timing/PLL_tb.vhd create mode 100644 FPGA/Generator/ipcore_dir/SampleMemory.gise create mode 100644 FPGA/Generator/ipcore_dir/SampleMemory.vhd create mode 100644 FPGA/Generator/ipcore_dir/SinCos.gise create mode 100644 FPGA/Generator/ipcore_dir/SinCos.vhd create mode 100644 FPGA/Generator/ipcore_dir/SweepConfigMem.gise create mode 100644 FPGA/Generator/ipcore_dir/SweepConfigMem.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/example_design/SweepConfigMem_exdes.ucf create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/example_design/SweepConfigMem_exdes.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/example_design/SweepConfigMem_prod.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/SweepConfigMem_synth.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/SweepConfigMem_tb.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/addr_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/bmg_stim_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/bmg_tb_pkg.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/checker.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/data_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/SweepConfigMem/simulation/random.vhd create mode 100644 FPGA/Generator/ipcore_dir/VCO_Mem.gise create mode 100644 FPGA/Generator/ipcore_dir/VCO_Mem.vhd create mode 100644 FPGA/Generator/ipcore_dir/result_bram.gise create mode 100644 FPGA/Generator/ipcore_dir/result_bram.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/example_design/result_bram_exdes.ucf create mode 100755 FPGA/Generator/ipcore_dir/result_bram/example_design/result_bram_exdes.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/example_design/result_bram_prod.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/addr_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/bmg_stim_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/bmg_tb_pkg.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/checker.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/data_gen.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/random.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/result_bram_synth.vhd create mode 100755 FPGA/Generator/ipcore_dir/result_bram/simulation/result_bram_tb.vhd create mode 100644 FPGA/Generator/ipcore_dir/wide_mult.gise create mode 100644 FPGA/Generator/ipcore_dir/wide_mult.vhd create mode 100644 Software/VNA_embedded/Application/Trigger.cpp create mode 100644 Software/VNA_embedded/Application/Trigger.hpp diff --git a/Documentation/DeveloperInfo/FPGA_protocol.pdf b/Documentation/DeveloperInfo/FPGA_protocol.pdf index e95fab75b9cdea4dc6742f32ecf0377ac7a19c33..d2a9522ba9c28d6c768e8f1e708f890be2a5894a 100644 GIT binary patch delta 114948 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