Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 97654|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
2 \# G7 k' ^# Q0 f' u謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,2 E% N8 M2 X: d/ N0 s
要使用這個toolbox時,在hspice的.option中不能使用post=2.$ r( Z$ m5 L, e/ N% p- G! N
可以用
5 E1 k* e" T4 r! Q.option post
) y- k7 f% M% C2 V; ?' K" y! V7 C或是* l2 p+ U- y4 q% S5 h  a
.option post=10 a: f) Y/ D' w" B2 y" D. D
但絶不能用. L% r9 D# G: O6 f2 N( ^
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
3 n, p% E1 n- ?0 i: G& `; r( r如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
; k9 `- j1 C/ A  ], }關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
  `7 J! \6 {( x2 V5 N8 j) l" R4 A- y; B. _
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
( e- i$ r7 |0 N: P4 v! J3 |8 L$ ]" n# R: A就是直接用.print指令把你要量的電壓印出來
0 |: |) M5 ], S1 x5 J4 q然後再用手動把印出來的資料copy起來
4 L* R8 I$ q, J; M+ y然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
# @9 ^$ _& e7 ]8 |/ _
6 V$ N5 q1 F2 |: ^0 Z謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
" L9 V0 w* t5 M2 }  O- O所以  只要將FFT後的資料  做一些轉換就可以唷!!
7 G1 _* X+ f. a* Y9 h) a: j將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
! j" M- y$ y& v3 N就可以換算  SNDR 了!!. m7 {5 K7 Z( H5 ?' n7 Y! s8 H8 z
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部份程式* A2 P1 |( ?" X- q4 w
我想,應該可以給你一些參考吧  @: W$ q! z; J! {# U

2 t/ X6 d1 V8 J7 i+ h% D% --------------Using minimum 4-term Blackman-harris Windows -------------
* M4 b3 r* `- k8 y9 E4 q5 h& ~nb=1:1ts;
9 a5 H6 Z6 J4 X" E6 fkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
7 I7 I% X' c; X3 ^2 R+ y, _! ^. Y1 Z, `win_gain=sum(kb)/pts;3 I! R1 _+ N7 p6 p6 y4 h
kb=kb/win_gain;1 r# X; C0 g2 Z- h$ G7 ]# j

. g. W* R" Y/ P% --------------- Calculated fft --------------------------
# w1 `$ H$ ^- V0 y, e& T0 cyb=kb.*x(ptsttfi);
/ j! g0 n) j/ B: V! a. Oyk=fft(yb);: Z5 ]$ L. _7 F; s  z
fft_no=length(yk);( l( H# O/ k$ r; U
f=fs*(0:fft_no-1)/fft_no;( w1 f! T0 _; i
Pyy=yk.*conj(yk)/((fft_no/2)^2);) O8 S6 q( v& ^' E) W+ ]5 r

( [5 [# n6 M* b8 f6 ~/ s6 a7 Q1 `% ---------- Calculate THD ----------------------------) u9 ~, f6 Q4 H8 \8 J
j=1;
2 J2 T( |* A7 ufor i=1:1fft_no/2)
5 l$ H4 p4 t1 n9 M    if (f(i) == (fi*j))
9 u# g' \( d6 g/ |' u6 O* M        HD(j)=Pyy(i);     %% find all harmonic distortion components
1 d8 p" W, T3 i3 b- g        j=j+1;; P' k; L* A# H6 X9 @8 T. t
    end
( A4 K) y9 I; j( ~# {end9 B3 T" [0 u5 h; m3 n6 x) |0 u, c
P_hd=sum(HD(2:9));9 E& ]; S6 @4 b$ E% F" @" t
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal2 |* S4 t& u2 D9 \* Y0 ?
fprintf('THD = %g dB\n',THD);& f3 X& v8 \2 v6 `7 C/ F

1 ^. S- n- _! Q. K( D/ C  a8 d) j% ---------- Calculate SNR ----------------------------
0 S, B. |/ m: K& L$ K* b! {% Jfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));' Q; h. _8 W" {( N& i/ P/ ?
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);7 N2 H  s) r. m6 X2 |
span=max(round(fft_no/200),5);
& K5 s1 ~% @* ~4 w9 V+ o7 xP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
8 j2 p  ?, T4 a& Z* e
* S2 d9 l6 E5 l6 s+ g! i& AP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
. Q4 |- Q( Z  y6 D6 O( T; \9 }SNR1=10*log10(P_sig/P_noise1);7 B& F' z2 b1 l- T( g; O& h
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
5 I0 o% n0 ?0 h! M  [請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。* C% U$ i6 b  }* t9 Y7 p  B
% n& z) k% ]& H) d9 d, |7 F
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:" @/ T* k* w; k& ~% d+ V+ U( V
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
: m7 K# F4 I# E! t, |" T* \內容為:
2 l- u8 c" z0 F7 {压缩文件共有三个文件:两个m文件和一个txt文件
5 J  [% W7 i) l9 f2 C0 M3 i( e" m3 Dspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
/ r2 }- X+ `' \6 v" A% ^% p希望大家喜欢!! / y/ ~4 h4 p. C9 d- o! L
附件為:FFT.rar
! c6 k! I6 Z3 `8 l1 A/ c' \2 u7 K( S9 B
我根據他的說明修改他的程式變為如附件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 w3 n7 g- q% `" e8 ~
  ]1 Y9 _3 E: y1 @2 U
??? Undefined command/function 'AD10'.( H% E, u, ]; P

. o* u: ^+ }# B( bError in ==> spectra2 at 43
& u" u6 C1 K1 s  P$ @3 n. kd0=round(AD10(start:stepstart+M*step-step),3)/1.8);' H% w! S! m, r( |
8 b; _# ]4 A9 e- h% Z7 X7 U' @
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!! j* H- D/ S7 c9 j& M4 T# I
$ h. i) A. s8 y$ }9 n0 x
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 9 W3 \# D* V+ E8 G) e
3 u9 S# {- B3 [& ~. Q" |4 _
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:1 }$ o% s' ^. A( N, q
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
. H1 |8 W  C: C" V% w另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
, M  k2 @% n( B' i) v- p"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"' i+ O$ k$ y0 A) N; g
內容為:  {, Q7 L# e7 u1 T
压缩文件共有三个文件:两个m文件和一个txt文件+ ~5 W+ D" M/ H. F! n
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
$ i5 S2 q" V: m* B: ^希望大家喜欢!! & R+ h) Z. S0 M9 z: q0 n
附件為:FFT.rar* o/ g- ~. }2 s
. ]+ A$ y9 Y) i8 X( ]" \
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
; l! W: u( ]! E) I( g* B' V0 t. k0 H- ~/ [; C
??? Undefined command/function 'AD10'.
8 n9 C: T% Z7 H) P! X( K
" r$ ^* c& ~, Q. pError in ==> spectra2 at 439 r' {) I5 Q+ D
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
. _( m8 ]7 D' S! D1 \! d6 b
- u) D9 @* B6 h2 i由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
' L3 q7 g; ^2 z6 F7 Z# ^( m$ T附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式$ X0 {* @' ]# N& T; Y) x' ]
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值( L3 X& j. m/ c/ B1 @8 |
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算) S3 t  G* z! d6 V8 B3 Y; A

( ]& D0 A/ m% V  y/ l在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧# v" L6 W( g- r7 t1 U" w
8 @; f5 f, d1 ]/ x9 h9 ~
我看不到你的附件檔,故而實在無法作出評論9 y0 }% E6 T, o7 z) \
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
. P  t$ H) B% o8 M3 b9 k9 W) W從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
  L2 {3 z) K: N# x: O所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
9 r" D' b% }5 V9 h0 e指令的寫法是否為:
- W+ b* S" q; P4 Y4 ?( N) ~/ M: X( p( ^$ k
.MEAS TRAN DIGOUT
" y" Q" i$ W, c* A4 {0 x+TRIG  V (Dout)  VAL=0        RISE=2, x9 G- a0 X2 l) Y
+TARG V (Dout)  VAL=3.2m  RISE=24 S4 H, Q# r$ F" `! O! R; E% c

. ?& b( R# O- @% T∼還請指教,謝謝∼5 W1 x+ S( V( _% q2 B( ~

% X- W, t( ]# D. x; D* U另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
% W; ~0 e4 H+ R2 y, P
; g$ r& s) n" j( x7 Pdigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07) h% g, H& s+ @) F2 R

; r+ g( S  q# j9 j; U. b8 {' iHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?0 g3 C4 o" x8 v5 f2 u
6 ~1 @5 ]4 W8 n5 Q% x
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
% V$ M" i6 |9 @% t2 O故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料2 s0 r6 X+ I( u; z8 G, m
所以,請再檢查一下你的HSPICE檔案吧
. {, d& b/ D7 I9 m6 V  h
6 `8 A8 Z; [" e再來,你的.measure指令用法沒有問題. M  n5 B; T+ N( g7 f1 X
但,你的取樣點及時間似乎不對
, b9 B: O, k9 z+ Y你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:9 ~0 ~# J9 b1 d' D& R" d% h
.MEAS TRAN DIGOUT+ s# u% N, ~% z4 w5 Z
+TRIG  V (Dout)  VAL=0        RISE=2
5 F4 [( T: b" b- e; U+TARG V (Dout)  VAL=3.2m      RISE=2
" w- B" W) Q3 B$ ?5 @寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
& M& `: {2 M, w& i; {那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock$ X6 a1 z" a( {, u) e9 m! u8 T
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
1 [' H9 W$ \4 D( ~( B) r再者,如果是用.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程式。
& w7 v( p) M" s- h4 n5 W1 @/ s1 N" a/ t) @
∼感激不盡∼
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
, A, \: W: |9 b( Y6 ]2 z3 }) X8 A, P4 X" H8 S& m( G- D7 U" H9 f0 A: v4 u
.MEAS TRAN DIGOUT
& }* j7 X( B8 Y$ ?6 o9 r+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
7 Q- H8 F3 B( a, {2 O# @+TARG V (Dout)  VAL=0.976E-7               RISE=1
/ M5 j7 ?$ m6 [' T  X" V3 h1 ^7 ]
∼還請指教∼6 X& W8 Q" Q5 x7 T, R
程式重試的結果,*.mt0檔案只出現:! h# H) r5 ]% C* l3 k4 w
digout           temper           alter#            
" }5 n6 M3 i  C! [2 y1.890e-12        25.0000           1.0000         
2 }5 P# q' Y+ ~, Y不知是否還需修改?& o; l  N, D2 G4 x+ k

! J; Q9 M& |0 C& A0 C' r: E[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
* n& K9 `; a( F5 u4 B你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息0 e) }$ ]/ i$ y$ p0 y9 n
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧1 V- G( @7 O' L  K' E
4 b! M" K/ k. h  M* ~* u- D+ x
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
4 J# J6 t4 m7 v2 O但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
& y3 k6 }+ W+ U一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
- e+ [1 \# y1 ^, N再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???0 V0 P* t  U: X- z0 m9 Y) r
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
) G$ r1 j* V7 {8 ~.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
! X4 S1 L3 M4 c7 g% e/ k" E.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us; `" C, s" h) i1 c
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
, l* @0 a& X& p7 w.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
. M4 I) X5 N  |- A' X  @$ K( w7 K+ ^6 w
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us; z9 j  L5 h& G9 `- J
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us9 j6 V: q" x& T5 B; r# t+ z& }
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
1 B" K- _) J5 J1 T.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
6 u- W. v( t# W3 x3 f4 `0 P3 k1 |2 h& w9 p. U0 W* g
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
! ~: Y( I$ j8 _- h我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法. L0 P- O* p- \
, E+ o  Q7 ~' U. I! f9 x
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us% H8 J+ G) @+ C) |
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
. o& L. G0 |3 x& M: o9 [% O我大概講一下我的架構:' q# W+ b- \0 x9 l; m6 g! L" k5 k% ]
我電路是使用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的指令寫出,指令如下:) m+ m( C( Z! Z; q$ V# d
For Fs=10.24MHz:9 P" H& N  _% g- \7 z
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
$ \% \1 S& c/ Q0 B0 z1 nV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-78 J2 k6 c$ B# y3 s& Q
For Fs=5.12MHz " h/ h8 K- z/ X7 g) Y& D+ p' q' Y
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
% h( m+ ?9 v! H; m* bV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7. l; J! [; Q+ ~( E* Q  k  U- W' {
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
( q) ~$ B* C# c0 E0 y如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
7 {! }7 P- X4 i/ G.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us* s5 m' o) |: N/ L5 r! [5 X, J
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
5 _. q: d2 i3 o9 C9 T# g然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
% d; n; {& s& T  b' z  o4 Z) q0 i你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
1 g  V/ K! Z/ Q, ~/ M# m1 Y4 t8 t  ~0 ~& U0 x( b
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方7 d' k" M+ }$ [* q- Q, h
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
7 p# u8 C9 c) L3 H而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
9 s1 V2 C; o6 W4 T6 Y& b
* P6 r- o# n+ {- U) ?& j2 [9 {再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪* R2 P, P+ H8 v
9 w4 I% s* _7 ?3 U/ Z
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
/ [$ h" I; k, E7 Q$ |& Y* d4 j" }" a2 X* L( k+ W
clear all
& m: c, c6 A& M) |% [fid=fopen('dual_measure_rms.txt','w')
( Z, T. X0 \( b* f4 y, zfor M=1:1:1024/ j! t# `4 _* I3 K6 n
       T=M-1;
: E0 ^, P" S$ r/ V: f+ I6 p% a7 j       from=(50*T)+45; %DUAL DAC measure time
3 i, V3 I- P$ E3 c+ q5 J( D       to=50+(50*T);
5 _# `1 E5 r7 S" q6 n* Y/ ^       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
9 ]. ^2 h6 N: X' _# ~end) }: @. F3 K1 A9 o; b0 J! |' n8 H
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用+ Y; m* y  o4 P' X0 [
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧  d6 B  t8 R# f3 H, V
這樣以後模擬FFT就非常方便了. f1 j8 W+ m& n+ t# R$ ?
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間: `- v' d! |, @# F  A
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧2 D' k; b8 U5 k# C1 m8 ]% h
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
) L0 e8 G& U5 }5 N/ {3 M" r- m9 K我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
! {0 J$ Y4 x9 I! q$ C+ m0 M因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
( T2 J: l; E0 J9 n8 M且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。! [5 n( B1 G1 p& t
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。! ^- j4 f5 a+ [+ I
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:1 a. {8 ~% e( Z" ?% x% c3 n- L
clear all
; M% u1 S% u2 d5 X/ lfid=fopen('sdm_out.txt','w')
9 U& W! ~* S0 _for M=1:1:1024
$ y# M6 _9 w: u3 y    T=M-1;/ ^$ T# `# t/ P- [4 P1 d
    AT=(0.1952*T)+1.026; %SDM measure time2 ?% f3 @& ?: w4 ~% ~" K
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);* J9 K! S! u' u; y
end( o( r/ {. y1 K4 l  }, a
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
, ?+ _7 F  x5 X4 m& {0 Z+ c6 \想再請問的是:( ^; `/ H  v( n! l5 |
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:8 v3 P1 H& B6 |4 f2 m" x# B, V
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
: U9 |+ O$ l# S6 @然後就可算出SNDR及SNR以及畫出圖形了嗎?: e9 `) a( J% B6 a
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-12-27 11:38 AM , Processed in 0.209012 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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