-Xây dựng thành công việc kết nối Altium Designer và Kit FPGA NB2DSK01 với đầu vào là thẻ SD và đầu ra là âm thanh trên nền FPGA với khuôn dạng MP3 và Wav
-Tạo một dự án FPGA trong Altium Designer 38
-Sử dụng hệ thống phân cấp thiết kế trong một dự án FPGA
-Thực hiện một thiết kế FPGA dựa trên OpenBus, bao gồm cả nguồn và đặt các thành phần, kết nối chúng lại với nhau, và kết nối chúng với các ngoại vi trên Desktop NanoBoard
Dưới đây là một số hình ảnh kết quả trong quá trình chạy ứng dụng:
Sau khi đã thực hiện xong các bước ta nạp chương trình cho chip trắng của KIT FPGA NB2DSK01
Hình 3.29 Hình ảnh KIT đã được nạp chương trình
Hình 3.30 Tên các bài hát được hiển thị lên màn hình
39
Sau khi nạp chương trình, file âm thanh đọc từ thẻ nhớ hiển thị trên màn hình và có thể phát âm thanh ra loa.
3.4 Kết luận chương
Như vậy, thông qua phân tích bài toán thiết kế, ta đã lần lượt đưa ra các bước thực hiện cần thiết để xây dựng lên một hệ nhúng sử dụng công nghệ FPGA thông qua các công cụ hỗ trợ phần cứng và công cụ hỗ trợ phần mềm. Có 2 yếu tố quan trọng để xây dựng lên một hệ thống nhúng thành công đó là xây dựng phần cứng và xây dựng phần mềm cho dự án và phải liên kết 2 phần này lại với nhau một cách chính xác.
40
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Kết luận chung
Qua thời gian tìm hiểu và thực hiện đề tài, em đã đạt được một số kết quả sau:
-Hiểu hơn về chuẩn gia tiếp SPI, I2S.
-Hiểu rõ kiến trúc của Board NB2DSK01 và cách thức thực hiện một dự án nhúng trên KITNB2DSK01.
-Vận dụng kiến thức được học về FPGA và ngôn ngữ lập trình để hoàn thành đề tài được giao.
Qua kết quả thực nghiệm có thể thấy rằng, phần mềm Altium Designer và Kit FPGA NB2DSK01 trong xây dựng hệ thống giải mã âm thanh số mp3, wav thiết kế trên nền FPGA cho phép tích hợp mạnh mẽ với các hệ thống ứng dụng sau:
-Tốc độ thực nhanh, thao tác đơn giản.
-Có thể tùy chỉnh được các thiết bị, trạng thái và các chế độ làm việc.
-Ứng dụng hoạt động ổn định và có độ chính xác cao.
Tuy nhiên, trong quá trình thực hiện nghiên cứu không tranh được những sai sót, rất mong nhận được ý kiến đóng góp của các thầy cô để kết quả nghiên cứu ngày càng chính xác hơn.
Hướng phát triển
Từ bài toán này, ta có thể nghiên cứu, phát triển thêm về phần điều khiển các kết nối I/O thông qua các GPIO, ta có thể nghiên cứu thêm về phần phát hình ảnh để có thể vừa phát nhạc, vừa hiển thị hình ảnh, video.
Nghiên cứu để tạo ra các thiết bị có thể tích hợp nhiều chức năng và tối ưu hơn về mặt kích thước.
41
TÀI LIỆU THAM KHẢO
[1] LUẬN VĂN THIẾT KẾ HỆ THỐNG NHÚNG VỚI VI ĐIỀU KHIỂN LÕI MỀM VÀ HỆ ĐIỀU HÀNH TRÊN FPGA_10253912052019_Luận Văn cao học_Đinh Văn Thắng
[2] Bài giảng môn học thiết kế mạch tích hợp số, Hệ thống trên chip- bộ môn Kỹ thuật điện tử - Trường Đại học Kỹ thuật Công nghiệp – Đại học Thái Nguyên.
[3] Đại học Bách Khoa. Hệ thống điều khiển nhúng_TS Lưu Hông Việt.
[4] Funtional Overview of the deesktop Nanoboard NB2DSK01 https://techdocs.altium.com/display/HWARE/ Functional+Overview+of+the+Desktop+NanoBoard+NB2DSK01 [5] https://manualzz.com/doc/14106804/tutorial---implementing-a-32-bit- processor? __cf_chl_jschl_tk__=pmd_5oJ1rkrVoUQxBamfTbOH_b5wscDxB8vJjH4Qpc6j 6SE-1630495224-0-gqNtZGzNAqWjcnBszQh9
Implenmenting a 32-bit Processor-based Design in a FPGA
Ngoài ra sinh viên còn tham khảo thêm nhiều tài liệu và một số trng web:
[6] Abdel-Gawad, “A full hardware implementation for an MP3 decoder chip using VHDL”, project report, University of California at Santa Barbara, December 2008.
[7] H. Popp, “An introduction to MPEG layer-3”, European Broadcasting Union Technical Review, pp. 1-15, June 2000
[8] P. Chandraiah, and R. D¨omer , “Specification and design of a MP3 audio decoder”, Technical Report CECS-05- 04 , University of California at Irvine, pp. 1-83, May 2005
[9]https://sourceforge.net/directory/language:cpp/os:windows/? q=mp3+decode+delphi
42
PHỤ LỤC A THIẾT KẾ MẠCH LOGIC TỔ HỢP A.1 Mô tả bài toán
Cho môt hê thông giam sat nhiêt đô, nếu nhiệt độ nằm trong giải từ (30 ÷80)℃
thì led sáng. Hãy thiết kế hệ thống dựa trên VDHL và chạy trên KIT NB2DSK01. Biết đầu ra của hệ thống được mô tả bằng hàm F sau:
F=X3X2+X3X2X1+X3X2X0
A.2 Các bước thực hiện
- Bước 1: Tạo Project mới
Khởi động phần mềm altium designer => chọn file => new = > project= > chọn VHDL project. Sửa tên và đường dẫn lưu file.
Hình 0.31 Các thao tác để add file chương trình VHDL
Bước 2: Add File VHDL
Với VHDL project đã có ta add thêm file VHDL bằng cách kích chuột phải vào tên project chọn add new to project => chọn VHDL document.
43
Hình 0.1. Các thao tác add file VHDL
Nếu ta có sẵn một file VHDL ta cũng có thể thêm vào file có sẵn bằng cách ấn chọn “add exit file”
Bước 3: Viết mã VHDL
Sau khi có file VHDL document ta bắt đầu soạn thảo code.
Hình 0.2. Thao tác viết chương trình VHDL trên altium designer
Bước 4: Biên dịch chương trình
Sau khi soạn thảo code xong ta lưu file lại sau đó ấn chuột phải vào tên file và ấn Compile.
44
Hình 0.3. Thao tác biên dịch kiểm tra chương trình xem có lỗi hay không
Bước 5 : Tạo file nguyên lý
-Chọn add new to project => Schematic. Sau đó ở cửa sổ shematic ta ấn chuột phải chọn Sheet Action => Create Sheet Symbol From Sheet HDL.
Hình 0.4. Thao tác tạo file nguyên lý cho bài toán thiết kế
45
Hình 0.5. Giao diện của Project mạch nguyên lý FPGA trong Altium Designer
-Chọn file HDL đã lưu trước đó ta thu được Symbol và đồng thời ta sẽ lấy các Deepswit và LED trong thư viện của Altium. Sửa tên của các DW, LED và nối với các chân trên symbol.
Hình 0.6. Thao tác tạo symbol từ file VHDL
46
Hình 0.7. Thao tác lấy dipswitch và đặt tên cho dipswitch
Hình 0.8. Sơ đồ nguyên lý vỏ và thiết bị ngoại vi của hệ thống điều khiển nhiệt độ
-Lưu file Schematic lại và chuột phải vào tên file Schematic ấn compile. Sau đó lưu project và chuột phải vào project và ấn compile
Bước 6: Nạp chương trình lên KIT Nanoboard NB2DSK01
-Kết nối kit NB2 với máy tính, trên phần mềm altium ấn vào tab device tích vào live ta thấy kit đã kết nối với máy tính
47
-Kích chuột phải vào biểu tượng kit chuột phải chọn đúng loại kit
Hình 0.9. Chọn đúng kit thực hiện
-Kích chuột phải vào Nanoboard NB2 chọn configure FPGA projetct => chọn project đã có sau đó chọn OK
Hình 0.10. Thao tác chọn project khi nạp code
-Chọn ok
48
-Tích check program FPGA. Ta dã thành công nạp code vào kit.
Hình 0.11. Hình ảnh nạp thành công chương trình
-Kết quả mô phỏng
49
Hình 0.12. KIT khi chưa nạp code
Hình 0.13. KIT khi đã nạp code
Hình 0.14. Kết quả thực hiện trên KIT 50
A.3 Đoạn mã VHDL
--- CT chinh Bai tap thiet ke mach logic to hop---
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ND30to80 is
port ( X_3,X_2,X_1,X_0:
end ND30to80;
architecture dataflow of ND30to80 is begin elseF <= else '1' '1' when (X_3='0'and X_2='1' '1' '1' '1' when '1'(X_3='1'and X_2='0' '1' '0'; end dataflow; --- library---
Testbench cua Bai tap thiet ke mach logic to hop---
IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--- entity ND30to80_test is end ND30to80_test; --- architecture type sample X_3,X_2,X_1,X_0
end record sample;
type sample_array is array
constant ( ('0','0','0','0','0'),('0','0','0','1','0'),('0','0','1','0','0'), ('0','0','1','1','0'),('0','1','0','0','1'),('0','1','0','1','1'), ('0','1','1','0','1'),('0','1','1','1','1'),('1','0','0','0','1'), ('1','0','0','1','1'),('1','0','1','0','1'),('1','0','1','1','1'), ('1','1','0','0','1'),('1','1','0','1','0'),('1','1','1','0','0'), ('1','1','1','1','0') ); 51
component ND30to80 is port (X_3,X_2,X_1,X_0
F : out std_logic
);
end component;
--- khai bao cac tin hieu vao ra cho DUT---
signal X_3in,X_2in,X_1in,X_0in,Fout : std_logic;
begin
process begin
for i in test_data'range loop
X_3in <= test_data(i).X_3;
X_2in <= test_data(i).X_2;
X_1in <= test_data(i).X_1;
X_0in <= test_data(i).X_0;
wait for 10 ns;
end loop;
wait;
end process;
DUT:ND30to80 port map(X_3in, X_2in,X_1in, X_0in, Fout);
---
52
download by : skknchat@gmail.com
PHỤ LỤC B THIẾT KẾ MẠCH LOGIC TUẦN TỰ
B.1 Mô tả bài toán
Thiết kế mạch tích hợp số thực hiện chức năng của một T-FF đầy đủ các chân T, Q, Qnot, CLK sườn dương, CLR và PR tích cực mức cao bằng công nghệ FPGA.
B.2 Các bước thực hiện
Đối với bài toán thiết kế mạch logic tuần tự, ta đi thực hiện các bước tương tự như bài toán thiết kế mạch logic tổ hợp để thu được kết quả cuối cùng.
Bước 1: Tạo một dự án FPGA mới
-Đầu tiên, mở Altium, để tạo một Project mới ta vào File → New → Project.
-Chọn FPGA project→ đặt tên cho Project, chọn vị trí lưu → nhấn OK
Bước 2: Tạo File VHDL
-Nếu chưa có file sẵn trong thư mục, ta đi tạo một file VHDL mới bằng Với cách cách kích chuột phải vào dự án FPGA vừa tạo → add new to project → VHDL document.
-Nếu đã có sẵn file bạn chỉ việc thêm file đó vào dự án bằng cách kích chuột phải vào dự án FPGA vừa tạo → add Exiting to project →đi đến thư mục bạn lưu file và ấn chọn
Bước 3: Tạo đoạn mã VHDL
Gõ đoạn mã chương trình sau vào không gian làm việc của file VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
---thuc the---
entity T_FF is
Port ( T, CLK, CLR,PR : in STD_LOGIC;
Q, Qnot : out STD_LOGIC);
end T_FF;
---kien truc---
architecture BHV of T_FF is begin
process (T, CLK, CLR, PR)
VARIABLE TEMP:STD_LOGIC:='0';
begin
if (CLR = '1') then
TEMP := '0';
elsif( PR = '1') then
TEMP := '1';
elsif (rising_edge(CLK)) then if(T ='1') then
53
TEMP := not TEMP; end if; end if; Q<= NOT TEMP; Qnot<= TEMP; end process; end BHV;
Bước 4: Biên dịch chương trình
-Sau khi soạn thảo code xong ta lưu file lại sau đó ấn chuột phải vào tên file và ấn Compile để kiểm tra xem file lỗi hay không.
Bước 5: Tạo file Nguyên lý
-Chọn add new to project => Schematic. Sau đó ở cửa sổ shematic ta ấn chuột phải chọn Sheet Action => Create Sheet Symbol From Sheet HDL.
-Chọn file HDL đã lưu trước đó ta thu được Symbol và đồng thời ta sẽ lấy các Deepswit và LED trong thư viện của Altium. Sửa tên của các DW, LED và nối với các chân trên symbol.
-Từ thư viện FPGA NB2DSK01 Port-Plugin.InLib, lấy ra các nút bấm và các Led
Hình B 1. Thao tác lấy các nút bấm và Led
-Từ thư viện FPGA Generic.InLib, lấy ra bộ chia tần CDIV256
54
Hình B 2. Thao tác lấy bộ chia tần
Hình B 3. Sơ đồ nguyên lý hoàn chỉnh của T_FF
-Lưu file Schematic lại và chuột phải vào tên file Schematic ấn compile. Sau đó lưu
project và chuột phải vào project và ấn compile
Bước 6: Nạp KIT B.3 Đoạn mã VHDL
---CT chinh T_FF--- ---khai bao thu vien---
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
---thuc the---
entity T_FF is
Port ( T, CLK, CLR,PR : in STD_LOGIC;
Q, Qnot : out STD_LOGIC);
end T_FF;
---kien truc---
architecture BHV of T_FF is begin
process (T, CLK, CLR, PR)
VARIABLE TEMP:STD_LOGIC:='0';
begin
if (CLR = '1') then
TEMP := '0';
elsif( PR = '1') then
TEMP := '1';
elsif (rising_edge(CLK)) then if(T ='1') then
TEMP := not TEMP;
end if; end if; Q<= NOT TEMP; Qnot<= TEMP; end process; end BHV; ---Test T_FF--- library ieee;
use ieee.std_logic_1164.all;
---
entity testbench is end testbench;
---
architecture test of testbench is type sample is record
CLR : std_logic;
PR: std_logic;
clk: std_logic;
T: std_logic;
end record;
type sample_array is array (natural range <>) of sample;
constant test_data: sample_array := ( ('1','0','0','0'), ('0','1','1','0'), ('0','0','0','1'), ('0','0','1','1'), ('0','0','0','0'), ('0','0','1','0'), 56 download by : skknchat@gmail.com
('0','0','0','1'), ('0','0','1','1'), ('0','0','0','0'), ('0','0','1','0') ); signal clk,T,PR, CLR: std_logic;
signal Q, Qnot: std_logic;
begin
connect: entity work.T_FF
port map ( clk => clk, PR =>PR, CLR => CLR, T=>T, Q=>Q, QNOT => Qnot ); process begin
for i in test_data'range loop
CLR <=test_data(i).CLR; PR <=test_data(i).PR; clk <=test_data(i).clk; T <=test_data(i).T; wait for 10 ns; end loop; wait; end process; end test; 57 download by : skknchat@gmail.com
PHỤ LỤC C CODE MP3 DECODER ---MAIN C--- #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <fs.h> #include <unistd.h> #include <sys/stat.h>
/ Application Stack interface
#include "swplatform.h" #include "form1.h" #define DIR_SEP #define FAILED() #define INPUT_SIZE #define ERROR_LIMIT 3 sdcard_t *drv_sdcard;
static int audio_samplerate;
static uint16_t *mp3_output_pos;
static int mp3_input_bufnr;
static int mp3_input_count;
static int mp3_output_count;
static int mp3_error_count;
/ these buffers must be allocated in external memory uint32_t mp3_input_buf[2][INPUT_SIZE / 4]; uint32_t mp3_output_buf[576];
static int mp3_open(const char *filename);
static int mp3_skip_id3(int infile); static
bool mp3_process(int infile); static bool
mp3_errorreport(void); static void init(