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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b2017865-2c7d-4c38-9ec3-ac409b1a3a98.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/4bf1d971-8811-4c7a-9fef-3fb5e8469cc0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/e87e5c02-8ded-4d6b-b0af-87cd57df138a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/4bdb6051-af4a-4220-8567-32e4187bee6e.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/1f7f4570-0de5-4a3a-9cdf-1c18692f9bc7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/d2da9a07-3c81-46c4-81d6-1a8c976387cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/079576d2-5764-4c99-85d4-5ccba1737961.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段目のパイプラインがホールドモードになるため、構成が複雑になりやすいです。詳しく知りたい方のために参考文献を掲載しておくので、そちらもぜひご参照ください。

https://www.amazon.co.jp/%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E5%A4%89%E6%8F%9B%E5%85%A5%E9%96%80-%E5%8E%9F%E7%90%86%E3%81%A8%E5%9B%9E%E8%B7%AF%E5%AE%9F%E8%A3%85-%E5%92%8C%E4%BF%9D-%E5%AD%9D%E5%A4%AB/dp/4339009180


https://www.amazon.co.jp/LSI%E8%A8%AD%E8%A8%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AECMOS%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E5%9B%9E%E8%B7%AF%E5%85%A5%E9%96%80-%E5%8D%8A%E5%B0%8E%E4%BD%93%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%B0%B7%E5%8F%A3-%E7%A0%94%E4%BA%8C/dp/4789830373/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2K6RJZ63PPIQW&dib=eyJ2IjoiMSJ9.QpfSccy6pSGxFNKw5DHoX6Y1tGCRA6Rnbezul_-TLMtIrqeq-Gv2IdR8t_iqnXJ4cUyp0Zhk4uu-bSQgfqT0ZulMEKJ0Kyzl8k4HW9kyoID2vAAy7tWz8bCE82lNWVEg52LE7VmBjddvrvtisWJ-1nD3UPDOB9q7ua8qwDgNqoZi6xv3mTmUvAfRpGp-RUYbzpQE4amtenmES0Aj2f5GkKYjoXu6_XPVyy4hT88S-L0._yF-TqoBqkPc67TKI3o8HUNCx8D5gG1Er1OK9tPUAuk&dib_tag=se&keywords=CMOS%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E5%9B%9E%E8%B7%AF&qid=1741873642&s=books&sprefix=cmos%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E5%9B%9E%E8%B7%AF%2Cstripbooks%2C153&sr=1-1




```

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

```