Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
5 b. f! H1 ~* y2 U0 X就是直接用.print指令把你要量的電壓印出來
4 I' K6 B* z' _& z5 `" W5 C然後再用手動把印出來的資料copy起來
0 H6 U% K& N2 `7 F* S1 U然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
  O3 T8 F9 M" ^. p  V4 W7 q# G6 {4 c, l
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, 9 B- m$ q- u! R$ ]# y& J
所以  只要將FFT後的資料  做一些轉換就可以唷!!1 \: o+ \9 I4 {# Z6 M- U
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"! c; E8 v! F, |# [* v) ~
就可以換算  SNDR 了!!  _* o3 X7 u% Y: j
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部份程式: u9 l8 f1 J" C/ {5 Y& O" u
我想,應該可以給你一些參考吧
  h# F6 T+ ]" `% m, E5 B6 q: \9 n9 f+ j
% --------------Using minimum 4-term Blackman-harris Windows -------------6 D1 Z' ?4 m7 A5 G# P6 {/ X
nb=1:1ts;0 \: g' o$ j3 f2 x% c
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
, O/ }& N2 i# s/ y# U+ zwin_gain=sum(kb)/pts;
: u; W- a3 y7 W3 t% B1 w/ vkb=kb/win_gain;5 k" u, _( ~, [7 Z+ i! V

" K& d$ b; h& i% --------------- Calculated fft --------------------------% h4 F0 W; {. D8 u& I* O
yb=kb.*x(ptsttfi);
: C& n% G. H% y: l% g! oyk=fft(yb);
% _% S! u5 V1 m* C; @. X, Ifft_no=length(yk);
3 o2 r% X0 [+ zf=fs*(0:fft_no-1)/fft_no;
- ^# ]6 p; e/ CPyy=yk.*conj(yk)/((fft_no/2)^2);; U% a& t( ]; f7 H: j4 K; _6 U
9 c* k) R# \& R0 I
% ---------- Calculate THD ----------------------------0 r: n' ?% V' T# q4 N( e' |& k! n
j=1;
6 c3 o" Y1 B' y- H/ N! r/ t* Xfor i=1:1fft_no/2)0 y8 o% ^# M0 ]5 l, H( T' ?# W
    if (f(i) == (fi*j))
8 N# n6 |+ G  X        HD(j)=Pyy(i);     %% find all harmonic distortion components6 m( B9 U4 D9 {
        j=j+1;9 e; z2 C$ S+ L; ~1 h
    end; B, F* ?; N8 q  p) l1 m
end# g! {" f. t4 Z' ~' `; r/ M* g+ e
P_hd=sum(HD(2:9));$ c4 m3 k! k3 c- r. |6 k; A
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
( C1 k/ i% z% T; e  J7 f+ m  F6 @fprintf('THD = %g dB\n',THD);
  v2 g2 R% T- ^. [' `# P4 Z
( @4 |5 s, X6 o# R% ---------- Calculate SNR ----------------------------" v+ F0 Y/ \8 [9 s. G
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));- ^* N0 z9 |4 v
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
4 I3 s# o1 [! f! ~9 C/ i7 _3 H1 ?, sspan=max(round(fft_no/200),5);
7 ^- e# g, J/ Z8 ~P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
3 V% [' z4 `) f7 r2 x: |
& H1 U1 \* s- c% }% sP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
- [8 X2 V0 @1 m2 p) G2 O& n* NSNR1=10*log10(P_sig/P_noise1);
+ A$ ^0 D  d4 F+ q2 h- g. O* ofprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:: F9 f- ]- V% f
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。  R  o, x9 s5 g. ]

( w+ T7 K: I* q2 z/ [1 N另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
( A* j, l8 h, A3 ~"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
4 {8 \7 i) g  a2 g內容為:7 G# I4 O$ c& }5 k0 t" K6 f7 K
压缩文件共有三个文件:两个m文件和一个txt文件1 P% p& e% j( r3 d" A
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。( |4 Q2 D" _9 x0 a& a9 }
希望大家喜欢!!
; @: Q% X! Z  G: r9 K$ x附件為:FFT.rar
, a! M) ], I- Y8 ]- c. s
: w# p4 \+ o+ z) @1 t& h- n# W8 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卻顯示以下的錯誤訊息:& m, w4 K) g$ |" r' A4 {
7 j+ o; V5 x: m8 s0 @* _
??? Undefined command/function 'AD10'.' L0 @# _7 m/ o  R
/ @/ Y4 z- }* j1 ~* R
Error in ==> spectra2 at 43
! k, S% U) M5 @4 R' j$ Fd0=round(AD10(start:stepstart+M*step-step),3)/1.8);  V+ r0 _) o9 l# U* g4 k+ d

( h3 L' i. e. d0 V3 B由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!$ ?3 O# e) ^: R% N- d

: Y9 M9 n( A' |+ O& S' ^5 j, N∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? ) P' i' C+ l9 ?9 q) v) Y
: B5 X) E( W  s  X, j- g
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
; @3 W- y6 c, m; f, b* J: ^) A6 j! i請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
; E) @. v- {  v) |另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:3 }3 T! b9 ]' b7 Y6 C8 K
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"3 q$ M3 j2 l: R7 |" ?) v$ c  [
內容為:/ H: T1 b% C. z" g2 k# l
压缩文件共有三个文件:两个m文件和一个txt文件8 k6 ~0 k0 A5 y. a
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
$ ]) [1 {% |- G+ k+ Z4 k" W希望大家喜欢!!
# T! x% g6 {, a* H  T3 ]3 H附件為:FFT.rar
( X7 ~; I! G% Y  d# _
7 p9 J$ U, x6 W0 k- M6 r+ j" B我根據他的說明修改他的程式變為如附件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 {' L& p( X( S3 n1 V+ d1 A# k8 G

+ }+ v7 D; }( e0 x' f3 x??? Undefined command/function 'AD10'.
# C9 h+ K( k% Q+ C0 j3 @6 i; X* h; E5 c+ l
Error in ==> spectra2 at 43  m( j5 {, t$ e% V- _; Q
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
/ Q6 A* f2 h9 A; `  l. D, \, O# f( e: u
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????4 t& ^* @: R9 o) C: f# m$ C
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式" ~6 \2 u5 f6 Z5 {. e
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
* S3 _  B+ {! v6 d故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
. y' o2 H1 l1 S5 K: Z
" @# T+ w# O) U6 ?: e在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧# p1 y4 f1 ]% D! p  ^8 i
' z: h% z  i( u+ e' _3 Q" d9 J
我看不到你的附件檔,故而實在無法作出評論! A* K( G& A' a( u
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??% q4 i" \6 A/ }& [6 C  ~) `4 U
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
1 X! Z( q/ k3 l' M所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
  l0 q9 [6 o' }8 Q3 _8 ?" L4 v指令的寫法是否為:
! O: @% s- [4 C. y2 Q2 E0 ~. r3 D! X' @8 z' _# U- g
.MEAS TRAN DIGOUT
+ Z) e. O0 [! Y1 S+TRIG  V (Dout)  VAL=0        RISE=2" J  m4 X& P7 J; S& D9 T6 ?5 a
+TARG V (Dout)  VAL=3.2m  RISE=2
, i4 f" @# m  t1 ^- F. U" o) d1 Q! j6 W3 Q" R
∼還請指教,謝謝∼
1 |9 Q) t+ D9 R# S
2 ?- t9 O% M5 c另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:  _3 K8 R% e' t9 B* S

0 w) @: s! g0 Ddigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
8 j; [2 w' f8 |3 a' ?8 {* a, X
. E2 p( }. b8 i, S0 j6 ^Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?/ K2 N: S8 x  u$ g

) V/ z" \7 ~8 D! m% R8 g4 F2 K/ A[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
% P% B7 l2 e! _- M+ b9 n: P* H故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
4 `2 o) j$ l' r( {所以,請再檢查一下你的HSPICE檔案吧
9 ^8 v. S3 G2 h
; D. ?8 @+ [9 e' ?再來,你的.measure指令用法沒有問題
! |$ p( j, M& Q但,你的取樣點及時間似乎不對
$ U9 ]% ]" W$ z你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:5 U2 Q2 B. b2 T& `4 k
.MEAS TRAN DIGOUT
. A3 q! X) g2 y, {+TRIG  V (Dout)  VAL=0        RISE=2
% Z# }& F$ F8 i' d/ P+TARG V (Dout)  VAL=3.2m      RISE=2
8 f3 y" f. {9 H/ l寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話( j8 i  ~" }' z4 K3 t2 V
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
& s9 `: Z! d$ y7 r/ b另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
9 e& v, _7 M( W再者,如果是用.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程式。8 W. p$ M6 V* \5 c7 b( M6 S+ v

, Y9 Q3 ]* b) q+ D( I∼感激不盡∼
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
7 ^; `' V- j% `! z& M) [- c9 D3 }) X8 A, P4 X" H8 S& m
, H& L( T4 A4 a  ]7 p.MEAS TRAN DIGOUT
- D: \4 O9 v% F+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f4 \6 P0 `0 i7 M4 k* r6 o4 V8 Z
+TARG V (Dout)  VAL=0.976E-7               RISE=1! v2 g; A2 _2 i
. n7 h3 [3 l# C/ A0 n
∼還請指教∼
. l# o& M' c8 U8 ~' x# ?! ]3 e1 Z9 ~程式重試的結果,*.mt0檔案只出現:- x' K. n% {6 T9 U2 O4 z+ c3 P
digout           temper           alter#            7 X* P, \0 @5 d. ~: M! G
1.890e-12        25.0000           1.0000         - m- [5 L# v* t7 [+ [+ d
不知是否還需修改?5 B* _6 Y9 V! R
. h2 A7 v5 s7 V! k  F0 ?
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題1 `$ E3 \. x. m; V  H: u8 K1 B
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
' Z5 X; q( J3 @# S- A" w, N$ K所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
9 h) ]# J; N2 @" ~5 A: @
6 J( H% K) v; b1 V% f再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
0 d( y+ a+ ?3 r  M但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock# `. b! p7 Z. Y
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)$ M( D  x  }! o; H2 r6 L
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???# @9 j7 X+ L( M3 f( R
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
$ y& h- H1 v6 D# C; a; b.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
( j# N6 k- t% G; c% q. L. ]* J' Q0 E.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
1 V, Z' x4 b5 v3 Z.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us' }# X# s2 l6 z5 q8 y' b! B
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us, c4 Z" h/ I8 u8 e& }3 r7 _
- J( o5 {% m9 q' U9 P5 R# L  @3 g
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
/ L$ b& j( t, Z5 O+ L+ M$ U.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
7 n' H: W9 ^2 L- P" O.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
. M$ l+ _/ f' U.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us' m: M; k5 N4 }4 h6 I! K0 K

0 {2 Q& Z$ C8 ~7 l1 e; `% n我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code& x* A: X* K2 T
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
; g" t1 |8 M" p! m" Z% m$ F9 S% {8 Q2 q, l2 G9 g5 v/ a
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
. C5 u  o! v' {; h可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
& c7 e! W" U4 W& U我大概講一下我的架構:
1 v& K1 o( v+ N1 W8 y8 Y我電路是使用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的指令寫出,指令如下:
& w6 z3 k! D8 g& `1 h( ~) ~0 LFor Fs=10.24MHz:
; Y) y/ T2 L$ pV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
& g0 P- F5 n8 GV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
" M8 {8 D3 l& Z. D) `For Fs=5.12MHz
. D' P, }- f0 N1 xV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
' X- m# Q7 ?. Z6 \$ lV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
3 d. J1 S" f7 L- h另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。$ I5 b6 R0 t6 W. V9 x
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:9 S+ O" ^& b7 q* Q  `% M% s, a
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us1 t# y$ A  c& U! l
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us6 Y/ `) ?4 \% x& f( K" V% V
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
: |# H) h' X$ \# x+ l/ G  F4 @你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
/ n- r2 a+ }& l7 ]. b8 q* ^
/ q) \0 w. c* q+ f/ _[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
+ O+ g3 Z7 H7 h/ H  ^1 r; ^: Q; f首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來+ H0 ]1 j6 `) g2 R# l- {7 G. b* c
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
- C4 ]/ o/ ?2 V" z3 F) X( Z4 O5 `/ \* {2 V" \  u8 a2 C
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
' R- h9 q0 u" O/ ^. m. R' _  D2 l9 ^) ~; @) X1 `. M
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要/ b( q0 F) _" }! S. ~5 D% {

. ?) l6 B% g- W$ x1 D7 D6 ]4 ?clear all
* E- ^7 c) |/ D" Y9 r# _fid=fopen('dual_measure_rms.txt','w')) `( Z1 H' y/ v( D* g( P
for M=1:1:1024
, Z% a4 }7 N: \5 U       T=M-1;: d1 o/ v* T6 k! i
       from=(50*T)+45; %DUAL DAC measure time5 @$ t" M/ {, Q9 ?4 h
       to=50+(50*T);
) h" H: N% L2 L5 w       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);0 l# l+ x0 [& s: Z# Q
end
; s# F3 S5 R5 ^MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
7 u* d4 H3 {* B' i1 w這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
; k! }, ~# }2 t1 T這樣以後模擬FFT就非常方便了
2 e' ], X1 W. Y; M看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
8 T1 z9 I5 ?! e: H' H然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧2 q% s% K" z3 o; Z: u
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?6 w- H1 g2 a) T0 u
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
, `, }" k4 V- Z' i" o: W- I8 D" O% m; A因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。. L* L: O* i* f
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
/ o: ]  h' e  a% ]# H9 c另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
# _7 n6 a& l# H依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:7 c6 Q& j/ r1 t* v! b
clear all7 @1 g. l. D  a6 ~& |
fid=fopen('sdm_out.txt','w')  Y$ y( ]4 W% a0 e% }( z
for M=1:1:1024- H9 d5 H1 V2 E& {/ I/ H" r% [* l
    T=M-1;
% E! P3 ]/ O, W, n( h9 B) k    AT=(0.1952*T)+1.026; %SDM measure time
& f* ^0 Q& B* }# _' |    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
( f; h3 \! b: u. ?* V1 q6 |end0 D* y) H  S4 i  s
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
, f! N- y2 a" Q9 X: m0 P/ X想再請問的是:& X' C" d( C" t! V( D, M
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:/ W8 E8 v0 }. X) o5 [+ U+ n
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
/ i  c* _/ d: h+ {6 O然後就可算出SNDR及SNR以及畫出圖形了嗎?# \& d( B; X2 v- V5 n
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-16 09:24 PM , Processed in 0.136517 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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