Post

使用Verilog-A實作MASH1–1–1 ΔΣ Modulator

使用Verilog-A實作MASH1–1–1 ΔΣ Modulator

在Fractional PLL電路中會需要使用 ΔΣ Modulator(DSM)來調製分數除數,本文將會使用Verilog-A實作一個MASH1-1-1架構的DSM,可以直接執行在Hspice或是Spectre環境上加速類比驗證,並簡單描述其運作原理。

1.First Order ΔΣ Modulator

基本的一階DSM可以表示成底下的方塊圖,主要由離散積分器與量化器構成,將量化後的訊號v1與輸入訊號y相減後送回積分器,形成一階的DSM架構,而量化雜訊e1是量化器在量化的過程中產生的,並不是額外加入的雜訊,若想提取e1可以把輸出與輸入量化器的訊號進行相減後獲得。

Desktop Vew

透過推導可以得到輸出端v1的Signal Transfer Function(STF)與Noise Transfer Function(NTF),而Noise shaping正是由(1-z^-1)提供,因為NTF的零點正好落在z-plane z=1也就是頻率為0Hz的位置,故以+20dB/dec的斜率把量化雜訊往高頻方向推移。

\[\Large v_1 = \underbrace{z^{-1}}_{STF} \cdot y+ \underbrace{(1 - z^{-1})}_{NTF} \cdot e_1\]

接著使用Verilog-A描述一階DSM,寫成以下程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//================================DSM1
   
   INTG1_1=Y1-V1;
   INTG1_2=INTG1_1+INTG1_2;

   if(INTG1_2>(FS/2)) begin 
    V1=FS;
    V1D=1;
   end else begin
    V1=0;
    V1D=0;
   end
   
   Y2=V1-INTG1_2;

其中,FS是Full Scale 大小,INTG1_1與INTG1_2表示積分器的輸入與輸出端,if(INTG1_2>(FS/2))則是量化器,若判斷式成立則表示積分器輸出大於FS/2,故量化器輸出邏輯1或是Full scale,否則輸出0,筆者在這裡把1bit訊號V1D與回授給y的訊號V1分開使用兩個變數儲存。

2.MASH1–1–1 ΔΣ Modulator

Multi-stage noise shaping(MASH)能提供比一階DSM更好的Noise shaping能力,而MASH1-1-1表示使用三個1階DSM實現具有三階Noise shaping的架構,以下是基本的架構圖。

Desktop Vew

y1設定為8bit數位輸入,前兩個一階DSM都把量化雜訊e1,e2當成下一級DSM的輸入,最後再將三個DSM的輸出v1,v2,v3透過雜訊消除電路加總後獲得3bit最終輸出U。若想要結合Fractional PLL,則3bit U輸出就可以接去除頻器產生小數除數。

為了推導輸出U的轉移函數,證明其具有三階Noise shaping能力,首先列出v1,v2,v3節點的轉移函數,也就是三個1階DSM

\[\Large v_1 = z^{-1} \cdot y_1 + (1 - z^{-1}) \cdot e_1\] \[\Large v_2 = z^{-1} \cdot e_1 + (1 - z^{-1}) \cdot e_2\] \[\Large v_3 = z^{-1} \cdot e_2 + (1 - z^{-1}) \cdot e_3\]

接著列出雜訊消除電路的轉移函數u1與u2,這邊u2與U相同,為最終輸出,把v2通過Z^-1 delay後減去v3的微分”(1-z^-1)”獲得u1,神奇的發現量化雜訊e2被抵銷,同樣對v1與u1在操作一次即可獲得最終輸出U。

\[\Large u_1 = z^{-1} \cdot v_2 - (1 - z^{-1}) \cdot v_3\] \[\Large U = u_2 = z^{-2} \cdot v_1 - (1 - z^{-1}) \cdot u_1\]

把最後化簡的輸出U列出來,得到三階雜訊整形

\[\Large U = \underbrace{z^{-3} \cdot y_1}_{STF} + \underbrace{(1 - z^{-1})^3 \cdot e_3}_{3rd \text{ noise shaping}}\]

附上整體Verilog-A程式,程式一開始把D0-D7的數位輸入轉成0-255的輸入Y1,接著描述DSM1,2,3的積分、量化、回授操作,每一個Z^-1都是由CLKIN的正緣觸發。

這邊值得注意的是量化雜訊範圍介於Δ/2至-Δ/2之間,筆者有把二、三級的輸入(e1,e2量化雜訊)加上FS/2的offset來確保每一級DSM輸範圍介於0-255,三個DSM都操作完成後接著對輸出v1,v2,v3進行上述的雜訊消除,最後獲得U2D訊號。

輸出的部分為DOUT0,DOUT1,DOUT2,AOUT,DOUT0-2是數位輸出可以接去除頻器或是其他應用,而AOUT是直接輸出類比電壓準位,下一節的驗證會直接使用AOUT來進行分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// VerilogA for Fractional_PLL, DSM_MASH_3rd, veriloga

`include "constants.vams"
`include "disciplines.vams"

module DSM_MASH_3rd(D0,D1,D2,D3,D4,D5,D6,D7,CLKIN,DOUT0,DOUT1,DOUT2,AOUT);
 electrical D0,D1,D2,D3,D4,D5,D6,D7,CLKIN,DOUT0,DOUT1,DOUT2,AOUT;
 input D0,D1,D2,D3,D4,D5,D6,D7,CLKIN;
 output DOUT0,DOUT1,DOUT2,AOUT;

 parameter real VOH=1;
 parameter real VOL=0;
 parameter real VTH=0.5;
 
 parameter FS=255;   
 
 real DD0,DD1,DD2,DD3,DD4,DD5,DD6,DD7;
 //====================================internal node
 real Y1=0,INTG1_1=0,INTG1_2=0,V1=0,V1D=0; //DSM1
 real Y2=0,INTG2_1=0,INTG2_2=0,V2=0,V2D=0; //DSM2
 real Y3=0,INTG3_1=0,INTG3_2=0,V3=0,V3D=0; //DSM3
 
 real V1D_D=0,V1D_DD=0,V2D_D=0,V3D_D=0,U1D=0,U1D_D,U2D;
 real DDOUT0=0,DDOUT1=0,DDOUT2=0,DDOUT3=0; 

 analog begin
  //================================Digital input conversion
  DD0 = (V(D0)>VTH) ? 1 : 0;
  DD1 = (V(D1)>VTH) ? 1 : 0;
  DD2 = (V(D2)>VTH) ? 1 : 0;
  DD3 = (V(D3)>VTH) ? 1 : 0;
  DD4 = (V(D4)>VTH) ? 1 : 0;
  DD5 = (V(D5)>VTH) ? 1 : 0;
  DD6 = (V(D6)>VTH) ? 1 : 0;
  DD7 = (V(D7)>VTH) ? 1 : 0;
  Y1= DD0*1+DD1*2+DD2*4+DD3*8+DD4*16+DD5*32+DD6*64+DD7*128;

  @(cross(V(CLKIN)-VTH,1))begin  //Positive edge trigger
   //================================DSM3
   INTG3_1=Y3-V3;
   INTG3_2=INTG3_1+INTG3_2;

   if(INTG3_2>(FS/2)) begin 
    V3=FS;
    V3D=1;
   end else begin
    V3=0;
    V3D=0;
   end

   //================================DSM2
   INTG2_1=Y2-V2;
   INTG2_2=INTG2_1+INTG2_2;

   if(INTG2_2>(FS/2)) begin 
    V2=FS;
    V2D=1;
   end else begin
    V2=0;
    V2D=0;
   end

   Y3=V2-INTG2_2+(FS/2);

   //================================DSM1
   
   INTG1_1=Y1-V1;
   INTG1_2=INTG1_1+INTG1_2;

   if(INTG1_2>(FS/2)) begin 
    V1=FS;
    V1D=1;
   end else begin
    V1=0;
    V1D=0;
   end
   
   Y2=V1-INTG1_2+(FS/2);

   //================================Noise cancellation 3rd
   
   U1D=V2D_D-(V3D-V3D_D);
   U2D=V1D_DD-(U1D-U1D_D);
   //============Z^-1 delay
   V1D_DD=V1D_D;
   V1D_D=V1D;
  
   V2D_D=V2D;
   V3D_D=V3D;

   U1D_D=U1D;

   //================================Analog to digital
   case(U2D)
    4: begin DDOUT2=VOH; DDOUT1=VOL; DDOUT0=VOL; end //100
    3: begin DDOUT2=VOL; DDOUT1=VOH; DDOUT0=VOH; end //011
    2: begin DDOUT2=VOL; DDOUT1=VOH; DDOUT0=VOL; end //010
    1: begin DDOUT2=VOL; DDOUT1=VOL; DDOUT0=VOH; end //001

    0: begin DDOUT2=VOL; DDOUT1=VOL; DDOUT0=VOL; end //000

    -1: begin DDOUT2=VOH; DDOUT1=VOH; DDOUT0=VOH; end //111 2's complement
    -2: begin DDOUT2=VOH; DDOUT1=VOH; DDOUT0=VOL; end //110
    -3: begin DDOUT2=VOH; DDOUT1=VOL; DDOUT0=VOH; end //101
    
    
    default: begin
     DDOUT2=VOL; DDOUT1=VOL; DDOUT0=VOL;
    end
   endcase

  end
  //==================Output assignment
  V(DOUT2)<+DDOUT2;
  V(DOUT1)<+DDOUT1;
  V(DOUT0)<+DDOUT0;

  V(AOUT)<+U2D;

 end

endmodule

3.Simulation Result

為了驗證這段Verilog-A程式,筆者在這邊跑了簡單的模擬,輸入使用理想ADC量化後的Sine wave來驅動8bit input D0至D7,且設定滿足相關取樣,最後觀察AOUT的輸出表現。

在時域上輸出AOUT在[-3,4]區間內來回跳動,輸入訊號y1的範圍只存在於[0,1],其餘的輸出準位都是由量化雜訊所產生,故可以發現AOUT波形很像一個Sine wave加上高頻雜訊(量化雜訊)。

Desktop Vew

接著觀察頻域輸出波形,由於輸入的Sine wave頻率約為29.3kHz,故頻譜29.3kHz處具有Frequency peak,而越往高頻走(100kHz-Nyquist 5MHz) Noise floor以+60dB/dec趨勢提升,與前面得出的三階雜訊整形結果相符。

Desktop Vew

This post is licensed under CC BY 4.0 by the author.