Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 98989|回復: 74
打印 上一主題 下一主題

[問題求助] 如何將Hspice資料轉進MATLAB計算

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2007-10-4 22:57:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我現在在設計一個三角積分調變器(sigma delta modulator),電路完成後,我用Hspice做FFT(快速傅立葉轉換)求得SNDR(Signal to Noise plus distortion ratio),但我看其他論文秀出來的都是再經Matlab轉出來的圖形,請問,hspice要如何轉換成matlab畫出SNDR及DR(Dynamic Range)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
* P/ l$ Q  k1 _謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,) H& V+ g0 x7 X6 D9 m; r
要使用這個toolbox時,在hspice的.option中不能使用post=2.
8 z$ l2 `9 H7 @可以用/ a& N" b% F  y" @* @% B
.option post
# `- f0 y& g  }6 u! M' \& }  q或是
; a' \, B7 F; i. C.option post=1
' u/ x# }1 C9 F% _但絶不能用; _/ A/ W4 F7 O
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
( D3 L  w; `' K8 K  o如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
) t# v0 ]& r  @關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。5 ^' x6 r* D& a7 ~0 `& y7 j* j
7 T- r( Y5 o4 q* r0 i0 q1 x: ]
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x

評分

參與人數 1感謝 +5 收起 理由
fechiu + 5 很給力!

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
- A: w# Y9 E# @! \就是直接用.print指令把你要量的電壓印出來/ B# P) }; m6 E! K$ P
然後再用手動把印出來的資料copy起來
) b4 {+ P1 Z1 f+ u6 V. c然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
' U0 N' h6 S5 x/ g- i' I/ ]+ S! h; h$ L, x' y: ~. ?7 e+ ^, u# K. m, @
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, # y  ~+ H- \- s: x
所以  只要將FFT後的資料  做一些轉換就可以唷!!
5 q( p' v! `3 q1 T- A, _" P* T將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"* T7 C+ ?" ]$ I. u( m* U4 N
就可以換算  SNDR 了!!( L1 R) }# T! i& X/ z) K
SNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
$ {' E* T" A- v! `, e我想,應該可以給你一些參考吧
1 M* ]% S8 Q3 w0 z7 `/ g
( b# c6 v3 z! n% --------------Using minimum 4-term Blackman-harris Windows -------------
  \+ ]1 a6 X+ \' U) d. `- Rnb=1:1ts;
# ?5 z' H5 q* S& s! z; L, Ykb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
6 C% x, H$ a; K5 G7 X- x5 k* Zwin_gain=sum(kb)/pts;8 ]) {: z. x1 u9 S5 b" S5 b/ \
kb=kb/win_gain;
: `0 ], x9 f' W$ {
. }, w% l8 g( Y4 x: |  x4 p% --------------- Calculated fft --------------------------5 ~: Y/ o2 b/ d! Y" |! W' j
yb=kb.*x(ptsttfi);" c; s( s7 {4 B
yk=fft(yb);
" T! Y, x1 \  I0 r3 B! o  s2 \fft_no=length(yk);
, N  w1 U+ _- g8 i% w! M2 R: ef=fs*(0:fft_no-1)/fft_no;& M4 Y; R3 C! m! d) s; l
Pyy=yk.*conj(yk)/((fft_no/2)^2);
5 p+ T$ e; m& X4 |. _$ t
8 O+ s1 a" |. h1 E: r% ---------- Calculate THD ----------------------------! i/ \' S$ k2 T0 g
j=1;
/ j" f6 C$ a* z" h9 Cfor i=1:1fft_no/2)# J( Y7 f2 c$ S/ G0 W
    if (f(i) == (fi*j))
6 F6 ?& h8 A3 }3 F/ x( A( F        HD(j)=Pyy(i);     %% find all harmonic distortion components0 Y* I3 j7 ^- Y& Q- T0 `) F
        j=j+1;
3 ?/ Y" Y7 Y/ R    end
, J; w- \2 O; ?end, D) |" ~) S+ R6 Z; }" k
P_hd=sum(HD(2:9));5 W7 J* o; n0 h+ U0 `: ]
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
1 s- ^  B7 q1 e- m  Y) }* cfprintf('THD = %g dB\n',THD);
1 L- x( t8 b8 _6 u- x3 h/ }7 E  m" Y# \7 y0 b; r
% ---------- Calculate SNR ----------------------------+ t- _, A3 G3 H
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));1 o# `7 L# O) h0 y$ K1 `
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);/ L4 O1 m# p3 c, B
span=max(round(fft_no/200),5);: H4 M. z; X0 k5 o) n" C! v& D
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
* z, [5 [0 x' z4 `/ ?' U/ |* @" ~" q- z7 v
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;( P/ L% h# t8 d$ w+ H& X
SNR1=10*log10(P_sig/P_noise1);1 d0 J; O1 ^/ i" `" ~6 Z5 F' M* c: }
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
# f# `, }$ G% \) [請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。+ }. B9 {% l' j9 G1 b

/ Q; u$ F4 Q, E% ]. [" M另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:' D) E- K/ j: r9 E* s- B
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"% w5 y+ q9 h* ~2 J# T! P. M
內容為:$ K/ K0 r$ y! t2 ?. V
压缩文件共有三个文件:两个m文件和一个txt文件
9 U1 W- A) k6 d1 hspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。) b* L/ E! T" \4 L" b- X
希望大家喜欢!! * u2 W* h- t( n' P
附件為:FFT.rar6 q1 D7 ~/ G$ n" u; @
" X4 W/ m9 E. A- `1 Q! ^
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:: l# s0 Z% |% g- \- i% z
7 ?  X3 C% O( ~# e
??? Undefined command/function 'AD10'.
& m3 T) B8 j9 d7 C, S
  P, g& V/ g* P. {& A! G( B, _Error in ==> spectra2 at 43
) m3 \& i: j- a& {. Z9 b2 J3 zd0=round(AD10(start:stepstart+M*step-step),3)/1.8);3 J. x( j; |) [" U6 Q# L6 k2 @

( n' _& l- O  F0 d( I由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
2 `6 Y3 g# N  U
/ O+ ^+ @( Y( m- \, T∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? " h: y6 [- t0 \. A
3 q+ W6 k" x/ `: j" L5 F
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:/ I  o0 f0 g: n* Z, A9 R
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 - l+ M7 V: L, A- j
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
; m: @6 s* h, `" G  n) p"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"9 T% H3 A4 z0 u9 v: Z" K  [
內容為:* X2 z3 m( L' I- \
压缩文件共有三个文件:两个m文件和一个txt文件
+ V9 U& S! p. j8 [spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。8 }9 Z0 V5 b) A+ J
希望大家喜欢!!
: |) N- s  m/ k6 r, U) e* A附件為:FFT.rar
& b( e, j* C  a! I
. G* n. n/ j# u  ~1 H3 \我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:. G/ K7 J. z4 O" n0 O  H
2 s( Y+ y( A# k& @6 s; {
??? Undefined command/function 'AD10'.  x+ D0 N4 G3 B% U
1 Q& k  s# x: f- n$ Y+ S! n- i" L7 V
Error in ==> spectra2 at 43
# O" [0 ~, I; ~# p% Ld0=round(AD10(start:stepstart+M*step-step),3)/1.8);
7 n: `$ T8 e" O9 ~7 w5 \( F3 r  t* O9 w1 p
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????+ A5 Z' T2 c9 d3 }0 _" P" n: P
附上上帖的附件

評分

參與人數 1Chipcoin +2 收起 理由
chip123 + 2 可能是圖檔太大?縮小再試看看?

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式/ \, }) }+ B4 _1 B' q
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值7 [$ t( s9 d5 R& B: j# }  n; P; P
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
# a1 J, `8 S' E
! m# Y! d6 v$ f8 B  {在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧& ?' X: Z( j% f; y0 I

5 {9 m* |' |( G( X/ S  R+ a; p我看不到你的附件檔,故而實在無法作出評論
- b% ~6 m1 J( S2 G* M8 Y而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
' V1 Z% a( e! j& h/ K8 S) D. U" [9 i從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????: I. O- J# s- t2 O: n9 \
所以重新上傳附件

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
12#
 樓主| 發表於 2007-10-16 17:02:11 | 只看該作者

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
  ?2 @- M) ~8 X7 `$ q% \& i指令的寫法是否為:8 ?0 g( D6 Q7 H5 r
3 G6 J; e" n5 H# y) x
.MEAS TRAN DIGOUT
% v/ i% @5 r; X0 a7 Q' j  j9 e$ u+TRIG  V (Dout)  VAL=0        RISE=2
6 ~( n2 f" ^; ^+TARG V (Dout)  VAL=3.2m  RISE=2
( u: V; U5 l4 `. U# u0 L/ C( Z8 b6 j3 h
∼還請指教,謝謝∼9 W3 y3 j- ]! C; y2 }
+ D: ~2 e$ g: |  s# c- H
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:2 g! U( [, M5 {8 ]

% J1 g) h' H, O7 r9 a  r9 x8 Ldigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07# I$ N" w6 i  T: Q
9 [5 x  b! F0 X" _" |, H
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
( g, S" p) x  _  D5 {  f; |: E& S% C
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔  K) `* k7 f; m# P5 A: p+ _
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
$ W) s6 _9 N  r/ k6 S7 p/ J所以,請再檢查一下你的HSPICE檔案吧- u2 W1 S9 O: g$ H/ ]2 w3 A5 j1 ~
  P$ j& K5 ~" O
再來,你的.measure指令用法沒有問題
9 j" n; X3 `4 M& E但,你的取樣點及時間似乎不對' ?. U/ P; m/ a5 Q4 W+ T. G1 |
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
  ?1 k4 N: k0 K2 D- [2 Z.MEAS TRAN DIGOUT
- ^1 u; n7 g1 }) s' H+TRIG  V (Dout)  VAL=0        RISE=2
; m- B% B5 U9 c8 B9 l7 W" A; u/ _+TARG V (Dout)  VAL=3.2m      RISE=21 Z$ r: n9 i% B1 M0 t, n7 d% r- I
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
1 ?! ~# r) Q3 O5 e  P1 X5 H9 t那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock5 B& c7 `8 s- Z) H) ]- w2 L/ F
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
- i- v, _: o3 b# F& n再者,如果是用.measure來計算digital code,那如果以rise edge作基準則應該用RISE=1,而不是RISE=2,這是很嚴重的錯誤,除非你的clock及取樣有delay 1個clock的作用在,如果是以fall edge則是FALL=1,若是以你RISE=2,那你取樣出來的digital code應該都是錯誤的
14#
 樓主| 發表於 2007-10-17 14:02:04 | 只看該作者

再次謝謝Finster的回復

再次謝謝Finster的回復,我會依照你的方法再重試一遍,另外在麻煩你幫我看看上傳的ADC Matlab程式。' l- ?$ `$ |2 V( K: @: F4 O
# g: }( n5 V9 [" U  l
∼感激不盡∼
15#
 樓主| 發表於 2007-10-18 23:59:51 | 只看該作者
再請問一下finster副版主,我有兩個非重疊的Clock,一個ON,另一個就為OFF,取樣頻率為5.12M,週期0.1952u sec,半週脈寬0.0976u sec,第一個clock延遲0.05u sec開始觸發,第二個Clock再經過半週0.0976u sec觸發,電路輸出點為Dout,.Measure指令的寫法是否為:2 b% S8 U/ K7 L# j
" }, F( ^; Z/ f# f  I3 }) X8 A, P4 X" H8 S& m$ R  A9 S7 e% {- o
.MEAS TRAN DIGOUT1 L1 r4 w6 C7 R2 K5 E8 o
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f, m3 W! Y' E6 v; Z- ]
+TARG V (Dout)  VAL=0.976E-7               RISE=1
4 \) M; o; [9 n- o: ~
* O3 m/ j# X' w0 H" q, t∼還請指教∼! {, x8 W' w% W* p. X4 e/ g
程式重試的結果,*.mt0檔案只出現:4 r: n& A- U) Y8 h& C. U4 m
digout           temper           alter#            + z) w  {, v7 o! w
1.890e-12        25.0000           1.0000         
" Q3 W& ]1 F( I5 y% L- [不知是否還需修改?' i. [8 y. @5 U( n1 J  F; e6 o

2 }3 t0 l9 M! B+ a% A2 G[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
$ P1 n3 K+ N- b" Q+ V3 n你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
  O, f3 V. U+ R; m: R, @所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧1 U' C, `; {9 l' U$ N" n

! D( g# P5 P; N5 Q) X% M. Z8 {再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
8 I- Z+ L# M$ n" y' x但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
% ~6 B4 u# D# p% U1 `一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
: w2 y1 E0 ]) x) [再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???$ M/ ?% D2 e: J. [4 n0 X( v
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為& n' i. F" d4 M2 Y. S+ `. h
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
/ H* R& y6 f/ q0 V: m( Z( k.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
9 [8 R* L7 T+ i" X' M.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
/ {. H3 E4 f" N. F- Q.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us1 a9 F5 h% W3 F8 H7 A3 A6 X; x. h

+ k% Y) I) H2 g9 R/ U, Z0 I6 y1 q.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us. e1 L4 S6 L/ r
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
  ]1 T! M  Y( D2 o) O8 B( i.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us- l! k& S+ M- e5 b- l2 z+ Z
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
  }) |6 J! H& ~/ a: y( w1 B  X- I* `
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
: c, o- w$ Q; x# V我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法4 |! N/ ^5 ^4 O" b
/ R8 o$ g# g5 F7 E
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us9 p. Q& w6 R) e- Y. c, y
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。6 `7 P! i8 e0 v5 I# J
我大概講一下我的架構:7 E% R) l1 v# |( i8 [6 D  x# q
我電路是使用Switched-Current(SI)的架構,不同於Switched Capacitor(SC)的架構,最早設計是設定輸入頻率Fin=10KHz,取樣頻率為Fs=10.24MHz,頻寬40K,位元數為1-bit;由於我電路中有一個Op-Amp,因為OP-Amp頻寬限制的原因,在高頻時易產生非常大的諧波(harmonic)及雜訊(Noise),所以才降頻為輸入頻率Fin=5KHz,取樣頻率為Fs=5.12MHz,頻寬20K。電路中有兩個Clock(Φ1 & Φ2),Φ1 & Φ2是兩個Non-overlappind clock,由於尚在模擬階段,所以兩個clock的產生是使用hspice的指令寫出,指令如下:& M$ q5 z. V4 S4 z
For Fs=10.24MHz:& X, p* [% c7 ?7 B2 P3 P
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7( Y; |. m$ y3 \' [' w+ z: n2 e. ^5 c
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
# d/ f2 r  A$ z9 l- Q, i- N  kFor Fs=5.12MHz
5 g/ D7 {8 m- G# Q6 MV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-76 ~7 O) N' W5 w. o# t8 u" s& c
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
: L7 F% o) W' I0 O1 b3 z" D* X  P! p另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
5 g) \" r0 E3 b/ r如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
% ]; m' I2 m3 C" w) X.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us' T; E" m% H5 K( k
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us; n# z# f1 t3 Q1 L- j
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?' b" K8 x( B3 h/ }% C9 h
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!3 B: r% y  X3 r+ q; Z- G0 x
* J" w, T* c- e
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
4 c4 h3 [" W4 {$ O1 I首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
: W/ d. s' ^  N; @% P而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?# M# y' @  K& U* Z# _7 o

7 q. V' j0 }( O$ k3 m4 D$ y再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
* |* r2 P" d5 {' W% V0 a" R! `# m
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要0 c% B4 i, y" d! L4 E

& P, O: J) k. F. |: aclear all
  l: l. y0 ^; c: ~$ _4 efid=fopen('dual_measure_rms.txt','w')  i8 E! ^& p  U! h1 C
for M=1:1:1024
& p5 ]+ L# M. O9 [7 L# p( @       T=M-1;
/ h; F0 v4 A( S  \4 K       from=(50*T)+45; %DUAL DAC measure time
- Z6 `( M: `4 ?8 O       to=50+(50*T);3 W* l% A6 g! |- T" ?- ^+ m
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
9 |& Y" ?" v0 U" p  s' Tend, t+ e' G: |3 c! M9 ]+ x
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
% C# D# M$ p) ^. ^3 b這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
# i  X2 }& U  ?: I' F1 F% L1 p這樣以後模擬FFT就非常方便了
# z  q  i9 D7 M看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
1 S6 n" I2 R% h, q7 o; |" H然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
( I  Z3 i/ \! D$ |; Q只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
7 N$ m# }1 G0 f: A: S$ a我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:+ Q9 `1 p* T6 d# N1 M8 \
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
* h9 P0 |9 h& J1 Z# g且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。) R6 A" t3 Z+ _$ X
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
# S8 Q. m9 \8 q1 O! M, m依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
1 t6 U6 }% R0 B$ F* t8 c7 xclear all- ~0 V$ y0 O5 s# e9 w
fid=fopen('sdm_out.txt','w')
. J6 m) R, b. A6 R- ^. }; Rfor M=1:1:10249 @0 f1 Y5 D8 N9 ~$ c# s' W% o# O
    T=M-1;
9 Z0 g/ @3 k% q/ ^, o* Y1 [    AT=(0.1952*T)+1.026; %SDM measure time8 r( ]' b' A* T6 f
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);2 f$ h8 g& s0 y; A3 S; ~1 p* _! r
end2 _; K' B3 k) W0 |5 }
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。* o% u7 H' q/ h* l/ ^. F& b+ q
想再請問的是:" O; [6 Y  h5 ~2 y6 ?
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:8 E$ _) D; Y3 L" H  j
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM$ w; e8 r' d8 P( {, @
然後就可算出SNDR及SNR以及畫出圖形了嗎?
8 ~7 ~1 q+ t0 E5 r, k- F請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2025-2-19 06:23 AM , Processed in 0.211012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表