Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 95723|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
" R( n4 Y4 Q* R' a- C' \- P' O; K謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
8 C. U  B9 J' i# N( O7 l要使用這個toolbox時,在hspice的.option中不能使用post=2.* _9 ], j1 v6 v$ D+ M: h
可以用
( E8 }4 _* ?& S; w.option post
* B" r, Q: f3 {! s- D7 _. }% _或是" i- k  T5 _& H
.option post=1
2 V. E+ J7 U7 G5 U/ h但絶不能用
: G' J" j0 |% T.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:( r' h4 l: x8 y( E# X
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) R! o5 _8 K+ I$ \- Z) D+ D" h
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。) E7 }& f+ C6 ?# l

- m% \: M, f6 C' X( h8 y[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
4 t, A0 @1 [2 v: v2 ~  g, a就是直接用.print指令把你要量的電壓印出來
3 ?3 z: w' a& G3 L然後再用手動把印出來的資料copy起來
7 p9 t$ s3 j; B0 N3 J% G' C* k然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。7 I5 P$ D  i8 j. Y9 q% D: q
% o3 C9 v; `. F4 D1 N; G
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 7 [  E* n) v3 x& Q4 f" }# \0 I
所以  只要將FFT後的資料  做一些轉換就可以唷!!
+ z% t2 y1 D2 w6 m  G' B將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
# U6 I" d0 y+ K就可以換算  SNDR 了!!
" l; W' z" M, n$ |9 GSNDR 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. M: _' I8 J" P我想,應該可以給你一些參考吧1 G; A* a2 C% x% i1 c) e

& Y, o3 t; z9 y  q, A/ V  d% e$ ^% --------------Using minimum 4-term Blackman-harris Windows -------------; j3 E: J7 `- F
nb=1:1ts;
+ E  o& F5 G0 d5 Xkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
! e! u9 m; q2 T+ K' D  iwin_gain=sum(kb)/pts;( Z* @* {# ~; Q$ H
kb=kb/win_gain;" Z1 e4 X2 u9 _$ ~7 `4 n) a; G

0 z2 C/ h! G$ u! @: h% --------------- Calculated fft --------------------------
1 r9 T6 G5 x. q: x/ t  e$ r* ^yb=kb.*x(ptsttfi);
. ~5 ^" U2 ~1 eyk=fft(yb);- x! g9 {7 ?# M: ]3 p
fft_no=length(yk);
1 h2 N6 f* r; ^, X4 [) wf=fs*(0:fft_no-1)/fft_no;
8 j% n, L/ N9 h1 s: c$ `$ l8 kPyy=yk.*conj(yk)/((fft_no/2)^2);
* v  {, g/ B# p; Z0 k! V$ t
: Q9 a% a3 d. Q* @, J) z% ---------- Calculate THD ----------------------------
, r6 F% O  ^3 c8 `8 jj=1;
  \$ W. T: j8 l+ S. {; [for i=1:1fft_no/2)) w6 C) w4 X" ~% x: K5 u
    if (f(i) == (fi*j))" P$ _1 _& B; p; M% x
        HD(j)=Pyy(i);     %% find all harmonic distortion components6 x4 K& v  c; c
        j=j+1;
( w) Z( K" U7 r; l% v    end) p* Z5 ^: e3 G+ d1 w& R
end
8 y6 p; T& u9 K* UP_hd=sum(HD(2:9));; U9 D6 k4 W1 _
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
. d0 x5 u9 L8 ^6 d' O0 |fprintf('THD = %g dB\n',THD);* b, B7 ^4 d3 T
# N, ?8 A# H( L$ L. @0 c2 \" @
% ---------- Calculate SNR ----------------------------* C+ Y7 g0 Q7 O6 I" ?4 ?' g
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));# B- g+ z# b! E# b; c# a' g
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);1 X- P# `7 W" s5 g  n2 P' v
span=max(round(fft_no/200),5);$ g( Z- x  n; ?( d4 g
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));3 X8 x! M( b) x+ M' e8 R& M9 V9 J
' D0 I- u6 X) N; B2 O4 i# E
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;/ Y' k) J5 X* z9 |) `9 |% y  T$ ^
SNR1=10*log10(P_sig/P_noise1);: y: V% @) G8 G! B0 `
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
) z5 _" G. P- i, \請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
: T. i5 e* I. b' R
$ M" Q# O5 f; N; Z另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
. L  h8 C+ z- ^3 D0 P1 f"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"+ ]# u* _  ?5 b/ P7 E% V
內容為:$ x3 E' S, Q% T: ?
压缩文件共有三个文件:两个m文件和一个txt文件
: m' D3 y: Z* V$ k9 |/ _spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。1 G7 |4 X  u2 |. V
希望大家喜欢!! $ [: Q3 z) z. Q3 G: H- E
附件為:FFT.rar
& }" W, M" e5 ?, s" @: x) ?( O* b
' B* ?8 m9 E9 _4 Y2 a. B' F我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
4 R4 S2 P9 u% g8 J2 ]$ D% G3 N' p2 D/ Q$ {! Q# j* \
??? Undefined command/function 'AD10'.
0 r  T1 x/ w9 t/ N6 v* r- h: Y3 b( w
Error in ==> spectra2 at 43
' P7 h( R3 g# \; U. D* v" fd0=round(AD10(start:stepstart+M*step-step),3)/1.8);+ `" ^' ]5 c' J# L6 X7 G. G7 E
4 |1 l$ K: S$ _2 @* `( ]! E
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
+ M  h7 w" F. a/ G" [+ P+ ^  {0 X1 c" q% N- {& F! H: S3 n& d
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
$ ]2 g; X! d4 Q9 ]- P" l4 e
: F% m+ P6 f2 B4 @; ~[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:# V# ?5 O, B$ z9 R& D+ V
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
5 c' h+ b# b4 x. @9 {% J1 }3 E另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
( W( ]5 W' R( t, o"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"0 k. [* M6 Z& V( n
內容為:+ M3 M) y  A1 W; L' A8 v8 ?
压缩文件共有三个文件:两个m文件和一个txt文件" F: |1 Z0 a( [6 @: S- }
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
* r, V( P% I9 z+ B希望大家喜欢!! ) L5 e' w$ \4 m8 x- v4 b: a
附件為:FFT.rar
, Z# E# ]# D3 s* r* `
% y3 L# [( g( r( B9 Q我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
! ]# u9 K0 D0 l' c$ ]# j% {( f! U& R( u8 L+ X
??? Undefined command/function 'AD10'.- K* k9 V! F' \, \! |: {4 L

0 }8 a' B2 K/ Z! }2 b7 J5 dError in ==> spectra2 at 438 H( O" M0 ~0 d0 ^9 `% c- F9 V) F% d
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
1 f) }0 _! Z: ^5 F2 p- j7 P8 k' z# x) w
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
: ?! q, N' i, m+ ^  s# G) b附上上帖的附件

評分

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

查看全部評分

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

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,& O6 ?! L# ]% b- _7 J
指令的寫法是否為:: r$ X! L7 y5 `. d. _& o) m
. G/ F- Y8 E3 J4 a& E& n
.MEAS TRAN DIGOUT
, A, S  J! d- z+TRIG  V (Dout)  VAL=0        RISE=2$ _, L" k: A9 |  h3 k( `
+TARG V (Dout)  VAL=3.2m  RISE=2
+ m$ w+ }# Z) v  }
' O, |( @+ r2 d2 h+ u2 |∼還請指教,謝謝∼3 {8 x; b/ F" u4 p

6 h6 ~+ Y- [; y6 Q) q9 ~, D另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:0 m2 z: [  ?1 ^, q4 {
/ j/ e6 F" }, w/ U. e
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-077 N# J2 a$ ]( d+ k

) [% y: L% x  ~Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
' O" D2 Y' b7 p! j6 U' o* v1 [4 }5 h+ h5 |) a. G
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
  b  J" I3 S4 S. s- v3 r1 {# Y* x, |故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料9 p+ V4 z9 B: b. s) Z; M
所以,請再檢查一下你的HSPICE檔案吧3 ~# u. u( c" m. k- A

' b- p" `5 \6 d3 w再來,你的.measure指令用法沒有問題2 i' r- l% d4 r8 i/ u! }$ v+ k
但,你的取樣點及時間似乎不對
$ W2 I( f0 {9 Q4 b* y" b你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:1 b8 i4 w+ U" f+ J: `: t
.MEAS TRAN DIGOUT: S7 a7 p& E! K
+TRIG  V (Dout)  VAL=0        RISE=2) C' f4 @) D* h% J% r
+TARG V (Dout)  VAL=3.2m      RISE=2
" l4 t5 Y/ F! l# D寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
% \, p# \- u( x% x1 T3 a那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock* t3 ]8 R. B$ Z1 ^- t2 w2 V" ^
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2/ \/ Z, |$ L. Y5 l! T6 E7 v
再者,如果是用.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程式。% a% H- r8 j" P  Y" b! ?
4 c; y3 d* a0 ^% ^
∼感激不盡∼
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* R6 O8 l: Z3 R" S6 `+ r
3 }) X8 A, P4 X" H8 S& m
5 e2 M0 \' d$ k. E6 D# c' E.MEAS TRAN DIGOUT; \3 s0 I! M# `7 W
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
9 a/ i+ s$ Z2 ]6 r+TARG V (Dout)  VAL=0.976E-7               RISE=19 O) l8 W9 w% B0 D1 r& X
- l. Z" {) C; }* }4 [6 F+ i+ _
∼還請指教∼# g* P' Q& ?7 f9 M: U4 z
程式重試的結果,*.mt0檔案只出現:. f8 A* Y, F9 M% x# e% e
digout           temper           alter#            
8 i' q' O; _, w8 g1 J0 I( c4 d1.890e-12        25.0000           1.0000         
8 s" o0 \$ s( w/ Z( d2 W* [* A  ?不知是否還需修改?0 V  W6 j0 i( g4 x' `, B1 x

9 l& ~* E3 i" K" O+ R& R  m, ^[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題0 y1 T" U+ t- x( l3 }1 g+ S' W
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息/ E( A5 V6 Q! `$ G5 n4 u
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧) n5 u$ ~& m* U% ^

5 _% A: c* E: |) y/ q; h' g3 L2 t. a再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock. p! C8 [, O4 K
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock+ a/ t/ w+ s' }
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
  a) r6 n0 O3 \再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???1 v5 j# G, J" f" `8 t! P4 o
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
( u" ^% D* a0 _: e+ S.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us$ |3 L. B: b! k( E1 `' i
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
0 R8 _7 K* C" ]  ^1 q' d/ i.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us9 `/ ?' W; ~5 O% O( k1 \- [+ B
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
6 F- b6 t5 q+ f& S2 x, O5 X. a8 R
5 u* A. P. j: [- r.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us5 D4 g: h; Q1 @5 M
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
) [7 O8 \/ F5 D0 d0 `8 k+ Q.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
# A! }4 p* V" H# b4 z.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us+ [+ Z: @5 D: Q8 \% I1 u

% S8 S7 B( g$ U- f; r我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code1 v; @3 ^; r. ~. p% s+ j) e1 E) E
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
# Q7 e5 @! T1 h) s
1 ^$ }6 V% E: Q5 O* q  y) E最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
. J) `; |+ _# r9 ]5 ^可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。* C( m. V' \/ K8 A, T" W
我大概講一下我的架構:
5 o" I( d2 A! v* U5 T% B: O我電路是使用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的指令寫出,指令如下:* e8 s; V) P+ z7 u) F
For Fs=10.24MHz:; G+ k/ ^4 k% y- w
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
- Y+ W, G. |/ BV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
+ g! H; f* o8 \/ q9 M2 o" NFor Fs=5.12MHz
! u3 a* g4 m, Y$ UV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
0 p# i* V& r/ n2 s' s; k" G. T! u, cV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7  R& ?& S( `6 _& b/ k# `, Y2 f
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
# ], D$ N" d$ ], Y. B) k, T$ i) C1 x如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
: Y  [! s1 v: [( a# {.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
# |1 u% o+ L/ |6 K6 G.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us0 i/ j9 S5 s% J5 ?7 _4 e% ]% k
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?- Q" d. N' @5 @* @0 B
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
. [0 r& }3 c& x% v. U+ g
+ ?. {! \5 l; f  x9 ?, n$ g1 }% H[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方8 k4 o6 X2 c' c- U( M! u
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
* }. D5 G' t0 J2 o# I5 W' s# x而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?: I' M' W* @% P) u

! V$ _+ Q& F$ o6 t+ t2 c再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
0 c) r! y& n8 l- C
: s9 X& N0 f9 ~+ B6 BFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
! h1 f: q3 [: K+ G  ?8 \
. _5 p! s' d1 Eclear all
7 _$ K6 Z# j* Kfid=fopen('dual_measure_rms.txt','w')9 O. r5 t, S0 m
for M=1:1:1024$ J: f% Y+ L: y: q' b' }+ f
       T=M-1;8 i8 y1 n- ]/ Y0 z. ]' r$ k
       from=(50*T)+45; %DUAL DAC measure time; m- H7 C, `  o5 n7 D1 s4 b, K
       to=50+(50*T);
' N+ X% h- m+ j" w6 P* t       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
2 L3 r, U& m+ S1 Pend7 L9 k4 c! U4 Q7 l! Z
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用  @& ?1 ~  p- c$ L8 o! i- e3 z
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧: B' f; a/ F8 f
這樣以後模擬FFT就非常方便了4 E4 `' p# i- T* [; u; Z, D! O
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
* |5 V/ O1 \& p* k* P然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
" X  v" g+ E3 ^5 V- q, K/ y7 r只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
) R% ?; G7 d6 d8 Q' o我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
9 R) q; i& c8 y1 v因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。  G- D( h3 D2 v* J7 g9 u! h
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。! N0 c# `) n1 S  K% q- [
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。9 d( J# ~0 K7 C, r
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
* `1 |- @. F0 W# C+ Q8 E3 U5 `8 M4 Yclear all
, l  V4 ^9 X' f( g  `fid=fopen('sdm_out.txt','w')
; G1 L: y( c( W0 nfor M=1:1:1024, C; q- Z) o& ~# H% Y! J1 _% v; i
    T=M-1;2 T. I& w4 e2 X- X9 ^( e* k, b
    AT=(0.1952*T)+1.026; %SDM measure time
% L; ]6 t4 [+ ?6 L7 U8 i    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
; L9 @( C' y$ _) V* gend; v+ r- \7 m: f
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
7 J( B" e% k9 _5 _想再請問的是:
2 r! a; [! f6 i" `$ D當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
' I+ `: a( ]8 Q6 S, @" Kload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
) \5 U0 Z; {: W9 Q6 j" E) `7 ?然後就可算出SNDR及SNR以及畫出圖形了嗎?
7 _4 c: c$ O* ]8 E請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-27 08:02 PM , Processed in 0.217012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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