Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93665|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
* x, ]/ j- h& X0 G: _- F8 j& X謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
- ]7 \5 W' A( R4 t* H要使用這個toolbox時,在hspice的.option中不能使用post=2.1 k! S& |4 H# t( M0 l2 b' Y
可以用
2 X- `6 N3 I& s4 X5 q; u.option post
' r8 a7 F# G# O1 b3 e( k, _/ ~或是8 w, Y2 N! X% U6 R! u3 X
.option post=1
5 p' b2 E9 j9 L6 l" }1 ^! n5 U但絶不能用
7 y, o5 f4 p; \7 h1 Y$ |. E! v.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:3 y, f$ k5 k8 e0 O: P; C0 D
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
/ j" C$ p( B! S: b/ n% D關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。3 h% t  Y7 q& j& Y3 V
* u( `+ U$ x  E0 a$ P8 f0 x
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用5 h3 j, K5 Q  W
就是直接用.print指令把你要量的電壓印出來
! ^- f' a( i. L$ n4 ~3 B3 `( O: C然後再用手動把印出來的資料copy起來6 @' f5 {" Z# K+ O: W
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
( |- r$ j1 L) ]. C& U# b$ u7 X3 ]* C( }& j3 ]: e
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
$ c. o9 s; B: |' U  l: Z* C% A所以  只要將FFT後的資料  做一些轉換就可以唷!!9 v* {" k5 J0 s" C$ Y
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"% b3 {6 }. V( S  f, w- n
就可以換算  SNDR 了!!
# p1 K/ I9 \% fSNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
% O5 V' P$ F1 E0 U+ e0 F. B9 v/ G% j我想,應該可以給你一些參考吧
0 `0 p- J' G) h% J& u  E
7 ^1 Y2 r* O0 d% --------------Using minimum 4-term Blackman-harris Windows -------------4 h4 A. ?5 m0 c2 V. C8 I4 j& w0 w
nb=1:1ts;& n1 ~+ o3 Z6 }; ^/ k
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
6 V2 l& R4 Q9 V5 R* B% V2 ?9 zwin_gain=sum(kb)/pts;
6 g3 y$ I7 U7 S2 S# O* @% Xkb=kb/win_gain;
- l, k. @' t% K% Z" k# A
- U3 l. z3 }! ^; Z% --------------- Calculated fft --------------------------, a* [" Z8 A2 r$ s  C
yb=kb.*x(ptsttfi);
8 B  `# R6 ^+ c% @, zyk=fft(yb);
( p+ L1 L, d  k% l5 M0 j' l: ?6 ^fft_no=length(yk);
, b$ o4 H) w" O7 R( Hf=fs*(0:fft_no-1)/fft_no;
7 }, w9 t* Y' o  G7 w' fPyy=yk.*conj(yk)/((fft_no/2)^2);  P% n- r, v( {; |" F
$ s" W3 H* f0 i; ^: I4 w/ X
% ---------- Calculate THD ----------------------------
. _" o$ d, F) i' gj=1;
) w6 z$ w; I$ W! d. w. afor i=1:1fft_no/2)' c# a. D; j/ |0 e
    if (f(i) == (fi*j))
/ h" n& P) p. `! P2 g' m        HD(j)=Pyy(i);     %% find all harmonic distortion components% W2 X1 ]+ c0 u6 Q% t
        j=j+1;
5 k4 x# I. U3 h: _$ B1 @# O    end2 y/ B* J7 s1 [8 L7 w9 k! c1 n
end4 e! s5 w' y3 t, U* k9 p4 j* ^
P_hd=sum(HD(2:9));
7 l6 Z: }$ [$ X, aTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal" N1 N. ?5 T0 b
fprintf('THD = %g dB\n',THD);
0 @( A1 J0 A8 Y# ~! n4 t+ M. A/ _* I0 U& `1 x2 ^; X5 I: t
% ---------- Calculate SNR ----------------------------' y2 ]0 G( w" K4 j, m1 R7 I9 Q% R
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));, g# {. ]6 q9 g8 I0 p8 w9 ?7 o2 s
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);( |  [" T& M% n
span=max(round(fft_no/200),5);* \( }' a5 s+ W  c  P4 _& S/ d  r
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
* O/ V- K8 O: m, ~( q( O! T3 ^
0 Z7 W% o9 b6 A0 v8 {P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;$ t8 n% K" U; W& f1 y
SNR1=10*log10(P_sig/P_noise1);
2 I1 j8 }; y# k* g: qfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
2 d2 S  u' S* ^7 V請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
2 Z* j4 m9 r9 C8 J- N5 k0 `/ H8 b- z
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:+ n, i9 t! \0 h
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"4 V9 U# }3 Q, [9 ^9 I$ o* }. B
內容為:/ s5 O, s/ X7 C1 E
压缩文件共有三个文件:两个m文件和一个txt文件9 E3 C, I% T! }$ T
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
5 }  P+ _9 ?. b6 h* Q$ h希望大家喜欢!! $ Y, U2 b  s: A) [/ b  U' C
附件為:FFT.rar
4 v# b' B( \' x) v$ e5 J$ x% D, S( y9 H1 L4 \9 {0 n$ [
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
8 I% l$ `" ?. ~7 a* U+ [2 S1 M9 b9 m$ @8 d  j
??? Undefined command/function 'AD10'.
6 `8 c7 I  E) k- t9 d& g
) c7 ^) b+ h$ L: hError in ==> spectra2 at 43
8 B$ y6 D/ V0 W' C" |5 Sd0=round(AD10(start:stepstart+M*step-step),3)/1.8);! J  _1 x, G4 h, {# E7 p! @

" b  k  ?2 S, ^. J' @' r由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!3 {. g5 S2 R$ k% j/ P& x
9 Q$ J5 T5 ?1 n+ A% _3 K
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? ) t% J, g. s8 {- n+ g5 t4 K

0 [6 i) c7 J8 S3 [7 ]* {[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:2 f* _# O3 ~* m+ {
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 # l4 T5 e' K8 w/ o' |
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:/ i/ E$ k* V: F) F; P) G0 q9 _! A! S  l
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"' }1 x' O. |9 v* t
內容為:" L. Y4 H0 a9 F. p' N5 w
压缩文件共有三个文件:两个m文件和一个txt文件4 N/ f/ h0 }/ U* v! h
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。/ a7 w: j# `, g) {* r1 x
希望大家喜欢!!
3 q7 j8 I; q3 J0 u$ S( y! c7 G附件為:FFT.rar0 _/ N: V! H$ i. @/ `' f
9 q" }& n( }0 r$ \: A
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:9 q4 s& ?# `9 l! ~+ F8 D/ f9 U' s7 w
, D2 a& ]7 t% W) g& w
??? Undefined command/function 'AD10'.+ H3 B3 O0 ^: H6 f/ E

1 Y& |3 y! n0 z: n, ZError in ==> spectra2 at 43# j# d# z+ c2 `7 K$ Z& V6 `: [
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);# ^6 W9 h8 A$ ]/ d) E4 T! P
. l; t" o1 ~4 ^$ t' o
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
9 l0 Q# L- F4 x附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
7 f1 a* \5 Z3 }要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
% \$ L$ W2 o( p( D1 ]! L故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算8 @, ~. P! i; _# F' ^
1 @7 p) S; J' M  F
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
" Y$ {; e+ X' E: {: c* q4 N" e9 }! K6 X/ ^, x4 A; A0 f
我看不到你的附件檔,故而實在無法作出評論
% e% Q# p; l; n0 C* p而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
) o' \5 b: S& L! T) c4 o) d從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????( J. G- |! I: x. r  `4 |0 c8 D
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,5 X' Y1 h8 F# L7 l4 k$ R
指令的寫法是否為:' \5 r2 H/ J, \3 M3 {; x4 K! h

5 a4 f% S/ r3 l.MEAS TRAN DIGOUT
, P; e% ?3 Z8 f+TRIG  V (Dout)  VAL=0        RISE=2+ Y* Y* e7 Z- U' o) C% f
+TARG V (Dout)  VAL=3.2m  RISE=2/ k+ I7 x4 x2 F, l3 p( s, N
: |6 O% }6 T: y9 o
∼還請指教,謝謝∼/ x; n8 `7 s4 W2 ~' r& J- Q

. A5 Z5 j* O8 s3 A5 d  r3 R" t另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:; W4 G* F3 U/ a; c; b
0 c' E9 |& ^2 n
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-078 K0 n/ \6 J; a3 ^
4 ?5 N& t9 m0 y3 t
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
: I8 g; k- b5 q  `# a' O; L1 z$ M4 s
9 M  O, J' O7 |$ Q; k[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
. V, [& ?  |3 C: w. t故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料/ ^2 e' ]: p, [
所以,請再檢查一下你的HSPICE檔案吧9 K( z' M/ K9 `' ?

2 M+ m* `+ O7 B( m8 I+ c1 q4 d% F再來,你的.measure指令用法沒有問題6 ~4 n! f3 n- C
但,你的取樣點及時間似乎不對: Y8 w. Z1 i9 l) u; h2 c
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:. N; t  X3 O& y) {5 E) t6 q
.MEAS TRAN DIGOUT& K; x/ n) X7 P* j
+TRIG  V (Dout)  VAL=0        RISE=2
, T3 Y6 Z% A) j6 F+TARG V (Dout)  VAL=3.2m      RISE=29 ~* a9 V! V. e& G- I
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
! c4 ]" R) `3 o, c6 ?那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock8 W) v( _- I8 u9 ~/ a6 k  q
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
3 k4 T) E0 M3 ?8 l) f再者,如果是用.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程式。
: [% ~( j  F5 M. @! C  m" K
6 Q1 d. c8 t8 d6 h∼感激不盡∼
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# j9 h1 ~# j  F1 X( v5 q/ B
3 }) X8 A, P4 X" H8 S& m4 K- L- @& j& ^1 M; p
.MEAS TRAN DIGOUT
( {# ^4 K$ W2 h: T) f; g2 w+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f/ X" R' _: q6 h' a
+TARG V (Dout)  VAL=0.976E-7               RISE=1" Y9 G3 d$ M' ]! ]

1 h+ h: _9 {) J" ^& P∼還請指教∼. }0 B7 @% E6 @. |. k& D( Z
程式重試的結果,*.mt0檔案只出現:& G+ ]( M3 h) M
digout           temper           alter#            * F% n* e6 x* o' F
1.890e-12        25.0000           1.0000         
* Z3 t2 V$ ?, I& Y6 V不知是否還需修改?
5 J' U6 h* F6 s
& |9 G  O: h; `/ Z( P[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
4 e5 Z6 a% b! c# B0 J; e你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息1 Q6 n9 l9 j. ?4 q/ `% K2 [
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
; O9 R# {; L5 }0 N" A
% A. ~3 a% T& v2 v6 r5 L9 c/ o再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
' I) j) v% [- p" Z5 D; B但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
( [" a  z" l' x一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
3 J/ S" z+ U# K再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???7 ?3 b. ]  z% ?9 b5 F; L
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為; v* G  K. h" j: A
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us; x: h2 q$ K, \
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
7 ^' F% i7 R9 w  s.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
4 s% ?& e$ Q1 g.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us5 d( |$ Q9 O- b# g9 _7 `- t

: Z/ y* g* M, x: U, ~% ^.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us/ ]2 Q# h2 l. U
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us! Y  H- |* h7 r& ]# q1 Z
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us6 j. l$ C: `4 L' @
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us2 `1 I9 a% N. d" @4 b  c5 @
9 w' N& z, [* @7 J
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code5 ?4 h. H/ o1 g) b4 i; E  n
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法) l% p0 X# ~  b9 {2 D8 Y
( [" U8 N' a' F/ N
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us9 F" F1 ?$ `5 G' V
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
1 N* e( j. J+ R% G& g我大概講一下我的架構:
& E4 T9 h; Q; J/ [' k我電路是使用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的指令寫出,指令如下:
! v! b+ V' t* i7 JFor Fs=10.24MHz:
7 F# m9 \* w+ M+ zV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
6 t( f* J* V8 H; |* J# V. HV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
" ~- s2 u/ O5 R$ GFor Fs=5.12MHz ! b5 K6 U+ K& G, ]. u
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7  K  S% P* H0 Z( ~" L
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
3 @7 F+ f- u, p+ p9 C另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。* Z; C: }2 \% X9 `
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
* j' q( @4 _0 V: T.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
$ \3 L  H8 i, W( f.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us5 a: j+ }# v0 H8 @- ]6 }0 ]
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?5 x7 x: s5 ?, r; k  k9 c$ S% d5 l, ]
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
$ ]& X+ m5 I$ G  F( j, j# C$ m$ q/ y  Q3 R1 ~; L
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方! \$ e: Q7 u# d% _5 J7 |. _; A
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來8 G- F9 ^2 B3 A, ~
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
! }5 m. o/ n2 O3 A) Y
0 A3 _* G5 b& @3 _, n1 |再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
8 A2 `! z# R7 c' l5 _& r- _0 y+ r" d- @- `# z9 E; [
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
( ]% t) S4 }9 X7 U% O0 P5 l
. B" A1 A# K  K1 oclear all( Z/ ]  D) q/ d- H/ A" g- @( A
fid=fopen('dual_measure_rms.txt','w')8 q" ~- d& p2 M( r: s' N" R# w' D7 N
for M=1:1:1024
/ ~8 J% u. E0 Y( H       T=M-1;
' ~% q0 D# n3 ?' j4 @2 D$ T: u! ~/ j       from=(50*T)+45; %DUAL DAC measure time* ]) e% r- q4 P7 ]6 }7 l3 B; J
       to=50+(50*T);
. z. @/ q" s5 I( Q- b; j6 u3 M9 U       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);7 M5 r2 c. Q1 E4 X
end
2 s, q; @( J  w8 W# ZMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用& _7 @4 ^+ r/ h  t. Q% a
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧- x7 A( G( p; @% a- _1 O  f; Y
這樣以後模擬FFT就非常方便了5 a9 s, G0 \$ h6 d% U; Y
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間; S4 d: x$ Q: _0 P4 {9 ~* ?0 R
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧7 ~  x) |8 X" \  E, s! v/ l
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?; X( F( }8 l3 Q1 z6 h: |+ _
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:0 E# a% T* I! x/ d  I$ }# G
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。& W" r7 c+ E+ Z- @$ c( P& M
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。* }2 O: t2 p5 m6 W
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
+ C2 n, V! x* i依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:- h3 e! G  E7 m: S8 e; Z  t
clear all1 m+ J$ r* T7 k; @" u1 x0 e& E7 l
fid=fopen('sdm_out.txt','w')
% q: r! w6 ]! L( m( l5 s' O) Cfor M=1:1:1024! K, ~: N, x+ S. d) K8 H. ^
    T=M-1;/ m8 y- k+ p! A6 V6 e4 F
    AT=(0.1952*T)+1.026; %SDM measure time: V2 a+ U7 K) R) F
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);4 A1 @( `8 h' F: o; e
end6 l& F* {# J* E, k$ F  ^8 g# B
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。  a1 r* h+ H; D9 P5 v' X% A% e
想再請問的是:
* {; J: I: W9 ]當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
1 l6 o0 j8 z0 s: p# Q/ iload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM. c) j* h, M; t1 `" X" {! |; |
然後就可算出SNDR及SNR以及畫出圖形了嗎?+ ^1 _" v$ ?/ n
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 10:32 PM , Processed in 0.158520 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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