BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
PHẠM ĐỨC THUẬN
TRIỂN KHAI HỆ THỐNG NHÚNG TRÊN NIOS
VÀ ỨNG DỤNG ĐIỀU KHIỂN THIẾT BỊ
QUA MÁY TÍNH
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
HƯNG YÊN - 2014
PH
ẠM
ĐỨ
C T
HU
ẬN
<T
ÊN
ĐỀ
TÀ
I>
2014
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
PHẠM ĐỨC THUẬN
TRIỂN KHAI HỆ THỐNG NHÚNG TRÊN NIOS
VÀ ỨNG DỤNG ĐIỀU KHIỂN THIẾT BỊ
QUA MÁY TÍNH
NGÀNH: CÔNG NGHỆ THÔNG TIN
CHUYÊN NGÀNH: CÔNG NGHỆ MÁY TÍNH
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
NGƯỜI HƯỚNG DẪN
Th.S LÊ TRUNG HIẾU
HƯNG YÊN - 2014
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
3
MỤC LỤC
MỤC LỤC ...................................................................................................... 3
DANH SÁCH HÌNH VẼ ................................................................................ 6
DANH SÁCH BẢNG BIỂU ........................................................................... 9
DANH SÁCH TỪ VIẾT TẮT ...................................................................... 10
CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI ................................................... 11
Lý do chọn đề tài ......................................................................... 11 1.1
Mục tiêu của đề tài ...................................................................... 12 1.2
Giới hạn và phạm vi của đề tài .................................................... 12 1.3
Nội dung thực hiện ...................................................................... 12 1.4
Phương pháp tiếp cận .................................................................. 13 1.5
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT ............................................................ 14
Tổng quan về FPGA .................................................................... 14 2.1
2.1.1 FPGA là gì? .............................................................................. 14
2.1.2 Tóm tắt lịch sử phát triển của FPGA ......................................... 14
2.1.3 Tại sao cần sử dụng FPGA ........................................................ 15
2.1.4 Các ứng dụng của FPGA ........................................................... 16
2.1.5 Cấu trúc của FPGA ................................................................... 16
2.2. KIT Altera DE2. ........................................................................ 18
2.3. Phần mềm Quartus II ................................................................... 21
2.3.1. Giới thiệu Quartus II ................................................................. 21
2.3.2. Thiết kế dự án bằng Quartus II. ................................................. 23
2.3.3. Xây dựng hệ thống bằng SoPC( Qsys) trên Quartus II ............... 30
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
4
2.4. Phần mềm lập trình NIOS II ........................................................ 35
2.5. Truyền thông qua máy tính .......................................................... 39
2.6. Avalon Bus ................................................................................. 43
2.6.1. Avalon Bus Module .................................................................. 45
2.6.2. Các thiết bị ngoại vi Avalon ...................................................... 46
CHƯƠNG 3: NỘI DUNG THỰC HIỆN ..................................................... 48
Sơ đồ tổng quát hệ thống ............................................................. 48 3.1
Chi tiết thiết kế hệ thống ............................................................. 50 3.2
3.2.1. NIOS II Processor – nios2_qsys_0 .............................................. 50
3.2.2. JTAG Debug Module – jtag_uart_0 ........................................... 51
3.2.3. Rs232 – UART( Rs232 Serial Port) ........................................... 51
3.2.4. SRAM On Chip – onchip_memory2_0 ...................................... 52
3.2.5. EFAN ........................................................................................ 52
3.2.6. LCD .......................................................................................... 53
3.2.7. LED Controler – pio_0 – led_green ........................................... 56
3.2.8. Avalon Bus ............................................................................... 56
Thiết kế giao diện điều khiển trên máy tính. ................................ 59 3.3
Lưu đồ thuật toán ........................................................................ 61 3.4
3.4.1. Quá trình gửi ............................................................................... 61
3.4.2. Quá trình nhận ........................................................................... 62
Sơ đồ nguyên lý. ......................................................................... 64 3.5
3.5.1. Kết nối chân tín hiệu điều khiển ngoại vi ..................................... 64
3.5.2. Sơ đồ ghép nối Rs232. ............................................................... 65
3.5.3. Sơ đồ module màn hình LCD .................................................... 66
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
5
3.5.4. Sơ đồ nguyên lý Relay 4 kênh ................................................... 67
Hình ảnh module thực tế ............................................................. 69 3.6
CHƯƠNG 4: KẾT LUẬN .......................................................................... 70
Kết quả đạt được của đề tài ......................................................... 70 4.1
Hạn chế của đề tài ....................................................................... 71 4.2
Hướng phát triển của đề tài.......................................................... 71 4.3
TÀI LIỆU THAM KHẢO ............................................................................. 72
PHỤ LỤC ..................................................................................................... 73
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
6
DANH SÁCH HÌNH VẼ
Hình 2-1: Cấu trúc tổng thể của FPGA ......................................................... 16
Hình 2-2: Khối logic FPGA ......................................................................... 17
Hình 2-3: KIT Altera DE2............................................................................ 19
Hình 2-4: Các thành phần trên KIT Altera DE2............................................ 19
Hình 2-5: Giao diện chính ............................................................................ 21
Hình 2-6: Design Flow ................................................................................. 22
Hình 2-7: Khởi tạo dự án.............................................................................. 23
Hình 2-8: Đường dẫn, tên dự án, tên thực thể chính. .................................... 24
Hình 2-9: Add file. ....................................................................................... 24
Hình 2-10: Chọn Device .............................................................................. 25
Hình 2-11: Công cụ thiết kế, mô phỏng. ....................................................... 26
Hình 2-12: Kết thúc...................................................................................... 26
Hình 2-13: New Source ................................................................................ 27
Hình 2-14: Trình soạn thảo trên Quartus II ................................................... 27
Hình 2-15: Cửa sổ Assignment Editor dùng để gán chân .............................. 28
Hình 2-16: Cửa sổ Programer ....................................................................... 29
Hình 2-17: Đường dẫn đến thư mục Usb-Blaster Driver. .............................. 30
Hình 2-18: Chọn hệ thống SoPC dựa trên ngôn ngữ Verilog hoặc VHDL ... 31
Hình 2-19: Chọn NIOS II processor ............................................................ 32
Hình 2-20: Chọn Debug level ....................................................................... 32
Hình 2-21: Tạo bộ nhớ hệ thống. .................................................................. 33
Hình 2-22: JTAG UART .............................................................................. 34
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
7
Hình 2-23: Hệ thống SoPC tối thiểu. ............................................................ 34
Hình 2-24: Tạo thêm I/O cần thiết cho hệ thống NIOS II ............................. 35
Hình 2-25: Chọn workspace cho dự án. ........................................................ 36
Hình 2-26: Giao diện chương trình phần mềm NIOS II ................................ 36
Hình 2-27: Tạo dự án mới với NIOS II ........................................................ 37
Hình 2-28: Trình soạn thảo .......................................................................... 38
Hình 2-29: Nạp xuống KIT .......................................................................... 38
Hình 2-30: Rs232 Pin table .......................................................................... 41
Hình 2-31: Sơ đồ khối một Avalon bus module trong thiết kế ...................... 46
Hình 3-1: Sơ đồ tổng quát hệ thống .............................................................. 48
Hình 3-2: Chọn phiên bản NIOS II/e ............................................................ 50
Hình 3-3: Component Jtag_uart ................................................................... 51
Hình 3-4: Component Rs232 ........................................................................ 51
Hình 3-5: SRAM On Chip............................................................................ 52
Hình 3-6: EFAN ........................................................................................... 52
Hình 3-7: Lcd_data ...................................................................................... 53
Hình 3-8: Lcd_rw ......................................................................................... 54
Hình 3-9: Lcd_rs .......................................................................................... 54
Hình 3-10: Lcd_e ......................................................................................... 55
Hình 3-11: Led control ................................................................................. 56
Hình 3-12: Giao tiếp giữa cổng Slave và Avalon Bus Module trong quá trình
đọc từ Slave .................................................................................................. 57
Hình 3-13: Thời gian trong quá trình đọc dữ liệu từ cổng slave .................... 57
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
8
Hình 3-14: Các tín hiệu giao tiếp và thời gian trong khi ghi dữ liệu ra cổng
slave .............................................................................................................. 58
Hình 3-15: Giao diện chương trình chính ..................................................... 60
Hình 3-16: Giao diện chương trình điều khiển ............................................. 60
Hình 3-17: Lưu đồ thuật toán quá trình gửi dữ liệu ...................................... 61
Hình 3-18: Lưu đồ thuật toán quá trình nhận dữ liệu .................................... 63
Hình 3-19: Connect to GPIO1( DE2 KIT) .................................................... 64
Hình 3-20: Mạch chuẩn giao tiếp Rs232 dùng IC Max232 ........................... 65
Hình 3-21: Sơ đồ module màn hình LCD ..................................................... 66
Hình 3-22: Sơ đồ nguyên lý Module Relay 4 kênh ....................................... 68
Hình 3-23: Module Relay 4 kênh - 5V-220V/10A ........................................ 69
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
9
DANH SÁCH BẢNG BIỂU
Bảng 3-1: Chân kết nối tín hiệu điều khiển GPIO1 ....................................... 65
Bảng 3-2: Rs232 pin assignments ................................................................. 66
Bảng 3-3: LCD Module pin assignment ....................................................... 67
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
10
DANH SÁCH TỪ VIẾT TẮT
Từ viết tắt Từ đầy đủ Giải thích
ASIC Application-Specific Integrated
Circuit
Vi mach tích hợp chuyên dụng
CPLD Complex Programmable Logic
Device
Thiết bị logic có thể lập trình
được.
DE Development and Education
FPGA Field programmable gate array Vi mạch dùng cấu trúc mảng
phần tử logic lập trình được
LUT Look Up Table Bảng tìm kiếm
PLA Programmable Logic Array Mảng logic khả trình
SOPC System on a Programmable Chip
Builder
Xây dựng hệ thống trên một
CHIP
VHDL VHSIC Hardware Description
Language
Ngôn ngữ lập trình phần cứng
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
11
CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI
Trong chương này sẽ trình bày tổng quan về đề tài bao gồm lý do chọn đề tài,
mục tiêu, giới hạn, phạm vi nghiên cứu, nội dung thực hiện và phương pháp tiếp
cận của đề tài.
Lý do chọn đề tài 1.1
Trong những năm gần đây, xu hướng của thế giới là phát triển mạnh công
nghệ bán dẫn. Một chip có thể tích hợp trên nó nhiều cổng logic có thể ứng dụng
trong nhiều lĩnh vực. Ngày nay, ngành công nghiệp chế tạo phần cứng luôn có
những đột phá không ngừng. Từ các mạch điện đơn giản đến các mạch số, mạch
tích hợp, kiến trúc mạch ngày một trở nên phức tạp hơn.
Các hệ thống nhúng được phát triển trên FPGA đang được sử dụng rộng rãi
cho các nghiên cứu, ứng dụng, và đào tạo hiện nay bởi đặc tính linh hoạt cho các
thiết kế thiết bị trên FPGA. Đặc tính có thể cấu hình lại của FPGA cho phép tạo ra
phiên bản thiết kế của một thiết bị mong muốn cho các ứng dụng khác nhau. Nhờ sử
dụng các ngôn ngữ mô phỏng phần cứng VHDL, Verilog và một số công cụ thiết
kế, mô phỏng, ngày nay, ở phòng thí nghiệm, cơ sở đào tạo, hay một cá nhân có thể
đưa ra ý tưởng, một mẫu thiết kế một bộ xử lý mong muốn, và thực thi nó trên
FPGA. Với những ứng dụng rộng rãi trong nhiều ngành công nghiệp đa dạng, hầu
hết các hệ nhúng hiện nay đều được phát triển trên công nghệ FPGA. Mặt khác,
FPGA được hỗ trợ rất nhiều các thiết bị ngoại vi tạo điều kiện thuận lợi cho việc
phát triển hệ thống nhúng, phát triển các ứng dụng điều khiển trên FPGA kết nối
với các thiết bị ngoại vi.
Để có được bước đầu làm quen và nghiên cứu về công nghệ FPGA từ đó có
thể nghiên cứu sâu hơn về công nghệ nên Em đã chọn đề tài nghiên cứu: “ Triển
khai hệ thống nhúng trên nios và điều khiển thiết bị qua máy tính” làm đề tài
tốt nghiệp Đại học của mình.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
12
Trong quá trình thực hiện đề tài này, do còn hạn chế về kiến thức và thời
gian nên không tránh được những thiếu sót. Em kính mong quý thầy cô
thông cảm và bỏ qua đồng thời em cũng mong nhận được những góp ý và
chỉ bảo thêm của quý thầy cô.
Mục tiêu của đề tài 1.2
Tạo bước đầu cho Sinh Viên nghiên cứu ứng dụng của Altera DE2 Cylone
II nói riêng và FPGA nói chung.
Nắm được trình tự thiết kế một ứng dụng sử dụng NIOS trên DE2: Cách
lập trình, thiết kế phần cứng, cũng như cách vận hành giao tiếp giữa Kit
DE2 với các thiết bị ngoại vi.
Thiết kế hệ thống nhúng trên NIOS và ứng dụng điều khiển thiết bị qua
máy tính.
Rèn luyện khả năng tư duy, sáng tạo và kinh nghiệm làm việc trong thực tế.
Giới hạn và phạm vi của đề tài 1.3
Nghiên cứu FPGA của Altera. nguyên lý hoạt động của Kit Altera DE2
Cylone II. Tìm hiểu về các cổng vào ra của Kit DE2, kết nối với máy tính
và các thiết bị ngoại vi.
Đưa ra được giải pháp và chức năng của sản phẩm, thiết kế mạch và lập
trình đạt được yêu cầu đặt ra của hệ thống điều khiển.
Nghiên cứu và phát triển hệ thống nhúng trên FPGA của hãng Altera.
Viết chương trình điều khiển trên máy tính kết nối với FPGA điều khiển
thiết bị ngoại vi.
Nội dung thực hiện 1.4
Tìm hiểu, nghiên cứu nguyên lý hoạt động của Kit Altera DE2 Cylone II.
Tìm hiểu về các cổng vào ra của Kit DE2, kết nối với máy tính và các thiết
bị ngoại vi.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
13
Đưa ra được giải pháp và chức năng của sản phẩm, thiết kế mạch và lập
trình đạt được yêu cầu đặt ra của hệ thống điều khiển.
Sử dụng tốt công cụ lập trình NIOS tạo ứng dụng điều khiển thiết bị qua
máy tính.
Lắp đặt, chạy thử và hoàn thiện hệ thống.
Quyển báo cáo viết và trình bày theo đúng mẫu quy định.
Phương pháp tiếp cận 1.5
Cách tiếp cận : Nghiên cứu các ngôn ngữ, phần mềm thiết kế hệ thống nhúng
trên nền tảng Altera như VHDL, Verilog, Qsys trên Quartus II và viết phần mềm
trên NIOS II. Lập trình giao diện điều khiển thiết bị trên máy tính bằng Visual
Studio 2010.
Sử dụng các phương pháp nghiên cứu:
Phương pháp đọc tài liệu.
Phương pháp phân tích mẫu.
Phương pháp thực nghiệm.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
14
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Chương này sẽ trình bày cơ sở lý thuyết của đề tài bao gồm tổng quan về
FPGA, giới thiệu phần mềm, công cụ sử dụng trong đề tài, các bước triển khai hệ
thống, truyền thông qua máy tính.
Tổng quan về FPGA 2.1
2.1.1 FPGA là gì?
Field-programmable gate array( FPGA) là vi mạch dùng cấu trúc mảng
phần tử logic mà người dùng có thể lập trình được.( Chữ field ở đây muốn chỉ đến
khả năng tái lập trình "bên ngoài" của người sử dụng, không phụ thuộc vào dây
chuyền sản xuất phức tạp của nhà máy bán dẫn). Vi mạch FPGA được cấu thành từ
các bộ phận:
Các khối logic cơ bản lập trình được( logic block)
Hệ thống mạch liên kết lập trình được
Khối vào/ra( IO Pads)
Phần tử thiết kế sẵn khác như DSP slice, RAM, ROM, nhân vi xử lý...
2.1.2 Tóm tắt lịch sử phát triển của FPGA
FPGA được thiết kế đầu tiên bởi Ross Freeman, người sáng lập công ty Xilinx
vào năm 1984, kiến trúc mới của FPGA cho phép tích hợp số lượng tương đối lớn
các phần tử bán dẫn vào 1 vi mạch so với kiến trúc trước đó là CPLD. FPGA có khả
năng chứa tới từ 100.000 đến hàng vài tỷ cổng logic, trong khi CPLD chỉ chứa từ
10.000 đến 100.000 cổng logic; con số này đối với PAL, PLA còn thấp hơn nữa chỉ
đạt vài nghìn đến 10.000.
CPLD được cấu trúc từ số lượng nhất định các khối SPLD( Simple
programmable devices, thuật ngữ chung chỉ PAL, PLA). SPLD thường là một mảng
logic AND/OR lập trình được có kích thước xác định và chứa một số lượng hạn chế
các phần tử nhớ đồng bộ( clocked register). Cấu trúc này hạn chế khả năng thực
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
15
hiện những hàm phức tạp và thông thường hiệu suất làm việc của vi mạch phụ
thuộc vào cấu trúc cụ thể của vi mạch hơn là vào yêu cầu bài toán.
Kiến trúc của FPGA là kiến trúc mảng các khối logic, khối logic, nhỏ hơn
nhiều nếu đem so sánh với một khối SPLD, ưu điểm này giúp FPGA có thể chứa
nhiều hơn các phần tử logic và phát huy tối đa khả năng lập trình của các phần tử
logic và hệ thống mạch kết nối, để đạt được mục đích này thì kiến trúc của FPGA
phức tạp hơn nhiều so với CPLD.
Một điểm khác biệt với CPLD là trong những FPGA hiện đại được tích hợp
nhiều những bộ logic số học đã sơ bộ tối ưu hóa, hỗ trợ RAM, ROM, tốc độ cao,
hay các bộ nhân cộng( multiplication and accumulation, MAC), thuật ngữ tiếng
Anh là DSP slice dùng cho những ứng dụng xử lý tín hiệu số DSP.
Ngoài khả năng tái cấu trúc vi mạch toàn cục, một số FPGA hiện đại còn hỗ
trợ tái cấu trúc cục bộ, tức là khả năng tái cấu trúc một bộ phận riêng lẻ trong khi
vẫn đảm bảo hoạt động bình thường cho các bộ phận khác.
2.1.3 Tại sao cần sử dụng FPGA
FPGA cũng được xem như một loại vi mạch bán dẫn chuyên dụng ASIC,
nhưng nếu so sánh FPGA với những ASIC đặc chế hoàn toàn hay ASIC thiết kế
trên thư viện logic thì FPGA không đạt đựợc mức độ tối ưu như những loại này, và
hạn chế trong khả năng thực hiện những tác vụ đặc biệt phức tạp, tuy vậy FPGA ưu
việt hơn ở chỗ có thể tái cấu trúc lại khi đang sử dụng, công đoạn thiết kế đơn giản
do vậy chi phí giảm, rút ngắn thời gian đưa sản phẩm vào sử dụng.
Còn nếu so sánh với các dạng vi mạch bán dẫn lập trình được dùng cấu trúc
mảng phần tử logic như PLA, PAL, CPLD thì FPGA ưu việt hơn các điểm: tác vụ
tái lập trình của FPGA thực hiện đơn giản hơn; khả năng lập trình linh động hơn; và
khác biệt quan trọng nhất là kiến trúc của FPGA cho phép nó có khả năng chứa khối
lượng lớn cổng logic( logic gate), so với các vi mạch bán dẫn lập trình được có
trước nó.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
16
2.1.4 Các ứng dụng của FPGA
Ứng dụng của FPGA bao gồm: xử lý tín hiệu số DSP, các hệ thống hàng
không, vũ trụ, quốc phòng, tiền thiết kế mẫu ASIC( ASIC prototyping), các hệ
thống điều khiển trực quan, phân tích nhận dạng ảnh, nhận dạng tiếng nói, mật mã
học, mô hình phần cứng máy tính, máy đánh cờ( Máy đánh cờ Hydra có 32 bộ vi xử
lý cộng thêm FPGA đã chiến thắng kiện tướng quốc tế Michael Adams trong năm
2005.
Do tính linh động cao trong quá trình thiết kế cho phép FPGA giải quyết lớp
những bài toán phức tạp mà trước kia chỉ thực hiện nhờ phần mềm máy tính, ngoài
ra nhờ mật độ cổng logic lớn FPGA được ứng dụng cho những bài toán đòi hỏi khối
lượng tính toán lớn và dùng trong các hệ thống làm việc theo thời gian thực.
2.1.5 Cấu trúc của FPGA
Cấu trúc tổng thể của một FPGA được minh họa ở hình sau:
Hình 2-1: Cấu trúc tổng thể của FPGA
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
17
Khối Logic FPGA
Hình 2-2: Khối logic FPGA
Phần tử chính của FPGA là các khối logic(logic block). Khối logic được cấu
thành từ LUT và một phần tử nhớ đồng bộ flip-flop.
LUT( Look up table) là khối logic có thể thực hiện bất kì hàm logic nào từ 4
đầu vào, kêt quả của hàm này tùy vào mục đích mà gửi ra ngoài khối logic trực tiếp
hay thông qua phần tử nhớ flip-flop.
Trong tài liệu hướng dẫn của các dòng FPGA của Xilinx còn sử dụng khái
niệm SLICE, 1 Slice tạo thành từ gồm 4 khối logic, số lượng các Slices thay đổi từ
vài nghìn đến vài chục nghìn tùy theo loại FPGA.
Nếu nhìn cấu trúc tổng thể của mảng LUT thì ngoài 4 đầu vào kể trên còn hỗ
trợ thêm 2 đầu vào bổ sung từ các khối logic phân bố trước và sau nó nâng tổng số
đầu vào của LUT lên 6 chân. Cấu trúc này là nhằm tăng tốc các bộ số học logic.
Hệ thống mạch liên kết
Mạng liên kết trong FPGA được cấu thành từ các đường kết nối theo hai
phương ngang và đứng, tùy theo từng loại FPGA mà các đường kết nối được chia
thành các nhóm khác nhau, ví dụ trong XC4000 của Xilinx có 3 loại kết nối: ngắn,
dài và rất dài. Các đường kết nối được nối với nhau thông qua các khối chuyển
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
18
mạch lập trình được( programmable switch), trong một khối chuyển mạch chứa một
số lượng nút chuyển lập trình được đảm bảo cho các dạng liên kết phức tạp khác
nhau.
Các phần tử tích hợp sẵn.
Ngoài các khối logic tùy theo các loại FPGA khác nhau mà có các phần tử tích
hợp thêm khác nhau, ví dụ để thiết kế những ứng dụng SoC, trong dòng Virtex 4,5
của Xilinx có chứa nhân xử lý PowerPC, hay trong Atmel FPSLIC tích hợp nhân
AVR…, hay cho những ứng dụng xử lý tín hiệu số DSP trong FPGA được tích hợp
các DSP Slide là bộ nhân cộng tốc độ cao, thực hiện hàm A*B+C, ví dụ dòng
Virtex của Xilinx chứa từ vài chục đến hàng trăm DSP slices với A, B, C 18-bit.
Block RAM
Ngoài ra những FPGA của Xilinx còn có block RAM, có thể mường tượng
như là bộ nhớ nhỏ nằm trong FPGA. Những FPGA này tuy nhỏ( khoảng vài chục kí
lô bit cho đến vài triệu bit tùy theo loại FPGA) nhưng có thể dùng để tạo một bộ
nhớ nhỏ như ROM, FIFO.
2.2. KIT Altera DE2.
DE2( Development and Education ) la một công cụ cho việc thiết kế nâng cao
các thiết bị đa phương tiện, lưu trữ và mạng.
DE2 sử dụng công nghệ state-of- the-art trong cả phần cứng và các công cụ
thiết kế nhờ máy tính giúp mở rộng phạm vi ứng dụng. DE2 có nhiều tính năng phù
hợp với cả việc sử dụng trong các phòng lab và các hệ thống số tinh vi. Altera cung
cấp các công cụ hỗ trợ phù hợp cho DE2, gồm có các hướng dẫn, các bài lab trên
DE2, và các bài minh họa…
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
19
Hình 2-3: KIT Altera DE2
Các thành phần và thông số của KIT
Hình 2-4: Các thành phần trên KIT Altera DE2
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
20
Altera Cyclone II 2C35 FPGA
Altera Serial Configuration device - EPCS16
USB Blaster dùng để lập trình hệ thống từ PC, hỗ trợ các chế độ JTAG cũng
như điều khiển trực tiếp khi sử dụng NIOS II
512 – Kbyte SRAM
8 – Mbyte SDRAM
4 – Mbyte Flash memory
Khe cắm SD Card
4 phím nhấn PushButton KEY[3:0]
18 Switch( cấp mức ‘0’ hay ‘1’)
18 đèn LEDR và 9 đèn LEDG
Có hai nguồn clock là 50 MHz và 27 MHz
Chip giải mã âm thanh 24 bits với các jack cắm line-in, line-out và
microphone
VGA DAC( 10-bit high-speed triple DACs) với cổng VGA
TV Decoder( NTSC/PAL) với TV-in( Video-in)
Cổng 10/100 Ethernet
Bộ điều khiển USB host/slave
RS – 232 với cổng kết nối 9 chân
Cổng PS/2 giao tiếp với chuột và keyboard
Cổng hồng ngoại
40 chân mở rộng
LDC 2x16
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
21
2.3. Phần mềm Quartus II
2.3.1. Giới thiệu Quartus II
Quartus II là công cụ chính được sử dụng trong quá trinh thực hiện đề tài.
Được cung cấp và cập nhật thường xuyên bởi Altera. Đây là công cụ thiết kế tốt
nhất cho các dòng chip FPGA của Altera bao gồm cả Cyclon II 2C35 có trên DE2.
Là công cụ phân tích và tổng hợp thiết kế HDL, nó cho phép nhà phát triển
thực hiện thiết kế của họ, đồng thời cho phép phân tích thời gian, kiểm tra sơ đồ
RTL, mô phỏng hệ thống và cấu hình sản phẩm một cách phù hợp nhất.
Hình 2-5: Giao diện chính
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
22
Thiết kế FPGA với SoPC( Qsys) trên Quartus II.
Dưới đây là quy trình thiết kế FPGA với các phần mềm thiết kế FPGA nói
chung và Quartus II nói riêng:
Hình 2-6: Design Flow
Design Entry – Mạch sau đã thiết kế sẽ được mô tả bởi các ngôn ngữ mô tả
phần cứng như VHDL hay Verilog, hoặc cũng có thể dùng sơ đồ
Schematic.
Synthesis – Công cụ tổ hợp sẽ tổ hợp mạch tạo ra một file netlist có chứa
các phần tử logic và các kết nối giữa chúng.
Function Simulation – Chức năng của mạch sau tổ hợp sẽ được kiểm định.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
23
Fitting – Công cụ máy tính sẽ đặt các phần tử logic được định nghĩa trong
file netlist xuống các phần tử logic trong con chip FPGA thực tế. Đồng thời
chọn ra các đường dây để kết nối chúng với nhau.
Timming Analysis – Phân tích trễ truyền dẫn trên các đường dây khác
nhau nhằm đưa ra các chỉ thị giúp cải thiện hiệu năng làm việc của mạch.
Timming Simulation – Kiểm tra đồng thời cả về mặt chức năng lẫn thời
gian của mạch.
Programming and Configuration – Thực hiện mạch trên con chip vật lý
bằng cách cấu hình các phần tử logic trên chip và thành lập các kết nối cần
thiết
2.3.2. Thiết kế dự án bằng Quartus II.
Tạo dự án, viết source code, biên dịch và nạp xuống KIT trên Quartus II.
Đề tài sử dụng phiên bản phần mềm Quartus 12.0 Web Edition.
Khởi tạo dự án: File New Project Wizard Next.
Hình 2-7: Khởi tạo dự án
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
24
Điền đường dẫn lưu dự án, tên dự án và tên thực thể chính của dự án Next.
Hình 2-8: Đường dẫn, tên dự án, tên thực thể chính.
Thêm file thiết kế vào trong dự án Next.
Hình 2-9: Add file.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
25
- Thêm file mới cho dự án: Điền tên file name Add.
- Thêm file đã có sẵn: Browse đường dẫn đến file đã tạo sẵn và Add.
- Nếu đã tạo xong dự án mà muốn thêm file thiết kế VHDL vào trong dự án:
Ở mục Project Navigator, chuyển sang tab file, click chuột phải vào file
Add/Remove File in Project Add.
Chọn dòng thiết bị sử dụng.
Hình 2-10: Chọn Device
Đối với đề tài sử dụng KIT Altera Cyclone II DE2:
- Family: Cyclone II.
- Available device: EP2C35F672C6( DE2).
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
26
Các công cụ thiết kế vi mạch khác sử dụng với phần mềm Quartus II để phát
triển dự án Next.
Hình 2-11: Công cụ thiết kế, mô phỏng.
Kết thúc quá trình khởi tạo dự án: Finish.
Hình 2-12: Kết thúc
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
27
Chọn File New VHDL File Ok Chọn nơi lưu dự án Save.
Hình 2-13: New Source
Trình soạn thảo:
Hình 2-14: Trình soạn thảo trên Quartus II
Gán chân:
- Nhấp chọn Assignments > Assignment Editor. Nhấp đôi vào <<new>>.
Nhấp chọn tín hiệu từ danh sách trải xuống làm chân được gán. Tiếp đến
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
28
nhấp đôi vào hộp bên phải hộp dành cho tín hiệu cần gán( cột Location).
Chọn chân PIN_XYZ từ danh mục hoặc có thể gõ trực tiếp vào hộp
Location.
Hình 2-15: Cửa sổ Assignment Editor dùng để gán chân
- Tương tự như trên, thực hiện gán chân cho các đầu vào khác
- Sau khi hoàn thành việc gán chân, nhấp chọn File > Save. Đóng cửa sổ
Assignment Editor, nhấp chọn Yes và biên dịch lại mạch.
Chú ý : Nên chọn tên các tín hiệu trùng với trong bảng
DE1_pin_assigment.csv thì khi gán chân ta chỉ cần vào assigment > import
assigment,trong đường dẫn ta trỏ đến file DE1_pin_assigment.csv rồi ấn OK và làm
theo bước 3 là xong.Không mất thời gian gán chân bằng tay.
Biên dịch
- Khi đã viết code xong cho một chương trình nào đó bạn cần biên dịch để
tạo ra những file dùng để nạp lên KIT DE2
- Bước 1: Nhấp chọn mục Processing > Start Complication. Biên dịch thành
công( hay không thành công) sẽ được thông báo trên hộp thoại bung ra sau
khi quá trình biên dịch kết thúc. Xác nhận bằng cách nhấp nút OK.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
29
- Bước 2: Khi biên dịch hoàn thành, một báo cáo biên dịch được đưa ra. Cửa
sổ này cũng có thể mở ra bất kỳ lúc nào bằng cách nhấp chọn Processing >
Complication Report. Trong báo cáo này bao gồm một số danh mục ở bên
trái cửa sổ, nhấp vào các danh mục này để thấy thông tin chi tiết của danh
mục này hiện lên ở bên phải cửa sổ.
- Bước 3: Sửa các lỗi: Chọn mục Analysis & Synthesis > Messages để hiển
thị thông báo lỗi. Nhấp đôi vào thông báo lỗi đầu tiên, dòng lệnh lỗi sẽ
được đánh dấu trên trình soạn thảo văn bản, sửa lại cho đúng rồi biên dịch
lại dự án.
Nạp xuống KIT
- Gạt chuyển mạch RUN/PROG sang vị trí RUN. Nhấp chọn Tools >
Programmer để có cửa sổ như trong hình. Đánh dấu vào tùy chọn
Program/Configue để cho phép nạp tệp cấu hình xxxxxx.sof.
Hình 2-16: Cửa sổ Programer
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
30
Cài Driver Usb-Blaster.
- Để có thể nạp code xuống KIT, ta phải cài Driver Usb-Blaster.
- Vào Manage(Chuột phải vào Computer) Device ManageOther Device
- Chuột phải vào Usb-Blaster Update Driver SoftwareBrowse my
computer for driver softwareChọn đường dẫn tới thư mục Driver/Usb-
Blaster(Có sẵn trong thư mục cài Altera Quartus) Next Close.
Hình 2-17: Đường dẫn đến thư mục Usb-Blaster Driver.
2.3.3. Xây dựng hệ thống bằng SoPC( Qsys) trên Quartus II
Hệ thống SoPC( System on Programable Chip) bao gồm các thành phần
chính:
CPU Nios II
Memory( onchip memory hoặc Ram ngoài)
JTAG
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
31
Port I/O
Các component
Ta mở tool SoPC builder( Qsys) trong phần mềm QUATUS II
Sau đó đặt tên hệ thống, chọn ngôn ngữ mô tả phần cứng là Verilog hay
VHDL, nhấn OK.
Hình 2-18: Chọn hệ thống SoPC dựa trên ngôn ngữ Verilog hoặc VHDL
Tạo VXL NIOS cho hệ thống.
Chọn kiểu NIOS II: tùy vào tính năng của hệ thống mà chọn lõi NIOS II cho
phù hợp. Trong vi dụ này vì không càn nhiều chức năng nên ta chon phiên bản đơn
giản nhất là phiên bản NIOS II/e bằng cách check vào mục NIOS II/e như hình bên
dưới.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
32
Hình 2-19: Chọn NIOS II processor
Đối với kiểu NIOS đơn giản ta tiếp tục next đến phần chọn thành phần JTAG.
Trong bài này ta sử dụng phiên bản NIOS II/e nên chỉ cho phép chọn JTAG level 1.
Rồi nhấn next để hoàn thành khai báo
Hình 2-20: Chọn Debug level
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
33
Tạo bộ nhớ cho NiOS II.
Nios II chỉ là một lõi vi xử lý chứ chưa phải là vi điêu khiển do đó nó cần phải
có tối thiểu ộ nhớ dữ liệu và bộ nhớ chương trình để có thể hoạt động được.
Để đơn giản nhất là dùng On-Chip Memory bằng cách double_click “On-Chip
Memory(RAM or ROM)”. Nhưng lưu ý nên chọn dung lượng bộ nhớ phù hợp từng
ứng dụng. Chiều rộng mỗi ô nhớ là 32 bit nếu là kit DE2, nếu là DE1 ta chọn bộ
nhớ là 16KB. Sau đó chọn Finish để hoàn thành.
Khi tạo bộ nhớ xong, ta tạo kết nối giữa Nios II và bộ nhớ nếu nó chưa được
kết nối. Chú ý là phải kết nối cả hai bus instruction_master và data_master.
Hình 2-21: Tạo bộ nhớ hệ thống.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
34
Tạo UART thông qua chuẩn JTAG cho NIOS
Trong Communication double click chọn JTAG UART. Nếu không biết chỉnh
gì hết thì cứ nhấn Finish để hoàn thành.
Hình 2-22: JTAG UART
Sau bước này ta có hệ thống đơn giản có thể hoạt động được như hình sau
Hình 2-23: Hệ thống SoPC tối thiểu.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
35
Tạo I/O port cho NIOS II
Hình 2-24: Tạo thêm I/O cần thiết cho hệ thống NIOS II
2.4. Phần mềm lập trình NIOS II
Việc viết phần mềm cho phần cứng FPGA cũng tương tự như quá trình phát
triển phần mềm cho bất kỳ họ vi điều khiển nào khác. Bộ công cụ phần mềm Nios II
EDS chuyên dùng để viết phần mềm chạy trên bộ vi xử lý NiosII.
Nios II Software Build Tools for Eclipse cung cấp 2 quy trình khác nhau gồm
rất nhiều thuộc tính và công cụ mã nguồn mở nhằm tạo ra chương trình phần mềm
Nios II.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
36
Các bước làm việc trên NIOS
Chọn không gian lưu trữ dự án
Hình 2-25: Chọn workspace cho dự án.
Giao diện chính
Hình 2-26: Giao diện chương trình phần mềm NIOS II
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
37
Tạo dự án
Hình 2-27: Tạo dự án mới với NIOS II
Đầu tiên chọn SOPC Information File name chính là hệ thống SOPC mà
chúng ta đã tạo ra bằng tool SoPC trên Quartus II. Browse vào hệ thống SOPC đã
tạo ra.
Khi chọn xong SOPC thì CPU name sẽ hiện lên tên CPU mà chúng ta đặt ở
phần xây dựng hệ thống. Và sau đó là đặt Project name rồi Finish. Kết thúc quá
trình tạo dự án.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
38
Trình soạn thảo
Hình 2-28: Trình soạn thảo
Nạp phần mềm xuống KIT
Hình 2-29: Nạp xuống KIT
Right Click, chọn Run As 3 Nios II Hardware.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
39
2.5. Truyền thông qua máy tính
Ngày nay các thiết bị đo lường, điều khiển ... đều phải giao tiếp với máy tính
để quan sát thông số và chế độ hoạt động của thiết bị như thế nào? Chuẩn giao tiếp
được coi là đơn giản và dễ dùng đó là RS232. Hầu như các thiết bị đều được giao
tiếp với máy tính thông qua chuẩn này.
Vấn đề giao tiếp giữa PC và vi điều khiển rất quan trọng trong các ứng dụng
điều khiển, đo lường... Ghép nối qua cổng nối tiếp RS232 là một trong những kỹ
thuật được sử dụng rộng rãi để ghép nối các thiết bị ngoại vi với máy tính.Nó là một
chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là 2 thiết
bị , chiều dài kết nối lớn nhất cho phép để đảm bảo dữ liệu là 12.5 đến 25.4m, tốc
độ 20kbit/s đôi khi là tốc độ 115kbit/s với một số thiết bị đặc biệt. Ý nghĩa của
chuẩn truyền thông nối tiếp nghĩa là trong một thời điểm chỉ có một bit được gửi đi
dọc theo đường truyền.
Có hai phiên bản RS232 được lưu hành trong thời gian tương đối dài là
RS232B và RS232C. Nhưng cho đến nay thì phiên bản RS232B cũ thì ít được dùng
còn RS232C hiện vẫn được dùng và tồn tại thường được gọi là tên ngẵn gọn là
chuẩn RS232
Các máy tính thường có 1 hoặc 2 cổng nối tiếp theo chuẩn RS232C được gọi
là cổng Com. Chúng được dùng ghép nối cho chuột, modem, thiết bị đo
lường...Trên main máy tính có loại 9 chân hoặc lại 25 chân tùy vào đời máy và
main của máy tính. Việc thiết kế giao tiếp với cổng RS232 cũng tương đối dễ dàng,
đặc biệt khi chọn chế độ hoạt động là không đồng bộ và tốc độ truyền dữ liệu thấp.
Ưu điểm của giao diện nối tiếp Rs232.
Khả năng chống nhiễu của các cổng nối tiếp cao
Thiết bị ngoại vi có thể tháo lắp ngay cả khi máy tính đang được cấp
điện
Các mạch điện đơn giản có thể nhận được điện áp nguồn nuôi qua công
nối tiếp
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
40
Những đặc điểm cần lưu ý trong chuẩn Rs232
Trong chuẩn RS232 có mức giới hạn trên và dưới( logic 0 và 1) là +-12V.
Hiện nay đang được cố định trở kháng tải trong phạm vi từ 3000 ôm - 7000 ôm.
Mức logic 1 có điện áp nằm trong khoảng -3V đến -12V, mức logic 0 từ +-3V
đến 12V.
Tốc độ truyền nhận dữ liệu cực đại là 100kbps( ngày nay có thể lớn hơn) Các
lối vào phải có điện dung nhỏ hơn 2500pF.
Trở kháng tải phải lớn hơn 3000 ôm nhưng phải nhỏ hơn 7000 ôm.
Độ dài của cáp nối giữa máy tính và thiết bị ngoại vi ghép nối qua cổng nối
tiếp RS232 không vượt qua 15m nếu chúng ta không sử model.
Các giá trị tốc độ truyền dữ liệu chuẩn : 50, 75, 110, 750, 300, 600, 1200,
2400, 4800, 9600, 19200, 28800, 38400....56600, 115200 bps.
Các mức điện áp đường truyền
RS 232 sử dụng phương thức truyền thông không đối xứng, tức là sử dụng tín
hiệu điện áp chênh lệch giữa một dây dẫn và đất. Do đó ngay từ đầu tiên ra đời nó
đã mang vẻ lỗi thời của chuẩn TTL, nó vấn sử dụng các mức điện áp tương thích
TTL để mô tả các mức logic 0 và 1. Ngoài mức điện áp tiêu chuẩn cũng cố định các
giá trị trở kháng tải được đấu vào bus của bộ phận và các trở kháng ra của bộ phát.
Mức điện áp của tiêu chuẩn RS232C( chuẩn thường dùng bây giờ) được mô tả
như sau:
Mức logic 0 : +3V , +12V
Mức logic 1 : -12V, -3V
Các mức điện áp trong phạm vi từ -3V đến 3V là trạng thái chuyển tuyến.
Chính vì từ - 3V tới 3V là phạm vi không được định nghĩa, trong trường hợp thay
đổi giá trị logic từ thấp lên cao hoặc từ cao xuống thấp, một tín hiệu phải vượt qua
quãng quá độ trong một thơì gian ngắn hợp lý. Điều này dẫn đến việc phải hạn chế
về điện dung của các thiết bị tham gia và của cả đường truyền. Tốc độ truyền dẫn
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
41
tối đa phụ thuộc vào chiều dài của dây dẫn. Đa số các hệ thống hiện nay chỉ hỗ trợ
với tốc độ 19,2 kBd .
Cổng Rs232.
Hình 2-30: Rs232 Pin table
Chức năng của các chân như sau:
- Chân 1 : Data Carrier Detect( DCD) : Phát tín hiệu mang dữ liệu
- Chân 2: Receive Data( RxD) : Nhận dữ liệu
- Chân 3 : Transmit Data( TxD) : Truyền dữ liệu
- Chân 4 : Data Termial Ready( DTR) : Đầu cuối dữ liệu sẵn sàng được kích
hoạt bởi bộ phận khi muốn truyền dữ liệu
- Chân 5 : Singal Ground( SG) : Mass của tín hiệu
- Chân 6 : Data Set Ready( DSR) : Dữ liệu sẵn sàng, được kích hoạt bởi bộ
truyền khi nó sẵn sàng nhận dữ liệu
- Chân 7 : Request to Send : yêu cầu gửi,bô truyền đặt đường này lên mức
hoạt động khi sẵn sàng truyền dữ liệu
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
42
- Chân 8 : Clear To Send( CTS) : Xóa để gửi ,bô nhận đặt đường này lên
mức kích hoạt động để thông báo cho bộ truyền là nó sẵn sàng nhận tín
hiệu
- Chân 9 : Ring Indicate( RI) : Báo chuông cho biết là bộ nhận đang nhận tín
hiệu rung chuông
Quá trình truyền dữ liệu
Truyền dữ liệu qua cổng nối tiếp RS232 được thực hiện không đồng bộ. Do
vậy nên tại một thời điểm chỉ có một bit được truyền( 1 kí tự). Bộ truyền gửi một bit
bắt đầu( bit start) để thông báo cho bộ nhận biết một kí tự sẽ được gửi đến trong lần
truyền bit tiếp the . Bit này luôn bắt đầu bằng mức 0.. Tiếp theo đó là các bit dữ
liệu( bits data) được gửi dưới dạng mã ASCII( có thể là 5,6,7 hay 8 bit dữ liệu) Sau
đó là một Parity bit( Kiểm tra bit chẵn, lẻ hay không) và cuối cùng là bit dừng - bit
stop có thể là 1, 1,5 hay 2 bit dừng.
Tốc độ Baud
Đây là một tham số đặc trưng của RS232. Tham số này chính là đặc trưng cho
quá trình truyền dữ liệu qua cổng nối tiếp RS232 là tốc độ truyền nhận dữ liệu hay
còn gọi là tốc độ bit. Tốc độ bit được định nghĩa là số bit truyền được trong thời
gian 1 giây hay số bit truyền được trong thời gian 1 giây. Tốc độ bit này phải được
thiết lập ở bên phát và bên nhận đều phải có tốc độ như nhau( Tốc độ giữa vi điều
khiển và máy tính phải chung nhau 1 tốc độ truyền bit)
Ngoài tốc độ bit còn một tham số để mô tả tốc độ truyền là tốc độ Baud. Tốc
độ Baud liên quan đến tốc độ mà phần tử mã hóa dữ liệu được sử dụng để diễn tả
bit được truyền còn tôc độ bit thì phản ánh tốc độ thực tế mà các bit được truyền.Vì
một phần tử báo hiệu sự mã hóa một bit nên khi đó hai tốc độ bit và tốc độ baud là
phải đồng nhất
Một số tốc độ Baud thường dùng: 50, 75, 110, 150, 300, 600, 1200, 2400,
4800, 9600, 19200, 28800, 38400, 56000, 115200 … Trong thiết bị họ thường dùng
tốc độ là 19200
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
43
Khi sử dụng chuẩn nối tiếp RS232 thì yêu cầu khi sử dụng chuẩn là thời gian
chuyển mức logic không vượt quá 4% thời gian truyền 1 bit. Do vậy, nếu tốc độ bit
càng cao thì thời gian truyền 1 bit càng nhỏ thì thời gian chuyển mức logic càng
phải nhỏ. Điều này làm giới hạn tốc Baud và khoảng cách truyền.
Parity bit
Đây là bit kiểm tra lỗi trên đường truyền. Thực chất của quá trình kiểm tra lỗi
khi truyền dữ liệu là bổ xung thêm dữ liệu được truyền để tìm ra hoặc sửa một số lỗi
trong quá trình truyền . Do đó trong chuẩn RS232 sử dụng một kỹ thuật kiểm tra
chẵn lẻ.
Một bit chẵn lẻ được bổ sung vào dữ liệu được truyền để cho thấy số lượng
các bit "1" được gửi trong một khung truyền là chẵn hay lẻ.
Một Parity bit chỉ có thể tìm ra một số lẻ các lỗi chả hạn như 1,3,,5,7,9... Nếu
như một bit chẵn được mắc lỗi thì Parity bit sẽ trùng giá trị với trường hợp không
mắc lỗi vì thế không phát hiện ra lỗi. Do đó trong kỹ thuật mã hóa lỗi này không
được sử dụng trong trường hợp có khả năng một vài bit bị mắc lỗi.
2.6. Avalon Bus
Avalon bus là một kiến trúc bus giản đơn, được thiết kế để kết nối các vi xử lý
nhúng và các thiết bị ngoại vi trong một hệ-thống-trên-chip-khả-trình( SOPC).
Avalon bus là một giao tiếp mà đặc tả các kết nối cổng giữa các thiết bị master và
slave, đồng thời đặc tả thời gian liên lạc giữa các thiết bị.
Mục đích thiết kế chính của Avalon bus là:Đơn giản: cung cấp một giao thức
dễ hiểu, dễ sử dụng. Tối ưu hóa việc sử dụng tài nguyên cho các bus logic: bảo toàn
các yếu tố logic( loigic element) bên trong thiết bị logic khả trình( PLD).
Đồng bộ hóa các quá trình hoạt động: vừa tích hợp tốt với các logic của người
dùng cùng tồn tại trên một PLD, lại vừa tránh được các vấn đề phân tích thời gian
phức tạp.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
44
Avalon bus hỗ trợ bus đa chủ. Các kiến trúc đa chủ này tạo ra một sự linh hoạt
rất lớn trong việc xây dựng các hệ thống SOPC, và tạo điều kiện cho các thiết bị
ngoại vi có băng thông rộng. Ví dụ: một thiết bị ngoại vi chủ có thể thực hiện một
quá trình truyền truy-xuất-bộ-nhớ-trực-tiếp( DMA) để truyền dữ liệu từ thiết bị
ngoại vi vào bộ nhớ mà không cần một vi xử lý trong đường truyền dữ liệu.
Các master và slave giao tiếp với nhau dựa trên một kĩ thuật gọi là thỏa hiệp ở
phía slave( slave-side arbitration). Kĩ thuật này xác định master nào được nắm
quyền giao tiếp với slave trong trường hợp nhiều master cùng truy cập đến một
slave.
Chi tiết về sự thỏa hiệp này được gói gọn bên trong Avalon bus. Do đó, các
giao tiếp master và slave rất chắc, bất chấp số lượng các master và slave có trên bus.
Mỗi bus master sẽ giao tiếp với Avalon bus như thể nó là master duy nhất trên
đường Avalon bus.
Các master có thể thực hiện quá trình truyền bất kì lúc nào, miễn là chúng
không truy cập cùng một slave trong cùng một chu kì bus.
Avalon bus được thiết kế để thích nghi với môi trường SOPC, do đó nó là một
kiến trúc bus tích hợp( on-chip) rất năng động, bao gồm các tài nguyên logic và
truyền bên trong một thiết bị logic khả trình. Một vài nét chính của kiến trúc Avalon
là:
Giao tiếp với các thiết bị ngoại vi đồng bộ với xung clock Avalon. Do đó, sự
sắp xếp các tín hiệu báo và tín hiệu bắt tay không đồng bộ và phức tạp là điều
không cần thiết. Hoạt động của Avalon bus( và cũng là của toàn hệ thống) có thể
được phân tích bằng các kĩ thuật phân tích chuẩn và đồng bộ thời gian.
Tất cả các tín hiệu đều hoạt động ở LOW hoặc HIGH, điều này cho phép sự
xoay vòng của hệ thống. Các bộ đa hợp bên trong Avalon bus xác định tín hiệu nào
điều khiển thiết bị ngoại vi nào. Các thiết bị ngoại vi sẽ không cần phải có ngõ ra 3-
trạng-thái ngay cả khi thiết bị không được chọn hoạt động.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
45
Các tín hiệu địa chỉ, dữ liệu và điều khiển sử dụng các cổng riêng biệt, điều
này làm đơn giản hóa thiết kế của các thiết bị ngoại vi. Một thiết bị ngoại vi không
cần thiết phải giải mã các chu kì bus dữ liệu và địa chỉ, và cũng không cần phải tắt
các ngõ ra khi nó không được chọn hoạt động.
Không gian địa chỉ lên tới 4Gbyte: các thiết bị ngoại vi và bộ nhớ có thể được
gắn bất kì nơi nào trong không gian địa chỉ 32-bit.
Tích hợp bộ giải mã địa chỉ: Avalon bus sẽ tự động tạo các tín hiệu Chip
Select cho tất cả các thiết bị ngoại vi, rất thuận tiện trong việc thiết kế các thiết bị
ngoại vi để giao tiếp với Avalon.
Avalon bus cũng bao gồm một số các đặc điểm và quy ước để hỗ trợ việc tạo
tự động các hệ thống, bus, và thiết bị bằng phần mềm SOPC Builder.
2.6.1. Avalon Bus Module
Avalon bus module là xương sống của một module hệ thống. Đó là con đường
chính để giao tiếp giữa các component trong một thiết kế SOPC. Avalon bus
module là một tập hợp các tín hiệu điều khiển, dữ liệu, địa chỉ và các logic thỏa hiệp
mà kết nối các thành phần tạo nên hệ thống. Avalon bus module thực hiện một kiến
trúc bus có thể cấu hình được, có nghĩa là có thể thay đổi để phù hợp với nhu cầu
kết nối các thiết bị ngoại vi của người thiết kế.
Avalon bus module được tạo một cách tự động bởi SOPC Builder, vì thế
người thiết kế hệ thống có thể tiết kiệm thời gian trong việc nối các thiết bị với
nhau. Sơ đồ khối của một Avalon bus module điển hình được trình bày trong hình.
Avalon bus module sẽ cung cấp các hỗ trợ sau cho những thiết bị ngoại vi kết
nối tới đường bus này:
Đa hợp đường dữ liệu: Các bộ đa hợp bên trong module Avalon bus sẽ truyền
dữ liệu từ thiết bị slave được chọn đến thiết bị master thích hợp.
Giải mã địa chỉ: bộ giải mã địa chỉ của module này sẽ tạo ra các tín hiệu chip
select cho mỗi thiết bị ngoại vi, như vậy các thiết bị ngoại vi không cần giải mã
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
46
đường địa chỉ để tạo ra tín hiệu chip select đơn giản hóa các thiết kế của thiết bị
ngoại vi.
Tạo trạng thái chờ: bộ tạo trạng thái chờ sẽ mở rộng thêm các quá trình
truyền bằng một hay nhiều chu kì bus, điều này cần thiết cho một số thiết bị hoặc
quá trình đòi hỏi sự đồng bộ đặc biệt. Trạng thái này có thể được tạo ra để dừng một
thiết bị master trong hợp thiết bị slave không thể đáp ứng trong một chu kì bus.
Phân công ưu tiên ngắt: khi một hay nhiều thiết bị slave tạo ra các tín hiệu
ngắt, Avalon bus module sẽ chuyển các ngắt( theo thứ tự ưu tiên) đến cá thiết bị
master kèm theo số yêu cầu ngắt( IRQ number) thích hợp.
Khả năng trì hoãn các dữ liệu: các logic cần để thực hiện việc truyền với độ
trễ mong muốn giữa các cặp master-slave đã được tích hợp sẵn trong Avalon bus
module.
Hình 2-31: Sơ đồ khối một Avalon bus module trong thiết kế
2.6.2. Các thiết bị ngoại vi Avalon
Một thiết bị ngoại vi Avalon là một thiết bị logic, hoặc được tích hợp sẵn hoặc
nằm rời bên ngoài, thực hiện một số chức năng ở mức hệ thống và giao tiếp với các
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
47
thành phần khác trong hệ thống thông qua Avalon bus. Các thiết bị này có thể được
thêm vào hoặc lấy ra khỏi hệ thống vào thời điểm thiết kế để phù hợp với yêu cầu
của hệ thống.
Thiết bị ngoại vi Avalon có thể là các bộ nhớ, vi xử lý, hay các thành phần
thiết bị ngoại vi truyền thống như UART, PIO, bộ định thời…. Bất kì logic người
dùng nào cũng có thể là một thiết bị ngoại vi, chỉ cần cung cấp giao tiếp địa chỉ, dữ
liệu và điều khiển cho Avalon bus. Một thiết bị ngoại vi sẽ kết nối với các cổng
riêng biệt trên Avalon bus module.
Chức năng của các thiết bị ngoại vi Avalon được phân loại thành master hoặc
slave. Một thiết bị ngoại vi chủ( master) là một thiết bị mà có thể khởi tạo quá trình
truyền dữ liệu trên Avalon bus. Nó cần ít nhất một cổng master nối với Avalon bus,
và có thể có các cổng slave để nhận dữ liệu từ các thiết bị chủ khác. Một thiết bị
slave là một thiết bị chỉ chấp nhận việc truyền dữ liệu từ Avalon bus và không thể
khời tạo quá trình truyền. Một số thiết bị slave điển hình như bộ nhớ hay cổng nối
tiếp sẽ có duy nhất một cổng slave nối với Avalon bus.
Master Port: Một cổng chủ là tập hợp các cổng trên một thiết bị chủ mà các
cổng này được sử dụng để khởi tạo các quá trình truyền trên Avalon bus. Cổng chủ
nối trực tiếp tới Avalon bus module. Trên thực tế, một thiết bị ngoại vi thường có
một hoặc nhiều cổng chủ, cũng như cồng slave. Sự phụ thuộc lẫn nhau giữa các
cổng này tùy vào thiết kế của thiết bị.
Cổng slave: Một cổng slave là một nhóm các cổng trên một thiết bị ngoại vi
mà chấp nhận việc truyền dữ liệu qua Avalon bus từ một cổng chủ.
Cặp chủ-tớ( master-slave pair): Một cặp chủ-tớ là sự kết hợp giữa một cổng
slave và một cổng master thông qua Avalon bus module. Về mặt cấu trúc, những
cổng master và slave này kết nồi đến cổng tương ứng trên Avalon bus module và
phải được chỉ rõ khi thiết kế trong SOPC Builder.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
48
CHƯƠNG 3: NỘI DUNG THỰC HIỆN
Chương này sẽ trình bày nội dung thực hiện công việc của đề tài bao gồm sơ
đồ hệ thống tổng quát, chi tiết thiết kế, lưu đồ thuật toán, sơ đồ nguyên lý và hình
ảnh module thực tế.
Sơ đồ tổng quát hệ thống 3.1
Sơ đồ tổng quát của hệ thống như sau:
Hình 3-1: Sơ đồ tổng quát hệ thống
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
49
Sơ đồ khối tổng quát bao gồm những thành phần:
Computer: Dùng để nạp chương trình xuống KIT và truyền nhận dữ liệu để
điều khiển.
NIOS II Processor: Khu xử lý trung tâm đóng vai trò truyền nhận và xử lý dữ
liệu.
JTAG Debug Module: Nạp chương trình xuống KIT.
Rs232: Kết nối điều khiển từ máy tính xuống KIT thông qua cáp nối Rs232.
SRAM on chip: Bộ nhớ chương trình.
Avalon Bus: Giao tiếp giữa các Component trong một hệ thống SoPC.
EFAN: Các tín hiệu điều khiển hộp số của Quạt.
LCD: Các tín hiệu điều khiển LCD Character.
LED Controler: Điều khiển LED.
FAN: Tín hiệu kết nối với Quạt.
LCD Character: Hiển thị trạng thái ngoại vi.
Lamp: Tín hiệu kết nối với Đèn.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
50
Chi tiết thiết kế hệ thống 3.2
3.2.1. NIOS II Processor – nios2_qsys_0
Với yêu cầu của đề tài, tính năng của hệ thống còn cơ bản, không cần nhiều
chức năng nên chọn lõi NIOS II phiên bản NIOS II/e như hình bên dưới.
Hình 3-2: Chọn phiên bản NIOS II/e
Với phiên bản NIOS II/e này chúng ta có 1 bộ vi xử lý 32 bit. Với Jtag debug
Module là Level 1. Gồm các thành phần tín hiệu cơ bản sau:
Clk: Clock Input
Reset_n: Reset Input
Data_master: Avalon Memory Mapped Master
Intruction_master: Avalon Memory Mapped Master
Jtag_debug_module_reset: Reset Output
Jtag_debug_module: Avalon Memory Mapped Slave
Custom_intruction_master: Custom Intruction Master
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
51
3.2.2. JTAG Debug Module – jtag_uart_0
Hình 3-3: Component Jtag_uart
Chọn mặc định Jtag uart như trong hình.
3.2.3. Rs232 – UART( Rs232 Serial Port)
Hình 3-4: Component Rs232
input wire uart_0_rxd, // uart_0.rxd
output wire uart_0_txd, // .txd
Component Uart( uart_0) với thông số như sau:
Data bits: 8
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
52
Stop bits: 1
Synchronizer stage: 2
Baud rate: 57600 bps
3.2.4. SRAM On Chip – onchip_memory2_0
Hình 3-5: SRAM On Chip
Tạo ra bộ nhớ Ram on Chip với tổng dung lượng là 40960 bytes.
3.2.5. EFAN
Hình 3-6: EFAN
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
53
PIO Efan với 3 tín hiệu chính là 3 tín hiệu điều khiển Quạt, tương ứng với số 1,
số 2, số 3 của Quạt.
output wire [2:0] efan_export,
3.2.6. LCD
Khối LCD là khối điều khiển LCD gồm những thành phần sau:
inout wire [7:0] lcd_data, // lcd.data
output wire lcd_E, // .E
output wire lcd_RS, // .RS
output wire lcd_RW, // .RW
Lcd_data – pio_3: Gồm 8 tín hiệu.
Hình 3-7: Lcd_data
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU. Có 2 chế độ
sử dụng 8 đường bus này :
Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7.
Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là
DB7
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
54
Lcd_rw – pio_4: Chân chọn thanh ghi.
Hình 3-8: Lcd_rw
Chân chọn chế độ đọc/ghi( Read/Write). Nối chân R/W với logic “0” để LCD
hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc.
Lcd_rs – pio_5: Chân chọn thanh ghi( Register select).
Hình 3-9: Lcd_rs
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
55
Nối chân RS với logic “0”( GND) hoặc logic “1”( VCC) để chọn thanh ghi.
Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD( ở chế
độ“ghi”- write) hoặc nối với bộ đếm địa chỉ của LCD( ở chế độ “đọc” - read)
Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD.
Lcd_e – pio_6: Chân cho phép( Enable)
Hình 3-10: Lcd_e
Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận
khi có 1 xung cho phép của chân E.
Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào( chấp nhận) thanh
ghi bên trong nó khi phát hiện một xung( high-to-low transition) của tín
hiệu chân E.
Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh
lên( lowto-high transition) ở chân E và được LCD giữ ở bus đến khi nào
chân E xuống mức thấp.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
56
3.2.7. LED Controler – pio_0 – led_green
Hình 3-11: Led control
Led control gồm 8 tín hiệu điều khiển tương ứng với 8 led green được tích hợp
trên KIT Altera DE2.
wire [7:0]led_green;
Bóng đèn ngoại vi được điều khiển nhờ vào tín hiệu của led green, từ đó, led
green trên KIT sáng thì bóng đèn ngoại vi cũng sáng.
output wire lamp,
assign lamp = ~led_green_export[0];
3.2.8. Avalon Bus
Quá trình đọc dữ liệu từ cổng Slave
Trong suốt quá trình này chân read_n và chipselect phải được kích hoạt. Một
đơn vị dữ liệu sẽ được chuyển từ cổng slave đến Avalon bus module với kích thước
bằng với độ rộng tối đa của cồng slave. Như vậy, trong module giao tiếp ta phải có
lệnh để khi Avalon bus thiết lập một quá trình đọc từ cổng slave, thiết kế của ta phải
đáp ứng lại chính xác dữ liệu muốn truyền lên. Có thể thực hiện việc này bằng các
lệnh sau:
always @(posedge clk) begin
read_cycle <=( !read_n) & chipselect;
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
57
read_data <= data
end
Hình sau mô tả các chân kết nối cần thiết giữa cổng slave từ component mà ta
thiết kế với Avalon bus module.
Hình 3-12: Giao tiếp giữa cổng Slave và Avalon Bus Module trong quá
trình đọc từ Slave
Quá trình truyền này cụ thể gồm các giai đoạn: module Avalon bus nhận địa
chỉ và tín hiệu read_n, giải mã địa chỉ và tạo ra tín hiệu chipselect, dữ liệu được
cổng slave truyền lên. Hình sau mô tả chi tiết về thời gian trong quá trình đọc từ
cổng slave.
Hình 3-13: Thời gian trong quá trình đọc dữ liệu từ cổng slave
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
58
Quá trình mô tả trên chỉ là quá trình đọc cơ bản từ các cổng slave. Ngoài ra, ta
có thể đọc từ cổng slave với nhiều cách( phụ thuộc vào thiết kế) như: đọc có trạng
thái chờ, đọc có thời gian cài đặt…
Quá trình ghi dữ liệu qua cổng Slave
Trong quá trình này, tín hiệu write_n và chipselect sẽ được kích hoạt. Dữ liệu
sẽ được truyền từ Avalon bus module ra cổng slave. Trong trường hợp cổng này
chưa đáp ứng được, thì quá trình truyền phải có trạng thái chờ. Ta có thể đơn giản
hoá thực thi này bằng các dòng lệnh sau trong module thiết kế:
always @(posedge clk) begin
write_cycle <=( !write_n) & chipselect;
data <= write_data;
end
Và sau khi module không đáp ứng kịp với tốc độ truyền dữ liệu từ Avalon
bus module ta có thể bật tín hiệu waitrequest lên. Sơ đồ khối các tín hiệu giao tiếp
trong quá trình ghi và thời gian của quá trình này được trình bày trong hình sau.
Hình 3-14: Các tín hiệu giao tiếp và thời gian trong khi ghi dữ liệu ra cổng
slave
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
59
Thiết kế giao diện điều khiển trên máy tính. 3.3
Sử dụng phần mềm Visual Studio 2010 thiết kế giao diện trên máy tính bằng
Windows Form Application của C#. Chương trình này được dùng khá phổ biến, phù
hợp để thiết kế giao tiếp bởi giao diện thân thiện với người dùng.
Hệ thống được kết nối với máy tính thông qua đường Rs232( sử dụng mạch
chuyển USB sang Rs232) với tốc độ Baud là 57600.
Trên máy tính, có giao diện điều khiển được viết bằng C#, CPU Nios II sẽ
nhận lệnh từ máy tính để điều khiển đèn, quạt và hiển thị thông báo trên LCD của
kit.
Giao diện điều khiển cơ bản gồm các đối tượng chính:
2 button dùng để bật, tắt đèn
3 button tương ứng với 3 chế độ của quạt và 1 button dùng để tắt quạt.
2 button kết nối và ngắt kết nối.
1 button thoát chương trình
2 label hiển thị trạng thái của đèn và quạt.
2 picturebox giúp hiển thị một cách trực quan các trạng thái.
1 timer để hiển thị trạng thái của quạt.
1 SerialPort Com
1 ImageList
3 groupBox
1 ComboBox để chọn cổng kết nối
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
60
Giao diện chương trình:
Hình 3-15: Giao diện chương trình chính
Hình 3-16: Giao diện chương trình điều khiển
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
61
Màu xanh hiển thị trên button cho thấy mạch đang hoạt động ở chức năng đó.
Ví dụ hình 3.16 là hệ thống đang ngắt kết nối, đèn tắt, quạt tắt.
Lưu đồ thuật toán 3.4
3.4.1. Quá trình gửi
Hình 3-17: Lưu đồ thuật toán quá trình gửi dữ liệu
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
62
Chương trình của Nios II sẽ được nạp lên SRAM ON CHIP. Quá trình hoạt
động sẽ được điều khiển từ trên máy tính bằng cách sử dụng giao diện, lệnh này sẽ
được truyền đến KIT thông qua đường UART( Rs232 Serial Port)
Cụ thể khi button Số 1( btnSo1) được nhấn, máy tính sẽ gửi xuống một kí tự
“1”(FAN1)
Tương tự khi button Số 2( btnSo2) được nhấn, máy tính sẽ gửi xuống một kí
tự “2”(FAN2).
Khi button Số 3( btnSo3) được nhấn, máy tính sẽ gửi xuống một kí tự
“3”(FAN3)
Khi button Tắt quạt( btnTatQ) được nhấn, máy tính sẽ gửi xuống một kí tự
“0”(FAN_OFF).
Button Bật đèn( btnBatD) được nhấn, máy tính sẽ gửi xuống một kí tự
“4”(LAMP_ON).
Button Tắt đèn( btnTatD) được nhấn, máy tính sẽ gửi xuống một kí tự
“5”(LAMP_OFF)
3.4.2. Quá trình nhận
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
63
Hình 3-18: Lưu đồ thuật toán quá trình nhận dữ liệu
Nếu nhận được kí tự ‘0’, efan_off() IOWR(EFAN_BASE, 0, 0x7), khi đó tất
cả các kênh Relay mở và quạt không quay.
Nếu nhận được kí tự ‘1’, efan_on(LEVEL1), LEVEL1 = 0x3, kênh EN1 đóng,
EN2,3 mở và quạt chạy số 1.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
64
Nếu nhận được kí tự ‘2’, efan_on(LEVEL2), LEVEL2 = 0x5, kênh EN2 đóng,
kênh EN1,3 mở và quạt chạy số 2.
Nếu nhận được kí tự ‘3’, efan_on(LEVEL3), LEVEL3 = 0x6, kênh EN3 đóng,
EN1,2 mở và quạt chạy số 3.
Nếu nhận được kí tự ‘4’, led_on() IOWR(PIO_0_BASE, 0, 1), kênh EN4
đóng và đèn sáng.
Nếu nhận được kí tự ‘5’, led_off() IOWR(PIO_0_BASE, 0, 0), kênh EN4
mở và đèn tắt.
Sơ đồ nguyên lý. 3.5
3.5.1. Kết nối chân tín hiệu điều khiển ngoại vi
Đề tài sử dụng phương pháp điều khiển Relay 4 kênh để điều khiển các thiết bị
ngoại vi. Trong đó 1 kênh để điều khiển bật tắt bóng đèn và ba kênh còn lại điều
khiển 3 mức chạy của quạt là số 1, số 2 và số 3.
Kết nối Relay với KIT thông qua chân mở rộng của KIT DE2.
Hình 3-19: Connect to GPIO1( DE2 KIT)
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
65
Bảng 3-1: Chân kết nối tín hiệu điều khiển GPIO1
Tên tín hiệu FPGA Pin Mô tả
efan_export[2] PIN_P24 FAN1
efan_export[1] PIN_R24 FAN2
efan_export[0] PIN_T22 FAN3
lamp PIN_T24 LAMP
3.5.2. Sơ đồ ghép nối Rs232.
KIT Altera DE2 sử dụng mạch chuẩn giao tiếp Rs232 dùng IC Max232.
Max232 là IC chuyên dùng cho giao tiếp giữa RS232 và thiết bị ngoại vi.
Max232 là IC của hãng Maxim. Đây là IC chay ổn định và được sử dụng phổ biến
trong các mạch giao tiếp chuẩn RS232. Dòng tín hiệu được thiết kế cho chuẩn
RS232 . Mỗi đầu truyền ra và cổng nhận tín hiệu đều được bảo vệ chống lại sự
phóng tĩnh điện( hình như là 15KV). Ngoài ra Max232 còn được thiết kế với nguồn
+5V cung cấp nguồn công suất nhỏ.
Mạch giao tiếp như sau:
Hình 3-20: Mạch chuẩn giao tiếp Rs232 dùng IC Max232
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
66
Bảng 3-2: Rs232 pin assignments
Tên tín hiệu PFGA pin Mô tả
Uart_0_txd PIN_B25 UART Transmit
Uart_0_rxd PIN_C25 UART Reciever
3.5.3. Sơ đồ module màn hình LCD
Hình 3-21: Sơ đồ module màn hình LCD
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
67
Bảng 3-3: LCD Module pin assignment
Tên tín hiệu FPGA pin Mô tả
LCD_DATA[0] PIN_J1 LCD DATA[0]
LCD_DATA[1] PIN_J2 LCD DATA[1]
LCD_DATA[2] PIN_H1 LCD DATA[2]
LCD_DATA[3] PIN_H2 LCD DATA[3]
LCD_DATA[4] PIN_J4 LCD DATA[4]
LCD_DATA[5] PIN_J3 LCD DATA[5]
LCD_DATA[6] PIN_H4 LCD DATA[6]
LCD_DATA[7] PIN_H3 LCD DATA[7]
LCD_RW PIN_K4 LCD Read/Write Select, 0 = Write,
1 = Read
LCD_EN PIN_K3 LCD Enable
LCD_RS PIN_K1 LCD Command/Data Select, 0 =
Command, 1 = Data
LCD_ON PIN_L4 LCD Power ON/OFF
LCD_BLON PIN_K2 LCD Back Light ON/OFF
3.5.4. Sơ đồ nguyên lý Relay 4 kênh
Module Relay sử dụng 6 đầu vào là Vcc, GND để nuôi nguồn, 4 đầu vào ENB
để điều khiển Module. PC 817 đóng vai trò dung để cách lý giữa hai khối điện áp
chênh lệch. Relay đóng vai trò là một kho đóng mở, dùng để đóng cắt những nguồn
điện áp lớp( 12V-220V/10A).
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
68
Trong đó Vcc và GND được nối với 2 chân mở rộng Vcc, GND của KIT DE2.
4 đầu vào EN1,2,3,4 chính là 4 tín hiều điều khiển ngoại vi: 3 tín hiệu điều
khiển 3 số của quạt và 1 tín hiệu điều khiển đèn.
Hình 3-22: Sơ đồ nguyên lý Module Relay 4 kênh
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
69
Hình ảnh module thực tế 3.6
Hình ảnh Module Relay 4 kênh 5V-220V/10A
Hình 3-23: Module Relay 4 kênh - 5V-220V/10A
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
70
CHƯƠNG 4: KẾT LUẬN
Chương này sẽ trình bày kết quả đạt được của đề tài, hạn chế và hướng phát
triển của đề tài trong thời gian tới.
Kết quả đạt được của đề tài 4.1
Sau thời gian nghiên cứu và thực hiện kể từ khi nhận đề tài, bằng sự nỗ lực
của bản thân, bên cạnh đó nhờ sự hướng dẫn nhiệt tình, tận tâm của thầy Lê Trung
Hiếu do đó đề tài này đã được hoàn thành đúng thời hạn và đạt được yêu cầu đặt ra
là thiết kế hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính. Trong quá
trình thực hiện nhóm đã thu được những kết quả sau:
Giới thiệu về FPGA, ứng dụng trong rất nhiều các lĩnh vực công nghệ, sản
xuất, quân sự, các thiết bị điều khiển thông minh và trong nhiều ngành công
nghiệp khác…
Nẵm được tổng quan, cấu trúc của FPGA và quy trình thiết kế FPGA.
Thiết kế được hệ thống nhúng trên NIOS bằng cách xây dựng phần cứng
cũng như phần mềm, cá chế độ gửi và nhận tín hiệu. Điều khiển hoạt động
của hệ thống sao cho tối ưu và ổn định, an toàn. Hệ thống được xây dựng
hoàn chỉnh tử những khối nhỏ. Giao tiếp được giữa máy tính và thiết bị điều
khiển, xây dựng giao diện điều khiển thành công trên Visual Studio.
Quá trình chạy thử nghiệm cho thấy tính ổn đinh, phần mềm được xây dựng
đơn giản, dễ sử dụng và đem lại hiệu quả hoạt động cao.
Để thực hiện được đề tài này Em đã thực hiện tìm hiểu, nghiên cứu các vấn
đề có liên quan đến đề tài như: Cách thiết kế phần cứng và phần mềm cho
KIT thông qua Quartus II và tool SoPC( Qsys) trên Quartus II, phần mềm lập
trình nhúng NIOS, giao tiếp giữa máy tính và KIT DE2 thông qua UART-
JTAG và RS232. Xây dựng hệ thống với ngoại vi có sẵn trên KIT(LCD
Display, LED) và ngoại vi mở rộng( GIPO). Ngôn ngữ lập trình Verilog, C.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
71
Hạn chế của đề tài 4.2
Hệ thống nhúng trên NIOS điều khiển thiết bị ngoại vi là một ứng dụng nhúng
cơ bản trên KIT Altera DE2, nên sản phẩm chỉ mang tính DEMO chưa có tính
thương mại, chưa có tính công nghệ cao. Các ứng dụng điều khiển còn đơn giản,
chưa ứng dụng nhiều module tự động hóa.
Hướng phát triển của đề tài 4.3
Trong thời gian nghiên cứu và thực hiện đề tài, tác giả đã vạch ra được hướng
phát triển tiếp theo của đề tài như sau:
Xây dựng thêm các Control làm phong phú trên việc tùy biến giao
diện điều khiển.
Bổ sung các Module tự động hóa mang tính công nghệ cao, có thể
ứng dụng trong việc sản xuất để có thể ứng dụng trong thương mại.
Nghiên cứu và triển khai sử dụng các ngoại vi khác trên Kit làm
phong phú thêm chức năng, công nghệ sử dụng cao hơn cho đề tài.
Điều khiển thiết bị qua mạng LAN, INTERNET,…
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
72
TÀI LIỆU THAM KHẢO
[1] TS Vũ Đức Lung, Giáo trình ngôn ngữ mô tả phần cứng Verilog, Đại học
bách khoa thành phố Hồ Chí Minh, 2012.
[2] Altera, DE2_Manual User, altera.com.
[3] Dr. Pong P. Chu, Embedded SoPC Design with Nios II Processor and
Verilog Examples, 2012.
[4] Nguyễn Thế Hoàng, Thí nghiệm thiết kế FPGA, Khoa Công Nghệ Điện Tử,
ĐH Công Nghiệp TP HCM.
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
73
PHỤ LỤC
1. Mã Verilog mô tả hệ thống.
module de2_top(
output wire [17:0] led_red_export,
output wire dir_export,
input wire reset_n,
input wire phase_zero,
inout wire [7:0] lcd_data,
wire lcd_E,
output wire lcd_RS,
wire lcd_RW,
output wire lcd_ON,
input wire clk,
output wire pwm_export,
output wire lamp,
output wire [7:0] led_green_export,
inout wire [15:0] sram_DQ,
output wire [17:0] sram_ADDR,
output wire sram_LB_N,
output wire sram_UB_N,
output wire sram_CE_N,
output wire sram_OE_N,
output wire sram_WE_N,
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
74
output wire [2:0] efan_export,
output wire [2:0] efan_export_led,
input wire uart_0_rxd, // uart_0.rxd
output wire uart_0_txd, // .txd
output wire [56:0] led_seg // led_green.export
);
wire [2:0] efan_export_sign;
wire [7:0]led_green;
wire [7:0] phase_export;
assign lcd_ON = 1'b1;
assign led_seg ={57{1'b1}};
reg [31:0]counter=0;
reg [8:0] counter_phase;
reg [8:0] counter_phase_store;
assign led_green_export =( led_green == 1)? 8'hff :( (led_green == 2)?
{8{counter[24]}}:8'h00);
assign lamp = ~led_green_export[0];
assign led_red_export[16] = pwm_export;
assign led_red_export[17] = dir_export;
assign led_red_export[15] = !dir_export;
assign led_red_export[0] = !efan_export_sign[2];
assign led_red_export[1] = !efan_export_sign[1];
assign led_red_export[2] = !efan_export_sign[0];
assign efan_export = efan_export_sign;
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
75
assign efan_export_led = efan_export_sign;
reg phase_zero_L1, phase_zero_L2, phase_zero_L3;
always @( posedge clk)begin
phase_zero_L1 <= phase_zero;
phase_zero_L2 <= phase_zero_L1;
phase_zero_L3 <= phase_zero_L2;
end
always @( posedge clk)begin
counter <= counter + 1;
end
always @( posedge clk)begin
if(phase_zero_L3 == 1'b0 | !reset_n)
counter_phase <= 8'b0;
else
counter_phase <= counter_phase + 1'b1;
end
always @( posedge clk)begin
if(reset_n)
counter_phase_store <= 8'b0;
else if( phase_zero_L2 == 1'b0 & phase_zero_L3 == 1'b1)
counter_phase_store <= counter_phase/100;
end
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
76
assign dir_export = (counter_phase_store * phase_export) >
counter_phase;
soc_qsys U(
.reset_reset_n(reset_n), // reset.reset_n
.clk_clk(clk), // clk.clk
.led_red_export(), // led_red.export
.dir_export(), // dir.export.
/*
.sram_DQ(sram_DQ), // sram.DQ
.sram_ADDR(sram_ADDR), // .ADDR
.sram_LB_N(sram_LB_N), // .LB_N
.sram_UB_N(sram_UB_N), // .UB_N
.sram_CE_N(sram_CE_N), // .CE_N
.sram_OE_N(sram_OE_N), // .OE_N
.sram_WE_N(sram_WE_N), // .WE_N
*/
.phase_export(phase_export),
.efan_export(efan_export_sign),
.uart_0_rxd(uart_0_rxd),
.uart_0_txd(uart_0_txd),
.lcd_data_export(lcd_data), // lcd.data
.lcd_e_export(lcd_E), // .E
.lcd_rs_export(lcd_RS), // .RS
.lcd_rw_export(lcd_RW), // .RW
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
77
.pwm_export(pwm_export), // pwm.export
.led_green_export(led_green) // led_green.export
);
endmodule
2. Thư viện của LCD display
#ifndef _LCD_H_
#define _LCD_H_
#define row1 1
#define row2 2
#define col1 0
#define col2 1
#define col3 2
#define col4 3
#define col5 4
#define col6 5
#define col7 6
#define col8 7
#define col9 8
#define col10 9
#define col11 10
#define col12 11
#define col13 12
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
78
#define col14 13
#define col15 14
#define col16 15
// define for nios II
#define LCD_data PIO_3_BASE
#define RW PIO_4_BASE
#define RS PIO_5_BASE
#define E PIO_6_BASE
#define output_low(base) IOWR(base, 0, 0)
#define output_high(base) IOWR(base, 0, 1)
#define output_b(data) IOWR(LCD_data, 0, data)
#define delay_ms( n ) usleep(1000*n)
#define int8 char
#define int16 short
unsigned char buff[100];
void lcd_init( void );
void LCD_nibble(unsigned int8 n);
void LCD_write(unsigned int8 address, unsigned int8 n);
void lcd_gotoxy( unsigned int8 col, unsigned int8 row );
void lcd_clear( unsigned int8 row );
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
79
void lcd_menu_init( void );
void lcd_puts( unsigned int8 *string );
void lcd_putc( unsigned int8 c );
void lcd_display_string( unsigned int8 *string, unsigned int16 lenght, int16
col, int16 row );
//unsigned int8 lcd_display_page( unsigned int8 *str, unsigned int16 len, INT8
cursor );
//unsigned int8 menu_main( void );
//unsigned int8 first_main( void );
#endif
3. Mã chương trình điều khiển LCD Display
#include "lcd.h"
#include <string.h>
#include <unistd.h>
#include <io.h>
#include "system.h"
void lcd_init( void )
{
unsigned int8 i;
output_low(RS); // RS = 0 : address, RS = 1 : data
output_low(E); // E = 0 : disable
output_low(RW); // RW = 0 : write
//LCD_nibble(0x00); // 0x0E : screen and cursor is display on
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
80
LCD_nibble(0x38);
delay_ms( 10 );
LCD_nibble(0x308);
delay_ms( 1 );
LCD_nibble(0x38);
delay_ms( 1 );
//LCD_nibble(0x00); // 0x0E : screen and cursor is display on
LCD_nibble(0x0C);
delay_ms( 10 );
//LCD_nibble(0x00); // 0x01 : Clear display
LCD_nibble(0x1);
delay_ms( 10 );
//LCD_nibble(0x0); // 0x06 : increased display and no shift
LCD_nibble(0x06);
delay_ms( 10 );
LCD_nibble(0x80); // 0x80 : cursor home
//LCD_nibble(0x0);
delay_ms( 10 );
}
void lcd_clear( unsigned int8 row )
{
switch( row )
{
case row1:
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
81
lcd_gotoxy( col1, row1 );
memset( buff, 0, sizeof buff );
strcpy( buff, " " );
lcd_puts( buff );
lcd_gotoxy( col1, row1 );
break;
case row2:
lcd_gotoxy( col1, row2 );
memset( buff, 0, sizeof buff );
strcpy( buff, " " );
lcd_puts( buff );
lcd_gotoxy( col1, row2 );
break;
default:
LCD_write( 0, 0x01 );
lcd_gotoxy( col1, row1 );
break;
}
}
void LCD_nibble( unsigned int8 n )
{
output_b( n );
//delay_ms( 1 );
output_high( E );
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
82
usleep( 1 );
output_low( E );
delay_ms( 1 );
}
void LCD_write( unsigned int8 style, unsigned int8 n )
{
//set_tris_b(0x00);
//set_tris_a(0x20);
delay_ms( 1 );
//delay_cycles( 100 ); // At 20 mhz a 5us delay
usleep(100);
if( style == 1 ) output_high( RS );
else output_low( RS );
output_low(E);
LCD_nibble(n);
output_low( RS );
output_low(E);
}
void lcd_gotoxy( unsigned int8 col, unsigned int8 row )
{
unsigned int8 address = 0;
if( row == 1 )
address = 0x80;
else
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
83
address = 0xC0;
address += col;
LCD_write( 0, address );
}
void lcd_putc( unsigned int8 c )
{
switch( c )
{
case '\f' : LCD_write( 0,1 ); //0x0C
delay_ms( 2 );
break;
case '\n' : lcd_gotoxy( col1, row2 ); break; //0x0A
case '\b' : LCD_write( 0, 0x10 ); break; //0x08
default : LCD_write( 1, c ); break;
}
}
void lcd_puts( unsigned int8 *string )
{
//dung dong while thi fai co \n de xuong hang duoi
while( *string )
{
lcd_putc( *string );
string++;
}
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
84
}
void lcd_display_string( unsigned int8 *string, unsigned int16 lenght, int16
col, int16 row )
{
//dung dong while thi fai co \n de xuong hang duoi
unsigned int16 len = 0;
while( *string )
{
if( col > col16 )
{
col = col1;
if( row == row1 ) row = row2;
else break;
}
lcd_gotoxy( col, row );
lcd_putc( *string );
string++;
col++;
len++;
if( len > lenght ) break;
}
}
void lcd_menu_init( void )
{
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
85
unsigned int8 i = 2;
memset( buff, 0, sizeof buff );
strcpy( buff, " ALTERA DE2 KIT \nNice To See You " );
while( i > 0 )
{
lcd_gotoxy( col1, row1 );
lcd_puts( buff );
// while( 1);
delay_ms( 1000 );
lcd_clear( 0 );
delay_ms( 300 );
i--;
}
lcd_puts( buff );
delay_ms( 100 );
}
4. Mã chương trình điều khiển hệ thống.
#include "sys/alt_stdio.h"
#include "system.h"
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
86
#include <string.h>
#include <io.h>
#include "lcd.h"
#define output(base,data) IOWR(base, 0, data)
#define set_duty(data) IOWR(PWM_0_BASE, 0, data)
#define set_cycle(data) IOWR(PWM_0_BASE, 1, data)
#define pwm_on() IOWR(PWM_0_BASE, 2, 0)
#define pwm_off() IOWR(PWM_0_BASE, 2, 1)
#define led_off() IOWR(PIO_0_BASE, 0, 0)
#define led_on() IOWR(PIO_0_BASE, 0, 1)
#define led_blink() IOWR(PIO_0_BASE, 0, 2)
#define LEVEL1 0x3
#define LEVEL2 0x5
#define LEVEL3 0x6
#define efan_off() IOWR(EFAN_BASE, 0, 0x7)
#define efan_on(data) IOWR(EFAN_BASE, 0, data)
#define set_dir(data) IOWR(PIO_2_BASE, 0, data)
#define _CYCLE 1000
#define _DUTY 500
int main()
{
unsigned int task=0;
char i =0;
set_duty(_DUTY);
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
87
set_cycle(_CYCLE);
pwm_on();
set_dir(0);
//printf("PWM_0_BASE: %d\n\r",IORD(PWM_0_BASE,0));
//printf("PWM_0_BASE: %d\n\r",IORD(PWM_0_BASE,1));
//printf("PWM_0_BASE: %x\n\r",IORD(PWM_0_BASE,2));
led_off();
pwm_off();
lcd_init();
lcd_menu_init();
delay_ms(1000);
lcd_clear( 1 );
lcd_clear( 2 );
lcd_gotoxy(0,1);
lcd_puts("Quat: Dang tat");
lcd_gotoxy(0,2);
lcd_puts("Den : Dang tat");
while(1){
printf("\nSelect task below: \n");
printf(" + Press 0 : Tat quat\n\r");
printf(" + Press 1 : Quat quay phai cham\n\r");
printf(" + Press 2 : Quat quay phai vua\n\r");
printf(" + Press 3 : Quat quay phai nhanh\n\r");
printf(" + Press 4 : Led sang\n\r");
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
88
printf(" + Press 5 : Led tat\n\r");
printf(" + Press 6 : Led nhap nhay\n\r");
task = alt_getchar();
//scanf("%d",&task);
printf("\ntask = %c \n\r",task);
task = task - 0x30;
alt_getchar();// get enter key
switch(task)
{
case 0:
pwm_off();
set_dir(0);
efan_off();
alt_printf("Tat Quat\n\r");
lcd_clear( 1 );
lcd_gotoxy(0,1);
lcd_puts("Quat: Dang tat");
break;
case 1:
set_duty(300);
pwm_on();
efan_on(LEVEL1);
set_dir(0);
lcd_clear( 1 );
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
89
lcd_gotoxy(0,1);
lcd_puts("Quat: So 1");
alt_printf("Quat quay phai cham\n\r");
break;
case 2:
set_duty(600);
efan_on(LEVEL2);
pwm_on();
set_dir(0);
lcd_clear( 1 );
lcd_gotoxy(0,1);
lcd_puts("Quat: So 2");
alt_printf("Quat Phai Vua");
break;
case 3:
set_duty(1000);
pwm_on();
efan_on(LEVEL3);
set_dir(0);
lcd_clear( 1 );
lcd_gotoxy(0,1);
lcd_puts("Quat: So 3");
alt_printf("Quat Phai Nhanh");
break;
Triển khai hệ thống nhúng trên NIOS và điều khiển thiết bị qua máy tính
90
case 4:
led_on();
lcd_clear( 2 );
lcd_gotoxy(0,2);
lcd_puts("Den : Dang bat");
alt_printf("Led Xanh Sang");
break;
case 5:
led_off();
lcd_clear( 2 );
lcd_gotoxy(0,2);
lcd_puts("Den : Dang tat");
alt_printf("Led Xanh Tat");
break;
}
}
while(1)
{
output(PIO_0_BASE, 0xff); //led sang
delay_ms(1000); // de lay giua cac lan sang tat
output(PIO_0_BASE, 0x00); // led tat
delay_ms(1000);
}
return 0;
}