Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93600|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
/ [4 [9 j) J( j6 @* l謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
1 g9 O7 }: r4 f9 E! T( k- i0 D9 W要使用這個toolbox時,在hspice的.option中不能使用post=2.% M- D( ^9 F6 {9 U
可以用
: M3 L0 V: A( s( X; f$ n.option post
6 ?0 m9 i9 Q( r. B. A8 }或是+ S  f$ I* Q) d+ l
.option post=1
. K4 k- R4 e6 {5 p/ q但絶不能用
9 N$ n/ V. v: T& ^.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:: {  m" n$ n: V9 J5 Q/ T
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
2 O* [9 p3 F$ O0 i  m5 B關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
2 Q& C8 J- Z8 z! d7 b
/ [# h; z, ^" _2 C; a8 v[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用1 j: {) v  r* |& T; \
就是直接用.print指令把你要量的電壓印出來
- `1 T% ?: U) q然後再用手動把印出來的資料copy起來" v  Z7 U: O" F# F
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。' h/ y8 h* b* S: v, s& [
9 `8 `/ I. J2 [$ h0 k2 N
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, - Z8 Q( D8 p1 o; w& |0 i
所以  只要將FFT後的資料  做一些轉換就可以唷!!
! w. |/ J4 E( k7 Z; m) r將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
& u* V6 `' a$ W. c0 Q4 }- S6 \- A就可以換算  SNDR 了!!2 C. o$ l! b5 b: m
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部份程式0 m6 a+ k" J, A" U$ H, @' M
我想,應該可以給你一些參考吧/ X, N0 V& g" s
+ p$ W$ J2 E% @7 b
% --------------Using minimum 4-term Blackman-harris Windows -------------
% E- `& X+ x  c3 m: e0 fnb=1:1ts;
* |2 D7 V7 Y; L5 akb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
. x7 ~: [- Z& G- N! h3 lwin_gain=sum(kb)/pts;* @- U. ~& c7 z! k( U* _
kb=kb/win_gain;
  U; k4 K% _7 `* [. ], U; E: D# B$ D% X& Z
% --------------- Calculated fft --------------------------! q& y: }6 r/ c! \0 h+ p7 }! T
yb=kb.*x(ptsttfi);
- t1 R/ w0 M  p; K* ]/ e5 K; Gyk=fft(yb);
& O/ K  Y2 q9 e# P) V9 Efft_no=length(yk);- o: Q! P, X& N+ h, R  [
f=fs*(0:fft_no-1)/fft_no;: h$ n0 _# a: t+ Z
Pyy=yk.*conj(yk)/((fft_no/2)^2);% M3 Z! H* _9 T6 X4 a) n% i

2 R7 f5 ]% t' k2 c8 C- i+ d4 R/ ]% ---------- Calculate THD ----------------------------# W. U- N2 i& {$ I+ K/ Z* l. S& w
j=1;
8 Q6 ?3 s5 O8 \; Vfor i=1:1fft_no/2)& A+ j5 k5 ^1 e# r: _& S
    if (f(i) == (fi*j))9 {, j( w4 y) ]6 e
        HD(j)=Pyy(i);     %% find all harmonic distortion components" R) y5 x, j) {. _6 j9 O# ^
        j=j+1;
* @% K# F- q0 p+ m    end) o9 Y. w) ^" E* r5 {
end
1 e( F* V: ~* T3 m9 s, D! ?- F; E3 lP_hd=sum(HD(2:9));, r- B  U+ p* ?! g2 p8 I: h
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
' p- N" L6 v& }- |& Nfprintf('THD = %g dB\n',THD);
" l; V3 N2 D9 W; I- E. F; u$ D" j2 g! ~
% ---------- Calculate SNR ----------------------------" `* @  @" o# a! u
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));. q) ^* S% U. t9 a8 D6 U
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
! ^8 d# e0 ?. A# z/ e" ^span=max(round(fft_no/200),5);% W! Y% x0 @+ m" J, y/ Q
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));+ b" p8 x# _& T2 T

0 A/ n# d% G  r6 uP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;$ n% c$ I' ~/ A% ?
SNR1=10*log10(P_sig/P_noise1);! Q4 l  m' r- m7 p/ A
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
8 t, W9 q; Y3 g! L# }9 a請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。: E3 ~3 ?. z; C! g* ^

$ B- ~! D( Q; `& @9 ^. y  i另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:$ W" r/ C' ^0 I- W! p
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"- H% i5 |) {8 H: ?0 U0 ~7 h
內容為:
, n5 S% e2 |$ v2 j7 ~/ H压缩文件共有三个文件:两个m文件和一个txt文件' X) x: F; [8 \" ?/ C3 F& w
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。" T0 b3 x" t: d3 m4 S6 z9 Y! S
希望大家喜欢!! 9 X) [* M) X) _  [1 z
附件為:FFT.rar
4 E4 U" |/ W1 N9 N$ W. v* \3 k' L* @* D' ~" b+ F& r' D
我根據他的說明修改他的程式變為如附件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 h6 l! w: w2 J1 Z7 x

; M) T' Y8 E; o5 n+ j??? Undefined command/function 'AD10'.
0 p# _# ]: o. @7 B2 g' u
2 m! C6 y3 m, [8 D  ~Error in ==> spectra2 at 43
. c2 |3 F+ G8 }d0=round(AD10(start:stepstart+M*step-step),3)/1.8);" J7 R+ d& C( T8 i/ }

: [/ M8 H4 H4 ^( k由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!- p! f# ]" K+ [4 [

& i  U  w1 _& r, h∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
0 n9 r; u6 O, N8 w; \9 o- Q/ `4 T% J8 Z& Y( X6 {
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
# P  l8 z; a+ l6 c; \請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
0 |) \' ~: ]/ a3 B; O( `  j" n另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:! `0 m+ \- o& S; k
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
# C4 A( `4 y3 Y* n- k內容為:
  V' t, w7 V, l; b; X) w* X压缩文件共有三个文件:两个m文件和一个txt文件
: w5 i( c. r- ospectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
5 q* x7 c9 u. R" S6 W希望大家喜欢!! 4 |" S. c* A/ N
附件為:FFT.rar8 s0 ~4 N1 T, J# |* I8 P1 W
6 A0 n0 @$ J' b( j; t0 N5 c
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:) E) o& H! J! u. J. u7 Z
2 G: |& y9 n& r6 e- L
??? Undefined command/function 'AD10'.! v4 u, H- b& [) a8 Y- u
5 a. F; D( i& A0 b; @4 R4 a0 ~
Error in ==> spectra2 at 43
& q/ X! |. E- S0 i5 V- kd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
* i1 m" E7 a4 l3 d" |3 b. g
% t* e) |$ K  ]由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
/ E4 |3 l9 F. B1 y附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式' u( k, q: K) A+ D: d
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
  I! ?0 J2 B) g! @# d故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算0 D4 o$ z( m+ q0 s2 X  e/ z* s5 ~
% R2 V( u% y- k6 {5 X1 u  N2 K
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
( G0 q- K9 Q, g+ x0 B! i
( z# h' e& B$ M$ B0 z3 X我看不到你的附件檔,故而實在無法作出評論
6 S4 h  M# ]% C8 O6 t而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??' w8 ?* J' }6 K$ P( s1 B7 w0 H: J
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????: s3 a1 n0 y+ y5 q) P! E
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
( \& |1 |7 K  E. c指令的寫法是否為:
5 S7 `6 d; g" D4 ?
# H% R% @: A' K9 @$ d# ~6 ^* ~# m.MEAS TRAN DIGOUT
) F% y9 ^" j9 [. C8 \. R- `+TRIG  V (Dout)  VAL=0        RISE=2
; y' W* j5 z% {8 `2 f+TARG V (Dout)  VAL=3.2m  RISE=2
! P6 p) L  w0 F: A  y. L& E
+ x! T  H/ }+ ~∼還請指教,謝謝∼
, v1 A0 R$ G6 `! n6 l0 s
( b5 y& ]! h: v4 w: b. o5 \6 V另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
4 k7 `: T& a5 h4 G' \
4 s' ?2 _- ^  _* v" f# S0 udigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-078 |; O$ |1 b( r
& I9 x8 {9 `7 p9 Q! ?
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
; U2 a) u4 x/ f
! m1 V7 t- E3 p8 X0 `; z  l3 q  N[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔. K. K6 [9 i, Q) `! N8 a9 b" G
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
5 }( z- S$ R, R& i( f所以,請再檢查一下你的HSPICE檔案吧4 u8 r% g1 [$ X+ n6 n  d8 d
: F, ~# F3 b. X5 J
再來,你的.measure指令用法沒有問題
# L$ A" @7 S9 G( z但,你的取樣點及時間似乎不對3 I* z9 z9 r! [2 p5 B  p7 S
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
% @7 P4 I& q& @+ |2 X. e.MEAS TRAN DIGOUT
% k; Z$ K6 J. {' I. x. R- Z+TRIG  V (Dout)  VAL=0        RISE=26 i+ S. Q, Z% r) {0 w& W/ x# v; j
+TARG V (Dout)  VAL=3.2m      RISE=2
; n* o$ t  Y: l+ z, }; U, k寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話; v( I6 Z! k: r
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock$ C2 b6 J% p+ E! M5 B- b( p
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
; {, C* S7 Y" \# Z再者,如果是用.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程式。: U. v7 p/ c6 a1 q- X! Y
2 F- ]1 X2 M2 b$ R( I! C* Q
∼感激不盡∼
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
3 c/ h+ p" T/ m0 I6 I' p( z- e3 }) X8 A, P4 X" H8 S& m
. o( N2 `7 T2 K.MEAS TRAN DIGOUT4 w; ]0 r) C$ r
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f2 M8 T. T. U; L3 q7 R
+TARG V (Dout)  VAL=0.976E-7               RISE=1% \/ ]& J, I4 T. h. M

" d4 H- V9 c7 e∼還請指教∼* A: T+ v$ P6 K
程式重試的結果,*.mt0檔案只出現:) L' b, E  a9 Z3 U7 a7 N( U
digout           temper           alter#            # h% |2 ?0 E: d- E( B7 @& l% Y2 }
1.890e-12        25.0000           1.0000         
6 l8 h  A8 ?2 l- F1 Y不知是否還需修改?
2 B* h  F7 T$ r- z9 ^8 w6 b2 q/ U
5 e9 R) \& x7 p* I, v" z" `! @[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題/ t4 F: i8 M9 O$ }  y4 u6 \* Q
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息$ D3 Y: q' {' [0 q/ [
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧  v! Q$ |) V8 k% r* h6 j( x, h
8 d! T; E% h9 k* {# B! M" d
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock7 A8 A) o- R' L" ?* ]% v$ ^
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
3 `; S. Q3 c: [% t' `一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
7 g4 t; I" g$ m3 S再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
' m( s0 J' C; w7 H' |& g2 M6 l6 @舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為- @5 [' k" Z6 ]( j2 i' N
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us* H% l" {! e" s1 w
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
: B1 W4 r% t/ h/ Q3 o; ?.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
/ U# Y4 I7 r' I2 j8 _' N.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
& e5 n5 w) |, [# G  u* l( E: Y7 }3 V
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us% @/ U* T3 t* E- L7 X' S+ b3 v
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us6 Z3 w7 Y/ b% }* D3 |# |- g
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us, ~* f. g0 Q- n% E
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
7 ~: n: I6 X; K. F- k* B: u5 `: S; M* t0 W! k
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
9 @- T( E) B* @. G+ k8 {) V我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法2 ~+ }6 X5 ^1 q6 A8 e/ {7 Z0 }) s

5 P8 n) F  r* S- z$ p) G最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
/ |: ~4 M  M$ y& V8 ]  V& Q可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。) a& h3 ~$ F7 L) {
我大概講一下我的架構:9 S$ f, \" i+ E0 k5 r
我電路是使用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的指令寫出,指令如下:
9 x$ N" d$ J8 n3 {For Fs=10.24MHz:' Z) s8 Q- v& k% |* k
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7, k9 B3 A( [* ]6 a5 \; |( R
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
; R4 C3 }) S" C) GFor Fs=5.12MHz 1 L# t  H3 d4 F: ]2 v9 n: D
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-73 t/ f: h6 Q, M( v2 I
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
1 r1 p+ t; G# ^7 ]/ ]另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。1 S% p! c% T( J1 p: o
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:% E% U9 W1 I# s0 _& o5 F
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
& H& J4 i2 r4 }1 r4 F4 R8 D3 q.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us$ K9 L8 _, o& A5 O
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
- X2 V. |7 B4 L8 B; t3 G2 T你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!& [% ]5 S% h7 I; X4 }

& A: o) P, u; m" \$ j[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
" ^1 d6 f5 ~4 v" B) T: Y7 D6 ^, j首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來, M2 Y5 e. t2 v$ w
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?' ^+ a0 h5 u4 C7 O# k3 m

" n. R- [$ C( z再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
+ B* d5 ~, [3 S1 j0 R' {- h7 S
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
, ?' P& Z1 o* o6 h) c* V3 t- N" ?- T6 |7 t* u* Q
clear all: Z/ P9 X( t* f+ G, y; u
fid=fopen('dual_measure_rms.txt','w')
1 o1 F/ T5 s  |( a+ ufor M=1:1:10243 k( s* G3 }) R0 W$ O# R8 }  Y, V" }
       T=M-1;1 ?5 s" P+ ?$ j1 g. |
       from=(50*T)+45; %DUAL DAC measure time. ~9 i6 U: B1 P6 ]) Y+ i
       to=50+(50*T);) v; G. a1 {# V$ h3 j
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
1 r/ P( x4 ], v! u. ]# }9 |end* U1 E1 O- m7 }8 q1 ]; L
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用$ V: u$ [' D* y# q
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧; J3 p. z% o9 y* ~: o  Z/ x% n. K( E! Q
這樣以後模擬FFT就非常方便了" M0 N7 v) ~7 |/ c
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
- G$ h. h  Y  Y* p然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧: Y& C+ j, D6 `  `2 x9 ?9 z
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?5 s  E1 P5 X1 s6 o# T  `
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:3 `' J) P* b; `
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。/ _6 k/ S  C8 ?4 x! m
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
% g- t, `; |1 ?7 ]. T- V另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。8 t: X! L( F( u/ j3 i9 @1 o
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
# n1 G9 b0 L% v5 @1 ?. T0 N4 E5 ~clear all% Z5 Y1 F$ Z4 k: d9 _. e* f
fid=fopen('sdm_out.txt','w')
- n( M- r. [# G6 M" M4 {: Kfor M=1:1:1024
' f5 R' O3 B' K4 y( ^% U$ m( h    T=M-1;
% n% X, K* u- H" F4 B# S9 W    AT=(0.1952*T)+1.026; %SDM measure time/ X7 @, p8 z1 ^. y
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);2 Z' m9 Z. k9 m' v* J4 ]" J
end5 C+ q; U/ L! a& {& N
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
4 A+ L$ p* Y5 c/ q想再請問的是:% x/ R  \9 Z7 ~3 e7 O/ x
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:, t$ s8 W7 X1 L9 F) B1 I
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM$ U8 l. q1 z7 C2 g
然後就可算出SNDR及SNR以及畫出圖形了嗎?
/ o9 w- }$ ?8 z4 x0 |' C請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-15 11:15 PM , Processed in 0.156020 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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