Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
* ]& y7 T5 m0 E7 P就是直接用.print指令把你要量的電壓印出來+ B) V/ |- w! d( Z7 k
然後再用手動把印出來的資料copy起來- e" d8 g  k2 ?
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。1 ^: A) P# r0 v, F' `/ g* Q
4 c. `  c# D: t0 t: p% h: L8 v1 Q
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,   r, F4 k) o9 h9 |. ?! }7 V1 A# S1 W
所以  只要將FFT後的資料  做一些轉換就可以唷!!
6 ^$ s+ F# @8 r  E) J將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power": A* @8 E) L- E, x
就可以換算  SNDR 了!!
$ X$ c+ {: c- B/ |- T8 x" YSNDR 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 \+ O6 k5 K2 C/ v/ t. F: v$ }我想,應該可以給你一些參考吧+ S2 |0 V- F- e  f7 r0 v
) |2 \* C% q3 O
% --------------Using minimum 4-term Blackman-harris Windows -------------
$ Z5 e; m, f0 D& \, c+ g9 anb=1:1ts;
* Q, `1 N& J8 ykb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));+ V% j- x/ w% z& ?  E
win_gain=sum(kb)/pts;! Z# Q9 P- s: a
kb=kb/win_gain;4 G, `+ A- Z! G: c( Q3 ~
5 U: U6 f% H: ?: f$ p8 k
% --------------- Calculated fft --------------------------
' y9 a0 E! a7 Y' T( C8 x4 Byb=kb.*x(ptsttfi);
+ g; i0 P! G8 j/ d+ ~yk=fft(yb);
" H" Z& u$ C% Offt_no=length(yk);
, N( m8 I& @' A$ D" of=fs*(0:fft_no-1)/fft_no;
. Y: N+ u. Q7 ~) X! lPyy=yk.*conj(yk)/((fft_no/2)^2);
) {$ k( p+ q$ p  P# R! J& u% }: Z6 w) c  c/ M4 g% v
% ---------- Calculate THD ----------------------------
2 Z! |6 x$ J% ?  K9 kj=1;
. ?+ w8 y0 W) ]' j' v; Rfor i=1:1fft_no/2)5 ~, _7 J: o7 F# [
    if (f(i) == (fi*j))0 l' |  t$ ~: x
        HD(j)=Pyy(i);     %% find all harmonic distortion components- I! j* y. I2 d8 k0 w, ]9 Y% Q# W
        j=j+1;+ S( }: T, ~# \. ]/ x! c8 z, c
    end' O, \3 u+ w. b; c  c- ~% c! ^6 ?) h
end
4 o8 t1 t% }4 `. @4 g# pP_hd=sum(HD(2:9));
" _1 j# ]  }; |' E5 d& sTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal$ F% @, `; X: L  M+ x8 u5 i
fprintf('THD = %g dB\n',THD);$ A* ^# r5 ~1 j2 M+ a
; Q: y- i- r. P! |: W8 Z
% ---------- Calculate SNR ----------------------------& X3 T2 O+ H% ?9 R: K6 J, x9 y7 t
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));/ K2 E+ G$ ^$ F+ h0 t, }. l
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
2 w/ U9 b2 k+ m& w* tspan=max(round(fft_no/200),5);
* J% Q  b/ P/ n% E* b7 S0 PP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
% _" Q" @8 [1 H  o) ]+ F$ T3 a4 G
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
  B* Y! q; g) I# v( ~SNR1=10*log10(P_sig/P_noise1);
( v3 w$ @$ u( z9 Ofprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
2 i6 v" F* g; `9 r$ H2 _請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。! G: r9 ~! r) U6 j( W" c7 w

6 e; x% d/ M: N9 n- O% d$ q, ?另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:; o' v2 M0 ]* R8 x/ t
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
) c- C. D' i( n6 A/ ?內容為:; G" Y/ F. [; ~) Z( k
压缩文件共有三个文件:两个m文件和一个txt文件
. c+ I1 h8 G3 A: k. \8 f- sspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
1 s3 k/ Z7 J: r; O5 H希望大家喜欢!! 6 ^; A" }  y; t8 j
附件為:FFT.rar$ h3 q+ T. Z+ N! w
3 P: G7 L, Q( l- t9 w
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:& \6 O# G4 X  l  i2 F; g
' v2 ^& i/ c$ p& r# v
??? Undefined command/function 'AD10'.
# Q$ y" l6 U6 T- Z* {9 g8 l" |, {4 c( p' \+ L# ?: R
Error in ==> spectra2 at 43  U$ Q4 x' ?# L3 P7 _
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
2 `) F3 W, ?& G, A5 Y$ R7 y$ ~' [# \: V# C0 C! t' {# N; g
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!+ k- ^8 ~: I% M0 d- B7 J

* h0 f% d$ `% S$ c9 [. n, ^# u∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
( h* m6 ^: Y# @4 z( n, F: N; S. E) _  ]) e+ ]$ v
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:- p) z' c% N, \: Q5 j9 v! Z6 D0 \
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 2 @% `( V" Z# _, m6 E
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
4 B& c/ N. F4 d# ~# J/ R! z9 E"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
9 L0 k& ?  S' V5 ?, n內容為:2 N0 E5 H6 l) v5 n9 z; c8 x. l/ X
压缩文件共有三个文件:两个m文件和一个txt文件+ q+ ], }& @0 B1 @3 z! y: U- m
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
, ]" R5 G+ G. b* k9 G希望大家喜欢!!
! b' `% W3 C, m9 B: H0 Z附件為:FFT.rar) M. e. _+ {* x* r" S  w
0 c+ ~* g/ u4 Y0 @$ \$ j
我根據他的說明修改他的程式變為如附件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 u9 ^# S4 n& K& J
) p" Y8 V: @- b" D8 k' Y??? Undefined command/function 'AD10'.
2 y! O8 y7 D4 H( S8 N+ p: I" N! I0 t: F  s9 n
Error in ==> spectra2 at 439 `- [5 x. ^5 h' Z, o
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);$ \4 ~# A+ P7 E4 v0 Y) d( w5 k6 \

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

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
6 ]# e- u! t8 ~# {5 g8 ?附上上帖的附件

評分

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

查看全部評分

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

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
+ d9 Q3 W0 W$ J  l. Y指令的寫法是否為:
# B5 a0 |# N& N9 k7 |2 Z& H
+ ?4 d! ]5 a4 {2 K.MEAS TRAN DIGOUT
& H) \+ a" _+ B4 N% ]+TRIG  V (Dout)  VAL=0        RISE=2$ ~2 k* `# h, s3 Q0 r
+TARG V (Dout)  VAL=3.2m  RISE=2
5 W+ j! v) I) p: L2 B" [( @/ M9 o# E
∼還請指教,謝謝∼
" g# j. ^! h0 n6 ]1 M6 P! t6 z6 I# r  f; P' s
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
. E$ Z, K5 \1 d  Q
$ s" x( V7 ^+ m/ `2 I" ^$ Q7 Odigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-071 a- Q0 \9 l( e5 ~1 `

  K# N4 a; V0 F1 L/ zHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
" E1 S5 e% l+ u/ o; q& X
7 D% [0 l. _: {( R" ~[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
- n7 N# l1 ?* b8 n5 B# O故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料  j5 m9 \, k! p. y5 r; o( g: t! E
所以,請再檢查一下你的HSPICE檔案吧) l7 V7 y8 N! h
: J1 W1 D. m+ a, o  q% @$ u8 s
再來,你的.measure指令用法沒有問題
- B3 w) g% O' x但,你的取樣點及時間似乎不對9 ?% ~$ D8 u0 F" a
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:  p2 ?8 m( Z+ }4 d
.MEAS TRAN DIGOUT
9 }7 v, R2 x( {4 O% v1 e/ g9 n+TRIG  V (Dout)  VAL=0        RISE=2
& f- Q- W, |2 G/ H+TARG V (Dout)  VAL=3.2m      RISE=2: Z# n3 i% X' ~8 f% \! H
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
9 `' b  a5 ?8 E9 F- {' b, L那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
! m5 b; Z, M2 t& w( z4 P$ g另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
7 H- E& @8 ^% U8 @3 N再者,如果是用.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程式。9 x% O3 w/ t: A0 p9 a9 l

. U. A5 ~- b5 @3 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# j0 p8 H8 ^% u4 z8 S1 B/ _7 d" ^
3 }) X8 A, P4 X" H8 S& m
& z) k% c2 F! e; N) u" I.MEAS TRAN DIGOUT3 u' s8 V+ ]8 [% X% A* ^; O1 ]
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f0 f6 Y. W4 E+ h# `; d, e8 @
+TARG V (Dout)  VAL=0.976E-7               RISE=1
9 [. L! P! \8 O/ y
: T% k& Q1 d" O0 u& U+ g∼還請指教∼2 @/ `2 a. C% M0 k
程式重試的結果,*.mt0檔案只出現:
2 a8 ]; K% j$ Q6 ?6 c" r8 Ldigout           temper           alter#            
& L8 |) ^; p, v% a1 C# r. g. I! Z# l5 W1.890e-12        25.0000           1.0000         
7 u: H) i( M" Y- x$ }* A不知是否還需修改?* b8 p# p: X& D

8 y2 O) w4 M9 Z( U[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
9 Y' Y' j$ T6 ]你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
, j( a; ~( `8 ?3 T0 f所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
( v/ s9 b4 x) ?$ X* a  \  B1 p& u# |" s; q' m. `
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock5 U% r+ I* W' o- Z9 k
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
8 s& |, L! v  W1 b" f一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)1 V: l; F  f0 c# P$ _1 Q
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???7 _, J6 ?2 y0 `- b
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
5 G0 z' G: ^; b! i9 N& m.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
! m! g" V, j4 I9 ].MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us  z. ~$ S4 i, `# d1 }& n
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
. S+ l  D. G3 n$ C$ r2 C5 c.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us) @  J, t" x! g5 z

. `  ?7 _# T! E  i; Q' B" P( B.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us5 ~+ d( W+ |( [5 h; r0 N9 n
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us/ ]8 {. p& i) N
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
9 J. b# _  K, T* r& n" v8 |/ V6 C- k.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
2 ?/ _$ R1 U1 m+ ?1 H
) j% B9 {; c0 ?( W2 X我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code4 ~+ y9 y  X5 ]4 d* \$ ^! n: V
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法+ Z1 B* n8 {! \+ D' W3 D

9 x" a+ H* N# i) I# u0 o& f* ^最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us' L7 D/ w7 K; @$ J4 g
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。; T% w7 V! n$ A$ c6 d
我大概講一下我的架構:
$ A: `/ Q$ V5 [5 J' g我電路是使用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的指令寫出,指令如下:
% l5 W3 y. F$ @7 H7 e  k/ x/ e% x$ SFor Fs=10.24MHz:9 K; y/ c0 y! c
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7' U; E  ?' t4 }  Q3 g7 ^
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
7 j7 [1 W. i0 ~' ^. W! HFor Fs=5.12MHz
) q& V; i! b: E3 X0 JV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-74 x5 {7 D( J# i+ F4 N. w* P3 P0 D
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
8 n. g* ~2 n/ z' ^( R另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
! _9 z  E1 e- ]如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:' P/ ?, L- R& g2 B
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us8 H3 X# b3 p  K& A4 P
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us* j1 T8 ]: R7 \+ A6 t: k
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
: Z, L1 r2 @: t你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
% E- S% K! Q6 U7 J8 m* V% @# K- P& U8 V2 B3 R3 D1 g
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方  E- L3 h; H" e+ `
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來! K: h2 _+ q9 _- c+ |3 T8 f
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
; [+ d4 v0 o9 P5 e* t% U* R. ^; {) `' s2 J- t$ F
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪2 S7 K- @; y. r5 U* X
0 n2 o7 v/ t8 U! }1 g( A
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要0 M, f8 {7 ?0 v5 g% O+ z" E

9 [1 V6 c5 h. i+ z3 {  q- t/ wclear all5 y4 m. F- {4 c2 p, a/ {
fid=fopen('dual_measure_rms.txt','w')
2 U% Q5 J8 c& E9 M* g+ p  U4 Tfor M=1:1:10248 C, T) Y' [% ^; T
       T=M-1;6 {' T# z0 U# z/ w, A
       from=(50*T)+45; %DUAL DAC measure time9 g# `. L. y9 @: C
       to=50+(50*T);2 _: }$ ?: D4 E
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);. ^. O. q( w4 {) ]: E5 w: Z8 \
end/ N/ A7 o, w$ D2 S$ {* U
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用$ j" y9 t; D3 A* H+ `: y
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧! X1 O2 U# B- c- I
這樣以後模擬FFT就非常方便了
9 w/ ]5 C7 h0 T1 }: c看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
+ c% D! ?# c) }, s: [. W& z然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
- @. d! n5 s2 e, {$ [' b$ Q只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
( D$ c. |- X* o  [% K* G我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
7 N% P3 O% i; _; r因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
1 W$ ^% h4 K- G/ p且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
6 g/ i& O- e5 o) M, `. x& z. n- [' w6 k另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
4 {  |( |  Z3 |依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:! H7 a/ [9 ^3 x3 U) L6 [
clear all: k5 {6 H1 w4 k! A. V+ b
fid=fopen('sdm_out.txt','w')
% X+ |2 D) G1 H1 ]- ]3 hfor M=1:1:10247 J4 u# X) h# E
    T=M-1;
7 @6 C9 O, @( K% v    AT=(0.1952*T)+1.026; %SDM measure time
' p4 Y/ \- @8 C" |    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);: s9 S7 u/ o2 K% Q
end0 x# B+ Q, {/ a4 X7 @3 |+ x9 m7 k
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。. m: m8 d* z" V# t5 }3 O# W( T
想再請問的是:. r; g! Z5 X1 g' m- L0 ^* I' L" p1 Q$ ]
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
* P4 S, F, z( P  {- h3 ]2 xload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM. t$ U6 m( y! Y! \
然後就可算出SNDR及SNR以及畫出圖形了嗎?3 t7 K; q9 Y  {) g" f
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-16 06:22 PM , Processed in 0.210012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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