MÔ TẢ PHẦN CỨNG CỦA KIT VIRTEX-II PRO

Một phần của tài liệu thực hiện bộ lọc FIR thích nghi dùng thuật toán LMS (Trang 35)

L ỜI MỞ ĐẦU

5.1. MÔ TẢ PHẦN CỨNG CỦA KIT VIRTEX-II PRO

Phần cứng của kit Virtex-II Pro bao gồm: •

• FPGA Spartan-II dùng để tạo giao tiếp PCI hoặc USB •

• 22LLEEDDttrrạạnnggtthhááiihhiiểểnntthhịị33mmààuu::ccaamm,,đđỏỏ,,vvàànngg

• GGiiắắccccắắmmcchhoommạạcchhnnạạppJJTTAAGG

• 2 kênh ADC độc lập(ADC 14 bit) với tốc độ lấy mẫu tối đa là 105Mhz

• 2 kênh DAC độc lập(DAC 14 bit) với tốc độ biến đổi tối đa là 160Mhz

• 2 rãnh ZBT SRAM độc lập với bộ nhớ 512K x 32

• FPGA virtex-II XC2V80-4CS144 để tạo clock

• FPGA virtex-II pro XC2VP30-4FF1152 là FPGA chính cho người sử dụng

• Có đường kết nối với clock ngoài

• Có thạch anh 65Mhz trong mạch

Tổng thể về kit virtex-II Pro được mô tả như hình 14:

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 36 Nguyễn Anh Cường

5.2. KẾT QUẢ THU ĐƯỢC VỚI BỘ LỌC FIR TRUYỀN THỐNG

Lưu đồ tiến hành thực hiện bộ lọc FIR truyền thống như hình 15:

Hình 15: Lưu đồ thực hiện bộ lọc FIR truyền thống

Sau khi qua biến đổi ADC, dữ liệu được biểu diễn dưới dạng số bù hai sẽ được

đưa vào FPGA để xử lý. FPGA có nhiệm vụ thực hiện thuật toán lọc theo yêu cầu của người lập trình. Sơđồ thực hiện thuật toán đối với bộ lọc FIR được trình bày như trong hình 3 của chương 2. Trong đó, lối vào x[n] của bộ lọc chính là các giá trị sau khi qua biến đổi ADC, các hệ số h[n] là các hằng số đã được cho trước(được tính toán bằng Matlab) và y[n] là kết quả sau khi đã qua bộ lọc FIR. Các kết quả này cũng được biểu diễn dưới dạng số bù hai và được đưa qua bộ biến đổi DAC để hiện lên trên dao động ký.

Trong bài luận văn này, em thiết kế bộ lọc FIR thông thấp, với bậc bộ lọc là 50, tần số mà bộ lọc bắt đầu suy giảm và triệt tiêu là từ 800Hz đến 1250Hz, tần số lấy mẫu là 20Khz.

Các hệ số h[n] sẽđược tính toán bằng công cụ fdatool trong Matlab. Đáp ứng tần số tính toán bằng Matlab được mô tả như hình 16:

Hình 16:Đáp ứng tần số của mạch lọc FIR

Máy phát

ADC FPGA DAC

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 37 Nguyễn Anh Cường

Kết quả thu được khi thực hiện trên chíp FPGA:

• Tín hiệu bắt đầu suy giảm tại tần số 700Mhz, được cho bởi hình 17:

Hình 17:Tín hiệu bắt đầu suy giảm

• Tín hiệu bị triệt tiêu tại tần số 1237Hz, được cho bởi hình 18:

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 38 Nguyễn Anh Cường

5.3. KẾT QUẢ THU ĐƯỢC VỚI BỘ LỌC FIR THEO KIẾN TRÚC SYSTOLIC

Với bộ lọc FIR thực hiện theo kiến trúc systolic array, lưu đồ và kết quảđạt được cũng tương tự như với bộ lọc FIR thông thường. Tuy nhiên, tốc độ thực hiện lại nhanh hơn nhiều. Với công cụ “place and route tools” của phần mềm ISE, cho ta kết quả như

sau:

• Với bộ lọc FIR thực hiện theo kiến trúc systolic array, tần số hoạt động lớn nhất của mạch là 141.947 Mhz và sử dụng hết 1775 slice.

• Với bộ lọc FIR truyền thống, tần số hoạt động của lớn nhất của mạch là 19.857 Mhz và sử dụng hết 417 slice.

Như vậy, ta có thể thấy bộ lọc FIR thực hiện theo kiến trúc systolic array có tốc độđáp

ứng nhanh hơn nhiều so với bộ lọc FIR thông thường, tuy nhiên, nó lại tốn nhiều tài nguyên hơn. Do đó, tuỳ theo từng ứng dụng cụ thể mà ta chọn thiết kế theo phương pháp nào

5.4. KẾT QUẢ THU ĐƯỢC VỚI BỘ LỌC FIR THÍCH NGHI

Bộ lọc FIR thích nghi có rất nhiều ứng dụng như: Khử nhiễu, nhận dạng hệ thống chưa biết, dự báo kết quả với hệ thống có tín hiệu vào là ngẫu nhiên….

Trong bài luận văn này, em xin trình bày vềứng dụng của bộ lọc FIR thích nghi

để khử nhiễu 50Hz-là nhiễu do nguồn sinh ra. Đây là loại nhiễu phổ biến và gây ảnh hưởng lớn đến các thiết bịđiện tử.

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 39 Nguyễn Anh Cường

Hình 19: Mô hình khử nhiễu 50 Hz Trong đó:

• s(n) là tín hiệu mong muốn

• v(n) là tín hiệu nhiễu

• v1(n) là tín hiệu cùng dạng với v(n)(có thể khác nhau về biên độ và pha)

• v’(n) đầu ra của bộ lọc FIR thích nghi

• e(n) là tín hiệu sai số,đồng thời là lối ra.

Thuật toán LMS sẽ có nhiệm vụ điều chỉnh các hệ số của bộ lọc FIR sao cho lối ra v’(n) có dạng gần nhất với tín hiệu nhiễu v(n). Khi đó, e(n)=d(n) - v’(n) sẽđạt đến tín hiệu mong muốn s(n). Tức là ta đã khửđược nhiễu.

Kết quả thu được khi tiến hành trên chip FPGA:

• Tín hiệu lẫn với nhiễu 50Hz trước khi lọc, được cho bởi hình 20

Hình 20:Tín hiệu lẫn với nhiễu d(n) = s(n)+v(n) FIR + LMS v’(n) __ v1(n) + e(n) output

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 40 Nguyễn Anh Cường

• Tín hiệu sau khi lọc được cho bởi hình 21

Hình 21:Tín hiệu thu được sau khi lọc

Tín hiệu thu được sau khi qua bộ lọc FIR thích nghi đã loại bỏđược nhiễu 50Hz. Tuy nhiên, vẫn không được trơn tru và có độ mấp mô nhỏ. Sở dĩ như vậy là do các nguyên nhân sau:

• Do bộ biến đổi ADC là 14 bit, nên khi qua bộ lọc FIR(bao gồm các bộ nhân và bộ cộng) thì dữ liệu lên tới 28 bit, mà đầu ra DAC chỉ hỗ trợ 14 bit, vì vậy, trước khi dữ liệu được đưa vào bộ lọc FIR, ta phải chia dữ liệu cho 27 đểđầu ra DAC là 14 bit. Do đó, kết quả có sai số nhất định

• Bộ biến đổi DAC chỉ hỗ trợ các số nguyên, do đó, ta phải làm tròn các hệ số

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 41 Nguyễn Anh Cường

KT LUN

Trong thời gian tiến hành hoàn thiện khoá luận tốt nghiệp, ngoài việc củng cố lại những kiến thức đã được học trong suốt 4 năm qua, em còn thu được một số kiến thức và kết quả nhất định:

• Được tìm hiểu và thực hành trên chip FPGA của hãng Xilinx

• Biết sử dụng thành thạo phần mềm ISE

• Có thêm nhiều kinh nghiệm trong việc lập trình với ngôn ngữ VHDL

• Thực hiện thành công bộ lọc FIR thông thấp trên FPGA theo kiến trúc truyền thống và theo kiến trúc systolic array. So sánh được ưu điểm, nhược điểm của từng loại

• Thực hiện thành công bộ lọc FIR thích nghi dùng thuật toán LMS trên FPGA để loại bỏ nhiễu 50 Hz

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 42 Nguyễn Anh Cường

TÀI LIU THAM KHO

[1] Simon Haykin. Adaptive filter theory, Third edition

[2] Uwe Meyer-Baese.Digital Signal Processing with Field Programmable Gate

Arrays, Third Edition

[3] John G.Proaskis,Dimitris G.Manolakis. Digital Signal Processing, Third edition

[4] Alexander D.Poularikas, Zayed M.Ramanda. Adaptive filtering primer withmatlab,

2006.

[5] Douglas L.Perry. VHDL: Programming by Example .McGraw – Hill, Fourth

Edition

[6]. Volnei A.Pedroni, Circuit Design With VHDL, MIT Press, 2004

[7] Jan Van der Spiegel. VHDL tutorial

[8] Nguyễn Kim Giao, Kỹ thuật điện tử số, Nhà xuất bản Đại học Quốc gia Hà Nội, 2006.

[9]. Tống Văn On, Thiết kế mạch số với VHDL và Verilog, Nhà xuất bản lao động xã hội, 2007.

[10] Hồ Văn Sung. Xử lý số tín hiệu đa tốc độ và dàn lọc, Nhà xuất bản KH-KT, 2007 [11] http://en.wikipedia.org

[12] http://www.xilinx.com

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 43 Nguyễn Anh Cường

PH LC

PHẦN CHƯƠNG TRÌNH

1. Chương trình thiết kế bộ lọc FIR theo kiến trúc truyền thống

library IEEE;

use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all;

entity Toplevel is

port ( -- main clock input from oscilator CLK1_FB : in std_logic;

-- main reset input from mb RESETl : in std_logic; -- configuration done signal CONFIG_DONE : out std_logic; -- dac 14 bit data outputs

DAC1_D : out std_logic_vector(13 downto 0); DAC2_D : out std_logic_vector(13 downto 0); -- adc 14 bit data inputs

ADC1_D : in std_logic_vector(13 downto 0); ADC2_D : in std_logic_vector(13 downto 0); -- dac reset signals

DAC1_RESET : out std_logic; DAC2_RESET : out std_logic; -- dac setup

DAC1_MOD0 : out std_logic; DAC1_MOD1 : out std_logic; DAC2_MOD0 : out std_logic; DAC2_MOD1 : out std_logic; -- dac clock divider setup DAC1_DIV0 : out std_logic; DAC1_DIV1 : out std_logic; DAC2_DIV0 : out std_logic; DAC2_DIV1 : out std_logic; -- led flash signals

LED1_Red : out std_logic; LED2_Red : out std_logic; LED1_Green : out std_logic; LED2_Green : out std_logic );

end Toplevel;

architecture Behavioral of Toplevel is

-- clock components component BUFG

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 44 Nguyễn Anh Cường

port ( I : in std_logic; O : out std_logic ); end component; component IBUFG port ( I : in std_logic; O : out std_logic ); end component; component DCM generic (

DLL_FREQUENCY_MODE : string := "LOW"; DUTY_CYCLE_CORRECTION : string := "TRUE"; STARTUP_WAIT : string := "FALSE" ); port ( CLKIN : in std_logic; CLKFB : in std_logic; DSSEN : in std_logic; PSINCDEC : in std_logic; PSEN : in std_logic; PSCLK : in std_logic; RST : in std_logic; CLK0 : out std_logic; CLK90 : out std_logic; CLK180 : out std_logic; CLK270 : out std_logic; CLK2X : out std_logic; CLK2X180 : out std_logic; CLKDV : out std_logic; CLKFX : out std_logic; CLKFX180 : out std_logic; LOCKED : out std_logic; PSDONE : out std_logic;

STATUS : out std_logic_vector(7 downto 0) );

end component;

-- end of clock components

-- internal clock and reset signals Component FIR_Filter

Generic(n: integer :=14; -- width of data m: integer := 51); -- order of FIR

Port (

Xin: in std_logic_vector(n-1 downto 0); clk,reset: in std_logic;

Yout: out std_logic_vector(n-1 downto 0) );

end Component;

component chiatan

port ( clk_i : in std_logic;

sochia : in integer;

clk_o : out std_logic

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 45 Nguyễn Anh Cường

end component;

signal CLKIN_OSC, CLKFB_OSC, CLK_OSC, RESET, RSTl : std_logic;

-- temporary registers

signal ADC1, ADC2 : std_logic_vector(13 downto 0);

signal DAC1 :std_logic_vector(13 downto 0); signal data :std_logic_vector(13 downto 0); -- common ground

signal GND : std_logic; signal clk:std_logic; begin

GND <= '0';

RESET <= not RESETl;

---clock deskew section--- ---

-- IBUFG Instantiation for CLK_IN U0_IBUFG : IBUFG

port map ( I => CLK1_FB, O => CLKIN_OSC );

-- BUFG Instantiation for CLKFB U0_BUFG : BUFG

port map (

I => CLKFB_OSC, O => CLK_OSC );

-- DCM Instantiation for internal deskew of CLK0 U0_DCM : DCM port map ( CLKIN => CLKIN_OSC, CLKFB => CLK_OSC, DSSEN => GND, PSINCDEC => GND, PSEN => GND, PSCLK => GND, RST => RESET, CLK0 => CLKFB_OSC, LOCKED => RSTl );

---end of clock deskew--- --

-- module configured CONFIG_DONE <= '0';

-- set low pass filter response and no zero stuffing for both DACs DAC1_MOD0 <= '0';

DAC1_MOD1 <= '0'; DAC2_MOD0 <= '0'; DAC2_MOD1 <= '0';

-- disable resets for DACs DAC1_RESET <= '0';

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 46 Nguyễn Anh Cường

-- optimum settings for sampling rate DAC1_DIV0 <= '1';

DAC1_DIV1 <= '0'; DAC2_DIV0 <= '1'; DAC2_DIV1 <= '0';

-- digital output of adc to digital input of DAC

U0: chiatan port map(CLK_OSC,5250,clk); DataRegisters : process (clk,RSTl) begin if RSTl = '0' then ADC1 <= "00000000000000"; ADC2 <= "00000000000000"; DAC1_D <= "00000000000000"; DAC2_D <= "00000000000000"; elsif clk = '1' and clk'event then --ADC1 <= ADC1_D; --ADC2 <= ADC2_D; if(ADC1_D(13)='1') then ADC1<="1111111"&ADC1_D(13 downto 7); else ADC1<="0000000"&ADC1_D(13 downto 7); end if;

DAC1_D <= not (not DAC1(13) & DAC1(12 downto 0)); --DAC2_D <= not (not ADC2(13) & ADC2(12 downto 0)); end if;

end process;

thuchien:FIR_Filter port map (ADC1(13 downto 0),clk,RSTl,DAC1);

---led flasher section--- --

-- led flash counter process (CLK_OSC, RSTl)

variable COUNT : std_logic_vector(26 downto 0); begin if RSTl = '0' then COUNT := (others => '0'); -- led assignments LED1_Red <= '0'; LED2_Red <= '0'; LED1_Green <= '0'; LED2_Green <= '0';

elsif CLK_OSC = '1' and CLK_OSC'event then COUNT := COUNT + 1; -- led assignments LED1_Red <= COUNT(26); LED2_Red <= COUNT(25); LED1_Green <= COUNT(25); LED2_Green <= COUNT(26); end if; end process;

---end of led flasher--- -

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 47 Nguyễn Anh Cường

Library ieee;

Use ieee.std_logic_1164.all; Entity FIR_Filter is

Generic(n: integer :=14; -- width of data m: integer := 51); -- order of FIR

Port (

Xin: in std_logic_vector(n-1 downto 0); clk,reset: in std_logic;

Yout: out std_logic_vector(n-1 downto 0) );

end FIR_FIlTER;

architecture arch_FIR of FIR_FILTER is

Component FF_D

Generic(n: integer :=14);

Port (

D :in std_logic_vector(n-1 downto 0); Clk,Reset: in std_logic;

--enable: in std_logic;

Q: out std_logic_vector(n-1 downto 0) );

end Component;

component PE is

Generic(n: integer :=14);

Port (

Xin,Ain: in std_logic_vector(n-1 downto 0); Yin: in std_logic_vector(n-1 downto 0); clk,reset : in std_logic;

Xout: inout std_logic_vector(n-1 downto 0); Yout: out std_logic_vector(n-1 downto 0) );

end component;

type A_cof is array(natural range m-1 downto 0) of std_logic_vector(n-1 downto 0);

type Y_cof is array(natural range m-1 downto 0) of std_logic_vector(n-1 downto 0);

constant Ain : A_cof :=

("00000000000001","00000000000001","00000000000001","00000000000001","00000 000000001","00000000000000","00000000000000","11111111111111","111111111111 11","11111111111110","11111111111110","11111111111110","11111111111110","11 111111111110","11111111111111","00000000000000","00000000000001","000000000 00010","00000000000100","00000000000101","00000000000110","00000000001000", "00000000001001","00000000001010","00000000001010","00000000001010","000000 00001010","00000000001010","00000000001001","00000000001000","0000000000011 0","00000000000101","00000000000100","00000000000010","00000000000001","000 00000000000","11111111111111","11111111111110","11111111111110","1111111111 1110","11111111111110","11111111111110","11111111111111","11111111111111"," 00000000000000","00000000000000","00000000000001","00000000000001","0000000 0000001","00000000000001","00000000000001");

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 48 Nguyễn Anh Cường

signal Xout: std_logic_vector(n-1 downto 0);

signal Ytin,Ytout: std_logic_vector(n-1 downto 0); signal X: a_cof; signal Y: Y_cof; begin Y(m-1) <="00000000000000"; -- (others => '0'); PE_for: for i in 0 to m-2 generate -- Concurrent Statement(s)

PE1: PE port map (X(m-2-i),Ain(i),Y(m-1-i),clk,reset,X(m-1- i),Y(m-2-i));

end generate;

PE2: PE port map (Xin,Ain(m-1),Y(0),clk,reset,X(0),Ytout); REGST1: FF_D port map (ytout,clk,reset,Yout);

--REGST2: FF_D port map (Ytout,clk,reset,Yout); end arch_FIR; --- Library ieee; Use ieee.std_logic_1164.all; Entity PE is Generic(n: integer :=14); Port (

Xin,Ain: in std_logic_vector(n-1 downto 0); Yin: in std_logic_vector(n-1 downto 0); clk,reset : in std_logic;

Xout: inout std_logic_vector(n-1 downto 0); Yout: out std_logic_vector(n-1 downto 0) ); end PE; architecture arch_PE of PE is Component adder PORT (

dataa : IN STD_LOGIC_VECTOR (13 DOWNTO 0); datab : IN STD_LOGIC_VECTOR (13 DOWNTO 0);

result : OUT STD_LOGIC_VECTOR (13 DOWNTO 0) );

END Component; Component mult PORT (

dataa : IN STD_LOGIC_VECTOR (13 DOWNTO 0); datab : IN STD_LOGIC_VECTOR (13 DOWNTO 0); result : OUT STD_LOGIC_VECTOR (13 DOWNTO 0) ); END Component; -- Declarations (optional) Component FF_D Generic(n: integer :=14); Port (

D :in std_logic_vector(n-1 downto 0); Clk,Reset: in std_logic;

--Enable: in std_logic;

ĐH Công Nghệ- ĐHQG Hà Nội Khoá luận tốt nghiệp

http://www.ebook.edu.vn 49 Nguyễn Anh Cường

); end Component;

signal S1,S2,S3: STD_LOGIC_VECTOR (n-1 DOWNTO 0); signal rmul: STD_LOGIC_VECTOR (n-1 DOWNTO 0); begin

REGX: FF_D

generic map (n => 14)

port map (Xin,clk,reset,Xout); Multi: mult port map (xout,ain,rmul);

--REGS0: FF_D port map (s1,clk,reset,rmul); adderS: adder port map (rmul,Yin,Yout); --REGS1: FF_D port map (S2,clk,reset,S3); --REGS2: FF_D port map (S3,clk,reset,Yout); end arch_PE; --- Library ieee; Use ieee.std_logic_1164.all; Entity FF_D is Generic(n: integer :=14); Port (

D :in std_logic_vector(n-1 downto 0); Clk,Reset: in std_logic;

--Enable: in std_logic;

Q: out std_logic_vector(n-1 downto 0) ); end FF_D; architecture arch_FFD of FF_D is Begin Process (clk,reset) begin

if clk'event and clk = '1' then --if enable = '1' then if reset = '0' then Q <= (others =>'0');

Một phần của tài liệu thực hiện bộ lọc FIR thích nghi dùng thuật toán LMS (Trang 35)

Tải bản đầy đủ (PDF)

(65 trang)