Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93648|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
' C# j6 x! u& D2 E5 T$ V0 i: ]謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
9 Y$ o7 E3 F" i# v7 @# P: |! L要使用這個toolbox時,在hspice的.option中不能使用post=2.  o2 [( u; G4 X& {7 z- i$ h( e
可以用
- w* C5 H% e" g/ X6 x.option post& @  V$ t+ `" ?1 `5 ~
或是
; C7 p+ B. P# C0 {.option post=17 w" }' E+ p: \" A) p6 S2 [
但絶不能用" F0 E6 ]2 D5 i% b
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
! m! T& T" r& H如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) A' u8 {8 v" t
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
$ C- R& K, W1 ^% d
; S7 O  T3 K/ l& s) A7 [[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
, A! }( {9 @4 C  V0 Y# i$ ~  m就是直接用.print指令把你要量的電壓印出來
9 E4 A0 e4 C" h3 K0 Y然後再用手動把印出來的資料copy起來
: T$ j* n$ J) D然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
- _! O. s7 h1 e8 v6 a) U4 E5 k6 D1 s) M. s
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 2 x& i, g1 ?. M+ t+ B; ~
所以  只要將FFT後的資料  做一些轉換就可以唷!!( ^) ?1 P/ x9 S$ h
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power", }0 r' P$ e) l& U7 T, }6 ~: N9 a3 t
就可以換算  SNDR 了!!" I+ s! K: z: o9 D2 D
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部份程式
6 q" d5 ^& l  G+ e我想,應該可以給你一些參考吧' X6 k5 B% x2 U! ?) }; q
3 V, [2 p7 S/ E( M: E/ K1 k2 s
% --------------Using minimum 4-term Blackman-harris Windows -------------- H% k4 l" X1 g; D, ?! ]
nb=1:1ts;
) c- S. X; P6 z  U9 J9 c$ G8 o0 jkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));% W, `0 f0 m6 b% x/ y( u5 I0 ?. t
win_gain=sum(kb)/pts;" v0 ~$ b7 N8 `0 X7 W+ L
kb=kb/win_gain;" U1 z3 v6 M0 D- j4 I$ W

+ \' u& h; ^/ F% v! `0 b8 `; P% --------------- Calculated fft --------------------------! t) P# [9 T7 L* C  U0 \( E  w, G
yb=kb.*x(ptsttfi);
0 M* h$ V: R# N0 F6 u3 qyk=fft(yb);0 P3 d2 J  h5 e# {" d; H! T' p) S
fft_no=length(yk);* k8 X- f/ `+ G* J, T
f=fs*(0:fft_no-1)/fft_no;% w3 c( ?* I% ?
Pyy=yk.*conj(yk)/((fft_no/2)^2);
. T4 r# ?' Q4 t) ^* j- O0 x0 c1 v0 H' a# R
% ---------- Calculate THD ----------------------------
2 d' _5 u! m0 ?/ cj=1;
8 z' G0 b: X/ P+ T1 ]! w" Q# mfor i=1:1fft_no/2)5 J% r! e/ e! Y) N0 ?
    if (f(i) == (fi*j))( l: [3 B$ K9 k% d: r0 L5 ~* {
        HD(j)=Pyy(i);     %% find all harmonic distortion components8 S! ?, f& E% p
        j=j+1;
, q. U4 `( ^8 V6 T* i" [! ?    end
# ?! f. f$ Z. Vend
, K6 f% H3 N0 f9 ^( T+ n8 F' e8 I; }P_hd=sum(HD(2:9));; w. _+ g; d. x. I
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal3 e# i* ]" }# f; M
fprintf('THD = %g dB\n',THD);5 m5 `5 Q0 w" I+ x+ {

: h( Z: n. L+ {3 V2 k/ v4 z% ---------- Calculate SNR ----------------------------
! }& j9 s* w1 e' R: zfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));, k0 \. s. o0 A% H" D  f5 @
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
9 y% @5 G$ K4 `% S  Mspan=max(round(fft_no/200),5);
* G  y+ e! g; a- U* z9 b6 j' K# ?) A$ kP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
0 r7 ], K6 D% X- c- |
% P; W! E' n* t2 h( D% O$ cP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
1 O/ |0 u8 Q; @8 o( |SNR1=10*log10(P_sig/P_noise1);1 ]! {) i/ l$ U- h5 W
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:! O* d3 z, r4 G0 V0 H4 m
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。7 n" c7 q8 X' [' ]6 i& o" U

2 w4 c. G! W6 [* o; V" }$ W另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:, M: Q1 v$ s5 c9 ^& ^. \7 J% b
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
9 v2 f" z& ]0 c$ l0 [) @1 _內容為:! ~) S1 w/ E$ _5 N  K  K
压缩文件共有三个文件:两个m文件和一个txt文件
8 U5 j( E' y/ w# b  _spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
8 A5 L# f/ z8 ^! t: ?- b$ n希望大家喜欢!!
: b: r8 H) D. S5 |9 J: B' F* P附件為:FFT.rar' k2 B, v' |6 _, N/ u' f
# A+ R3 @) F+ v  W, J& a
我根據他的說明修改他的程式變為如附件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  j" E1 K  J: G7 M1 h6 [
. T2 J/ x1 N1 Z; {
??? Undefined command/function 'AD10'." x1 l! _6 d+ u  ?' n- M+ N
& k0 D) o, B; b+ T
Error in ==> spectra2 at 43
! d+ ~. e% ?  z+ ^% U0 v$ e3 {( sd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
! S; R2 ?/ u( T$ Y( E% n0 D3 b+ b: a& {. _
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!$ c/ f' |- ?4 _0 Y3 L
, Z8 D; r: z1 J* g5 T
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 2 b  ~! M- C+ F0 ^% l- x8 l

9 [! P6 w8 u0 ]$ s4 a6 `8 N[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
: T. H' Q- p; A  u+ t5 M請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 6 y6 V1 F1 H* F: J7 i, `
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:( B1 n5 P! _2 V) I
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
' ^: @# C# ~5 ~內容為:
8 L4 \; u7 W4 n, n& c/ \( i压缩文件共有三个文件:两个m文件和一个txt文件
( d) a" ]' T( {& z, X9 O2 L9 jspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
, }8 w: X3 r+ I希望大家喜欢!!
0 n3 e& X- t, k' `附件為:FFT.rar
, a, }' s* b  q+ ?  @
5 y' J& f5 i5 G2 }我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:+ d& Q/ a6 x' }# ]! \0 W
! o( i) S: N. ?) Z) R7 y
??? Undefined command/function 'AD10'.* H, _2 a  O7 ]1 V9 P4 o: c4 k
2 Q8 [9 F6 x8 P! N5 \) C; e
Error in ==> spectra2 at 438 h6 c' w* g2 b
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);7 J; n, x" c4 W. t5 e+ F6 W' ]

* w% y' ?# @! ~3 v" s$ q7 L由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
( ]' D, B/ |. _* g/ [附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
) c: R0 e, {+ E' A. h6 y要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
" }7 J; A% C& V" g8 F. H- j故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算/ p- @7 ]4 B/ r. l& I1 G8 v
4 O' l- j% c' Y% [* b
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
, E; T' R, W, ^. W
1 a$ h7 {+ E2 v" r  k我看不到你的附件檔,故而實在無法作出評論- h. ?. j; W, x1 b8 G) w, r
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??  @+ x: |9 u7 K; e+ ^& Q
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????# [3 O0 q, N% P, G9 U
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
. \% ~- e9 P% f" N% q) _指令的寫法是否為:+ J* X% _8 |& ^; g

, Z& R. h2 h! K, S# L, I' H2 B.MEAS TRAN DIGOUT
8 F. R; u  Z1 k; Y+ O( g+TRIG  V (Dout)  VAL=0        RISE=2# n. l2 U+ U) L7 ~" b
+TARG V (Dout)  VAL=3.2m  RISE=2
1 C9 j+ P2 ^5 j# H/ v8 c- l( X- u- @8 J' w
∼還請指教,謝謝∼+ B7 B; t, t; Q1 h# o/ d
7 V" \( J/ B6 l8 W+ |
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:9 O8 ^% `9 \) f1 f. q7 [$ |) ]# [$ D
) x% ^2 B: y3 K% M8 s
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-075 c$ O" f$ f' j: H8 x
+ V) ^5 E1 p' {. o
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?. L. g. W% m* T+ T* B

) g% [% u( q4 O. X; D" Z[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔$ l+ m5 \6 C8 b% E9 m% P3 X
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料4 a1 Q+ K! J% |4 f
所以,請再檢查一下你的HSPICE檔案吧% s5 o- ]8 H! D& {' C1 m8 D
: N. [4 j! `. P+ A0 ]! V
再來,你的.measure指令用法沒有問題
) G# K. M2 k: h/ [1 _) ^" _2 I但,你的取樣點及時間似乎不對
9 M2 T6 H4 e5 H你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
3 n* K# V3 u& F.MEAS TRAN DIGOUT
2 L& b5 X" j. K1 d+TRIG  V (Dout)  VAL=0        RISE=26 K5 f: m( d/ c- ?, p4 A7 N
+TARG V (Dout)  VAL=3.2m      RISE=2
3 }' r2 j6 f& J# f寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話5 p4 U7 \, \* n" u8 `' o
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
: X8 p/ d' {* R: @另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
' `# e2 P& Y. B$ j$ z) r1 \+ K再者,如果是用.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程式。
# x6 p* f2 `  i5 k/ E" N
% Z  }4 l6 x; {" e8 Z6 c∼感激不盡∼
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
8 w6 H; E! c2 I* i7 }9 i3 }) X8 A, P4 X" H8 S& m
9 t6 F# o8 r. t; S! G. P# z( d! o.MEAS TRAN DIGOUT
2 w! e6 N3 ~- r. G- r+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f6 L3 O1 w: m, }- V. M/ y# B
+TARG V (Dout)  VAL=0.976E-7               RISE=1( @4 t/ c0 u+ k8 m. W0 T
* w& P4 q) D0 ]1 F
∼還請指教∼
' s" P1 o2 i; ^, T程式重試的結果,*.mt0檔案只出現:
! Q' t  i5 \+ c7 ldigout           temper           alter#            
: E& |0 |% t/ A; v6 A5 @1.890e-12        25.0000           1.0000         " f! {: F7 G# H; h+ V7 ?
不知是否還需修改?1 ^  j6 j+ i: O+ w( c

5 L! B+ v" `( {3 l+ i0 ?7 c[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題. B' {" n9 b3 J5 R, }% g! ?
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
: Q; l3 H4 ?; o; |0 o$ F所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
( T" ^2 m% @, m/ M$ A5 |
( T; F3 E: k& Q& v  ?9 e" G再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock) r' H$ V9 |; V
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
3 ^5 W( w, ~/ U5 A一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)* d# x- O: J5 g" X
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
/ v: d6 P5 D, q  ]$ c. p) Y9 w舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
4 J( h5 K# V" l.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us" w4 H1 P* `7 z7 q+ u3 d6 M
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
, s+ p* K3 u5 ~# r.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us$ }& \- {8 y8 d  g
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us0 }* @- s4 s" }! F  }5 J
9 S* @4 Q+ D- Y0 `3 H
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
- \7 W+ U5 p/ `7 p+ ^.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us* B1 D% b( `- F! A; A' [8 B
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us& w7 I4 b" ?+ u  t& Q: B
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us+ ^6 k9 S% m  [  G
8 i3 t3 z4 [) ~+ |- u) o( Y; P
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code1 g, Y/ E& f- G$ f0 |* B
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
) \, O! K& u" u& o
! U6 |+ s) R7 c) y7 U, m最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us6 D4 B" z$ g6 X& h* u& {6 }
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
2 I0 a- d! X8 F" ]8 ]' b我大概講一下我的架構:
3 o) s7 M& w6 A% K+ a: o) ?, 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的指令寫出,指令如下:
$ e6 L& j: p: D5 g, R1 V( J$ RFor Fs=10.24MHz:
6 }( [% `0 E6 A1 r  hV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
( C6 E9 D, g! UV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
4 c) J$ j# ~) a) L6 cFor Fs=5.12MHz 3 o4 h0 w! I+ R* W- I- U* x
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-72 L  K( l4 v1 `  d- K3 u5 ^: A9 @0 [; R
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
6 P5 ~( A! ^6 [1 D1 \4 a7 I* N: W另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。% T/ j; y& ]. v; K' ~
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
# Y1 N* x' q# f+ q/ z, ]! i, X.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
& x: ]% {/ _! x; _7 u- A6 d! g.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us! D, J, k% T) z6 h! D
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
- ^8 @/ p/ H3 M1 g0 O( d你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
4 n6 T7 `. }" \, |+ _: p9 T9 ^7 _
3 I! |& D0 E6 _) Y0 ^8 Y[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方( N  m8 }. M6 B/ d! {3 _
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
  [9 v( f6 Y% a6 I9 _* C1 d而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?& N! k. A) h4 v" d2 @, D$ r  s" ]  ]

! c4 \; Z5 U, Z( I再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪" T* ~, K5 A  K9 H" F/ j$ k
6 M3 t. s. ~$ x6 l
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
: \5 m9 V0 s9 R% @; E1 u* L! [" d, J+ D6 C6 a! S% d
clear all
, B! H& X9 F3 G8 C9 T0 L  Zfid=fopen('dual_measure_rms.txt','w')
& w% X4 f. W8 R6 nfor M=1:1:1024
0 H/ f$ i* D7 A- ~       T=M-1;
6 Z# ?# r2 m/ t- f       from=(50*T)+45; %DUAL DAC measure time0 o# r2 h" G) E4 @4 m! F
       to=50+(50*T);
$ e" v$ Q7 D7 }' X8 C0 r( V  ~       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
; t6 p6 _! Z' J" m& O3 m: jend. o" W8 d6 y7 K
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用, k6 {* i  W( l) C0 S' k2 B3 {7 h
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
  |8 F7 I8 G- e5 F  V+ ]/ P這樣以後模擬FFT就非常方便了1 W9 d( V! F" x& [# I  `: W
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
+ a% z' z. R$ ?8 w( z然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧& y9 K. T, }+ z" l: ~
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
2 c+ u( l5 ^8 u我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:* Q: N3 A. }* H; Z
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
9 R4 L. \- _9 p且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。4 m4 ?1 ?' G+ p* L
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
+ M1 ~2 p" d+ z' l3 v8 P依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
+ Q& Q' L& f8 N) u4 m/ p6 H7 Q5 A: aclear all2 E1 ?* i. S$ m* p/ I1 {
fid=fopen('sdm_out.txt','w')
4 V  J. M* a1 ]7 w8 cfor M=1:1:1024% Z9 I( E: ~, I" v  l8 G
    T=M-1;6 p: y0 K' a$ T7 j! y* _
    AT=(0.1952*T)+1.026; %SDM measure time9 i; d( U/ v4 h0 u8 z$ W, J
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
8 A9 O3 f5 E8 w: @. X+ M' ~end
9 g- W4 g% n+ q; b, ^: ], ]試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
" O$ H. z5 Y/ M/ h( K$ B# F& S  S想再請問的是:) N) V+ `0 W% t
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:: ?2 k$ n" I3 F6 y0 V, w# O6 K
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
0 i$ z! E$ N9 ~5 O然後就可算出SNDR及SNR以及畫出圖形了嗎?
9 z: \: l& x" {! s9 x$ o4 q3 B請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 12:33 PM , Processed in 0.166521 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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