Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93492|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。5 n( Y8 [8 o- m1 w& i) e3 p
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,4 s$ \' l5 Y, w) \. p& q# F
要使用這個toolbox時,在hspice的.option中不能使用post=2.
+ I  ?0 s5 l2 t1 F7 P4 R$ R! w可以用
  H2 z0 L; ]  R+ B' ]; J.option post! I8 v7 O' \; }
或是( r0 P: m1 @* I+ y$ l" M, r9 }
.option post=1% e! S! E/ O! Q+ y% m
但絶不能用
2 E: y+ e" a% ]2 W& x( p4 W- {! y: T.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:$ l5 H  `$ E* o" J
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
" `/ w4 B8 a0 L關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
" |, W# ?6 U+ {$ f8 {3 g; Q3 [" c/ `6 A2 S$ E" I  r  I$ f1 I, g' K
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用/ q, h( L- w$ G; S
就是直接用.print指令把你要量的電壓印出來
! N4 G' Y. d) m* k然後再用手動把印出來的資料copy起來! P7 w# x" V, `2 N
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
* {2 c! O/ a- c2 x" F; U- n. k) O$ q" A' |# r) G$ p# Q! G9 c
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, ' j( l' x) h: A  |. D( v) v
所以  只要將FFT後的資料  做一些轉換就可以唷!!$ P- ~# v$ P' a5 D( Q  p7 R
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
' J' M$ c4 P, C/ U& L就可以換算  SNDR 了!!) s# S. _; u. c! v4 \1 ]+ N  ?
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部份程式
' h+ {2 y: N4 R( x我想,應該可以給你一些參考吧" z8 S: _, q' X2 I8 \# {

7 e1 _5 P; w( w/ j! e# E5 F) |% --------------Using minimum 4-term Blackman-harris Windows -------------# n7 U* t$ V$ s& W- P6 H8 \+ C
nb=1:1ts;4 D5 r6 g5 c; a6 ?
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 r1 L/ I# @/ h# a, ]* x. Qwin_gain=sum(kb)/pts;  a- w1 S8 i/ n) j- Z& b
kb=kb/win_gain;
+ ?4 d2 `: h  e( d: S
4 [& \  M6 R' Z* h% --------------- Calculated fft --------------------------9 I. F5 w9 w; c$ N, k
yb=kb.*x(ptsttfi);
2 g: I" `$ E: e$ b- O% R& pyk=fft(yb);3 G: \; M' u& G7 I" Z2 D0 U9 p
fft_no=length(yk);! r& x+ l8 q4 D3 J1 B
f=fs*(0:fft_no-1)/fft_no;" l5 i$ l( {! l. N+ r* f/ X
Pyy=yk.*conj(yk)/((fft_no/2)^2);
& r6 t/ e9 y1 m8 a2 N" \$ M* K; c; \0 ~+ {
* h7 g3 D2 _5 u" o7 N! g% ---------- Calculate THD ----------------------------. }( Q% X+ _, q* {7 L
j=1;/ q7 N* Y, ~) `) ]3 v5 D9 l3 w! R
for i=1:1fft_no/2): Y# p- ^" Z5 L- Z
    if (f(i) == (fi*j))
( s/ t, x" c+ n* y* E/ g" X9 S. S        HD(j)=Pyy(i);     %% find all harmonic distortion components
" T  B% o  A1 A# ?" b& B        j=j+1;
6 O& e: J2 [7 o: i7 i$ k! c7 J    end. F/ B4 B% ~: G1 G' T1 t
end
% x7 V, r, }4 ~; V+ N# X/ P. I- }P_hd=sum(HD(2:9));
7 m) }! p5 K/ ]) r& C: ETHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal' m5 u9 n( x- W  ~) R; o; r
fprintf('THD = %g dB\n',THD);
8 D4 R+ `. M) y. Z$ v! r- k7 f
; u/ b0 W  H. O1 ?' q- ~$ p6 d% ---------- Calculate SNR ----------------------------
) f1 R1 s% `* ]2 c/ w. `8 ~# z& ]* yfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
* m+ v: O7 Z' q* Y% g7 Lfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
" ]$ e; l) O* T& \4 `% Q9 Lspan=max(round(fft_no/200),5);
( E6 {8 e; t- f' o3 U; @P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));, k9 q3 v2 g+ F8 L
, L# F/ }, l3 p; u( {& w+ u2 m
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
3 ^: _: x! P* j5 o) I7 b. }3 [! TSNR1=10*log10(P_sig/P_noise1);
3 Q. w! a+ P  @8 e3 u4 P1 X6 \. ]8 {/ ]# Sfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:- ~" T, I+ L- r4 K
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。; O  Z3 H. A9 h) \! v# f$ o

8 r% }/ c2 O; f! ]另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:" P' ~" t5 G( }, Q. C; Y
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"8 l6 S# m: D9 F4 r7 v
內容為:; c' x* g( E7 e
压缩文件共有三个文件:两个m文件和一个txt文件
& m+ k3 n* G* X  mspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
, P5 P2 g4 }5 L: H3 J% a希望大家喜欢!! ; g; L$ Y" b, B- e* d9 Z( Q
附件為:FFT.rar2 j7 D6 `+ l3 {4 _- z, m, k
7 J0 I, ?% G0 \; T3 @
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
" B1 k8 l2 n: \- d5 f7 |/ a
3 C5 o) [5 v0 S??? Undefined command/function 'AD10'./ p# h. K1 P' f4 i

& Z/ K6 y% u; b/ ^, c  v2 r1 R1 jError in ==> spectra2 at 43( T! N1 r2 |' U
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);8 d( z  V0 p" z; s( t/ {* C

; \+ ^0 X1 O$ T" P5 }" a由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!% G& r0 O& c6 }! a2 V4 `) q
" t8 T0 y& E8 }* h
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
4 B. a0 b0 _0 _% b: z2 o. d$ _! L) X5 C( W8 m
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
& `5 y3 x  b$ G請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 8 V/ c0 ~! {( k) s9 T8 a: |
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
6 A+ ]' Z5 {, e+ D"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!". @, O7 j" x3 ^% D  H: l# [9 [
內容為:- K8 v% n& }! p* z
压缩文件共有三个文件:两个m文件和一个txt文件
+ I( W% X: n, f: T; t9 c9 aspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
3 O9 a* s, N' q9 n6 |, s希望大家喜欢!!
, T3 t' U: R  E" \3 |4 m附件為:FFT.rar
$ q  j% [  j: D& {! o
, u3 y  c& M- I9 k8 z1 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卻顯示以下的錯誤訊息:* `$ j3 g3 H% O+ G* T$ m' A

# d0 ?6 }% _8 u) e7 @3 L+ \??? Undefined command/function 'AD10'.
8 f( m+ D2 a0 ^
/ P9 G* t  }. V  E1 lError in ==> spectra2 at 433 _2 O* l6 R' |. }0 q
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);, i0 h* D* d! b: H8 f" Q8 E

/ {! @0 _$ E+ \3 ~# [. K由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
5 M( S& O$ V5 C( ?& Z附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
( z8 h/ Q! u& b+ A7 m要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值+ F9 `  G! w3 V9 ^: |6 M! W
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
7 f9 X5 g1 e2 j
; \8 {' a! ^3 y9 |9 x: a) [- x在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧0 O4 R0 |& o6 K& C! |9 T

$ Y7 q) j- R+ o8 d$ l& g' l1 R9 U3 L7 i我看不到你的附件檔,故而實在無法作出評論# E, x9 X; L; H" @# F5 X; v
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
; }) M& k4 ^- Z$ |, z% k從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????) I' |) b6 T# k5 K$ |
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
8 y2 J" [! K& s指令的寫法是否為:
# ^0 l% E5 f3 }3 w6 q- k, y! A* I3 l* I
.MEAS TRAN DIGOUT
6 v2 z: F9 J4 q+TRIG  V (Dout)  VAL=0        RISE=2; M# c  z, O& ^$ V
+TARG V (Dout)  VAL=3.2m  RISE=22 _2 h; j: g1 [6 W. |6 H

% w$ m/ I: d) L5 y: p∼還請指教,謝謝∼. k" k- M9 |/ _2 B3 Q+ F
4 d8 ^# o2 `* D
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
" q. j$ e4 U$ q4 y7 z1 l6 [' A# ~1 G3 b7 J" ?' I) D
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
9 {( H; R0 y0 I
' q% P8 E$ D4 Y' u" ~Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
+ D, A8 _0 H+ F' h9 j
' ^, X. w+ L7 {7 S& |- v- O[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
9 x; z+ R" e" I7 p% E# L故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料+ ?; t( W* q' H% f2 G) p7 R5 S
所以,請再檢查一下你的HSPICE檔案吧
) @; ~0 I# H& I; w6 @: z2 C1 K7 F1 ?7 o& S; E$ M/ y3 J: w
再來,你的.measure指令用法沒有問題
8 r, V$ S$ z) S, t# Y4 m但,你的取樣點及時間似乎不對2 |/ S8 {' D4 |- k1 u% b
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
1 k: P  A5 h. h.MEAS TRAN DIGOUT
( `9 |0 S( t$ ~$ E4 X+TRIG  V (Dout)  VAL=0        RISE=2
: U" J3 r) W6 l+TARG V (Dout)  VAL=3.2m      RISE=2
" R. F0 o0 u1 u8 ]* L寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
0 {. ^! ^: Z! [4 G/ ?那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock, h; Y- U4 O$ `& N0 p& q- {& z
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
6 p! ~. Q5 Y' ~再者,如果是用.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程式。
  y$ V* Z& [& r, [5 {& Z8 a* ~% S; S
∼感激不盡∼
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$ n6 P- E! F+ z9 D: ~
3 }) X8 A, P4 X" H8 S& m$ ]3 M  Q; C+ \) R" G  s/ ^0 u: Q
.MEAS TRAN DIGOUT' O8 C$ w! \4 F# Z3 `" I
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
" s& ^' M) e7 H0 n4 \+ e+TARG V (Dout)  VAL=0.976E-7               RISE=1! |8 {6 ?+ \1 M
7 C$ ]- f+ @% i) [: m* }5 N
∼還請指教∼% P/ c: v. u. C; x( u  r3 i
程式重試的結果,*.mt0檔案只出現:  x6 m/ P9 R: N) r! a- R' K
digout           temper           alter#            - M/ ~6 ?9 m3 H$ O
1.890e-12        25.0000           1.0000         : @& Q4 y3 p9 N) O  w, {' k4 f% M
不知是否還需修改?5 R/ H& Z; `; F' ^7 o' y  a8 }

! h; u4 c( \: [; M: L' U9 L[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題: V3 C! k7 B- M5 ]7 P) t' _
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
9 U* p4 V7 v& f0 K# [! {所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
. H$ Q6 F" C8 L0 L8 s
+ k+ _3 E) ?1 z( P3 N6 m再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock* ^7 ^" f* j+ b
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
# |. {4 N+ `4 z2 F* m/ j  N1 o! Y一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)* V( ]: {$ O; W6 ~! G/ P$ I1 s
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
* k0 l; \; O1 h  U舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
' `0 p% ^6 Y+ o5 v" J- s: C/ p.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
* y- E" x: q* _.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
& o8 k* w' @2 w1 p( w" M* T.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
6 y' p- B9 {* l& n.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
/ ~, {: `8 }$ ]6 g1 S$ K; r- W% T3 y( o1 ?7 f1 k) C
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
, m) K( }) J" T" c7 {2 U1 _.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
" d4 x: Y/ o4 }' t2 T.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
7 [; F  E& T: I- z# X  D.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us1 c" e" V2 D4 e8 n, v  ]- A

8 M( F! f8 s9 S4 D: D. n我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
& x7 B( ?( t+ l2 R/ p$ I! b: P7 d我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法! _# i$ Y$ T) G: V9 d

" y* G2 W. W7 r最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us. H6 M5 n2 M; C6 l
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。$ ~) _: m9 J& X8 d5 B6 g9 M2 {
我大概講一下我的架構:5 t! l8 I8 l1 D( v/ a
我電路是使用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的指令寫出,指令如下:/ E6 i8 }4 X0 o& Z1 N
For Fs=10.24MHz:4 N+ x9 J% N  _+ G# c( x! f' v
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7' G' Y/ q- q# w
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-71 g  ?# U* D" p7 H: Q
For Fs=5.12MHz
% ], l+ r) C8 ]- w" QV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
8 O  j* S! b6 g5 S* s* _0 MV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
" L% q1 `; k! M$ b7 x另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。3 a. c% r1 ~8 N& K  W
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
: E* U9 b: x4 q, V! P4 N0 o1 }.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us$ ^( _- Q; Y8 c3 H& i1 V1 y
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us( J% @2 G9 ]+ V; E' T% h
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?( Q  G# E! C7 X  h! G1 f& m
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
$ _$ m5 _0 U, P. }( {
/ l2 ]) v$ R1 S5 T" ^[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
. [) t0 R" ^: N7 t首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
7 S4 r9 s9 P  R: \) o( S6 p' h而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?+ Z& P- w$ I( e5 w$ E+ Q! l

# E/ Q- r& p4 p再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
  j7 p% A! h) u6 G" v* u( T
9 p: Y# T7 T  e9 N( H* H# e' FFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
& G( ~8 c5 B5 I9 x  s4 D5 a
% Q! |- K: [- Fclear all
7 \7 C* N( j: j) z1 f( ufid=fopen('dual_measure_rms.txt','w')
% w  p: ^3 R+ ?0 [for M=1:1:1024
. y$ D* @1 E$ m- L5 W) g% T       T=M-1;
+ r! z7 W1 d9 I5 c# ^7 N6 ~- O       from=(50*T)+45; %DUAL DAC measure time
0 x& j! T/ y  R- E$ J       to=50+(50*T);8 i" E- F& ]# ^# ~
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
6 c* l" t7 i7 }+ S; `1 y( Vend  g& g* x1 z. g% V  U1 M
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用0 O: R: I% ^! z) k) O" J4 c. q, J
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
; u  ?4 ^/ _" l1 q& j# M% e這樣以後模擬FFT就非常方便了& o# x3 V! I$ G% q
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
6 b9 @8 S* \& F5 J, c7 H1 @然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
% }$ h4 J9 [9 i: J3 R只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?- M7 V0 O3 }1 c3 _! s' @2 R  d$ a
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:: y0 |, V: ]% h/ \# n
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
- a0 S" U- F1 }; T9 `3 F且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
  S  z) A+ h( J; U. d另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。1 C% m, D- M5 ?( M0 t6 W! i8 o
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:, {  L( O1 R+ U
clear all! s' G( ~. A0 Q6 L- l- H! s) a
fid=fopen('sdm_out.txt','w')
% q+ M5 a1 G% k" R! g8 ?for M=1:1:10241 _- n: u- u7 i9 j' c! l! P6 |% z' u
    T=M-1;
- [4 n5 Y2 |4 w    AT=(0.1952*T)+1.026; %SDM measure time3 w: B: i" \* x) Q8 G
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
' J: J& r6 d5 f; Z4 rend
7 a7 Z8 s) x$ \( \試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
' E  X0 C7 ~5 X4 L& |: E想再請問的是:
; O8 z' K0 \5 W$ |5 ]* \) ^1 J$ m當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:$ I) D5 @" p; A" i1 s" e
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
! b& O" j, g0 s3 f1 D! R! j然後就可算出SNDR及SNR以及畫出圖形了嗎?
, b0 l, k- a' [. O! u請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-8 09:11 PM , Processed in 0.159020 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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