Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93615|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
* M. e2 B" h( w, e) M謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,) @% ^6 T% W0 X
要使用這個toolbox時,在hspice的.option中不能使用post=2.
: }$ K4 b! i. J3 N' W/ h可以用
4 D% g$ M3 A, A) w.option post# U$ q" j7 L) v
或是
8 O" b2 y# ]0 ~.option post=1
! u5 ]: ~1 n; U; D1 S) Y" N但絶不能用
3 u2 g) B: ~7 z. m.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
6 W4 t6 p8 s/ T' S4 k  @如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
) s/ w2 q& ^  W+ ]8 J關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
- j; R$ P( V9 C3 E) F. {. v( Q$ }' s+ v5 T; s, U8 G# F
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用- F8 |6 c8 W! Q. C3 K! G# k/ k6 |8 l  U
就是直接用.print指令把你要量的電壓印出來  |& z1 t% i$ M/ p9 w8 c7 F5 C
然後再用手動把印出來的資料copy起來
" J) P6 B6 j5 _% b! W9 ]2 [7 d( g" |2 f1 T然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。& E0 u+ P& e# O# N  d
, B7 J4 r) d% m, P
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
$ f0 P  A2 \7 s" e所以  只要將FFT後的資料  做一些轉換就可以唷!!) y, A8 m) c* J. I  o
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
# C# Q$ _- M( o- N2 C就可以換算  SNDR 了!!
5 X9 q9 W7 T5 w7 ^2 c  N' USNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式/ c" }; V' g, S- }0 t4 Z7 {3 C
我想,應該可以給你一些參考吧# a  W4 C; ]2 G& d
: C* G4 e6 x$ K' Q/ r  i. X# `5 T. a
% --------------Using minimum 4-term Blackman-harris Windows -------------
$ {9 D& N4 X$ a* Enb=1:1ts;+ }$ R3 G& g  m' {6 ?! A9 \5 ~
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
  c! u- Y5 K) g$ o8 o- ^) Y  ~2 iwin_gain=sum(kb)/pts;
' r! q6 h, ?- o( z' Skb=kb/win_gain;7 P  E/ N9 N5 I- b

4 m9 z5 ]8 E7 I1 ]% z* M% --------------- Calculated fft --------------------------
& a/ v0 n: ]4 t1 r0 m. {5 P! l9 Iyb=kb.*x(ptsttfi);
. o3 _5 r: s( h2 c5 hyk=fft(yb);
' O2 A$ c, }7 ~$ {) _$ U4 L  ~fft_no=length(yk);
( F& G! P! L$ g+ y" ?1 ^+ E1 Ef=fs*(0:fft_no-1)/fft_no;2 l1 w; W; ]3 b9 z
Pyy=yk.*conj(yk)/((fft_no/2)^2);
' H4 u, U0 [. W' Z; N+ U- o& |8 V# |3 }/ w/ R+ T  k
% ---------- Calculate THD ----------------------------) ~( \: g& X: S+ T* Z$ u
j=1;1 c" `8 r5 `% S8 J& v% x, s) U
for i=1:1fft_no/2)
( A; `! K, L- B4 T    if (f(i) == (fi*j))
# u4 B2 P2 ^! h0 Y! T        HD(j)=Pyy(i);     %% find all harmonic distortion components
, i* D/ Q# G7 s8 A" k& j  N8 ]        j=j+1;
8 H8 N+ G0 n' [! g$ t* F7 n3 _    end
2 K* Q- W% F* R2 l; W0 Dend
& U2 d  @% C, }P_hd=sum(HD(2:9));' q; R2 x- ]- F+ |$ f) ^2 R
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
8 Y5 d! B) V* `- lfprintf('THD = %g dB\n',THD);1 e* |9 J. F! B/ X4 f7 @
' F2 P& H7 x1 ?4 |6 D, f
% ---------- Calculate SNR ----------------------------
7 x: |: X9 n- h8 U5 a( tfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));& V- \% o/ _7 H7 o- u) D8 M
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);. s. X8 n4 w6 J8 u& l
span=max(round(fft_no/200),5);
, O- n( p  x& e1 LP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));# u. q5 T) W5 a9 g) t8 D2 Y/ K" A

1 d& N9 [1 {( d6 fP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
' g% {0 d6 u7 O# x* aSNR1=10*log10(P_sig/P_noise1);
. \$ s& k9 n1 e! B$ Qfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
6 G# T0 k8 }+ z& {5 a/ N請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。# R0 C1 p, |6 V! |0 \! l& q
! H& [" |1 Y# R# {6 H
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:+ w" }" M0 [4 Q: R8 J/ }
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
( |. E( H" E8 A0 h1 l  ?/ ^內容為:( M% S5 Y* [" Q, p- V( T: A
压缩文件共有三个文件:两个m文件和一个txt文件. |- T3 @% }5 c$ L$ J
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
) y1 N- R4 ]  u8 Y) X# A4 y) H希望大家喜欢!! * z5 W& U$ |# ?5 J& o7 m
附件為:FFT.rar
  b1 }0 A- K& G/ R  w1 j6 r- |0 w! p$ W0 Y. D! u8 V% J) V
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
' f! n& u8 P4 f6 i1 N( A
$ ^, Z# r7 _; `??? Undefined command/function 'AD10'.
4 F, G. R4 E! J' I- {" U
* ?5 S% V% t. f' ~# ~( e( x5 q8 `Error in ==> spectra2 at 438 w( c0 J' q8 C. _$ ~
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);/ T# \) M' K( @1 M
1 Z& m+ d: t4 R' g: M* [
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!& d/ |2 c  `# y: P+ v
- N. o' Z  i: v; L$ Q4 {0 l$ Z, T
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? : f4 ~9 M0 U- w
- j# P1 x& {5 \
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
" m. \6 d8 v0 f- c" O請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 & a5 f2 j" ~& r/ I+ u( F8 [
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
! b+ y8 A% G) @"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"+ s, T/ ~: t$ z+ d
內容為:* i  @. ?9 _0 }0 R6 R& j7 `5 x
压缩文件共有三个文件:两个m文件和一个txt文件
' h3 w- k! e1 Zspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。. ^% M7 n2 t5 X! V  M
希望大家喜欢!!
9 K- o* k! v0 ]4 W, L6 ]1 _附件為:FFT.rar
& y+ O  ]6 g5 n& b: b
0 d7 }" o9 a6 L* D( p我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:( j! T6 W& O6 u5 n- g( {; q

" ~6 w9 U0 M2 f: ^, T7 c4 t0 a??? Undefined command/function 'AD10'.: r; E/ G, d6 @7 a) p- a
3 W6 A$ x7 R! u/ B: D5 w2 s
Error in ==> spectra2 at 43
& C. j% d4 ], G2 N; c0 l, Z% ^d0=round(AD10(start:stepstart+M*step-step),3)/1.8);' H& W7 ^) R. \8 ^0 h

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

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????* X5 n: [/ D( P7 L9 {' K
附上上帖的附件

評分

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

查看全部評分

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

6 z3 w/ v! M$ d+ u- W& x* |/ u我看不到你的附件檔,故而實在無法作出評論, H8 |- V- w7 L1 C2 l
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??3 ?) G/ h& G. z1 ?# ^
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????2 [2 u5 P, F0 T/ p  [
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,+ f. ~7 a" w" r2 }% C
指令的寫法是否為:
$ j' G1 v- M% {9 y9 V3 z# {8 _0 Z
- W; j: J8 F2 o* h* t/ O) o: ^8 H.MEAS TRAN DIGOUT
& L. V! @9 b6 t" p- s8 _( W+TRIG  V (Dout)  VAL=0        RISE=26 Z. V3 F( t' |; s3 r) a
+TARG V (Dout)  VAL=3.2m  RISE=2- l1 u- ~# Q( {/ F' s* f" g

8 K5 y8 y" f" J$ ~∼還請指教,謝謝∼
  Z! k+ H* w+ G# C" t6 r
0 w- T- l; M. ?. l! Z% ^  f( T另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:7 i( ?  a5 P* M2 o1 ~( E+ k+ ?

( b! s" K; J/ ^2 V% |3 y' a1 xdigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
' ^- g, r% h2 {* t5 I6 }  e6 G. ]' i, }% }
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?' N; a* u0 D4 r# v/ m# F5 e

2 h$ M( U( h( }" S* i- b[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔0 {5 x1 j: \. r1 a' J- V5 S
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料& a! b/ k5 @- \/ e; H0 m
所以,請再檢查一下你的HSPICE檔案吧
" V( X9 z) d6 b7 r6 r1 y$ B* i4 m  s! p( ?% u+ D" D, x
再來,你的.measure指令用法沒有問題
# i5 D. Z' k' o3 ~! F/ }! i但,你的取樣點及時間似乎不對" B* T1 p! _/ Z4 `& N/ G; z
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:7 E5 L, K) a( Q# ?" D
.MEAS TRAN DIGOUT" W; m* O2 e& j  B; _) t& J
+TRIG  V (Dout)  VAL=0        RISE=2# r6 ?5 ]6 ~2 u' b' W4 |  x7 D
+TARG V (Dout)  VAL=3.2m      RISE=2
  e! u1 J2 d5 P) Z" F- S' _寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
8 m& E8 j4 j' \那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
0 ]- @5 c# p/ I) }# B另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=25 _1 h9 K6 n9 W* p# G* g
再者,如果是用.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程式。" M8 {4 a) [" @3 Y1 q7 _

6 x- H( `* e7 C- l; K5 }+ v, [∼感激不盡∼
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
9 M5 S) \$ K) |1 z" U3 }) X8 A, P4 X" H8 S& m! R* g# ~* C: a. C; H1 [+ O3 ^
.MEAS TRAN DIGOUT& f3 R- J4 z5 d3 L1 Z5 N! I; r
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f8 J0 A/ b  T4 c& t
+TARG V (Dout)  VAL=0.976E-7               RISE=1
0 z( W7 g6 h+ A5 O2 N5 }
) v; g6 ^6 ^7 {: i2 N∼還請指教∼
  i2 k' X' G: `- H8 u; C, i! F  j程式重試的結果,*.mt0檔案只出現:9 O  c6 C5 g3 W7 D7 ^7 K
digout           temper           alter#            
+ a3 o+ Y# a) r! d8 ~0 `  D1.890e-12        25.0000           1.0000         5 ^; Z1 }+ {0 |
不知是否還需修改?
# |7 d2 P* @1 b* \* b* W7 G& p7 e' Y) K0 M* `0 ]( Q2 D
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題! _) W) z* o' g# ~
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
, b: d5 s' E& G: V0 H. Z所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
7 k  s5 B9 D4 J# x; J
  w$ P' G& b- b/ a再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
! d. x6 o: X! R8 A" Q, ?& c' W0 V& m但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock* W0 X5 @1 w5 L; b/ ]
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)# N4 X+ t4 P/ J1 H5 L
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???% o2 V. c0 l; _+ e2 ~" i+ K8 I
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為  w* f/ d& p& O8 Q7 W
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us& O& a0 x( y( r* [* D! I5 o5 k: i+ l
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
3 {' |- f  y, d5 _; k0 {.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
- E" w# h/ H: i: _.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us; M6 n+ k. q2 Q. s
5 v6 M' \/ O5 ~) \! K/ [
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
9 A8 U, u0 X! D% P.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us0 K" G, @7 }* T7 q: B
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us0 B2 X: f5 b2 w: l
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us* b  R$ S: j7 N* l6 E
% U; c9 _4 @! h% c5 u6 x( ^- k% [
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
8 I1 q  e2 q: e  G: U我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法6 O5 V3 b1 n  M& f* o* v+ [/ c

& y+ h, I" J  ~2 W* p% D0 o1 b. c. }最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
# _3 d% u- m* J: i1 v7 }可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
% _3 r+ f& h& H8 N% \我大概講一下我的架構:& M  W9 k" P; v! f
我電路是使用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的指令寫出,指令如下:  x  p* {% A2 M- Q# V7 [" M
For Fs=10.24MHz:
6 I% G. N, V: k. {  pV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7) S& c0 T7 f( ]8 W: M2 ~
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7' G! ?. [0 \+ m# G9 E: ~4 D$ O" `
For Fs=5.12MHz 8 U1 l, A  V, e& e3 l0 _
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-70 P9 |  [7 X  y7 _8 m* g+ i* R( v/ r
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
, F+ C5 l$ P6 |5 S) O另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
( O8 J4 J$ y1 c, q6 K: z+ r& l' C如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
& h* J/ }, z' \' K5 T' N+ z.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us4 p& e# m1 E2 A" ^+ A5 S3 F* |
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
+ _( v/ I$ B2 H7 S9 m6 _2 h然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?, o; g3 L! O3 A
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!- `) z  C& k0 Y0 C, b

# g3 x. m% W  J$ [1 T[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方" F% }1 k- g$ [/ _  J/ ~8 b) B
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
% Z3 |. {/ K8 @; U9 K: b而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?/ Z) \! j5 [" ]$ d% A$ N
6 @1 z, E- a. q# F! Z+ j! X' u
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪, I4 ^- ]7 k2 Z

& @# z; g6 E4 {FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要- f. {0 B2 A6 [
# C9 a5 b: z7 z' p
clear all' }/ d% x) r6 W4 B! Z5 b- s
fid=fopen('dual_measure_rms.txt','w')
5 C1 \7 n$ K8 X8 ifor M=1:1:1024* ~$ _- x* e$ G* j, o# T6 X
       T=M-1;
& m, j, k8 V, t1 z       from=(50*T)+45; %DUAL DAC measure time; A! J  i4 d5 u& d# M
       to=50+(50*T);
' M/ Z, O  N# w; Z       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);* `/ L+ A) ]! _! f$ W( q) O/ i
end
& {( {: v8 V: s" s9 b  yMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用7 V! H  O4 k, Z9 a! J7 H! J7 M
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧8 ^& _. C8 o. t# E" I
這樣以後模擬FFT就非常方便了
% x* u, c/ d" w! P4 E1 p看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
0 W* Z8 s' ?8 C; l然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧) ]! J4 V: j" H- P1 r0 }
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
- a3 ?/ }* B6 s& q. [: `- \我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
7 C8 P% j, G/ Q1 L: ]. G$ h3 T因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。1 R. U6 o  C* ?" U9 z1 \# V
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。9 p: Q0 u6 _2 i
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。# f: }# ?: [3 L; w' s
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:( M  {2 K4 O& x- Z% V) @7 B
clear all
: B- [3 O. N% |) t8 mfid=fopen('sdm_out.txt','w')9 T' X' Z9 b+ k0 C2 P8 p
for M=1:1:1024$ N: H7 S& C! N- J, K- m/ m
    T=M-1;5 Z. E2 H+ c* f
    AT=(0.1952*T)+1.026; %SDM measure time5 X, ~; {) ~& E
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
/ ^- A4 b. B+ O* e5 Bend
+ ~0 C' _$ d5 D" `$ }4 ?7 a試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
, }" Z5 g) A% P* F' S7 e$ a想再請問的是:& }/ e' V5 |) d0 F- W. D: k
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:* n5 n9 _. g$ m( m4 X9 h( f
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM5 j; f4 s7 @8 u
然後就可算出SNDR及SNR以及畫出圖形了嗎?
, M- B0 B1 R  X2 ~6 G' u( P# S: l- s. T請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-16 09:07 PM , Processed in 0.154019 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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