Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93628|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
1 \4 L" O9 u8 Y& g# }謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
2 I! g4 q9 O+ `$ j) g3 ^. Y要使用這個toolbox時,在hspice的.option中不能使用post=2.
3 }8 O% h+ p% \3 {3 {可以用
" y4 u/ i  N6 j. |% `4 e.option post7 D6 D  d! W8 }+ K
或是0 p* j4 M# |$ x) g! ]  d  @
.option post=14 l9 k. p+ h* P+ Z5 Z$ Q' I4 j
但絶不能用
  \8 j# M8 x6 i2 H.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
; H, h  Z6 [$ B+ H- {( U* ^如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) ~6 F5 ?) k3 b) P! b7 P: U8 o; w
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
0 \7 o" R" X3 s0 @6 I1 k) f4 d1 n2 S. H4 e% D9 J9 ~) m
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用% @: r6 S+ j2 O) i
就是直接用.print指令把你要量的電壓印出來
1 z! M" `5 j1 X然後再用手動把印出來的資料copy起來
2 A* q" |" M4 h# Y7 `) @* i然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
3 W8 M. g: c3 f7 W0 s: w& f8 Y% I! @( s1 r" m0 T8 x# l4 c
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
2 Q. H7 v" M( v: V$ j$ v所以  只要將FFT後的資料  做一些轉換就可以唷!!5 r! w; w7 T( d1 \2 K5 N( I& T
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"6 w4 [& x& g5 |, L1 N* h
就可以換算  SNDR 了!!" ?$ A( E1 Q! c
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部份程式% v/ |! N  @# _" M7 }* K
我想,應該可以給你一些參考吧
6 x& s3 K  o# l  i% F( @' E( c. P) A/ v1 _0 f8 H) `" |
% --------------Using minimum 4-term Blackman-harris Windows -------------% z% F3 Y, ?# ]
nb=1:1ts;
7 ]% S# a: ]. v7 G" Q8 kkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));. V5 u1 R" o+ ^3 _/ x5 e
win_gain=sum(kb)/pts;
8 f+ z0 f" \4 Bkb=kb/win_gain;9 d6 S- q5 n& b7 Y. }( w8 Z* a% j

4 M' B) A' p+ l* R: z% --------------- Calculated fft --------------------------
1 d# U! ?0 `- N& Z9 B  `  U" vyb=kb.*x(ptsttfi);4 O% s  @  g9 e5 M4 a* i
yk=fft(yb);
; G; B0 ~. I* `, d/ q7 Zfft_no=length(yk);
% w; {1 Y2 U+ V' _5 [f=fs*(0:fft_no-1)/fft_no;
$ v! x1 A- o  A+ e) D, O4 l; B( a0 wPyy=yk.*conj(yk)/((fft_no/2)^2);8 X/ M. U  N1 X% G/ x6 c

2 e) c2 g% v5 m$ M7 I  D% ---------- Calculate THD ----------------------------
( ]7 h% f6 t5 I, S, u! rj=1;: D, Q- X  Q; A" O
for i=1:1fft_no/2)
. q- \' y9 [* Z; U6 z    if (f(i) == (fi*j))
8 x; s. O' G% _+ v% I+ f, O; E        HD(j)=Pyy(i);     %% find all harmonic distortion components
8 k( h- p$ ?6 i: U0 R        j=j+1;$ h* {# o. Y0 t% M; _4 Q4 j+ l
    end. r( R3 c( Z( L, D$ u' ^
end
1 V/ g/ z! b3 d/ @( S4 aP_hd=sum(HD(2:9));' }5 F  w8 ~# @1 c7 t: O
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal7 a$ L8 L8 L" s7 H7 o' X9 d
fprintf('THD = %g dB\n',THD);
( `5 m( b3 e, C9 x% I9 N) B1 O2 y9 M1 R
4 @4 t8 W1 q$ |( v1 K% ---------- Calculate SNR ----------------------------. ^' i  I7 L4 X
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
" {# v8 ^" [3 J3 b9 C$ w0 n9 G4 Qfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);% v3 D2 q4 T2 V: X) ?8 p
span=max(round(fft_no/200),5);
+ V2 z/ T! h+ V! `* ~P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
, v) i( J3 W6 B
2 x* N- f" I0 G6 n4 t; UP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
1 J1 `, L7 {2 K/ \0 U" h/ xSNR1=10*log10(P_sig/P_noise1);& h- ?0 o. x: L9 L/ I
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
- F9 z, d8 N6 ?% i. r請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。9 m3 [: F0 t+ i# [+ o$ S
6 {+ y3 b1 U0 @% }# }& a' G6 r
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:# t" O6 \) a: F+ n  e% @7 V5 j5 ?+ G
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
1 n2 r0 F9 p# S% j1 e- c' M: ^內容為:8 Y2 I8 a! ^6 d; N% H2 z
压缩文件共有三个文件:两个m文件和一个txt文件5 N" P+ m+ K( I( p  s7 u0 }' T* J
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
3 A6 ?9 y0 s! b; p$ I希望大家喜欢!! 4 d( E* `, d; b4 Y. O
附件為:FFT.rar
9 k( K1 c: W" T- s9 i* T4 u7 n3 p7 V
5 P) Q, z( s$ X1 R9 P0 {我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:3 J- T" q7 I1 y/ z$ _
( O4 Q: f/ L9 N' i- A
??? Undefined command/function 'AD10'.' B. s; e% w/ j! K, `
! a1 m- t. _/ b# P: l6 m
Error in ==> spectra2 at 43- i, u4 ~! W, ?0 q* v# H9 j# f2 T% Q  E
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
' G! a* `4 h* p  {  ]2 j/ Y9 s5 b+ b# I* O
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
+ N' e2 n, i- V, J1 T% ]! o, c0 e2 ^! K5 y3 s- ^8 p6 ^" G) z6 |
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? . A) U6 K1 {1 F* c
6 f$ `6 m% b' J9 Z- H8 ]4 C
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:# j6 P- ~4 O2 J% L% _2 x& t
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 , n, n% }+ t+ F0 v# a
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:$ y4 c# B# ^' d) s
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
6 E" |9 O' `. U" G8 z+ B內容為:
0 i8 B5 d6 O) N压缩文件共有三个文件:两个m文件和一个txt文件
9 x* g: u$ R& n, V* C/ }2 p" Y9 Rspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
2 t! d8 N2 e7 f% C# H- P8 Z7 e: m4 k希望大家喜欢!!
" Z6 s. L4 s( s附件為:FFT.rar. f: C, ?  ?; N4 s
4 D; k" N4 @& z2 f2 K
我根據他的說明修改他的程式變為如附件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' g, e+ P: e) o
9 D. W$ t$ a5 N, s0 c5 r3 n
??? Undefined command/function 'AD10'.
; ]4 j; `: A9 b% i/ _" Q" o5 @
0 @! B- T  U/ B7 QError in ==> spectra2 at 43
- k! z7 X5 u, Cd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
9 f+ j! H  R8 M- X0 d. B# u# I: e
! f# Y+ K5 }4 Y由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
: l& J. a- E; J附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
6 s& `- H6 T- q7 p0 \# ?" \要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
3 S3 L  F# X  k: d故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
7 n2 [$ }: `: ~6 i! ?' _0 x* d  e3 l0 C6 K  V+ x
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
$ |3 {+ Y( K& m% v$ @; K6 Y" t# S9 r6 w$ n. V) O
我看不到你的附件檔,故而實在無法作出評論
6 }9 r7 [3 e" R2 d# {  u- _而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
" C! P3 G( f& b5 f從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
: y+ y) R; U' D0 |) d/ G' Y2 `, R3 `所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
5 n/ c" }% K# |. f4 q% h" w指令的寫法是否為:8 ]% ?6 N5 s( R
$ u. l$ z! |6 }1 X, b/ e5 e
.MEAS TRAN DIGOUT
; p- l5 N" O" J+TRIG  V (Dout)  VAL=0        RISE=20 |, Q, V: v! A  S3 V* f
+TARG V (Dout)  VAL=3.2m  RISE=2
& Y: R) K* z3 ?2 [) U/ o- X
& @1 H9 U5 ]: M∼還請指教,謝謝∼
( [! Z2 A) F2 O) y
& N/ c# A5 P3 v0 u另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
7 V- z6 Y* z0 h; O3 y
3 s3 U/ Z6 R1 n4 P1 _4 Ydigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
) _3 \, C2 H( s6 g& @8 b: ]; n' ~2 Y3 N/ ]
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?/ Z2 d9 D; {1 D4 w; j

- N0 g6 w* n* _) U[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
. x0 p( R8 y1 j故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料* m7 Z3 h) A" s/ G6 @& |. d
所以,請再檢查一下你的HSPICE檔案吧
# a  P% Y/ U$ F/ Q, h( V+ d0 ~6 P
2 ?& N1 y# s, m1 n8 X8 ]  g再來,你的.measure指令用法沒有問題
2 Z/ Q( h, n& N! {9 I9 p2 D但,你的取樣點及時間似乎不對
& d: ]) Y/ ]% V3 A! }4 a你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:; w2 H: x# v  y1 z( W8 R
.MEAS TRAN DIGOUT6 ^4 @. J1 ^2 `' ~/ f) l
+TRIG  V (Dout)  VAL=0        RISE=2
9 ?- ]0 Q- X; h3 A3 P+TARG V (Dout)  VAL=3.2m      RISE=2, S' ]  p) F$ @- |! V0 m5 p0 \
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話' F& v& p6 |% h2 Z- {/ o& S
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock$ x7 h1 ~0 i- l" W
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
! i2 n+ W: J/ ]/ j; ?再者,如果是用.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程式。' A! \+ k8 p$ I( Q% W: [8 v

# ]) l" J, G* d7 Y∼感激不盡∼
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
: w) y, Y' N% R9 ~/ E1 c/ D. z3 }) X8 A, P4 X" H8 S& m
2 x$ k* y! \+ R4 k& ^& X1 Y.MEAS TRAN DIGOUT- X, E3 O% I2 l( R/ a" T8 a
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
! Y1 o& N) n' j  A6 q7 b2 u( w& ?# i+TARG V (Dout)  VAL=0.976E-7               RISE=1- I# E% f$ g8 ?( F4 u

2 C- y2 k5 ]2 X- d∼還請指教∼
+ \. ^& ~' R) v8 z# ]程式重試的結果,*.mt0檔案只出現:" W; X$ W2 Q; l( i' Q% J
digout           temper           alter#            9 A  X: \5 D: Y% `' e- i
1.890e-12        25.0000           1.0000         
+ H* J0 M1 `( D不知是否還需修改?
( n6 s$ z, I8 i
% t. M7 O, {& ^+ _" _[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
, K1 n5 _/ u( b. {& @6 b你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
: h: f6 i* k8 A: |7 ]所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧0 \2 ?, U7 b" f1 @

5 w% F7 b! o/ r5 D( U再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
: z! P" _  B1 }) `" S" X8 l4 O8 Y但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock2 m( K% \2 B) {/ |* l
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
5 r5 [6 U$ O. @* _* ~4 v( U再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???6 O$ H% y# F1 ]: u3 Q2 T" J+ w
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
% F; c$ G. S! o8 J.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
$ B2 S  `  ?$ }# F.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us1 E! o" W6 L( p  \& W" z
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us" R* S8 `# }: i. P* u0 F
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us- ?# m# x# a, p4 T8 w2 H% p- A

& u/ E% q5 [5 R: I4 _5 P8 `% o.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us4 L& @) |9 r& X8 r; r
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us5 D$ j3 C  ^1 w5 j& C4 i7 Q
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
/ A5 M' ]6 w% r& U.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
0 }' B) I1 A  [$ _. r+ \' A% S7 K- E. o! |* V, t
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code' L, ^9 o+ y7 N, F
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法# T; z+ \$ |  F" Z: @0 v
% X4 P) S* A1 c7 @' {, B% M
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us& S; f3 M6 P/ w; I% s9 ^
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
/ e* ^2 o; @* u' @3 J我大概講一下我的架構:: O; t  R6 G* G7 v( b5 c, a7 [
我電路是使用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的指令寫出,指令如下:8 e9 E8 Q" d5 [5 a  K5 ?, f) G" p
For Fs=10.24MHz:
' W" E+ ?/ v+ ?, Y% D; jV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7/ f& a- s: e8 v( G: O; X% N
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
* \; K7 V# g( \. X1 \' y5 n3 ?For Fs=5.12MHz 3 G$ _8 P- m+ H4 b0 M& X
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-70 d! L- t. W9 [6 T( j4 Y, J
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-73 X; X+ d3 W  _4 r. P
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
0 O2 s7 t' m+ R/ B+ M2 @, Q% R* i如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
9 t+ g5 e% u9 B3 Z) ?.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us4 ^" V. b: d  ]1 N& Y
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
6 X6 N8 x' t' y, z4 r然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
, J* R- G2 o7 v5 t6 A你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
7 f' w. M! G: I! k1 b) R0 [6 }/ K
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方9 Z8 d) c" q8 }# U3 {  Z. X+ R) ~
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來$ @% N( i( U; i& B/ f
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?; B& y* p4 Q4 F/ i5 v  M

0 a% r$ S7 @' p# J' k再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪0 d" `1 I* W. x/ }

! ^. o& c: [- c& xFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要9 X) q( K3 f- D

8 ?- x+ M7 _0 {0 t9 W& B3 {clear all
: t# A  U/ q# i4 W7 dfid=fopen('dual_measure_rms.txt','w')
6 F: h6 K7 [, ^# Sfor M=1:1:1024
9 q  H4 p- q3 W) Y1 F! D" _       T=M-1;
$ I) B3 |! Z* s8 i8 a! I       from=(50*T)+45; %DUAL DAC measure time
9 V, M0 v! ~% S2 N3 d       to=50+(50*T);
3 s" x( O0 {: l# H/ U       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);# m$ O8 k2 h* F
end
4 I8 O+ n( H. `* {  n: qMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
9 x# [9 S8 M' P6 T. T& M這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧" c/ h1 Q( Q3 e9 e; ]3 o' e
這樣以後模擬FFT就非常方便了: ~, q) b* b, `: H
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間: @- @7 D/ u! C4 B3 h
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
0 ^7 g7 c7 i8 w$ B# u只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?* k( ?2 H% w8 d/ D& ~
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
* u: D/ x! J$ d/ W* R$ n% K因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。! R+ N+ O2 n3 j! F
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
3 F- a* I( W2 c0 [/ U另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。7 G1 [0 }# Q4 n! ~
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
! X5 b0 G+ p3 o8 zclear all
' l7 N3 K9 ?+ b) a- I, hfid=fopen('sdm_out.txt','w')
8 I) [/ p7 l# m3 T9 v- nfor M=1:1:1024
8 `1 s& }3 N' E! @( O$ ^    T=M-1;
; _/ b! E6 V( v& \8 `0 A& H    AT=(0.1952*T)+1.026; %SDM measure time
0 S4 B! s0 z& E; E; N0 I: n    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
3 m: T5 d, C; q4 ]9 kend: V) s& m& ^0 L) t6 q
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
1 z1 B8 ?7 ?% J; U" k5 z想再請問的是:  b+ E$ d4 c* G6 S
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
0 Z" s9 n: ?" h+ b: T; uload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM5 \1 V" D1 P2 U9 X8 G/ o
然後就可算出SNDR及SNR以及畫出圖形了嗎?
5 X- P& j- X0 t+ |. F請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 02:17 AM , Processed in 0.172522 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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