Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 93374|回復: 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 ?* Y/ b1 D% I* z
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
- K% z) [3 J% d! m0 g+ ?要使用這個toolbox時,在hspice的.option中不能使用post=2.5 G5 A; @* c; J9 b
可以用! }+ i6 s0 O* O1 H
.option post# T8 p" g& |. Q8 N8 Y+ n
或是
1 z' P+ j1 A& n.option post=1
7 c% H) z* V& M; a! O+ K但絶不能用
1 J* U+ u2 V$ h/ X6 l' ].option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:8 _  i: M4 k; J6 k7 ?. v
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
6 C" T0 p7 g2 P* K. C關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
" r2 `& }& O5 l( Q: o
1 x% ]2 q  A0 C7 f- d2 a6 ][ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用, z* S" u0 E1 P; E1 K
就是直接用.print指令把你要量的電壓印出來
6 }% A, N& [: \0 M& w1 j然後再用手動把印出來的資料copy起來
* Q% k. O' B5 a8 |! R然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
) d2 b; r, T1 f2 }6 E, }' a2 y! P2 K" `  ?3 V  F( n* a7 [( A/ D
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 4 m  a4 ]2 B& i; Z: x1 ^# A
所以  只要將FFT後的資料  做一些轉換就可以唷!!; P! _+ ?7 w. P
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"3 q8 f- {) o! K6 V3 b( r- x; D
就可以換算  SNDR 了!!
" ~9 r" i! E) {0 [$ ISNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
! L/ r8 ^' ]6 t) t+ I) X我想,應該可以給你一些參考吧
+ W5 W% ?5 J0 I# B
  t  B; \+ u3 s, b& |9 Q$ H" E3 L* y% --------------Using minimum 4-term Blackman-harris Windows -------------
% E/ o- B3 }$ p' Z3 K/ Qnb=1:1ts;
/ _5 B& x" V6 g, m& |  a" I. D( Lkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
5 ^/ p: e# @' `# X5 O. V0 u( F" lwin_gain=sum(kb)/pts;
2 r/ z! v7 n4 P/ ^1 v3 x- ckb=kb/win_gain;, B& b1 Z' r$ e8 [
4 q" w" H# F: ~& a( @3 [
% --------------- Calculated fft --------------------------
8 R2 z2 J8 o+ r5 j6 E+ @1 fyb=kb.*x(ptsttfi);
, q+ c4 [$ S0 |: K# d3 Y* kyk=fft(yb);( K  }- e0 x( e- G# F. d( C& g
fft_no=length(yk);
; K2 j& \; o3 X8 g+ u: zf=fs*(0:fft_no-1)/fft_no;
0 H& E, R: o$ o- `# DPyy=yk.*conj(yk)/((fft_no/2)^2);
3 X- R" |  a7 n9 `. ^( h, b' F' T4 `, i" w5 d+ V9 T* {, H6 N' T
% ---------- Calculate THD ----------------------------
! t( ~5 \8 r0 x0 T5 [j=1;/ b+ \- i6 V7 H; [3 E& F% |
for i=1:1fft_no/2)
! M  y+ C& v4 K6 E, X* _" r    if (f(i) == (fi*j))
6 L% Q2 _8 R( ?2 p* H* R  h        HD(j)=Pyy(i);     %% find all harmonic distortion components
: ]- ?$ [& k* u0 P2 I, ~        j=j+1;
  R6 {1 l& g( a, `    end
0 _7 i  v8 b2 v+ gend, ]  W9 F& G6 `7 V0 p7 W! V+ e
P_hd=sum(HD(2:9));
) @! x/ R$ F& z" }7 g( m, x4 z8 tTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
9 i) r: l! N1 g; ]# dfprintf('THD = %g dB\n',THD);
! \: f% h$ E0 W6 v3 r  T- u( t/ O1 G2 ?& l+ \, F
% ---------- Calculate SNR ----------------------------
3 l$ U& G' D) h  Z. [1 U, gfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
& d$ s5 l' E$ p, x  b6 w1 hfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
/ Y4 T/ T& x, ]3 d) F/ F1 E) qspan=max(round(fft_no/200),5);
* P# r7 @% D6 ~P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));- O8 m6 [9 n, N) Z
) v. ~/ D6 D0 A9 j! }4 w
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
( }" h0 G: P4 h/ uSNR1=10*log10(P_sig/P_noise1);3 H4 p' |2 K  n" {" M) `
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
/ F4 |8 J! W& n9 r6 V: E  m& P請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。$ p, T: c5 ?2 x, y3 Y% O7 R
3 B7 u3 X" H8 o& V
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
3 D/ `; [3 K" g; N"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"4 P) s7 T+ k5 v# f8 a* v# c6 q; g
內容為:
; e; o* r& E) V0 U压缩文件共有三个文件:两个m文件和一个txt文件2 J4 A3 [6 J; M# z& `
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
3 ?+ m3 b$ D, @( ~8 |; Z7 G0 P8 Z希望大家喜欢!! 2 g! O2 ]$ D7 W3 E- h
附件為:FFT.rar* Z  P+ p# S- E9 M$ o& M. Q; Q6 I
' X# N: P, r$ n
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
0 H1 r- V. g* w
( X# m8 q( ]! c; k1 r0 G??? Undefined command/function 'AD10'.
7 x% M! c5 x- K, @. @; R, D
6 k2 p6 k- e; Z- Y0 E: XError in ==> spectra2 at 432 E3 Z1 @, q+ }
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);# m* d2 f6 P/ x: A- {9 u4 p
. V  {/ ]7 N( a
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!* E  o' b$ y1 q1 U& x

! `8 A6 |4 [. r" ^9 S∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
+ T- Z* L" j" n4 g
' A6 U/ l2 ]5 h7 u( [$ B" d[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:* E4 X4 y# X+ d( |
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 9 d/ D( U$ L8 Q! V7 @# b7 b/ C
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:0 h* B' x$ f) x+ I3 s9 Z
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
% [/ M0 Y* i# d: x3 \/ d- `' t+ ^內容為:
5 H$ t) w, V2 I7 e+ v0 G. Z" H6 O压缩文件共有三个文件:两个m文件和一个txt文件- k$ v0 j6 t) N/ V6 Z
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
5 g2 b4 Y: z: v( [6 B+ i希望大家喜欢!! & C$ A0 G5 F! `& Z% [6 T. ]0 R' y
附件為:FFT.rar0 S( k4 ~$ G6 U5 J7 ]
" R6 I7 Z! i6 L2 Y+ L% 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卻顯示以下的錯誤訊息:$ k- i" P4 w+ E
. [6 L5 t! Y6 [' G) W9 C
??? Undefined command/function 'AD10'.
+ `; @1 ~7 e, ]; A" s% z) h
) }) C; p9 U% AError in ==> spectra2 at 43, c* u: h( N. E+ I1 G0 z8 ~
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);2 `5 P, y# g+ [+ U/ Y0 @' B

4 s+ ]; k8 {# t- P9 a* g9 T& q由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
4 i( ~2 n6 O1 S4 Y8 q3 U附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式5 Q2 R7 s% r4 u9 I3 E
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值1 ?0 J6 U$ L  L
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
  c; C- ?; {  V- ]
% I0 d9 ]/ R! Q4 E& C) l5 I在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
) {+ s" G9 j% a8 p+ p# I
$ n) a! H0 o& t# ^4 D$ |0 |我看不到你的附件檔,故而實在無法作出評論
$ T8 |: @* e4 b2 Z! B而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??" X( S+ q+ G! G+ @9 [4 C5 W
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????; \" w* l8 r$ h
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
" @. h) ]& W  }' j指令的寫法是否為:
  P' V6 @3 B- u5 Z* t$ h% p2 V: b6 h7 F5 e: @
.MEAS TRAN DIGOUT
/ ^( a: |0 S% b+TRIG  V (Dout)  VAL=0        RISE=2
. Z( g8 ]- P7 m+ l9 [+TARG V (Dout)  VAL=3.2m  RISE=2
) P  C& ]4 I- G' q$ b( k/ A2 V# A# T# a4 u# e; V
∼還請指教,謝謝∼
: o7 q; r' _8 B0 a  h9 R- P
3 [- k% u; O' h) ~* U' S) w+ ?另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
9 @$ ?, i/ z, u" c
0 x5 ^! {2 ~8 ~* ?) f; Sdigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07" k1 S" G3 k0 a+ @/ \5 S; i
$ c9 x' m$ P0 g6 H  y8 T) h
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?; Q/ Z( m" \- M- F7 m- m- u

' e4 `7 M) n" {0 V[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔- Z) p* W& N3 @7 k# I
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料& L$ i* [$ n& h2 j+ V* n1 A
所以,請再檢查一下你的HSPICE檔案吧- X8 s5 J& Y) b: m6 I& c
6 y' B9 X! P# C$ s
再來,你的.measure指令用法沒有問題
1 g$ V0 _9 H! b8 p7 v4 u0 j4 z但,你的取樣點及時間似乎不對
) k8 @- A1 b9 [) l; u7 q; A你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:% T5 y/ Y6 Z, v% I: J4 d
.MEAS TRAN DIGOUT7 g8 D, y2 @0 S' |8 ~. X, s2 r
+TRIG  V (Dout)  VAL=0        RISE=28 `; K8 Y3 j3 b$ P
+TARG V (Dout)  VAL=3.2m      RISE=2
+ I* H1 J) I( o寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
# }' G( i% V/ ^3 I, g那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock- `( q$ t: x- z. y$ m3 B0 b1 g
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2& z6 n6 H& o% I4 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程式。
) I: ~/ |2 Y# ^$ [9 i) B6 K' v7 U* f( ?% C3 j* g
∼感激不盡∼
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# j9 l5 X5 H* Q- v( I6 Y6 q  t
3 }) X8 A, P4 X" H8 S& m
* m9 o5 q) q4 W5 _% x. e.MEAS TRAN DIGOUT* p4 w) v* K, \! ?/ m
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f% U4 F/ g7 O! W
+TARG V (Dout)  VAL=0.976E-7               RISE=1" `0 `! ?" m. ~! z

8 R, J; {) q% S$ _1 F8 P∼還請指教∼
$ T) X" e5 _3 n1 i; B- V$ u程式重試的結果,*.mt0檔案只出現:
- D2 X6 x, ?5 P) ]5 a; Wdigout           temper           alter#            
& N5 D' X+ J- c5 C! [1.890e-12        25.0000           1.0000         
$ X& b  |0 m5 p) Y: H; F6 G不知是否還需修改?
* C: }1 ]) e* ~2 s5 s) F
$ \, y$ F+ O* k) Y$ P[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
/ Q5 _: b6 |7 v0 [/ M' _你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
7 W5 o$ _9 _- {4 J: R4 l所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧& q3 V0 [' t# h1 n& r+ K
) O/ m+ K! c5 e8 `* k" j
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
+ K! v4 Z! N/ k3 b  j$ m6 v2 J$ c但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
$ w1 C" f- N1 D: i一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
$ f) |6 @* I5 j1 I再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
5 A6 ]' T  h4 r/ I+ t# u# B4 X舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
/ E3 o6 U) V0 A! S.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us) k9 _" Q4 E) J2 Y" G7 ~0 A% D
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
: S9 {2 @) @( S.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
: O# g; f& y  q+ F.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us4 \+ [- j8 F& y/ A' ^" s
' p. j2 D& T& H$ ~0 z) V" ^6 i
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
3 D( O- P5 s: P.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us( A* a  Q( E) H2 J
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
7 K4 G; O8 r4 k$ o. p, S.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us+ U3 e  o/ k% N) h

% z6 ?  j& ^2 T& }! s$ Q我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code. L) `- W; |3 D  W! z4 j4 J
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
/ i& F1 E$ ]7 @  |8 r1 y( d* P/ `" J  d1 T: [+ m2 v
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
7 L6 r  Z* \5 |, C! H可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。# S! V. }6 p7 X  d$ H: G
我大概講一下我的架構:5 T2 o  ~0 H1 x+ s5 b: P8 w8 Q9 k
我電路是使用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的指令寫出,指令如下:
: {& n7 s1 E! _: ~1 T8 @For Fs=10.24MHz:
6 @$ ]* z2 N8 B; R  YV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7+ X( i# J1 G6 R& G( y/ n7 h. f& z, i
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7- f; M3 f4 k& Y% @5 N
For Fs=5.12MHz
' q# |' H; b0 i& {$ @% RV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
' {2 J" X$ v8 A, x) [# z4 K  O2 BV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7* E: _4 P7 E& i5 x( ?1 P/ L9 d6 Y
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
& z- X+ p3 l$ ?- [' _如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
* j9 k. z; L6 w# `6 x, B. _3 k.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us' B& g! M2 e- R- w0 V
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
6 c4 w; W- Z7 l4 G5 f" ?- r然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?$ u2 F. `8 u9 m' p0 x/ Z
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!9 x) E! Z& S/ V! e5 k9 S* ]
) m8 \# k" x2 Z- P. X  J, d/ n
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
) z* B& T  |! X首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
5 T2 M- w1 ?$ X* P$ d  Q; n  [而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
5 b$ B; r# |0 \  I( O  y" [7 H6 T/ L/ T9 s
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
* N' R# G! Z) ~8 }8 w6 ^% R
9 ]8 ^7 J3 t1 O$ {FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要# @  P; h0 b! h! P3 v

$ I' e9 z6 X1 p5 V* B- U3 t  D) fclear all( k4 |; f7 [0 K  q0 ]( Z7 q; n8 q
fid=fopen('dual_measure_rms.txt','w')( `3 N, n6 h) {7 c. h1 {
for M=1:1:1024
* N+ ^  y: s% c2 @3 \       T=M-1;
6 }( q2 [& c. y       from=(50*T)+45; %DUAL DAC measure time6 j* U0 K5 q: }* P8 }8 E3 q
       to=50+(50*T);
+ U! N" G8 s# e( ]+ r1 S" C6 V       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
5 O2 D2 O1 M" D, x" L: rend
8 I4 q6 w% y0 C7 r  w( _3 mMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用: J6 R% c* b5 d# b2 P
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧* g# P7 ?0 P; m! k2 g) T0 [- Q+ ^
這樣以後模擬FFT就非常方便了
: O; X5 d. ]9 {0 [/ J" D% l看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
2 v* g1 d( N5 I: S. _) A然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧6 O4 e  W4 W- D( d: y* o
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?- @; Y4 j, A/ J. v8 [7 K9 D% q' E
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
7 J( K: T& d0 Q: u$ b$ d8 }5 }0 Z因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。  Q0 V) J) S& Z- n: T5 [
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
  K$ N2 v: n. @6 [3 T) ^  t7 X另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
" X% _9 |8 }) r8 n6 N依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
) _0 c$ B. }1 ^8 I# @9 m6 A$ ~clear all) y, V, R! n) K( ^
fid=fopen('sdm_out.txt','w')
; |2 C' Y( F1 z5 x5 j1 I% wfor M=1:1:1024
' ?+ Q% \% n! }5 L' Q    T=M-1;
8 V3 e) {  ]. ]. C8 Z    AT=(0.1952*T)+1.026; %SDM measure time) U. X- b8 h/ T
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
- x3 E1 R3 H; L& b8 D& ?end* d6 E# O) `4 o$ v: u4 W+ t
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
2 L; ^" `  V% g想再請問的是:: T/ ]2 b8 F5 L
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:2 l' C) G5 X+ h
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM+ g8 `' X6 J; K# Z. w
然後就可算出SNDR及SNR以及畫出圖形了嗎?
5 O0 t9 v. Y7 }- {+ x# j請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-2 05:41 AM , Processed in 0.152019 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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