Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93123|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。0 b8 D- }$ z0 X8 W2 B& i
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
1 i  T, z" L: J8 L: U要使用這個toolbox時,在hspice的.option中不能使用post=2.* S8 p7 ~6 Q5 x" x2 ?  q
可以用2 m/ F! W7 o! k
.option post5 i/ r% O2 B6 B# J* ~: F
或是
; D1 d5 o' Y/ F1 W' S( u9 o; s. G.option post=13 t: o2 E+ X/ U) f" [* h* g
但絶不能用
1 X: [+ l1 S- W9 d.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:$ \9 Z, I. I" t* I) {6 J
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。. T  I+ |3 M- v* Q; S3 D  j, x/ ^# A
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。0 \- p, B) G7 z6 d2 u, J
8 D2 C$ Q2 w5 L4 M1 J$ j  k
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用. f1 |/ H% I: J5 ?, i
就是直接用.print指令把你要量的電壓印出來! d. Y+ e4 c0 t, L' S
然後再用手動把印出來的資料copy起來
# `  {* t! W& I9 N+ Z% U6 Y7 r然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
* {  E3 S# X+ M) r" f9 a" z. v
4 f% d8 ?' b2 A謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, , f" Q) Q3 L' x7 b
所以  只要將FFT後的資料  做一些轉換就可以唷!!5 y! b7 C$ e) S
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"5 m+ B2 x  K# ?9 n
就可以換算  SNDR 了!!9 }6 ]0 d& w; `6 y6 e$ \8 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部份程式
9 D" H/ B0 c0 U2 b我想,應該可以給你一些參考吧& M! v, X  N1 v. ]  J! ?2 e
( Y8 w, q7 i% Y# b
% --------------Using minimum 4-term Blackman-harris Windows -------------
; `; O! J( q) f) h' M+ inb=1:1ts;0 ^5 c1 J8 B5 C5 D+ K, e. z: q
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));5 Q' ~+ l! c3 S* d2 J! l
win_gain=sum(kb)/pts;8 w9 r/ t8 ?# G4 h
kb=kb/win_gain;
/ Z) }4 O' {, O8 C
+ w9 ~( w; X+ n% --------------- Calculated fft --------------------------
: o) ]8 \5 H  i* i" _yb=kb.*x(ptsttfi);
  v2 V  G) \) o# Ryk=fft(yb);
$ f! v) l% q. v  `6 C8 Mfft_no=length(yk);
) X; e6 }) [. H, T( {f=fs*(0:fft_no-1)/fft_no;
' q4 y& i2 Q4 W. X( x! yPyy=yk.*conj(yk)/((fft_no/2)^2);
5 K6 f' s3 ~& r0 H! x
2 P3 T, V* s* a% p2 R# q; y% ---------- Calculate THD ----------------------------8 [4 x4 R$ |/ }& S6 U0 w( C. i/ b
j=1;# F+ Z# c0 H, a& z
for i=1:1fft_no/2)# o. B/ ^4 w: A; Q; P7 \: i( I% w
    if (f(i) == (fi*j))
/ b% I* E) V+ r+ F9 W/ Z        HD(j)=Pyy(i);     %% find all harmonic distortion components0 m8 a6 H3 l: i5 e5 r% i9 i
        j=j+1;
- H5 m8 H/ Z0 k! p: c    end( R" h' U/ o3 X7 k5 y+ g
end7 V/ a: }( r5 L4 n8 z
P_hd=sum(HD(2:9));
+ v0 Z* L; O+ I1 r6 STHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
) `( ^: H: z% Ffprintf('THD = %g dB\n',THD);
3 G* K& X& `) _" U; T/ d
% u( o7 Y( P, q& o6 i% T% ---------- Calculate SNR ----------------------------
4 j3 W- k; _  h! I  Ofundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
8 x2 v# H: g9 L9 }% X. ?fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);4 N' _! |! Y# Q$ n( G) g
span=max(round(fft_no/200),5);
" j: ~) U- }* l" }/ x% N( j/ vP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));4 C& Z- a! n4 ]) S1 m# d% O
2 l2 k5 M; V4 P, _
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
3 V4 B- }- S8 _2 s6 v: {( SSNR1=10*log10(P_sig/P_noise1);( G3 f% J1 `; _; y5 T, b
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
4 q- x6 ~& W6 r請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。* L2 G2 b% T6 e' b
4 [% S# ?1 g/ H; A6 q% |. [, F
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:/ i* v* A( d- {1 ?
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!", I& @0 P* {6 \
內容為:6 d  O# A! Q8 @$ l) _, I
压缩文件共有三个文件:两个m文件和一个txt文件+ c) h5 m! [. i. `9 U
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。! _3 I& C% u+ \* Q% _& ^; w
希望大家喜欢!!
' [# s( a% ?1 e3 v' @$ b5 |附件為:FFT.rar3 ^# n1 S: c, m# n/ b- a. j2 v

+ x# N# X% `+ T# Z我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
; r0 \) K8 R( ~! H7 K+ Z
1 W  H, @# N, q$ e# t??? Undefined command/function 'AD10'.3 C7 i9 m) _' o
( R: l: N. f: F! j1 [
Error in ==> spectra2 at 43
' k/ g% Z. m' y, ~, bd0=round(AD10(start:stepstart+M*step-step),3)/1.8);: x3 v" Q$ Z, u

7 h5 N! e! ~8 \6 S由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
8 c8 r* G7 Z/ d' z4 q3 f1 O* h9 X. \. L* T3 J4 h
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? " \( B$ s0 \$ {  Z
9 Q, C- I4 v+ H( o% j
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
3 c7 s% m9 _# {% K2 X請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 ; A5 E5 i1 s+ Q, N) L1 p1 Y
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:0 u& X+ x7 }% |: ?5 \# }
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!": r& ~- o1 @% s! T. X1 d# t
內容為:& B7 Y' v. R' G$ V7 \
压缩文件共有三个文件:两个m文件和一个txt文件2 r2 A4 d4 p2 a, Z
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。6 Z4 @; j$ Q/ P; [2 z
希望大家喜欢!! 0 g4 A3 U+ H. S9 T+ B* T( S3 v0 ~. w
附件為:FFT.rar
6 B* q  x2 y+ }& V+ F9 R1 X2 b) m" { ) E. |9 T  F5 L& n2 m
我根據他的說明修改他的程式變為如附件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 t7 T& h. E  F% S" o- p7 F- v2 `  |$ m0 M& u' s' R
??? Undefined command/function 'AD10'.
; Q7 [4 ?2 V7 i: S
. n9 ^+ \1 j% T1 yError in ==> spectra2 at 43
: v/ I% B: A9 _1 E% |5 K  Wd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
2 O8 o1 c1 Y0 p
, g" w) F: P  ?* p由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
# a$ _" H* e& D9 R5 z附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
  y. X* l( [& J: S+ q) p要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
/ _( f8 k1 e4 R: a1 w故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算/ |' d- j- o. A4 e8 e
& G& r" N  M: Z- l. z1 `4 x% H
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
1 ?+ p; ~$ X9 X3 z# \. J4 o5 E' k) e- y/ D
我看不到你的附件檔,故而實在無法作出評論! I6 Y* i' p9 R$ W* x
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
7 R+ F" O  S6 D; d2 P4 I. [, B從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
! p5 i. R6 ^9 _/ ]# a/ E. a所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
7 R* R! E# g3 d1 e! ~指令的寫法是否為:
- p/ ]' X6 D! D9 ~( t% I  z5 |3 l# ~  o6 e6 M, V) a
.MEAS TRAN DIGOUT$ _8 X8 D4 J! J& \0 x- N* S
+TRIG  V (Dout)  VAL=0        RISE=21 ?* ~1 p1 |' V$ b; {* V
+TARG V (Dout)  VAL=3.2m  RISE=2! U$ R  }7 C1 @6 _5 E$ `" ~

7 r! ~6 l1 k- ^9 B: z% v- r7 o∼還請指教,謝謝∼8 n. `$ \3 N9 W% y/ |5 J- N
* i3 ~' i5 M+ ?: l+ N& N; l
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:! B4 r# l* o) x5 I+ P" P5 M; k
6 y+ T& U6 Y, ^; M8 v( v/ @- w5 A
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07; a8 v- p1 O! w' K" ~' f

( o1 v; o- f4 |Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?6 |$ ~& i3 J: Y0 m

- c9 ?) O# p7 S- Q4 r" V" ]! @4 n( H[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
  c9 N  e) [& ^# @故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
' K5 n0 M0 M* G( \- x: O" T所以,請再檢查一下你的HSPICE檔案吧) d& o# T# }2 w0 }. o' S$ N9 u
* {# c& M" M1 G
再來,你的.measure指令用法沒有問題
$ N- `! L/ D* R1 \; P: Y! z但,你的取樣點及時間似乎不對
; X, D4 Z+ z/ b' E你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
1 s, \! C/ F- G! ?* j  ?, d& s1 _.MEAS TRAN DIGOUT) q, S: L& R. q) k$ D) h
+TRIG  V (Dout)  VAL=0        RISE=2
( C  ^; @, \/ k& b& S. d$ `+TARG V (Dout)  VAL=3.2m      RISE=2
  y* f9 G* n, z; [' z" l4 B寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話+ H1 g: C: M: m* N/ H
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock7 w8 a% P4 A! Z$ |0 o; Y
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
2 b+ i6 _- X7 \( a/ F& }再者,如果是用.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程式。
( ^2 z- ^( f. z" f. h! X5 \
  \+ F: W2 S6 m6 w1 b. H4 x∼感激不盡∼
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. p2 O0 e' L- X+ L3 A9 W
3 }) X8 A, P4 X" H8 S& m
% d( q% y! [, _5 |/ U5 ]1 ?' G7 J# k.MEAS TRAN DIGOUT4 p% s2 o. I$ L% H) o- j9 @
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
3 |: i/ o/ Q: t; T( s! ?) W+TARG V (Dout)  VAL=0.976E-7               RISE=1% u' }. N5 T+ U# C; y  d+ r7 y

( R  N; U  c6 F! B+ X% u∼還請指教∼- A" `+ m( p0 R' e7 Q5 f( H& b0 Y8 a
程式重試的結果,*.mt0檔案只出現:
5 Y+ k% V( N7 ^( _! m$ kdigout           temper           alter#            1 E  [6 \% n; j; A0 L
1.890e-12        25.0000           1.0000         4 E) D, R" \7 F+ H
不知是否還需修改?
& s7 [2 p) F' w! _+ x; k/ Q
) |# a+ d) N6 k" \; m# l" P0 N# c0 O[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
- V6 C- G; Z9 f0 W你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息. z) |' L0 P+ l; W$ N5 H
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
6 p: j. O- J+ [; M8 L
6 O+ y6 I; B  ~/ V3 `6 D再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock. f. [# j5 l  }% l/ B1 r5 d
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
$ @: {% G5 q: I' E9 @一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
8 ~5 w% e; r! c5 N: s5 R# r4 u再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
9 d/ V  v' x5 U- h( A舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為0 D( s" d$ h$ C  h
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us8 b' h5 v( u) ]6 y5 Y5 f
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
2 j5 a9 }! \) J.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us& L) R( X# I% v7 u- A: n3 T; e
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
6 C" N6 E" d0 m( w$ b" @* w3 K8 \
" |% i6 }; b( z% c# p.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
7 u6 X+ n# L' t# E( ^) }: ?; |.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
/ E$ q- Z# S& E6 u/ H- T; c.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us, v5 f1 T! D5 A8 {! m
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us* M# j! H( a  n% L5 A8 P- I+ p! I8 d
9 x& W* \/ |9 Y8 L0 l# c- L1 T
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
9 }8 Y# r- i4 f. |5 V/ D$ A我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法% u6 D! `) f( |* v, w3 ?

, K8 b/ r7 z4 c* y2 h* Y. n8 `最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us2 H7 \  _0 C  t2 v' T  K& O$ Q
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
, T' N3 H+ `( e3 r我大概講一下我的架構:
$ s5 O8 [( u0 B* P% w7 ?我電路是使用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的指令寫出,指令如下:' H$ }; E* O& ?( Y8 u" X# \
For Fs=10.24MHz:
: u5 h: o% T; }0 C, V2 E8 G( {V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
* ]$ F% ^5 G9 R4 X0 iV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7/ d8 V* D6 _8 i/ f0 r8 V/ s( ~; \
For Fs=5.12MHz ; f6 p0 ^' O: W1 G* W, n& Z
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
' L! }8 W) `1 K) j) ~' vV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7# V5 q5 w6 p6 x* q1 p
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。+ y3 {  p; V5 l5 i
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
1 w3 |2 b" T& s.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
+ X  o1 O/ g0 T. \.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us* n# R6 h6 z; N" o) `
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
; a+ t' v( `. R# t你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
5 S2 b$ s$ P1 h  O* p8 {  q; h/ ]: O% S& N4 P. ~8 [; _5 L
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
0 ?0 R5 d8 n; z- L8 U- T首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
" D- A: c* Z. F% T而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?7 F- i  [% n0 ^
1 i) w! I" ?1 d& h  W. d% V
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪5 `  m7 D/ V( U; K2 u& k& S

9 |' S5 Z1 W3 g+ o" u; u% d7 EFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
0 x( b- G. I5 T( \
8 f6 Z$ o/ Q9 o7 u! Z. bclear all& {3 D! l+ }( O' F. j
fid=fopen('dual_measure_rms.txt','w')% S' l. U( C+ ~
for M=1:1:1024: G  I4 @3 U6 B. f3 V
       T=M-1;
, R; J, r6 ?. R8 o2 |; P       from=(50*T)+45; %DUAL DAC measure time
- E7 Q( g7 @+ H: J2 G( I* H       to=50+(50*T);& {* y* L, \3 B# y0 ~5 ?
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
5 v2 a9 Z# A* A) l6 p! Lend
9 k3 ?) j6 M- _' H9 V- B* i, pMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
' X" P. P& ^: x: l5 T這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
  _/ `" T5 z/ Y& U( m這樣以後模擬FFT就非常方便了
1 v1 U5 F: V# u: B1 w6 q: |看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
+ A' v/ J% w+ B" J9 A然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧* ^* x4 c6 N7 n2 ^$ L
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
/ ^# F7 R4 h+ z$ U) w我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
7 T# {( M7 r8 _- Q) R( w$ f& g2 A因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
( ~4 ^( B" \# ]且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
% Y2 _8 V, e& i2 U7 d2 ^另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。& s% }  b0 ~; W7 c" x
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:+ g9 J  s9 q! D8 P& w
clear all
- d0 Y8 r& `* f6 X, p% i- p: _( ]fid=fopen('sdm_out.txt','w')" V4 c; V; W5 I$ `0 I& a! \2 p+ j# {
for M=1:1:1024$ L1 H2 Y& G! w( x# q% k
    T=M-1;
, C# ?; v& \5 |5 q    AT=(0.1952*T)+1.026; %SDM measure time0 H" L+ B$ E) i7 D' b, n# `
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
9 S( H9 P( o3 m2 g6 Q! ?end, i) J7 n1 U# o
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。; Q! `! j2 c$ |7 m3 L
想再請問的是:/ K- N4 W, u5 I" g$ x+ a
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:4 O$ p8 T, E/ ~) W( F! j) h
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM% H5 c6 e8 d6 e) L$ V' I5 b4 w. k
然後就可算出SNDR及SNR以及畫出圖形了嗎?
+ d* v6 b/ B- D請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-18 10:22 AM , Processed in 0.154519 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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