Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93004|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。& o1 z0 S+ v6 T" U( _: O
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
3 G/ U; Y3 ~9 y/ G! C% s要使用這個toolbox時,在hspice的.option中不能使用post=2.
- o5 a2 {1 B  }/ @1 j可以用$ S0 Z( ]4 p- s' }# ?- |
.option post1 W) U, q4 k0 X2 x" ~5 }
或是5 j8 k& ~& _3 W$ j9 G3 f
.option post=1. S4 E0 T- d% [' u7 \4 Y
但絶不能用+ \! N+ S; `: Y
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:2 f* H; v; T/ n+ }3 q
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) N! f# l0 g& [
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。$ h# j/ Q) m' t- F- _+ Q3 Z# j
: ~+ H  \- W. b' q6 a3 z9 X: s
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
( U3 G: ?4 L- D+ H$ ^5 Y就是直接用.print指令把你要量的電壓印出來
: q& S8 p* s# d; I+ N5 V0 ]: A' E然後再用手動把印出來的資料copy起來
" ^/ l9 ?$ D9 E: E; Z然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
9 j2 }: _9 r2 o; }7 E$ t; b2 [0 C! i- O+ x# y) C
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 7 J: l8 V2 ~: E0 W% H& R, P
所以  只要將FFT後的資料  做一些轉換就可以唷!!9 m7 @8 v& D( T
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
4 y; S! v; P: i$ h% T就可以換算  SNDR 了!!
% ^( {, u6 d: Y5 a4 }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部份程式2 b* w! b. \6 F2 v/ l3 R" F
我想,應該可以給你一些參考吧
6 C8 p9 x3 S; }2 \' m2 c. h3 H" D0 Y7 y; j" |
% --------------Using minimum 4-term Blackman-harris Windows -------------& l$ m3 G" i5 L9 l- I; E' Z
nb=1:1ts;/ E( n7 a% d( s+ ^
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));3 S2 o: V6 X7 z9 r% n$ e
win_gain=sum(kb)/pts;
+ o4 G# @- c& Q$ X' H3 i  akb=kb/win_gain;
& m& l7 [$ K* `, v6 [" u! X! w0 r1 V2 P( o' P! t4 Q- A4 k) ]
% --------------- Calculated fft --------------------------$ c9 x3 ]7 P, A
yb=kb.*x(ptsttfi);
' d7 O! e& L9 w+ v) E: P( p7 B/ V4 Ayk=fft(yb);9 _- ^; ]* I2 ~
fft_no=length(yk);
! r# L) D  }7 J3 M# J" sf=fs*(0:fft_no-1)/fft_no;
. @" E" L3 V8 u+ @8 v2 X9 ~Pyy=yk.*conj(yk)/((fft_no/2)^2);
' f! j+ m" B; y5 z- n, O* a4 f7 T& Z- y5 l/ E
% ---------- Calculate THD ----------------------------
, E* [- R! v( A0 G: v- dj=1;+ `% z9 e6 S) M& I- f2 E3 m* _
for i=1:1fft_no/2)
/ f  e+ p7 v" c# c9 I5 r8 ~  k3 H    if (f(i) == (fi*j))
) t; n6 g& b" _0 t' f        HD(j)=Pyy(i);     %% find all harmonic distortion components. ~- D" L5 y( O% y: m
        j=j+1;
) e; J  q3 M+ Y, T) ?, f    end: K7 G! L6 H; @
end
% |, h* s9 z5 b6 e% b! b$ bP_hd=sum(HD(2:9));1 U. m/ p0 y! ]! L; P
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
) l' a$ ~1 L8 ?7 W# M* }fprintf('THD = %g dB\n',THD);
2 x# P8 s$ a/ l/ j4 x
# Y/ c' C3 s# s3 l- T# Q% x% ---------- Calculate SNR ----------------------------8 p0 J! x9 p# N# q
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));4 S3 k+ Q/ M) n
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
0 A! D/ {. b$ e2 |* v; dspan=max(round(fft_no/200),5);
4 m8 S# [# {) @0 GP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
9 q8 q( Q% D7 w) Y  B. t% X# R0 E
6 H$ Y2 u5 ^8 gP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;( j: H9 X$ x( ~) b0 {. ^
SNR1=10*log10(P_sig/P_noise1);6 y$ d0 s6 Z9 K
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:5 h( Y/ `  c3 n$ p$ `
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
/ Q; k2 K5 ?% v( E! P
' g$ X  q% G! q3 A0 n# B另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:* F' Q' ~4 M& B* n8 C$ @/ v# b0 g
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
; ^7 q' L' V7 `" @& f內容為:
+ L5 v7 W& h6 R) [3 u3 ^2 a' [压缩文件共有三个文件:两个m文件和一个txt文件3 e7 E9 L9 U6 S% V
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。* c, j. _' o6 x; Y
希望大家喜欢!! 4 s/ o8 h* T2 F% t6 L& B8 G( ^6 I
附件為:FFT.rar# Z* W4 l& M# I( `
" V' q, H2 @& z# x9 @5 G/ w$ @
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:: Z1 W  J. L+ J& L. K

: f; w5 E+ D$ j3 _4 r+ d1 U??? Undefined command/function 'AD10'.
7 l! m) l' u1 v# x' R3 [: u3 A7 d
- |4 a( W% H( AError in ==> spectra2 at 436 L% u5 n: X0 x4 J4 ]
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
9 O/ m! @. }$ u3 S1 P2 l" {/ ~2 U% c: ]" F( C4 k2 i
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!& P+ ?; Z" {$ H; q

' M: R- a3 g" B. C8 H4 N∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? ' ]( y5 C& a1 c) r9 ~5 J1 E
4 [0 ~! o+ |$ n- Q1 f
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:+ H6 O5 ?( w' M0 [
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
# U! g' [) K/ r% B  @0 I* x7 I  z另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
* U" M  S/ U) F' T8 B"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
7 Z2 K3 s8 H3 r( _內容為:
, e+ [3 [/ U* Z压缩文件共有三个文件:两个m文件和一个txt文件/ M, m; X: I5 r; J
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
  X2 z# t& i* k& e$ H# e希望大家喜欢!!
" R8 h! j% ^. J( h3 F( n; S0 w附件為:FFT.rar
8 c0 \* Y( E$ c* M  l7 A
2 o" f# o. \9 r; O* x9 W我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
1 L* j5 S$ |& n' X
' E4 y  _; T# L1 w??? Undefined command/function 'AD10'./ T0 C% @( s9 R  @" W: S
/ V2 R; _; s# R+ N7 l. J; I
Error in ==> spectra2 at 43; z6 v1 W- D' W2 n2 }. O( r
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);! o$ ^" e/ F" u

. A3 r4 O) u# h+ Z% b8 C$ Q: r由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
0 o2 V1 G& n; }4 i) A附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式& v0 M8 @4 G! _) ^
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
! A3 H2 X5 {3 \# ~故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
8 @/ j! r! q" W& b) ]" Z) l0 T" ?% g/ b3 _! @/ n
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
1 ^) ]$ q! F! A5 y
  C; ^0 @& a7 u8 l  q! i我看不到你的附件檔,故而實在無法作出評論: x  d& e' x, v9 b1 T# C" V
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
4 ]& g* V" n8 ]' C: P0 A, n; y1 V從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????! e* M- }' F6 e8 ?1 Q2 x5 h3 K
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
( l9 P$ ]. o: ]# q' t6 b指令的寫法是否為:
" m( h, i/ s: h( v8 b
2 \) c9 `1 h6 @; w3 v; r.MEAS TRAN DIGOUT' U7 f9 Y, V5 q5 `
+TRIG  V (Dout)  VAL=0        RISE=2, D  f; d2 r  V' Z# j
+TARG V (Dout)  VAL=3.2m  RISE=2/ @% ]  h! s3 v# L1 `
$ Z6 t* T, w$ P* F$ z! D2 k
∼還請指教,謝謝∼: c4 t% E  Q$ u9 E+ h; c  e

- u. K; S% J- _1 j0 T8 D, a3 U另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
1 b$ H4 y1 d( V' ^& o' a
6 w2 h0 Y' h0 _3 u2 Udigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-071 Z1 a. S; ~1 R* a
4 Y5 Q/ L* \$ E  }6 w+ }- h
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?% A7 n7 q2 r6 J6 [9 r, N
2 j( K" N* U+ `# M9 a: s# x* u9 e9 n
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
2 M+ z2 [1 N2 u' w0 c故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
, u! l3 Z" w6 r6 D所以,請再檢查一下你的HSPICE檔案吧
' D# ?: K: Y; P" D4 s+ h4 c" e" U/ S' l6 y9 H! T5 g4 n% ]
再來,你的.measure指令用法沒有問題$ W: `9 N+ D' }
但,你的取樣點及時間似乎不對$ L9 D  y4 {, j+ t% u
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
$ i5 O4 H7 A6 ?5 \8 [.MEAS TRAN DIGOUT* T, v) x  |1 \* _% P  z- L
+TRIG  V (Dout)  VAL=0        RISE=2, ?2 c8 V! N* {$ g' X
+TARG V (Dout)  VAL=3.2m      RISE=2
  o' W. h8 x' C. p9 r" Q; |寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
$ Q$ S) |( e( w$ {" B$ E7 w那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
' l  P0 `" @9 D. W另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
. u: [5 [# p/ X- v0 w  _$ r, K  _2 y再者,如果是用.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程式。% j* ]1 |7 s" @0 x0 B8 a( R
2 ?' h% i% L; u0 |
∼感激不盡∼
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; n6 A0 d: h- f# r, ]
3 }) X8 A, P4 X" H8 S& m. A4 k! q) p2 A
.MEAS TRAN DIGOUT
' v) N% s/ F& [0 k7 @( p+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f- U2 ~+ O# d0 B
+TARG V (Dout)  VAL=0.976E-7               RISE=1
( c/ t, S# O4 S4 H3 F) P
  ?* E1 v. }: z4 Z, |5 }! b∼還請指教∼
" u% F& Y+ h1 z* W( u1 @程式重試的結果,*.mt0檔案只出現:
; i! A7 G% ?7 V1 ~: |" cdigout           temper           alter#            1 I/ E9 B6 w# |% ?: p) J: f
1.890e-12        25.0000           1.0000         + X) d4 a- x/ p5 }) ?" s
不知是否還需修改?" d* }: G8 F; [0 g/ s9 }

" e4 v9 [+ h! X3 Z[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題; r8 X( R5 R* ]% A6 t: |% X
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息( Z$ [  z$ d( |: ^) l, g  d) G' O
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
5 H6 ]. R* f4 s
6 W" d- T5 |1 c% E8 C5 Y再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
  ~# k% n2 c0 y& `; ?但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock! G5 g; l9 u7 B
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)3 U2 C: i1 T; ?1 X( s; m
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
9 l8 i# H4 @$ p/ P8 ~舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為; i$ m- s! a$ g$ _/ q2 v
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
$ r; V- G2 d0 b/ N.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us0 L; B2 T' A0 _5 j6 q- h
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
. k) Q  o1 W% i/ X/ W2 D$ O0 F; U.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us& M6 h- a2 E; T% w$ S

1 w5 h& Q! k' X, R( H4 F" w5 ]6 Z.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us$ q- m. b5 b% d0 ?9 N9 G* l
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us2 C: D) Y. \+ o  \1 H0 t- W) E
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
6 r2 a/ K7 k1 R/ `/ u.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us' U! c8 x8 S" [# x9 y

* {* d6 Z3 g. M5 s0 B, _我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
& z3 e3 `3 O% w  \* C0 `: s& J我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法! ^$ Y( I* s0 i1 t3 V+ w
- u5 R+ `* L5 G# Y  |
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us' ]8 C8 F: u- w! |" F1 _- h* P# f
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。& ]  K6 K) n7 {" Q, `. T
我大概講一下我的架構:5 }) P, q( S$ o% J0 J
我電路是使用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的指令寫出,指令如下:
$ k) F1 t# K9 F* M8 H, s6 G) r' TFor Fs=10.24MHz:: d. I7 U, b2 ]8 s
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
, }/ [0 C0 F" s6 a; d. g0 g* {V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
  ^! l' C4 L. Z! \3 V5 P7 l! x4 G$ fFor Fs=5.12MHz
" L; |* b+ r- R! M! Q, pV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7; v" g5 K: \% X' H5 w
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7! M) \0 k& z9 L: j8 W
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
* R+ N3 d, T; z如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:, x; R9 o5 A  C: D
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us7 G& @3 v( v. ?
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us( r% K- F6 E$ z+ t; Z: G4 F' @
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?  P) ^7 U& A( _  M
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!$ ]1 w3 v2 f2 H6 a% {4 j6 @, K- L' }$ E
; b' D/ C9 u( U' i/ {) [) [
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方  K; K! f1 c, K) S6 o
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
) h' H; z  }5 [' F. Y$ x而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
2 P9 t0 \/ \: D+ q; A& M- L4 E+ V' q
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪8 p1 N' T8 H; V  y

  l" B+ V  U9 UFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要7 e8 Y- v' T: N, u6 I- P' u; E
. @) N& Z" ?9 c7 {* W9 y3 o0 @& c
clear all6 @/ G) F' e9 u
fid=fopen('dual_measure_rms.txt','w')
" |7 t6 Z2 L. Bfor M=1:1:1024! s+ v$ Y" r6 `2 P3 S
       T=M-1;" \% R/ p8 T  V& L5 l
       from=(50*T)+45; %DUAL DAC measure time
3 N# A# S# v7 W' \       to=50+(50*T);+ _7 Z% d- z$ w3 ]1 Z, U
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);( ^- }$ h8 p9 d9 T5 T2 M
end# O3 w5 {/ r$ z! n
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
4 R2 ?8 g. Z' m' b+ x這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
% m7 b  E# Z, ?2 S- I4 n3 A這樣以後模擬FFT就非常方便了
2 z: j0 P4 s: s看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間2 X- t% Q  P  s4 V- E2 k9 v9 P/ J
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧) R4 I4 _6 t) u2 p
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
8 z4 F) Y8 d8 t& a6 E我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
' B1 B# w8 n  A" `因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
* G' ~  C" f; m9 S/ Z5 T4 N且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
: B, V1 t7 O1 ]" m另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
- s" R4 z) X/ n  b依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:/ q% U3 m. e7 N4 c
clear all
; j* }- R6 G+ H) g% ~8 ~* [) ?fid=fopen('sdm_out.txt','w')2 [. _- _3 ?+ e; J
for M=1:1:1024, L3 W/ d( A; ?% N7 h
    T=M-1;" A0 x. c6 d  I
    AT=(0.1952*T)+1.026; %SDM measure time
+ M4 w$ N& A4 ?0 e    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
8 K: |9 Z6 ]5 ^! P! l, @# P# ?+ rend/ W/ B* m3 m# r  Y" ~. A  F( o
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
7 _& c3 O+ j! i. r$ c* H想再請問的是:
7 X4 x! g$ m) P  a: U當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
* W) D/ [! f! `" E8 B5 M! qload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
6 s  [# _8 S0 c2 ?" i* [; j2 |然後就可算出SNDR及SNR以及畫出圖形了嗎?
! O" N' C8 m' o' M9 ^請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-7 04:21 AM , Processed in 0.134008 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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