Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 97653|回復: 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 O' V  {/ H" {
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,! {$ R9 ?) z; e. g! P& }( K) s
要使用這個toolbox時,在hspice的.option中不能使用post=2.1 Q. z; z* Y, ?% g' L- P
可以用
7 U" {4 f/ X) V: \.option post
6 O9 h8 l6 U+ z7 y  D或是9 x) m0 M0 R" Z7 A" ]
.option post=1
! D. p3 ^) M/ ~3 O8 o但絶不能用
, e2 h" u, t6 M4 O* [.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:+ B* x+ N0 E+ {* }
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。5 @3 ?. r/ \- A2 l
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。* A$ I1 a. m: i+ M
# d; W" h# P4 h1 d# \8 c1 H
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
6 W# `7 T' W0 ]5 y# K5 y就是直接用.print指令把你要量的電壓印出來
7 f/ v) ~( C0 Y; S. g然後再用手動把印出來的資料copy起來
- c8 h1 g8 w5 d6 f* i# D然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。; D  P; {' D3 ~. T/ {/ h
3 J3 P; P$ G& V. H: X
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
3 S/ f0 o: m; I1 e- m8 Y) u+ n所以  只要將FFT後的資料  做一些轉換就可以唷!!  U% J( Y+ u- g4 n" J
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
* P) V: L8 I6 b$ D, G就可以換算  SNDR 了!!
3 g* R' @8 a. \' n" ]. m8 n8 p* HSNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
8 \  j+ H* W9 Z/ C6 W我想,應該可以給你一些參考吧
  b% N6 J1 P) Z* X4 t8 v1 U
5 C) v" t. ]3 Z% --------------Using minimum 4-term Blackman-harris Windows -------------* j) O3 t% c2 M
nb=1:1ts;
( f! L! _" q- U' T+ b( n$ Xkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
& L2 W! w% A5 X' D6 Hwin_gain=sum(kb)/pts;
$ r+ G6 G. M# }" Lkb=kb/win_gain;
! `# v8 f' s$ `
' |; m# O: ^1 ~8 B  ^* x% --------------- Calculated fft --------------------------* q9 t& D5 E3 z
yb=kb.*x(ptsttfi);
7 m6 [) {2 F; x' Ayk=fft(yb);6 R; g( a/ u4 T/ Y/ J0 W4 w& \
fft_no=length(yk);
$ m. @* {4 s$ T3 q/ n$ p9 Df=fs*(0:fft_no-1)/fft_no;
3 x1 U9 n$ W) b; {+ G6 BPyy=yk.*conj(yk)/((fft_no/2)^2);
4 R7 O# o9 [# j. \9 ?7 l, P$ \
% ---------- Calculate THD ----------------------------
& E2 `' K* K( w5 h* mj=1;4 D3 e1 N) t- A
for i=1:1fft_no/2)( y. ^, {) j; U6 E4 I
    if (f(i) == (fi*j))
- b% F  }3 o$ J( p- }        HD(j)=Pyy(i);     %% find all harmonic distortion components
  I* b+ D0 R! B. t# z        j=j+1;! x: b+ [0 U9 y* c! a" Z8 O
    end% |( R. y$ k  d4 E7 O; Z" T+ W9 e
end( v9 P4 a) |4 z& z  y( V0 p  P
P_hd=sum(HD(2:9));
% V  o! `- D) f, TTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal9 h. N* ?% E& |+ k- Q% t7 v0 T
fprintf('THD = %g dB\n',THD);6 f( v3 w0 b2 o& \3 x: X

1 G/ [$ P' I3 {+ l( j% g% ---------- Calculate SNR ----------------------------4 c# D$ y. n( ^# b
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
9 H/ [/ r+ F3 {+ q3 ofundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);% @! p- X- K  M" g7 E# M
span=max(round(fft_no/200),5);  W: j2 V- z3 q9 L
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));2 j4 Y4 T( |6 F& X  M# [3 Z
0 S' H  b1 T: b# k& o# X( n( v
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
6 ^6 v6 W3 m' ?4 w9 sSNR1=10*log10(P_sig/P_noise1);; I7 k. X6 O- s/ H- @9 t) `
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:) c1 G' c9 X) u/ O% J
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
0 s4 @0 _" v: x$ U( e1 O  T4 z/ }6 u
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:1 v+ G9 B5 J. i$ K/ m6 k
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
2 K1 b3 y  |1 A9 V內容為:7 v' |# a: @3 d
压缩文件共有三个文件:两个m文件和一个txt文件5 O4 F* M: b! ?
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
$ M7 X  i- V; z+ \1 A% v8 l希望大家喜欢!! # }, p6 P1 V& S1 b7 U( [
附件為:FFT.rar: |3 _4 z" Y, G$ j; K, E. G0 L# L
0 k% k) O& q. X& }
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
6 ?$ t6 `3 S; g' o0 U# p( C. c- l% F& W
??? Undefined command/function 'AD10'.
2 j) E8 |; l; T& n( Z+ X  ~: _6 W! w) }& r* h+ Z1 w
Error in ==> spectra2 at 43
& U/ L) j% @% P2 ld0=round(AD10(start:stepstart+M*step-step),3)/1.8);
0 d: g+ o  L, B7 M4 j0 Y* j
9 g: k$ F$ E" K) q* x; |# ^* T由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9 Q9 M" i( A: w. Q) a8 W4 S- E5 ?9 ?6 c
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 7 F! g( p9 Y& @! l" p& Q; }6 K& _
7 S; Y8 d8 ]* F0 u/ e
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
9 a4 f& ^* s3 d/ m! |$ Q請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
2 |% S7 \+ R) Q1 A5 ?) R" M另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:. Q1 p. T/ c8 x8 [. i9 l, U/ J
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
8 i6 m  D, q+ y. {- l2 _' X3 F內容為:
; m& b; v& \' ^9 n2 W3 A压缩文件共有三个文件:两个m文件和一个txt文件% O9 C+ Q% ^0 U7 `) j4 P3 C. {
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
+ ]7 e/ \, W) n5 G希望大家喜欢!!
1 g8 c! V. B/ w' g; d; l+ T+ s+ n附件為:FFT.rar
  F9 S( }2 \* B/ I; v. X) }$ a1 O( X # V# n2 U5 G, _0 C$ {
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:7 B! C( b* C2 }
) {+ O. R  G' P! u
??? Undefined command/function 'AD10'./ C& {+ n3 d7 _' D: r9 h8 Q5 |
. S9 z) E, s% ]' _7 x! K$ T
Error in ==> spectra2 at 43( f! y( y' A7 R: G
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);2 C6 _% g% k3 |

) `$ J% G- e. }7 K5 \/ C. W由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
# I9 C8 S9 i6 b" s2 Z附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式  J$ B" c( I! h: ?4 W% `
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值8 ~6 X4 K! e9 o* i
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
" q. ]4 v7 i3 W- X3 R" a- u
" F$ g0 ]7 }/ ]9 ~0 E在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
0 k3 ?4 P: F; K& o' D
+ r8 ?) F$ S# m3 i% t2 \6 Q  H我看不到你的附件檔,故而實在無法作出評論$ I0 X* b2 j" }5 l6 J( y
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??, e6 C  f) h+ l6 n1 t# P& T- \  [
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
# ^0 O# T6 X' G1 M5 Q) Q所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,6 s6 P# `; o9 r0 _
指令的寫法是否為:5 O! a7 u( ~% b5 H  e

9 h6 ^3 z8 C$ `' Q- L  G.MEAS TRAN DIGOUT
9 j: R4 E3 j/ i, a5 g4 L+TRIG  V (Dout)  VAL=0        RISE=2
; L) R, T. ?' m( r& z+TARG V (Dout)  VAL=3.2m  RISE=2
: Y2 D, ^- S4 `* I
  \1 h( B" M* n: z∼還請指教,謝謝∼
: {* w- X9 @5 h; v. z. _/ g1 s: |" j# J9 M. {5 j, a( [
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:: |6 q1 M" N; v$ ]% `8 V) v& O7 O* E

0 z# k4 f% ?% ]( ~7 R4 adigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07
2 o# J/ }4 T! r
8 b1 [3 T5 _$ @/ O# ]7 ^Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
4 Z  N/ R; B( u( p5 s
9 j0 |; W" n) y& w$ K8 g& g1 o[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔, Z5 h0 p7 H  T! B  U% ?
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料! I  V; n7 E5 i$ y) L/ P* F' c
所以,請再檢查一下你的HSPICE檔案吧$ A- r& x: P0 X2 g0 b1 x( E

4 h  z3 L* W3 V, T再來,你的.measure指令用法沒有問題
) X' W) t* K6 p# u但,你的取樣點及時間似乎不對
7 s3 \! R8 D  \9 W% U你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:9 f! e5 \! Z7 S3 `- M  l
.MEAS TRAN DIGOUT  c- k5 d' n4 [2 q
+TRIG  V (Dout)  VAL=0        RISE=2
" f( Y1 Z6 e7 ~" ^% B$ `0 h/ q+TARG V (Dout)  VAL=3.2m      RISE=21 c  R6 K7 L, ~6 b% u2 k# Q' k
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話+ ^: h2 M8 x1 V; e5 k- x4 T
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
& @) S$ Q1 f7 n另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=27 U& S, ?! l& ]
再者,如果是用.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程式。
4 F+ p2 L2 f' b& I" G5 w2 M
  Z4 _* U8 ^7 t& X∼感激不盡∼
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# j2 I; A+ W; Y$ Q" `2 X4 e/ {
3 }) X8 A, P4 X" H8 S& m* T: p* ]- o! v& R
.MEAS TRAN DIGOUT
2 d! n1 s" H( f+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
8 @9 t- |! ?. c0 X3 n+TARG V (Dout)  VAL=0.976E-7               RISE=1  V% S+ F0 X: y7 G+ v" ^' N
, c0 W8 I# n6 w: i* I% S
∼還請指教∼
! d7 i' O7 S( W程式重試的結果,*.mt0檔案只出現:& X" Z* Q, U1 S( Z
digout           temper           alter#            ' k' W3 O' M& P+ x- O
1.890e-12        25.0000           1.0000         
; `' Z0 M3 H6 E/ V1 P7 G不知是否還需修改?
& c3 K- |& x( t- M/ N6 _
# n" i5 U+ T2 K; e[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
9 b. o4 L4 f5 T你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
0 c1 |0 q: a7 p/ b7 V所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
# }0 a. w: a: S/ f$ K/ F1 F9 R
9 G: Q$ \1 B, H- y  T* Y2 w再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
/ D4 K! S/ ^0 @. E) V但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
/ F! k' G5 a9 |, W* N一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
: a; q* t. l  v: X8 L6 N) t再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???- w  p) E. r9 o1 `& Y; H! X( Y7 n2 z3 ^
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為- W2 W, `2 S! B/ C' K& u' f
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us8 j2 ]0 @0 I: x- [- M  Q' \
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
) Q. n6 Y1 x7 H.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us2 i6 [" J' W) y  V1 o" e3 y
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
) s4 ^. r: [5 e* _- g  v* B( _4 N8 q4 R5 S2 R1 X/ F4 c
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
# a) |3 O% q% p* N.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
7 H. n2 V; S7 r.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
1 E' W8 P; |0 y! Z9 }9 a! A: Q.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
& S! z9 }3 V8 `: U2 M/ H$ J: ]+ h/ u9 N/ P" k
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code% C* F# _/ q- ]1 |, _9 a
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法1 N+ g6 R3 z; Y+ w3 k/ ~9 u
! a, O5 }: j+ A3 f  t% c$ l
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
6 r; a0 x  Y/ o& P, W可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。  D! _" L& o7 h# y: P$ ]; Y4 k% v+ B
我大概講一下我的架構:
. u1 K: G+ p& o' o1 m& ?$ I我電路是使用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的指令寫出,指令如下:
3 Y* j' I" B8 e! `- o8 D2 }For Fs=10.24MHz:! Z! T" |6 h9 j; q- c
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7: L! g1 N" W3 ^  J$ N, U- z4 L7 l
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7- f3 i5 H. q# p5 x+ \8 p+ d
For Fs=5.12MHz
4 H4 F- b1 b( s( D& `, v" JV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
6 i* g9 Y" L4 \% |. iV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7) u2 T+ Q) I* P4 {
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
, r/ ]/ G/ o2 l/ |  p& u如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
1 I0 V1 _5 U9 l! \+ X0 k.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us! A6 {* a5 Q/ p6 E1 ~4 O
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us: V* J  j5 Y( d# v" `; k- H; E# ^; r
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?6 y+ P5 x) Z( s# J
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
0 d; U8 p8 i+ B2 `8 p& T' q
/ I, C  K" h8 A% l( p) k: d/ M( G8 e[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
0 s- e# W$ H6 ]# h1 s. C; p首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
$ g  [) ?6 |# F4 L; T而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?7 ^: ^2 |- V5 p. X

" ^4 C8 T6 a4 y8 a再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪2 g: ^, |2 ~3 @0 e+ t+ e
" j" d  W% E! o5 U* D7 ^
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
! D4 H* ]9 ~  d& [' q, U: A3 S% d8 {5 D$ d; g; y3 F
clear all
% g/ G; x9 m& t" {+ A% Dfid=fopen('dual_measure_rms.txt','w')8 Z6 T) p3 a$ Q8 E
for M=1:1:1024
. ^# ]; {9 V# B6 W* w       T=M-1;
+ I! A; ~8 \% E4 f! ^       from=(50*T)+45; %DUAL DAC measure time
9 z0 I* y# F- ^, j2 j$ s       to=50+(50*T);
* Y' \3 k0 D# W8 J) p, A+ T       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
9 Q/ F$ ~! W7 w7 D1 Qend* z: K* j( Y( N3 @! W
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
0 d1 g* k) y8 c0 Z這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
6 P3 S9 i; o6 e; X' @% j' |這樣以後模擬FFT就非常方便了
% A, l  U) E! {6 C. K- D3 M7 X看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間; ~$ \  |/ s9 Y
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
: n! p# q: ]1 x' L1 ?只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?+ u( j4 l0 F) e
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:. u/ O3 X/ R  ?' b
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。  m& \1 d  w' ?$ v
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
% ~* m7 U: M- R另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
" t  R$ u; n" n' K. o依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:9 ]- F) s4 ?" _# a7 h9 h# D
clear all
: l+ R* v' I' s% S( }+ `& P5 Mfid=fopen('sdm_out.txt','w')
. j2 W# i6 p9 [for M=1:1:1024: C, `, l+ P# C, Z) F
    T=M-1;
; w0 T8 {; ?' D2 r5 B$ y9 E1 O3 k* ?    AT=(0.1952*T)+1.026; %SDM measure time  @. I8 q. T* S9 T1 M
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
& F( {. x& @, o, h7 O6 `0 g1 rend7 |' X; x# P* K1 v3 x2 f! q* Y
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。# K1 V9 T7 l  t; z$ H: J0 \
想再請問的是:+ [3 b: n! Y4 K1 Y6 M3 H3 E
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:+ F2 s* t$ ]' f& \
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
& K) m+ ~! G  X然後就可算出SNDR及SNR以及畫出圖形了嗎?2 b, F: v% u. E2 o* h
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-12-27 11:34 AM , Processed in 0.209012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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