Chip_Case_Generator/4ch-Z_Generator/FourChZCaseGenerator.ipynb

494 lines
21 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 44,
"id": "initial_id",
"metadata": {
"ExecuteTime": {
"end_time": "2026-07-29T03:01:52.429375Z",
"start_time": "2026-07-29T03:01:52.309686Z"
},
"collapsed": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n"
]
}
],
"source": [
"%load_ext autoreload\n",
"%autoreload 2\n",
"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",
"# 确定最终输出目录,每次使用前必须明确目录!\n",
"base_dir = Path('D:\\\\recent_work\\\\四通道造case\\\\4ch-Z_Generator\\\\gen_cases') # 在这边选择case目录所在位置\n",
"\n",
"def run_case(params):\n",
" \"\"\"\n",
" 通用执行函数:自动判断模式并按需调用 configure_chip_output, env_config, instruction_config\n",
" \"\"\"\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",
"\n",
" # 基础芯片输出配置\n",
" config_chip_reg(mk, **params)\n",
" print(\"执行 config_chip_reg\")\n",
" \n",
" # 自动识别并执行包络配置\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",
" # 自动识别并执行指令配置\n",
" if 'instr_type' in params:\n",
" instruction_config(mk, mk_instr, **params)\n",
" print(\"执行了 instruction_config\")\n",
" \n",
" \n",
" # 保证存储器不用的时候不为空, 防止报错\n",
" channel = params['channel']\n",
" envm_base =addr_base['ENVM0_BASE'] + channel* 0x600000\n",
" itcm_base = addr_base['ITCM0_BASE'] + channel* 0x600000\n",
" envelope_configs = params.get('envelope_configs', None)\n",
" if envelope_configs is None:\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"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "3e79e12a64f2769e",
"metadata": {
"ExecuteTime": {
"end_time": "2026-07-29T03:02:19.226590Z",
"start_time": "2026-07-29T03:02:19.100355Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n"
]
}
],
"source": [
"#general_send_wait这个汇编模板的 SEND_WAIT效果示例。\n",
"#单通道 AWG通用模板\n",
"param_ch0 = {\n",
" 'channel' : 0,\n",
" 'chip_mode':'AWG', #分为AWG和RAMP模式\n",
" 'mode':'env', #可选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': [500, 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': 'TC_AWG_ENV_TYPE_9',\n",
"}\n",
"# ==========================================\n",
"#在运行前,先删除旧的 HEX 文件,防止重复运行追加到case文件中\n",
"#base_dir = Path('D:\\\\recent_work\\\\四通道造case\\\\4ch-Z_Generator\\\\gen_cases') 已在最上面指定路径\n",
"out_dir = base_dir / param_ch0['FolderName']\n",
"hex_file = out_dir / f\"{param_ch0['CaseName']}_HEX.txt\"\n",
"# 如果上一次运行的旧文件还在,就把它删掉\n",
"if hex_file.exists():\n",
" hex_file.unlink()\n",
"# ==========================================\n",
"run_case(param_ch0)\n",
"\n",
"#通道1\n",
"param_ch1 = param_ch0.copy()\n",
"param_ch1['channel'] = 1\n",
"param_ch1['fcw'] = [600, 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'] = [700, 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'] = [800, 200, 300, 400]\n",
"run_case(param_ch3)\n",
"\n",
"# ==========================================\n",
"#参数打包到json里面\n",
"out_dir = Path(param_ch0['config_file']).parent \n",
"case_name = param_ch0['CaseName']\n",
"all_params = {\n",
" \"ch0\": param_ch0,\n",
" \"ch1\": param_ch1,\n",
" \"ch2\": param_ch2,\n",
" \"ch3\": param_ch3\n",
"}\n",
"pm = ParamsManager(out_dir)\n",
"pm.save(all_params, case_name)\n",
"# ==========================================\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "1f6f70a26d5da7f8",
"metadata": {
"ExecuteTime": {
"end_time": "2026-07-29T03:17:00.368454Z",
"start_time": "2026-07-29T03:17:00.270114Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"执行 config_chip_reg\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_H512_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_H512_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_H512_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_H512_STEP64_HEX.txt\n"
]
}
],
"source": [
"# RAMP 通用模板1\n",
"#RAMP SPI控制\n",
"param_ch0 = {\n",
" 'channel' : 0,\n",
" 'chip_mode': 'RAMP',\n",
" 'ramp_ctrl':'SPI',\n",
" 'fixed_enable': False, #是固定值还是斜坡模式\n",
" 'fixed_value': 22767, #固定值模式生效\n",
" 'height': 512, 'step_time': 64 , #斜坡模式生效 ,step_time就是台阶宽度\n",
" \n",
" 'FolderName': 'RAMP',\n",
" 'CaseName': f\"RAMP_SPI_H512_STEP64\"\n",
"}\n",
"# ==========================================\n",
"#在运行前,先删除旧的 HEX 文件,防止重复运行追加到case文件中\n",
"#base_dir = Path('D:\\\\recent_work\\\\四通道造case\\\\4ch-Z_Generator\\\\gen_cases') 已在最上面指定路径\n",
"out_dir = base_dir / param_ch0['FolderName']\n",
"hex_file = out_dir / f\"{param_ch0['CaseName']}_HEX.txt\"\n",
"# 如果上一次运行的旧文件还在,就把它删掉\n",
"if hex_file.exists():\n",
" hex_file.unlink()\n",
"# ==========================================\n",
"run_case(param_ch0)\n",
"\n",
"#通道1\n",
"param_ch1 = param_ch0.copy()\n",
"param_ch1['channel'] = 1\n",
"run_case(param_ch1)\n",
"\n",
"#通道2\n",
"param_ch2 = param_ch0.copy()\n",
"param_ch2['channel'] = 2\n",
"run_case(param_ch2)\n",
"\n",
"#通道3\n",
"param_ch3 = param_ch0.copy()\n",
"param_ch3['channel'] = 3\n",
"run_case(param_ch3)\n",
"# ==========================================\n",
"#参数打包到json里面\n",
"out_dir = Path(param_ch0['config_file']).parent \n",
"case_name = param_ch0['CaseName']\n",
"all_params = {\n",
" \"ch0\": param_ch0,\n",
" \"ch1\": param_ch1,\n",
" \"ch2\": param_ch2,\n",
" \"ch3\": param_ch3\n",
"}\n",
"pm = ParamsManager(out_dir)\n",
"pm.save(all_params, case_name)\n",
"# ==========================================\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "84e2c612b0a8f7ab",
"metadata": {
"ExecuteTime": {
"end_time": "2026-07-29T03:17:02.737072Z",
"start_time": "2026-07-29T03:17:02.628758Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"执行 config_chip_reg\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_MCU_STEP_H128_256_512_1024_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_MCU_STEP_H128_256_512_1024_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_MCU_STEP_H128_256_512_1024_STEP64_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_MCU_STEP_H128_256_512_1024_STEP64_HEX.txt\n"
]
}
],
"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",
"\n",
" 'param_num' :4, # ramp_step模式生效,参数个数\n",
" 'height': [128,256,512,1024], #ramp_step模式生效,台阶高度 \n",
" 'step_time': [64,64,64,64], #ramp_step模式生效,台阶宽度 \n",
"\n",
" 'config_param_num' : 4, #ramp_fixed固定值模式生效,固定值参数个数,和列表个数一致\n",
" 'fixed_value':[10000,20000,30000,40000], #ramp_fixed固定值模式生效,固定值\n",
" 'wait_clk' :[300, 300, 300, 300], #ramp_fixed固定值模式生效,等待时钟数\n",
" \n",
" 'FolderName': 'RAMP',\n",
" 'CaseName': f\"RAMP_MCU_STEP_H128_256_512_1024_STEP64\"\n",
"}\n",
"# ==========================================\n",
"#在运行前,先删除旧的 HEX 文件,防止重复运行追加到case文件中\n",
"#base_dir = Path('D:\\\\recent_work\\\\四通道造case\\\\4ch-Z_Generator\\\\gen_cases') 已在最上面指定路径\n",
"out_dir = base_dir / param_ch0['FolderName']\n",
"hex_file = out_dir / f\"{param_ch0['CaseName']}_HEX.txt\"\n",
"# 如果上一次运行的旧文件还在,就把它删掉\n",
"if hex_file.exists():\n",
" hex_file.unlink()\n",
"# ==========================================\n",
"run_case(param_ch0)\n",
"\n",
"#通道1\n",
"param_ch1 = param_ch0.copy()\n",
"param_ch1['channel'] = 1\n",
"run_case(param_ch1)\n",
"\n",
"#通道2\n",
"param_ch2 = param_ch0.copy()\n",
"param_ch2['channel'] = 2\n",
"run_case(param_ch2)\n",
"\n",
"#通道3\n",
"param_ch3 = param_ch0.copy()\n",
"param_ch3['channel'] = 3\n",
"run_case(param_ch3)\n",
"\n",
"# ==========================================\n",
"#参数打包到json里面\n",
"out_dir = Path(param_ch0['config_file']).parent \n",
"case_name = param_ch0['CaseName']\n",
"all_params = {\n",
" \"ch0\": param_ch0,\n",
" \"ch1\": param_ch1,\n",
" \"ch2\": param_ch2,\n",
" \"ch3\": param_ch3\n",
"}\n",
"pm = ParamsManager(out_dir)\n",
"pm.save(all_params, case_name)\n",
"# =========================================="
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "4d17f59a15077bb1",
"metadata": {
"ExecuteTime": {
"end_time": "2026-07-29T02:47:57.908778Z",
"start_time": "2026-07-29T02:47:57.796222Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"执行 config_chip_reg\n",
"执行了 env_config\n",
"执行了 instruction_config\n",
"生成文件路径:D:\\recent_work\\四通道造case\\4ch-Z_Generator\\gen_cases\\General\\TC_AWG_ENV_TYPE_9_HEX.txt\n",
"Case 还原完成!\n"
]
}
],
"source": [
"#通过json还原case脚本\n",
"# ==========================================\n",
"# 1. 定义你要还原的 Case 信息\n",
"# ==========================================\n",
"#base_dir = Path('D:\\\\recent_work\\\\四通道造case\\\\4ch-Z_Generator\\\\gen_cases') # 在这边选择case目录所在位置\n",
"folder_name = 'General' # 填入你要还原的文件夹名\n",
"case_name = 'TC_AWG_ENV_TYPE_9' # 填入你要还原的 Case 名字\n",
"out_dir = base_dir / folder_name\n",
"\n",
"# ==========================================\n",
"# 2. 实例化 ParamsManager 并加载 JSON\n",
"# ==========================================\n",
"pm = ParamsManager(out_dir)\n",
"# load 方法会返回你之前保存的包含 ch0, ch1, ch2, ch3 的大字典\n",
"loaded_params = pm.load(case_name) \n",
"\n",
"# ==========================================\n",
"# 3. 还原前先清理旧的 HEX 文件(防止重复追加)\n",
"# ==========================================\n",
"hex_file = out_dir / f\"{case_name}_HEX.txt\"\n",
"if hex_file.exists():\n",
" hex_file.unlink()\n",
"\n",
"# ==========================================\n",
"# 4. 遍历 JSON 数据,依次执行 run_case 还原\n",
"# ==========================================\n",
"# 为了保证顺序,我们按 ch0 到 ch3 的顺序遍历\n",
"for ch_key in ['ch0', 'ch1', 'ch2', 'ch3']:\n",
" if ch_key in loaded_params:\n",
" ch_param = loaded_params[ch_key]\n",
" \n",
" \n",
" # 将读取到的参数直接塞进 run_case。\n",
" # 此时不需要再保存 json (save_json=False),但需要写入硬件文本 (write_hw=True)\n",
" run_case(ch_param)\n",
"\n",
"print(\"Case 还原完成!\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}