Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93644|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
! j) ]! f1 S! v7 Q8 k謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
8 H3 x  |" L# P. G+ e+ s要使用這個toolbox時,在hspice的.option中不能使用post=2.- d7 z5 b7 j* O* Y# ]; i5 Q
可以用
9 K1 U0 [) `; l* y" U$ ?.option post
- V2 F; c+ q) N- }$ B3 P3 _5 q或是' z" ^+ S' K+ U5 ?6 p
.option post=18 N) T8 u4 |2 J9 A" X
但絶不能用
9 a5 b# r8 ?9 N4 w: q0 ~4 m.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:! w: S- F. [) v5 Z1 B4 z6 E
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
; F' {, M& d9 S* M關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
% z; e) b# c  x2 m& m: a6 ]
7 R/ j0 `7 e' Q; N. v[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用) Q/ _" r+ S  W: X
就是直接用.print指令把你要量的電壓印出來
* Q6 b4 U( f3 Y然後再用手動把印出來的資料copy起來# X( ~4 J& B$ j& L. v. J  Q" ~* `
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
& H: n! A% \  E9 L4 J# N! _' l+ A6 n2 D1 K  `9 c
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, ( c' U+ ~6 _5 z2 k
所以  只要將FFT後的資料  做一些轉換就可以唷!!/ o0 w6 l0 ^$ I) M' |
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"% f0 S9 @: C. V
就可以換算  SNDR 了!!" i' K. h1 q6 ^) p' d- e
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部份程式' f0 p( b$ M7 w& u( g$ v
我想,應該可以給你一些參考吧
2 D* t* m) ?) [& b* @9 p8 R4 w* t6 b2 R# K2 [* L$ P
% --------------Using minimum 4-term Blackman-harris Windows -------------
: g! O) E$ x, Hnb=1:1ts;# _0 [) R9 k. \5 A; I9 J
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 z% o- s& {1 Q: m) ?" \7 dwin_gain=sum(kb)/pts;
) F6 L+ p/ e) u. g; skb=kb/win_gain;  p) f1 j/ `. F0 |' E

0 O$ V: s9 |' X/ \% --------------- Calculated fft --------------------------7 [4 F0 h4 ^1 l/ |- S$ {" c
yb=kb.*x(ptsttfi);* b9 ^: a& [* E6 q
yk=fft(yb);* j5 N# _- I0 a7 N) J" u2 u
fft_no=length(yk);6 S) e# ^3 @6 F3 t0 j% ?$ F1 J
f=fs*(0:fft_no-1)/fft_no;: w2 t3 f. M& x5 ]9 Y  v: K# a
Pyy=yk.*conj(yk)/((fft_no/2)^2);
# N# J: ]+ h5 ~! i6 L9 Y4 b$ T4 t* I2 B9 t; ~: M9 y; n2 f$ C8 q
% ---------- Calculate THD ----------------------------
% L2 H6 P. ^( y% z. {j=1;
' ]; H% T' F. F% Gfor i=1:1fft_no/2)  r' }2 U5 M1 @; c' M
    if (f(i) == (fi*j))
9 k! W6 Z, w6 `' C' J$ K. E        HD(j)=Pyy(i);     %% find all harmonic distortion components
3 N( N/ S% J7 u4 a4 U; M7 S! X/ V6 b        j=j+1;! o3 V4 }2 ?; m& h6 h! m4 T
    end
! W" p# X: Q# l" `6 nend- G7 B8 U6 l- m
P_hd=sum(HD(2:9));" ?+ C7 m- J( O4 z8 _8 b
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal, j* r' V2 R; M# N3 \/ j
fprintf('THD = %g dB\n',THD);1 w! M& z$ t8 x
( k1 e1 h4 `1 N  v. E
% ---------- Calculate SNR ----------------------------; z+ h6 v9 F3 u3 c
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
+ C! q' {; C' A: G% @fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);  s$ m5 d7 u* }) x
span=max(round(fft_no/200),5);! j; q1 h+ h/ T" W) M  \
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
$ t( S' w# P  F# s% M- N. D0 b. D# x, ^& ]# l# \9 q
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;/ y5 L- u. G5 E! H, H3 U; Q& K
SNR1=10*log10(P_sig/P_noise1);# M: x. i  K; ^, C/ x
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:& P' ]& V9 o8 Q! o$ l
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。# g8 u, g+ I$ R0 r* x
' c3 s# k* V! w* s) C6 L
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
0 k7 L6 j; T2 `) e' R, N7 i! J"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
4 f8 t: {! [7 l& M! D9 e內容為:
! P. L9 G* ]$ A4 q% l$ N! K6 j压缩文件共有三个文件:两个m文件和一个txt文件" K5 ]  H$ d8 \2 ?
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。, D: Z/ t! }0 L  G- B
希望大家喜欢!!
( }1 c. B7 \  l# p6 k* B. D附件為:FFT.rar* v) i7 k6 b, n/ ^

2 Y: {; d' _( |% p, 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卻顯示以下的錯誤訊息:
, X  X2 m& i; P5 X  Z; O1 s1 A1 u8 M. Z9 c
??? Undefined command/function 'AD10'.9 K1 z5 q& c; z* J& n
0 ?% a6 p. N4 y9 [) w
Error in ==> spectra2 at 43
8 E) a$ v1 J" a5 ]; {/ Id0=round(AD10(start:stepstart+M*step-step),3)/1.8);
  o/ A" i6 S( L. |' p
) _1 q1 b, R% ~. j由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!9 ]+ b2 A; F: x! ?
/ A/ P3 I: k5 Y1 q6 G
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
$ m! a6 ?7 u+ f+ ?$ s' }* Z+ A6 c. P: r$ f
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:  a. {6 C$ |# e9 v
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 1 o9 S) f% u4 r; O# h; V* }
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:7 `# u( M, s; k/ {) U* e& q
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
; g* a3 |) E& Y1 x* S* M, a- ^( L內容為:
% K" E3 g) H$ ?* h! k1 p6 m- L压缩文件共有三个文件:两个m文件和一个txt文件
( ?& f' L6 {% s8 R, E' ~spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
2 A! Y' _3 Q1 B9 Y8 e' ]5 s希望大家喜欢!! ) f1 W/ F9 i# d) N8 G; E
附件為:FFT.rar, P8 j& d& t% ?7 W6 W3 w2 u
+ m5 t0 V8 y" \2 G1 t
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
, L  l9 V( o% v) {8 H# W# Z8 I' L# E* d, \- S1 }* D+ }( |8 ?) ~9 u
??? Undefined command/function 'AD10'.
) T. F2 h, h* h* F% W, |4 o* S. u: p$ C) j- V: C. Y: w
Error in ==> spectra2 at 43
; p+ z) v, Z! N7 U$ j0 |d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
! q# x8 |1 }5 C) E/ b8 Y+ ]! f$ f* ~$ Y; n
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????, m& i' X- b7 i5 ]6 p2 Q& \7 l, E
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
1 j- U3 z. Y; |6 i$ D! L! a% G要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值" ?! a$ W1 j8 X
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
/ f/ B; I7 u* N+ I3 g# c* o
  X+ w' E. }+ }: L2 m+ e7 ~在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
8 |" i3 o& C2 y8 H
% m  S6 R, ^) L4 V7 I2 O- Z我看不到你的附件檔,故而實在無法作出評論+ x4 G, n6 g. N$ m- L* P4 V4 F
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??* M7 P: t; `4 k0 i: P8 {' n
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
( ~$ T9 O4 R5 h9 f9 {: ]2 \所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
1 b! j0 \% M3 W' v+ ]& k6 g. O5 g6 F指令的寫法是否為:/ g5 T' U- j3 V3 Z- }* h

0 P1 h. w" E! a; i7 j+ z.MEAS TRAN DIGOUT! Q7 N# P2 T4 _; s$ j8 q! Z/ ~
+TRIG  V (Dout)  VAL=0        RISE=2
* f) T6 R! Z3 F% ?+TARG V (Dout)  VAL=3.2m  RISE=29 E, f, [& f1 G" s( t7 \( P* b
  K( V9 O# j. c+ I9 n, Z
∼還請指教,謝謝∼
! i& R0 v/ c; N7 A  F6 C: ?5 ~% ?) ^# u6 t
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
- g$ H9 i- c9 U% F/ Y; o* R7 n3 F& q
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-078 b3 H! ?) j5 u
1 X; ~4 O% d3 l: [4 b" V
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?2 n) O) q/ f  h' {; M5 T

, j* N: f4 ^( ~7 A- A[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔, @5 O- ?1 ?( f' x% @2 G9 g' \( H- k
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料* f7 J, L; p" t
所以,請再檢查一下你的HSPICE檔案吧1 c* c% I- n4 S" J) W

' F3 g5 Z6 o" E, \/ |: k4 [再來,你的.measure指令用法沒有問題
5 }/ |3 C3 B% f但,你的取樣點及時間似乎不對& ]$ O# j, L; \: C7 \' E
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
. h2 ^+ g1 L2 b) \/ a( z.MEAS TRAN DIGOUT4 v  [2 n$ W% m
+TRIG  V (Dout)  VAL=0        RISE=2
: ?1 z- d1 z7 m+TARG V (Dout)  VAL=3.2m      RISE=2
9 @& a2 A! t, i0 Z寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話) |  Q, R" [0 W0 Y8 w) \* ?
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
# F6 y' S8 l& X, X7 O另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2$ T4 \3 v  t( Q: \; O$ I* S
再者,如果是用.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程式。) k' T- w! J% ~: H2 Q

2 @! R9 K$ o5 w% 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+ j" F" f. p0 K0 e2 C: j6 w, m
3 }) X8 A, P4 X" H8 S& m# d, s: M! V/ [7 V" K1 n
.MEAS TRAN DIGOUT  f. e% t  r3 S% \! R" ]  y* X( Y
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
" n7 U* ?, {2 K8 q! n+TARG V (Dout)  VAL=0.976E-7               RISE=1
' k& m& N) R. E* `0 z4 z
8 Y+ ^& t6 I! [/ h0 \* s∼還請指教∼
& U+ e% S* d6 I2 \程式重試的結果,*.mt0檔案只出現:
7 c/ n" j; y$ P1 {digout           temper           alter#            
; A+ o3 l/ \. p- }# Z6 v" c* a% C( a" }1.890e-12        25.0000           1.0000         
( \& N2 j) G9 b: ?! _不知是否還需修改?
8 R5 r4 f- P" S) v( ?5 S5 a/ U, z. @; P: W$ K: L
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
4 Q7 Z# R0 e% w, N& }0 ]( p你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
7 g2 `% d: p+ [所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧" m8 @! P" g3 E9 X/ ~8 ~
% i7 |1 t0 [! G& y
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
  v0 T# d0 l8 W% q( k: g/ F9 W但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
9 O' H: u# R  h0 Q1 }8 W一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)8 c) G6 |3 ]2 @. G/ j9 j" R% I7 k% ^
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???9 f, W2 A7 q5 {* I8 Z3 f$ V& c
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
2 V/ D2 N6 w( B  ~- g/ g.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
# P% I: S8 P3 t7 H5 l( l& o# C.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
, I& l5 e3 [0 a  J2 P% L- ?.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
9 \* |, x4 |  @! P) L& E: n.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us" I' l5 j, }, d9 L9 \% l1 S

- ^' A" I1 j: P- u.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
# O- K7 D$ a  Z6 C# X1 A( P.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
8 j% u: |. i7 X9 e. H# ?) t1 T/ A.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
( U- v  W  J6 d, t+ C.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us- u, O  y0 g, k2 m% m0 W

* n+ |9 j# U4 i0 c! |8 h我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code$ a7 k( u" H/ y3 R) ^, ]2 P1 F
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
' j* v- T3 P; U2 [7 e; X
3 e+ m$ X8 s3 M  q3 x最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us0 O! @5 s* E) q% H% D9 ^7 P9 t
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。* F' I5 t9 g+ j* S) U" k. E
我大概講一下我的架構:+ u" G7 l- X3 G
我電路是使用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的指令寫出,指令如下:
. O9 C+ H6 {6 w: d- Z7 d3 nFor Fs=10.24MHz:7 Y; ^( t- n$ M0 Q0 y6 f1 ~0 `
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
+ [9 y# e* a2 Z% \' NV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-72 U  E5 Y' Z! G5 [/ t9 o& y( F5 t# M
For Fs=5.12MHz " F7 n8 \3 \% O0 s  s
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7- L$ I, X  s; d8 q4 H
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
% f  \& l! e& D) M; ^+ @/ y另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。/ F! P& j* ?1 i" l' }+ k
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:8 t8 j( P3 @* g' i1 x3 P; ?
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
& j3 }" x4 N: W4 R- h.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
; _1 ?& F( q$ D: `- v* i然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?2 u  F- E7 W7 V) T; f& A- D! e1 f9 j
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
' [3 Q; Y3 \2 w6 Y% O: H$ F# ?# d3 c4 N3 Q
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
9 t, k) p- p2 E# |7 r首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來$ K& k! l' `' _7 q: ~# B9 H  w- k. }
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
" k7 o8 F+ F  G* u8 y. z2 b5 F. a. f4 d. {
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
0 ]! z7 E; u+ a+ k& L" ]
1 t1 ]; y0 @) D% c! lFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
% D$ p, B" @# U# B$ P" X* f, p( T+ ], K8 M3 ^4 ~
clear all5 _3 x, a. t. z
fid=fopen('dual_measure_rms.txt','w'). M& n7 I1 o: M& e' U
for M=1:1:10244 g5 ^/ Q( P. L5 l. `* b- Y1 F- v
       T=M-1;
( P# v  h9 K2 I, i2 s       from=(50*T)+45; %DUAL DAC measure time$ g  M! s1 g1 g' K
       to=50+(50*T);/ V. T. N) `' m  V0 ]
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);# h# V) r0 R- e; H+ W* h( _
end9 W6 `7 L! w7 {3 ?: {& U
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用8 y; ?/ D$ x) E9 S
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
$ s2 X6 Y, |) b% l8 o4 U5 c這樣以後模擬FFT就非常方便了
$ N- b' _$ [  U! J看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間7 P7 \% o6 o  I2 ]7 q1 e9 R
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧; ?& u# H% O: S5 m8 M7 r
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
: l# }! c) D' h7 a$ o1 r我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:" {6 B; ~* S) X$ |2 @1 _
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
. K8 l5 x6 Q- F7 R) `( @且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
! m7 |  Z2 i7 |/ V* z! B2 i: G% N) a% P另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
2 K- P$ }; ]( C. M依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
7 d$ w- o  L9 ~; ~: o2 rclear all
% K* w$ m" l) Y2 y7 U5 Z. dfid=fopen('sdm_out.txt','w')
% K! o5 |9 r" }, T0 X7 W. p$ Rfor M=1:1:1024
) S# t' B$ N, ]4 T- [    T=M-1;9 x& c& o1 u" V! T$ z6 n# }( `
    AT=(0.1952*T)+1.026; %SDM measure time, Q6 J; V, \) b7 F  X8 O
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);9 P* j1 Q- A* e$ H
end3 k! _- I7 i# x; m
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
1 s; |3 E8 i5 E$ P% x, J想再請問的是:
7 u7 j( D4 g0 v3 k5 f& N8 n當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
) n  G8 _& t1 }+ Q) Oload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM7 d% E5 ]- [1 o. n. G6 l) H
然後就可算出SNDR及SNR以及畫出圖形了嗎?+ M. r& B% Q7 A" N5 l: k! W
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 10:51 AM , Processed in 0.162021 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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