Chip_Case_Generator/4ch-Z_Generator/FourChZCaseGenerator.ipynb

494 lines
21 KiB
Plaintext
Raw Permalink 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
}