Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
; m" ]' Z. M. Y( f& I6 |就是直接用.print指令把你要量的電壓印出來
% y- V! D2 y! u: Z; m3 ~+ d0 V# n然後再用手動把印出來的資料copy起來
3 M- N8 [0 a5 H: I# Z然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。8 y  x2 p5 u9 o) t0 @" x! H
  i# h; O, d: r+ C. E1 n, G1 u, a
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
# h3 o+ S* Y# O9 {1 ~8 c2 ?' W0 {所以  只要將FFT後的資料  做一些轉換就可以唷!!
. j7 N2 {4 a' ?將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
# q6 W7 R7 ^/ I5 t3 n$ [就可以換算  SNDR 了!!9 v% O: d7 ^& Z+ l
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部份程式
! C  o5 j0 |- H6 j: `& ^7 e7 s我想,應該可以給你一些參考吧+ _! L! y) _3 ?, N- |6 J$ ~

$ O2 z- ]/ k  K. Y0 h* L% --------------Using minimum 4-term Blackman-harris Windows -------------
9 B( x1 J0 C2 V  t$ cnb=1:1ts;7 ]0 m2 d' ]) y: G
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));' k* J$ X) A1 o: I/ [( v# m
win_gain=sum(kb)/pts;3 U1 {% u) I' {: z
kb=kb/win_gain;9 k5 q: u" E8 \7 L5 Q3 V/ C0 s! ]
* Y& G# m6 r8 M9 M% q
% --------------- Calculated fft --------------------------
  G' l$ s1 |$ D6 n2 Gyb=kb.*x(ptsttfi);8 Y3 j8 r+ m$ y2 @' _3 L2 t
yk=fft(yb);$ @  V4 Y. I. [5 A: j. i! w
fft_no=length(yk);
, f; n. Y/ Z4 P+ g) yf=fs*(0:fft_no-1)/fft_no;
6 g. {: B  {; |9 j3 E' B7 ]Pyy=yk.*conj(yk)/((fft_no/2)^2);$ p: N( v: u- w2 X& w

* K  _. Z" I8 E' y% ---------- Calculate THD ----------------------------
4 q) u! w: K* X! m* H8 _j=1;9 \5 k4 Q. n. f
for i=1:1fft_no/2)/ n, {/ w% k; G2 @# p% R( i
    if (f(i) == (fi*j))
& ~* n. B2 V7 m& T        HD(j)=Pyy(i);     %% find all harmonic distortion components! E$ f1 c4 e9 d% o
        j=j+1;+ R& e7 ?8 A( F% X' X2 D0 Q
    end) }! W- e8 k0 b* O( S+ a
end. ?" ~8 B# J: ~6 r
P_hd=sum(HD(2:9));
% Z5 k3 K4 B6 s+ }THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
2 ~  k- n' C0 Q$ p0 K2 d" i2 |fprintf('THD = %g dB\n',THD);8 L3 g+ Z( Q' B! A! g7 @- N
/ S- m: y$ k' [7 g6 X; D
% ---------- Calculate SNR ----------------------------
. Z/ M  x! E( i0 N6 f, i. ]0 Nfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
$ T8 h2 ~. V  D& k6 Ifundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);* ~/ c% ^% h4 |+ h' M7 r
span=max(round(fft_no/200),5);
! B5 z9 X* ?- f% ]# Q# eP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));/ f; k7 N" K, G# ^

, I% `$ T+ @  r( b1 ?* hP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;* h% q( ~2 l; J
SNR1=10*log10(P_sig/P_noise1);4 V6 U2 r- u4 Z; e6 }6 G' s
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
4 y2 x/ {( [; j, F- d: D6 W8 j' P請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。; M* T! j; K0 P* |

$ v: T# Z2 \/ Q% T3 h另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
) B( w' c' ]  f. @& z"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
% @/ j  ]5 k' S" K- B+ v6 m內容為:
1 w$ K" ^9 j" V9 Y& q- R压缩文件共有三个文件:两个m文件和一个txt文件+ @/ L/ W8 s/ c+ X: \1 x  ^; f
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
" O7 k. O0 K2 r  a希望大家喜欢!! ( R5 g/ u) N9 A! h! \  G
附件為:FFT.rar
2 p6 \# K+ }' {1 \1 ?/ t: ~
% @$ N* Q, e1 _+ q+ ]3 Q) V我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:& _2 B3 v' G0 r! @0 l+ Y( x
  U( j5 J; E- _/ h
??? Undefined command/function 'AD10'.
, W* u  Z# ~  l  o# u- N* c( {
+ L/ J; T5 d) k! \7 `2 T1 ZError in ==> spectra2 at 43
  F! ^" f* z: W: }' P# Pd0=round(AD10(start:stepstart+M*step-step),3)/1.8);( I0 ?1 B7 W7 K& m) f) @

* U  D  D0 w4 W3 f4 O$ Q由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!/ ]' H! I1 H$ m) ]* y( a
  w- d) F/ j, Y" o' ^
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? % l) `, ~: m5 Z

9 X- v, ~" ~: q! \) R3 y[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
* G8 G! e% f7 `, d& J9 {請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 7 l5 c! {' w2 u0 U5 `
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:$ d7 L* a' U. |2 \
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
3 |# d6 ?. p9 y5 o內容為:+ y8 @- q6 N5 F( U$ b
压缩文件共有三个文件:两个m文件和一个txt文件
( e3 f% I6 V: E* `# Jspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
5 g6 c0 P1 B: x希望大家喜欢!!   y8 s4 f: {; H) P
附件為:FFT.rar
; C- f# t/ n2 g1 d$ |- W* m- n / c1 S* ^+ @. p( d; m5 X- ~, U0 f
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
% x1 _: n4 q7 Q; G; T
  B% {, j4 j  t! U$ {. J+ r6 V??? Undefined command/function 'AD10'.6 f5 d% W6 h! a! H9 ?0 ?! e

3 N9 S0 @) q1 T8 [; u$ RError in ==> spectra2 at 43+ G5 F# W" h- z% q# A9 t3 y
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
& x& R4 u7 P! r. F5 i  p& S, ?' X
0 N; @9 H4 Z" Z$ S. h/ _& ?8 I由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????+ L. d+ ?: ]% W' d+ J; W
附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
/ O! m, K. b+ z1 v8 z$ N要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值; R4 \# v+ |/ P4 s# H! H
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算: B/ D$ ^/ Y+ w" r9 U5 M

- s1 j- e* I+ x在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧% o$ B. u$ c% _- N; l  Z# m
! u: `8 y( Y2 i( U' k; v1 y* X. s
我看不到你的附件檔,故而實在無法作出評論
0 M6 x/ M( [  A* i  l& }9 [2 {- Q6 L而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??% b0 C! S% y/ A& O% L) q8 M# c
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
- s% L& C7 k# ~所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
9 m8 v# P* q8 b. {; b指令的寫法是否為:
: [* D7 k; O% V. z* G8 N2 D9 t$ p8 r+ q
.MEAS TRAN DIGOUT4 s& e- Y( J5 I6 y
+TRIG  V (Dout)  VAL=0        RISE=26 D. }9 `$ v  |+ U3 p
+TARG V (Dout)  VAL=3.2m  RISE=2$ y5 I' r. z  K2 F  L2 i

6 K6 E9 r- u0 D9 ~$ F0 y, U- a6 E) L∼還請指教,謝謝∼
  t5 ^) g8 Y2 \& h) d5 U9 H$ B7 p1 o$ f
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
! N; [9 `) }% E. A2 Z5 d/ i
  N, d, _& W( Rdigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
$ j! c7 ?! [4 c; B/ f* ]# {, D8 p+ }- l( S
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?& w& j  s; N! h) {7 o. i) {
0 v4 s3 t, |" Z
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔7 [5 e( O5 X/ h/ X& ^
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料# l. M  P( i$ [8 w9 O
所以,請再檢查一下你的HSPICE檔案吧
* A6 Y( X6 f. S& D& v9 U& e! l  h; g: b) w8 g$ K* A0 Q: R7 @+ Q
再來,你的.measure指令用法沒有問題4 @; q- u4 U" _8 ~2 h+ x
但,你的取樣點及時間似乎不對
+ O( i# p* I) f+ S你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:* x  T& ^5 r3 h' e
.MEAS TRAN DIGOUT4 b. U: F! g" W- @1 O5 `+ C$ i- A
+TRIG  V (Dout)  VAL=0        RISE=2
, B7 z& [) o8 D4 t+TARG V (Dout)  VAL=3.2m      RISE=2
& h& m" Q5 f; s& Y2 C; h! U' s5 K寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話; Q$ t, G7 v( l. M2 p" K  v
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
- O, o2 z# n+ W- _+ W/ c另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
$ J1 K8 R9 X4 ^  [4 v/ e/ k再者,如果是用.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程式。, S& m8 ?& r; ^% ?0 h+ V# F. r

0 g$ Y8 d2 e) w+ Y9 }/ z3 p∼感激不盡∼
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
6 Y) l$ j4 f# S3 j3 }) X8 A, P4 X" H8 S& m2 t. {; {( P: J+ t
.MEAS TRAN DIGOUT3 a: J* I: W# o! P9 Q
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f0 Q- z' S* v" |  s3 F/ L
+TARG V (Dout)  VAL=0.976E-7               RISE=19 ~  D( P' a1 u% K

8 b& R6 x& g7 q. }  J& w# ~+ g4 [$ v6 |∼還請指教∼: f0 e+ A% \" e5 J9 r8 x& S
程式重試的結果,*.mt0檔案只出現:; R+ g. k; S8 r9 y
digout           temper           alter#            . t$ W9 q: S. W9 s4 ~) u, F4 _
1.890e-12        25.0000           1.0000         
7 v/ S, f# u4 D不知是否還需修改?
; g; ?. E9 c3 h7 q- E, l
# q& Y& J: M& p" ]: g[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
/ f, y3 g* o- y* i) d# W2 B你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
# z- x1 e& ?; D: m+ |* q所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧6 x7 z# p/ E+ x- o0 Y
2 Y! n6 ?: z2 M4 f% P. D' C
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
( z6 p" ]- i' ^* T+ L) J" e0 ^但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
* r2 J; X* u6 t一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
- a9 x& D# @0 F5 r3 e再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???0 y3 A: e. H( {. ?! V! ^7 C
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為- U% {# l7 K6 R& a7 r
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
4 b* q- g/ n, C' l: Z! M.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
6 ]5 B% p# O6 i" t, P9 G3 K.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
, G1 R' |" m  K9 W4 X4 @" a/ v.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us* v/ l# Q6 o5 X2 }( Z

. ~. b7 L1 K# G.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us  h/ ~8 i) j. h, c1 w' D$ i0 C: `
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
5 m* _4 Q* p, Y# x( o.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
. t( ^3 F- M$ C9 C4 h$ z: F, |.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
! _# j7 t! T1 t) v3 I  J6 }# V+ Q/ d1 H$ x* h& E. E
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
; q/ f& Q: Z& {我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
( D. w7 W1 _. F" T5 n, f
) H0 Z) i8 V6 W最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
5 u6 M  N4 H" H* ^+ t+ L+ O可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。; E, A8 S3 X  r( d5 C
我大概講一下我的架構:# q! U0 W! P- P) z+ V7 B) x
我電路是使用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的指令寫出,指令如下:
5 \$ G( ]0 ~" R& eFor Fs=10.24MHz:
5 C4 [; Q: o' L3 c& l3 eV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-76 A- d4 b+ G! w1 L; N& C3 H
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7* Q# i2 `/ X1 Q" z2 B$ Y7 N+ Q/ z
For Fs=5.12MHz - W7 a& W8 \7 y4 A% G2 o
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7% X& @6 G2 b  _
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-79 v- b3 R8 S: o- c  [* I
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。0 t+ d  }3 a4 w6 ^; i- ^9 u
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
- o# e5 `6 ^! ]3 C. ]+ D3 o% a.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us" J- L* H+ c* _8 \% U
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
0 l0 W* t- l: W8 n% N( z然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?1 {# `9 n5 g0 J# \2 J
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!8 U3 D8 ?7 P: R1 I7 k
" X" d! T8 w# }2 \
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
, d. E# b% Q$ J; K首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來" g) _1 G/ w) e) w
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?$ w9 S- t0 v, G5 T' X

% q& v5 B/ u* Q* z7 N再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪8 B# H. \$ a  c

% h; u; u, Q, i8 uFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
4 K$ w4 s& f5 \  Y% w% x- e+ [. L6 q
clear all
2 H! w! L4 K3 n0 d- S. ?fid=fopen('dual_measure_rms.txt','w')
) m! V3 K( l5 n& P7 r! H) qfor M=1:1:10242 a9 c! ~6 S9 ^; D
       T=M-1;7 e1 D" _0 l* ]7 y7 o
       from=(50*T)+45; %DUAL DAC measure time
. K5 r- [: r; J* O* m; X3 l4 @: ~" v       to=50+(50*T);0 e& h7 ~4 _, l- t& L
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);- J  \  o9 }( R" f
end
+ D/ R+ }7 J5 w+ [8 ~& v% eMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
( j# A5 y0 e9 L  y這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
: W( C+ z4 }% r; X這樣以後模擬FFT就非常方便了
+ m3 y- y+ i5 O1 y3 J看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
' l  l7 v+ `2 f3 k然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧6 y- c& S$ e# P; V
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?( `) [% a- D9 ]8 i
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:% R9 q* m( U' r! W, o9 {+ }6 e
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
+ K% u9 S( T6 D* r% x且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
) N/ f- C2 X# m& {( r另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
: z3 V& v: x4 G+ J依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:6 L* `+ }3 X# J8 ^, t# e& T
clear all
. N; t, R  e  C4 mfid=fopen('sdm_out.txt','w')- t' I7 g+ Z8 G' w- c* r( r
for M=1:1:1024$ Z7 [/ V+ |+ ^0 a( X
    T=M-1;
1 ?* g7 b1 @  i  [    AT=(0.1952*T)+1.026; %SDM measure time
; T) l& d  F3 o* Y) S% R, g4 B- F    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);, u* K- V* n$ R% f2 L1 ?
end
( e0 i# h+ `1 ^, ]% N試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。# }, D" X) u  p# `' x" e6 i' g( n
想再請問的是:
  E" i( X  G- T6 P2 T* o當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:8 D, [8 |5 J- S# N( R! y4 u
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM  ^2 Y. a* [0 X& `# h
然後就可算出SNDR及SNR以及畫出圖形了嗎?5 g+ `& n6 o" v8 V' x
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-14 01:50 PM , Processed in 0.140008 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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