Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93647|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
* x" n5 n, e+ z/ [6 S. i謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,$ M" F' y- K" c4 z4 ^/ ~" H
要使用這個toolbox時,在hspice的.option中不能使用post=2.
: C' l2 N$ V' P9 s# z( d. [可以用9 }% e0 n- E# y8 `- o( _
.option post
6 H1 e' y% p+ _6 T, V( j或是! v8 L, q/ w  r& G4 s+ k( w
.option post=18 G* z1 T+ Y' E! Z8 @8 N4 F" m
但絶不能用3 b% _$ X, X. Z
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:. n" D5 ?0 ~9 w" u' M
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
0 m6 \+ T/ g; [' K8 o( b4 t關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。  j3 U9 y6 T' j# S5 e( \
$ S9 H6 L# D! p0 D
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
- f% b; |; ?" z就是直接用.print指令把你要量的電壓印出來
# d3 d& @  s/ z# b, y& V6 ^2 Z- K然後再用手動把印出來的資料copy起來- h( f6 m0 b" c+ E
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。/ C# y( r3 N1 U2 g& O+ w) y3 b
  s9 V" @4 Q1 q8 u% z) V
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, $ _/ E2 I4 H- \1 m" \
所以  只要將FFT後的資料  做一些轉換就可以唷!!
% {& _2 E( _* I) K/ j$ o: H將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
1 E5 a" ~8 D- t就可以換算  SNDR 了!!) p) C9 V2 p! O3 ~0 Q* u4 o5 }
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 F4 p  t) w9 _5 f8 x. F) l
我想,應該可以給你一些參考吧
: C5 T( g$ L1 J5 x, v# T$ a6 e* Y- V0 ~5 i6 y8 g* l) _
% --------------Using minimum 4-term Blackman-harris Windows -------------' u6 {. w8 e: j0 _( p( T1 |
nb=1:1ts;
; e4 i- p' @' L. `, w* n* k) ~: Ckb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));% M+ Q* e. g' c$ x$ k
win_gain=sum(kb)/pts;
: G6 ~- X4 q5 g' B; Nkb=kb/win_gain;7 x% x, ?7 l5 s, V& O4 j' M1 j; P
' V$ A) b! d/ Y$ T
% --------------- Calculated fft --------------------------
# Z( z- u1 P/ E$ M, Pyb=kb.*x(ptsttfi);' z& s% C( K! A- }
yk=fft(yb);& }$ F' c  O8 N" a  n- \. X/ P% O7 T- L
fft_no=length(yk);
$ E$ X: d1 L. ^. Z  hf=fs*(0:fft_no-1)/fft_no;
% h: f. |$ m) j$ ?' g; [7 QPyy=yk.*conj(yk)/((fft_no/2)^2);; h" W, f% D; @- y
* F) ]2 q3 ^, |0 L
% ---------- Calculate THD ----------------------------
7 s7 q& J$ r+ ?3 c' D; T" qj=1;& z: M% O3 G5 g0 a/ `
for i=1:1fft_no/2): J5 A. }+ p8 |
    if (f(i) == (fi*j))6 i' I" p1 Z" Z
        HD(j)=Pyy(i);     %% find all harmonic distortion components
2 ], ?  H/ G& a/ A* G( p7 P        j=j+1;
+ _5 X6 W! G9 O- ?6 K    end
2 D! k: q; Y# a0 Vend% N1 q2 J8 [% m. ]  F% K
P_hd=sum(HD(2:9));
6 J* V4 `7 l) \0 v  K; I! vTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
3 c: H2 A% {+ F. wfprintf('THD = %g dB\n',THD);
2 `" L6 D8 p4 Y9 x7 q7 n
9 P+ g4 W3 }+ s8 ~, e. \7 }8 y% ---------- Calculate SNR ----------------------------
7 h7 W3 ~7 C5 S3 }6 H7 w: p8 p* d, vfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));; `* k/ q: n, ^- a# h' ?, I1 q
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
2 m+ s) a4 ^& V9 o# X7 e9 B* k: sspan=max(round(fft_no/200),5);
1 P0 p2 m7 @( c6 D- x$ i  ZP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));1 C2 Q0 `& l, l$ W1 N+ Z

9 X8 a5 P$ @& F4 ?" v9 K3 ~P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
0 v1 [2 s8 y4 Z0 eSNR1=10*log10(P_sig/P_noise1);
( u0 ?" z1 A7 Y  H2 b; sfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
! S4 C9 N7 X) ?0 |3 E. S6 B* A請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
# B. H1 c2 B0 W, E: L$ _3 b) N8 f7 e0 v" O: }6 m. Q
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
; I3 B' b2 u' j8 z1 J"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"! D' L0 _$ t2 g7 x0 b
內容為:
* r7 k$ n. v) f压缩文件共有三个文件:两个m文件和一个txt文件# Z' [, _; Y5 |4 h
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。( C. ?4 J& i$ f% S+ i
希望大家喜欢!! / }8 `3 R5 S8 v. N
附件為:FFT.rar- v- b5 U( T. [7 b" A1 U/ l

7 D4 _' a$ n+ G7 t: S& 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卻顯示以下的錯誤訊息:
! Z8 \0 A* W; q; [8 R6 i/ z* A& h" b  F# |& t; ^% m0 M1 ~1 A
??? Undefined command/function 'AD10'.
/ I7 U3 @8 V6 D% S. v3 \- U9 }7 \3 C+ E( ], Z# n0 e
Error in ==> spectra2 at 43
0 Q: a& Y4 K# G- X  p6 c$ Md0=round(AD10(start:stepstart+M*step-step),3)/1.8);
2 f& j5 P5 L& r3 K' B( ^2 ], @6 p: Z
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!) U. I; r" \) u
' T+ K. ]- _4 Y1 a
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 9 p0 [; s* J( z- x
& A& ~: C9 \5 q1 h
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
: H4 l- ~7 n% R+ f請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 7 B( s" N1 M0 n$ v1 F  R4 _/ Y
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:) x- I/ g4 t# i( X5 @1 F0 p
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
1 \# n( O4 a# d$ a1 I內容為:
# T; X$ b, H+ p: ~6 P/ @% L$ |( X压缩文件共有三个文件:两个m文件和一个txt文件
# W( Z: R8 [: g5 c/ A. N: Cspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。2 W. U  b' ], n. ^% X( A% h# ^
希望大家喜欢!! + O& }3 w4 _1 P; g, m
附件為:FFT.rar3 i8 I0 f4 ~" C. A1 p  t1 w
, ~1 _1 N7 V- ^
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:8 J5 F; c+ C% q
# V4 [0 v+ n0 g+ i) Z$ \
??? Undefined command/function 'AD10'.
; Z; X8 z1 m  F( n; S  v2 e% D% ~0 U% K1 `# }3 t
Error in ==> spectra2 at 43
7 t) ]2 a. ]0 q- K  b# vd0=round(AD10(start:stepstart+M*step-step),3)/1.8);. o1 F. Z( t' m& Q3 z$ L
- f7 p3 a9 A0 k' Y+ z  U* s( W" @
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????8 E2 S% k; O+ t: X
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式7 ?3 f; ~0 A# f' W$ L/ L$ I1 _
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
. [* m# m( |/ M* X7 k' W: ^故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
) c# X- w* o! `4 `4 I5 B3 K" e( e
, N6 A& z8 x3 i在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
3 [5 D2 T! z% z% U
; \/ y3 E% D: M- Q) t3 K4 S9 |5 U* T我看不到你的附件檔,故而實在無法作出評論
6 R, ]2 Y5 o. ]而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
  G. _$ |0 Y8 b& N從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
! f; i9 g  |+ b0 i% x4 Z所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,2 s" W1 a" Z$ ~! G3 U4 r
指令的寫法是否為:  C/ R& d- v& T# S
, o. d# Y$ ~) D' w9 O2 T/ \4 l0 q
.MEAS TRAN DIGOUT
5 |+ o* c1 r8 g  `/ J1 O9 u+TRIG  V (Dout)  VAL=0        RISE=2: c" ^- T$ L8 ]; `4 J' n5 d  U
+TARG V (Dout)  VAL=3.2m  RISE=2
( L4 Q7 g& L( E, ~, t% {: x* |/ X; o
∼還請指教,謝謝∼( ?3 L6 V, ~9 F3 C# Q

; i" r6 |; j) ?/ z. x$ ^! Y另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:6 J5 _0 H! k1 v. v: j1 n
7 w  G5 ~8 Z6 `5 B) i, b
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07, ^' Q  P: G& ?' Z6 Z/ Q# t6 n. F
: q# \# L6 I- m. [4 q2 D9 z
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
" K' u# E  u# @$ }% u* F) L0 u; D. N6 \
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
4 F# Y% Q8 \- B% M$ @- U故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
8 c) d8 Y: r" d4 F* f0 F8 o, t所以,請再檢查一下你的HSPICE檔案吧  C% k8 X3 }  A, |' l/ n1 k. W
/ P8 D; W4 X! ], i6 _3 M7 |# L
再來,你的.measure指令用法沒有問題
5 r* w0 L4 M0 ]# Z7 C8 d( z* h& k但,你的取樣點及時間似乎不對3 n. W  n! Q$ m! }) m
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
7 J+ {, s4 L& ]. C& o.MEAS TRAN DIGOUT
# ?1 v: B* a) T% c+TRIG  V (Dout)  VAL=0        RISE=2
' t, }, l7 R- z+ g- p5 k0 `+TARG V (Dout)  VAL=3.2m      RISE=26 x/ }  ^  A' T- L+ r& W+ r3 p' a
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話, {" z. ~! J3 R4 X: ?. K
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
: l- ?, [: i! n# d, G1 z另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=25 t7 ?2 E/ f% M# B) x, C
再者,如果是用.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程式。
: S9 L7 H8 L, z$ {7 m6 Q  |
. H/ c7 _  p5 v; X5 R- l  m∼感激不盡∼
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# j8 P! y3 [$ F' [' ~0 D7 G$ U
3 }) X8 A, P4 X" H8 S& m$ ?5 o" ^( E) W+ A! R- v
.MEAS TRAN DIGOUT8 i9 k0 J% w* e. ~' N( ?
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f- z1 x0 x8 d2 \- m2 b
+TARG V (Dout)  VAL=0.976E-7               RISE=16 m5 s' `2 S9 o$ g/ g' K

+ p% t$ L0 \( t0 U9 d- @∼還請指教∼( @! r9 D5 l$ K: h) e9 a
程式重試的結果,*.mt0檔案只出現:! G# S- e) {9 y) D" e: z8 g; Z
digout           temper           alter#            
3 M8 Y5 U" V% B/ n# ^6 j$ k0 @1.890e-12        25.0000           1.0000         ( j  V: M' k2 ^
不知是否還需修改?; r, @; Q; z% O& S
( H4 O% o9 ?) P
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
- ?" w4 o+ Y) J" ?5 i. e你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息6 T9 K7 S' i- x
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧+ n* t% Z$ }( a: Y2 |9 G

. n3 Q0 Z2 r% s5 n& ^/ ?再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
5 ^7 X. s2 X1 T( @* [  i$ T但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock. F" ^8 B  _$ P1 ~8 X0 \2 Z* C
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)2 D# a9 p  Z) W& J% T& s
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???  l2 p6 o2 I+ J0 k7 i; S0 D+ v
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
* T# r. U4 g4 W0 Q.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us* T4 s& i4 x' ~- b* y
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us) p' \: H' V1 x) W' O3 t: l
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
: y1 _3 `4 e/ b7 \) Y- C* C.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
3 `0 Z8 i7 X9 D3 V: I# w3 Y2 j8 ]+ e/ W7 _- e
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
& I4 D  r  U! o2 S+ j1 ~.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
2 T: h2 z' X. w* k3 K5 U.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
9 M! e! L' s1 J/ x( E.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us) {+ S6 W" R3 @) K( _; t( g

, @$ Y" t# z+ Z& N我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code& {; `) v0 p$ G5 Z7 W3 k/ @. N
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
$ c  o5 o6 @; X0 v. l& w, v9 ~% X
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us1 T$ [; f; o; Z* P8 T  B
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。/ Q5 d- z' I1 ^. t! G/ A
我大概講一下我的架構:
, f2 K4 Y1 I  h我電路是使用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% l1 F( \% z" ~' ]$ s& s
For Fs=10.24MHz:
' g7 I% Q) j; j" A* o9 a% c' A% s9 ^V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
5 c% ]* M* Q  k8 wV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-74 V- I; N( |8 S, D4 [  N9 }
For Fs=5.12MHz ; T! t- M6 l# X5 L
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
' j1 M# Y: q# {' E/ }V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-74 `; a7 E8 F" `8 \! w" F! Y9 T
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。) J# D8 Z$ i4 t9 R) k7 ]/ r3 A0 q7 N
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
3 P, F; k5 H# D- \9 K" t9 j.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
) G5 r0 v! p2 m0 q4 e4 X.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
  U( Z: g1 ~- W6 y* \+ ]' A然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
) R* ?! K0 w& b! h, U9 ?你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
. M' _7 G* H5 P, i, c  J2 O8 ?# y$ L* v9 m# M
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方% D) R; K/ ~" Q$ A* R: f
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來: e7 O2 B- j  J" _
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
9 ^% S) E9 K; u0 n
% ?6 j, u; ~9 o/ M% Q* V- O' i! m/ {8 {再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪+ m( m% O. i# e

- j" R8 g+ F8 ~' L& `- YFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
1 u5 Y7 h# T3 q# C* t8 A' D( B
! \6 l1 a7 f2 M/ Iclear all
+ e, D2 H* d8 o. cfid=fopen('dual_measure_rms.txt','w'), ^+ ?$ X0 f* O3 y
for M=1:1:1024: y1 w4 U3 V8 F
       T=M-1;
" S& A* Q( u) t       from=(50*T)+45; %DUAL DAC measure time
1 P# G3 a- J: I7 M5 X1 J! x" [" s       to=50+(50*T);( Q( G7 a  v1 _+ Q: U
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);+ [8 c6 f8 s) {: d  s1 ?' ]5 k, H
end
; Y0 e9 B0 s" O- LMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
& L2 ~% f$ o6 S這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
" o) p* U7 ]% \1 w0 F這樣以後模擬FFT就非常方便了3 B+ c9 T' \3 a- Y3 Q
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間0 f( \! V; R: x4 F: x4 V
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧% B) \4 H; _& r9 U9 u7 W
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
; T- I9 P+ j- z5 o我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
+ C1 l( V5 G9 q6 A因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。4 p# R" n% {& q' i
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
: _( m. F# C2 {& k另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。$ x: {% i# B- q! @
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:$ y7 D6 D- v6 g9 q* [6 a" `; q6 E
clear all3 D- m* k! d/ K1 O! ]. \. p
fid=fopen('sdm_out.txt','w'). G; l$ X( i) J
for M=1:1:1024  C0 Y& @4 ~8 S' [) {
    T=M-1;
8 u  {9 k$ p4 g/ E2 a8 `  h    AT=(0.1952*T)+1.026; %SDM measure time8 T8 ~, T/ g0 X* p
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
8 j  J1 p& N" m& L3 ^) H  jend( I( T/ W6 ^& ^" l% z) `- a) a' t5 t# D
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
0 m/ }4 G/ j) I* t想再請問的是:2 `( y* h/ @- d. y7 i% v
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:) X9 X3 T/ N- H- \0 A
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
* H* k! U7 s' @5 t5 h2 ~然後就可算出SNDR及SNR以及畫出圖形了嗎?" w! g# i  A, E  i7 p2 l; P2 c
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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