Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93391|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。& `4 M( }# U: x- y
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,2 _% q1 }* s9 u+ A$ c5 b
要使用這個toolbox時,在hspice的.option中不能使用post=2.
& G4 g$ f0 y1 a可以用
, t4 l" v5 _3 k; g' U.option post
4 i6 h' S" {- F$ O; ^5 J或是
2 n/ q$ c3 V8 M- G: j0 r# ?  F.option post=1) a$ {8 S5 d, b6 ^% a7 e
但絶不能用/ B5 s* t% w7 K$ _$ K& W; J
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:: k! C/ L; W4 o. J/ A9 ]
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
. Z- J1 W9 l# V# a2 V* r. c關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。& p$ S( L: Q4 M6 W5 ?3 d
$ j5 ^, y$ b: k6 P  q7 v
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用7 t4 e$ r: ~" ]9 G; }1 S4 x
就是直接用.print指令把你要量的電壓印出來
& ?/ w! j/ c' S) ?/ l然後再用手動把印出來的資料copy起來
( X% x8 N! T# b2 w: G" v! T然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
1 Z3 c2 ~- a5 F3 ]) T# e; v5 _8 o: S4 \
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
; T7 `& v( J( K+ e所以  只要將FFT後的資料  做一些轉換就可以唷!!
3 c& f& W& \5 i6 |  R6 H將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"8 K1 L( e/ t) j
就可以換算  SNDR 了!!" y& v& h+ Z2 d* {4 u" Z
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部份程式
2 ?/ H* X3 r0 l7 R' Y我想,應該可以給你一些參考吧
$ R: R0 F' l5 K
& {7 m# C6 k" h7 V3 S) V% --------------Using minimum 4-term Blackman-harris Windows -------------2 K! S2 l" \) b2 O! p
nb=1:1ts;6 [' \5 k& u/ N' q/ O
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
  T1 I" o8 C+ m' L: Xwin_gain=sum(kb)/pts;
. s6 V/ K2 Y1 `0 S( C+ ckb=kb/win_gain;
' S" I) k; ^; E% ^* K  s3 h4 i7 c6 ?+ p
% --------------- Calculated fft --------------------------
: ~6 m. [1 S; U" h9 ]yb=kb.*x(ptsttfi);
# K6 L5 U; e# ]+ n) o* X" [yk=fft(yb);
- v) l$ r; N& _4 \- Y+ K$ U9 t, Lfft_no=length(yk);
! ~( I% Q* o# r% t+ g! D3 j+ af=fs*(0:fft_no-1)/fft_no;$ U+ }1 D1 ^. l7 [: b
Pyy=yk.*conj(yk)/((fft_no/2)^2);
( P/ ]' N/ H* ~& T, _$ h. J9 j$ O8 ~4 ]: H
  D; U* s5 G  [2 V4 w% ---------- Calculate THD ----------------------------
3 d) C4 ^+ F7 l4 Dj=1;, U! ?, D; g7 ?8 o" |
for i=1:1fft_no/2)
, g8 h3 o+ }( s1 c  j1 w% F    if (f(i) == (fi*j))
' V* @5 u4 @! S( Q; l* _# n        HD(j)=Pyy(i);     %% find all harmonic distortion components
1 K' R5 j9 z6 d7 R        j=j+1;/ |3 C: l% e3 d' R9 M
    end+ c! X1 A3 ~5 e/ D3 G
end, l4 }: F! [/ P4 d, {; \$ Q# u5 g6 ?7 H
P_hd=sum(HD(2:9));
$ D; a. {. ^: t# \# u( N' p$ aTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
3 D3 ?* v4 S6 B7 bfprintf('THD = %g dB\n',THD);/ V3 a' l' n, R5 C  C5 F

$ V9 e- j# B" S( h. D% ---------- Calculate SNR ----------------------------% D' h- g) g. l' x* O/ A
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
- O# q- W, G2 R& Ifundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);) e7 y, I8 W' t9 `
span=max(round(fft_no/200),5);
) L" c% }: ^' t2 i# ZP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
$ M9 N; P1 n) l! L. j7 L( R5 s5 a* B2 G! S
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
( g9 k+ \( c$ m, I3 jSNR1=10*log10(P_sig/P_noise1);* C6 O! F8 ]0 c) O2 K, D
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:, F9 X2 L" n8 [
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。3 e$ o" n' r$ Y8 {9 q, A  }
+ s. y( F* o! Z: u6 _
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
; o5 z4 M! a% g8 Y1 V6 D1 i# u6 O8 J"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!") V. D, ?. \. o6 ~
內容為:- n. g8 O  Y5 s* F6 U- [5 m
压缩文件共有三个文件:两个m文件和一个txt文件7 B1 g8 S2 N: u0 l, j& s3 N3 g
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
% O- P8 s" s$ G) F* S( S( s希望大家喜欢!!
2 u$ u! V5 ~- C5 D9 C5 x附件為:FFT.rar* x0 d' c/ l$ z. @+ w1 f" X
! |( e! \# a8 k5 p5 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卻顯示以下的錯誤訊息:2 c1 B, y4 y! Q( G

- _  J, w! G1 c; @. d% u??? Undefined command/function 'AD10'.
$ e" |* s. J* b0 W) O* G2 e- j% D1 a% T
Error in ==> spectra2 at 43
& q( r8 w, F6 o. pd0=round(AD10(start:stepstart+M*step-step),3)/1.8);0 b* W$ o8 G3 i0 ?% Y
$ s: S7 W0 ?! f- y, o" }4 x0 \
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!: Q( C* ]8 s* s# d6 ?

2 N7 V! @. D# ~; Q∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
3 _* Y) _1 x" b1 a# |1 |" Q: C" K* o
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
& `2 K! c, |4 R0 D, g請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 & _3 D3 w5 [2 R4 z' I1 ~
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
+ _! K) C3 ^" L: {3 @" v) N+ m"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"0 T% s& C; r0 y# z6 [# t  w
內容為:
' m  i: p1 E% ~# j& [9 |压缩文件共有三个文件:两个m文件和一个txt文件9 U) S! j' s2 f: ~* Y
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。4 s) D/ x0 w1 W7 v) t; Y; k+ A
希望大家喜欢!! 3 [" d6 z2 i( _1 A# a* j
附件為:FFT.rar
8 y8 j& S  o: U  L" h  J" f
% z- ^) V! R3 D3 C8 X1 T. X我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
1 P* o  z: {: Q3 G% w- K3 L$ s* F' }. K+ f3 h
??? Undefined command/function 'AD10'.
9 J1 x: r: x  U+ @
8 b, r+ [5 R6 `) `/ F7 nError in ==> spectra2 at 43
4 C$ s% O5 p7 o# n5 t! ]d0=round(AD10(start:stepstart+M*step-step),3)/1.8);! F/ @( o, B* W7 \4 W
7 r" Z! P# x; t1 Q, I7 ~  W
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????& u4 B8 P8 B1 j
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
: o9 p) ?/ q* x2 x* i' V& ~要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
# |: h) T+ n& }0 a' f8 M6 z" s故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算8 `: R  l' I+ ~8 v! w, p

! I5 G3 j5 x0 j! v, \% L在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
! K7 }9 i) D3 t# m: r: Y/ Z5 c6 N- l  o; X* o- |9 W8 F
我看不到你的附件檔,故而實在無法作出評論
, h! a- m1 i' y# j0 @- J  r而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??+ p8 X' I9 }) q  c+ ~3 v9 }* R2 I
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????3 `1 T' m( _: h
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
; [% P) _: P, q. j3 N0 @7 \指令的寫法是否為:
- D; `* J! |* \* q7 S6 o- q; k
- d  G/ i3 e4 a7 @1 _3 E% i.MEAS TRAN DIGOUT' c2 X: L& ]4 ?4 J/ ~
+TRIG  V (Dout)  VAL=0        RISE=2' }. K5 D/ c6 l# b6 v% \" ]
+TARG V (Dout)  VAL=3.2m  RISE=2
$ V2 S9 R- K# ~9 Q# l1 W; G$ m+ V0 U1 Q
∼還請指教,謝謝∼/ `9 Y9 D) F1 F6 T( D

8 U7 E. Y8 L$ K* [另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
! B" l( M, D5 s5 ?+ J5 r4 t( B' z3 H+ t0 a, {1 I
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07% M5 {0 `1 Q8 I1 e

) I$ c" [! R3 Y2 lHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
" U; X% q% b6 ~2 G7 Y# g  N- B5 J) H0 R
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
. _$ }" c6 {& s( z3 r! Q故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料8 f/ H! u" Y: b/ m4 f$ l
所以,請再檢查一下你的HSPICE檔案吧. `( K3 k( X5 T- ]
0 B7 j4 \: T5 M' b6 B9 Y
再來,你的.measure指令用法沒有問題1 L; P9 `7 u: ?/ v6 m
但,你的取樣點及時間似乎不對
- ~. g: \# ]3 ~; O; U& L8 O) a) q你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
  g/ U6 A: V; ~1 L.MEAS TRAN DIGOUT
+ ?$ C+ ^, J4 Y- @4 c+TRIG  V (Dout)  VAL=0        RISE=23 ?* `; f! C' U! T7 z4 D9 n
+TARG V (Dout)  VAL=3.2m      RISE=2
& p5 m/ m% }! a; ?5 c4 o$ x" C4 R寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
, r& Y% l5 c' g那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock& r  |5 v0 ?2 R2 }
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
0 m: `! c: a) u再者,如果是用.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程式。
: g9 S$ a: X2 C6 g1 {4 |; ]' |; n# c( u5 O4 z
∼感激不盡∼
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# M! ]8 h; r. x& E0 d4 `* `
3 }) X8 A, P4 X" H8 S& m. t, y7 q% q6 G3 z) Y# Q: r' Q
.MEAS TRAN DIGOUT
; c  Q, `% ]7 T+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f+ \  ~; j: t8 O& N# J4 `
+TARG V (Dout)  VAL=0.976E-7               RISE=1
6 \. q6 j2 u" {1 B. m2 E
0 _9 Z6 e" l8 x∼還請指教∼! E% \( A) o2 z6 D& L
程式重試的結果,*.mt0檔案只出現:' X9 J' }7 v* Z2 a/ s
digout           temper           alter#            
& O( {/ |1 G1 v3 l* }( Y5 m8 h! d1.890e-12        25.0000           1.0000         
0 B7 C" n# [# N$ }不知是否還需修改?5 H4 D& u5 j7 O7 c, I, E  ]- B

' q% {; T7 ]" t! f  e: d[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
; u, W, n/ D/ ~& F9 t8 x你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息, M5 E5 ^8 A1 g9 N5 k6 B7 d
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
# E: ?. o+ |7 z
( h7 C! S+ w+ _' m$ N* S: r再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock% Z. y5 M( e# G, o3 {7 b
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock/ M5 Q0 `4 G8 t  w+ Q# }
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
' t- T6 X: q2 J再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???) ]6 O) _0 f; T8 y
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
; d3 z8 }, o" t  S! Q8 q.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us) `8 o+ ]/ e* e
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
! G. n' d, N1 r& m3 D$ O9 \.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
& @1 u! h- w; o9 Z4 f7 w.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us3 C6 x' G5 Y! B6 t
# F7 \- R4 J: B
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
0 u( C2 Y0 H) r  [+ V.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
" |* O( {& m6 S7 ~+ S) D3 R8 F.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us& L0 M( \7 o: |# \
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
% Y) _7 q7 c$ F
$ P. }" c  r. s" f! r我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
5 x. t1 p! I* P我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法3 \% y$ k) J/ P# B

+ x& M0 V$ v; M最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
7 V  g2 W# w' Q( ^5 [$ S可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。: Z, [8 t, \0 b
我大概講一下我的架構:0 r3 Z, M9 _- D6 {
我電路是使用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的指令寫出,指令如下:
+ J& g+ d5 @) ]For Fs=10.24MHz:
3 y3 p6 r0 s7 A+ I" b) sV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-73 \& L- j9 i$ S* ]3 Y& ^( c
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
* W( _- P# a5 G, B. T8 H+ D/ _For Fs=5.12MHz , C' J( M& f  a; h
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
# N# |# ?. E$ G' N$ I8 f0 EV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7- A" Q( c# C$ Z% o  Z% j0 N
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。3 }: r5 b6 {. p5 }
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
' A+ f; F: F2 B6 z& g$ K; L- Q* _3 n.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
7 ^1 K! K; U0 O7 s.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us  Q8 m, W* r* l$ ]- W! t
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
8 G( L' s! J- [0 z你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
  K1 h7 M. ^2 |9 T: t) d" f" _6 K, P2 y* w2 n/ O& e9 v
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方! d8 c' j6 h4 ^" d+ C8 A4 d
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
* i5 _. h: a, x! E而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?3 ~$ y! h6 v: f9 T: |
9 A2 I3 {  v% L* ^. u
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪4 h, }  m; G: e( f. f

2 _# C! G! T" t4 x, EFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要' o, F5 s$ f, B+ c) }- p  W
3 D7 ]7 D% D5 s: o
clear all7 ]+ s4 V) h% W( D, V' c) @- f
fid=fopen('dual_measure_rms.txt','w')
  @+ C9 Y# e$ K; Q+ X" Q2 Gfor M=1:1:1024
) g/ h7 b+ j: q9 b+ p% Q) y       T=M-1;
- r9 l6 H. T( d; b+ O9 s- r       from=(50*T)+45; %DUAL DAC measure time
5 Z% u6 O9 b$ d3 A       to=50+(50*T);
  f! S( y, ~- l0 [$ t- J. e       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);# y& ]/ ], i1 G9 s
end* |8 |( Z2 S$ w3 {! a
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用9 f. Y$ T/ t" h1 R" l; ^
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧! M7 g4 N! ?; c' J9 V' F# `
這樣以後模擬FFT就非常方便了
# \/ ^+ u5 u0 D% w$ t4 [) t看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間3 {# S6 [. b- d: ^( n; V4 i3 H
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
0 u* [1 N' o! D6 k" @4 m' |' a只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
# d. z# }0 I: S* w6 H/ r  {我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:5 G0 G$ P0 Z7 G/ _
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
7 I: ]3 e2 l6 @) r9 ]! s) Y0 G( ^8 {且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。9 z6 `0 E$ U  Z7 u
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。0 o; I" H3 `' p) I
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:' q- P$ Z7 K8 a6 ?: q3 t
clear all
  N, f- Y* j( p4 B$ G1 ?fid=fopen('sdm_out.txt','w')1 k2 C4 {2 M0 x9 J9 P
for M=1:1:10240 r; l9 j5 }% g% D
    T=M-1;  z. q5 c! ]* Z0 |+ T; u& k
    AT=(0.1952*T)+1.026; %SDM measure time* b% M6 P7 i6 C& t" q* P. C7 e# z
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);% e! P. K+ o' u' y7 u% f2 `
end
( s5 X8 q, ^% @試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
. \+ a$ s9 T' l$ F想再請問的是:1 M* ]0 O( i- ^
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
# J# h8 R/ @$ g1 I% @load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM+ ~+ ]% i! |9 y% |8 d: E( x
然後就可算出SNDR及SNR以及畫出圖形了嗎?0 q9 K6 W2 `& K) ]) J0 {# R
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-3 05:46 AM , Processed in 0.163021 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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