Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用9 L* F8 T/ X& g# |5 @
就是直接用.print指令把你要量的電壓印出來
5 q1 B+ K6 {+ s* z" {然後再用手動把印出來的資料copy起來4 h* r3 b2 o( }# Z$ E
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。# |! w. G9 x3 N, ~! `- D
4 w. ]' N) i8 _. A. f7 ~
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
1 F5 N2 |' ~" f5 z1 e所以  只要將FFT後的資料  做一些轉換就可以唷!!/ m  s: l% Y( R& C
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
5 K+ Y* H9 }& n, i! x; h1 I就可以換算  SNDR 了!!/ H/ B- ]. C6 y# j
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部份程式: e4 a# _8 k( f% Z; x. n
我想,應該可以給你一些參考吧
  E4 s  b! [" w; x
' c0 F( v  n) j6 j( n* _# j, b+ M' `% --------------Using minimum 4-term Blackman-harris Windows -------------0 V5 B1 ^6 Z; [/ I6 W6 R3 W
nb=1:1ts;
5 \3 ~! a" h0 W7 K+ x, tkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
& w2 E- C. q* d- \  J+ O; F/ Gwin_gain=sum(kb)/pts;+ L. S! o0 w' _& ?/ ]
kb=kb/win_gain;
+ u. \+ `0 W# _/ x8 J# N( a' ^# D. c
% --------------- Calculated fft --------------------------
' F, p  d' ]7 A2 L+ N8 Vyb=kb.*x(ptsttfi);
1 y" J+ s. q/ T, k8 Gyk=fft(yb);
) ?8 z" Y. j- o* a" Rfft_no=length(yk);- E& K: a; j+ f
f=fs*(0:fft_no-1)/fft_no;2 {" O) j! }8 N' f' s
Pyy=yk.*conj(yk)/((fft_no/2)^2);: x0 r2 L. p7 w! \8 t3 i( p4 z
/ ]( [: L( o$ |5 Y; p5 z
% ---------- Calculate THD ----------------------------
! b  w# p$ r9 l1 C- D" _j=1;6 y: L) @+ |, C. E; P; [
for i=1:1fft_no/2)
, {9 D" n+ q8 ?8 C9 I8 L    if (f(i) == (fi*j)); C, I+ G  Y3 d% f3 l2 n
        HD(j)=Pyy(i);     %% find all harmonic distortion components
9 r0 Z4 G" l6 W7 W+ D* d        j=j+1;6 R* _5 l/ d" S" W
    end( W( C4 Z8 n9 F  z& R! f$ G
end
/ ]* v6 \) c7 e( d" kP_hd=sum(HD(2:9));' ~9 }2 K. M* C, N6 v
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal" C/ [. x# Y0 l4 n% n
fprintf('THD = %g dB\n',THD);
3 B8 K: v0 N% [0 _/ P4 [% K4 y5 A/ c1 b
% ---------- Calculate SNR ----------------------------
$ k3 ], d5 F- J3 |# r6 M  h+ Vfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));5 O0 V2 @1 q2 k* w
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
: s0 P4 B- L) h5 ?. Wspan=max(round(fft_no/200),5);0 S, Q  |5 \2 B1 w6 ?
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));* n5 U5 r" s* J9 b* c# n% g, o
; X: d) g& p: V2 b
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;! Y3 Y% L& ^# \; m; z+ q
SNR1=10*log10(P_sig/P_noise1);/ o. U* Y) @* S$ s6 K' ~. Y
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
9 [, |8 _1 `: B; i  F* A請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
( n8 [0 }. ?- \. u7 p$ a# N6 m" E  X3 S
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:0 x7 L8 |& m) m4 r- B, K' q
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"7 A; I9 G  E; @9 X! i9 Z/ a1 w) }
內容為:
# D9 b( F" y' `, \3 U1 n  P压缩文件共有三个文件:两个m文件和一个txt文件
3 L+ _. @( w9 Q# u& Y  Pspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。( P+ T1 h3 f) A$ B7 ~3 O, Y3 c4 F
希望大家喜欢!!
0 `4 v: r  f% E% s2 f7 z附件為:FFT.rar: m. k, j# f. V/ W8 W

4 e7 O$ I5 o# z: N7 U/ \: c  b. K; I我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
- t) \' b: _9 c; T% g
' _7 r2 ~2 r- e9 o0 L; C??? Undefined command/function 'AD10'.
8 [  u! o: z4 L( @; b7 s. G5 }' H
Error in ==> spectra2 at 43
1 }) r/ H: I& h  O' P- T( o  Zd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
0 P/ ~3 t$ g( c, C3 e
' E0 o/ ]) U) g9 ?2 }- a0 K, \% t) r+ F由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
* ^, \$ s& @; V2 a7 Z, D% p, m3 j
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 2 d9 D6 N. n. Y
' w( E, v0 W, S8 ~7 z$ t
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:# Z3 ^( }# b, `3 Q3 T5 m
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
- v, d$ t3 ?5 z1 y6 C& w另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
( w  m, {( J$ ]2 L/ x"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"; G( G- Q4 l) O; a* {( i0 s
內容為:) P$ l# m8 d* A& K
压缩文件共有三个文件:两个m文件和一个txt文件
. G) ^" g" R0 T2 r& Uspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。0 ]1 r1 d' |3 k3 B6 a* s! S! z
希望大家喜欢!! ' h2 @, U, x, J3 s6 r5 T8 j0 U
附件為:FFT.rar( i6 I6 |  ~4 o3 o  j: G

% C5 H. `  K8 e; Z# I0 e$ M我根據他的說明修改他的程式變為如附件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" J8 D# ^. i2 q* Y" U3 a' J- \* ~( ~; A; N
??? Undefined command/function 'AD10'.
1 A& o/ {  c# Y& v2 P! ^) J% C
: ]. S& O3 P! ^) f3 @' q3 PError in ==> spectra2 at 43
7 N& ~$ T  f6 {" c) [: Yd0=round(AD10(start:stepstart+M*step-step),3)/1.8);# ]6 H2 U9 |( A2 t2 K$ ?- d! b# N6 p
4 _. l# e+ d! |0 a, Q
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
) u7 |( P9 ]( i. W0 p3 L附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
  X! D9 K$ [. N要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值6 |! I/ m+ g, V8 e2 Y; F  g7 R
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
* v& H, k7 ^% @9 r5 b3 h( J
' P$ @6 V1 M6 S( K3 Q7 ^0 w在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
( z! w/ N0 Z; g' `& V" \; S$ y$ A/ N* r( M+ P7 c+ c" ]$ m% [2 p8 c
我看不到你的附件檔,故而實在無法作出評論. m0 H& _0 Z3 Q# W1 {6 ~1 l7 h
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??5 q+ t- F# V, |/ f4 ~# [! k
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
1 s5 W& X, m* u  A3 G+ |% F7 e% @3 ~所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
3 F7 X2 @1 X2 @! x0 L1 B指令的寫法是否為:
! ~1 k* y9 y- u2 A, I% @: j6 v6 ?7 ]: V! T/ B4 w8 G2 {
.MEAS TRAN DIGOUT7 i! `6 b# w* i- Q2 F+ N
+TRIG  V (Dout)  VAL=0        RISE=2
' F' |5 E( Z, |& A4 i7 P+TARG V (Dout)  VAL=3.2m  RISE=2/ x2 K  W/ x" A1 k7 B' y: H# t9 \
9 B' I( v6 T' u8 W. a$ j% y, C
∼還請指教,謝謝∼0 @) y+ s+ _( \6 s( e+ y& T
* U- ?! B+ F4 Z7 M0 D: Q# E$ L
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:; {; D* Z; m/ q! _
+ k& R+ W5 R3 c5 h
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-072 G8 o# s5 _; f% d+ T! t7 D8 k
% F. r: M8 m/ v* h2 B$ X* Q: P6 L
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
, ~5 @  C1 u6 `$ \+ @& S8 F1 N: Q- N* h* C
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔4 V; v: @% \# d- r' j- K2 L
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
; W+ P- C% }$ J; J! d9 i所以,請再檢查一下你的HSPICE檔案吧
2 E3 Z7 K8 ]6 B) \7 y. {& R* z  ^) A& W: M' _* w
再來,你的.measure指令用法沒有問題
; U' ?( M2 A" q" Y4 w( u但,你的取樣點及時間似乎不對
+ K% l2 l2 Z$ C0 E& @你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
# A1 l! c5 q6 n# U! j4 Y.MEAS TRAN DIGOUT5 a$ q* D  ~. D4 G; b' _( k
+TRIG  V (Dout)  VAL=0        RISE=2: G9 I, }4 v; ], L9 T3 F' c5 @
+TARG V (Dout)  VAL=3.2m      RISE=2
; B7 ^  ^% h/ H' r! C: V! E4 |寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
4 C. Z+ r  \, L+ h那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
6 T) f+ `; D" i9 G" u另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
! w; k1 V1 e+ g$ s6 P再者,如果是用.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程式。
& M/ M5 v/ ^5 y- }9 ]2 \% j8 r7 M! y# h
∼感激不盡∼
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
4 ~9 e& c/ u- e" R3 e2 i5 U3 }) X8 A, P4 X" H8 S& m
1 `/ S* ?& c+ X3 J4 @0 r.MEAS TRAN DIGOUT5 B7 A5 }6 J+ }" X  A( _
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f; l2 l! S# |4 D* I, P6 a0 s9 y
+TARG V (Dout)  VAL=0.976E-7               RISE=1) k. f( r# o0 E' _

9 f  V1 U5 _/ {6 @& L- T' q6 Z∼還請指教∼0 Y/ w/ U& q1 t% n+ u% U' V
程式重試的結果,*.mt0檔案只出現:
8 W0 s$ U5 }: }5 O% n! B; Mdigout           temper           alter#            
" P- y  u& b" \8 J1.890e-12        25.0000           1.0000         
1 j* T/ W1 Q7 j# \& [0 C: O4 S不知是否還需修改?
2 U  F$ e/ N/ B2 L* r0 {2 r+ V
2 t0 P- b1 q. ~3 C[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
6 e* C" [$ Z6 z) L( \3 `你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息+ a# J% G! z! f- K7 F' H  D- J
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧+ [. \& x" G: u. X2 K2 k
* f1 W1 M; \, P& i
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock! r0 ?+ {- O8 q! O
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
. o; ^: Y8 {* t$ |7 J一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
  ~3 ]0 K; w; v7 `' V再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
$ l. B6 ?$ W6 M( Z' t9 T舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為9 S  Z) s6 f; g
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
. C& Y( h6 N! O/ O.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
# y1 Q, x  n/ O0 V; U.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
4 v. b6 |  F" Y2 J$ E5 [# [* r1 T.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us1 g+ u7 B) L* m6 r  r% k3 ]
& @. s; I# U. p: O: C4 z3 C$ z
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us0 e5 T0 M% I7 ~+ f% N( E' D" u5 u2 \
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us% \+ ^- b. c+ x' L: i: H
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us9 B& A5 R% S0 _
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
  |+ D/ D9 ]' t. y& C6 U( z) l; X* o& S6 }& L
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code0 K% A/ T, O9 _( `, x6 D
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
2 ^/ L4 M; }! E5 s4 y% I' }& k* h8 E6 z
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us+ E& X8 r! @2 q! I
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
+ X' d& J- q. r* Z8 ?+ Y& l我大概講一下我的架構:7 K4 m' Q, G5 P* |& k+ x
我電路是使用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的指令寫出,指令如下:
% A  C8 |6 X# K/ J! H& R: nFor Fs=10.24MHz:0 c5 U1 K5 h8 r
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-72 R9 J8 S) ~& s0 ]# D
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7. O5 I" m% Y* D& b5 x# o/ T
For Fs=5.12MHz 0 w: B; e2 a4 s' b
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-76 R9 @8 S# a# u9 b& u
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
2 o! [* c$ c# h另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
6 K" c+ l! [5 k/ b) d# }3 l& C1 _如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:/ ]" n; {6 ~. k' d. P7 M
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us, r+ p- ]( x2 Q
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us* q- _$ x+ p9 M+ C, w( F  V
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
/ n, v8 D4 x6 D你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!; m# ?6 b$ d" u# x% j
8 @% H/ m5 Y. i* Y% L6 _; n
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方' Z' d" ]) o$ \2 N
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來4 x# x2 J/ i0 x2 C1 `$ |; ~. s
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?  D$ ~  f1 U6 C" v# ~- s  a# B8 F4 a
! L" ^9 W4 C3 D/ C. N  H0 V
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
4 Z: B2 `3 u+ P; U% j' |
; i, ^8 N: T. _2 N& B# ~, xFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
$ J7 n" x) ~3 D1 d: Q" U' C6 r6 A. i% l
clear all* x' D6 v9 z- @* C4 Z* z% T
fid=fopen('dual_measure_rms.txt','w'): T/ O9 T% L( o
for M=1:1:1024
( w1 B) e& L, t9 [" Y& g0 `       T=M-1;5 I( s; b( ^3 m1 w
       from=(50*T)+45; %DUAL DAC measure time: a) P- l) Y+ G, [; U7 e  I
       to=50+(50*T);
/ F  m2 Y5 [& e+ Z0 n       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
* x! N8 a# n& Q; g+ o: D5 iend4 ^1 X2 C4 z& t
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用  @8 q/ l( I; S& A$ z& t
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧% ^: d# f; z5 t. @8 S
這樣以後模擬FFT就非常方便了& F9 M: V7 b# p- I  D3 _
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
' M6 V/ Z& e* c1 L" V然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧/ M3 l4 S/ s- a* {# p+ _
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?+ K; Z+ b/ o/ ?' k
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:5 a' W# z8 @1 ^8 J! \1 I& G8 |9 e
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。- w( @0 ^2 E) [8 w: C* r
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
) `+ e  E4 r4 R/ Q2 X5 o另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。% o" I; O0 ^7 Q; L: m1 Z
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:; o- ^0 B% t/ @- C8 t. [6 Y5 \
clear all
; D2 f9 `) d7 J6 l) G) |fid=fopen('sdm_out.txt','w')
4 f% v% p; R" I/ b. C3 q% u2 Hfor M=1:1:1024
4 r3 @; P( f/ \3 u6 M3 W( Z+ E5 q    T=M-1;! c6 _& }/ U% h$ `& N
    AT=(0.1952*T)+1.026; %SDM measure time
' j4 a9 L/ i$ u) U0 s    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);  M- ~; b) q5 |; F% ^3 {
end
* K. V1 H' N' j5 e- l試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
$ X, {$ w0 y* s1 o  M6 T* k9 f( f想再請問的是:
$ j& \0 L2 v- m1 t  n+ \5 H  o當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:3 N% X& Z: t. e% i  X
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
* E! H5 S5 }+ y6 I' u% @然後就可算出SNDR及SNR以及畫出圖形了嗎?
# [3 k# Y( v0 n請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-20 08:49 AM , Processed in 0.141518 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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