Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93256|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。- d8 ~$ r& A# v- `) ^
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
! ?! P3 r, T6 |6 W/ J要使用這個toolbox時,在hspice的.option中不能使用post=2.* G3 |" A! ?9 Q1 j$ {1 \
可以用9 k) s2 V/ `: P# ?  e6 a% u$ u
.option post+ @2 {  s4 A4 y$ {7 c
或是
) v, I7 C/ z9 F' a6 t.option post=14 q: G, l! Z5 t/ o
但絶不能用/ p; T2 @- l, {% L
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:. F) S. F3 G% v8 ]; {+ U0 d
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。7 i7 i- k' K- r; \: [  [
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。' P9 _, p4 _" b8 d
1 Y+ `6 ]& R: x
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用) Z! q4 l7 X3 a% Z6 _/ M5 T
就是直接用.print指令把你要量的電壓印出來7 Y" x5 n9 R3 {0 r
然後再用手動把印出來的資料copy起來
" W6 n5 ~+ a' G" F  o然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。$ z+ w! @5 I+ m: ~+ h2 O6 K
) ^& z% M7 K3 D2 E" G* \- K
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
2 \7 l# m7 q  j$ n7 {2 j2 e% E( a所以  只要將FFT後的資料  做一些轉換就可以唷!!
2 _3 L- o# k7 G% O* }  t將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
& X; |/ r( ?  z7 {就可以換算  SNDR 了!!) r  U; r  a/ }+ U
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部份程式; n. d; i8 T6 J
我想,應該可以給你一些參考吧. h* C! j1 z+ m$ }
6 K" {  v' y! t/ P5 j4 N
% --------------Using minimum 4-term Blackman-harris Windows -------------. v- W) K( g1 p8 ]2 d
nb=1:1ts;
% O( G6 f9 T, f) A' I) Qkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));2 T$ r& _5 l4 ?3 X; w0 e  {7 T) p- r- d# B- @
win_gain=sum(kb)/pts;8 h, f9 E  ]. Q0 @. v
kb=kb/win_gain;
* l" S0 i* ?; n+ L
8 D: V  P. `# K- G9 B3 Y% --------------- Calculated fft --------------------------
) `7 Q/ z; S- b  vyb=kb.*x(ptsttfi);( _! r3 W0 u$ U: v4 L, O' u8 _
yk=fft(yb);" h8 m! s" y3 K! c+ R3 l
fft_no=length(yk);
8 C3 e* g6 [8 W, |; p6 x: }f=fs*(0:fft_no-1)/fft_no;
' r6 U' t7 d- P  a5 R4 uPyy=yk.*conj(yk)/((fft_no/2)^2);7 H' U& m: j0 d3 C
7 G1 N$ J+ g5 _# ^9 T; f1 [0 g
% ---------- Calculate THD ----------------------------
9 `' Z8 ^0 C: K5 hj=1;$ }# N+ @  X& L9 |( _+ K/ n
for i=1:1fft_no/2)+ a: v3 o* D! e4 @+ K! z1 b
    if (f(i) == (fi*j))
4 ~  A  u: z1 a        HD(j)=Pyy(i);     %% find all harmonic distortion components% H9 Q2 @+ B) g
        j=j+1;* t$ m; ~/ }7 A" |8 a
    end( ?( ?6 V& @7 c/ ?  @6 [9 ~2 }
end: R% n$ a! h; v8 W$ p7 @% e
P_hd=sum(HD(2:9));
2 s; D9 n, q2 PTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
. G( E$ E8 d& C( {! j# z# E% `fprintf('THD = %g dB\n',THD);2 S0 G* `; O$ F) n2 L

/ j( d: z) K- D, p+ Q  }% ---------- Calculate SNR ----------------------------
% M  u* v8 L; `$ }fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));7 b$ S: [6 O# W% H$ s) Z$ ~
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);7 H0 N# `9 e  X- q
span=max(round(fft_no/200),5);
! v5 G. P* V* m2 r# g5 MP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
4 k1 `+ Y/ ]$ p" A; R9 m. x0 Y( R0 m! b7 e7 @- F# W- r
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
: H* o$ Y' T! L; J% N. S% D$ XSNR1=10*log10(P_sig/P_noise1);/ ^3 r: o7 e" E
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
1 V5 [) x/ d9 z% a/ j7 t5 _& }請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
# L. F; g; d" H! q# P7 m* h1 a+ `2 w; Z0 [8 i" L+ W
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:5 w) n' m) R0 y0 e/ E6 A" T
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"! I9 Z& S  G' ^+ g; o
內容為:) H; |4 Q; G0 O; D3 q5 ^
压缩文件共有三个文件:两个m文件和一个txt文件
% G* W5 ]2 r* A! p- z( R% S5 qspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
, E/ [2 D' l( a6 Z. \7 c6 D希望大家喜欢!! 8 t0 t* @1 s/ c0 D4 G
附件為:FFT.rar
  V8 R$ T2 `, g- A; C* l) z. O. q  n* t
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
& K# Q- l; ]' f! \$ u
8 y$ }( ?# }/ e" l??? Undefined command/function 'AD10'.  v& m+ u. a% r0 V* x( U
4 [- D6 V  D# E3 p" ?1 L- l9 m
Error in ==> spectra2 at 43
; d  q. h  W4 D  r. J* rd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
1 M- |0 e, A% M. s8 y. M2 a+ V  r5 C1 U
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!, Z- Y# |) U1 w

1 y9 T- I9 U2 S$ n( p/ G1 c8 B∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
8 p" E  P7 `0 D5 v; f0 P
8 L3 p) c* z. ?% D2 r4 M[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
! ]( E$ |3 ~( o: E# p請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
) R) ?) k3 n" Y2 S% _4 M另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:( d, u  a2 c' x0 [
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!", E. n3 S- m$ L, H2 e  W
內容為:
& L/ }5 y2 r- `0 ^. G/ S7 K8 [* |压缩文件共有三个文件:两个m文件和一个txt文件
3 U! r& `; g6 R0 D: m4 b1 \; L7 \spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。4 g) w- U: d+ S1 e1 Q& P. L1 ^% i' g2 |
希望大家喜欢!! : m" [; }# j' k- B) d" H
附件為:FFT.rar
! u6 k4 ~% E2 q" \& g   d" E% `  I3 Q: p; S9 Y
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
% v8 C5 o5 V9 a% c, j- f7 e( A
. K' S8 p5 l1 C3 i! P( t??? Undefined command/function 'AD10'.
$ ~* m* k, |1 V" e
2 G* Z4 `$ t0 q( yError in ==> spectra2 at 439 ^, s4 L( B5 T' \
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);; Y  Q1 x/ `( D3 |7 d4 T

6 X1 J/ d* `2 m由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
* i9 i4 y( @' d: j  `  v9 U附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
$ Y( B! _" t$ I$ K) h* b要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值7 V9 X# J! m, H6 a1 g
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算" X0 n' M- \3 M3 P$ f( r5 \

/ [3 z( [- L0 W+ o' f; O在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧" h3 u- K) [2 [, a
4 M# v/ g+ [' m' i5 Q
我看不到你的附件檔,故而實在無法作出評論
/ X; P" G  p/ [. k而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??" U/ H# N3 M$ f. V) g
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????( r7 W, Z/ [' `6 O
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
& _5 a9 T: \% J0 |- o+ \指令的寫法是否為:
. S8 F1 m- g: ~5 ~- g
0 f! i+ K) u" V.MEAS TRAN DIGOUT$ L2 D/ j' q! Y/ U7 Y! j
+TRIG  V (Dout)  VAL=0        RISE=26 ~! c7 r: l$ W5 O, L* N4 e
+TARG V (Dout)  VAL=3.2m  RISE=2
1 v! \9 Q  ]; c
& S" v1 _2 [8 g1 N5 h0 b& ]' }∼還請指教,謝謝∼
) \6 k# p8 v1 D; T# Z
! g) j/ T+ l: h& f! ^另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:- N5 g$ V1 [1 ]1 h) s' l8 S
5 P/ @$ Z  N) |: G4 f+ t% U  O
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-079 s  j' B8 A; u
9 K4 i  Z* s5 b9 F3 _/ u7 l/ u, ~
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
! X, h( `- s( \0 H0 y( p/ x6 R: f( H% T- O- x' Z8 n' H
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔$ a' t3 N1 l- x, d6 E8 x
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料4 M# H) z+ K# T% p  c
所以,請再檢查一下你的HSPICE檔案吧
) y' N$ ~, _5 f& Z5 U/ z% M
2 c# {% _6 {  Y( Z再來,你的.measure指令用法沒有問題. u2 C  S- P) f5 U
但,你的取樣點及時間似乎不對
+ n* O6 `7 y3 b& w9 H你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:7 \% Q! I( o/ C
.MEAS TRAN DIGOUT8 [( c  o( y3 s- {& T$ b- K
+TRIG  V (Dout)  VAL=0        RISE=2* P+ T) J6 G+ N' ~7 z
+TARG V (Dout)  VAL=3.2m      RISE=2
1 }1 O) w! S! I2 t寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
: ^/ S: U% p5 I# Q9 K5 r; K1 a! b2 l那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
0 ~% [. }, X8 d$ X: p另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2, D8 y5 ?0 r0 S1 q" E% V$ `: ~
再者,如果是用.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程式。$ p1 g5 x: O) {- o- C, H% H2 O5 w
  E" S# H3 l+ V' G
∼感激不盡∼
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
$ t8 S, t! j" N  d  S6 G3 }) X8 A, P4 X" H8 S& m" b1 q7 P" @" O1 e- e
.MEAS TRAN DIGOUT
- d! s5 z/ i6 @+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
; D% A; }! X1 V) G' b% \# ~7 w. Z' }+TARG V (Dout)  VAL=0.976E-7               RISE=1
; C. n3 O) t8 S3 t$ N4 f: d# j
6 P: b* K  u6 k. o' s1 u∼還請指教∼! i& V  U: ], |; P% I" D
程式重試的結果,*.mt0檔案只出現:/ }. e3 s8 k# y2 V/ C4 {, s5 }2 r
digout           temper           alter#            : U* S* W- ]- `# p6 s7 h+ C- `6 s
1.890e-12        25.0000           1.0000         
* @  z( ]3 \8 h不知是否還需修改?
. A2 |8 Y9 \- D. {# x
9 a, z/ G8 k+ k[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題% c; J3 t# _$ |
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息) a5 h5 |/ C/ S: A) W$ T
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
3 Z  V9 ~0 [3 ~$ q( b
  L3 N3 h( l/ y: r9 D( [4 w. o% B再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
& w7 F) s  C# {, A& n, b. o; c2 C7 n但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock: j2 B$ C" ]2 d9 h( y
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)) B" {/ r. n% M- Y3 C' j
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???0 d4 Y5 o5 N- u2 n) n9 p5 r- m" o  m
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為3 E7 R8 g% Z7 \9 d4 u
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
8 y( c& H- n! z, p* L.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us, J8 J  T! g8 W' j
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us" f+ V% W5 x' l. ^4 f5 B& Q
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us( R/ Z$ M: H  \, p- [  T

+ Z% g8 |0 b# X) T4 ^8 X.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us. R4 D1 T8 Y0 s1 u1 |. ^. t# P7 c
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us+ S# ?% n+ G7 x5 E5 g
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
' h* t& A- P. n+ n  p6 G4 ].MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
1 T* ?$ _- ?1 z
7 y; ^! o5 [4 F! @( p; v我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
8 G" X  s) P4 \# F/ ]; {3 D( B$ B我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
) l& G5 f: [+ ?1 l$ C8 W2 ?( K" F6 A" j1 E+ z" U
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us1 Y2 Z4 M; ~; P9 Q# J
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。$ y7 {- p. a+ P
我大概講一下我的架構:1 x0 [! H- O" T" J" h7 B4 b# `
我電路是使用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的指令寫出,指令如下:- Q2 ^% H2 j4 k! v6 [
For Fs=10.24MHz:
, B  B, n3 p4 x& I. ]" y6 ?V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7) Z( J: H5 G& X( g0 l5 l4 {! B1 {
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7% L; i* N4 p9 Y. x( a8 S6 _
For Fs=5.12MHz 3 b# ~4 {- A. G7 o
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
0 E% J# [/ n. [9 nV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-75 G7 s3 ]/ D6 O% D
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
9 d3 ]# x2 ]; m- W% r如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
+ k* w: h4 v! u; G; J+ Q' D0 y" Z.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
0 _2 r0 b8 s  n& G; m# @' M1 d; C7 _.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us0 s7 E$ \- m9 h7 o: N, m
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?! p0 {- J8 w/ [6 c! X9 c, j
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
- {% y3 P" k4 s! @5 q4 d# Q. M- ^3 a# ^. F5 y% b9 j( h$ I
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
, S0 i8 X5 U, K首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來8 F. y3 R3 _0 e; H# Z) \9 S
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
5 j5 [3 n; u( @8 i. B: _4 V4 t
9 z% b" u$ _& p- X% L3 M再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪" n- x( r: B! A  w
) p' \; S/ @6 f# e5 i# r; i+ M
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
% O9 G/ k1 @1 M# B1 N/ F% ~1 h0 E% K- v2 m6 k, v) \+ P# a
clear all- C8 l$ j5 C0 p" r, Q+ C
fid=fopen('dual_measure_rms.txt','w')9 Y- ?" R/ H- b" ~
for M=1:1:10247 q* d# J4 S3 _/ m6 r8 Q
       T=M-1;8 L/ A/ k$ P* u/ ^, \+ N. V
       from=(50*T)+45; %DUAL DAC measure time
. A# u! B* N4 U$ j! g$ s       to=50+(50*T);
) x$ S, T# m2 C# F9 H       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
0 \6 n) x) f0 L7 m+ y; O/ Fend
5 T& q" i, o* u/ R5 HMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用0 |) c8 K* i) S' E, F0 X
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧6 i2 Z5 Y& `! e0 m* g
這樣以後模擬FFT就非常方便了, l3 t9 {' M+ |1 U7 g( Q$ k
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
$ }0 C: m6 ~6 p. n然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
  d- M7 [" m1 A: a( S6 h" b  t只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
1 B4 q% G: R6 M4 v7 u* z我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:5 l) b# ?( j/ V9 \1 V* G
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。3 ?8 t$ B5 D3 \/ M
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。/ [  {' a4 k. r! ^
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
  A0 k% T2 ?8 A) D0 W/ q4 s依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
% W/ y: C; v3 h6 `clear all0 u, C! N% r( I8 V3 ^6 v0 k
fid=fopen('sdm_out.txt','w')
1 x1 h- h- `) Z% k$ n& P$ dfor M=1:1:10249 s( d% |  Y" |: }+ W# i" r; t
    T=M-1;2 {* F, L) v2 ]+ J" N% V' Y5 W" K
    AT=(0.1952*T)+1.026; %SDM measure time, v% u3 b, b* v3 v0 d' V# a" v/ _4 f
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
- ^4 g- J! V) G; X2 r/ _1 V$ Cend
' J' ^" Y! a- P0 ], U試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。: A, q% d2 E* g8 y
想再請問的是:
' C# U! k: p* E# X8 O" c* ?0 W& ]當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
% P% i: e5 v$ r+ T9 f, E' E/ Q1 Uload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
1 g0 o& f3 Q2 x, N2 S然後就可算出SNDR及SNR以及畫出圖形了嗎?8 x% k4 @' ]0 j' Z  Y! z
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-26 04:37 AM , Processed in 0.151519 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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