SOC_600

本文介绍了如何利用CXDT作为外部调试代理,通过DP或APB奴隶来模拟功能I/O上的调试。主要内容涉及CXDT在FPGA开发中的应用,包括作为自我托管调试代理通过处理器内存映射进行操作,以及在Arm CorSight验证中对基于ARMV6架构的CXDT仿真器平台的使用。验证过程包括生成CXDT_bin文件、配置cxdt.yml、连接仿真器与顶层pin接口、宏定义选择仿真器或JTAG接口,并启动环境进行仿真验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CXDT 

Acting as an external debug agent through the DP, or directly to an APB slave (mimicking debug over functional I/O). 

CPU 

Acting as a self-hosted debug agent through the processors memory map. 

       将调试激励驱动到调试端口或 APB 功能 I/O 接口。当您在 CXDT 上运行测试时,Makefile.CXDT 生成的测试代码图像被加载到 CXDT 中。 CXDT 将测试状态和结果直接写入 Verilog 仿真输出。 

打开波形命令:verdi -simflow -simBin simv 

加载波形命令 

fsdbAutoSwitchDumpfile 1000 "waves.fsdb" 10 

fsdbDumpvars 0 "tbench" 

run 

1、Arm 的corsight验证基于ARMV6架构的CXDT仿真器平台主要对soc里面的soc_600以及相应的关于debug、trace、trigger组件进行仿真验证。

主要环境如下组成:

1)CXDT仿真器,生成CXDT_bin文件

/css600/logical/testbench/

生成的文件夹 CXDT所需要的CXDT.bin文件

2)在$DB_PATH/socdie/chiptop/sim/testcases/jtag/添加一个cxdt.yml,其中的cxdtbinname指向生成的bin文件路径。

cxdt.yml

  1. 在tb_top.sv里面加入cxdt_include.svi文件

4、cxdt_include.s

``` % 铅酸电池仿真模型(改进版) % 🌟 1.建立OCV-SOC查找表 SOC_lut = 0:0.01:1; V_oc_lut = arrayfun(@(soc) 12 + 0.1*soc + 0.01*(T-25), SOC_lut); % 🌟 2.开路电压法初始化SOC V_initial = 12.05; % 假设测得的静置电压 SOC_0 = interp1(V_oc_lut, SOC_lut, V_initial, 'nearest'); % 查表初始化 % 参数定义 Q_max = 50; R0 = 0.01; Rp = 0.005; Cp = 2000; T = 25; aging_factor = 0.0001; cycle_count = 0; % 🌟 3.卡尔曼滤波参数 Q_kf = diag([1e-6, 1e-6]); % 过程噪声协方差 R_kf = 1e-4; % 观测噪声方差 P_kf = diag([0.1, 0.1]); % 初始估计协方差 x_kf = [SOC_0; 0]; % 初始状态[SOC; V_p] % 仿真设置 t_end = 3600; dt = 1; t = 0:dt:t_end; I = 5*(1 + 0.5*sin(2*pi*t/600)); % 🌟动态工况示例 % 初始化变量 SOC_true = zeros(size(t)); SOC_est = zeros(size(t)); V_bat = zeros(size(t)); resting_time = 0; % 主循环 SOC_true(1) = SOC_0; SOC_est(1) = SOC_0; for k = 1:length(t)-1 % 老化参数更新 R0_aged = R0 + aging_factor*cycle_count*0.001; Q_max_aged = Q_max - aging_factor*cycle_count*0.1; % 🌟 4.静置状态检测 if I(k) == 0 resting_time = resting_time + dt; if resting_time > 5*Rp*Cp % 极化电容充分放电 SOC_est(k) = interp1(V_oc_lut, SOC_lut, V_bat(k), 'nearest'); x_kf(1) = SOC_est(k); % 强制更新卡尔曼状态 end else resting_time = 0; end % 🌟 卡尔曼滤波预测 F = [1, 0; 0, 1-dt/(Rp*Cp)]; B = [-dt/(Q_max_aged*3600); dt/Cp]; x_prior = F*x_kf + B*I(k); P_prior = F*P_kf*F' + Q_kf; % 卡尔曼滤波更新 H = [0.1, -1]; % OCV-SOC斜率0.1V/% z_pred = 12 + 0.1*x_prior(1) + 0.01*(T-25) - I(k)*R0_aged - x_prior(2); K = P_prior*H'/(H*P_prior*H' + R_kf); x_kf = x_prior + K*(V_bat(k) - z_pred); P_kf = (eye(2)-K*H)*P_prior; % 真实模型更新 SOC_true(k+1) = SOC_true(k) - I(k)*dt/(Q_max_aged*3600); V_p_next = (V_bat(k) - (12 + 0.1*SOC_true(k) + 0.01*(T-25)) + I(k)*R0_aged); V_bat(k+1) = 12 + 0.1*SOC_true(k+1) + 0.01*(T-25) - I(k)*R0_aged - V_p_next; % 保存估计值 SOC_est(k+1) = x_kf(1); % 循环计数逻辑 if SOC_true(k) < 0.2 && SOC_true(k+1) >= 0.8 cycle_count = cycle_count + 1; end end % 可视化结果 figure; subplot(3,1,1); plot(t, V_bat, 'b', 'LineWidth',1.5); title('电池端电压'); xlabel('时间(s)'); ylabel('电压(V)'); subplot(3,1,2); plot(t, SOC_true*100, 'r--', t, SOC_est*100, 'b', 'LineWidth',1.5); legend('真实SOC','估计SOC'); title('SOC估计对比'); xlabel('时间(s)'); ylabel('SOC(%)'); subplot(3,1,3); plot(t, I, 'g', 'LineWidth',1.5); title('动态工况电流'); xlabel('时间(s)'); ylabel('电流(A)');```给我完整的代码
03-24
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值