Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93253|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
# z; o* E/ G3 x2 g7 x) ]7 K5 P謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
, m( ~; ?! s" o! J$ }8 O要使用這個toolbox時,在hspice的.option中不能使用post=2.
- W. o7 E" [1 H可以用3 Q/ r  Q/ i+ M7 d# [, ~1 I& i" o1 w
.option post
/ v% J5 [7 t5 j/ ~; t1 a6 \或是
5 [' c3 G! @8 H  y" E* \  ~.option post=10 t0 S) k; b5 q4 x5 ?
但絶不能用
+ ^# Z8 p" t8 ], v.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
4 j6 j9 O, X5 R4 G% {4 V  h6 b8 [如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
( s! y1 ~) I- I- {7 L) W關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
& y" g' f' j+ A# D* ^* D
% N1 j* z: ?/ v! Z/ a/ J+ b[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
& l; Z2 |9 N  F) F1 O4 A就是直接用.print指令把你要量的電壓印出來- S1 n9 v, w% n
然後再用手動把印出來的資料copy起來2 Q5 ~9 h$ v+ V9 r! h/ z& }
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
8 X6 N+ Y0 [  j1 q! ~" u- _6 h+ J9 ?; ~9 I
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 0 M2 D1 f3 G. U$ }9 s
所以  只要將FFT後的資料  做一些轉換就可以唷!!
8 U* u: X7 Y) R( C7 C- k將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"5 f0 I" D- M+ j& S+ p/ c
就可以換算  SNDR 了!!
6 O( w! ^! @4 A% Y8 J/ J+ rSNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
  n: f: w, E: }8 A4 @我想,應該可以給你一些參考吧
( w- L2 y! o  O2 [7 e( J& J/ ~0 o( S4 s9 D! B1 m  h/ p' e
% --------------Using minimum 4-term Blackman-harris Windows -------------6 o# m& G$ i2 D$ F7 u+ l
nb=1:1ts;
) a: ]5 [; |# ]) G6 H6 s, q- Zkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
- o# D. a5 x+ n1 _win_gain=sum(kb)/pts;8 E5 I/ V: a, I
kb=kb/win_gain;- W2 f" u1 X/ I8 t3 B. T: L

" l2 I* N2 i  O1 S5 \% --------------- Calculated fft --------------------------% J# R; ]  J  H/ h; `9 @
yb=kb.*x(ptsttfi);
; c( P- i- v3 r/ G" T1 t( i; z, xyk=fft(yb);: Z% F( T& s/ o" p4 S$ J6 j
fft_no=length(yk);9 T4 b- D0 w8 \' X; }# y
f=fs*(0:fft_no-1)/fft_no;
! ^: L1 A% T! OPyy=yk.*conj(yk)/((fft_no/2)^2);, Q8 ]) b, ?( \+ j. k/ o2 {
1 x+ m) \$ S9 p$ W# L% L/ J
% ---------- Calculate THD ----------------------------
* A3 p$ j8 U3 r4 U9 d1 e. X$ ~j=1;" [! X) Z  y$ m1 t- A4 S
for i=1:1fft_no/2)4 i% O2 f7 H2 G$ S+ `% b9 W* }* l6 H
    if (f(i) == (fi*j))
% D3 ]  z' p+ Q6 N        HD(j)=Pyy(i);     %% find all harmonic distortion components
( H2 k  t2 k7 B5 J" O        j=j+1;
3 u8 J1 x6 N% R& {    end
( A+ E6 H' u7 R0 D. O. n+ b3 T+ hend- R1 ?% _" T( J2 C  v7 i
P_hd=sum(HD(2:9));
* N3 ], l8 G6 L1 F7 ~9 FTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal5 W: w( [3 d- L0 Z5 b* D
fprintf('THD = %g dB\n',THD);& ^" O/ F+ H" q2 d# ~

8 f3 b  q8 s& _. j2 T% o( U% ---------- Calculate SNR ----------------------------
0 n# T2 E- u$ H: C- c; K. Bfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
& b( E& D9 i8 ~1 Q( R# ?* }! `fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);8 u- m- c; Q) ]8 I+ r+ e
span=max(round(fft_no/200),5);
; N3 {% x* h6 _7 D' G; lP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
& {- [( K% l9 A: L( Q* q
' t6 W+ t4 ?1 [% P. M, Q& f2 GP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
  n7 h/ h0 C3 U  b0 T5 `SNR1=10*log10(P_sig/P_noise1);
8 r& d0 f# `, {- @: Cfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:* Z* X! U$ P  l9 O8 \
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
" x3 e$ [9 o# S% o2 c! p- ]7 _
" Y! o, E! {" J" U另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:8 K! j: A4 Y) H
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
' i7 G/ ?0 i6 ?0 E3 C內容為:4 F3 j# p  t2 ~+ U, m# _
压缩文件共有三个文件:两个m文件和一个txt文件
. }5 b+ W" U0 e) h5 \# j! g4 O% Aspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。3 g) Z( G- F: }$ k! ^/ {0 M
希望大家喜欢!!
2 V& [& n8 I1 U5 C4 l附件為:FFT.rar
. ?4 a( S, L" ~$ @. Y
8 j3 \  i' w: ]2 }我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:2 O4 }5 _+ u5 o6 i* _

& b3 F* I0 N& F  a5 _9 |3 ^4 K. l) D??? Undefined command/function 'AD10'." W! J0 h5 I* s  ~3 y. Z: Q7 w& W
0 R* a: q* T; N# f7 X' e
Error in ==> spectra2 at 43
, a. R! I. S  `d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
& M" e* R4 Z) Q1 i9 U3 [5 u/ C9 s5 {  _0 ~
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
4 W$ \4 }3 Q# I5 q
# q8 W. W1 R' j& F; u∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
3 J9 Q9 z$ a3 L9 X6 W
) S' ]: f5 K9 f7 M+ D( E3 ~" F$ X, A[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:$ z  _. Y  ]2 r. \& {, G
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
0 q! z( R& a$ C+ q6 h+ t( i$ S另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:, d: F2 T3 B' B- [( K) G& q
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
" y* T4 B7 J* J' d內容為:! c. d7 I9 z1 C$ U; ]. S2 x) _
压缩文件共有三个文件:两个m文件和一个txt文件* j1 B+ j6 s) @. K4 D
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。7 c$ m/ a9 f- U
希望大家喜欢!! 7 o/ C& y8 K* |0 [
附件為:FFT.rar7 O8 L% H0 r; R9 B; K
! d2 p$ Q* s5 y. l, s: z, S5 F+ U8 `% 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卻顯示以下的錯誤訊息:
: ]  ?* S, G9 j& Y+ l  M6 \/ ^  ~
??? Undefined command/function 'AD10'.
- i, ?; Z; ?. z, S+ S, s; C: L4 A0 {# X2 |  [
Error in ==> spectra2 at 43* a6 {# [9 u  U) s9 J- |$ p
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);  @* @# X0 m9 a$ C
3 ?. J( g2 _3 `, f) I
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????+ k. L. h+ b' p7 d2 }1 V" V
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式0 q( k/ w6 v2 X; j! o1 l  g
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
* r) I7 Y; M+ h$ u$ Z2 K- N故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算) c: e- ]: n3 B4 @1 {0 E# k0 Q# Z
. u- d) A$ r- w
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧8 U; }% F1 n* [6 s

! a, F! K/ s: s: N. Q我看不到你的附件檔,故而實在無法作出評論0 T' C4 w% v1 u9 x
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
$ q/ s: F  q, }% u6 p, f6 m從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????& r; T# C0 D9 U" b5 D
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
+ H# L+ F8 Y2 _+ Q4 l指令的寫法是否為:
7 ?, Y$ W1 }' j4 U7 }7 A  T
7 Y/ e7 ]: |. c# T! Q.MEAS TRAN DIGOUT
% i% p2 O" m( [6 p3 s' {) {+TRIG  V (Dout)  VAL=0        RISE=2
2 V* k, ^' c' [# S8 q* I+TARG V (Dout)  VAL=3.2m  RISE=2
( f2 Z/ {8 S- y+ w% w5 ?+ N2 i
! r* X; f. m/ A- V* N$ L9 z∼還請指教,謝謝∼
4 s* c/ U' p8 }7 y) {% {: t
+ i$ Q: C+ K" ~% q, R" Q1 S另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
1 G: L+ v2 x# q; V: a- U, j1 J& |" `( {3 R
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07, {; ]' h/ A3 P% F2 j+ T  m

! M9 k7 C! ~2 y3 Q8 h; G! kHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?$ h& j! B) H6 T: H$ S% D5 K* o

/ v$ m; F9 s' p6 m7 F# }. a$ G[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
4 ]. U0 x; |4 P: g: N* o  }+ C2 G故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料1 w/ j; ^! F; Y: o$ ^  Q
所以,請再檢查一下你的HSPICE檔案吧
- o; Z' ]( h1 U$ j# ]; M& @- @2 f7 w
$ {" S2 N, m: G& `0 I再來,你的.measure指令用法沒有問題
/ L7 s$ }; R1 j1 r. I" Q1 l' z但,你的取樣點及時間似乎不對( w9 |1 G# o% i2 g; s  k
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
/ S2 N' `1 N) ?- E; @. ?& A/ p, C& H.MEAS TRAN DIGOUT
% D- ^3 i! T% T( }0 c+TRIG  V (Dout)  VAL=0        RISE=2
0 c8 X9 ~9 @6 l7 M+TARG V (Dout)  VAL=3.2m      RISE=2* p8 R. m: o- L" N' I+ B# W
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
8 ?9 G8 V* l2 Y# B' q4 A' N4 N那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
; R& C& M- k2 x  I2 f2 s! }另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
3 |' _( u6 R6 M- s( ^2 ?  f! X* h! I再者,如果是用.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程式。
; s7 D7 ~9 b4 U1 D& @5 d  M; c
, P( f! l0 }7 u! q6 [∼感激不盡∼
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* ]( x  Y- W1 D& j2 N# O" M) v
3 }) X8 A, P4 X" H8 S& m% H& E4 n2 u4 q" u: W) B6 k* Z
.MEAS TRAN DIGOUT
7 ]  N$ |: ~  X! M8 }+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
3 d' @) i$ ^( W  y, [- p# Z% R+TARG V (Dout)  VAL=0.976E-7               RISE=1
8 s( m  n. i1 ^
" O  ^; V% _3 C2 d1 I7 M5 ]∼還請指教∼
1 C0 c) F- B8 M2 Y& j& g0 y# Z3 `7 a/ X程式重試的結果,*.mt0檔案只出現:
! n, v: ~; ?' u3 z3 T! fdigout           temper           alter#            
1 u7 r. B, K9 C" E# W1.890e-12        25.0000           1.0000         
. W5 z6 A( Q% y4 {3 I1 N5 Z不知是否還需修改?# I1 i5 \% r1 P

: U" A. b" ^. U2 r" [[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題- j& \( W5 Y  ~9 q: z' ?) E9 u3 N) B
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
% K. a* _! d# J0 T, D所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
2 P9 ^% C2 o% U
/ J9 }4 t0 _+ f. M" E2 C再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
. ]8 P4 ^: H) w但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock5 p0 O; D# h! P9 R7 q
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
/ X$ U4 m- P; o/ p. z再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???# G) O- M& @8 @5 b- c. m2 }* E
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
7 B9 E8 \6 f+ A0 I5 t, W3 }.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
7 x/ M- j% |; E8 v: \8 ~/ H.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us; ^, }7 _3 B1 Z
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
" ~4 |3 X9 v) |1 p# C# _.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us; H! f5 [) F/ G2 `! @+ ^% Z2 E1 r

$ z, ~+ Y5 S8 m, \% o3 v% k8 |.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us: M5 G+ a( w: O, [2 I! B) D6 V
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us% S& ^4 }+ R9 {# n1 A8 R* ~
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
. j' `9 `' R0 D, v.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
7 b" M1 |& m$ X. X4 Z* r$ ~* j0 P3 L/ D; ~3 o$ F! s/ J
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code0 n6 D) V; ?: l0 x5 P. R: {, b. |
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
7 }( r# x9 n* n3 T
/ H8 E: Y: G6 Y/ t最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us: g; u0 t2 w; O$ b1 w" ^8 ]
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
9 i7 U7 m% h8 O1 t# A! u" I我大概講一下我的架構:, G9 h1 I7 p* `8 Y
我電路是使用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的指令寫出,指令如下:$ y/ t) X8 }! m9 J$ W3 g
For Fs=10.24MHz:! `/ U9 s. H! ]2 Z$ t) n  a0 Q
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
4 ^2 F* k! c' h; p6 l% sV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7, ?, [: ]5 R5 d4 u  j8 ]) }7 q
For Fs=5.12MHz
8 Z# T' L! A3 Z9 T4 SV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-78 x+ L) G5 j' d' p, G6 \1 r
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7$ U  G6 I) t4 l* G
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。2 Z  V2 ]# u& e( H; V; Z
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:# d( A  l4 _% P. m, Z5 J
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us- ^* |4 T9 L. s0 n
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
, H, A7 w/ P+ f2 }: o+ V, p然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?+ G. k, g$ z: a
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
- |' n* R9 V8 N, H' o8 t- ~
: }" T  I7 y, H( H! S' _7 u[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方2 j+ A. B0 a+ W. F. T1 A1 v0 v
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來4 ]% J, W- u- `' m$ t/ Y6 W
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?4 [/ F; I: W; k2 F
: Q' m4 R  ]: G; c. A4 u
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
9 u. J3 V! Y" Q% Q# J6 D. C$ ?0 W4 o7 T, ?
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要5 I5 s8 v0 C, W9 s
/ B- u3 M. X6 j! b. ?5 L0 Y  o7 x
clear all
' i, I7 R+ t. _& n# ]: V+ u% pfid=fopen('dual_measure_rms.txt','w')! a! B. E: H+ ^+ t
for M=1:1:10248 H1 y- ?7 G5 g0 s8 e1 V; Z
       T=M-1;
% e. d+ m) X8 r, [& Z* h" y6 S       from=(50*T)+45; %DUAL DAC measure time
  D; t6 r+ Y- J$ c# D+ l       to=50+(50*T);
3 f# x  q1 Z8 E       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);6 s) Q/ k% n' ?1 ]4 V) R' }) z2 |
end( I8 @! }) ?  }# j; q
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用+ z: W* C; ?! r& e
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
& [$ x. e% U7 M0 G; t- j% K, \. O這樣以後模擬FFT就非常方便了0 O6 q, K/ V! d5 z# |
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間' H6 ]+ W5 P7 R9 _- E- S9 ?6 n2 B
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧' |6 q9 |- ~; P* q8 {% F0 O
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
$ Y' Z5 ]* v8 G& G我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
9 M0 }, d* [) F6 j- D因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。/ E- i, i1 ?3 Y; N) F$ q; j
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
( e3 T. i) d1 F# L; \3 r, D另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。4 \$ r) r, X4 `/ D! S
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
( C9 f7 ?: O4 [1 Z, m7 F$ w# Pclear all$ S2 T4 D) d& d  I0 E. B
fid=fopen('sdm_out.txt','w')
1 s7 _+ \9 ~. p" x$ K* Ofor M=1:1:1024
7 f, W8 a' ~+ _5 N  l    T=M-1;
1 }. O& ^! x4 V4 z3 t    AT=(0.1952*T)+1.026; %SDM measure time
! _9 N) W/ j# Y1 u3 o    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
0 ?+ i5 t" h# L# {0 Q! [( dend2 ?: R# c1 D2 Y
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。6 }) F# Y3 s: I; q* y. }
想再請問的是:, R& L7 g. C1 x6 ]; Q9 l) o- {
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
2 `/ K' Q) j  Dload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
/ p. c, Z$ `6 K8 a; _1 i然後就可算出SNDR及SNR以及畫出圖形了嗎?% O! e% u& @) S6 z0 f
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-26 01:00 AM , Processed in 0.138518 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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