Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93543|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
& b9 a( e1 S, m( D7 a0 O0 E  o  R謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
+ Y! U; \9 V* m! ]' m# t, q要使用這個toolbox時,在hspice的.option中不能使用post=2.- L' }2 d# L# d: D# o; s* K
可以用
( F. y& y6 |* P( C9 A0 I.option post
, X# Z4 `+ L! k) i) p) G; c  G或是" V8 R* N( m: }
.option post=1& F- s/ g/ d4 R. c' {0 B* A
但絶不能用/ j1 o" t- g" j7 S4 |
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:9 P, `8 ^. i' h- }
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。- t2 V" H" `$ I1 ^) f* f+ |8 J( Y
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
: B( v0 _4 N  i* k8 \) ]+ I
: e. X7 q  I/ Y% c[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用/ T9 P; q/ Q3 K7 v6 ]
就是直接用.print指令把你要量的電壓印出來" j/ `0 h# K. u" Q/ \
然後再用手動把印出來的資料copy起來
; \4 |0 X: S" e& w然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。9 x# k$ S* t! U9 f) f. E4 q! Z
: s  d( E3 {! Y: k) D
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
: I; V, [9 W6 e7 o( }7 i$ @所以  只要將FFT後的資料  做一些轉換就可以唷!!
% Q6 R# b6 `& o8 g( ^6 A將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
: [" N, Z' m6 H1 z就可以換算  SNDR 了!!7 A$ Z6 V8 O8 ?7 c- @
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部份程式  U! J, ?& w, {& H/ s" }' y
我想,應該可以給你一些參考吧
1 N3 q& z0 r% G  c- E2 ?! v" G; }0 Q/ N7 {$ I4 z8 L" Z  |
% --------------Using minimum 4-term Blackman-harris Windows -------------8 [7 t& A" O) m7 V" M7 A. Y
nb=1:1ts;5 Z2 W+ q, B5 R  X1 U
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
6 l0 w# B' z4 e0 \2 u( Bwin_gain=sum(kb)/pts;
: p, M7 c) ]- g! o0 Ckb=kb/win_gain;2 G# g4 ?, j4 o8 |! G' I

: \" U, \% `2 M/ d. s% --------------- Calculated fft --------------------------
. ]. P* D$ A$ G) Fyb=kb.*x(ptsttfi);
, [# M, Q. v7 i4 r) P3 v* e& Q- \- C9 Ryk=fft(yb);
9 _5 x7 G/ @! b. k0 ~; d' \fft_no=length(yk);
8 y  ^4 q7 r+ l& Hf=fs*(0:fft_no-1)/fft_no;) {$ {7 o9 C* F3 `8 H
Pyy=yk.*conj(yk)/((fft_no/2)^2);; w/ O% i$ M; t/ u4 q' o  x+ Q
5 C; S6 E, \3 ^
% ---------- Calculate THD ----------------------------" b" P  J: C' v9 `( j4 W+ O% n
j=1;0 a/ D  F0 V7 y' L
for i=1:1fft_no/2)/ I+ V2 `) j' d4 _
    if (f(i) == (fi*j))
6 D6 q  Y2 N% i. W0 q  N/ f  j3 n        HD(j)=Pyy(i);     %% find all harmonic distortion components
) W) ?* x" e  l" F* |9 E        j=j+1;
+ e4 Z1 o6 u, ~8 R0 I    end
/ _% A% q5 q: ]end
5 z+ ?2 D6 x- k$ |" F1 o' BP_hd=sum(HD(2:9));
1 V$ T7 r6 @5 ~1 Q. ~) yTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
, ~7 f$ u2 t7 Hfprintf('THD = %g dB\n',THD);# W# a; W+ o+ K& ?; p: b, X
9 r' `* y% L4 M; M
% ---------- Calculate SNR ----------------------------
" |. U6 h. H; a% D' ~fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));% _" }) d1 [& j2 u! S
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
8 y( E: A; b: x# L& v1 q: O( |span=max(round(fft_no/200),5);
6 }" H  w' n+ eP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));! Q- j  L6 p5 @, V. g+ {
# Y7 H, G" g4 V% Q) P2 O! M
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;) g: z  m$ u' Q/ K1 B
SNR1=10*log10(P_sig/P_noise1);1 j4 N  w4 L: J0 d9 o
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
/ e( ~/ |0 Y0 F請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。! `0 w  X( ~$ [0 {1 Z1 h0 E
" {# l' S% Q: Z8 Q* i3 z
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:( N7 w% N3 }& J+ C7 s9 ?
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"& k- j4 b: o) z1 R+ A6 h
內容為:
! A: V/ X/ Q* l6 J! E压缩文件共有三个文件:两个m文件和一个txt文件. u; S$ \  n2 p' a5 p; Z
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
8 f& _0 g: p7 {0 u. F7 p% y9 Q1 i希望大家喜欢!! 4 Z- ~! N' n8 m6 x" A# Q- a' g
附件為:FFT.rar' |5 V% {1 x6 L7 ~* y* H  Z
0 d2 b. ?& 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卻顯示以下的錯誤訊息:9 Q9 R& |9 f3 e; f  O( ?* p$ _/ f
8 z6 n6 T" `1 u' w/ m# Z
??? Undefined command/function 'AD10'.
) T& A7 ]4 q8 b/ l5 W5 r
6 {2 g. e' Z6 [; Z- V. g1 {$ i8 ]/ iError in ==> spectra2 at 43) K" y, S& X8 s# u* r' G2 h0 z
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);0 L) x$ M/ L5 S, u5 x+ j
& u' N: j! p. o5 Y  X4 o& ]
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!3 p0 d$ a7 K) f* w3 J9 u& B# O
  W8 }- N0 Q0 T* ^8 [1 ?4 R8 g
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
8 E' s. t3 w; ~- e6 ]3 Z$ ^  M  Z0 h
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
$ P2 m0 e9 z& e) i6 H- T請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 9 ]8 Q% n7 K0 }5 g2 v2 O) H. W' L
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:' s$ z. i8 C& y3 a2 X% q
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
0 Z3 B8 x& M" y6 F( [; V" N; s內容為:
( l0 M- ]  R. [压缩文件共有三个文件:两个m文件和一个txt文件
/ {  n4 e  }8 I7 Y5 O' _3 [spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。2 \- m* n7 ]7 B- j( C& N
希望大家喜欢!! 2 u" O; ]$ Z' I) k2 E1 h; J7 R
附件為:FFT.rar$ R: Y% Z0 I6 ?4 c4 t

( U1 @2 D4 z1 \4 m3 u* r我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
. c5 S# \4 U' X, D% O
( K; y! a5 ^$ Q) G# @; Z" b/ P??? Undefined command/function 'AD10'.
# M9 ^" p3 \' B9 u  F& `
! k' I7 f" T; B) e9 y! BError in ==> spectra2 at 43
, {* L+ o/ Q- P- |+ bd0=round(AD10(start:stepstart+M*step-step),3)/1.8);
* v" C! ^# R# e: f# k6 ~8 Q" ~0 E- i$ r0 g( G
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????, v* \- J& V2 P7 X
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式- z3 p7 F( R8 ]6 s8 d. d; [
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
( F0 w( d4 C" k' s5 S  ~故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算' [: K; {" ?" g* C! Y$ _) b
+ x- m% t7 h% C) c  k; \* c
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧/ M& i! `  Q. G- }, F

. o6 g- o2 s8 t9 R& W6 b我看不到你的附件檔,故而實在無法作出評論
$ t4 L. Z' H- ]8 ?% y而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??1 c+ `7 I' n& ]! X6 d9 p
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
9 P+ B+ R0 P$ q所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,$ {. K) S5 o. G# W
指令的寫法是否為:/ n! [$ x  n$ b' \

) M, J$ D; H+ j.MEAS TRAN DIGOUT
  x" C8 `2 F3 `+TRIG  V (Dout)  VAL=0        RISE=2- \9 [+ y# l- h) y3 g1 [
+TARG V (Dout)  VAL=3.2m  RISE=2
+ Y$ h. E& l2 [# V
2 G+ ?7 I# P- F% U' m∼還請指教,謝謝∼" s+ d. F, O" Z2 c. e4 F

: N1 Z' i! ~6 Y8 ?& B& E另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:. M+ J5 y7 N. P7 o1 L0 i7 ]
) b2 A  P5 P8 r
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
6 \/ U0 U. I* {8 `% c
* i5 Z9 t: f% jHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
. j* g, c* o0 U& }4 o5 }$ s7 f. x3 }) b5 Y; d
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔6 g, Q3 J; J) k2 X+ _
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料. w' k/ G# \5 K. h( t
所以,請再檢查一下你的HSPICE檔案吧
. p/ t- u  \+ s' X  @+ A1 N* v7 o' h# O8 V& D1 e
再來,你的.measure指令用法沒有問題, @7 p1 j1 w% i4 \
但,你的取樣點及時間似乎不對
  p( m1 I8 V& r# r你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
/ d0 H( H  L! P' D.MEAS TRAN DIGOUT5 E  ?& m; Z' f- i. l
+TRIG  V (Dout)  VAL=0        RISE=22 v$ I8 {/ F* w2 E) h
+TARG V (Dout)  VAL=3.2m      RISE=2( P7 ?* p& @( r8 R$ P
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話) I% ^$ _+ h. a  u3 H& C
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
6 ~4 m9 Y1 L8 U, F9 D另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2# K' l  K7 \, W5 G/ V2 e) {9 E
再者,如果是用.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程式。
9 c+ u) M- P3 X; b& y; P! s+ T2 s' v% z7 a/ R. k
∼感激不盡∼
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. P7 L: a6 z+ W6 Z6 N- \+ o9 u# O
3 }) X8 A, P4 X" H8 S& m
7 |2 R' F3 B; d8 b( @  s.MEAS TRAN DIGOUT
$ P) t- J. u- G& [- v( v+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f$ C+ d4 A0 k' c. D) {
+TARG V (Dout)  VAL=0.976E-7               RISE=1* [$ G$ `9 {# z3 r, O! M

% h) L) I3 `' R9 l8 h  U. v∼還請指教∼
; k9 v6 X: N, h: o程式重試的結果,*.mt0檔案只出現:
0 w+ k/ W6 b/ j; K, edigout           temper           alter#            1 t% R" c" C; d, x: J- f9 v2 P
1.890e-12        25.0000           1.0000         
6 v/ L7 |+ l+ ~2 `- w8 m  ~不知是否還需修改?
2 x5 l( `% J, k9 x( h( L" y6 o) S+ ~$ L7 [, d7 f1 U' `
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題  G* N; h7 x" O1 w. n+ k9 F
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息8 U. y4 x+ u6 F: B: i
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧4 o  _2 a* Q) q" k& O1 c! p
, H. T- V* `5 X1 F, F
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
: B% o, X# a8 i但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock  J* u& I; f: I5 D$ x( k6 A
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)# ^/ t" l1 K( l6 @; g
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???* R9 r% y# _5 L
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為: F) i* R  Y' A# O
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us  m! \" }# O4 }
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us3 y) o8 k" s/ R2 E/ @
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us( A% `+ U9 h+ \. a
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
  s$ q! f1 f2 O& N) s+ u! D
7 t3 m% S+ b* o0 L8 P1 u.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
! Q( [! z+ k( P.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us  {9 q" m# L  R! b1 I
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us3 z% S* H5 b9 o3 I) N4 K
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
; W; N% [) S3 c. E
6 |$ N% \& W2 ?* A我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
+ ]- G9 _+ D4 j我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法/ Z2 o$ M" N. K: M
2 J) a' `) Y2 X/ z
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
; p9 Q9 J/ g; w9 F; \) s可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。9 {$ c7 b# C' Z2 ~) F& y. J# _) w
我大概講一下我的架構:
1 T) N( s; U0 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的指令寫出,指令如下:8 Y5 {9 [6 s0 o- \8 ~+ k& I5 G
For Fs=10.24MHz:3 B1 X# y% e$ o
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
- `; _0 |. V& r9 m5 I1 `7 rV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7% u% `: P; @1 X1 `
For Fs=5.12MHz 6 k/ y- v* d& W
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-77 m7 K+ o, L8 _$ i$ s
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
% b: P6 o# T+ e5 C另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。% V; z. ]& N: T" K- j3 {
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
7 e* t  g+ e& x! `.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us+ B- G3 S9 [4 v
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
, T. h* P& w" Q/ `% ?4 f! }然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?0 s# _6 H. Y0 ^
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!+ ?$ O3 B4 k) r9 D8 m4 h
) y* x, p6 N" V% k" k
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方% G& x3 G0 S% U/ L. S9 ^, P
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來1 \0 M0 v# l- w0 T) c6 O$ n5 g% w
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?0 t- V, t" Z5 I

# x  S3 E- g6 E+ U) `* \/ c再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪6 I* u, Y2 X& v) S' a
2 Z- e& N! l/ S9 h1 u
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要7 m) K* K- h5 f/ f5 B* }) W% D
1 ^) I7 {# M0 O0 O, C. O" p9 J
clear all
9 ?8 c4 D5 |9 K/ A! T7 l5 k( m6 Bfid=fopen('dual_measure_rms.txt','w')
1 d: R8 J' N5 D8 q, B4 Cfor M=1:1:1024
+ D* A3 f6 H6 x! C4 X       T=M-1;
5 W! D+ y  i1 l' D, \/ M  v0 Z; A       from=(50*T)+45; %DUAL DAC measure time
  o1 t4 V7 Z  V- l: C; i       to=50+(50*T);. K0 \8 ^7 d3 u% y
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);6 j5 e  y$ J1 L" w5 l8 O! }% S
end
1 Q/ [- H# o6 U( H; @% q7 G7 sMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
1 l0 `; J' C: ^$ d6 |% M: j這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
/ g3 g) K2 {7 x0 T這樣以後模擬FFT就非常方便了
0 E, C$ ]. j% A3 \! ^$ U- ?$ t看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
! r) C9 X- n1 s! _* ?然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
7 a0 G- X  N6 z1 J- _4 T只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
! i7 J3 m+ q2 Y" T  [* v! W1 _我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:$ \$ S* b3 B5 z6 w% r  j5 M9 D/ Z
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
0 k* x; [8 t4 g0 o# B& u2 g+ H& M且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
9 Y) ~! E$ v- T" f: A另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。+ Q  e$ ]+ p1 r8 ]# b" I& K& A
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
, t/ R5 ]! z( A* `4 C8 V. h3 ?clear all. X$ B- Y# s- i/ d
fid=fopen('sdm_out.txt','w')4 ]" E! ^# F% e" m0 b, H
for M=1:1:10246 y& G+ q: M" u# H
    T=M-1;
& Y9 O& \9 M& E& ?0 L    AT=(0.1952*T)+1.026; %SDM measure time, ^4 @, r6 `" X$ |
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);0 k( w, W; E- e; Z5 f/ z
end, ?* L! E& z0 g7 S3 i% m, g
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
. z) t. K, T+ u4 E5 K3 Y+ C! }想再請問的是:1 G. u  b/ j" @
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:- f$ R, c. x, f+ M6 K
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
# ]% L, _, g$ m0 S  _* g$ U然後就可算出SNDR及SNR以及畫出圖形了嗎?& e5 l! C2 m- g) g, o( B
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-13 02:27 AM , Processed in 0.146008 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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