MỤC LỤC
MỞ ĐẦU 1
Chương 1: TỔNG QUAN VỀ TÍN HIỆU VÀ CHỌN LỌC TÍN HIỆU . 4
1.1 Tín hiệu tương tự (Analog) và tín hiệu số (Digital) . . 4
1.1.1.Khái niệm, phân loại tín hiệu và hệ xử lý tín hiệu . 4
1.1.2 Hệ xử lý số . 12
1.2 Cỏc bộ biến đổi tín hiệu tín hiệu tương tự-số (ADC)
và bộ biến đổi số-tương tự (DAC) 19
1.2.1 Bộ biến đổi DAC :. . 19
1.2.2 Bộ biến đổi ADC : 22
1.3 Bộ lọc số và cơ sở toỏn học của nú 24
1.3.1: Tổng quan về bộ lọc số: . . . 25
1.3.2: Cụng cụ toán học để thiết kế bộ lọc số . 28
Chương 2 : TỔNG QUAN VỀ CẤU TRÚC FPGA CỦA HÃNG XILINX
VÀ PHẦN MỀM HỖ TRỢ THIẾT KẾ WEBPACK ISE 32
2.1 Tổng quan về cấu trúc FPGA của XILINX . 32
2.1.1. Sự hình thành và phỏt triển của FPGA và CPLD. 32
2.1.2. Giới thiệu các họ thiết bị của Xilinx . 38
2.1.3. Cấu trúc FPGA của hãng Xilinx 44
2.2 Phần mềm thiết kế WEBPACK ISE 52
2.2.1. Giới thiệu sơ lược: . 52
2.2.2. Công cụ thiết kế: . 52
2.2.3. Lõi sở hữu trí tuệ của Xilinx ( IP_Core ): . 55
2.2.4. Giới thiệu ngụn ngữ VHDL 55
Chương 3 : HỖ TRỢ THIẾT KẾ CỦA MATLAB VÀ EDA
VỚI BỘ LỌC SỐ 63
3.1 Phương pháp thiết kế theo mô hình: . 63
3.1.1.Giới thiệu: . 63
3.1.2.Kết luận . 68
3.2 Sự hỗ trợ của Matlab với thiết kế bộ lọc số (FDATool) 68
3.2.1. Tổng quan về hộp công cụ thiết kế bộ lọc số (FDATool) 68
3.2.2. Thiết kế bộ lọc theo phương phỏp sử dụng các hàm chức năng: . 73
3.2.3. Thiết kế bộ lọc theo phương phỏp sử dụng giao diện của
FDATool .:. 77
3.2.4. Phân tích một số cấu trúc của các hàm thông dụng
trong thiết kế bộ lọc: . . 83
3.3 Sự hỗ trợ thiết kế của EDA (phần mềm ISE): . 85
Chương 4 : THIẾT KẾ BỘ LỌC TÍN HIỆU SỐ DẠNG FIR . 87
4.1 Kết cấu cho các kiểu lọc tần số dạng FIR: 87
4.1.1. Bộ lọc thông thấp lý tưởng . 88
4.1.2. Bộ lọc thông cao lý tưởng . . 90
4.1.3. Bộ lọc dải thông lý tưởng . 91
4.1.4. Bộ lọc dải chặn lý tưởng . 93
4.1.5 .Nhận xét . . 95
4.2 Cấu hình tổng quát của bộ lọc FIR . 92
4.3 Tổng hợp hệ thống theo phương pháp mô hình hoá đối tượng . . 95
4.3.1. Giả thiết kỹ thuật 95
4.3.2. Thiết kế bộ lọc số đáp ứng xung hữu hạn
theo phương pháp MBD 95
4.3.3.Hiện thực hoỏ và mó để hiện thực hoá . 105
4.3.4. Thử nghiệm và kiểm tra .112
ĐÁNH GIÁ VÀ KẾT LUẬN . .114
1. Khả năng thực hiện và hướng phát triển của đề tài .114
2. Khả năng áp dụng vào thực tiễn . 114
TÀI LI ỆU THAM KH ẢO . 116
PHỤ LỤC
132 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 5672 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Thiết kế bộ lọc tín hiệu số trên công nghệ FPGA với công cụ Matlab và EDA của Xilinx, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ng bình pha min
73
* Bộ lọc thích nghi:
Sau đây ta sẽ chỉ ra một vài hàm giải thuật có sẵn trong hộp công cụ khi ta
làm việc với bộ lọc thích nghi.Bạn có thể tham khảo mục: Adaptive Filter
Constructors để thấy rõ hơn bộ lọc loại này.
Bảng 3.4: Cấu trúc của bộ lọc thích nghi.
Hàm lọc Mô tả
Adaptfilt.lms Sử dụng thuật toán lọc thích nghi LMS FIR
adaptfilt.nlms Sử dụng thuật toán lọc thích nghi chuẩn hoá LMS FIR
adaptfilt.rls Sử dụng thuật toán lọc thích nghi đệ quy ô vuông nhỏ nhất
RLS
adaptfilt.sd Sử dụng thuật toán lọc thích dấu hiệu dữ liệu
Tóm lại:
Mỗi hàm chức năng có một cấu trúc riêng đáp ứng những yêu cầu kỹ thuật
riêng, chúng ta sẽ xem xét vấn đề này sau (tham khảo FilterStructure), khi đã nắm
chắc cấu trúc và đáp ứng kỹ thuật của nó thì việc thiết kế bộ lọc trở nên hoàn toàn
dễ ràng, thuận lợi vẫn đáp ứng đầy đủ của mục tiêu yêu cầu kỹ thuật với bộ lọc.Bạn
có thể tham khảo các hàm dược phân theo nhóm chức năng tại: Functions--
Categorical List
3.2.2. Thiết kế bộ lọc theo phương pháp sử dụng các hàm chức năng:
Như chúng ta đã biết FDATool hỗ trợ thiết kế bộ lọc số bằng rất nhiều hàm chức
năng, Ở đây chúng ta đơn cử hàm firgr và fircband dùng để thiết kế bộ lọc FIR , các
hàm khác chúng ta tiếp cận theo phương pháp tương tự.Chúng ta chỉ đưa ra một ví
dụ tổng quát, từ đó ta làm sáng tỏ cú pháp và ý nghĩa từng thông số của dòng lệnh.
Khi khai thác các hàm này chúng ta cần quan tâm đến các cấu trúc phần tử ở bảng
dưới đây:
74
Bảng 3.5 : Cấu trúc phần tử cho các hàm chức năng.
Cấu trúc phần tử Nội dung
res.order Lọc thứ tự
res.fgrid Vector lưới tần tối ưu trong thiết kế bộ lọc
res.H Đáp tuyến tần số của fgrid
res.error Lỗi điểm trên lưới tần
res.des Đáp tuyến mong muốn tại mỗi điểm trên fgrid
res.wt Trọng số tại mỗi điểm trên fgrid
res.iextr Vector chỉ số fgrid của tần số cực trị
res.fextr Vector của tần số cực trị
res.iterations Số lặp remez cho tối ưu
res.evals Số ước lượng hàm cho tối ưu
res.edgeCheck Những kêt quả bất thường khi kiểm tra_các tính toán
được chỉ định.
1=Ok
0= Chuyển tiếp bất thường
-1= Tình trạng nguy khó
Sau đây là một ví dụ tổng quát minh chứng cho thiết kế bộ lọc khi sử dụng
hàm chức năng : Thiết kế bộ lọc có đáp tuyến “như vuông” Trong ví dụ này chúng
ta thiết kế bộ lọc “53 rd_order” và sử dụng tệp taperedresp.m trong:Matlab
\toolbox\filterdesign\filtdesdemos\ taperedresp.m để thực hiện vector trọng số tạo
lên đáp tuyến cho bộ lọc ta lập trình như sau:
[b,err,res]=firgr(53, [0 0.3 0.33 0.77 0.8 1],...
{'taperedresp',[0 0 1 1 0 0]}, [2 2 1]);
[H,W,S]=freqz(b,1,1024);
S.plot = 'mag'; S.yunits = 'linear';
freqzplot(H,W,S);
75
Các điểm tần số
Vector trọng số tương đối Các điểm cực
Hình 3.5: Thiết kế bộ lọc theo hàm chức năng.
Tương ứng với các điểm tần số là các điểm cực của đáp tuyến mức điện_tần
số của bộ lọc.
Kết quả ta có:
Đáp tuyến mức điện _tần số sau:
76
Hình 3.6 Đáp tuyến biên độ tần số của bộ lọc .
Cú pháp:
b = firgr(N,F,A,S)
ở đây : N,F,A,S là các vector đầu vào tạo nên cấu hình của bộ lọc.Ta có thể liệt
kê các vector đầu vào và ý nghĩa sử dụng của nó ở bảng sau:
Bảng 3.6 : Thông số kỹ thuật của hàm chức năng.
Vector đầu vào Ý nghĩa sử dụng
N Vector hàng b chứa N+1 cột của bộ lọc FIR tương hợp với
vector A và F
F= định nghĩa các điểm tần số đầu vào ở đây có giới hạn từ 0-
1
F (Frequency): tần số/ mẫu
A= Đặt mức điện tương ứng với mỗi điểm tần số
A(gAin): mức điện
S={‘n’ ’n’ ’s’ ’n’ Chỉ rõ điểm tần số tương ứng là bình thường hay là điểm
77
’n’ ’s’’n’’n’ } tần số đơn,ta thấy điểm tần số:0.25 và 0.55 là điểm đơn và
nhận mức điện=0,các điểm tần số còn lại là điểm bình
thường và nhận mức điện =1
n (normal): bình thường
s (single): đơn
Ở trên chúng ta đã nghiên cứu phương pháp thiết kế bộ lọc số khi chúng ta
sử dụng các hàm chức năng để thiết kế. Sau đây chúng ta tiếp tục nghiên cứu thiết
kế bộ lọc sử dụng FDATool.
3.2.3. Thiết kế bộ lọc theo phương pháp sử dụng giao diện của FDATool:
FDATool cho ta một giao diện thiết kế bộ lọc số rất mạnh và thuận tiện cho
người sử dụng, một cái rất hay của nó là ta có thể chuyển đổi từ thiết kế bộ lọc trên
giao diện thành ngôn ngữ lập trình để từ đó ta có thể đóng gói và sử dụng nó trong
những thiết kế phát triển cao hơn.Có thể nói rằng: Thiết kế bộ lọc trên giao diện của
FDATool về mặt chức năng thì gần như giống với thiết kế bộ lọc bằng ngôn ngữ lập
trình trừ một số hàm chức năng đặc biệt mà FDATool không thể có được, bù vào đó
là sự rất trực quan và dễ hiểu. Sau đây ta bắt đầu khởi động cho FDATool:
Từ cửa sổ lệnh của windows ta gõ: FDATool và Eter.
Một giao diện được hiện ra như sau:
78
Hình 3.7 : Giao diện thiết kế của FDATool.
Trên thanh tiêu đề ta có:
File: công cụ cho tệp tin.
Edit: công cụ soạn thảo.
Analysis: công cụ phân tích.
View : công cụ hiển thị.
Window: Tương thích với hệ điều hành Windows.
Help: công cụ trợ giúp
Trong khung:Current filter information (thông tin về bộ lọc):
Store Filter: lưu bộ lọc vào kho.
Filter manager: Quản lý các bộ lọc đã được lưu giữ.
Trong khung: Filter specifications (thuyết minh về bộ lọc).
Trong khung Response type (kiểu đáp ứng) bao gồm các đáp ứng:
lowpass (bộ lọc thông thấp ).
Highpass (bộ lọc thông cao).
79
Bandpass ( bộ lọc thông giải ).
Bandstop ( bộ lọc chặn giải ).
Differentiator (bộ vi phân ).
Trong khung design method (phương pháp thiết kế):cho ta lựa chọn 2 kiểu bộ
lọc đó là bộ lọc IIR và bộ lọc FIR trong từng kiểu này cho ta lựa chọn các phương
thức lọc khác nhau.
Ngoài ra ta còn có các khung như: Filter order (lọc thứ tự)
Frequency Specificatiins (thuyết minh về tần số).
Magnitude Specìications ( thuyết minh về trọng số).
Về nội dung của các khung này chúng ta đã biết khi ta nghiên cứu thiết kế bộ
lọc bằng các hàm chức năng ở mục trước .
3.2.3.1. Thiết kế bộ lọc thông giải:
Như chúng ta biết, để tiết kiệm giải tần thì giải thông âm tần của điện thoại
được quy định từ 0,3Khz đến 3,4Khz. Tín hiệu âm tần (có tần số từ 0 đến 20Khz) sẽ
được lọc trước khi đưa vào vào hệ thống thông tin đa kênh. Vì lý do đó, với
FDATool chúng ta thiết kế bộ lọc thông giải tần là từ 0.3Khz đến 3.4Khz. Trong ví
dụ này chúng ta chọn bộ lọc FIR, các thông số kỹ thuật được ghi trên giao diện:
80
Hình 3.8 Thông số kỹ thuật của bộ lọc thông giải.
Ta thấy rằng bộ lọc cho đáp tuyến mức điện_tần số thực quả là lý tưỏng.
3.2.3.2. Chuyển đổi từ thiết kế trên giao diện FDATool sang dạng thiết
kế bằng hàm chức năng.
Thao tác như sau: Từ giao diện FDATool vào File ---- Generater M_file
xuất hiện giao diện Generate M_file ta ghi tên file và chọn đường dẫn để lưu tệp
tin sau đó chọn: save
Ở đây ta chọn tệp tin tên là Bandpass.m, tệp tin đó như sau:
%function Hd = bandpass
%BANDPASS Returns a discrete-time filter object.
%
% M-File generated by MATLAB(R) 7.0.4 and the Signal Processing Toolbox 6.3.
%
% Generated on: 28-Mar-2008 23:36:01
%
81
% Equiripple Bandpass filter designed using the FIRPM function.
% All frequency values are in Hz.
Fs = 10000; % Sampling Frequency
Fstop1 = 200; % First Stopband Frequency
Fpass1 = 300; % First Passband Frequency
Fpass2 = 3400; % Second Passband Frequency
Fstop2 = 3500; % Second Stopband Frequency
Dstop1 = 0.0001; % First Stopband Attenuation
Dpass = 0.057501127785; % Passband Ripple
Dstop2 = 0.0001; % Second Stopband Attenuation
dens = 20; % Density Factor
% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ...
0], [Dstop1 Dpass Dstop2]);
% Calculate the coefficients using the FIRPM function.
b = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);
fvtool(b)
% [EOF]
Cấu trúc của tệp lệnh này chúng ta đã khá quen thuộc. Ở đây chúng ta chỉ lưu ý
là: Dstop1, Dstop2, Dpass là các các đơn vị không thứ nguyên. Còn ở trong
FDATool chúng có đơn vị là deciben (db).
Chúng ta lấy tệp M_file cho chạy trong của sổ của WINDOWS ta sẽ được đồ
thị
mức điện_tần số pha như sau: (xem trang bên)
Như vậy từ thiết kế trong FDATool ta có thể chuyển chúng về dạng thiết kế
theo hàm chức năng (ta đã xem xét kỹ ở các mục trước) để tiếp tục sử dụng chúng ở
các thiết kế lớn hơn.
82
Hình 3.9 Chuyển thiết kế FDATool sang hàm chức năng.
Hình 3.10 Đáp tuyến biên độ_ tần số pha của bộ lọc thông giải.
3.2.3.3. Chuyển đổi từ thiết kế trên giao diện trên FDATool sang ngôn ngữ
VHDL: Từ giao diện của FDATool ta chọn Targets chọn Generate HDL lúc này
xuất hiện giao diện:
83
Hình 3.11 Phát mã VHDL của FDATool.
Ở filter target language cho phép chúng ta lựa chọn ngôn ngữ cần chuyển đổi
đó là ngôn ngữ VHDL hoặc Verilog
Chọn tên bandpass, chọn thư mục… như trong bảng chọn sau đó chọn
Generate. Khi đó ở F:\luanvan\Tran Thanh Son có 2 tệp tin: Bandpass.vhd và
Bandpass_tb.vhd.
Hai tệp tin này sẽ được dùng trong phần mềm thiết kế WEBPACK_ISE của Xilinx.
Chúng ta sẽ bàn đến vấn đề này ở chương sau.
3.2.4. Phân tích một số cấu trúc của các hàm thông dụng trong thiết kế bộ
lọc:
Do FDATool co rất nhiều hàm và chúng có cấu trúc khác nhau, ở đây ta chỉ
xem xét một hàm các hàm khác phương pháp tiếp cận tương tự.
Cấu trúc của hàm dfilt.dffir
Dùng trong bộ lọc FIR với tín hiệu rời rạc và lọc trực tiếp loại I chính tắc.
84
Cú pháp:
Hd = dfilt.dffir(b)
Hd = dfilt.dffir
Nó có cấu trúc:
Hình 3.12 Cấu trúc của bộ lọc FIR.
Vector cột của nó là:
Z1(1) Z2(1) Z3(1)
Z1(2) Z2(2) Z3(2)
Z1(3) Z2(3) Z3(3)
Cách viết:
b = [0.05 0.9 0.05];
hd=dfilt.dffirt({b});
hq = copy(hd);
hq.arithmetic = 'fixed';
85
3.3 Sự hỗ trợ thiết kế của EDA (phần mềm ISE):
Sù hç trî cña EDA víi thiÕt kÕ lµ rÊt lín, ë ®©y ta chØ ®−a ra h−íng tæng qu¸t
vÒ sù trî gióp cña nã víi thiÕt kÕ, cßn cô thÓ ta sÏ nãi ®Õn ë ch−¬ng sau.
PhÇn mÒm thiÕt kÕ ISE cã kh¶ n¨ng ®−a thiÕt kÕ vμo trong c¸c
PLD (Programmable Logic Device) ®−îc chän lùa còng nh− c¸c b−íc thùc
hiÖn thiÕt kÕ −a dïng. Nh×n chung c¸c b−íc tiÕn hμnh thiÕt kÕ cho FPGA
vμ CPLD lμ gièng nhau, ng−êi thiÕt kÕ cã thÓ nhËp vμo mét thiÕt kÕ d−íi
d¹ng mét s¬ ®å hoÆc d¹ng HDL (VHDL, Verilog, hoÆc ABEL). Mét thiÕt
kÕ cã thÓ bao gåm c¶ d−íi d¹ng s¬ ®å vμ HDL. PhÇn mÒm ISE ®−îc kÕt
hîp víi bé m« pháng MXE ®−a ra kh¶ n¨ng m« pháng vμ kiÓm tra chøc
n¨ng cña VHDL.
Bé m« pháng MXE ®−a ra mét biÓu ®å kiÓm tra, nã cho phÐp ng−êi
dïng ®−a ra c¸c mÉu thö ®Ó test c¸c chøc n¨ng trong qu¸ tr×nh tæng hîp
(®−îc gäi lμ TestBencher). Qu¸ tr×nh tæng hîp mét thiÕt kÕ ®−îc thùc
hiÖn theo c¸c b−íc d−íi ®©y.
1. Translate - DÞch thiÕt kÕ vμ cho ch¹y kiÓm tra theo qui luËt
thiÕt kÕ .
2. Map - TÝnh to¸n vμ cÊp ph¸t tμi nguyªn trong thiÕt bÞ ®Ých.
3. Place and Route - X¾p ®Æt c¸c khèi logic, ®Þnh cÊu h×nh phï hîp
víi c¸c vÞ trÝ logic vμ sö dông c¸c tμi nguyªn ®Þnh tuyÕn .
4. Generate Programming File - t¹o ra dßng c¸c bit ch−¬ng tr×nh
(T¹o file.Bit).
C¸c c«ng cô phÇn mÒm tæng hîp thiÕt kÕ cña ISE :
* ViÖc nhËp thiÕt kÕ cã vμi c¸ch kh¸c nhau vμ c«ng cô ®Ó tæng hîp
thiÕt kÕ chÝnh lμ tæng hîp m· nguån ®−îc viÕt d−íi d¹ng VHDL, Verilog,
86
ABEL sang d¹ng file netlist. C¸c thiÕt kÕ d−íi d¹ng s¬ ®å ®−îc chuyÓn
®æi sang m· nguån VHDL hoÆc Verilog mμ c¸c m· nguån nμy ®−îc tæng
hîp b»ng XST theo d¹ng th«ng th−êng.
* StateCAD lμ mét c«ng cô phÇn mÒm cho phÐp nhËp thiÕt kÕ d−íi
d¹ng ®å ho¹ theo nhãm c¸c tr¹ng th¸i, nhãm c¸c tr¹ng th¸i nμy sÏ ®−îc
dÞch ra HDL vμ ®−îc ®Ýnh vμo trong phÇn mÒm ISE.
* Bé m« pháng MXE cã thÓ ®−îc sö dông cho viÖc m« pháng c¶ vÒ
thêi gian vμ chøc n¨ng .
* HDL Bencher : T¹o ra c¸c biÓu ®å kiÓm tra cho phÐp m« pháng
thiÕt kÕ ë d¹ng test.
* Implemention : C«ng cô thùc thi nμy cã mét vμi b−íc vμ sÏ ®−îc
giíi thiÖu kü h¬n trong c¸c phÇn sau th«ng qua c¸c vÝ dô cô thÓ .
* iMPACT Programmer : Modul nμy cho phÐp n¹p ch−¬ng tr×nh vμo
thiÕt bÞ ®Ých ( Lóc nμy c¸p JTAG cÇn ph¶i ®−îc nèi víi cæng song song
cña m¸y tÝnh. )
* CHIP VIEWER : C«ng cô nμy ®−îc sö dông ®Ó kiÓm tra thiÕt kÕ
sau khi ®· thùc thi cÊu h×nh, chØ ra viÖc kÕt nèi gi÷a c¸c ch©n cña thiÕt
bÞ .
* Xpower : Cho phÐp tÝnh to¸n kh¶ n¨ng tiªu thô nguån cña thiÕt kÕ
khi ch¹y trong thiÕt bÞ ®Ých .
87
CHƯƠNG 4
THIẾT KẾ BỘ LỌC TÍN HIỆU SỐ DẠNG FIR
Ở chương này chúng ta sẽ đi thiết kế và hiện thực hoá một bộ lọc số dạng
FIR theo quan điểm “Mô hình hoá đối tượng”.Qua đó chúng ta sẽ hiểu rõ hơn về
phương pháp thiết kế thiết kế theo mô hình hoá đối tượng (MBD) mà ở chương
trước chúng ta đã đề cập. Để đưa ra được một cấu hình tổng quát cho bộ lọc FIR
chúng ta đi vào xem xét kết cấu của bộ lọc FIR.
4.1 Kết cấu cho các kiểu lọc tần số dạng FIR:
Để đưa ra được nét chung nhất mang tính tổng quát của các bộ lọc FIR,
chúng ta đi vào xem xét đặc tính xung của chúng:
Giống như các bộ lọc tín hiệu tương tự, bộ lọc số là mạch thực hiện chức
năng chọn lọc tín hiệu theo tần số. Các mạch lọc số cho tín hiệu số có phổ nằm
trong một dải tần số nhất định đi qua và không cho các tín hiệu có phổ nằm ngoài
dải tần số đó đi qua.
Dải tần số mà mạch lọc cho tín hiệu đi qua được gọi là dải thông, còn dải tần
số mà mạch lọc không cho tín hiệu đi qua được gọi là dải chặn. Tần số phân cách
giữa dải thông và dải chặn là tần số cắt và được ký hiệu là ωc . Theo dạng của đặc
tính biên độ tần số ⏐H(ejω)⏐, người ta chia các bộ lọc số thành các loại :
- Bộ lọc thông thấp, có dải thông ),( 0 cωω ∈ .
- Bộ lọc thông cao, có dải thông ),( ∞∈ cωω .
- Bộ lọc dải thông, có dải thông ),( 21 cc ωωω ∈ .
- Bộ lọc dải chặn, có dải thông ),( 10 cωω ∈ và ),( 2 ∞∈ cωω .
4.1.1. Bộ lọc thông thấp lý tưởng:
* Bộ lọc thông thấp lý tưởng có đặc tính biên độ tần số khi ω ∈ (-π , π ) như sau :
⎩⎨
⎧
∈−−∈
−∈=
][][0
][1
)( ππ
ω
,ωωω,ωKhi
ω,ωωKhi
e
cc
ccj
lpH vμ
(4.1)
Đặc tính biên độ tần số của bộ lọc thông thấp lý tưởng ở hình 4.1.
88
)( ωjlp eH
ω
-π -ωc 0 ωc π
Hình 4.1 : Đặc tính biên độ tần số của bộ lọc thông thấp lý tưởng.
*Đặc tính xung hlp(n) của bộ lọc thông thấp lý tưởng
Xét bộ lọc thông thấp lý tưởng pha tuyến tính αωωθ −=)( , đặc tính tần số
của nó có dạng :
⎪⎩
⎪⎨⎧ ∈−−∈
−∈=
−
][][
][
)(
0 ππ
αωω
,ωωω,ωKhi
ω,ωωKhie
e
cc
cc
j
j
lpH
vμ
(4.2)
Đặc tính xung hlp(n) của bộ lọc trên được xác định bằng IFT :
[ ] ∫
−
==
π
π
ωωω ωπ deeeIFTnh
njj
lp
j
lplp HH )()()( 2
1
c
c
c
c
njnjj
lp enj
deenh
ω
ω
αω
ω
ω
ωαω
αω ππ −
−
−
−
−== ∫ )()()( 12121
)(
)](sin[
)(
)](sin[
)( αω
αωω
α
αω
ππ −
−=−
−=
n
n
n
n
nh
c
ccc
lp (4.3)
Theo (4.3), bộ lọc thông thấp lý tưởng pha tuyến tính có đặc tính xung hlp(n)
dạng hàm sin giảm dần về 0 khi n → ± ∞ . Tại n = 0 có :
ππ
ω
αω
αωω c
c
cc
nlpnlp n
n
LimnhLimh =⎥⎦
⎤⎢⎣
⎡
−
−==
→→ )(
)](sin[
)()(
00
0
Đặc tính xung hlp(n) đạt cực đại tại n = 0 , và 0)( =nhlp tại các điểm ckn ωπ= ,
với k là số nguyên.
4.1.2. Bộ lọc thông cao lý tưởng
* Bộ lọc thông cao lý tưởng có đặc tính biên độ tần số khi ω ∈ (-π , π ) như sau :
1
89
⎩⎨
⎧
−∈
∈−−∈=
][0
][][1
)(
cc
ccj
hp ω,ωωKhi
,ωωω,Khi
eH
ππωω vμ (4.4)
Đồ thị đặc tính biên độ tần số của bộ lọc thông cao lý tưởng ở hình 4.2.
)( ωjhp eH
ω
-π -ωc 0 ωc π
Hình 4.2 : Đặc tính biên độ tần số của bộ lọc thông cao lý tưởng.
* Đặc tính xung hhp(n) của bộ lọc thông cao lý tưởng
Xét bộ lọc thông cao lý tưởng pha tuyến tính αωωθ −=)( , đặc tính tần số của
nó có dạng :
⎪⎩
⎪⎨⎧ −∈
∈−−∈=
−
][0
][][
)(
cc
cc
j
j
hp
ω,ωωKhi
,ωωω,ωKhie
eH
ππαωω vμ (4.5)
Vì dải thông và dải chặn của bộ lọc thông cao ngược với bộ lọc thông thấp,
nên có thể biểu diễn Hhp(ejω) qua Hlp(ejω) như sau :
)()( 1 ωω jlpjhp ee HH −= (4.6)
Theo (4.6) có thể tìm được đặc tính tần số của bộ lọc thông cao từ đặc tính
tần số của bộ lọc thông thấp có cùng tần số cắt.
Đặc tính xung hhp(n) của bộ lọc trên được xác định bằng IFT :
[ ] [ ]∫
−
−==
π
π
ωωω ωπ deeeIFTnh
njj
lp
j
hphp HH .)()()( 12
1
∫ ∫
− −
−−=
π
π
ω
ω
ωαωω ωω ππ
c
c
deedenh njjnjhp 2
1
2
1)(
c
c
njnj
hp enj
e
jn
nh
ω
ω
αωπ
π
ω
αππ −
−
− −−=
)(
)(
)( 1
2
11
2
1
)(
)](sin[).sin()(
. α
αω
ππ
π
−
−−=
n
n
n
nnh chp
1
90
Hay :
)(
)](sin[).sin(
)(
. αω
αωω
ππ
π
−
−−=
n
n
n
nnh
c
cc
hp (4.7)
Vì : )(.
).sin(
.
).sin(
00
01
n
n
n
nKhi
nKhi
n
n δπ
π
π
π =⇒
⎩⎨
⎧
≠
== (xung đơn
vị_Dirac)
Nên có thể viết lại (4.7) dưới dạng :
)(
)](sin[
)(
)sin(
)()(
. αω
αωωδωδ ππ −
−−=−=
n
n
n
n
n
nnh
c
ccc
hp (4.8)
So sánh (4.6) với (4.7), có thể biểu diễn đặc tính xung hhp(n) của bộ lọc
thông cao qua đặc tính xung hlp(n) của bộ lọc thông thấp :
)()()( nhnnh lphp −= δ (4.9)
Từ đó ta có thể tìm được đặc tính xung hhp(n) của bộ lọc thông cao từ
đặc tính xung hlp(n) của bộ lọc thông thấp có cùng tần số cắt ωc .
Đặc tính xung hhp(n) của bộ lọc thông cao lý tưởng là dãy chẵn, đối xứng qua
trục tung và đạt cực đại tại n = 0. Khi tần số cắt Nc πω = thì đặc tính xung hhp
(kN) = 0 tại các điểm n = kN, với k là số nguyên.
4.1.3 Bộ lọc dải thông lý tưởng
*Bộ lọc dải thông lý tưởng có đặc tính biên độ tần số khi ω ∈ (-π , π ) như sau :
⎩⎨
⎧ ∈−−∈=
n.trªngkho¶c¸cngoμin»m
vμ
ωKhi
ω,ωωω,ωωKhi
e ccccjbpH 0
][][1
)( 2121ω (4.10)
Đồ thị đặc tính biên độ tần số của bộ lọc dải thông lý tưởng ở hình 4.3.
)( ωjbp eH
-π -ωc1 -ωc2 0 ωc1 ωc2 π ω
Hình 4.3 : Đặc tính biên độ tần số của bộ lọc dải thông lý tưởng.
1
91
*Đặc tính xung hbp(n) của bộ lọc dải thông
Xét bộ lọc dải thông lý tưởng có pha tuyến tính αωωθ −=)( , đặc tính tần số
của nó có dạng :
⎪⎩
⎪⎨
⎧ ∈−−∈=
−
n.trªngkho¶c¸cngoμin»m
vμ
ωKhi
ω,ωωω,ωωKhie
e cccc
j
j
bpH
0
][][
)( 2121
αω
ω (4.11)
Có thể biểu diễn Hbp(ejω) qua đặc tính tần số Hlp1(ejω) và Hlp2(ejω) của các bộ
lọc thông thấp lý tưởng có tần số cắt ωc1 và ωc2 tương ứng :
)()()( 12 ωωω jlpjlpjbp eee HHH −= (4.12)
Theo (4.12) có thể tìm được đặc tính tần số của bộ lọc dải thông có tần số cắt
ωc1 và ωc2 , từ đặc tính tần số của hai bộ lọc thông thấp có tần số cắt ωc1 và ωc2
tương ứng.
Đặc tính xung hbp(n) của bộ lọc trên được xác định bằng IFT :
[ ] [ ]∫
−
−==
π
π
ωωωω ωπ deeeeIFTnh
njj
lp
j
lp
j
bpbp HHH .)()()()( 122
1
∫∫
−
−
−
− −=
1
1
2
2
2
1
2
1)(
c
c
c
c
deedeenh njjnjjbp
ω
ω
ωαω
ω
ω
ωαω ωω ππ
)(
)](sin[
)(
)](sin[
)(
..
12
α
αω
α
αω
ππ −
−−−
−=
n
n
n
n
nh ccbp (4.13)
)(
)](sin[
)(
)](sin[
)(
1
11
2
22
αω
αωω
αω
αωω
ππ −
−−−
−=
n
n
n
n
nh
c
cc
c
cc
bp (4.14)
Hay : )()()( 12 nhnhnh lplpbp −= (4.15)
Ta có thể tìm được đặc tính xung hbp(n) của bộ lọc dải thông theo đặc tính
xung hlp1(n) và hlp2(n) của các bộ lọc thông thấp có tần số cắt ωc1 và ωc2 tương ứng.
4.1.4. Bộ lọc dải chặn lý tưởng
* Bộ lọc dải chặn lý tưởng có đặc tính biên độ tần số khi ω ∈ (-π , π ) như sau :
⎩⎨
⎧ ∈−−∈=
ntrªngkho¶c¸cthuéckh«ng
vμ
ωKhi
ω,ωωω,ωωKhi
e ccccjbsH 1
0 ][][
)( 2121ω (4.16)
92
Đồ thị đặc tính biên độ tần số của bộ lọc dải chặn lý tưởng ở hình 4.4.
)( ωjbpH e
-π -ωc1 -ωc2 0 ωc1 ωc2 π ω
Hình 4.4: Đặc tính biên độ tần số của bộ lọc dải chặn lý tưởng.
* Đặc tính xung hbs(n) của bộ lọc dải chặn lý tưởng
Xét bộ lọc dải chặn lý tưởng pha tuyến tính αωωθ −=)( , đặc tính tần số của
nó có dạng :
⎩⎨
⎧ ∈−−∈= − ntrªngkho¶c¸cthuéckh«ng
vμ
ωKhie
ω,ωωω,ωωKhi
e j
ccccj
bsH αω
ω ][][)( 2121
0
(4.16)
Có thể biểu diễn Hbs(ejω) qua đặc tính tần số Hlp1(ejω) và Hlp2(ejω) của các bộ
lọc thông thấp lý tưởng có tần số cắt ωc1 và ωc2 như sau :
)()()( 121
ωωω j
lp
j
lp
j
bs eee HHH +−= (4.17)
Theo (5.1-19) có thể tìm được đặc tính tần số của bộ lọc dải chặn có các tần
số cắt ωc1 và ωc2 từ đặc tính tần số của hai bộ lọc thông thấp có tần số cắt ωc1 và ωc2
tương ứng.
Biểu diễn Hbs(ejω) qua đặc tính tần số Hbp(ejω) của bộ lọc dải thông:
)()( 1 ωω jbpjbs ee HH −= (4.18)
Ta có thể tìm được đặc tính tần số của bộ lọc dải chặn có các tần số cắt ωc1
và ωc2 , từ đặc tính tần số của bộ lọc từ hai bộ lọc thong thấp có tần số cắt tương
ứng.
Đặc tính xung hbs(n) của bộ lọc trên được xác định bằng IFT :
[ ] [ ]∫
−
+−==
π
π
ωωωω ωπ deeeeIFTnh
njj
lp
j
lp
j
bsbs HHH .)()()()( 1212
1
1
93
∫∫∫
−
−
−
−
−
+−=
1
1
2
2
2
1
2
1
2
1)(
c
c
c
c
deedeedenh njjnjjnjbs
ω
ω
ωαω
ω
ω
ωαω
π
π
ω ωωω πππ
1
1
2
2
)()(
)()(
)( 1
2
11
2
11
2
1 c
c
c
c
njnjnj
bs enj
e
nj
e
jn
nh
ω
ω
αωω
ω
αωπ
π
ω
αα πππ −
−
−
−
− −+−−=
)(
)](sin[
)(
)](sin[)sin(
)( 12
.
.
α
αω
α
αω
πππ
π
−
−+−
−−=
n
n
n
n
n
nnh ccbs (4.19)
)]([
)](sin[
)(
)](sin[
.
)sin(
)(
1
11
2
22.
αω
αωω
αω
αωω
πππ
π
−
−+−
−−=
n
n
n
n
n
nnh
c
cc
c
cc
bs (4.20)
Hay : )()()()( 12 nhnhnnh lplpbs +−= δ (4.21)
Hoặc : )()()( nhnnh bpbs −= δ (4.22)
Ta có thể tìm được đặc tính xung hbp(n) của bộ lọc dải chặn khi biết đặc tính
xung hlp1(n) và hlp1(n) của các bộ lọc thông thấp tương ứng. Theo (4.22) có thể tìm
được đặc tính xung hbs(n) của bộ lọc dải chặn khi biết đặc tính xung hbp(n) của bộ
lọc dải thông tương ứng.
4.1.5 Nhận xét:
Qua phân tích đặc tính xung h(n) của tất cả các bộ lọc FIR từ thông thấp,
thông cao, thông giải, chặn giải ta có thể nhận xét chung là: Tất cả các bộ lọc dạng
FIR đều có thể được xây dựng từ bộ lọc thông thấp.Như vậy ta có thể xây dựng
một cấu hình tổng quát chung cho tất cả các bộ lọc số, sự khác nhau giữa các bộ lọc
như thông thấp, thông cao, thông giải, chặn giải chỉ là hệ số nhân của các mắt giữ
chậm và phương thức lập (convert) tín hiệu của từng mắt.Việc thông giải tần số nào
và loại bỏ giải tần số nào với bộ lọc FIR ta phải nắm chắc chúng cả về biên độ và
tần số của chúng mà xác lập tần số lấy mẫu(Fs) cho phù hợp. Có phương pháp xác
lập các hệ số và tần số lấy mẫu một cách hoàn toàn tự động như trong bộ lọc thích
nghi, song do chủ hướng của đề tài và thời gian có hạn mà chúng ta không đề cập
vấn đề đó ở đây.
4.2 Cấu hình tổng quát của bộ lọc FIR:
Như chúng ta đã đề cập ở trên: Tất cả các bộ lọc dạng FIR đều có chung một
cấu hình tổng quát. Sau đây chúng ta xem xét vấ đề này:
94
Cấu hình tổng quát của bộ lọc FIR:
Hình 4.5 Cấu hình tổng quát của bộ lọc FIR đáp ứng xung hữu hạn.
Trong hình 4.5: Z 1− là các mắt giữ chậm
Bo đến B(N-1) là các hệ số nhân tương ứng với các mắt giữ chậm.
Convert: phương thức lập tín hiệu từ mắt giữa chậm này đến mắt giữ chậm
tiếp theo phụ thuộc dạng dữ liệu và dạng bộ lọc.
Các hệ số nhân và phương thức lập tín hiệu (convert) sẽ quyết định đến đặc
tính xung của bộ lọc.Phương thức lập tín hiệu phụ thuộc vào các công thức (4.1.3),
(4.8), (4.14), ( 4.20) tương ứng cho từng loại bộ lọc mà ta đã xét ở mục 4.1 và dạng
dữ liệu truyền của chúng. Ở đây chú ý rằng đặc tính xung được xét trong phổ tần từ
1−z
Convert
0
+B0
1−z +B1
Convert
1
1−z +
Convert
N-1
B(N-1)
X(n)
Y(n)
95
0 đến 2pi đây là đặc tính tần số pha.Nó có giá trị trong khoảng từ -∏ đến +∏ còn
ngoài khoảng đó nó có giá trị bằng 0. Tần số thực của bộ lọc phụ vào tần số lấy mẫu
Fs và công thức tổng quát của bộ lọc FIR đáp ứng xung hữu hạn là:
∑−
=
−=
1
0
)()()(
N
N
k
kk nxhny (4.23)
Viết cách kháclà:
)()(...)(.)()()()( 11110 +−−++−+= NN nxhnxhnxhny NNN (4.24)
Từ những quan điểm ở trên chúng ta sẽ đi tổng hợp hệ thống theo phương pháp mô
hình hoá đối tượng mà tổng quan của nó ta đã xét ở mục 3.1 của chương trước.
4.3 Tổng hợp hệ thống theo phương pháp mô hình hoá đối tượng:
Ở mục này chúng ta đi thiết kế một hệ thống xử lý tín hiệu (đơn giản) tuân theo
thứ tự các bước và quan điểm của phương pháp mô hình hoá đối tượng (MBD) đề
xuất.
4.3.1 Giả thiết kỹ thuật:
Chúng ta biết rằng: Phổ tần của tiếng nói con người có năng lượng tập chung
trong khoảng tần số từ 0.8Khz đến 1.7Khz để có thể nhận dạng rõ giọng nói của
từng người thì tiêu chuẩn giải thông điện thoại là từ 0.3Khz đến 3.4Khz. Giả sử do
một nguyên nhân nào đó mà tín hiệu âm tần này bị nhiễu tạp nặng nề khiến thiết bị
đầu cuối (của hệ thống truyền thông) không còn nhận dạng ra giọng nói của thiết bị
đầu đầu nữa.Bằng các biện pháp kỹ thuật người ta xác định được :
N% =
max
max
Us
Un 100% = 50%
Và năng lượng nhiễu nằm rải rác trong giải tần từ 10Khz đến 100Khz.
Nhiệm vụ phải thiết kế bộ lọc để loại bỏ nhiễu tạp trên ra khỏi nguồn tín hiệu với
tiêu chuẩn nhiễu tạp cho phép: 5% ≤ N% ≤ 10% trước khi đưa vào hệ thống
truyền thông.
96
4.3.2. Thiết kế bộ lọc số đáp ứng xung hữu hạn theo phương pháp MBD.
4.3.2.1. Những thuyết minh chính cho thiết bị (Executable specifications):
Xây dựng sơ đồ khối chức năng:
Hình 4.5 Sơ đồ khối chức năng của hệ thống.
Để hiện thực bộ lọc nhằm phục vụ yêu cầu kỹ thuật trên, trước hết ta xây
dựng chúng trên hệ mô phỏng.
Nhiệm vụ của các khối như sau:
Khối tạo tín hiệu hình sin có tần số 1Khz đại diện cho tín hiệu âm tần (0.3Khz
– 3.4Khz).
Khối tạo nhiễu ngẫu nhiên có phổ tần dải rác từ 10Khz – 100Khz.
Bộ cộng có nhiệm vụ cộng tín hiệu với nhiễu, kết quả sau bộ cộng là tín hiệu
âm tần bị xuyên nhiễu tác động (đúng với yêu cầu kỹ thuật ban đầu đề ra).
Bộ lọc FIR có nhiệm vụ chọn lọc tần số âm tần và gạt bỏ nhiễu tạp.
Khối hiển thị cho phép hiển thị tối đa kết quả dạng sóng của các điểm kiểm
tra.
Giao chỉ tiêu kỹ thuật cho các khối:
* Khối phát sóng sin (đại diện cho tín hiệu âm tần):
Amp : 10 (đơn vị biên độ)
T(m) : 1/100 000 (sec)
Frequency : 1Khz
Phase offset : 0.7Rad
GENERATOR
FUNCTION
1Khz
NOISE
10Khz -100Khz
+
FIR_FILTER
Fpass≤ 3,4khz.
Fstop≥ 3.6 khz
DIS
PLAY
97
* Khối tạo sóng nhiễu ngẫu nhiên:
Amp : 5 (đơn vị biên độ).
T(m) : 1/100 000 (sec).
Source type : Gaussion.
Method : Zigurat.
Mean : 1
Variance : 1
Initial seed : 1302.
* Khối bộ lọc FIR:
- Chọn bộ lọc FIR thông thấp giải thông (Fpass) ≤ 3,4khz.
giải chặn (Fstop) ≥ 3.6 khz.
Tần số lấy mẫu = 10khz
- Mức điện giải thông (Againpass) : 1db (deciben)
- Mức điện giải chặn (againstop) : -80db
- Số điểm phân tích (order) : 127
- Chiều dài từ hệ số nhân(coefficients) : 16bit
- Số bit dữ liệu đầu vào : 8bit
- Số bit dữ liệu đầu ra : 8bit
- Thanh ghi tổng có chiều dài : 16bit
- Tổng tích luỹ cho phép : 32bit
* Khối hiển thị:
- Hiển thị tín hiệu dưới dạng lượng tử.
- Đáp ứng tín hiệu theo quan hệ: biên độ_thời gian.
- Hiển thị 4 điểm cần kiểm tra:
Tín hiệu Sin.
Tín hiệu nhiễu.
Tín hiệu tổng: Sin + nhiễu.
Tín hiệu sau khi lọc.
98
4.3.2.2. Thiết kế và mô phỏng thiết kế (Design with simulation):
Trong phần này ta có nhiều phương pháp thực hiện ví dụ như: Sử dụng các
khối chức năng viết sẵn của Trung tâm sở hữu trí tuệ IP (đã giới thiệu ở chương 2),
sử dụng các lõi (core) viết sẵn theo mục tiêu của các phần mền chuyên dụng cho xử
lý tín hiệu.v.v. Song ở đây theo chủ hướng của đề tài chúng ta sử dụng công cụ
phần mềm
MATLAB.
*.Thiết kế bộ lọc FIR thông thấp:
Từ giao diện của MATLAB ta chọn:
Start > Toolboxes > Filter design HDL Coder > Filter design_Analyses
Tool (Fdatool).
Khi đó ta được giao diện của Fdatool như sau:
Hình 4.6 Giao diện của FDATool.
Ta thiết lập các thông số .. sau đó chọn Design Filter như hình vẽ sau thể hiện:
99
Hình 4.7 Thông số của bộ lọc FIR thông tần thấp.
Đây là chương trình tự động thiết kế của MATLAB. Nhìn vào đáp tuyến
biên độ tần số của bộ lọc chúng ta thấy rằng: đây là đáp tuyến của bộ lọc thông tần
thấp đã được MATLAB tối ưu hoá, đáp tuyến trên quả là lý tưởng.Chúng ta ghi lại
kết quả của thiết kế này với File tên là: lowpass.fda.
*.Mô phỏng thiết kế:
Để mô phỏng được thiết kế này chúng ta chuyển thiết kế này thành khối
chức năng sử dụng trong Simulink, thao tác như sau:
Trước hết ta đặt các thông số lượng tử của bộ lọc theo giao diện của:
Set quantization parameters. Khi đó giao diện hiện lên .. và ta chọn các thông số
như hình dưới đây thể hiện:
100
Hình 4.8 Chọn chế độ dữ liệu vào ra cho bộ lọc.
Ở đây ta cần chọn các thông số như hệ số nhân, các thông số dữ liệu vào ra,
cấu trúc thanh ghi, và giải thuật số học cho bộ lọc.
Sau khi đã chọn các tham số phù hợp với yêu cầu kỹ thuật của bộ lọc, lúc này
chúng ta chuyển toàn bộ thiết kế sang dạng khối chức năng để mô phỏng trong
Simulink như sau:
Từ giao diện chính ta chọn Realize model như sau:
101
Nháy đúp vào biểu tượng. Khi đó giao diện hiện ra như hình dưới:
Hình 4.9 Chọn chế độ phát khối chức năng mô phỏng.
Ở đây ta đặt tên khối chức năng là: lowpass và chúng ta cần chọn các yêu cầu
băng cách tích vào các ô yêu cầu với khối chức năng như hình vẽ thể hiện.Sau đó ta
chọn: Realize model.
Khi đó MATLAB sẽ cho phép ta làm việc với Simulink và đã được chọn trước khối
chức năng của bộ lọc lowpass.
102
Hình 4.10 Chọn chế độ cho khối mô phỏng.
Hình 4.11 Khối chức năng mô phỏng trong Simulink.
Trong môi trường của Simulink dễ dàng chọn các thông số kỹ thuật cho khối tạo tín
hiệu Sin và khối tạo nhiễu cũng như khối hiển thị như ở hình sau:
103
Hình 4.12 : Thiết lập hệ thống mô phỏng trong Simulink.
Các thông số kỹ thuật của khối phát Sin và khối tạo nhiễu được hiển thị theo bảng
chọn:
Hình 4.13 : Xác lập các thông số các khối trong mô phỏng.
Trong môi trường simulink ta cho chạy mô phỏng. Kết quả mô phỏng được
hiển thị ở Scope như sau:
Dạng sóng thể hiện từ dưới lên như sau:
- Tín hiệu Sin lượng tử.
104
- Tín hiệu nhiễu lượng tử.
- Tổng của tín hiệu Sin + nhiễu.
- Tín hiệu Sin lượng tử sau bộ lọc.
-
Hình 4.14 Dạng sóng của các điểm test trong hệ thống.
Nhận xét: Nhìn vào dạng sóng của tín hiệu đầu ra so với dạng sóng của tín
hiệu đầu vào của bộ lọc ta thấy tín hiệu đầu ra hoàn toàn đáp ứng được so với yêu
cầu kỹ thuật đã được đề ra cho bộ lọc.Thiết kế này hoàn toàn có thể đưa vào để hiện
thực hoá trong FPGA.
4.3.3.Hiện thực hoá và mã để hiện thực hoá (Implementation with code
generation):
Để hiện thực hoá trên FPGA , MATLAB có phần mềm hỗ trợ tương tác với
Xilinx, nó cho phép phát ra ngôn ngữ VHDL, hệ số Coefficient để dùng trong
Xilinx ISE. Ở đây ta đề cập đến ngôn ngữ VHDL.
Sin (sau lọc)
Sin + Nhiễu
Nhiễu
Phát Sin
105
4.3.3.1. Phát mã VHDL để hiện thực hoá trên FPGA:
Từ giao diện chính của FDATool chọn: Targets > Generate HDL
Khi đó giao diện hiện ra và ta chọn tệp tin là lowpass như sau:
Hình 4.15 : Phát mã VHDL sử dụng trong Xilinx.
Matlab cho phép phát ra hai loại mã là: Test Bench và VHDL đó là:
filter.vhd.
Filter_tb.vhd.
106
Chọn HDL Options và ta khai báo như các hình sau đây:
Hình 4.16 Các khai báo cho chế độ phát mã VHDL.
Chọn Apply sau đó chọn OK để quay chở lại giao diện chính của Generate HDL sau
đó nháy đúp vào Generate, khi đó Matlab sẽ phát hai file là: filter.vhd và
107
filter_tb.vhd, chúng đã sẵn sàng kết hợp với phần mềm WEBPACK ISE của
Xilinx,và đảm bảo chắc chắn khả năng hiện thực hoá trên FPGA vì chúng đã được
kiểm nghiệm trên phần mềm mô phỏng Simulink. Chúng ta chuyển hai filer này
sang cho Xilink thực hiện.
4.3.3.2. Hiện thực hoá trên FPGA:
Mở phần mềm WEBPACK ISE như sau:
Start > Allprograms > Xilinx ISE 7.1i > Project Navigator.
Từ giao diện chính của Project Navigator chọn:
File > New Project.
Khi đó giao diện New Project hiện ra, ta đặt tên và chọn như sau: Đặt tên project là:
locnhieu có đường dẫn: F:\LUANVAN_CH\locnhieu. Sau đó ta chọn Next.
Giao diện hiện ra sau đó ta add hai filter vừa dược tạo ra vào ta được giao diện
như sau:
Hình 4.17 Giao diện của Xilinx.
Ta chọn filter.vhd và nháy kép vào Implement Design trong cửa sổ
Processes for source khi đó ta được bảng test tổng hợp như hình sau:
108
Hình 4.18 Các test của Xinlinx.
Đến đây ta đã có thể hiện thực hoá bộ lọc, song như vậy việc kiểm tra bộ lọc
trong chế độ thực là khó vì chúng ta phải có máy phát sin và thiết bị tạo nhiễu số. Vì
vậy ta tạo thêm bộ đếm lên 8bit để đưa vào bộ lọc và sẽ kiểm tra tín hiệu sau bộ lọc
từ đó ta có thể nhận xét được khả năng làm việc của bộ lọc mà ta vừa thiết kế. Công
việc này ta tiến hành như sau:
Từ Project ta chọn new source và đặt tên là count.vhd. Ta viết ngôn ngữ cho bộ
đếm sau chạy check syntax ta được kết quả như hình dưới đây:
109
Hình 4.19 Tạo Modul counter.
Ta tạo file count_tb.tbw để kiểm tra bộ đếm, Chú ý rằng xung clk của bộ đếm
và xung clk của bộ lọc phải trùng nhau và sau này sẽ là xung clk của hệ thống.Dạng
sóng của bộ đếm và dạng sóng của bộ lọc được hiển thị như các hình sau:
Hình 4.20 Dạng sóng của counter.
110
Hình 4.21 Dạng sóng của Filter.
Bây giờ ta tạo file top.sch để kết hợp hai modul: counter và Filter này lại.
Trước tiên ta chuyển hai File count.vhd sang count.sch.và File filter.vhd sang
filter.sch. sau đó kết nối chúng với nhau như thể hiện hình sau:
Hình 4.22 Tạo hệ thống trong SCH.
Để kiểm tra sự kết nối giữa hai modul này ta chọn top.sch sau đó chạy
Implement design để kiểm tra kết quả phải được test bằng dấu xanh như sau:
111
Hình 4.23 Kiểm tra khả năng hiện thực hoá của hệ thống.
Đến đây thiết kế của ta đảm bảo chắc chắn sẽ thực hiện được trên FPGA
Spartan-3 xc3s200. Công việc tiếp theo của ta là gán chân cho thiết bị. Để có thể
gán chân đúng trên board Spartan-3 chúng ta phải có hướng dẫn về nó.Chúng ta có
thể truy cập trang WEB: www.xilinx.com để đọc tài liệu hướng dẫn về board:
Spartan-3 Starter Kit board User Guide. Ở đây Xilinx đã cho sẵn một số core viết
bằng VHDL rất tiện dụng như: VHD cho cổng nối tiếp UART rs232, ps/2 .v.v.
Sơ đồ khối của Spartan-3 mà tài liệu hướng dẫn như sau:
112
Hình 4.24 Sơ đồ khối của Board Spartan-3_xc3s200.
Dựa vào các cổng I/O ta gán chân như bảng sau:
Hình 4.25 Gán chân cho thiết kế.
Ở đây ta dùng xung clock của board Spartan-3 ( clk gán với chân T9 thuộc
Bank4).
4.3.4. Thử nghiệm và kiểm tra (Continuous test and Verification):
4.3.4.1. Tải cấu hình xuống FPGA: Kích chuột phải vào Generate
Programming File và kích vào Properties trong tab Startup Option, phải đảm bảo
rằng clock khởi động phải được đặt là JTAG Clock, nhấn OK, Kích đúp vào
113
Generate Programming File, thao tác này sẽ tạo ra File “ . bit” dùng trong nạp
chương trình iMPACT.
Mở công cụ Generate Programming File kích đúp vào Configure Device
(iMPACT), (Lúc này phải đảm bảo rằng cáp JTAG đã được nối với PC).Nếu như
các thong số trong thiết kế không được tự động đưa vào từ công cụ IES thì chúng ta
kích chuột phải vào cửa sổ của iMPACT rồi chọn Ađ Xilinx Device, đưa đường dẫn
của thiết kế và chọn File top.bit sau đó kích vào biểu tượng của thiết bị.
Từ Menu Operation chọn Program, sau đó sẽ được thông báo việc tải cấu hình
xuống FPGA đã thành công. Tuy nhiên với Board Spartan-3 bạn cần lưu ý khi nạp
chương trình, vì trên nó bao gồm một Flash Rom nối tiếp bạn cần đáp ứng một số
câu hỏi mà chươpng trình yêu cầu.
4.3.4.2. Kiểm tra khả năng làm việc của bộ lọc:
Tại đầu ra filter_out (8bit) ta có thể cho kết nối với bộ chuyển đổi DAC, tín hiệu sau
DAC ta có thể kiểm tra bằng máy hiện sóng.
Nếu chúng ta có thiết bị kiểm tra dữ liệu số ta có thể kiểm tra trực tiếp dữ liệu
trên 8 bit đầu ra.
114
ĐÁNH GIÁ VÀ KẾT LUẬN
1. Khả năng thực hiện và hướng phát triển của đề tài:
Qua quá trình thực hiện đề tài: “ Thiết kế bộ lọc tín hiệu số trên công nghệ
FPGA với công cụ Matlab + EDA của Xilinx ”, từ việc nghiên cứu lý thuyết cơ sở
về bộ lọc số, hệ thống xử lý tín hiệu số, đến việc tìm hiểu về sự trợ giúp của Matlab
và EDA,chúng ta đã đưa ra được phương pháp thiết kế mô hình hoá đối tượng
( Model Based Design ) viết tắt là MBD. Qua phương pháp này nó giúp người thiết
kế giảm thiểu công sức và thời gian thiết kế, nâng cao hiệu quả kinh tế, và một điều
quan trọng hơn nữa là thiết kế của chúng ta mang tính mềm dẻo cao, sẵn sàng đáp
ứng được yêu cầu kỹ thuật mới của công nghệ.
Chúng ta đã thực hiện thành công bộ lọc FIR theo phương pháp thiết kế của
MBD, Cấu hình đã được tải xuống Board Spartan-3_xc3s200 đã chạy và được kiểm
tra bằng các thiết bị thực tế.
Qua nghiên cứu về bộ lọc số (đây là một vấn đề lớn), Chúng ta đương nhiên
nắm được phương pháp điều chế tín hiệu số (điều biên số), chuyển phổ tần trong xử
lý tín hiệu số, giải điều chế tín hiệu số.v.v. Do thời gian có hạn ta chỉ đưa ra phương
thức giải điều chế tín hiệu điều biên số ( bằng kết quả cuối ) để minh chứng cho
điều nói trên.
2. Khả năng áp dụng vào thực tiễn:
Với phương pháp thiết kế theo mô hình (MBD) ta có thể áp dụng để thiết kế
các thiết bị điện tử số, Ngoài việc áp dụng sự phát mã VHD của các phần mềm (ở
luận văn này là sự phát mã của Matlab, một số phần mềm khác cũng có khả năng
này) chúng ta còn có thể khai thác các lõi (core) được viết sẵn theo mục tiêu của
khối chức năng, vì vậy người thiết kế chỉ việc tổng hợp các khối này theo mục tiêu
kỹ thuật của thiết bị, công việc này đơn giản song mang lại hiệu quả kinh tế cao
( ta đã phân tích vấn đề này trong luận văn).
115
Board Spartan-3_xc3s200 chỉ phù hợp cho các thiết kế nhỏ vì dung lượng
Cell,cổng hệ thống và số lượng bộ nhân là hạn chế, dùng nó để thiết kế các bộ lọc là
không phù hợp. Ta có thể sử dụng board Spartan-3_xc3s5000 để thiết kế các bộ lọc
số và các khối chức năng khác cho thiết bị điện tử số.Ngôn ngữ viết cho Spartan-
3_xc3s5000 với chức năng bộ lọc ta có thể tham khảo ở phụ lục trong luận văn này.
Thiết kế theo phương pháp mô hình hoá đối tượng “Model Based Design” _
MBD được đề cập trong luận văn này là một vấn đề lớn mang tính tổng quát cao,
Chúng ta phải nghiên cứu nhiều lĩnh vực từ “Cơ sở xử lý tín hiệu và điều khiển số”
đến các ngôn ngữ phần mềm “ Matlab_Simulịnk “ phần mềm “Webpack_ISE ”,
tham khảo rất nhiều trang WEB mà có đề cập đến phương pháp thiết kế này, ngoài
ra để tổng hợp thiết kế một cách chắc chắn ta cũng cần nghiên cứu đến kết cấu cứng
của các board trong họ Spartan-3 của Xilinx.
Do khối lượng công việc lớn, lúc đầu bản thảo của luận văn này dài lên đến 3-4
trăm trang, song do yêu cầu về khuôn khổ giới hạn cho phép mà tác giả đã gạn lọc
đi rất nhiều nội dung chi tiết. Các luận điểm của luận văn phần lớn dược viết theo
hướng: Điểm xuất phát… hướng tiếp cận và phát triển…. kết quả cuối. Nên sự rõ
ràng, tường minh của luận văn có phần bị hạn chế. Tác giả xin được sự cảm thông
ủng hộ và góp ý của quý vị để luận văn được hoàn thiện hơn.
Xin chân thành cảm ơn.
116
Tμi liÖu tham kh¶o
Tiếng Việt
1. NguyÔn Ngäc BÝch (2001), C¬ së xö lý sè tÝn hiÖu vµ ®iÒu khiÓn sè, Häc viÖn
kü thuËt qu©n sù, Hµ Néi.
2. NguyÔn T¨ng C−êng, Phan Quèc Th¾ng, TrÇn V¨n Hîp (2002), CÊu tróc
c¸c hÖ xö lý tÝn hiÖu sè, Häc viÖn kü thuËt qu©n sù, Hµ Néi
3. D−¬ng Tö C−êng, (2003), Xö lý tÝn hiÖu sè, Häc viÖn kü thuËt qu©n sù, Hµ
Néi.
4. V¨n ThÕ Minh (1998), Kü thuËt vi xö lý, NXB Gi¸o dôc, Hµ Néi
5. §ç Xu©n TiÕn (1991), Kü thuËt vi xö lý, Häc viÖn kü thuËt qu©n sù, Hµ Néi.
TiÕng Anh
6. David Harris (1955) Structural Design With Verilog Harvey Mudd College.
7. Donnamaie E. White (2002), Logic Design for Array-Based Circuits, Original
Hardcover – Still, London.
8. Don Davis (Winter 2002), “Architectural Synthesis: Unleashing the Power of
FPGA System-Level Design”, Xcell Journal, (Issue 44), pages 30–34,
Xilinx, United States of America.
9. Giovanni De Micheli, Rajesh K. Gupta (3/1997), “Hardware/Software
Co-Design”, Proceedings of the IEEE, (Vol. 85, No 3), pages 349 – 64.
10. Dag Strnneby, William Walker (2001), Digital Signal Processing and
Applications
11. Donnamaie E. White (2002), Logic Design for Array-Based Circuits, Original
Hardcover – Still, London.
12. Don Davis (Winter 2002), “Architectural Synthesis: Unleashing the Power of
FPGA System-Level Design”, (Issue 44), pages 30 – 34,
13. Uwe Meyer- Baese,Ph.D. (2001), Digital Signal Processing With Field
Programmble Gate Arrays, Florida States University .
14. Peter J.Ashenden (1990), The VHDL CooKBook, University of Adelaide,
South Australia.
117
15. Roger Lipsett & Carl Schaefer (1989),
VHDL: Hardware Description and Design, Kluwer Academic Publishers,
United States of America.
16. Nguån tham kh¶o tõ Internet
xlnx/xil_ans_brower.jsp
xlnx/xweb/xil_publications_index.jsp
PHỤ LỤC
NGÔN NGỮ VHDL BỘ LỌC THÔNG THẤP
HIỆN THỰC TRÊN BOARD SPARTAN-3 XC3S5000
--------------------------------------------------------------------------------
-- Copyright (c) 1995-2003 Xilinx, Inc.
-- All Right Reserved.
--------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version : 7.1i
-- \ \ Application : sch2vhdl
-- / / Filename : top.vhf
-- /___/ /\ Timestamp : 05/03/2008 20:32:17
-- \ \ / \
-- \___\/\___\
--
--Device: spartan3
--Purpose:
-- This vhdl netlist is translated from an ECS schematic. It can be
-- synthesis and simulted, but it should not be modified.
---------------------------------------------------------------------------------------------
-- Author :Tran Thanh Son_TDHK18
--Project : Locnhieu
--Modul : Top.vhd
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
-- synopsys translate_off
library UNISIM;
use UNISIM.Vcomponents.ALL;
-- synopsys translate_on
entity top is
port ( clk : in std_logic;
clk_enable : in std_logic;
reset : in std_logic;
filter_out : out std_logic_vector (7 downto 0));
end top;
architecture BEHAVIORAL of top is
signal XLXN_1 : std_logic_vector (7 downto 0);
component count
port ( clk : in std_logic;
clk_enable : in std_logic;
reset : in std_logic;
count : inout std_logic_vector (7 downto 0));
end component;
component filter
port ( clk : in std_logic;
clk_enable : in std_logic;
reset : in std_logic;
filter_in : in std_logic_vector (7 downto 0);
filter_out : out std_logic_vector (7 downto 0));
end component;
begin
XLXI_1 : count
port map (clk=>clk,
clk_enable=>clk_enable,
reset=>reset,
count(7 downto 0)=>XLXN_1(7 downto 0));
XLXI_2 : filter
port map (clk=>clk,
clk_enable=>clk_enable,
filter_in(7 downto 0)=>XLXN_1(7 downto 0),
reset=>reset,
filter_out(7 downto 0)=>filter_out(7 downto 0));
end BEHAVIORAL;
--------------------------------------------------------------------------------
-- Create Date: 20:17:19 05/03/08
-- Design Name:
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- ----------------------------------------------------------------------------
-- Author :Tran Thanh Son_TDHK18
--Project : Locnhieu
--Modul : Count.vhd
--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity count is
Port ( clk : in std_logic;
clk_enable : in std_logic;
reset : in std_logic;
count : inout std_logic_vector(7 downto 0));
end count;
architecture Behavioral of count is
begin
process (clk, reset)
begin
if reset='1' then
count <= "00000000";
elsif clk>='1' and clk'event then
if clk_enable='1' then
count <= count + 1;
end if;
end if;
end process;
end Behavioral;
-- -------------------------------------------------------------
-- Author :Tran Thanh Son_TDHK18
--Project : Locnhieu
--Modul : Filter.vhd
--
-- Filter Settings:
--
-- Discrete-Time FIR Filter (real)
-- -------------------------------
-- Filter Structure : Direct-Form FIR
-- Filter Length : 51
-- Stable : Yes
-- Linear Phase : Yes (Type 1)
-- Arithmetic : fixed
-- Numerator : s16,16 -> [-5.000000e-001 5.000000e-001)
-- Input : s8,7 -> [-1 1)
-- Filter Internals : Specify Precision
-- Output : s8,7 -> [-1 1)
-- Product : s16,15 -> [-1 1)
-- Accumulator : s16,15 -> [-1 1)
-- Round Mode : convergent
-- Overflow Mode : wrap
-- -------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.ALL;
ENTITY filter IS
PORT( clk : IN std_logic;
clk_enable : IN std_logic;
reset : IN std_logic;
filter_in : IN std_logic_vector(7 DOWNTO 0); -- sfix8_En7
filter_out : OUT std_logic_vector(7 DOWNTO 0) -- sfix8_En7
);
END filter;
----------------------------------------------------------------
--Module Architecture: filter
----------------------------------------------------------------
ARCHITECTURE rtl OF filter IS
-- Local Functions
-- Type Definitions
TYPE delay_pipeline_type IS ARRAY (NATURAL range ) OF signed(7 DOWNTO 0); --
sfix8_En7
-- Constants
CONSTANT coeff1 : signed(15 DOWNTO 0) := to_signed(-60, 16); --
sfix16_En16
CONSTANT coeff2 : signed(15 DOWNTO 0) := to_signed(-178, 16); --
sfix16_En16
CONSTANT coeff3 : signed(15 DOWNTO 0) := to_signed(-163, 16); --
sfix16_En16
CONSTANT coeff4 : signed(15 DOWNTO 0) := to_signed(240, 16); --
sfix16_En16
CONSTANT coeff5 : signed(15 DOWNTO 0) := to_signed(895, 16); --
sfix16_En16
CONSTANT coeff6 : signed(15 DOWNTO 0) := to_signed(1137, 16); --
sfix16_En16
CONSTANT coeff7 : signed(15 DOWNTO 0) := to_signed(502, 16); --
sfix16_En16
CONSTANT coeff8 : signed(15 DOWNTO 0) := to_signed(-430, 16); --
sfix16_En16
CONSTANT coeff9 : signed(15 DOWNTO 0) := to_signed(-504, 16); --
sfix16_En16
CONSTANT coeff10 : signed(15 DOWNTO 0) := to_signed(400, 16); --
sfix16_En16
CONSTANT coeff11 : signed(15 DOWNTO 0) := to_signed(909, 16); --
sfix16_En16
CONSTANT coeff12 : signed(15 DOWNTO 0) := to_signed(23, 16); --
sfix16_En16
CONSTANT coeff13 : signed(15 DOWNTO 0) := to_signed(-1108, 16); --
sfix16_En16
CONSTANT coeff14 : signed(15 DOWNTO 0) := to_signed(-584, 16); --
sfix16_En16
CONSTANT coeff15 : signed(15 DOWNTO 0) := to_signed(1143, 16); --
sfix16_En16
CONSTANT coeff16 : signed(15 DOWNTO 0) := to_signed(1360, 16); --
sfix16_En16
CONSTANT coeff17 : signed(15 DOWNTO 0) := to_signed(-806, 16); --
sfix16_En16
CONSTANT coeff18 : signed(15 DOWNTO 0) := to_signed(-2244, 16); --
sfix16_En16
SIGNAL add_temp_44 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL sum46 : signed(15 DOWNTO 0); -- sfix16_En15
SIGNAL add_temp_45 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL sum47 : signed(15 DOWNTO 0); -- sfix16_En15
SIGNAL add_temp_46 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL sum48 : signed(15 DOWNTO 0); -- sfix16_En15
SIGNAL add_temp_47 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL sum49 : signed(15 DOWNTO 0); -- sfix16_En15
SIGNAL add_temp_48 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL sum50 : signed(15 DOWNTO 0); -- sfix16_En15
SIGNAL add_temp_49 : signed(16 DOWNTO 0); -- sfix17_En15
SIGNAL output_typeconvert : signed(7 DOWNTO 0); -- sfix8_En7
SIGNAL output_register : signed(7 DOWNTO 0); -- sfix8_En7
BEGIN
-- Block Statements
Delay_Pipeline_process : PROCESS (clk, reset)
BEGIN
IF reset = '1' THEN
delay_pipeline(0 TO 50) (OTHERS => '0'));
ELSIF clk'event AND clk = '1' THEN
IF clk_enable = '1' THEN
delay_pipeline(0) <= signed(filter_in);
delay_pipeline(1 TO 50) <= delay_pipeline(0 TO 49);
END IF;
END IF;
END PROCESS Delay_Pipeline_process;
mul_temp <= delay_pipeline(50) * coeff51;
product51 <= resize( shift_right(mul_temp(23 DOWNTO 0) + ( "0" & (mul_temp(8) & NOT
mul_temp(8) & NOT mul_temp(8) & NOT mul_temp(8) & NOT mul_temp(8) & NOT
mul_temp(8) & NOT mul_temp(8) & NOT mul_temp(8))), 8), 16);
mul_temp_1 <= delay_pipeline(49) * coeff50;
product50 <= resize( shift_right(mul_temp_1(23 DOWNTO 0) + ( "0" & (mul_temp_1(8) & NOT
mul_temp_1(8) & NOT mul_temp_1(8) & NOT mul_temp_1(8) & NOT mul_temp_1(8) & NOT
mul_temp_1(8) & NOT mul_temp_1(8) & NOT mul_temp_1(8))), 8), 16);
mul_temp_2 <= delay_pipeline(48) * coeff49;
product49 <= resize( shift_right(mul_temp_2(23 DOWNTO 0) + ( "0" & (mul_temp_2(8) & NOT
mul_temp_2(8) & NOT mul_temp_2(8) & NOT mul_temp_2(8) & NOT mul_temp_2(8) & NOT
mul_temp_2(8) & NOT mul_temp_2(8) & NOT mul_temp_2(8))), 8), 16);
mul_temp_3 <= delay_pipeline(47) * coeff48;
product48 <= resize( shift_right(mul_temp_3(23 DOWNTO 0) + ( "0" & (mul_temp_3(8) & NOT
mul_temp_3(8) & NOT mul_temp_3(8) & NOT mul_temp_3(8) & NOT mul_temp_3(8) & NOT
mul_temp_3(8) & NOT mul_temp_3(8) & NOT mul_temp_3(8))), 8), 16);
mul_temp_4 <= delay_pipeline(46) * coeff47;
add_temp_47 <= resize(sum47, 17) + resize(product49, 17);
sum48 <= add_temp_47(15 DOWNTO 0);
add_temp_48 <= resize(sum48, 17) + resize(product50, 17);
sum49 <= add_temp_48(15 DOWNTO 0);
add_temp_49 <= resize(sum49, 17) + resize(product51, 17);
sum50 <= add_temp_49(15 DOWNTO 0);
output_typeconvert <= resize( shift_right(sum50(15 DOWNTO 0) + ( "0" & (sum50(8) & NOT
sum50(8) & NOT sum50(8) & NOT sum50(8) & NOT sum50(8) & NOT sum50(8) & NOT
sum50(8) & NOT sum50(8))), 8), 8);
Output_Register_process : PROCESS (clk, reset)
BEGIN
IF reset = '1' THEN
output_register '0');
ELSIF clk'event AND clk = '1' THEN
IF clk_enable = '1' THEN
output_register <= output_typeconvert;
END IF;
END IF;
END PROCESS Output_Register_process;
-- Assignment Statements
filter_out <= std_logic_vector(output_register);
END rtl;
Các file đính kèm theo tài liệu này:
- lv_sonsua.pdf