1.5ビットパイプラインADCを再現したい。。。。。。。
1.5ビットパイプラインADCのデジタル演算による2進数ビット生成
本記事では、1.5ビットパイプラインADC(Pipeline Analog-to-Digital Converter, ADC)のデジタル演算を用いた2進数のビット生成について解説します。
1.5ビットパイプラインADCは、一般的な高精度ADC設計で広く使用される構造であり、冗長符号化を活用して比較器の誤差を補正できる利点があります。
スクリーンショットを参考にして、MATLAB Simulink で再現してください。
使った MATLAB Functionコード
function [D1, D2, Vout] = process_input(Vin, VREF)
% 入力電圧 Vin に基づき、D1, D2, Vout を決定する MATLAB 関数
%
% 入力:
% Vin - 入力電圧
% VREF - 参照電圧 (デフォルト: 10V)
%
% 出力:
% D1 - 判定ビット1 (0 または 1)
% D2 - 判定ビット2 (0 または 1)
% Vout - 処理後の出力電圧
% しきい値の計算 (誤差を考慮)
threshold1 = (3/8) * VREF;
threshold2 = (5/8) * VREF;
eps = 1e-12; % 浮動小数点誤差対策
% 条件に基づく判定 (誤差を考慮)
if Vin < threshold1 - eps
D1 = 0;
D2 = 0;
Vout = 2 * Vin;
elseif (threshold1 - eps <= Vin) && (Vin < threshold2 - eps)
D1 = 0;
D2 = 1;
Vout = 2 * Vin - VREF / 2;
else % Vin >= threshold2 - eps
D1 = 1;
D2 = 0;
Vout = 2 * Vin - VREF;
end
end
function [Sum, Carry] = half_adder(A, B)
% 半加算器 (Half Adder) の MATLAB Function
% 入力: A, B (1ビット入力)
% 出力: Sum, Carry (1ビット出力)
% Sum の計算 (XOR)
Sum = xor(A, B);
% Carry の計算 (AND)
Carry = A & B;
end
function [Sum, Carry] = full_adder(A, B, Cin)
% 全加算器 (Full Adder) の MATLAB Function
% 入力: A, B, Cin (1ビット入力)
% 出力: Sum, Carry (1ビット出力)
% Sum の計算 (3入力XOR)
Sum = xor(xor(A, B), Cin);
% Carry の計算 (ANDとORの組み合わせ)
Carry = (A & B) | (B & Cin) | (Cin & A);
end
function decimal_out = binary_to_decimal(b5, b4, b3, b2, b1, b0)
% 6ビットの2進数を10進数に変換する MATLAB Function
%
% 入力:
% b5, b4, b3, b2, b1, b0 - 各ビット (0 または 1 のスカラー値)
% 出力:
% decimal_out - 10進数の値 (0 ~ 63)
% 出力の型とサイズを明示的に定義
decimal_out = int32(0); % Simulink が出力型を認識できるように初期化
% 6ビットの2進数を10進数に変換
decimal_out = int32((b5 * 2^5) + (b4 * 2^4) + (b3 * 2^3) + (b2 * 2^2) + (b1 * 2^1) + (b0 * 2^0));
end
今回は簡略化のため、パイプラインADCのサンプルホールドクロック信号を考慮せずに設計したので、DFFも除いています。この点については、機会があれば別の記事で詳しく解説する予定です。なお、1段目のパイプラインがサンプルモードのとき、2段目のパイプラインがホールドモードになるため、構成が複雑になりやすいです。詳しく知りたい方のために参考文献を掲載しておくので、そちらもぜひご参照ください。
function [Sum, Carry] = half_adder(A, B)
% 半加算器 (Half Adder) の MATLAB Function
% 入力: A, B (double型、1ビット入力)
% 出力: Sum, Carry (double型、1ビット出力)
% 閾値0.5で0または1に変換する
% 入力A, Bを閾値0.5で0または1に変換
A = double(A > 0.5); % Aが0.5より大きければ1、そうでなければ0
B = double(B > 0.5); % Bが0.5より大きければ1、そうでなければ0
% Sum の計算 (XOR)
Sum = double(xor(A, B)); % XOR演算の結果をdouble型に変換
% Carry の計算 (AND)
Carry = double(A & B); % AND演算の結果をdouble型に変換
end
function [Sum, Carry] = full_adder(A, B, Cin)
% 全加算器 (Full Adder) の MATLAB Function
% 入力: A, B, Cin (double型、1ビット入力)
% 出力: Sum, Carry (double型、1ビット出力)
% 閾値0.5で0または1に変換する
% 入力A, B, Cinを閾値0.5で0または1に変換
A = double(A > 0.5); % Aが0.5より大きければ1、そうでなければ0
B = double(B > 0.5); % Bが0.5より大きければ1、そうでなければ0
Cin = double(Cin > 0.5); % Cinが0.5より大きければ1、そうでなければ0
% Sum の計算 (3入力XOR)
Sum = double(xor(xor(A, B), Cin)); % XOR演算の結果をdouble型に変換
% Carry の計算 (ANDとORの組み合わせ)
Carry = double((A & B) | (B & Cin) | (Cin & A)); % ANDとOR演算の結果をdouble型に変換
end