静态失调电压(static offset voltage)
主要影响因素:μCox(载流子传输速率和栅氧层电容的的乘积)、阈值电压。
静态失配方差与器件尺寸成反比,可以增大关键对mos管的尺寸
动态失调电压(dynamic offset voltage)
主要影响因素:寄生电容。
主要由于寄生电容的相对失配(▲C/C)而不是绝对失配(▲C),所以可以考虑增大C降低失调电压,故而可以增大输出节点的电容。
仿真获取Voffset的方式
- 开环用monte carlo仿真获得
Eg:固定同相端INP电压值,改变反向端INN的输入电压,选择比较器为失配的器件,每个INN的电压值进行100次MC仿真,统计输出电压超过的数量,画出scurve,sigma即为Voffset。
- 闭环利用单位增益缓冲器获得:
参考:
差分运放输入失调分析 - Analog/RF IC 设计讨论 - EETOP 创芯网论坛 (原名:电子顶级开发网) -
Analyses of Static and Dynamic Random Offset Voltages in Dynamic Comparators
Analyze the code of Scurve
% 定义文件名
filename = 'E:......';
% 读取数据,添加错误处理
try
% 将第一行数据作为变量名
dataTable = readtable(filename, 'VariableNamesLine', 1);
catch ME
fprintf('读取文件时出错: %s\n', ME.message);
return;
end
% 获取除第一列外所有列的变量名作为曲线名称
curve_names = dataTable.Properties.VariableNames(2:4);
% 调试信息:打印 curve_names 的内容
disp('曲线名称内容:');
disp(curve_names);
% 去除第一行(如果第一行是变量名,这里不需要去除)
% dataTable = dataTable(2:end, :);
% 打印数据表格内容
disp('数据表格内容:');
disp(dataTable);
% 获取阈值电压(第一列)
threshold_voltage = dataTable{:, 1};
% 初始化sigma和mu的数组
num_cols = size(dataTable, 2);
sigma_values = zeros(1, num_cols - 1);
mu_values = zeros(1, num_cols - 1);
% 检查 curve_names 的长度是否和要处理的列数匹配
if length(curve_names) ~= num_cols - 1
error('曲线名称数量与要处理的列数不匹配,请检查数据。');
end
% 创建图形对象
figure;
hold on;
% 定义S曲线拟合目标函数
s_curve = @(p, x) 0.5 * (1 + erf((x - p(1)) / (p(2) * sqrt(2))));
% 创建一个拟合类型对象
ft = fittype('0.5 * (1 + erf((x - b) / (a * sqrt(2))))', 'independent', 'x', 'dependent', 'y');
% 遍历每一列数据进行拟合
for i = 2:num_cols
% 获取当前列的计数数据并转化为概率
counts = dataTable{:, i};
% 检查数据是否有NaN或Inf值
valid_idx = ~isnan(threshold_voltage) & ~isnan(counts) & ~isinf(threshold_voltage) & ~isinf(counts);
threshold_voltage_valid = threshold_voltage(valid_idx);
counts_valid = counts(valid_idx);
% 确保数据行数相同
if length(threshold_voltage_valid) ~= length(counts_valid)
error('第 %d 列数据处理后行数不一致,请检查数据。', i);
end
% 初始化参数:a为标准差的初始猜测值,b为均值的初始猜测值
initial_mu = mean(threshold_voltage_valid); % 使用有效数据的平均值作为初始均值
initial_sigma = std(threshold_voltage_valid) / 2; % 使用有效数据标准差除以2作为初始标准差
opts = fitoptions(ft);
opts.StartPoint = [initial_sigma, initial_mu]; % 设置初始猜测值
% 拟合数据
[fitted_curve, gof] = fit(threshold_voltage_valid, counts_valid, ft, opts);
% 检查拟合结果是否合理
if ~isempty(fitted_curve) && ~isnan(fitted_curve.a) && ~isnan(fitted_curve.b)
% 获取拟合参数
sigma_ke = round(fitted_curve.a, 4); % sigma的值,单位为keV,保留四位小数
mu_ke = round(fitted_curve.b, 4); % mu的值,单位为keV,保留四位小数
else
fprintf('第 %d 列拟合失败,使用初始参数代替。\n', i);
sigma_ke = initial_sigma;
mu_ke = initial_mu;
end
% 存储拟合参数
sigma_values(i - 1) = sigma_ke;
mu_values(i - 1) = mu_ke;
% 计算拟合曲线值
f_values = s_curve([mu_ke, sigma_ke], threshold_voltage_valid);
% 绘制原始散点图,圆圈变小
%scatter(threshold_voltage_valid, counts_valid, 10, 'o', 'LineWidth', 1.5, 'DisplayName', [curve_names{i-1}, ' - Data']);
% 绘制拟合曲线
plot(threshold_voltage_valid, f_values, 'LineWidth', 2, 'DisplayName', [curve_names{i-1}, ' - Fit']);
end
% 设置坐标轴标签和标题
xlabel('Threshold Voltage (mV)', 'FontSize', 16);
ylabel('Probability', 'FontSize', 16);
title('S-Curve Fitting for All mos', 'FontSize', 20);
% 显示图例
legend('FontSize', 12, 'Location', 'best');
grid on;
hold off;
% 设置字体大小
ax = gca;
ax.FontSize = 16;
% 设定合适的尺寸和分辨率
set(gcf, 'PaperUnits', 'inches');
set(gcf, 'PaperPosition', [0 0 8 6]); % 宽度设置为8英寸,高度为6英寸
set(gcf, 'PaperSize', [8 6]); % 限制导出的PDF或EPS的页面大小
% 导出为PDF
print(gcf, 'E:.......', '-dpdf');
% 创建一个新的图形对象,用于绘制sigma和mu值
figure;
subplot(2, 1, 1);
plot(2:num_cols, sigma_values, 'o-', 'LineWidth', 1.5);
xlabel('Data pix Index', 'FontSize', 16);
ylabel('Sigma (mV)', 'FontSize', 16);
title('Sigma Values for Each mos', 'FontSize', 20);
grid on;
ax = gca;
ax.FontSize = 16;
subplot(2, 1, 2);
plot(2:num_cols, mu_values, 'o-', 'LineWidth', 1.5);
xlabel('Data pix Index', 'FontSize', 16);
ylabel('Mu (mV)', 'FontSize', 16);
title('Mu Values for Each mos', 'FontSize', 20);
grid on;
ax = gca;
ax.FontSize = 16;
% 设定合适的尺寸和分辨率
set(gcf, 'PaperUnits', 'inches');
set(gcf, 'PaperPosition', [0 0 8 12]); % 宽度设置为8英寸,高度为12英寸
set(gcf, 'PaperSize', [8 12]); % 限制导出的PDF或EPS的页面大小
% 导出为PDF
print(gcf, 'E:\PLAC_chip\CEE\CEE_v4\sigma_mu_values_nmos_all', '-dpdf');
print(sigma)
% 保存拟合参数到文件
T = table(sigma_values', mu_values', 'VariableNames', {'Sigma', 'Mu'});
writetable(T, 'E:.....');
不足之处恳请各位大佬指正,欢迎交流探讨,感谢指导!