Chip123 科技應用創新平台

標題: 如何將Hspice資料轉進MATLAB計算 [打印本頁]

作者: 緣緣    時間: 2007-10-4 10:57 PM
標題: 如何將Hspice資料轉進MATLAB計算
我現在在設計一個三角積分調變器(sigma delta modulator),電路完成後,我用Hspice做FFT(快速傅立葉轉換)求得SNDR(Signal to Noise plus distortion ratio),但我看其他論文秀出來的都是再經Matlab轉出來的圖形,請問,hspice要如何轉換成matlab畫出SNDR及DR(Dynamic Range)?包含方法及指令,愈詳細愈好。拜託有高手能相告。7 @4 A$ v9 }! I1 D" J4 D6 u0 `5 p' G
謝謝!
作者: monkeybad    時間: 2007-10-5 06:42 PM
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用, T/ h/ R8 y" y5 ]
就是直接用.print指令把你要量的電壓印出來: N! K& d- }8 ^8 _4 T
然後再用手動把印出來的資料copy起來2 h: n0 n$ a0 w% M+ j" t* Q- k
然後貼在Matlab程式上面 然後就可以做FFT了
作者: 緣緣    時間: 2007-10-5 09:39 PM
標題: 謝謝版主回復
謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。& x1 j. m' S8 E5 F5 S# d

1 c6 S; B; i% `$ {6 d謝謝!
作者: sjhor    時間: 2007-10-8 09:40 AM
Matlab 有 fft 的  program, 5 a; n; J1 w# y# v
所以  只要將FFT後的資料  做一些轉換就可以唷!!; N0 ?3 p" q) v: g6 a" _
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
9 t" v8 D5 _3 ?4 [/ n/ H4 A就可以換算  SNDR 了!!
  [: ^: k9 [% R; g- \SNDR is Signal to (Noise + THD) ratio?
作者: 緣緣    時間: 2007-10-11 05:44 PM
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
作者: finster    時間: 2007-10-13 08:20 AM
我以前作DAC的MATLAB部份程式
3 y: B4 c$ g5 j3 O! }! r我想,應該可以給你一些參考吧
1 R/ [8 h5 O# m- L. J; O
: C3 ]1 ^, @7 D3 O% --------------Using minimum 4-term Blackman-harris Windows -------------. m5 L  f! O2 B5 e0 R' n! O# N
nb=1:1ts;
" F& u& i# w3 P! D: S& S) pkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
& \& ?2 }3 D$ S* f9 l7 Q: rwin_gain=sum(kb)/pts;
; \: ?4 O; [3 Ckb=kb/win_gain;
" z0 D1 G/ }& l* V" u2 C  C, ^; Y( W' G, L5 A
% --------------- Calculated fft --------------------------
. l% u8 Y! K1 y- U7 K$ j+ f! t+ zyb=kb.*x(ptsttfi);
) B3 q$ M4 [* D: j: gyk=fft(yb);
/ l. M) f. Y7 V; \1 T' x- Nfft_no=length(yk);
& w! \* s% j- M7 [4 U# Kf=fs*(0:fft_no-1)/fft_no;: r' C) k) G4 r% b, {3 H/ }- d
Pyy=yk.*conj(yk)/((fft_no/2)^2);
* @* Y; B* L( h% f6 X5 o( H# x) ?- W3 e2 c
% ---------- Calculate THD ----------------------------, G+ g" A; u  t
j=1;6 h6 E/ H9 g' P* o/ c: q- f
for i=1:1fft_no/2)
+ n) v* P8 w: s+ H6 b3 h6 @1 R    if (f(i) == (fi*j))
' H: X( u9 t! E  l        HD(j)=Pyy(i);     %% find all harmonic distortion components
9 u- D) M: r; v' _        j=j+1;
" A* Z2 F* p* g    end
6 M4 F5 B' O6 ?- Iend
/ R7 E3 B: d2 J5 D( i! xP_hd=sum(HD(2:9));3 _9 [5 J, x5 F! }2 {
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
; A2 m& [8 b' {( ]- f7 Kfprintf('THD = %g dB\n',THD);. f4 ]; d3 Y" g6 M+ Y) f+ _7 @+ C

' p0 ]/ V0 f: K0 S$ i7 O% ---------- Calculate SNR ----------------------------2 M& Q/ Y( D2 c  D6 J0 F" W
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));8 M6 r+ _, C# |" P$ w
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);2 o9 c' F2 X& I/ Z$ x: O
span=max(round(fft_no/200),5);
3 p% D7 O: n6 z% F) W" a: O' K  oP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));5 t0 Y& C: S' u) O

3 B/ A8 `6 @2 y7 i6 w! ?+ B3 Q3 m4 uP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
$ N" ^4 g: B. l. J1 u! kSNR1=10*log10(P_sig/P_noise1);  I1 L2 c! }, x  j7 b# T+ u
fprintf('SNR = %g dB\n',SNR1);
作者: 緣緣    時間: 2007-10-15 07:34 PM
標題: 謝謝副版主回復
謝謝finster副版主回復,想再請問一下:
8 l3 I" k( g# y0 z+ D' `' U5 B2 A1 k請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。4 i2 L' X/ O) W  _$ v7 E

( |7 Y$ x6 P6 O" A/ |另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
; b. @; }  K. K"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
8 Z' E1 w- x9 m: ?0 T& S: M1 f內容為:
: M0 _5 ?0 m1 |% l& h4 r压缩文件共有三个文件:两个m文件和一个txt文件6 v9 U! ?" e4 a/ P0 O: R
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。! _0 x% i: Y0 h* X& ~; X9 L$ k
希望大家喜欢!! ( q7 c" J3 L/ e
附件為:FFT.rar
( q7 u: Y& q3 a: j- e
3 c5 `: j! W% Z% k8 O( R我根據他的說明修改他的程式變為如附件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( o6 @2 u7 W; `/ o+ ]( z8 D! i2 y6 M4 z
??? Undefined command/function 'AD10'.% j( Q7 T4 l. f4 q2 b
  r0 E: R! z* f
Error in ==> spectra2 at 436 U! {% R, ]1 l3 n5 j3 v
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);+ n% A6 J' P5 P/ I

; b# p& A1 ?! {$ c) j1 J+ D由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
: o' w2 D* z. b  y& F" \9 ?
; I: Y5 e; W6 h# h- X4 _∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? , C: u  D  v+ E( V
: m" h2 M7 F0 K9 c5 \/ I
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
作者: 緣緣    時間: 2007-10-15 08:54 PM
標題: 謝謝副版主回復
謝謝finster副版主回復,想再請問一下:
# _8 U* h3 h& \: d: s請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
3 ~4 g0 x- |* J8 X- ~* S. v另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
, N3 x  s& p# P; {4 R$ S3 l6 W; c"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
! n- r3 H) b- W; p! v- K2 G7 p/ T內容為:
+ Q8 m% @( m+ p: R压缩文件共有三个文件:两个m文件和一个txt文件6 \& |2 U5 S/ t' g# B
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。! |7 k4 O# S# d$ r3 p
希望大家喜欢!!
% S4 j' h" u* l9 k7 D$ \附件為:FFT.rar
& ]( v% z2 V0 A- v# c
( ?4 q! K; z7 g" w0 J我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
5 ]* l1 t/ L; }* b5 e" P
. I1 S' ^& F" H. r, j+ g??? Undefined command/function 'AD10'.
" `" j% [6 W2 W& n) }! n1 Q& O
6 ^) p; e1 m/ x0 y# UError in ==> spectra2 at 43
. F' g4 b) Z& @3 _8 F- ^( Vd0=round(AD10(start:stepstart+M*step-step),3)/1.8);7 Y9 n! f/ B3 _/ ~7 f5 d; v! a

% W5 i+ G* [! }# L由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
作者: 緣緣    時間: 2007-10-15 10:18 PM
標題: 增加附件
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
4 A  a' k, Z+ E# [& V附上上帖的附件
作者: finster    時間: 2007-10-15 10:31 PM
在回答你的問題前我先稍微解說一下我的MATLAB程式
$ ^' y6 F' n/ d  x& A要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值6 b0 V1 N8 i5 _  z: W5 q
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算* c( @  O% ?% B' z& E
1 r; o3 P4 X4 Z  D* Q4 l0 C6 h6 |
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧# g0 |/ t8 q9 ]* E, t7 v
/ c- ]8 [8 E0 f; H2 w" k
我看不到你的附件檔,故而實在無法作出評論4 d1 y3 y! `# {6 _
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
7 y) @$ O+ Q2 @從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
作者: 緣緣    時間: 2007-10-16 03:54 PM
由於之前一直出現Internet Explorer無法連線訊息~???????
3 ?7 v9 Q! I9 M2 c; h3 e所以重新上傳附件
作者: 緣緣    時間: 2007-10-16 05:02 PM
標題: 有關hspice .measure指令寫法
再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
% d) l' }# F1 E  w$ S- T4 s: F指令的寫法是否為:
- {9 N8 L4 D6 B) d6 r7 I
9 s& X- g" F  W.MEAS TRAN DIGOUT( z9 P# J$ u9 Z* z4 w6 p/ I' v
+TRIG  V (Dout)  VAL=0        RISE=25 W1 X# J1 x0 P. `
+TARG V (Dout)  VAL=3.2m  RISE=2* Z) C/ y" j- T

* l9 I  \# c, n& Y& E" U∼還請指教,謝謝∼& t% X: @  X8 n7 p# |2 {9 K& E7 _

$ w" M7 \" v7 V  l6 `- T另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
% `6 M- K( {- T1 X; H+ s: O: C0 c5 L( F8 |+ a" l
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07; \/ G9 @6 S: f' }- O4 A8 ~+ u

, X2 [4 M  O% i4 Z& G$ pHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?
8 y3 L8 S" j9 ^2 b% A6 _! K6 R9 s8 `
; H8 K" W& A: e; `7 w1 L; l3 I[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
作者: finster    時間: 2007-10-16 11:08 PM
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔/ K8 O' y0 m( W; i' z
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料, R: \8 m0 n; T1 d# x
所以,請再檢查一下你的HSPICE檔案吧
! w5 X( H0 P" `/ Q; w* T* T% c& \1 x4 G  x: J
再來,你的.measure指令用法沒有問題. k8 z+ |4 D5 y+ ^& Z! R$ E! t! R
但,你的取樣點及時間似乎不對% t& _3 p! e4 H. @  f
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
* _1 Y4 I; `! u& }# J.MEAS TRAN DIGOUT* e+ t0 C' F7 o# p. u. [
+TRIG  V (Dout)  VAL=0        RISE=2! x0 [) h0 \$ g) x1 V: Y$ R2 V
+TARG V (Dout)  VAL=3.2m      RISE=20 J2 w8 y- n6 [) r& E
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
7 \! F2 n2 C4 s( ?4 u* f' i; U. c" k1 ]那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock1 \+ x4 r$ R. M* t9 h7 p
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
: g, ?) h' @  z$ X9 x再者,如果是用.measure來計算digital code,那如果以rise edge作基準則應該用RISE=1,而不是RISE=2,這是很嚴重的錯誤,除非你的clock及取樣有delay 1個clock的作用在,如果是以fall edge則是FALL=1,若是以你RISE=2,那你取樣出來的digital code應該都是錯誤的
作者: 緣緣    時間: 2007-10-17 02:02 PM
標題: 再次謝謝Finster的回復
再次謝謝Finster的回復,我會依照你的方法再重試一遍,另外在麻煩你幫我看看上傳的ADC Matlab程式。3 ^! D( X1 G. ]8 w/ F
/ B9 R% m. q3 q' h. p* s" L
∼感激不盡∼
作者: 緣緣    時間: 2007-10-18 11:59 PM
再請問一下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 @& [- @1 _* A: a3 }) X8 A, P4 X" H8 S& m
, n. R* x/ F, x- T.MEAS TRAN DIGOUT
; h6 J- j! [2 h' B+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f
* Q: u5 s# |" d2 a6 _4 ]$ w% R+TARG V (Dout)  VAL=0.976E-7               RISE=1' Z4 U- [9 ?- n& Z# w" j

- u" @: y6 F2 ^  W) W" ^: r! T) `∼還請指教∼
( @! {2 v- j+ u8 O/ Y" T程式重試的結果,*.mt0檔案只出現:
7 k  L4 ~, y5 C" X' xdigout           temper           alter#            
- |6 E4 B. J6 W; l/ R# W/ P1.890e-12        25.0000           1.0000         6 F# ?3 j- I* v: x
不知是否還需修改?) C" [: B* l4 i" u
! B3 p/ @0 |. G1 f7 Z8 S
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
作者: finster    時間: 2007-10-19 01:58 AM
先回答第一個問題
" e  o& |. ~; L9 c你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
* Q6 q4 l( v. R) M所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧: o) g, T( S! w" g) ?

1 n/ c% V; @: W) L1 N: I9 q1 O再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock8 f8 C& a5 A: g1 n1 ^* k8 R/ i& z
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock( s$ T9 H  J7 F  h
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)+ \& b4 i& u8 d+ H, {6 N0 ?
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
! F! g3 Y! L3 X! {; M. m9 K舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
4 j4 a1 ^# [  E5 X; \! s.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us- O. n  s6 H8 c3 d, b* r
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
: V, l9 J+ o3 m- F.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
- O8 V( d8 `2 i: I.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us9 O% G! v9 o/ s! r

2 o8 e: Y: b9 m1 L: m6 c( M: h$ Q.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
8 k+ `. X( H5 y& @( Z.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
; Q$ \8 d8 D" z4 S7 T! R.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us) x; m! Q2 A& c
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us5 f1 J0 _0 ~0 h$ D- }# Y

1 C% n2 |6 C3 x1 f2 @* |* C4 T0 A我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code, x5 B3 a, R) Q/ M7 {4 K  ?8 n
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
1 R$ }2 C! C5 e( {, i- Q
3 W6 m1 j" `) a6 F: ]9 D+ w7 e最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us* I3 _8 A) ?5 L9 o  _2 O8 ?
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
作者: 緣緣    時間: 2007-11-8 03:00 PM
標題: 謝謝finster副版主的詳細解說
再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
# m# O0 O" s- @! C- x. R* L6 I我大概講一下我的架構:5 L2 i+ s/ |" [: Y1 \# u
我電路是使用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的指令寫出,指令如下:. J- _- F2 p8 O7 Q2 e* `
For Fs=10.24MHz:- i  {, e2 s2 `. P) B' I
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
, @/ g1 n6 Y0 g) JV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
- ^, z8 F, g: e6 E- x$ S4 Y% ~For Fs=5.12MHz
! B8 d6 `- l: \0 t! t. CV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7
$ j  E: f( O$ z/ s, q; BV1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
; }: j$ p, m" Z) Y- H/ Z另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。# Y9 p0 B" f( e" X8 i8 x
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
" |$ c  F/ u( J; I9 b* _.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
$ e/ S; B' D6 q5 J( K" I7 b.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us# p- @: D$ V+ y* V$ V  y
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
/ k- Q2 T+ ~% N2 ~, t" U( R你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
; S# I* v4 m& f2 k& ?% z6 z, ~: z1 |/ W
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
作者: finster    時間: 2007-11-12 02:06 AM
看了一下你的說明,覺得有些奇怪的地方, w) F- M: L8 Z. [1 B
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來# d9 ?# v; u- h4 I
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
# M6 K6 f6 [( |9 ?# T$ m" d
1 Q4 F/ g. p% B( \& ^" j" @再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪# S! i' n( I6 H* k
, S" v, [# t9 I& c$ f- m' @+ D9 ^$ q
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要: F# D6 A% B+ A, B( O9 B

# P4 ]( y: U5 e, Y4 f0 Aclear all
' H5 p7 `+ r, E/ w9 E  xfid=fopen('dual_measure_rms.txt','w')5 T% x3 t" P, k* \
for M=1:1:1024
: o1 w9 ^, S0 }. s) o) {       T=M-1;2 e) L" I* {5 F2 a& ~  @
       from=(50*T)+45; %DUAL DAC measure time
9 |- {4 R, Z8 [/ Y" t       to=50+(50*T);# b6 Q( N$ X- H3 P
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
# _1 n9 ?& ?2 Z, }8 Yend8 U* A; Q, u* Q4 i! \
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用0 S0 |/ Y" c' P
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
作者: monkeybad    時間: 2007-11-12 12:02 PM
感謝Finster提供一個非常實用的小技巧
' V# |6 q& g# X. y0 q* z; n' `這樣以後模擬FFT就非常方便了, ~+ r5 E+ d/ Z7 P
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間. E' q) v9 x3 D/ I2 s
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧/ U) P* a$ m3 L9 x3 m, Q- o
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
作者: 緣緣    時間: 2007-11-13 03:58 PM
標題: 再次感謝Finster的詳細解說
首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
$ \& q6 S) y8 `" o! W. h0 [7 D9 |我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:: G6 T7 U' c6 Z
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。/ M4 o6 y7 q+ `0 k) I
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。( _1 A0 m  M3 i. V- }- P( w
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。
, H; |7 J3 t0 Z2 f. g' P) ?依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:+ p3 I4 \, E. c, @8 X" O
clear all
. B/ \2 w1 M! i. Efid=fopen('sdm_out.txt','w')
% ?, E4 o+ q6 P4 k( N- X; |$ `( v# sfor M=1:1:1024
6 G. x* I; c% G+ m. s; |3 r# K    T=M-1;
$ O9 H; n' P) z, E* J' H7 p/ b    AT=(0.1952*T)+1.026; %SDM measure time
8 B! }1 o+ p& F* _7 d- n    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);  ^; @9 `  u! S' T& V9 o
end( u, Q$ F5 [7 e2 Y4 Q
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。: a# C5 h  `9 n, Q, n
想再請問的是:% `( X: ]5 o* V" P6 t$ ^' B
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
7 O+ r) D8 f9 S& c! c! W* tload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM6 A. h3 t8 K+ E
然後就可算出SNDR及SNR以及畫出圖形了嗎?
; L8 c8 ~, V, e/ M/ ]7 p請指教∼
作者: finster    時間: 2007-11-14 06:03 AM
不好意思,昨天一時眼花沒看清楚單位,把Fin的KHz看成MHz,sorry....0 v7 P) [, `4 k7 l
所以才會說你的取樣頻率和輸入信號頻率非常地接近,這是我這方面的缺失
- s5 H; ~) F, F2 f: S. ^* f2 Y3 b% K( r# `. n7 m# @0 K
至於FFT取樣點的問題,我之前是作88MHz,10-bit dual channel DAC,我之前有比較過FFT取樣2048點和4096點,甚至是8192點的差別,結果誠如我前面所言,MATLAB跑出來的結果只有小數點後面3位-5位之後才有差異,前面的數值都是一樣的,所以我才會說一般取到1024點或者2048點就已經非常足夠了+ w" p# Q3 g/ a7 I- H
而且,用SPICE跑模擬從2048點到4096點的時間非常地久,所增加的時間可能不只一倍,而是數倍,可是從MATLAB所計算出來的卻是差異不大,故而,如果paper提供到這麼大的取樣點,那就跑吧,只不過,時間會非常地久,印象中,我之前跑2048點的SPICE模擬DAC大概需要5-7天,而取樣到4096點大概就增加到接近三週的時間,這,純是個人以前的小小經驗,如果是ADC的話,那會更久; c6 ~4 ~0 V& F$ {" \

& _8 E" \/ m3 B至於另外個問題,我的回答是,對的# I- b) @# W8 |8 u4 ]3 ~7 Z
但,要先把一些參數改成你們自己的規格才行
作者: monkeybad    時間: 2007-11-14 05:04 PM
我補充一下0 _" R* h7 C; a; X
緣緣網友應該是在作over-sampling的ADC 跟Finster作的架構不太一樣; H) j+ G- C& a
video DAC or ADC 跟Finster講的一樣 取樣1024以上其實模擬結果就差不多了
4 R/ A( `7 s( }; b9 ]/ M% w至少我模擬起來也是這樣
' G: q0 `  Z3 A5 s3 i4 b而over-sampling的架構 顧名思義 就是以超取樣來提高SNR 藉以換取高解析度的ADC
, s; b( C2 I. w0 Z8 {所以我想取樣點很多應該是正常的吧
作者: 緣緣    時間: 2007-11-26 04:38 PM
標題: 非常謝謝finster副版主的詳細解說與monkeybad版主的指導
再次謝謝finster副版主的詳細解說與monkeybad版主的指導。
7 R) \0 b' G. O5 h# ]說來好笑,我本身出了一個小烏龍,我從11/13回帖後,就一直期待finster副版主的回復,所以我幾乎每天都上論壇來看看有沒有新消息,可是我連續等了好幾天,直到今日(11/26),我才突然發現finster副版主早於我回帖的隔天11/14回我消息,以至於我沒有第一時間答謝finster副版主的指導,真有點不好意思。
! v4 E+ E2 B* x5 A0 ]8 e+ j說來慚愧,我沒有注意到我的帖子已經有第2頁,直到今天才發現,真有點啼笑皆非。 ' x4 U6 M9 h! ^+ k9 v
在此,根據finster的指導,我會再試試,有什麼新問題,再向你請教。
# b  \5 f3 U. d$ M/ P1 b此外,回答monkeybad版主的問題:我的確作的是over-sampling的ADC,所以, 才需要取樣到32k points那麼多吧,畢竟我也希望取點取少一點作計算,可是又怕算出來不準確,我想,我應該會比較一下1024點與32K點的差異,如果差異不大,或許我就可以將點數減少來計算。   - o2 V: M0 |  G2 u7 ?$ X
∼謝謝!∼
作者: 緣緣    時間: 2007-11-28 09:24 PM
標題: 請問finster副版主有關程式問題
請問finster副版主:! \8 l4 h8 f, M& W  U
我依照你提供的程式,修改成我的規格後,程式修改如下:: z: f9 a6 _6 s' i
% --------------The number of FFT -------------8 o7 H2 U6 v- t1 ]
fin=5;% *KHz
7 H5 `1 z$ O8 u9 N7 h1 l4 bfs=5120; % *KHz
4 X% K8 G; ~( G3 F! J' v3 Dcycle=1; % cycle = 2^N ; N = 0~5
+ s5 N) B% @& e5 a' ^M=round(cycle*fs/fin);7 }$ k( F% K' x' `) o
% --------------Load the binary code -------------% S3 O1 A% U* Q
load sdm_out.txt -ascii
# E9 @3 W0 o( p: e( X9 Qstart = 1;
0 ~( X, {0 |1 N+ G& p4 vstep  = 1;' f, W4 @0 K' h) m( v* s4 ?# \
%ADC
+ ?: T& C$ r7 U" J2 f/ |0 Kx=sdm_out(start:step:M);0 i  t3 {1 J1 p2 s/ \! t; w& R
% --------------Using minimum 4-term Blackman-harris Windows -------------
/ R: i* `* p- i2 e' b3 aptst = 1;' `$ l7 f1 |( k+ ?: f: q" y
ptfi = M;4 ]! X4 o) ~% ^: `9 n5 a: T
pts = M;
# ~% C4 g* C- U) p$ i8 {7 ?
nb=1:1ts;
* [* g7 w4 S% Vkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));& Q* L3 N; i, V
win_gain=sum(kb)/pts;
: T! @7 j# s" tkb=kb/win_gain;' @9 }* |. c+ y( {: J
% --------------- Calculated fft --------------------------
9 t% t! w4 v4 x4 \9 G; @8 myb=kb.*x(ptsttfi);& g8 w, @- w2 T. {5 g* }. T; `
yk=fft(yb);
( M8 q, l! R$ qfft_no=length(yk);
9 _" V8 l$ Q. qf=fs*(0:fft_no-1)/fft_no;8 c3 t. P& }1 i8 I0 C; ], y
Pyy=yk.*conj(yk)/((fft_no/2)^2);
4 Q# j5 G8 ~% y, R% ---------- Calculate THD ----------------------------
) H* `; f6 g2 _- P6 j: Qj=1;- ]# Y% ~. s- N1 u! C& d2 H
for i=1:1fft_no/2)
! Z* u& g9 Q& W) E3 {1 B( D9 o) M    if (f(i) == (fi*j))  2 \, a- N3 S( x  D" U4 C+ I
        HD(j)=Pyy(i);     %% find all harmonic distortion components! |9 P" q+ i* t0 k9 \) [
        j=j+1;
( s. i0 P- c- E$ t; [    end- C- U4 v, L3 k
end
# _9 W* P& n4 f# l4 v8 l8 R) }/ l* x$ yP_hd=sum(HD(2:9));7 S8 n" R' c. H# A
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal;' I5 W; Y* j3 R, ~3 [/ _
fprintf('THD = %g dB\n',THD);  V$ R" }; ^8 y8 N6 J/ T$ e
% ---------- Calculate SNR ----------------------------
4 ^* A& W1 M& N8 I0 R- c* Kfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
1 I$ x0 Q, a! t* @; b+ l+ ~8 X% Qfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);: b2 A& k6 j1 s3 d  Z' M) e
span=max(round(fft_no/200),5);4 w4 O' O) P( P" G, M( r
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
$ S- R1 ^9 m7 MP_noise=sum(Pyy(1:fft_no/2))-P_sig-P_hd;- w; U3 O% M3 r3 q
P_noise_hd=sum(Pyy(1:fft_no/2))-P_sig;
- S, @2 h5 b5 @# Q
SNR=10*log10(P_sig/P_noise);  h, J- Z% i. B+ B. f
SNDR=10*log10(P_sig/P_noise_hd);2 n/ _  \" t' {/ O* S% u
fprintf('SNR = %g dB\n',SNR);% _: c" k5 p# J/ E% ^
fprintf('SNDR = %g dB\n',SNDR);' [: n3 M) D' T/ Z4 W3 t9 N
2 U! K# {6 ~  j+ @  H/ z
藍色字體部分為我新增的程式,當我run到紅色字體部分,matlab顯示以下訊息:
; n- o% S" R9 p  L# i??? Error using ==> times
  y: y7 U3 b# @3 J; sMatrix dimensions must agree.

6 c! l& Q3 t0 d7 N8 L' W7 i+ o
( a" G% O9 t8 n% k% p8 rError in ==> sndrtest at 219 @7 l) M6 a% i* `& `
yb=kb.*x(ptsttfi);
! Y4 q  G1 q4 m2 y. D' e8 Z9 P
9 c6 J% e/ I% ~- \
因x函數是我自行定義的,可否幫我看看要如何修改?
* A# o9 a' J# {另外,在程式底下的藍色字體部分,是我增加對SNDR的計算式,不知有沒有錯?
: R4 |; W4 T  [2 S$ Y除了以上兩點外,全部程式中有沒有哪裡有問題,也請幫我看看。
  `; p% o2 ^8 `5 |附件是我取1024點得到的SDM digital code,我是由第2 個clock開始抓輸出資料,我的測試條件為:Fin=5k,Fs=5.12M。2 e) d8 A& C9 U* j1 J
以上麻煩finster副版主賜教。
作者: finster    時間: 2007-11-30 12:54 AM
我看了一下你的MATLAB程式,發覺到有一個地方有問題
& C- s+ |" p4 N7 s; }那就是你設ptst和ptfi是同一個值是不對的
6 W" W* X6 L  u( t0 `ptst是計算fft開始的值
' |% @* L2 o  x1 \而ptfi則是計算fft的range,如8~519,total則為512點
7 r: G5 j2 a$ t2 @+ L+ b故而你在執行MATLAB程式時就會出現錯誤5 }0 {! W# c& _. v: ^# R( z

3 g  s( ~, z$ a, a$ ]我看了一下你的MATLAB程式,基本上沒有多大問題4 T, ~' a  n. ]6 d1 I/ K
不過,要小心計算THD的值和範圍/ a/ T; H$ W3 H# m( x
因為有不少人問過我為什麼在這個地方會出現錯誤,而當我看到他們的錯誤訊息時,便會發覺到他們的取様範圍太少,以致會計算不到第9個harmonic distortion components而出現錯誤2 X2 _. t! H; F# f9 x3 f' y
. w3 o  ]# w, P; o
最後,計算noise有好幾種定義方式
$ Y; T. S6 M+ P4 c1 ^" `) u# W0 d原本我所寫的程式有兩種計算SNR,SFDR的計算式,後來,經過我們內部討論的結果只用我給你的那一種計算方式,因為那個方式比較合理
- B, e) L9 C. b我個人覺得計算noise的方式,只要能夠說服的了別人,同時也能夠提出合理的解釋即可
$ n: f2 h0 `! w9 f" E/ M因為目前在計算noise上並沒有很統一的說詞,故而,只要解釋的合理即可
作者: 緣緣    時間: 2007-12-2 06:25 PM
標題: 感謝finster的解說
感謝finster的解說,我解釋一下你的回復,我程式中ptst是設1,但我的ptfi是設ptfi=M=round(cycle*fs/fin)=1024,所以並不是同樣數值,取1024是因為我有1024筆資料,還是說我這樣的寫法不對?4 F2 u- @9 t& T" z6 p
因為我希望計算的點數為32k,所以先以1024(1k)的點數來試著計算看看,如果沒問題再計算32k點。
7 [* C% ~8 B" d- j+ X& P我想我程式的問題在於x函數是我自行定義的,可能有錯,可否再幫我看看要如何修改?3 [3 n, E( Y" ~* `; R1 ?# w( T# |. x
謝謝!
作者: finster    時間: 2007-12-2 09:33 PM
我想,你可能有點誤解了我的意思了2 q% N% K) v2 [
我列出我當初寫ptst和ptfi的式子關係式
0 H8 r1 D' O5 E. V. w: v" @ptst=2^3;          % calculated fft of start point; y! g) d. w# K
pts=2^9;           % calculated fft of end point
* j2 _7 ?0 o5 z' O& ^4 M9 k1 P& F9 Eptfi=ptst+pts-1;   % calculated fft range: 8 ~ 519, total: 512 point( l3 z; g: ^2 F+ C' D0 g
因為我們不是從第一點就取來作fft運算,故而在設ptfi時,它的值是取(2^N)再加上從第幾個cysle值所取的值& T- @, U( i: \6 u. f; C( s
如此一來才能夠取到足夠運算fft的值5 j5 @2 S( N! g3 z- f
) V' m- |7 j( P- }' s& Z
另外,還有一點,x陣列的值要比ptfi的值大,或者等同於此值
+ C* ]& }  J+ S5 }- c如果你的x陣列內的值沒有到達ptfi,那MATLAB就會判斷出錯誤
8 a8 J- k  f# W1 q5 |4 D9 L
, @8 c( G  `1 G1 @1 [* \如果對於要設的參數仍有問題8 k3 \0 J4 h& _# g/ t
我可以把我最原始的程式寄給你參考) m# }+ ^- ~3 U) m2 H
, Y* }7 {! _; {& a9 k' j& ~* S" h
[ 本帖最後由 finster 於 2007-12-2 09:43 PM 編輯 ]
作者: 緣緣    時間: 2007-12-3 12:16 PM
標題: 謝謝finster的指導
謝謝finster的指導,我試著把你的方法帶入程式驗證,matlab仍然出現:
7 Z) j8 u5 S# B  Q. x??? Error using ==> times
8 b1 X7 b& Y, A: o: ?9 B. oMatrix dimensions must agree.% H  ?2 O" }2 d# G- U7 z5 E& S

+ i' m" R! Y0 z0 gError in ==> sndrtest at 26
7 _  [% l; o( e' f- myb=kb.*x(ptst:ptfi);! e8 ^0 \3 Y) S" L% \& [' F0 V  r, ?. ?
那麼,就麻煩finster把你原始的程式寄給我參考,另外,可否附上hspice轉出來的digital code,我好方便作個比對。* [* D- c4 ~$ S- _  @" A3 }  U; `
∼感激不盡∼' ]; ?/ F: V# p7 s( M8 u
ps.我的E-mail address我會以短消息傳給你,謝謝!
作者: liuyj610    時間: 2008-3-23 03:06 PM
很有用啊,谢谢各位的指导,特别是finster太强了,对了,你能不能给我们多介绍一下关于整个ADC,DAC的设计流程与方法啊?
$ ~$ h( O" [6 x0 M$ ?1 p9 ~( C特别是仿真方法(从用matlab系统仿真到fft仿真分析。。。)
作者: winnie22    時間: 2008-3-24 12:18 PM
請問一下
# [; H1 N0 H4 C# E8 K7 P如果要在HSPICE模擬ADC的INL及DNL的流程及作法??, @( a* `( ^5 m; V
因為沒有MATLAB請問HPICE可以直接做嗎??; B2 a: N2 v" M% b
- M2 h1 a# E7 h- M3 i1 @0 y6 d5 a
請各位做過ADC的高手幫忙回覆..
作者: finster    時間: 2008-3-24 01:21 PM
基本上作ADC,DAC的模擬,還是以HSPICE為首選建議的模擬軟體3 c( W; b3 h" S$ B, F
至於用spectre,h-sim,matlab....等,均可對ADC,DAC作模擬1 O; h- H* p' b, i& [9 q) V1 M  D
但,在業界,個人的建議是,還是要跑HSPICE會比較保險
. Y8 Z( Q" k- R" f8 T5 d# K" K6 m至於INL,DNL,SFDR,SNR....等,基本上很難直接用HSPICE跑出來,因為有些計算式子在HSPICE中要撰寫出來很麻煩(用.measure指令來作計算),我曾經嘗試過,但最後不得不放棄,因為有些計算真的很麻煩,而且用MATLAB很快便可達到計算/ ~* ~: V3 `! s: M9 t& T" s+ J( v" j
一般都是把HSPICE模擬出來的數值帶到MATLAB中去作計算會比較簡易$ |  l' ^. z8 a. _
而如果沒有MATLAB,也可以用C來作數學運算,不過,印象中C沒有FFT的計算函式,所以,可能會需要一些額外的撰寫FFT運算程式才行
作者: 盧志良    時間: 2008-4-23 10:59 PM
標題: Hspice轉進matlab
請問一下:我想把hspice模擬出來的波形,放到matlab裡面做比較,請問要怎麼操作呢?
" o; a' d5 a+ Z; B  v7 \. l                請各位了解的高手幫忙,謝謝.
作者: 緣緣    時間: 2008-4-24 04:16 PM
標題: 回復 32# 的帖子
請問你是要將hspice模擬出來的波形,然後用Matlab叫出來比較呢?( `, a. S, h6 W7 V7 a
還是要將hspice模擬出來的數據,然後使用matlab做分析?
作者: 盧志良    時間: 2008-4-28 11:34 AM
目前我是要將hspice模擬出來的波形,然後用matlab叫出來做比較,請問這要怎麼弄呢?
作者: 盧志良    時間: 2008-4-28 12:18 PM
另外,也要將hspice模擬出來的數據,丟到matlab裡面做比較分析
4 n+ B% N+ j2 c. T. H請各位高手幫忙,謝謝.
作者: 緣緣    時間: 2008-4-28 05:19 PM
志良你好:
" F" x! K2 ~5 }如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。, p8 f5 e  v# W$ ]6 K; X  E8 D
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。. u& S; C+ v" i& l: l
9 ~5 e& O; M( i/ G3 g  e4 P
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]
作者: 盧志良    時間: 2008-4-29 12:53 PM
請問一下,第一個問題我看完附件後,第三個步驟還是不太懂,是要先把hspice的波形檔放到hspice toolbox裡面嗎?那在matlab裡要怎樣叫出波形檔呢?
作者: 緣緣    時間: 2008-4-29 02:03 PM
標題: 回復 37# 的帖子
1.首先你跑完hspice會產生一個*.tr0的檔案。
/ H% f8 p$ Q/ ?  w4 _- q2.然後開啟matlab軟體。, D# d; {3 |% A8 q$ a/ k
3.從matlab的工具列會有一行current directory設定你hspice *.tr0檔案的存放路徑,或是把檔案copy到你現在matlab工作的路徑。
4 p. ~4 a  D( w4.在matlab的命令執行列執行X=loadsig('xxx.tr0')指令(說明檔裡面都有);  載入波形檔xxx.tr0到結構x中。6 z- Z# W- G; X" E' }) ^3 @$ {
5.再執行說明檔中相關指令,即可看到你所想看的各點波形。
作者: 盧志良    時間: 2008-4-29 04:17 PM
請問結構x是什麼意思呢?) p; ?9 ]+ a% X0 S! k/ M; a! @$ d

* @4 p9 K8 ~) A5 m5 _* c& {  derror in hs_allocate_sf: unexpected values in block1 header
+ ]; g) i! j+ ???? One or more output arguments not assigned during call to 'loadsig'.
/ v- O! u& o# d# a: P這是怎樣的錯誤呢?
作者: 緣緣    時間: 2008-4-30 01:42 PM
首先x結構類似數學中的X函數,只是將loadsig('xxx.tr0')的指令指向X函數,你也可以用y,z....,此種寫法類似C語言的寫法。
0 N% D: w' k$ F6 O: M/ ]- D4 L第二個問題好像是你的電路輸出節點有重複或是你的*.tr0檔案有問題,這我就沒遇過了,你可能要自己查一下。
作者: 盧志良    時間: 2008-4-30 03:10 PM
請問一下,輸入X=loadsig('xxx.tr0')這個指令是把hspice的*.tr0的檔案在matlab裡面叫出來嗎?
3 x# E6 L% _$ O那如果我想把這個檔案叫到我在matlab模擬出來的波形裡面,是要怎麼弄呢?
; f. f7 N4 c: E4 N) _  m+ Q- |還有就是進入到目錄 ~/matlab/toolbox/Hspice Toolbox,執行命令mex loadsig.c。這個是要怎麼執行阿?
作者: 盧志良    時間: 2008-5-1 02:01 PM
********************************************************
; X, [+ {/ Y5 d               Hspice Toolbox for Matlab
" u/ f& t2 |$ t# K6 H written by Michael Perrott (http://www-mtl.mit.edu/~perrott)  k; d  [  g: E( A3 j- p
   while at Silicon Laboratories (http://www.silabs.com)
+ y, p  J! u* M/ z6 ~# D     Copyright (C) 1999 by Silicon Laboratories, Inc.8 F9 U, ?0 e- t6 B
     This software is distributed under the terms of% g: ^# P8 p% a2 b7 l  h" k
       the GNU Public License (see the COPYING file
% ?, p6 q5 U; T& t8 H) K  for more details), and comes with no warranty or support
: J: R5 o/ v5 o" a+ B2 p*********************************************************$ ]7 S( n0 Y' @8 H
8 v6 s5 e+ U  K& B+ L7 v7 h
??? Error:  file can't be opened
8 F, B) D4 b. v+ C+ L+ E" ^9 ]. D6 L/ a0 z9 N4 a, c% m
Error in ==> C:\MATLAB6p5p1\toolbox\hspicetoolbox\loadsig.dll& K! O, k. _. J' T6 ]
縁缘大大請問你,這是怎樣的錯誤呢?怎麼解決?謝謝.
作者: 盧志良    時間: 2008-5-1 02:30 PM
縁缘大大請問你,我的hspice模擬出來沒有.tro檔耶,只有.sto檔而已.那這樣還可以在matlab裡面叫出波型嗎?
作者: jerwei    時間: 2008-5-1 05:43 PM
原帖由 盧志良 於 2008-5-1 02:30 PM 發表 6 Y6 c' M; B! m- m
縁缘大大請問你,我的hspice模擬出來沒有.tro檔耶,只有.sto檔而已.那這樣還可以在matlab裡面叫出波型嗎?

; |! ?1 A- [7 S) H8 z3 h
8 T8 n6 F; L/ n* G3 i: l6 ~* Atr0是spice的你執行transient simulation後的記錄檔  Q3 o) a" K) f1 X7 ~6 A  B
若是你沒有tr0則你可能沒辦法將transient的結果滙入到matlab- Z  x2 W8 `/ S4 e$ H* e( z6 R
有錯請指正,thx
作者: 緣緣    時間: 2008-5-2 05:57 PM
正如jerwei所說,需要有*.tr0檔案才可由matlab叫出波形,你沒有*.tr0檔案是因為你沒有在hspice 執行transient simulation(暫態分析),一般指令的寫法為:) v7 x4 G7 a% F+ [2 S
.TRAN  0.1E-12(取點間隔)   0.81E-3(結束時間)  START= 0E-6(開始時間)
* @0 Y8 m: c# a# T& ~7 f5 T# w+ l" X6 O你可以看一些hspice指令的書來瞭解涵意。只要你有下這個指令,在輸出檔就會有*.tr0的檔案。
作者: jwtsai    時間: 2008-5-13 09:53 PM
幫忙補充一下,2 x3 I: |( n: k' j
要使用這個toolbox時,在hspice的.option中不能使用post=2.
- C6 Y  Q. N3 l5 H可以用+ H) f2 Z) Y4 N' r8 d2 |
.option post
2 T5 C1 a% E$ Z0 \6 t" M或是) Q) z: Y+ T" g9 O/ C7 h4 G
.option post=1
! E, H- p- n7 `$ ~2 y1 ~- C但絶不能用
. Q) e5 E4 }  g9 \.option post=2
作者: simon_ncku    時間: 2008-5-19 10:43 AM
請問或是版主副或是其他人
  _' Y7 u7 U/ A; {我將 緣緣的MATLAB程式 放進去跑有是出現ERROR耶
6 N- H8 _4 g* e) q* U它出現
+ o( _& x5 V* `??? Error using ==> run" A$ |) K3 z, e# Z5 A. [/ |
Error using ==> times) v1 O' G" t, d8 n
Matrix dimensions must agree.
$ J3 V( g! j" o; G6 R3 u附件是CO下來的
0 Q- z, s, e4 E% y- H! |6 {請各位先進指教8 K: m, x* B% L; c
THANKS.
作者: simon_ncku    時間: 2008-5-19 07:41 PM
標題: 回復 45# 的帖子
緣緣大大是否可跟妳要MATLAB  分析FFT等一些動態參數的程式- {/ I5 M* Y, W3 x, o: J6 F7 C/ |
謝謝
作者: 阿茶先生    時間: 2008-8-9 10:07 PM
@口@ 不好意思,小弟到MATLAB的網頁中找不到Hspice Toolbox載點哩...1 k0 ^. M( _; G6 }

- t# f9 h2 [1 _/ [2 I不知道有哪位好心人士可以提供載點呢??  \. a+ o/ X2 F8 c) k( X

! M! [! ]: f7 D7 J% T& n- d感謝不盡喔!
作者: yoyo20701    時間: 2008-10-3 02:10 PM
多謝大大的解答~~小弟大概瞭解一點~~~謝謝你喔~~~大大~~~~~
作者: yoyo20701    時間: 2008-10-3 02:10 PM
多謝大大的解答~~小弟大概瞭解一點~~~謝謝你喔~~~大大~~~~~
作者: pandera    時間: 2009-3-18 09:06 PM
標題: 謝謝大家回覆
剛剛試了第一個方法 覺得不是很方便# {+ A: G! t% |* X! k4 d
後面的辦法用起比較ok/ [2 `* s1 D7 F8 Y2 O# Y& u
這樣我的模擬結果就比較好看了 謝謝
作者: e2000    時間: 2009-4-8 01:46 AM
怎麼感覺很繁雜的樣子,看來這方法還需要多點解釋,我也很困擾到底要怎樣利用hspice的值放進matlab裡面
作者: caroff    時間: 2009-5-13 06:02 PM
不好意思,有個問題想請教各位前輩。9 A4 M1 n7 s, Y( d! Z9 U; t
如果由hspice使用.fft得到一個spectrum,
# w, X/ d2 T% ?6 D那我該從何得到這個spectrum的data呢?!) v' D* O, [8 `" D! _% ?8 ~% ]
因為我要利用這spectrum去計算SNR,不知該如何用?謝謝!!
作者: s13571357    時間: 2009-5-14 09:47 AM
可以問一下嗎??+ V$ d2 |: g1 J; Y8 Y( O7 L
當我現在有一時間t=0:0.01:60(表示時間是0~60  而每0.01分析一次)- O3 D. [2 l' p# @9 o2 V3 \
另外每一時間對應到相對的電壓值
3 _4 h- q9 I+ G7 G- l: }. Z但是電壓值和時間不能寫成一方程式
3 G  Q8 Q4 W6 a; B我現在想要用MATLAB做FFT* w3 T5 w/ ^, r. j. A/ }: i6 E
把時間軸轉成頻率0 u& K/ Q% f2 N4 m4 u- K
去看他的輸出直
7 t6 x4 a/ E8 x5 v2 L我該如何使用MATLAB呢??
) y2 S( h( Z9 V& S# yMATLAB新手
作者: sky987    時間: 2009-5-19 01:40 PM
他們跑 32k 16k點 應該是在量測的數據
$ K. p- k' X( E4 Y
# e* W$ v- m5 }7 F1 `模擬的時候不用跑那麼多點   這樣太花時間了
作者: kuohsi    時間: 2009-5-21 05:45 PM
請問若用.meas指令
4 i) O+ l" u$ |# \$ F  G& W# J將VOUT取65536點的指令要如何寫?
作者: iamsailing    時間: 2009-5-26 09:18 AM
緣緣網友以及版主:, t. u9 t: M3 m) l' x; |. \) `
我的問題如下:# }  B7 L. c: b3 g
我用HSPICE 仿真了一個2-bit flash ADC
( g6 S+ N: j, U: Z2 v4 h' Q利用spice explorer中的理想D/A工具,, `% x% f/ y+ m
可將2-bit flash ADC的輸出數字信號,通過該D/A重構爲模擬信號
( q+ X7 ^: O: ~/ z並導出數據,如附件ADC_DAC_out.txt所示
" @2 O; N' x1 [/ d% ?) U該文件中第一列爲時間信號(X軸),第二列爲重構後模擬信號的幅度
3 Q! s5 Q8 i* x& \/ f! o2 H在matlab中如何用load語句將這樣一個兩維的數據導入/ S# I8 f/ E; J3 T4 D4 k' ^( Y
我現在需要用matlab對該信號進行FFT處理,並計算THD,SNR,SNDR
: @( l- I. x8 b- M# j8 b我的fin=56640625Hz,fs=2e+9Hz,打算做1024個點的FFT- U( ]' }* ?0 t8 u- ~# E$ v( Q; ~
ADC_DAC_out.txt中數據的時間是從11ns----523ns3 x* F! @4 E. u1 L7 u
因爲11ns+1/fs=523ns$ k3 }9 w  g# O9 L; [( z$ |1 j
附件中fft_yuanyuan.m文件是我將網站上你的matlab程序複制下來了
& z9 |$ u+ N. i但�面有些部分我不明白,我用“?”標出了
6 X7 O+ p1 r1 R  T- \, f- h2 I# Q4 |% {" d! N1 Z0 T
謝謝你。
  _. M, V+ V3 @. r- @1 I
- c" S3 d7 c3 C3 O% S[ 本帖最後由 iamsailing 於 2009-5-26 09:24 AM 編輯 ]
作者: kuohsi    時間: 2009-6-1 04:02 PM
iamsailing:
* k$ W, n  s5 b$ ]: p' G你取點應該是11ns+1024*(1/fs)=11ns+1024 / 2G=0.523us
9 C6 m3 _' l% S" N+ t所以你HSPICE要下.tran 50n 0.523us4 w6 v5 Z. O. Q: {) ^4 ]8 {# W: f/ `
.tran 的step要是1/fs才對
作者: 異星人    時間: 2009-6-4 10:16 PM
我有個問題啊' t9 l2 y. G1 G, x- l
0 m. [" x. H7 O# p# H+ f
是論壇上的表情問題( K- b6 q% F( @1 C5 U

# C  t' ^; B( u   這些程式碼都穿插的表情符號
; d! Y; A/ |9 `
# j2 i) \. g* c5 h, ~7 S無法解讀啊
作者: 異星人    時間: 2009-6-4 10:16 PM
我有個問題啊' H. S$ J- o# G' ?# t8 L

8 u( ~, t/ v# {, R  Y  l是論壇上的表情問題2 [3 b9 c+ s& ^! `5 k6 v  z$ q, h

0 N1 R' t, D: \+ M   這些程式碼都穿插的表情符號
$ l- o: A+ S& J$ R+ w5 R* a& x
% S- H9 }" R6 q無法解讀啊
作者: kimwin107    時間: 2009-7-27 08:44 PM
感恩..請多多指導..即所謂無分享就無成長..為又努力不懈地汲取他人經驗,才能更精進.!
作者: pkf690801    時間: 2010-3-18 04:42 AM
我需要這個頁面內的付加檔...為什麼都不能下載呢?
作者: mayluli1981    時間: 2010-4-13 05:22 PM
版主 請問依下能給下載hspice toolbox的網址?偶在網路都找無2 f4 Q% A5 D/ }+ h2 w
我是新手  我要把Hspice 的AC及 TRAN 圖用matlab顯示出來而已
0 i  n; N, M* g2 V# N; W9 B; P# K沒有hspice toolbox好像不行ㄟ( i& m' ^8 U8 n1 p2 t$ U
感謝
作者: s13571357    時間: 2010-4-21 02:15 PM
請問一下
7 `" }( \' j5 J0 c+ E# vhspice toolbox主要是用來和maltlab溝通嗎
+ h7 x5 f" \) ?4 A5 F: K# u哪裡可以找到相關的資料呢
作者: lqlcug    時間: 2010-4-22 09:28 AM
楼上很多牛人,这里斗胆谈谈我的处理方式。
, ~& m1 X& {$ b; P8 e" ~$ T& N0 i1.将Hspice的仿真结果正确的输出,用到了一个interp=1的设置,它可以选择你想要的数据点输出;
, Z1 e) X7 k# D! G: M5 Q3 Q( Y& ~2.采用Hspicetoolbox将hspice仿真结果导入到Matlab,然后处理的方式就非常的自由了,比较典型的处理方法可以参考MAXIM公司的设计笔记,楼上已经有人贴出,还可以采用Matlab将数据先处理到workplace区域,然后采用simulink,借助SDtoolbox来计算SNR。
作者: rokin    時間: 2010-4-23 02:35 PM
首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下, ...
  F( c8 G0 A, y( O( F緣緣 發表於 2007-11-13 03:58 PM
, W" V' A1 H( q2 T$ b0 B0 M; P: _
( j, b  e& Y9 N* x
# r2 `" b. D% S, e
  請教版主及緣緣8 C" @8 D7 I  u0 b( m1 T
對於給matlab計算FFT之前,
4 Y4 N2 t8 N# [+ i.meas 指令對輸出要取均方根值嗎?
3 ?7 P% B  I8 `4 j, H; L或者直接取值就可以了?
作者: juro0827    時間: 2010-9-27 01:37 PM
WOW
! c$ U6 E9 G& o9 @4 o* [正在找此相關資料!!. n1 Z  i4 P4 u
LUCKY!
作者: wwm101    時間: 2011-3-18 10:14 AM
finster 版主相当强大啊,受教了,谢谢
作者: killer7788    時間: 2011-10-4 04:40 PM
回復 58# iamsailing
: l5 A, }  n9 [' _; [$ R4 [
9 w" d4 V0 r6 W% t  ?
9 C* x" r$ [- A+ Q) C    可以請問一下, SPICE EXPLORER 中的 D to A converter 是如何使用, 因為我所做的ADC 的輸出是一個序列或並列波形輸出, 案OK後好像沒什麼反應, 也不會像你的TXT檔一樣
作者: david_chen    時間: 2011-10-6 08:40 AM
來這裡看到很多高手精闢的講解
% u0 C! J( z% S, P* o0 U受益良多  謝謝囉
作者: chivv    時間: 2012-6-21 12:45 PM
感謝版主回覆
) a' Q) A5 p) n: e7 N正在找這方面相關的訊息
& g' H5 [  `& T! {9 J4 Y讚!
作者: poiuzxcverty    時間: 2013-3-2 03:34 PM
謝謝各位大大分享,小弟受用了
作者: jghn    時間: 2013-3-28 02:50 AM
謝謝大大的分享!  
. P, v( \: z2 u
2 q0 `( ]6 G2 u7 w$ Z真是受用無窮




歡迎光臨 Chip123 科技應用創新平台 (http://free.vireal.world/chip123_website/innoingbbs/) Powered by Discuz! X3.2