1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1.5ビットパイプラインADCのデジタル演算による2進数ビット生成と再生波形の表示

Last updated at Posted at 2025-03-13

image.png

1.5ビットパイプラインADCを再現したい。。。。。。。

1.5ビットパイプラインADCのデジタル演算による2進数ビット生成

本記事では、1.5ビットパイプラインADC(Pipeline Analog-to-Digital Converter, ADC)のデジタル演算を用いた2進数のビット生成について解説します。
1.5ビットパイプラインADCは、一般的な高精度ADC設計で広く使用される構造であり、冗長符号化を活用して比較器の誤差を補正できる利点があります。


スクリーンショットを参考にして、MATLAB Simulink で再現してください。

image.png
image.png

image.png

image.png

image.png

image.png

使った 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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?