Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 97648|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。! q/ o& W' X, N+ L
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,8 T7 P3 r3 X8 Y( f; ~5 g
要使用這個toolbox時,在hspice的.option中不能使用post=2.
, v# {$ e/ l& J可以用/ u! T2 Q4 x, m9 ]
.option post4 p2 V% O: w8 I: Y' V$ ], P" x
或是
+ a" I) \. g1 B) {; c.option post=13 Y' M& B/ a8 m! j0 z
但絶不能用# G( A5 l; G9 F/ Q7 R
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:" ~. k4 l; W* Q( G
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) K: y" \9 f. V0 L
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
% L1 a% B/ W( g! w, y2 B/ k: {. o4 r% s+ Y9 \
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
2 H$ H8 R" I: q( T+ y就是直接用.print指令把你要量的電壓印出來: i! D# U( L2 u* m
然後再用手動把印出來的資料copy起來
3 o8 t5 k2 K$ k4 q: j. t然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
0 H. h) ~& B" \9 V2 G- i$ n5 u+ }) e1 V# {3 Z6 ?* b% H
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, " y6 R) e6 H% }! E0 W3 R8 Y
所以  只要將FFT後的資料  做一些轉換就可以唷!!
# {2 G: F0 r/ c將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
% H  g" |  n4 ~( h! L; H  M; X3 z就可以換算  SNDR 了!!
3 D$ M2 h" m  ]) NSNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式% G/ P" p" A; u" b
我想,應該可以給你一些參考吧
* l. u; o- {4 X+ H/ L- B+ S  C* V4 u7 a: Q# C% `4 f. @
% --------------Using minimum 4-term Blackman-harris Windows -------------
% y: x8 ^' f' J8 d4 g: q/ inb=1:1ts;: c' b6 d& i7 B0 s$ `6 F
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
/ J$ y% t& F" G) e1 h# x- x0 ^win_gain=sum(kb)/pts;* V+ a* z5 N5 `) e8 q9 a% w
kb=kb/win_gain;  J! [( x3 V/ }; x0 L0 v8 K

, L/ C' i/ h; O9 x% --------------- Calculated fft --------------------------  O+ T  l8 k  k+ h
yb=kb.*x(ptsttfi);% \; e; b$ f  W1 L  Z1 A) M% ?
yk=fft(yb);5 }9 z  g* R- t1 S" c( N
fft_no=length(yk);
0 z+ `' t0 f1 w$ lf=fs*(0:fft_no-1)/fft_no;  I/ H( }& D+ M* m5 J, @8 A# X
Pyy=yk.*conj(yk)/((fft_no/2)^2);
1 S% T* s+ q7 s2 o2 e7 ]& g  `, Y' {. i
% ---------- Calculate THD ----------------------------, }! l/ B3 X- A; D
j=1;" }/ x& N( j- A  W, S
for i=1:1fft_no/2): u  d( C1 ~; W; o
    if (f(i) == (fi*j))" Q$ Q/ M1 h1 _; C- a2 R, p$ E* i% `
        HD(j)=Pyy(i);     %% find all harmonic distortion components0 D  V; L; q. D+ D0 x; M5 T: C$ n, K
        j=j+1;! ~0 c; B+ E7 y8 r8 U0 d3 S' G# v- O
    end9 c7 X- S' [# G" r
end
7 K9 R1 b$ n+ v7 O$ y# sP_hd=sum(HD(2:9));
, |) r0 M- E5 l9 ?% f6 [6 wTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
! I% V6 b. c6 z) D3 J: ~& pfprintf('THD = %g dB\n',THD);- M$ o+ S) ^  m6 R. ]* V
, O3 ]1 e, N& d" Q' g4 I7 u  h2 h
% ---------- Calculate SNR ----------------------------. a8 H2 k/ r6 v  e3 f
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
5 @$ [8 D( }" E6 Vfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
4 H" k+ e" @' y" G+ N4 nspan=max(round(fft_no/200),5);' o( \9 B2 {1 Y. X" O2 ]
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
" [$ j4 n" o, w. @* m2 p# @6 q$ C
3 R4 F! }$ }7 X& F6 HP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
% C6 f# }' J9 y- I( Z7 i; z& `SNR1=10*log10(P_sig/P_noise1);2 i; U* u( j) u9 M; a. K9 }
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
* g7 _! Q- \$ q% l) ^/ h請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
& ]$ w: W; u7 H+ m% }, ^+ F( a8 z
( m/ q& Z4 {8 M! \0 ^另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
; d" t: Q5 e- P  _3 g"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
+ T# ~2 n' i* j內容為:% T' N" H4 k1 M
压缩文件共有三个文件:两个m文件和一个txt文件
' o/ m6 g& r/ }8 D( G: Lspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。* |5 {/ D) h/ b5 K* _. }
希望大家喜欢!!
  F1 a9 I; l+ \2 ?2 O& t, V5 E附件為:FFT.rar, w% x, G$ v+ U' r( @1 p# h

6 C( }# P" t% N8 t我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
) C0 i4 \7 e3 J( P. ~  \5 M7 t" G& v* U, T+ A1 E, O) H2 O  U
??? Undefined command/function 'AD10'.
- Z' S% D8 L( z1 X0 _" o, w1 F& l- \1 K+ c
Error in ==> spectra2 at 43
0 {$ O/ [0 [1 V* w. z0 K+ I5 I* xd0=round(AD10(start:stepstart+M*step-step),3)/1.8);9 O( q' d8 T8 b% I# z; h

/ {( J8 Q- p* E) b由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
& \$ t. k/ f/ B% e7 m1 l3 p
  F4 X, f0 N9 H' G∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 6 ^, G9 s) }8 B1 ]% f0 h
! r/ B5 y, L4 T* c/ u  D9 d
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
$ w3 A8 a# g: a2 U請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 8 n, h) n/ s2 c! D3 r
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:9 X8 s& E) E; ], d7 J
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
* U4 `' S0 t/ j% O4 D" h1 p5 s, y內容為:
/ K+ M' N( E# r6 b压缩文件共有三个文件:两个m文件和一个txt文件
! t& y6 @: O. X- b; Bspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。- s5 \3 g, k1 x  ]9 M) b" X
希望大家喜欢!!
8 d5 F& X! r/ x附件為:FFT.rar
) y6 N) d0 d& J, { " w. L! o( r2 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卻顯示以下的錯誤訊息:
/ ~7 s4 O7 ^0 E' H5 B8 S" T, |( c5 y; S3 K  P% m, Z1 k% |- e
??? Undefined command/function 'AD10'.
* R& }5 U+ x+ B3 k, v
1 U1 ^: N+ @# [( ^. EError in ==> spectra2 at 43  n/ r! ~2 M7 N: a# {# |5 h
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);: r8 a! n8 {5 q' P

( P8 T0 P+ d2 u1 `7 S& V由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
! I  N0 z: x, _2 _# F: d. q5 }附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式, B; u; w/ t: N6 |
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
0 u' r9 |8 c" K8 m4 ?. Y故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算8 Z# j" `. V$ X: a; G

/ ]% ?5 W3 a+ M( x: O' {; x, {在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
; X: @! @. s% F& B5 f5 K8 w) V; f. ^1 W4 @- g
我看不到你的附件檔,故而實在無法作出評論
% a% o4 t) k: H. s% K而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
; K  x& _& C  e2 }% n/ k從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
% _  e* T' K& R所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
) R2 C' x1 P0 v0 N9 q' i. j指令的寫法是否為:
  N) N( H' ~" E" `- a# b$ U; g( N6 W' M: i4 ~
.MEAS TRAN DIGOUT
. f* e: c+ ?  Z5 o: R9 s  w+TRIG  V (Dout)  VAL=0        RISE=25 w) ]; y: g+ k" O7 M1 G
+TARG V (Dout)  VAL=3.2m  RISE=2, v, K. [. ?# n7 O) t/ u1 M
- l1 Q6 `+ S) a1 t/ Z/ B2 ]- }) J9 Y
∼還請指教,謝謝∼0 G  q! I! R; i  ?8 r7 ]1 B/ E
! J7 x- f8 Y. \/ N6 p
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:  U4 P; d" {7 T' E6 R; }# R9 |1 T$ k6 A9 I
$ q$ m7 g6 a$ ]5 @% z) E# U5 p
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
2 z/ R" i# a  H& O) V5 Z
! @! V0 C7 a: KHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
1 b* t9 O& f* `9 y4 N# D6 N3 G
5 f6 k' l4 P+ D[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔' s$ ~0 a" o$ R! X$ u
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
3 K: m0 F' ]# H* r) J8 |5 u所以,請再檢查一下你的HSPICE檔案吧
$ f! T" K. M2 p- E3 r) |" @( U( Y4 Q& Y/ x
再來,你的.measure指令用法沒有問題
$ r8 f  v0 O- g; g( E/ ?但,你的取樣點及時間似乎不對2 I$ i7 O. u! q9 W/ ?; n
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:5 r8 q( _: s4 a1 b7 \: E
.MEAS TRAN DIGOUT( E& G1 w# i1 E+ z, G
+TRIG  V (Dout)  VAL=0        RISE=27 V. I- F2 g- S2 Q# ^# r7 j  R& _4 `
+TARG V (Dout)  VAL=3.2m      RISE=23 E0 q9 f0 s$ s$ ]
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
9 H* t7 m' p+ {3 |' k. @8 y% o那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
  C( A; f. V" q8 c2 C4 I0 x另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
6 i7 [' h; n0 C0 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程式。" q+ E8 U9 k2 B6 R
. l" S: [! _0 P# j  [3 n
∼感激不盡∼
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# j9 c7 t2 P9 ?8 b) }4 }+ p
3 }) X8 A, P4 X" H8 S& m
) M  y! B3 z8 u- S' I.MEAS TRAN DIGOUT
  Z9 l2 C6 @$ g- z( U+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f$ k6 o3 l& R) {
+TARG V (Dout)  VAL=0.976E-7               RISE=1
3 b% _: E, e3 X6 Z; N
& ]2 L( d1 {6 Y$ P" ^) w; _; B∼還請指教∼
- X% }6 {4 g. q* ^2 P! h+ u" S程式重試的結果,*.mt0檔案只出現:# z2 a( X2 p: }( G; ~5 r
digout           temper           alter#            
% p1 Q4 s8 v. @: r1.890e-12        25.0000           1.0000         
% |: z/ t9 T; G  F不知是否還需修改?6 R( b2 E) `0 h2 g/ b
9 G0 x9 ?4 v! o: c
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
2 r7 W" f" U; Y% w; ]$ o% E- ?你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
) n2 N8 w2 J6 H7 I9 o" }$ U2 }所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
( ]! b7 f7 x5 y! @
% s' \3 ^' k+ Z5 W8 Q8 p1 V+ g! V再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock0 l* ~, {+ r: w, M8 _7 s2 v2 U3 F7 n
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
* X" ~  N, N& Q* ^! t一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit), e- P& D) L4 t
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
1 s- j4 Y8 N# B6 ~7 C5 Z舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為. r. J" @2 B0 x- `  _2 j5 h1 d( [
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us% ]: z5 ~# {# ^1 W
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
% j; [2 M! L9 F3 a; R' ?.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us8 T& f" S3 p3 n+ H+ c7 Q
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
$ C; ]  d1 O, u3 V( C6 Y' r6 i$ V
! m8 l6 B7 \% Y.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
) f' H/ Z) z3 w" P" k7 F4 L; [# ]# V.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
9 K, u3 g- Z+ A, w# K; b.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
7 `! m  w6 c4 H+ q/ H5 R5 Q* m.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
( ]$ _/ E3 ?6 d& T& o' F! S& F6 Z: e1 D' r
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
4 E& ~' E& Z( S- j1 c我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法4 ?; H2 _. U: v2 m% i6 r3 Z
' W* G1 ~) m6 \7 z, W' T8 H) {
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us( S8 q1 u! f9 G: [/ q* B5 S9 [
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。, i6 P7 m) {. g9 O7 z
我大概講一下我的架構:
0 {1 V& f; @5 z. l8 \0 C我電路是使用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的指令寫出,指令如下:
' E: {) d: P4 k  v( hFor Fs=10.24MHz:
) X* s4 l* t" T2 t  O8 AV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-77 ?5 ^. d3 q5 o0 f
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
  u- _2 x$ ~- l8 ?3 m/ w) E: OFor Fs=5.12MHz
9 B+ F  D& x$ Y( `V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
' R% e' i/ H' ?$ b; v% dV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
# N) _- k, @8 y; q另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。$ @- ]4 b0 |$ W# @
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:; d8 h, |9 t3 \0 I
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us) X! R$ x3 {$ x
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us" x0 d! d6 \2 A0 i, K6 R3 k
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
# {$ g! G$ ?2 h3 X/ q你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!: d# h% R; [, i7 w5 M$ V7 B3 X5 n

7 l0 ?; R/ ~; Y' M* L9 ][ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方6 g) s+ m+ e! g/ j5 k' m7 `
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來( q( i6 u. H- T% r2 r( J! Q
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
. x5 `" p& c% K! [& J+ R/ j9 `0 n1 T, f; x3 Z
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪  i' y9 o1 u9 C; m$ m- C2 p

$ Y' l, e  ^7 m9 h9 K. {' B% @FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要# s# z& W+ C* g

2 D1 y& g' W) s! a8 q+ [1 Jclear all
0 b9 y0 W) I" r5 K& s- r( Hfid=fopen('dual_measure_rms.txt','w')
) M$ h& N" Z% a- j1 _% ufor M=1:1:10245 m. l. X$ Z, U+ ?+ j  A% d! K
       T=M-1;, X. x8 C: c! J+ S0 w. F
       from=(50*T)+45; %DUAL DAC measure time. e8 S: g# ~2 O: D, t/ H, u+ ^+ {
       to=50+(50*T);5 O4 \4 x  c( V) u: v5 F$ V8 C2 {
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);  N1 |0 ?1 N0 b7 O9 W
end4 A+ G  K, r, I
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
5 b) U! @3 D: o% ~這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
; h1 r4 x) b% `這樣以後模擬FFT就非常方便了
5 I) ^0 _' a. R; i1 M看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
& L7 a9 v" d; s/ h, q2 f: `然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
* U* z5 l' V2 M* R( ~3 U1 j# S# q只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
% U# R9 }/ u, L7 \% f我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:- z2 o* n1 d$ V0 L( c( U
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
* |* z  V3 e6 S& |. n1 ]且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
$ w" s- j8 X: R4 G另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。& {! v1 V- m3 @& \2 z$ V  {: o$ v
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
6 T. S, t6 M3 E! }: m4 qclear all
; q# R5 k9 d6 `2 L) afid=fopen('sdm_out.txt','w')
" w# j( m( V/ m+ S6 \3 d9 T; K4 Pfor M=1:1:10240 o! u- ~5 g* ~  c8 N% g
    T=M-1;  V- @" b% O' I) T7 n2 q5 o* H$ U! [, Z
    AT=(0.1952*T)+1.026; %SDM measure time* l8 z& C/ R, C6 u1 S$ @+ F
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);: f; o) i" W6 H5 |7 h1 q/ w
end/ v$ r# Z( _' c/ ^" O
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
5 f# m+ \2 {# R4 Q想再請問的是:
8 J0 W5 M, {# d9 J) s! l& j當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:- F  s' j0 }3 i0 D7 s6 M
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
. u7 `' R) L; }7 k, c, {然後就可算出SNDR及SNR以及畫出圖形了嗎?% U; o* l% Q: V
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-12-27 11:11 AM , Processed in 0.206012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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