From 34044f78fa3f1154df2c593ebd7ea6ea5f38de82 Mon Sep 17 00:00:00 2001 From: guocheng Date: Tue, 4 Nov 2025 21:14:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=AF=84=E5=AE=A1=E8=A6=81?= =?UTF-8?q?=E6=B1=82=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- acq_1_config.txt | 78 +- acq_2_config.txt | 148 ++-- acq_3_config.txt | 148 ++-- acq_4_config.txt | 148 ++-- acq_5_config.txt | 148 ++-- assets/readout_proc.png | Bin 27636 -> 37462 bytes exc_1_config.txt | 52 +- exc_2_config.txt | 56 +- pump_1_ana_cfg.txt | 18 +- pump_1_dig_cfg.txt | 48 +- pump_2_dig_cfg.txt | 22 +- 读出子系统历史无关配置集.md | 1428 ++++++++++++++++++++++++++++++++--- 13 files changed, 1765 insertions(+), 531 deletions(-) diff --git a/.gitignore b/.gitignore index 7effc6f..0616531 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -读出子系统历史无关配置集.pdf +读出子系统历史无关配置集.html diff --git a/acq_1_config.txt b/acq_1_config.txt index 3efb913..987d280 100644 --- a/acq_1_config.txt +++ b/acq_1_config.txt @@ -1,49 +1,53 @@ -00200000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00000018 +00200004 +00000003 -00300000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00001000 // codeword = 0x00001000 +00200000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00400044 // frame_header[63:32] -00200008 // frame_header[31: 0] -00000000 // spi_rd_en = 0 -00000010 // sample_depth = 16 clk +00300000 +00200004 +00001000 -00400050 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000040 // int_threshold = 64 +00400044 +00200008 +00000000 +00000010 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00400050 +00200004 +00000040 -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00800000 +00200004 +00000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900034 +00200004 +40000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00900044 +00200004 +00000000 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -00470013 // 128 samples, 8 clk +00A00000 +00200004 +00000008 + +00B00000 +00200100 +00470013 0076007B FEF60000 FB91FD65 diff --git a/acq_2_config.txt b/acq_2_config.txt index e57ead8..d5853b0 100644 --- a/acq_2_config.txt +++ b/acq_2_config.txt @@ -1,41 +1,45 @@ -00200000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00000018 +00200004 +00000003 -00300000 // frame_header[63:32] -00200004 // frame_header[31: 0] -000f2110 // codeword = 0x000f2110 +00200000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00400044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // spi_rd_en = 0, iq_scale = 0 +00300000 +00200004 +000f2110 -00400050 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // int_threshold = 8 +00400044 +00200004 +00000000 -00500004 // frame_header[63:32] -00000004 // frame_header[31: 0] -00000010 // qubit 0 group 0 para mtf_idx +00400050 +00200004 +00000008 -00500804 // frame_header[63:32] -00000004 // frame_header[31: 0] -00000010 // qubit 1 group 0 para mtf_idx +00500004 +00200004 +00000010 -00501004 // frame_header[63:32] -00000004 // frame_header[31: 0] -00000010 // qubit 2 group 0 para mtf_idx +00500804 +00200004 +00000010 -00501804 // frame_header[63:32] -00000004 // frame_header[31: 0] -00000010 // qubit 3 group 0 para mtf_idx +00501004 +00200004 +00000010 -00580000 // frame_header[63:32] -00000100 // frame_header[31: 0] -95D42465 // qubit 0 128 mtf_i samples +00501804 +00200004 +00000010 + +00580000 +00200100 +95D42465 32E39E81 155B7E6E A9838EC6 @@ -100,9 +104,9 @@ EB3A727C CC9182A4 6A7E601B -00584000 // frame_header[63:32] -00000100 // frame_header[31: 0] -4577794B // qubit 0 128 mtf_q samples +00584000 +00200100 +4577794B 8B84AEF8 7D570FC0 A3E93871 @@ -167,9 +171,9 @@ A28193CF 8CC21058 44F7AD84 -00588000 // frame_header[63:32] -00000100 // frame_header[31: 0] -8AC41862 // qubit 1 128 mtf_i samples +00588000 +00200100 +8AC41862 590CB986 CF24697E 00AF838F @@ -234,9 +238,9 @@ D09083AE 8B85B80A 7E631AC5 -0058C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -306F7C50 // qubit 1 128 mtf_q samples +0058C000 +00200100 +306F7C50 A68196DB 757946F3 819DE73B @@ -301,9 +305,9 @@ D09083AE CD23687E 01B0838F -00590000 // frame_header[63:32] -00000100 // frame_header[31: 0] -83B40C5E // qubit 2 128 mtf_i samples +00590000 +00200100 +83B40C5E 7435DA92 97E33D78 5703AD82 @@ -368,9 +372,9 @@ BF868CCE 83B2095C 7537DC94 -00594000 // frame_header[63:32] -00000100 // frame_header[31: 0] -19667E55 // qubit 2 128 mtf_q samples +00594000 +00200100 +19667E55 CE8C86BF 487B6F29 A4819FEF @@ -435,9 +439,9 @@ E33D7874 16647E57 D08D85BD -00598000 // frame_header[63:32] -00000100 // frame_header[31: 0] -81A60059 // qubit 3 128 mtf_i samples +00598000 +00200100 +81A60059 7E59FFA5 81A6005A 7E58FEA5 @@ -502,9 +506,9 @@ D08D85BD 82B51366 7D4AEB99 -0059C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -00597E59 // qubit 3 128 mtf_q samples +0059C000 +00200100 +00597E59 FFA581A6 005A7E59 FEA581A6 @@ -569,32 +573,32 @@ EC9982B5 14667D4A EB9982B5 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00800000 +00200004 +00000000 -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00900034 +00200004 +40000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900044 +00200004 +00000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00A00000 +00200004 +00000008 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -000E0005 // 128 samples, 8 clk +00B00000 +00200100 +000E0005 FFCC0004 FF3FFF74 006CFF85 diff --git a/acq_3_config.txt b/acq_3_config.txt index 47d7df3..4d87e7a 100644 --- a/acq_3_config.txt +++ b/acq_3_config.txt @@ -1,25 +1,29 @@ -00200000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00000018 +00200004 +00000003 -00300000 // frame_header[63:32] -00200004 // frame_header[31: 0] -000f4000 // codeword = 0x000f4000 +00200000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00400044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // spi_rd_en = 0, iq_scale = 0 +00300000 +00200004 +000f4000 -00400050 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000001 // int_threshold = 1 +00400044 +00200004 +00000000 -00500004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 0 group 0 para mtf_idx +00400050 +00200004 +00000001 + +00500004 +0020001C +00000010 80018001 00000000 00007FFF @@ -27,9 +31,9 @@ 7FFF8001 00000000 -00500804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 1 group 0 para mtf_idx +00500804 +0020001C +00000010 80018001 00000000 00007FFF @@ -37,9 +41,9 @@ 7FFF8001 00000000 -00501004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 2 group 0 para mtf_idx +00501004 +0020001C +00000010 80018001 00000000 00007FFF @@ -47,9 +51,9 @@ 7FFF8001 00000000 -00501804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 3 group 0 para mtf_idx +00501804 +0020001C +00000010 80018001 00000000 00007FFF @@ -57,9 +61,9 @@ 7FFF8001 00000000 -00580000 // frame_header[63:32] -00000100 // frame_header[31: 0] -95D42465 // qubit 0 128 mtf_i samples +00580000 +00200100 +95D42465 32E39E81 155B7E6E A9838EC6 @@ -124,9 +128,9 @@ EB3A727C CC9182A4 6A7E601B -00584000 // frame_header[63:32] -00000100 // frame_header[31: 0] -4577794B // qubit 0 128 mtf_q samples +00584000 +00200100 +4577794B 8B84AEF8 7D570FC0 A3E93871 @@ -191,9 +195,9 @@ A28193CF 8CC21058 44F7AD84 -00588000 // frame_header[63:32] -00000100 // frame_header[31: 0] -8AC41862 // qubit 1 128 mtf_i samples +00588000 +00200100 +8AC41862 590CB986 CF24697E 00AF838F @@ -258,9 +262,9 @@ D09083AE 8B85B80A 7E631AC5 -0058C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -306F7C50 // qubit 1 128 mtf_q samples +0058C000 +00200100 +306F7C50 A68196DB 757946F3 819DE73B @@ -325,9 +329,9 @@ D09083AE CD23687E 01B0838F -00590000 // frame_header[63:32] -00000100 // frame_header[31: 0] -83B40C5E // qubit 2 128 mtf_i samples +00590000 +00200100 +83B40C5E 7435DA92 97E33D78 5703AD82 @@ -392,9 +396,9 @@ BF868CCE 83B2095C 7537DC94 -00594000 // frame_header[63:32] -00000100 // frame_header[31: 0] -19667E55 // qubit 2 128 mtf_q samples +00594000 +00200100 +19667E55 CE8C86BF 487B6F29 A4819FEF @@ -459,9 +463,9 @@ E33D7874 16647E57 D08D85BD -00598000 // frame_header[63:32] -00000100 // frame_header[31: 0] -81A60059 // qubit 3 128 mtf_i samples +00598000 +00200100 +81A60059 7E59FFA5 81A6005A 7E58FEA5 @@ -526,9 +530,9 @@ D08D85BD 82B51366 7D4AEB99 -0059C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -00597E59 // qubit 3 128 mtf_q samples +0059C000 +00200100 +00597E59 FFA581A6 005A7E59 FEA581A6 @@ -593,32 +597,32 @@ EC9982B5 14667D4A EB9982B5 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00800000 +00200004 +00000000 -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00900034 +00200004 +40000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900044 +00200004 +00000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00A00000 +00200004 +00000008 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -000E0005 // 128 samples, 8 clk +00B00000 +00200100 +000E0005 FFCC0004 FF3FFF74 006CFF85 diff --git a/acq_4_config.txt b/acq_4_config.txt index 9ec77ae..e8ea06a 100644 --- a/acq_4_config.txt +++ b/acq_4_config.txt @@ -1,25 +1,29 @@ -00200000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00000018 +00200004 +00000003 -00300000 // frame_header[63:32] -00200004 // frame_header[31: 0] -000f8220 // codeword = 000f8220 +00200000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00400044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // spi_rd_en = 0, iq_scale = 0 +00300000 +00200004 +000f8220 -00400050 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000010 // int_threshold = 1 +00400044 +00200004 +00000000 -00500004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 0 group 0 para mtf_idx +00400050 +00200004 +00000010 + +00500004 +0020001C +00000010 80018001 00000000 00007FFF @@ -27,9 +31,9 @@ 7FFF8001 00000000 -00500804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 1 group 0 para mtf_idx +00500804 +0020001C +00000010 80018001 00000000 00007FFF @@ -37,9 +41,9 @@ 7FFF8001 00000000 -00501004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 2 group 0 para mtf_idx +00501004 +0020001C +00000010 80018001 00000000 00007FFF @@ -47,9 +51,9 @@ 7FFF8001 00000000 -00501804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 3 group 0 para mtf_idx +00501804 +0020001C +00000010 80018001 00000000 00007FFF @@ -57,9 +61,9 @@ 7FFF8001 00000000 -00580000 // frame_header[63:32] -00000100 // frame_header[31: 0] -95D42465 // qubit 0 128 mtf_i samples +00580000 +00200100 +95D42465 32E39E81 155B7E6E A9838EC6 @@ -124,9 +128,9 @@ EB3A727C CC9182A4 6A7E601B -00584000 // frame_header[63:32] -00000100 // frame_header[31: 0] -4577794B // qubit 0 128 mtf_q samples +00584000 +00200100 +4577794B 8B84AEF8 7D570FC0 A3E93871 @@ -191,9 +195,9 @@ A28193CF 8CC21058 44F7AD84 -00588000 // frame_header[63:32] -00000100 // frame_header[31: 0] -8AC41862 // qubit 1 128 mtf_i samples +00588000 +00200100 +8AC41862 590CB986 CF24697E 00AF838F @@ -258,9 +262,9 @@ D09083AE 8B85B80A 7E631AC5 -0058C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -306F7C50 // qubit 1 128 mtf_q samples +0058C000 +00200100 +306F7C50 A68196DB 757946F3 819DE73B @@ -325,9 +329,9 @@ D09083AE CD23687E 01B0838F -00590000 // frame_header[63:32] -00000100 // frame_header[31: 0] -83B40C5E // qubit 2 128 mtf_i samples +00590000 +00200100 +83B40C5E 7435DA92 97E33D78 5703AD82 @@ -392,9 +396,9 @@ BF868CCE 83B2095C 7537DC94 -00594000 // frame_header[63:32] -00000100 // frame_header[31: 0] -19667E55 // qubit 2 128 mtf_q samples +00594000 +00200100 +19667E55 CE8C86BF 487B6F29 A4819FEF @@ -459,9 +463,9 @@ E33D7874 16647E57 D08D85BD -00598000 // frame_header[63:32] -00000100 // frame_header[31: 0] -81A60059 // qubit 3 128 mtf_i samples +00598000 +00200100 +81A60059 7E59FFA5 81A6005A 7E58FEA5 @@ -526,9 +530,9 @@ D08D85BD 82B51366 7D4AEB99 -0059C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -00597E59 // qubit 3 128 mtf_q samples +0059C000 +00200100 +00597E59 FFA581A6 005A7E59 FEA581A6 @@ -593,32 +597,32 @@ EC9982B5 14667D4A EB9982B5 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00800000 +00200004 +00000000 -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00900034 +00200004 +40000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900044 +00200004 +00000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00A00000 +00200004 +00000008 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -000E0005 // 128 samples, 8 clk +00B00000 +00200100 +000E0005 FFCC0004 FF3FFF74 006CFF85 diff --git a/acq_5_config.txt b/acq_5_config.txt index e4ce184..037d993 100644 --- a/acq_5_config.txt +++ b/acq_5_config.txt @@ -1,25 +1,29 @@ -00200000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00000018 +00200004 +00000003 -00300000 // frame_header[63:32] -00200004 // frame_header[31: 0] -000f82e0 // codeword = 000f82e0 +00200000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00400044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // spi_rd_en = 0, iq_scale = 0 +00300000 +00200004 +000f82e0 -00400050 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000010 // int_threshold = 1 +00400044 +00200004 +00000000 -00500004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 0 group 0 para mtf_idx +00400050 +00200004 +00000010 + +00500004 +0020001C +00000010 80018001 00000000 00007FFF @@ -27,9 +31,9 @@ 7FFF8001 00000000 -00500804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 1 group 0 para mtf_idx +00500804 +0020001C +00000010 80018001 00000000 00007FFF @@ -37,9 +41,9 @@ 7FFF8001 00000000 -00501004 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 2 group 0 para mtf_idx +00501004 +0020001C +00000010 80018001 00000000 00007FFF @@ -47,9 +51,9 @@ 7FFF8001 00000000 -00501804 // frame_header[63:32] -0000001C // frame_header[31: 0] -00000010 // qubit 3 group 0 para mtf_idx +00501804 +0020001C +00000010 80018001 00000000 00007FFF @@ -57,9 +61,9 @@ 7FFF8001 00000000 -00580000 // frame_header[63:32] -00000100 // frame_header[31: 0] -95D42465 // qubit 0 128 mtf_i samples +00580000 +00200100 +95D42465 32E39E81 155B7E6E A9838EC6 @@ -124,9 +128,9 @@ EB3A727C CC9182A4 6A7E601B -00584000 // frame_header[63:32] -00000100 // frame_header[31: 0] -4577794B // qubit 0 128 mtf_q samples +00584000 +00200100 +4577794B 8B84AEF8 7D570FC0 A3E93871 @@ -191,9 +195,9 @@ A28193CF 8CC21058 44F7AD84 -00588000 // frame_header[63:32] -00000100 // frame_header[31: 0] -8AC41862 // qubit 1 128 mtf_i samples +00588000 +00200100 +8AC41862 590CB986 CF24697E 00AF838F @@ -258,9 +262,9 @@ D09083AE 8B85B80A 7E631AC5 -0058C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -306F7C50 // qubit 1 128 mtf_q samples +0058C000 +00200100 +306F7C50 A68196DB 757946F3 819DE73B @@ -325,9 +329,9 @@ D09083AE CD23687E 01B0838F -00590000 // frame_header[63:32] -00000100 // frame_header[31: 0] -83B40C5E // qubit 2 128 mtf_i samples +00590000 +00200100 +83B40C5E 7435DA92 97E33D78 5703AD82 @@ -392,9 +396,9 @@ BF868CCE 83B2095C 7537DC94 -00594000 // frame_header[63:32] -00000100 // frame_header[31: 0] -19667E55 // qubit 2 128 mtf_q samples +00594000 +00200100 +19667E55 CE8C86BF 487B6F29 A4819FEF @@ -459,9 +463,9 @@ E33D7874 16647E57 D08D85BD -00598000 // frame_header[63:32] -00000100 // frame_header[31: 0] -81A60059 // qubit 3 128 mtf_i samples +00598000 +00200100 +81A60059 7E59FFA5 81A6005A 7E58FEA5 @@ -526,9 +530,9 @@ D08D85BD 82B51366 7D4AEB99 -0059C000 // frame_header[63:32] -00000100 // frame_header[31: 0] -00597E59 // qubit 3 128 mtf_q samples +0059C000 +00200100 +00597E59 FFA581A6 005A7E59 FEA581A6 @@ -593,32 +597,32 @@ EC9982B5 14667D4A EB9982B5 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00800000 +00200004 +00000000 -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00900034 +00200004 +40000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900044 +00200004 +00000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00A00000 +00200004 +00000008 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -000E0005 // 128 samples, 8 clk +00B00000 +00200100 +000E0005 FFCC0004 FF3FFF74 006CFF85 diff --git a/assets/readout_proc.png b/assets/readout_proc.png index 3e5e69e03b44c5f63f72e74b3d17bda72dcb915e..8eb86213d21e8987493f1cc95d05b73f8a0487c9 100644 GIT binary patch literal 37462 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 literal 27636 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 W_v*YC diff --git a/exc_1_config.txt b/exc_1_config.txt index 2b4441f..c978750 100644 --- a/exc_1_config.txt +++ b/exc_1_config.txt @@ -1,33 +1,37 @@ -00200000 // frame_header[63:32] -00200004 // frame_header[31: 0] -0000002B // daq mcu exit +00000018 +00200004 +00000003 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00200000 +00200004 +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00900034 // frame_header[63:32] -00200004 // frame_header[31: 0] -40000000 // amplitud = 0x4000 +00800000 +00200004 +00000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +00900034 +00200004 +40000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00900044 +00200004 +00000000 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -00470013 // 128 samples, 8 clk +00A00000 +00200004 +00000008 + +00B00000 +00200100 +00470013 0076007B FEF60000 FB91FD65 diff --git a/exc_2_config.txt b/exc_2_config.txt index 7e10960..c95e7a1 100644 --- a/exc_2_config.txt +++ b/exc_2_config.txt @@ -1,35 +1,39 @@ -00200000 // frame_header[63:32] -00200004 // frame_header[31: 0] -0000002B // daq mcu exit +00000018 +00200004 +00000003 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00200000 +00200004 +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000000 // codeword = 0 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00900034 // frame_header[63:32] -0020000C // frame_header[31: 0] -40000000 // amplitud = 0x4000 -F0000000 // frequency = -250MHz -00000000 // phase = 0 +00800000 +00200004 +00000000 -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000001 // INTP_SEL=0, MIX_MODE=0, AWG_MODE = 1 +00900034 +0020000C +40000000 +F0000000 +00000000 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00900044 +00200004 +00000001 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -004C000F // 128 samples, 8 clk +00A00000 +00200004 +00000008 + +00B00000 +00200100 +004C000F 00D800A6 FF6E0085 FB8AFD9F diff --git a/pump_1_ana_cfg.txt b/pump_1_ana_cfg.txt index 985060e..d8f4018 100644 --- a/pump_1_ana_cfg.txt +++ b/pump_1_ana_cfg.txt @@ -1,11 +1,11 @@ -00200000 // frame_header[63:32] -00280004 // frame_header[31: 0] -006ACFC0 // pump frequency = 7GHz +00200000 +00280004 +006ACFC0 -00300000 // frame_header[63:32] -00280004 // frame_header[31: 0] -FFFFFF38 // pump power = 15 dbm +00300000 +00280004 +FFFFFF38 -00400000 // frame_header[63:32] -00280004 // frame_header[31: 0] -00000011 // pump output enable \ No newline at end of file +00400000 +00280004 +00000011 \ No newline at end of file diff --git a/pump_1_dig_cfg.txt b/pump_1_dig_cfg.txt index 3b995a9..6d2ce37 100644 --- a/pump_1_dig_cfg.txt +++ b/pump_1_dig_cfg.txt @@ -1,30 +1,34 @@ -00200000 // frame_header[63:32] -00200004 // frame_header[31: 0] -0000002B // daq mcu exit +00000018 +00200004 +00000003 -00700000 // frame_header[63:32] -00200010 // frame_header[31: 0] -001007B7 // lui x15, 0x100 -0007A083 // lw x1, 0x00(x15) -0000A00B // send x0,x1,0 -0000002B // exit x0,x0,0 +00200000 +00200004 +0000002B -00800000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000100 // codeword = 00000100 +00700000 +00200010 +001007B7 +0007A083 +0000A00B +0000002B -00900044 // frame_header[63:32] -00200008 // frame_header[31: 0] -00000000 // PUMP_INV=0 -00010010 // delay = 1, width = 16 +00800000 +00200004 +00000100 -00A00000 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000008 // addr = 0, len = 8 clk +00900044 +00200008 +00000000 +00010010 -00B00000 // frame_header[63:32] -00200100 // frame_header[31: 0] -00470013 // 128 samples, 8 clk +00A00000 +00200004 +00000008 + +00B00000 +00200100 +00470013 0076007B FEF60000 FB91FD65 diff --git a/pump_2_dig_cfg.txt b/pump_2_dig_cfg.txt index 91c9ea8..ef1e7d1 100644 --- a/pump_2_dig_cfg.txt +++ b/pump_2_dig_cfg.txt @@ -1,11 +1,15 @@ -00200000 // frame_header[63:32] -00200004 // frame_header[31: 0] -0000002B // exit daq +00000018 +00200004 +00000003 -00700000 // frame_header[63:32] -00200004 // frame_header[31: 0] -0000002B //exit awg +00200000 +00200004 +0000002B -00900044 // frame_header[63:32] -00200004 // frame_header[31: 0] -00000010 // PUMP_INV = 1 \ No newline at end of file +00700000 +00200004 +0000002B + +00900044 +00200004 +00000010 \ No newline at end of file diff --git a/读出子系统历史无关配置集.md b/读出子系统历史无关配置集.md index a5e2125..ff98e7e 100644 --- a/读出子系统历史无关配置集.md +++ b/读出子系统历史无关配置集.md @@ -1,17 +1,31 @@ -[toc] -# 修订记录 +--- +export_on_save: + html: true + +html: + toc: true + embed_local_images: true + embed_svg: true + +title: 读出子系统历史无关功能配置项 +author: 郭成 +date: +--- + +# 1. 修订记录 |版本|修订日期|修订原因|修订内容|修订人| |:-|:-|:-|:-|:-| |v0.1|2025/10/27|统一格式|初始版本|郭成| +|v0.2|2025/10/31|评审意见|内容补充|郭成| -# 读出系统历史无关的功能配置项 -## 前言 +# 2. 读出系统历史无关的功能配置项 +## 2.1. 前言 本文以常用的超导量子比特读出操作为例, 将读出操作可能涉及到的相关功能拆解成最小功能项, 并给出对每个功能项的历史无关配置集。 -超导量子比特读出操作涉及到EXT、ACQ和Pump三类通道, -本文将基于**ez-Q 2.5 FPGA平台读出子系统**的的通道为控制对象进行功能分解。 +超导量子比特读出操作涉及到EXCT、ACQ和Pump三类通道, +本文将基于**ez-Q 2.5 FPGA平台读出子系统**的的通道为控制对象进行功能分解, 读出子系统的工作流程如下图所示: ![readout_proc](assets/readout_proc.png) @@ -19,33 +33,34 @@ 本文所指的`历史无关配置`限定为上图中历史无关实验中的**实验配置**项, 而与对读出系统的初始化(例如寄存器复位、ADC、DAC、PLL等自动校准)、 外部参数的校准(例如通信链路校准、系统间同步、回环延时补偿)等操作不在本文讨论范围。 -## 目的与范围 +若历史无关实验未得到预期结果, +需要排查历史无关实验依赖的**运维状态**以修复故障。 + +## 2.2. 目的与范围 本文档的目的是介绍读出芯片激励产生和采集处理相关控制, 用户可依据本文档用例在任意实验状态下完成对应实验, 本文档作为开放文档供大家阅读。 -## 阅读对象 +## 2.3. 阅读对象 本文档的预期读者是所有使用本芯片的用户以及对该芯片工作原理感兴趣的读者。 -## 文档概述 +## 2.4. 文档概述 本文档首先介绍了测控系统总体的编程对象和规范, 针对读出相关的三种类型通道的编程进行了详细介绍。 -读出三类通道中,EXC和ACQ通道控制较为复杂,其包含MCU编程控制。 -针对这两个通道,本文详细介绍了MCU码字定义、 -寄存器控制和相关存储区配置。 -## 引用文档 +## 2.5. 引用文档 |文档编号|标题|版本| |:-|:-|:-| -|TODO|读出子系统编程控制模型|V1.0| +|TODO|读出子系统编程控制模型.md|V1.0| +|ez-Q 2.5-SDD-06|ez-Q 2.5 测控系统内部通信协议.docx|-| -## 术语定义 +## 2.6. 术语定义 |名字|全称|解释| |:-|:-|:-| -|EXC|Excitation|读出激励生成发送通道| +|EXCT|Excitation|读出激励生成发送通道| |ACQ|Acquisition|读出回波采集处理通道| -# 激励通道(EXC) +# 3. 激励通道(EXCT) 读出激励通道用于为量子比特读出产生激励信号, 对激励通道的输出控制包括模拟控制和数字控制两个部分。 @@ -67,7 +82,7 @@ MCU也可以通过修改寄存器来实时控制波形输出行为。 本文暂未涉及到需要实时修改控制寄存器的用例, 默认都是通过上位机直接配置输出控制寄存器。 -## EXC.1 直接波形输出功能 +## 3.1. EXCT.1 直接波形输出 直接波形输出功能将用户配置以采样点配置的波形数据直接发到DAC, 数字信号经过DAC转换成模拟基带信号, 接着基带信号再经过模拟变频电路变频后得到读出激励信号。 @@ -81,8 +96,8 @@ MCU也可以通过修改寄存器来实时控制波形输出行为。 |波形仓库|存储映射表对应的波形| |控制寄存器|控制波形的输出模式| -### 编程规范 -用户通过编程MCU来生成码字指令,编程需要满足以下规范: +### 3.1.1. 编程约束 +用户通过编程MCU来生成码字指令,编程需要满足以下约束: |说明项|说明内容| |:-:|:-| |1|MCU数据根据需要配置,若存在访存指令则需配置,否则可不配置| @@ -99,7 +114,7 @@ send x0, x0, 0 exit x0, x0, 0 ``` -### 码字约束 +### 3.1.2. 码字约束 对直接波形输出功能有影响的码字如下表所示: |配置项|值|说明| @@ -110,12 +125,12 @@ exit x0, x0, 0 例如码字`0x00000000`可以触发输出形索引ID为`0`对应的波形。 -### 控制寄存器配置 +### 3.1.3. 控制寄存器配置 对直接波形输出功能有影响的寄存器如下表所示: |配置项|值|说明| |:-:|:-:|:-| -|ACW|0x4000|设置归一化幅度为1| +|AMPLITUDE|0x4000|设置归一化幅度为1| |AMP_SEL|0|使用AWG内部调幅值| |INTP_SEL|0|使用邻近插值滤波器| |MIX_MODE|0|NRZ输出模式| @@ -124,7 +139,7 @@ exit x0, x0, 0 例如设置`amplitude`寄存器高16位为16‘h4000,`function`寄存器为32’h00000000, 表示采用NRZ模式直接将存储在波形仓库中的采样点输出。 -### 波形映射表 + 波形仓库 +### 3.1.4. 波形映射表 + 波形仓库 编程过程中发射的波形ID必须要有对应的映射表进行转换, 而编程的映射表必须要有对应的波形采样点进行匹配。 映射表的一个配置项用32比特表示,高16比特对应地址,低16比特对应长度, @@ -146,20 +161,156 @@ S3057...S3072 此时波形仓库中的数据应该如上所示,总共存储了192个时钟周期,FPGA的主频为250 MHz,DAC的更新率为4Gsps,192个时钟周期对应3072个采样点数据,其中`S1-2048`采样点对应`ID==0`时输出,`S2049-S3072`采样点对应`ID==1`时输出. -### 配置示例 +### 3.1.5. 配置示例 -以下是直接输出一个高斯包络波形的配置示例, +以下是直接输出一个高斯包络波形的配置示例。 +完整配置示例可参考[exc_1_config.txt](./exc_1_config.txt)。 由于激励和采集在一个芯片上,并被同步信号触发, -为了避免仿采集通道使用未定义数据, -本例为采集通道MCU配置了一条退出指令。 +本例为ACQ通道MCU配置了一条退出指令以避免仿采集通道使用未定义数据。 -@import "exc_1_config.txt" +* **配置项:** 系统配置 +* **描述:** 对daq(ACQ)与awg(EXCT-Pump)进行软复位 +* **Transaction:** 向0x00000018地址写入4 Byte数据 +```{.line-numbers} +00000018 // address = 0x00000018 +00200004 // slot=4, length = 4 Byte +00000003 // {daq_rst, awg_rst} +``` + +* **配置项:** ACQ MCU指令配置 +* **描述:** 向ACQ通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00200000地址写入4 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00200004 // slot=4, length = 4 Byte +0000002B // exit x0,x0,0 +``` + +* **配置项:** EXCT-Pump MCU指令配置 +* **描述:** 向EXCT-Pump通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00700000地址写入16 Byte数据 +```{.line-numbers} +00700000 // address = 0x00700000 +00200010 // slot=4, length = 16 Byte +001007B7 // lui x15, 0x100 +0007A083 // lw x1, 0x00(x15) +0000A00B // send x0,x1,0 +0000002B // exit x0,x0,0 +``` + +* **配置项:** EXCT-Pump MCU数据配置 +* **描述:** 向EXCT-Pump通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00800000地址写入4 Byte数据 +```{.line-numbers} +00800000 // address = 0x00800000 +00200004 // slot=4, length = 4 Byte +00000000 // codeword = 0 +``` + +* **配置项:** 通道控制寄存器配置 +* **描述:** 配置波形调制幅度 +* **Transaction:** 向0x00900034地址写入4 Byte数据 +```{.line-numbers} +00900034 // address = 0x00900034 +00200004 // slot=4, length = 4 Byte +40000000 // amplitud = 0x4000, 归一化值为1 +``` + +* **配置项:** 通道控制寄存器配置 +* **描述:** 配置波形输出模式 +* **Transaction:** 向0x00900034地址写入4 Byte数据 +```{.line-numbers} +00900044 // address = 0x00900044 +00200004 // slot=4, length = 4 Byte +00000000 // AMP_SEL=0, INTP_SEL=0, MIX_MODE=0, AWG_MODE = 0 +``` + +* **配置项:** 波形查找表配置 +* **描述:** 向EXCT通道波形查找表写入查找表数据 +* **Transaction:** 向0x00A00000地址写入4 Byte数据 +```{.line-numbers} +00A00000 // address = 0x00A00000 +00200004 // slot=4, length = 4 Byte +00000008 // addr = 0, len = 8 clk +``` + +* **配置项:** 波形仓库配置 +* **描述:** 向EXCT通道波形仓库写入采样点数据 +* **Transaction:** 向0x00B00000地址写入256 Byte数据 +```{.line-numbers} +00B00000 // address = 0x00B00000 +00200100 // slot=4, length = 256 Byte +00470013 // 128 samples, 8 clk +0076007B +FEF60000 +FB91FD65 +F91FF9F2 +FBEFF9A8 +057AFFFF +11100B8C +154E14B6 +0ABA1208 +F33B0000 +DBFFE673 +D698D622 +EC8ADE31 +15D0FFFF +3A682A80 +40294256 +1CF0334C +E0BD0000 +AF14C422 +A9D6A58B +DA3EBC1E +27B1FFFF +642A4B0A +681C6E9C +2C945112 +D226FFFF +8EBDAA40 +8CAF8439 +CF9AA71B +30CDFFFF +763C5A63 +76187FFA +30A05A2C +CFE4FFFF +8DA5A7BD +8FF68568 +D2C2AB48 +2BE0FFFF +66304FAE +620B6C6B +26BD4958 +DB43FFFF +AC6DBE0D +B1C8A869 +E1E4C63C +1BC3FFFF +3D49311B +37873F38 +14A1284D +EDB4FFFF +D952E04F +DE9ED908 +F444E869 +09C2FFFF +1323104E +0F171278 +04BF0A1E +FC91FFFF +FA68FABC +FC98FB33 +FF46FE14 +0042FFFF +00110036 +``` 仿真结果如下图所示: ![sim_exc_1](assets/sim_exc_1.png) -## EXC.2 调制波形输出功能 +## 3.2. EXCT.2 调制波形输出 调制波形输出功能将用户配置以采样点经过调制处理后发到DAC, 数字信号经过DAC转换成模拟基带信号, 接着基带信号再经过模拟变频电路变频后得到读出激励信号。 @@ -173,7 +324,7 @@ S3057...S3072 |波形仓库|存储映射表对应的波形| |控制寄存器|控制波形的输出模式,驱动模式,调幅| -### 编程规范 +### 3.2.1. 编程约束 |说明项|说明内容| |:-:|:-| |1|MCU数据根据需要配置,若存在访存指令则需配置,否则可不配置| @@ -190,7 +341,7 @@ send x0, x0, 0x400 exit x0, x0, 0 ``` -### 码字约束 +### 3.2.2. 码字约束 对波形调制输出功能有影响的码字如下表所示: |配置项|值|说明| @@ -202,7 +353,7 @@ exit x0, x0, 0 例如码字`0x00000400`可以触发输出形索引ID为`0`对应的波形,使能NCO相位清零。 -### 控制寄存器配置 +### 3.2.3. 控制寄存器配置 |配置项|值|说明| |:-:|:-:|:-| |ACW|acw|设置输出波形的调幅值,amp = acw/2^14| @@ -220,7 +371,7 @@ Function寄存器为32’h00000001, 采用NRZ模式将存储在波形仓库中的采样点输出, 经过希尔伯特变换后然后再与频率为250 MHz相位为0的NCO载波调制后输出。 -### 波形映射表 + 波形仓库 +### 3.2.4. 波形映射表 + 波形仓库 编程过程中发射的波形ID必须要有对应的映射表进行转换, 而编程的映射表必须要有对应的波形进行匹配。 映射表的一个配置项用32比特表示,高16比特对应地址, @@ -249,14 +400,153 @@ FPGA的主频为250 MHz,DAC的更新率为4Gsps, 因此采样点的频率需要处于240~1760 MHz, 否则波形会发生显著的畸变。 -### 配置示例 +### 3.2.5. 配置示例 以下是直接输出一个312.5 MHz波形调制上一个-250 MHz频率的配置示例, +完整配置示例可参考[exc_2_config.txt](./exc_2_config.txt)。 由于激励和采集在一个芯片上,并被同步信号触发, 为了避免仿采集通道使用未定义数据, 本例为采集通道MCU配置了一条退出指令。 -@import "exc_2_config.txt" +* **配置项:** 系统配置 +* **描述:** 对daq(ACQ)与awg(EXCT-Pump)进行软复位 +* **Transaction:** 向0x00000018地址写入4 Byte数据 +```{.line-numbers} +00000018 // address = 0x00000018 +00200004 // slot=4, length = 4 Byte +00000003 // {daq_rst, awg_rst} +``` + +* **配置项:** ACQ MCU指令配置 +* **描述:** 向ACQ通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00200000地址写入4 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00200004 // slot=4, length = 4 Byte +0000002B // exit x0,x0,0 +``` + +* **配置项:** EXCT-Pump MCU指令配置 +* **描述:** 向EXCT-Pump通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00700000地址写入16 Byte数据 +```{.line-numbers} +00700000 // address = 0x00700000 +00200010 // slot=4, length = 16 Byte +001007B7 // lui x15, 0x100 +0007A083 // lw x1, 0x00(x15) +0000A00B // send x0,x1,0 +0000002B // exit x0,x0,0 +``` + +* **配置项:** EXCT-Pump MCU数据配置 +* **描述:** 向EXCT-Pump控通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00800000地址写入4 Byte数据 +```{.line-numbers} +00800000 // address = 0x00800000 +00200004 // slot=4, length = 4 Byte +00000000 // codeword = 0 +``` + +* **配置项:** 通道控制寄存器配置 +* **描述:** 配置波形调制幅度 +* **Transaction:** 向0x00900034地址写入12 Byte数据 +```{.line-numbers} +00900034 // address = 0x00900034 +0020000C // slot=4, length = 12 Byte +40000000 // amplitud = 0x4000, 归一化值为1 +F0000000 // frequency = -250 MHz @4 Gsps +00000000 // phase = 0 +``` + +* **配置项:** 通道控制寄存器配置 +* **描述:** 配置波形输出模式 +* **Transaction:** 向0x00900044地址写入4 Byte数据 +```{.line-numbers} +00900044 // address = 0x00900044 +00200004 // slot=4, length = 4 Byte +00000001 // AMP_SEL=0, INTP_SEL=0, MIX_MODE=0, AWG_MODE = 1 +``` + +* **配置项:** 波形查找表配置 +* **描述:** 向EXCT通道波形查找表写入查找表数据 +* **Transaction:** 向0x00A00000地址写入4 Byte数据 +```{.line-numbers} +00A00000 // address = 0x00A00000 +00200004 // slot=4, length = 4 Byte +00000008 // addr = 0, len = 8 clk +``` + +* **配置项:** 波形仓库配置 +* **描述:** 向EXCT通道波形仓库写入采样点数据 +* **Transaction:** 向0x00B00000地址写入256 Byte数据 +```{.line-numbers} +00B00000 // address = 0x00B00000 +00200100 // slot=4, length = 256 Byte +004C000F // 128 samples, 8 clk +00D800A6 +FF6E0085 +FB8AFD9F +F9DEF9FC +0025FBE2 +0C020600 +10F61046 +042E0CEA +EBE6F841 +DF60E28A +F197E464 +196A04AF +32D62A79 +1F002F2F +E6FE050E +BBB4CC23 +CB47BAE1 +110DEA37 +5161369E +4CCF59E2 +FE9F2C10 +A8F5CF08 +9C6C9641 +EB8FBB08 +538422CF +752A7198 +2D535CA7 +B936F225 +818C9050 +BAA490C8 +329FF53F +7DB4640D +58967980 +E5C12304 +8CFFAF7A +9C1F862E +01A6C901 +60353858 +65967049 +133F439A +B76CE081 +A21EA133 +DE8EB8BD +300309CD +4EAA4892 +27744230 +E5C205D7 +C4E4CE93 +DA6AC9B1 +09FBF1EB +26E61CE9 +1DC126B9 +FF920F4F +EA99F270 +ECF9E905 +FD09F47B +08E40458 +08C50A35 +023C05AF +FDE9FF76 +FE1CFD96 +FFA1FEF0 +0007FFF9 +``` 仿真结果如下图所示,输出频率为 312.5MHz-250MHz=62.5MHz, @@ -264,7 +554,7 @@ FPGA的主频为250 MHz,DAC的更新率为4Gsps, ![sim_exc_2](assets/sim_exc_2.png) -# ACQ通道 +# 4. ACQ通道 读出采集通道用于处理来自量子比特的返回信号, 对返回信号的处理控制包括模拟调制和数字控制两个部分。 @@ -288,7 +578,7 @@ MCU也可以通过修改寄存器来实时控制信号处理行为。 本文暂未涉及到需要实时修改控制寄存器的用例, 默认都是通过上位机直接配置控制寄存器。 -## ACQ.1 波形采集功能 +## 4.1. ACQ.1 波形采集 波形采集功能将ADC采集到的原始波形数据采集并上传到上位机。 |配置项|说明| @@ -298,7 +588,7 @@ MCU也可以通过修改寄存器来实时控制信号处理行为。 |控制寄存器|控制采集参数| |模拟寄存器|控制变频增益和频率| -### 编程规范 +### 4.1.1. 编程约束 不同于激励信号输出可以做到背靠背输出, 波形采集需要保证两次采集之间预留50ns的死时间。 其中死时间定义为两次触发的间隔时间减去波形持续的时间。 @@ -323,7 +613,7 @@ send x0, x1, 0x0 exit x0, x0, 0 ``` -### 码字约束 +### 4.1.2. 码字约束 与波形采集相关的码字如下表所示: |配置项|值|说明| @@ -334,7 +624,7 @@ exit x0, x0, 0 例如码字为`0x00001000`时,表示仅触发波形采集功能, 若开启其它采集选项,采集死时间受不同的功能组合而改变。 -### 控制寄存器配置 +### 4.1.3. 控制寄存器配置 在波形采集实验中,主要配置的寄存器参数包括波形采集的深度和数据回传方式。 下表设置采用数据自动推送,该模式先采集的数据先推送,数据以流模式返回。 @@ -344,14 +634,65 @@ exit x0, x0, 0 |spi_rd_en|1'h0|设置为主动数据推送模式| |sample_depth|sample_depth|要采集数据的深度,16bit, 单位是时钟周期| -### 配置示例 +### 4.1.4. 配置示例 以下是采集一段长度为64ns波形的示例, -为了方便观察信号,我们将`EXC.1`示例的输出环回到采集通道。 +完整配置示例可参考[acq_1_config.txt](./acq_1_config.txt)。 +为了方便观察信号,我们将`EXCT.1`示例的输出环回到采集通道。 本示例额外配置了数据阈值请求量`int_threshold`, 以告知仿真器在采集到足够数据后停止运行 并将采集到的数据写入文件。 -@import "acq_1_config.txt" +* **配置项:** 系统配置 +* **描述:** 对daq(ACQ)与awg(EXCT-Pump)进行软复位 +* **Transaction:** 向0x00000018地址写入4 Byte数据 +```{.line-numbers} +00000018 // address = 0x00000018 +00200004 // slot=4, length = 4 Byte +00000003 // {daq_rst, awg_rst} +``` + +* **配置项:** ACQ MCU指令配置 +* **描述:** 向ACQ通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00200000地址写入16 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00200010 // slot=4, length = 16 Byte +001007B7 // lui x15, 0x100 +0007A083 // lw x1, 0x00(x15) +0000A00B // send x0,x1,0 +0000002B // exit x0,x0,0 +``` + +* **配置项:** ACQ MCU数据配置 +* **描述:** 向ACQ通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00200004 // slot=4, length = 4 Byte +00001000 // codeword = 00001000 +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据模式和采样深度 +* **Transaction:** 向0x00400044地址写入8 Byte数据 +```{.line-numbers} +00400044 // address = 0x00400044 +00200008 // slot=4, length = 8 Byte +00000000 // spi_rd_en = 0 +00000010 // sample_depth = 16 clk +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据请求阈值 +* **Transaction:** 向0x00400050地址写入4 Byte数据 +```{.line-numbers} +00400050 // address = 0x00400050 +00200004 // slot=4, length = 4 Byte +00000040 // int_threshold = 64 +``` + +`EXCT`通道的**MCU指令配置**、**MCU数据配置**、**通道控制寄存器配置**、**波形查找表配置**、**波形仓库配置** +保持与EXCT.1相同,不再赘述。 以下是推送的数据(含帧头) @import "acq_1_pack.txt" @@ -359,7 +700,7 @@ exit x0, x0, 0 去除帧头的波形数据如下图所示 ![daq_wave](assets/sim_acq_1.png) -## ACQ.2 IQ采集功能 +## 4.2. ACQ.2 IQ数据采集 IQ采集功能利用解模算法计算输入信号的IQ值, 并将IQ值采集并推送到上位机。 受限于FPGA的计算资源,FPGA平台仅支持系数直读模式,不支持权重计算模式, @@ -376,7 +717,7 @@ IQ采集功能利用解模算法计算输入信号的IQ值, |匹配滤波器系数|定义了解模匹配滤波器系数| |模拟寄存器|控制变频增益和频率| -### 编程规范 +### 4.2.1. 编程约束 解模采集需要保证两次采集之间预留50ns的死时间。 其中死时间定义为两次触发的间隔时间减去比特最大解模时间。 @@ -400,7 +741,7 @@ send x0, x1, 0x110 exit x0, x0, 0 ``` -### 码字约束 +### 4.2.2. 码字约束 与IQ解模采集相关的码字如下表所示: |配置项|值|说明| |:-|:-|:-| @@ -426,7 +767,7 @@ exit x0, x0, 0 最后一次使能存储和解模求和不使能清零。 当需要采集多次求和结果时,重复上述过程即可。 -### 控制寄存器配置 +### 4.2.3. 控制寄存器配置 在IQ采集实验中,主要配置的寄存器参数为采集的深度和数据回传方式和IQ数据的截取范围。 @@ -438,7 +779,7 @@ exit x0, x0, 0 上述设置数据自动推送,先采集的数据先推送,仅使能的频点数据返回, 同时采集的多个频点数据先返回频点序号较小的数据,数据以流模式持续推送直至推送完成。 -### 解模参数配置 +### 4.2.4. 解模参数配置 码字为`0xFFFF2110`使用了PARA_ID为0的解模参数, 对于每个比特而言,由于只执行解模,仅需要配置参数组中的mtf_idx域。 下表为qubit0的配置结构,由于只用了一组参数,因此只需要配置一组参数。 @@ -450,7 +791,7 @@ exit x0, x0, 0 |0x00500000|dds_pfw|无需配置| |0x00500004|mtf_idx|需要配置| -### 匹配滤波器系数配置 +### 4.2.5. 匹配滤波器系数配置 由于解模使用参数配置表中的`mtf_idx`来索引匹配滤波器系数, 因此匹配滤波器系数对应区域需要配置。 例如当`mtf_idx`等于`0x00000020`时, @@ -468,16 +809,679 @@ exit x0, x0, 0 |...|...| |0x005841FC|Q496...Q511| -### 配置示例 +### 4.2.6. 配置示例 -以下是采集q0到q3解模结果的示例, -为了方便观察信号,我们将`EXC.1`示例的输出环回到采集通道。 -并将波形改成包含[407666666,437533333,467800000,499600000]四个频点的多音信号。 +本例是采集q0到q3解模结果的示例, 本示例额外配置了数据阈值请求量`int_threshold`, 以告知仿真器在采集到足够数据后停止运行 并将采集到的数据写入文件。 +完整配置示例可参考[acq_2_config.txt](./acq_2_config.txt)。 +为了方便观察信号,我们将`EXCT.1`示例的输出环回到采集通道。 +`EXCT`通道的**MCU指令配置**、**MCU数据配置**、**通道控制寄存器配置**、**波形查找表配置** +保持与EXCT.1相同。此外为了方便观察4个频点解模结果, +波形改成了包含[407666666, 437533333, 467800000, 499600000]四个频点的多音信号。 +激励通道相关配置不再赘述。 + +* **配置项:** 系统配置 +* **描述:** 对daq(ACQ)与awg(EXCT-Pump)进行软复位 +* **Transaction:** 向0x00000018地址写入4 Byte数据 +```{.line-numbers} +00000018 // address = 0x00000018 +00200004 // slot=4, length = 4 Byte +00000003 // {daq_rst, awg_rst} +``` + +* **配置项:** ACQ MCU指令配置 +* **描述:** 向ACQ通道MCU指令空间写入配置指令 +* **Transaction:** 向0x00200000地址写入16 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00200010 // slot=4, length = 16 Byte +001007B7 // lui x15, 0x100 +0007A083 // lw x1, 0x00(x15) +0000A00B // send x0,x1,0 +0000002B // exit x0,x0,0 +``` + +* **配置项:** ACQ MCU数据配置 +* **描述:** 向ACQ通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00200004 // slot=4, length = 4 Byte +000f2110 // codeword = 0x000f2110 +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据模式和采样深度 +* **Transaction:** 向0x00400044地址写入4 Byte数据 +```{.line-numbers} +00400044 // address = 0x00400044 +00200004 // slot=4, length = 4 Byte +00000000 // spi_rd_en = 0, iq_scale = 0, two_sta_en = 0 +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据请求阈值 +* **Transaction:** 向0x00400050地址写入4 Byte数据 +```{.line-numbers} +00400050 // address = 0x00400050 +00200004 // slot=4, length = 4 Byte +00000008 // int_threshold = 8 +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q0匹配滤波器系数查找表 +* **Transaction:** 向0x00500004地址写入4 Byte数据 +```{.line-numbers} +00500004 // address = 0x00500004 +00200004 // slot=4, length = 4 Byte +00000010 // qubit 0 group 0 para mtf_idx +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q1匹配滤波器系数查找表 +* **Transaction:** 向0x00500804地址写入4 Byte数据 +```{.line-numbers} +00500804 // address = 0x00500804 +00200004 // slot=4, length = 4 Byte +00000010 // qubit 1 group 0 para mtf_idx +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q2匹配滤波器系数查找表 +* **Transaction:** 向0x00501004地址写入4 Byte数据 +```{.line-numbers} +00501004 // address = 0x00501004 +00200004 // slot=4, length = 4 Byte +00000010 // qubit 2 group 0 para mtf_idx +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q3匹配滤波器系数查找表 +* **Transaction:** 向0x00501804地址写入4 Byte数据 +```{.line-numbers} +00501804 // address = 0x00501804 +00200004 // slot=4, length = 4 Byte +00000010 // qubit 3 group 0 para mtf_idx +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q0匹配滤波器系数实部 +* **Transaction:** 向0x00580000地址写入256 Byte数据 +```{.line-numbers} +00580000 // address = 0x00580000 +00200100 // slot=4, length = 256 Byte +95D42465 // qubit 0 256 mtf_i samples +32E39E81 +155B7E6E +A9838EC6 +7B7440F2 +88B90650 +4C01B586 +F644767A +C28C84AD +707D5810 +81A2E737 +621FCF93 +D928687E +DE9B8198 +5F7E6B2E +8290CA1A +733CEDA5 +BD0B547C +FCB18589 +48787849 +8A85B0FB +7C550BBD +A5EC3B72 +1ACB9082 +2D6B7E5F +98819BDD +7E6929D9 +92CF1E62 +37E8A281 +0F587D70 +AD848BC1 +797745F7 +86B4004C +5106B988 +F13F747B +C78E82A8 +6D7E5C16 +819EE232 +6625D596 +D323657E +E39F8195 +5B7D6E33 +838DC514 +7540F2A9 +B805507B +02B58687 +43767A4D +8C83ACF6 +7D5911C2 +A1E73670 +20D09381 +28687E63 +9C8198D8 +7E6C2EDF +90CA195E +3CEEA682 +0A537C73 +B18589BC +787849FD +84B0FB47 +550CBE8A +EB3A727C +CC9182A4 +6A7E601B +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q0匹配滤波器系数虚部 +* **Transaction:** 向0x00584000地址写入256 Byte数据 +```{.line-numbers} +00584000 // address = 0x00584000 +00200100 // slot=4, length = 256 Byte +4577794B // qubit 0 128 mtf_q samples +8B84AEF8 +7D570FC0 +A3E93871 +1ECE9281 +2A697E61 +9B8199DA +7E6A2CDD +91CC1B60 +3AEBA482 +0C557C72 +B0858ABE +787847FB +85B1FD49 +530ABC89 +ED3C737C +CA9082A6 +6C7E5E19 +819CDF2E +6828D898 +D020637E +E7A18193 +597D7036 +838CC211 +7643F6AC +B5024D7A +05B88886 +40757B50 +8D83A9F2 +7D5B14C5 +9FE3336E +23D39581 +24667E65 +9E8196D5 +7E6D32E2 +8EC6165C +3FF1A882 +06517B74 +B48688B9 +77794C00 +84ADF745 +580FC18B +E837707D +CF9281A2 +697E621F +8198D929 +6B2DDD9B +CB1A5F7E +ECA58290 +547C723B +858ABD0B +7848FBB0 +B1FC4978 +0BBD8985 +3C727C54 +9082A5ED +7E5F1ACA +9BDE2E6B +29D99881 +1F627E68 +A28193CF +7D7037E7 +8CC21058 +44F7AD84 +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q1匹配滤波器系数实部 +* **Transaction:** 向0x00588000地址写入256 Byte数据 +```{.line-numbers} +00588000 // address = 0x00588000 +00200100 // slot=4, length = 256 Byte +8AC41862 // qubit 1 128 mtf_i samples +590CB986 +CF24697E +00AF838F +306F7C50 +A68196DB +757946F3 +819DE73B +753CE79D +A6F34679 +30DB9681 +FF507C70 +CF9083AF +597E6925 +8A86B90C +7E6219C4 +8AC31861 +5A0CB986 +CE24697E +00AF838F +306F7C50 +A68196DA +757947F4 +819DE63B +753CE79E +A5F24579 +31DB9681 +FF4F7C70 +D09083AE +597E6A25 +8A86B80B +7E6219C4 +8AC31761 +5A0DBA86 +CE23697E +00B0838F +2F6F7C51 +A68195DA +747947F4 +819DE63A +753CE89E +A5F24579 +31DC9781 +FE4F7C70 +D09083AE +587E6A26 +8B86B80B +7E621AC5 +8AC21761 +5A0DBA86 +CE23687E +01B0838F +2F6F7C51 +A78195D9 +747947F4 +819CE53A +753DE89E +A5F24579 +32DC9781 +FE4F7C70 +D09083AE +587E6A26 +8B85B80A +7E631AC5 +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q1匹配滤波器系数虚部 +* **Transaction:** 向0x0058C000地址写入256 Byte数据 +```{.line-numbers} +0058C000 // address = 0x0058C000 +00200100 // slot=4, length = 256 Byte +306F7C50 // qubit 1 128 mtf_q samples +A68196DB +757946F3 +819DE73B +753BE79D +A6F34679 +30DB9681 +FF507C70 +CF9083AF +597E6925 +8A86B90C +7E6219C4 +8AC31861 +5A0CB986 +CF24697E +00AF838F +306F7C50 +A68196DA +757946F4 +819DE63B +753CE79E +A5F24679 +31DB9681 +FF507C70 +D09083AE +597E6925 +8A86B80B +7E6219C4 +8AC31861 +5A0DBA86 +CE24697E +00B0838F +2F6F7C51 +A68195DA +747947F4 +819DE63B +753CE89E +A5F24579 +31DC9681 +FE4F7C70 +D09083AE +597E6A25 +8B86B80B +7E6219C5 +8AC31761 +5A0DBA86 +CE23687E +01B0838F +2F6F7C51 +A78195D9 +747947F4 +819CE53A +753DE89E +A5F24579 +31DC9781 +FE4F7C70 +D09083AE +587E6A26 +8B86B80A +7E631AC5 +8AC21761 +5A0EBA86 +CD23687E +01B0838F +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q2匹配滤波器系数实部 +* **Transaction:** 向0x00590000地址写入256 Byte数据 +```{.line-numbers} +00590000 // address = 0x00590000 +00200100 // slot=4, length = 256 Byte +83B40C5E // qubit 2 128 mtf_i samples +7435DA92 +97E33D78 +5703AD82 +BC16647E +2CD18E85 +EC457A70 +F9A6819D +1F697D50 +C88A88C4 +4D7C6C23 +A081A3F5 +6E7B49F0 +878CCD28 +7E661AC0 +81AAFF54 +7941E79A +90D63173 +6010B884 +B1085B7E +38DD9482 +DF397676 +07B08295 +12617E5A +D48F84B9 +42797230 +A9819AE8 +677E53FE +8B87C11B +7C6E27CC +81A0F14A +7C4CF4A2 +8AC9246C +691EC388 +A7FB517D +44EB9C81 +D22D717A +14BB858E +04587E63 +E19682AE +3675773C +B38393DB +5F7E5D0B +9183B50E +787433D8 +8198E43E +7E5602AC +86BD1765 +702BCF8D +9EED467B +4FF8A581 +C5206A7D +22C78989 +F74E7D6B +EF9F81A4 +296F7B48 +BF868CCE +557E6619 +9981AB00 +737940E5 +8491D732 +7E600FB7 +83B2095C +7537DC94 +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q2匹配滤波器系数虚部 +* **Transaction:** 向0x00594000地址写入256 Byte数据 +```{.line-numbers} +00594000 // address = 0x00594000 +00200100 // slot=4, length = 256 Byte +19667E55 // qubit 2 128 mtf_q samples +CE8C86BF +487B6F29 +A4819FEF +6B7D4DF6 +8989C722 +7D6A20C5 +81A5F94F +7B46ED9D +8DD02B70 +6416BD86 +AC02577E +3EE39881 +D9347478 +0DB58392 +0C5D7E5E +DA9283B4 +3C777535 +AD8297E2 +637E5804 +8E85BC15 +7A712DD1 +819CEB45 +7D51FAA6 +88C41E69 +6C24C98A +A3F54C7C +49F1A081 +CC276E7C +1AC0878C +FE547E67 +E79A81A9 +30727941 +B88490D5 +5A7E6111 +9582B008 +767639DE +8295DE39 +7E5B08B1 +84B81161 +7230D590 +9AE74179 +54FEA981 +C01A677E +28CC8C87 +F1497B6E +F5A381A0 +236C7C4C +C4888AC8 +507D691E +9D81A6FA +707A45EB +858ED12C +7E6315BC +82AD0358 +773DE297 +92DA3574 +5D0CB483 +B50D5E7E +34D99283 +E33D7874 +02AD8197 +16647E57 +D08D85BD +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q3匹配滤波器系数实部 +* **Transaction:** 向0x00598000地址写入256 Byte数据 +```{.line-numbers} +00598000 // address = 0x00598000 +00200100 // slot=4, length = 256 Byte +81A60059 // qubit 3 128 mtf_i samples +7E59FFA5 +81A6005A +7E58FEA5 +81A7015A +7E58FEA5 +81A7025B +7E58FDA4 +81A8025B +7E57FCA4 +81A8035C +7E57FCA3 +81A9035C +7E56FBA3 +81A9045C +7E56FBA2 +81AA055D +7E55FAA2 +81AA055D +7E55F9A1 +81AB065E +7E54F9A1 +81AB075E +7E54F8A1 +81AB075F +7E53F7A0 +81AC085F +7E53F7A0 +81AC095F +7E52F69F +81AD0960 +7E52F59F +81AD0A60 +7E51F59F +81AE0A61 +7E51F49E +81AE0B61 +7E50F49E +81AF0C62 +7E50F39D +81AF0C62 +7E4FF29D +81B00D62 +7E4FF29C +81B00E63 +7E4EF19C +81B10E63 +7E4EF09C +81B10F64 +7D4DF09B +82B21064 +7D4DEF9B +82B21064 +7D4CEE9B +82B31165 +7D4CEE9A +82B31165 +7D4BED9A +82B41265 +7D4BED99 +82B41366 +7D4AEC99 +82B51366 +7D4AEB99 +``` + +* **配置项:** ACQ 匹配滤波器系数 +* **描述:** 配置q3匹配滤波器系数虚部 +* **Transaction:** 向0x0059C000地址写入256 Byte数据 +```{.line-numbers} +0059C000 // address = 0x0059C000 +00200100 // slot=4, length = 256 Byte +00597E59 // qubit 3 128 mtf_q samples +FFA581A6 +005A7E59 +FEA581A6 +015A7E58 +FEA481A7 +025B7E58 +FDA481A7 +025B7E57 +FCA481A8 +035C7E57 +FCA381A8 +045C7E56 +FBA381A9 +045D7E56 +FAA281A9 +055D7E56 +FAA281AA +065D7E55 +F9A181AA +065E7E55 +F8A181AB +075E7E54 +F8A181AB +075F7E54 +F7A081AC +085F7E53 +F7A081AC +09607E53 +F69F81AD +09607E52 +F59F81AD +0A607E52 +F59E81AE +0B617E51 +F49E81AE +0B617E51 +F39E81AE +0C627E50 +F39D81AF +0D627E50 +F29D81AF +0D627E4F +F19C81B0 +0E637E4F +F19C81B0 +0E637E4E +F09C81B1 +0F647E4E +F09B81B1 +10647D4D +EF9B82B2 +10647D4D +EE9A82B2 +11657D4C +EE9A82B3 +12657D4C +ED9A82B4 +12667D4B +EC9982B4 +13667D4B +EC9982B5 +14667D4A +EB9982B5 +``` -@import "acq_2_config.txt" 推送的数据结果如下所示 @import "acq_2_pack.txt" @@ -485,7 +1489,7 @@ exit x0, x0, 0 绘制到iq平面上的结果如下图所示 ![sim_acq_2](assets/sim_acq_2.png) -## ACQ.3 态采集功能 +## 4.3. ACQ.3 态数据采集 态采集功能首先利用解模算法计算IQ值, 接着用态判断算法计算IQ值对应的比特状态, 最后将计算出来的态信息采集并推送到上位机。 @@ -503,7 +1507,7 @@ exit x0, x0, 0 |模拟寄存器|控制变频增益和频率| -### 编程规范 +### 4.3.1. 编程约束 态采集需要保证两次态采集之间预留50ns的死时间。 其中死时间定义为两次触发的间隔时间减去比特解模解模时间。 @@ -527,7 +1531,7 @@ send x0, x1, 0x0 exit x0, x0, 0 ``` -### 码字约束 +### 4.3.2. 码字约束 与态采集相关的码字如下表所示: |配置项|值|说明| |:-|:-|:-| @@ -542,7 +1546,7 @@ exit x0, x0, 0 建议通过设置`0`来关闭其它功能选项, 若开启其它选项,采集死时间受不同的功能组合而改变。 -### 控制寄存器配置 +### 4.3.3. 控制寄存器配置 在IQ采集实验中,主要配置的寄存器参数为采集的深度和数据回传方式和IQ数据的截取范围。 @@ -556,7 +1560,7 @@ exit x0, x0, 0 只要发生采集操作即将全部16个qubit数据推送, 数据以流模式持续推送直至推送完成。 -### 解模参数配置 +### 4.3.4. 解模参数配置 码字为`0xFFFF4000`使用了PARA_ID为0的解模参数, 对于每个比特而言,需要执行解模和态判断, 因此需要配置参数组中的mtf_idx、ab[0,1,2]、c[0,1,2]域。 @@ -575,7 +1579,7 @@ exit x0, x0, 0 |0x00500018|ab2|需要配置| |0x0050001c|c2|需要配置| -### 匹配滤波器系数配置 +### 4.3.5. 匹配滤波器系数配置 由于解模使用参数配置表中的`mtf_idx`来索引匹配滤波器系数, 因此匹配滤波器系数对应区域需要配置。 例如当`mtf_idx`等于`0x00000020`时, @@ -593,25 +1597,101 @@ exit x0, x0, 0 |...|...| |0x005841FC|Q496...Q511| -### 配置示例 +### 4.3.6. 配置示例 -以下是采集q0到q3态结果的示例, -为了方便观察信号,我们将`EXC.1`示例的输出环回到采集通道。 -并将波形改成包含[407666666,437533333,467800000,499600000]四个频点的多音信号。 -本示例额外配置了数据阈值请求量`int_threshold`, -以告知仿真器在采集到足够数据后停止运行 -并将采集到的数据写入文件。 +本例是采集q0到q3态结果的示例, +完整配置示例可参考[acq_3_config.txt](./acq_3_config.txt)。 +本示例相比ACQ.2 仅ACQ码字、触发阈值和参数查找表不同。 +* 码字差别: 采集数据从IQ数据变为态数据 +* 触发阈值:数据量从8个四字节变为1个四字节 +* 参数查找表: 由于要进行态判断,需要配置态判断参数 -@import "acq_3_config.txt" +具体差异配置如下所示: +* **配置项:** ACQ MCU数据配置 +* **描述:** 向ACQ通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00200004 // slot=4, length = 4 Byte +000f4000 // codeword = 0x000f4000 +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据请求阈值 +* **Transaction:** 向0x00400050地址写入4 Byte数据 +```{.line-numbers} +00400050 // address = 0x00400050 +00200004 // slot=4, length = 4 Byte +00000001 // int_threshold = 1 +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q0匹配滤波器系数查找表 +* **Transaction:** 向0x00500004地址写入28 Byte数据 +```{.line-numbers} +00500004 // address = 0x00500004 +0020001C // slot=4, length = 28 Byte +00000010 // qubit 0 group 0 para mtf_idx +80018001 +00000000 +00007FFF +00000000 +7FFF8001 +00000000 +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q1匹配滤波器系数查找表 +* **Transaction:** 向0x00500804地址写入28 Byte数据 +```{.line-numbers} +00500804 // address = 0x00500804 +0020001C // slot=4, length = 28 Byte +00000010 // qubit 1 group 0 para mtf_idx +80018001 +00000000 +00007FFF +00000000 +7FFF8001 +00000000 +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q2匹配滤波器系数查找表 +* **Transaction:** 向0x00501004地址写入28 Byte数据 +```{.line-numbers} +00501004 // address = 0x00501004 +0020001C // slot=4, length = 28 Byte +00000010 // qubit 2 group 0 para mtf_idx +80018001 +00000000 +00007FFF +00000000 +7FFF8001 +00000000 +``` + +* **配置项:** ACQ 参数查找表配置 +* **描述:** 配置q3匹配滤波器系数查找表 +* **Transaction:** 向0x00501804地址写入28 Byte数据 +```{.line-numbers} +00501804 // address = 0x00501804 +0020001C // slot=4, length = 28 Byte +00000010 // qubit 3 group 0 para mtf_idx +80018001 +00000000 +00007FFF +00000000 +7FFF8001 +00000000 +``` 推送的数据结果如下所示 @import "acq_3_pack.txt" 上述结果显示q0~q3分别处于2、1、0、1态, -其余未测量的比特处于错误未定义的3态。 +其余未测量的比特处于未定义的3态。 - -## ACQ.4 计数采集功能 +## 4.4. ACQ.4 计数数据采集 态计数采集功能利用解模算法计算输入信号的IQ值, 接着利用态判断算法到量子比特的状态, @@ -631,7 +1711,7 @@ exit x0, x0, 0 |匹配滤波器系数|定义了解模匹配滤波器系数| |模拟寄存器|控制变频增益和频率| -### 编程规范 +### 4.4.1. 编程约束 解模采集需要保证两次采集之间预留50ns的死时间。 其中死时间定义为两次触发的间隔时间减去比特最大解模时间。 @@ -655,7 +1735,7 @@ send x0, x1, 0x220 exit x0, x0, 0 ``` -### 码字约束 +### 4.4.2. 码字约束 与态计数采集相关的码字如下表所示: |配置项|值|说明| |:-|:-|:-| @@ -682,7 +1762,7 @@ exit x0, x0, 0 最后一次使能计数存储和计数统计不使能计数清零。 当需要采集多次计数统计结果时,重复上述过程即可。 -### 控制寄存器配置 +### 4.4.3. 控制寄存器配置 在态计数采集实验中,主要配置的寄存器参数为数据回传方式和IQ数据的截取范围以及是否使能2态判定。 @@ -695,7 +1775,7 @@ exit x0, x0, 0 上述设置数据自动推送,先采集的数据先推送,仅使能的频点数据返回, 同时采集的多个频点数据先返回频点序号较小的数据,数据以流模式持续推送直至推送完成。 -### 解模参数配置 +### 4.4.4. 解模参数配置 码字为`0xFFFF8220`使用了PARA_ID为0的解模参数, 对于每个比特而言,由于只执行解模和态判断, 因此需要配置参数组中的mtf_idx、ab[0,1,2]、c[0,1,2]域。 @@ -714,7 +1794,7 @@ exit x0, x0, 0 |0x00500018|ab2|需要配置| |0x0050001c|c2|需要配置| -### 匹配滤波器系数配置 +### 4.4.5. 匹配滤波器系数配置 由于解模使用参数配置表中的`mtf_idx`来索引匹配滤波器系数, 因此匹配滤波器系数对应区域需要配置。 例如当`mtf_idx`等于`0x00000020`时, @@ -732,11 +1812,31 @@ exit x0, x0, 0 |...|...| |0x005841FC|Q496...Q511| -### 配置示例 -以下是采集q0到q3态统计结果的示例, +### 4.4.6. 配置示例 +本例是采集q0到q3态统计结果的示例, +完整配置示例可参考[acq_4_config.txt](./acq_4_config.txt)。 该示例在acq.3示例的基础上仅修改了码字和采集数据量。 -码字从`000f4000`改成了`000f8220` -阈值数据量从`000000001`改成了`00000010`。 +* 码字: 从`0x000f4000`改成了`0x000f8220`,采集数据不同 +* 阈值: 从`0x000000001`改成了`0x00000010`,数据量不同。 + +差异配置如下所示: +* **配置项:** ACQ MCU数据配置 +* **描述:** 向ACQ通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00200004 // slot=4, length = 4 Byte +000f8220 // codeword = 0x000f8220 +``` + +* **配置项:** ACQ 通道控制寄存器配置 +* **描述:** 配置数据请求阈值 +* **Transaction:** 向0x00400050地址写入4 Byte数据 +```{.line-numbers} +00400050 // address = 0x00400050 +00200004 // slot=4, length = 4 Byte +00000010 // int_threshold = 16 +``` 采集到的数据如下所示: @@ -748,7 +1848,7 @@ exit x0, x0, 0 * q2出现了1次0态,其余态出现0次 * q3出现了1次1态,其余态出现0次 -## ACQ.5 读出反馈功能 +## 4.5. ACQ.5 读出态反馈 态读出反馈功能首先利用解模算法得到IQ值, 接着利用态判断算法计算IQ值对应的比特状态, 最后将计算出来的态信息通过上行和下行反馈端口发出。 @@ -763,7 +1863,7 @@ exit x0, x0, 0 |匹配滤波器系数|定义了解模匹配滤波器系数| |模拟寄存器|控制变频增益和频率| -### 编程规范 +### 4.5.1. 编程约束 态读出反馈需要保证两次态采集之间预留50ns的死时间。 其中死时间定义为两次触发的间隔时间减去比特解模解模时间。 @@ -785,7 +1885,7 @@ send x0, x1, 0x0C0 exit x0, x0, 0 ``` -### 码字约束 +### 4.5.2. 码字约束 与态采集相关的码字如下表所示: |配置项|值|说明| |:-|:-|:-| @@ -801,7 +1901,7 @@ exit x0, x0, 0 建议通过设置`0`来关闭其它功能选项, 若开启其它选项,采集死时间受不同的功能组合而改变。 -### 控制寄存器配置 +### 4.5.3. 控制寄存器配置 在态读出反馈实验中,主要配置的寄存器参数为IQ数据的截取范围和态判断的模式。 @@ -811,7 +1911,7 @@ exit x0, x0, 0 |two_state_en|1‘b0|不用两态判定| -### 解模参数配置 +### 4.5.4. 解模参数配置 码字为`0xFFFF00C0`使用了PARA_ID为0的解模参数, 对于每个比特而言,需要执行解模和态判断, 因此需要配置参数组中的mtf_idx、ab[0,1,2]、c[0,1,2]域。 @@ -830,7 +1930,7 @@ exit x0, x0, 0 |0x00500018|ab2|需要配置| |0x0050001c|c2|需要配置| -### 匹配滤波器系数配置 +### 4.5.5. 匹配滤波器系数配置 由于解模使用参数配置表中的`mtf_idx`来索引匹配滤波器系数, 因此匹配滤波器系数对应区域需要配置。 例如当`mtf_idx`等于`0x00000020`时, @@ -848,22 +1948,33 @@ exit x0, x0, 0 |...|...| |0x005841FC|Q496...Q511| -### 配置示例 -以下是反馈q0到q3态读出结果的示例, +### 4.5.6. 配置示例 +本例是反馈q0到q3态读出结果的示例, +完整配置示例可参考[acq_5_config.txt](./acq_5_config.txt)。 该示例在acq.4示例的基础上仅修改了码字。 -将码字从`000f8220`,改成`000f82e0`。 +* 码字: 从`0x000f8220`,改成`0x000f82e0`, 将读出结果反馈到局部和全局接口。 + +差异配置如下所示: +* **配置项:** ACQ MCU数据配置 +* **描述:** 向ACQ通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00200004 // slot=4, length = 4 Byte +000f82e0 // codeword = 0x000f82e0 +``` 仿真结果如下图所示: ![sim_acq_5](assets/sim_acq_5.png) 可以看到局部反馈端口`loc_lvcmos_t`上的态结果与acq.3实验相同, 全局反馈回环接收数据`glb_fd_in`与acq.3实验相同,符合预期。 -# Pump通道 +# 5. Pump通道 Pump通道用于为参量放大器提供能量,对Pump通道的输出控制包括模拟电路配置。 模拟电路通过小数分配锁相环来合成指定频率,并通过功率驱动电路后输出。 -## Pump.1 Pump开关输出功能 +## 5.1. Pump.1 开关输出 Pump开关输出功能使用与激励信号同一个MCU来产生码字, 通道利用码字来触发产生一个指定脉冲宽度的数字信号, 并利用这个数字信号使能Pump通道微波信号输出, @@ -876,7 +1987,7 @@ Pump开关输出功能使用与激励信号同一个MCU来产生码字, |控制寄存器|控制脉冲输出的宽度| |模拟寄存器|控制Pump的频率和功率| -### 编程规范 +### 5.1.1. 编程约束 |说明项|说明内容| |:-:|:-| |1|MCU数据根据需要配置,若存在访存指令则需配置,否则可不配置| @@ -894,21 +2005,22 @@ lui x1, 0x00001 send x0, x1, 0x300 exit x0, x0, 0 ``` -### 码字约束 +### 5.1.2. 码字约束 与使能脉冲输出相关的控制码字如下: |配置项|值|说明| |:-|:-:|:-| -|CODEWORD[12]|1|仅使能脉冲输出| +|CODEWORD[12]|PULSE_ONLY|仅使能脉冲输出| |CODEWORD[8]|1|使能Pump脉冲输出| -例如码字`0x00001100`可以触发输出pump通道使能控制脉冲而不触发波形输出, +CODEWORD[12]控制了是否在输出脉冲时输出波形, +当使能波形输出时,需要同时配置好EXCT通道相关配置。 +* 码字`0x00001100`可以触发输出pump通道使能控制脉冲而不触发波形输出, 此时脉冲的宽度等于pump_width指定的长度。 -用户也可以通过设置`CODEWORD[12]=0`来同时输出波形, -当允许波形输出时,使能脉冲的长度等于波形长度加上pump_width指定的长度。 -允许波形输出时必须同时配置好RI通道相关配置。 +* 码字`0x00000100`可以触发输出Pump通道使能脉冲并同时输出波形, +此时使能脉冲的长度等于波形长度加上pump_width指定的长度。 -### 控制寄存器配置 +### 5.1.3. 控制寄存器配置 控制器寄存器主要包括对使能脉冲的延迟和宽度的配置。 |配置项|值|说明| |:-:|:-:|:-| @@ -916,7 +2028,7 @@ exit x0, x0, 0 |pump_ctrl|{delay,width}|pump脉冲输出延迟和宽度| -### 模拟寄存器 +### 5.1.4. 模拟寄存器 模拟寄存器用于配置模拟电路生成pump信号的参数 |配置项|值|说明| |:-|:-|:-| @@ -924,23 +2036,74 @@ exit x0, x0, 0 |pump_power|PCW|PCW范围[-1100,-300],码值与输出功率正相关| |pump_enable|32'h11|使能pump通道模拟输出| -### 配置示例 -数字部分配置 -@import "pump_1_dig_cfg.txt" +### 5.1.5. 配置示例 +本示例是配置Pump通道输出, +数字部分配置在EXCT.1的基础上存在以下修改, +以下是差异项配置: +* 码字:使能Pump脉冲输出 +* 控制寄存器: 设置Pump脉冲的延迟和附加宽度 + +数字完整配置示例可参考[pump_1_dig_cfg.txt](./pump_1_dig_cfg.txt)。 + +* **配置项:** EXCT-Pump MCU数据配置 +* **描述:** 向EXCT-Pump通道MCU数据空间写入配置数据 +* **Transaction:** 向0x00800000地址写入4 Byte数据 +```{.line-numbers} +00800000 // address = 0x00800000 +00200004 // slot=4, length = 4 Byte +00000100 // codeword = 0x000000100 +``` + +* **配置项:** Pump 通道控制寄存器 +* **描述:** 设置Pump通道脉冲控制寄存器 +* **Transaction:** 向0x00900044地址写入8 Byte数据 +```{.line-numbers} +00900044 // address = 0x00900044 +00200008 // slot=4, length = 8 Byte +00000000 // PUMP_INV=0 +00010010 // delay = 1, width = 16 +``` + 数字部分仿真结果如下图所示,可以看到脉冲输出持续了96ns(24个时钟周期), 其中8个时钟周期是波形输出时间,16个时钟周期是附加持续时间,与预期符合。 ![sim_pump_1](assets/sim_pump_1.png) 模拟部分配置需要设置输出频率、输出功率并使能输出。 -配置用例如下所示: +模拟完整配置示例可参考[pump_1_ana_cfg.txt](./pump_1_ana_cfg.txt)。 -@import "pump_1_ana_cfg.txt" +* **配置项:** Pump 通道模拟配置 +* **描述:** 设置Pump通道输出频率 +* **Transaction:** 向0x00200000地址写入4 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00280004 // slot=5, length = 4 Byte +006ACFC0 // pump frequency = 7GHz +``` -注意:受制于混频板的硬件设计, +* **配置项:** Pump 通道模拟配置 +* **描述:** 设置Pump通道输出功率 +* **Transaction:** 向0x00300000地址写入4 Byte数据 +```{.line-numbers} +00300000 // address = 0x00300000 +00280004 // slot=5, length = 4 Byte +FFFFFF38 // pump power = 15 dbm +``` + +* **配置项:** Pump 通道模拟配置 +* **描述:** 设置Pump通道输出开启 +* **Transaction:** 向0x00400000地址写入4 Byte数据 +```{.line-numbers} +00400000 // address = 0x00400000 +00280004 // slot=5, length = 4 Byte +00000011 // pump output enable +``` + +注意:受制于混频板的硬件限制, +``` 对混频板的参数配置需要预留一定等待时间, 建议每执行一项配置后等待10毫秒再执行。 - -## Pump.2 Pump连续输出功能 +``` +## 5.2. Pump.2 连续输出 Pump连续输出功能通过配置寄存器令使能脉冲始终处于高电平, 从而允许pump通道始终输出微波信号。 连续输出所需配置项如下表所示: @@ -949,30 +2112,65 @@ Pump连续输出功能通过配置寄存器令使能脉冲始终处于高电平 |控制寄存器|控制脉冲输出的极性| |模拟寄存器|控制Pump的频率和功率| -### 码字约束 +### 5.2.1. 码字约束 Pump通道连续输出功能本身无需编程MCU, 但是当需要触发RI波形输出时, 必须禁止码字Pump脉冲输出功能 -### 控制寄存器配置 +### 5.2.2. 控制寄存器配置 控制器寄存器主要包括对使能脉冲的延迟和宽度的配置。 |配置项|值|说明| |:-:|:-:|:-| |pump_inv|1|反转极性,控制脉冲默认输出高电平| -### 模拟寄存器 +### 5.2.3. 模拟寄存器 |配置项|值|说明| |:-|:-|:-| |pump_freq|FCW|输出频率控制字,freq = FCW*1000| |pump_power|PCW|PCW范围[-1300,-200],码值与输出功率正相关| |pump_enable|32'h11|使能pump通道模拟输出| -### 配置示例 +### 5.2.4. 配置示例 +本用例模拟配置与Pump.1用例相同,示例可参考[pump_1_ana_cfg.txt](./pump_1_ana_cfg.txt)。 数字部分配置仅需要设置pump_en的极性为取反, 并且生成码字时不能使能pump_en。 -数字部分配置用例如下所示: +数字完整配置示例可参考[pump_2_dig_cfg.txt](./pump_2_dig_cfg.txt)。 -@import "pump_2_dig_cfg.txt" +* **配置项:** 系统配置 +* **描述:** 对daq(ACQ)与awg(EXCT-Pump)进行软复位 +* **Transaction:** 向0x00000018地址写入4 Byte数据 +```{.line-numbers} +00000018 // address = 0x00000018 +00200004 // slot=4, length = 4 Byte +00000003 // {daq_rst, awg_rst} +``` + +* **配置项:** ACQ 通道MCU指令配置 +* **描述:** 退出MCU运行 +* **Transaction:** 向0x00200000地址写入4 Byte数据 +```{.line-numbers} +00200000 // address = 0x00200000 +00200004 // slot=4, length = 4 Byte +0000002B // exit x0, x0, 0 +``` + +* **配置项:** EXCT-Pump 通道MCU指令配置 +* **描述:** 退出MCU运行 +* **Transaction:** 向0x00700000地址写入4 Byte数据 +```{.line-numbers} +00700000 // address = 0x00700000 +00200004 // slot=4, length = 4 Byte +0000002B // exit x0, x0, 0 +``` + +* **配置项:** EXCT-Pump 通道控制寄存器配置 +* **描述:** 配置Pump脉冲极性 +* **Transaction:** 向0x00900044地址写入4 Byte数据 +```{.line-numbers} +00900044 // address = 00900044 +00200004 // slot=4, length = 4 Byte +00000010 // PUMP_INV = 1 +``` 仿真结果如下图所示,将极性取反后, `pump_en`输出始终为高电平,