{ "cells": [ { "cell_type": "code", "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2026-07-28T09:50:05.947705Z", "start_time": "2026-07-28T09:50:05.940378Z" } }, "source": [ "import sys\n", "import os\n", "import numpy as np\n", "from make_case import *\n", "from make_inst import *\n", "from FourChZChipConfig import *\n", "from FourChZAssemblyTemplateManager import *\n", "from FourChZEnvelopeGenerator import *\n", "from FourChZreg_define import *\n", "from ParamsManager import ParamsManager\n", "from copy import deepcopy\n", "from itertools import product\n", "from pathlib import Path\n", "mk = make_case()\n", "mk_instr = make_inst()\n", "from pathlib import Path\n", "def run_case(params, save_json=True, write_hw=False):\n", " \"\"\"\n", " 通用执行函数:自动判断模式并按需调用 configure_chip_output, env_config, instruction_config\n", " :param output_dir: 可选,自定义输出文件和 JSON 保存的目录路径\n", " \"\"\"\n", " # 1. 确定最终输出目录\n", " base_dir = Path('D:/MyDocument/工作/Z芯片的case生成器/4ch-Z_Generator/gen_cases') # 在这边选择case目录所在位置\n", " folder_name = params.get('FolderName', 'General') #文件夹名不用在这边改,在case参数里面改\n", " out_dir = base_dir / folder_name\n", " \n", " case_name = params['CaseName'] #Case名不用在这边改,在case参数里面改\n", " config_file_path = out_dir / f\"{case_name}_HEX.txt\"\n", " # 更新 params 中的路径信息\n", " params['config_file'] = str(config_file_path)\n", " \n", " # 2. 自动创建目录并初始化保存器\n", " pm = ParamsManager(out_dir)\n", " if save_json:\n", " pm.save(params, case_name)\n", " \n", " # 3. 基础芯片输出配置\n", " config_chip_reg(mk, **params)\n", " print(\"执行 config_chip_reg\")\n", " \n", " # 4. 自动识别并执行包络配置\n", " if 'envelope_configs' in params or 'envelope_type' in params or 'amp' in params:\n", " if 'env_config' in globals():\n", " env_config(mk, **params)\n", " print(\"执行了 env_config\")\n", " \n", " # 5. 自动识别并执行指令配置\n", " if 'instr_type' in params:\n", " instruction_config(mk, mk_instr, **params)\n", " print(\"执行了 instruction_config\")\n", " \n", " \n", " # 7. 基础硬件寄存器下发\n", " if write_hw:\n", " channel = params['channel']\n", " envm_base =addr_base['ENVM0_BASE'] + channel* 0x600000\n", " itcm_base = addr_base['ITCM0_BASE'] + channel* 0x600000\n", " mk.rw_once('w',envm_base , 0, params['config_file'])\n", " instr_type = params.get('instr_type', None)\n", " if instr_type is None:\n", " mk.rw_once('w', itcm_base, '0x2B', params['config_file'])\n", "\n", " print(f\"生成文件路径:{config_file_path.resolve()}\")\n", " return None\n", "\n" ], "outputs": [], "execution_count": 34 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-28T09:52:50.467599Z", "start_time": "2026-07-28T09:52:50.435623Z" } }, "cell_type": "code", "source": [ "#general_send_wait这个汇编模板的 SEND_WAIT效果示例。\n", "#单通道 AWG通用模板\n", "param_ch0 = {\n", " 'channel' : 0,\n", " 'chip_mode':'AWG', #分为AWG和RAMP模式\n", " 'mode':'mod', #可选nco nco_fm env mod四种模式\n", " 'tail_en': False, #拖尾矫正开关\n", " 'tc_coef_set': 'coef3', #拖尾矫正打开生效\n", " 'inner_sync': False, #内部触发,应该是软触发,写一个寄存器,就能触发\n", " 'amp_mod_enable': True, #调幅的开关,mod调制模式下起作用。\n", " 'freq_mod_enable': True, #nco的开关\n", " 'bias_enable': True, #必开的开关,AWG模式下,偏置必须打开,否则AWG输出保持为0.\n", " \n", " 'fcw': [100, 200, 300, 400], # MHz\n", " 'mcu_reg_clr': True,\n", " 'pcw': [0, 30, 45, 90, 120, 135, 150, 180], # Deg \n", " 'rz_ff_pha': 0,\n", " 'rz_fm_pha': 45,\n", " 'ff_amp': [32767, 32767, 32767, 32767],\n", " 'fm_amp': [32767, 32767, 32767, 32767],\n", " 'bias': [1, 2, 3, 4],\n", " 'fm_en' :False, #nco_fm的开关,在nco_fm模式时,必须打开,不然nco_fm不工作,就是一条直线. mod的模式下开启fm_en,同时打开nco,就能看到两个正弦波叠加啊\n", " 'instr_type': 'general_send_wait', #调用汇编搬移上面的数据到mcu_regfile,同时配合下面参数执行指令.AWG固定用这个模板,不用改。\n", " 'send_interval': [100, 150, 200, 250, 300, 350, 400,450,500],\n", " 'cycle_num': 1, #0代表无限循环,如果要想扫参,那么这个波形序列就不能无限循环播放\n", " 'codeword_configs': [\n", " # {'wave_hold': 1, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 0},\n", " # {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 0, 'env_index': 1},\n", " # {'wave_hold': 1, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 2},\n", " # {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 0, 'env_index': 3},\n", " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 4},\n", " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 5},\n", " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 6},\n", " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 7},\n", " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 8},\n", " ], \n", " 'sweep_config': {\n", " 'sweep_num': 0, # 外层循环:如果是0,则代表不扫参,该部分无效,只搬移一次的23个寄存器。如果是 1,代表重载1次寄存器(加上最初的那次,共两次).\n", " 'offsets': [0x78, 0x40], # 告诉硬件:本次扫描要修改哪几个寄存器的偏移地址,比如要重载2个寄存器,0x78 = AMPR0 (幅度), 0x40 = CWFR0 (频率) \n", " 'steps': [3000, int(100 / fs / 4 * 2 ** 32)] # 幅度每次 +3000;频率每次 100MHz (支持负数,Python会自动转32位补码给MCU) ,所以第一次载入是载入初始值,第二次就是原值+steps,第三次就是上一次的值+steps \n", " },\n", " 'envelope_configs': [ #包络配置\n", " {'envelope_type': 'rect_hold', 'amp': 32767},\n", " {'envelope_type': 'flattop_hold', 'amp': 32767, 'edge_time': 3.5, 'wave_time': 30},\n", " {'envelope_type': 'acz', 'amp': 32767, 'wave_time': 12 * 4},\n", " {'envelope_type': 'accz', 'wave_time': 12 * 4},\n", " {'envelope_type': 'cosine', 'amp': 32767, 'wave_time': 12 * 25},\n", " {'envelope_type': 'rect', 'amp': 32767, 'wave_time': 12},\n", " {'envelope_type': 'flattop', 'amp': 32767, 'edge_time': 2, 'wave_time': 22},\n", " ],\n", " 'FolderName': 'General',\n", " 'CaseName': 'env2',\n", "}\n", "run_case(param_ch0)\n", "\n", "#通道1\n", "param_ch1 = param_ch0.copy()\n", "param_ch1['channel'] = 1\n", "param_ch1['fcw'] = [200, 200, 300, 400]\n", "run_case(param_ch1)\n", "\n", "#通道2\n", "param_ch2 = param_ch0.copy()\n", "param_ch2['channel'] = 2\n", "param_ch2['fcw'] = [300, 200, 300, 400]\n", "run_case(param_ch2)\n", "\n", "#通道3\n", "param_ch3 = param_ch0.copy()\n", "param_ch3['channel'] = 3\n", "param_ch3['fcw'] = [400, 200, 300, 400]\n", "run_case(param_ch3)\n", "\n", "\n" ], "id": "3e79e12a64f2769e", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "执行 config_chip_reg\n", "执行了 env_config\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", "执行 config_chip_reg\n", "执行了 env_config\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", "执行 config_chip_reg\n", "执行了 env_config\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", "执行 config_chip_reg\n", "执行了 env_config\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n" ] } ], "execution_count": 40 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-28T09:50:35.917889Z", "start_time": "2026-07-28T09:50:35.900732Z" } }, "cell_type": "code", "source": [ "# RAMP 通用模板1\n", "#RAMP SPI控制\n", "param_ch0 = {\n", " 'channel' : 0,\n", " 'chip_mode': 'RAMP',\n", " 'ramp_ctrl':'SPI',\n", " 'fixed_enable': True, #是固定值还是斜坡模式\n", " 'fixed_value': 22767, #固定值模式生效\n", " 'height': 512, 'step_time': 34 , #斜坡模式生效 ,step_time就是台阶宽度\n", " \n", " 'FolderName': 'RAMP',\n", " 'CaseName': f\"RAMP_SPI\"\n", "}\n", "run_case(param_ch0,write_hw = True)\n", "\n", "#通道1\n", "param_ch1 = param_ch0.copy()\n", "param_ch1['channel'] = 1\n", "run_case(param_ch1,write_hw = True)\n", "\n", "#通道2\n", "param_ch2 = param_ch0.copy()\n", "param_ch2['channel'] = 2\n", "run_case(param_ch2,write_hw = True)\n", "\n", "#通道3\n", "param_ch3 = param_ch0.copy()\n", "param_ch3['channel'] = 3\n", "run_case(param_ch3,write_hw = True)\n" ], "id": "1f6f70a26d5da7f8", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "执行 config_chip_reg\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", "执行 config_chip_reg\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", "执行 config_chip_reg\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", "执行 config_chip_reg\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n" ] } ], "execution_count": 36 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-28T09:26:33.012700Z", "start_time": "2026-07-28T09:26:32.989301Z" } }, "cell_type": "code", "source": [ "#RAMP MCU控制时,斜坡模式\n", "param_ch0 = {\n", " 'channel' : 0 ,\n", " 'chip_mode': 'RAMP',\n", " 'ramp_ctrl':'MCU',\n", " #是固定值还是斜坡模式,如过是斜坡模式,则要指令选ramp_step\n", " 'instr_type': 'ramp_step', #可选ramp_step或ramp_fixed. mcu执行不同指令操作模板,实现台阶或斜坡这两种模式\n", " 'ensemble_num' : 2, #大循环次数\n", " 'param_num' :2, # 循环中参数个数,和列表个数一致\n", " 'height': [128,256], \n", " 'step_time': [50,50], \n", " \n", " 'FolderName': 'RAMP',\n", " 'CaseName': f\"RAMP_MCU_STEP\"\n", "}\n", "\n", "run_case(param_ch0,write_hw = True)\n", "\n", "#通道1\n", "param_ch1 = param_ch0.copy()\n", "param_ch1['channel'] = 1\n", "run_case(param_ch1,write_hw = True)\n", "\n", "#通道2\n", "param_ch2 = param_ch0.copy()\n", "param_ch2['channel'] = 2\n", "run_case(param_ch2,write_hw = True)\n", "\n", "#通道3\n", "param_ch3 = param_ch0.copy()\n", "param_ch3['channel'] = 3\n", "run_case(param_ch3,write_hw = True)" ], "id": "84e2c612b0a8f7ab", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "执行 config_chip_reg\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", "执行 config_chip_reg\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", "执行 config_chip_reg\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", "执行 config_chip_reg\n", "执行了 instruction_config\n", "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n" ] } ], "execution_count": 26 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-28T09:51:30.781841Z", "start_time": "2026-07-28T09:51:30.762192Z" } }, "cell_type": "code", "source": [ "#RAMP MCU控制时,固定值模式\n", "param_ch0 ={\n", " 'channel' : 0,\n", " 'chip_mode': 'RAMP',\n", " 'ramp_ctrl':'MCU',\n", " #是固定值还是斜坡模式,如果是固定值模式,则指令选ramp_fixed\n", " 'instr_type': 'ramp_fixed', #可选ramp_step或ramp_fixed. mcu执行不同指令操作模板,实现台阶或斜坡这两种模式\n", " 'fixed_value': [1<<15] + [1<<15 | 1<