TỔNG QUAN VỀ ĐỀ TÀI
Lý do chọn đề tài
Trong thời đại công nghiệp hóa, hiện đại hóa cùng với việc phát triển không ngừng của khoa học kỹ thuật hiện nay thì ngành tự động hóa cũng đang phát triển một cách mạnh mẽ Động cơ bước được ứng dụng nhiều trong ngành này, chúng được ứng dụng trong các thiết bị điều khiển chính xác: điều khiển robot, bám mục tiêu trong các khí tài quan sát, điều khiển lập trình trong các thiết bị gia công cắt gọt, điều khiển cơ cấu lái phương và chiều trong máy bay Với những yêu cầu trên, việc xây dựng chương trình điều khiển thiết bị trên nền hệ thống nhúng FPGA không chỉ mang lại sức mạnh xử lý cả phần mềm mà còn lẫn phần cứng Điểm khác biệt của việc điều khiển động cơ bước trên nền FPGA so với các vi xử lí thông thường (như MCU) đó là khả năng thực hiện nhiều tác vụ, tính linh hoạt tùy chỉnh, hiệu suất tính toán cao và mức tiêu thụ năng lượng thấp.
Vì vậy, việc chọn đề tài “ Xây dựng chương trình điều khiển thiết bị trên nền hệ thống nhúng FPGA “ dựa trên sự quan tâm của cá nhân, sự ổn định của FPGA,giá trị thực tế và hy vọng hiểu thêm về cách nhúng thiết bị ngoại vi.
Mục tiêu chọn đề tài
Ứng dụng công nghệ FPGA vào thiết kế và xây dựng hệ thống điều khiển động cơ bước trên nền hệ thống nhúng FPGA, chương trình được thực hiện trên KIT Altera De2-11 kết nối với động cơ và điều khiển qua các chân GPIO, đánh giá sự tối ưu khi điều khiển động cơ trên KIT.
Đối tượng và phạm vi nghiên cứu
-Tìm hiểu về phần mền Quartus II, công cụ Qsys và Eclipse Nios II.
-Tìm hiểu nguyên lý hoạt động và cách điều khiển động cơ bước.
-Tìm hiểu cách điều khiển thiết bị ngoại vi qua vi xử lý Nios II.
- Nghiên cứu FPGA của Altera, nguyên lý hoạt động của Kit Altera DE2 Cylone IV
- Cách xây dựng hệ thống nhúng trên FPGA
- Các cổng vào ra của Kit DE2, các chân switch, các chân GPIO để kết nối với máy tính và các thiết bị ngoại vi
- 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.
Phương pháp tiếp cận
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.
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
1.5 Kết cấu đề tài Đề tài điều khiển thiết bị ngoại vi gồm có 4 chương sau đây:
CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI
CƠ SỞ LÝ THUYẾT
Tổng quan về FPGA
2.1.1 Giới thiệu về phần cứng FPGA
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 [1]
FPGA có nguồn gốc từ các thiết bị trước đó như bộ nhớ chỉ đọc có thể lập trình (PROM) và thiết bị logic có thể lập trình (PLD) Các thiết bị này có thể được lập trình tại nhà máy hoặc tại hiện trường, nhưng chúng sử dụng công nghệ cầu chì (do đó, cụm từ “đốt một PROM”) và không thể thay đổi sau khi được lập trình. Ngược lại, FPGA lưu trữ thông tin cấu hình của nó trong một phương tiện có thể lập trình lại như RAM tĩnh (SRAM) hoặc bộ nhớ flash Các nhà sản xuất FPGA bao gồm Intel, Xilinx, Lattice Semiconductor, Microchip Technology và Microsemi 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ý Ưu điểm của FPGA so với CPU là khả năng triển khai nhiều mạch nhỏ để chạy đồng thời, trong khi CPU hoạt động tuần tự Kết quả từng phần của quá trình mã hóa có thể được tính toán đồng thời và tổng hợp ở giai đoạn sau, giảm đáng kể số lượng chu kỳ cần thiết FPGA không thể hoạt động ở tần số xung nhịp giống như CPU hiện đại (trong dải GHz), thường chạy với tần số xử lý nằm trong khoảng 25-
500 MHz Mặc dù tần số xung nhịp thấp hơn, FPGA có khả năng xử lý dữ liệu nhanh hơn nhiều so với CPU, nhờ vào khả năng xử lý đa nhiệm, giúp mã hóa dữ liệu ở tốc độ cao [1].
Cấu trúc tổng thể của một FPGA gồm 3 phần chính: Khối logic, hệ thống mạch liên kết, các phần tử tích hợp sẵn, được minh họa ở hình sau:
Hình 2- 1: Kiến trúc tổng thể của FPGA a 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ình 2- 2: Khối Logic FPGA b 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 [2] Các đường kết nối được nối với nhau thông qua các khối chuyển 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á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. d 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.1.3 Quy trình thiết kế cho FPGA
Các bước thể hiện quy trình thiết kế số trên các IC có thể lập trình (FPGA) như sau:
Hình 2- 3: Quy trình thiết kế CAD thông dụng
Design Entry (Nhập thiết kế): 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 (Tổng hợp): Công cụ thực hiện chuyển các biểu diễn mạch điện ở trên thành dạng tệp netlist, trong đó biểu diễn các thành phần logic cần cho mạch cùng các kết nối giữa các thành phần logic
Function Simulation (Mô phỏng chức năng): Mạch đã tổng hợp được kiểm tra để phân tích tính chính xác về chức năng; trình mô phỏng không quan tâm đến vấn đề thời gian
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 thời gian): 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 (mô phỏng thời gian): Mạch đã được fit được kiểm tra để phân tích đồng thời cả về mặt chức năng lẫn thời gian của mạch.
KIT Altera DE2
DE2( Development and Education ) là 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
Bo mạch DE2-115 có nhiều tính năng cho phép người dùng thực hiện một loạt các mạch được thiết kế, từ các mạch đơn giản đến các dự án đa phương tiện khác nhau Phần cứng sau đây được cung cấp trên bo mạch DE2-115:
USB Blaster, JTAG and Active Serial (AS)
2MB SRAM, Two 64MB SDRAM, 8MB Flash memory
18 Red user LEDs, 9 Green user LEDs
50MHz oscillator for clock sources
24-bit CD-quality audio CODEC (line-in, line-out, and microphone-in jacks)
VGA DAC (8-bit high-speed triple DACs)
TV Decoder (NTSC/PAL/SECAM) and TV-in connector
2 Gigabit Ethernet PHY with RJ45 connectors
USB Host/Slave Controller with USB type A and type B connectors
2 SMA connectors for external clock input/output
One 40-pin Expansion Header with diode protection
One High Speed Mezzanine Card (HSMC) connector
Hình 2- 4: Sơ đồ khối DE2-115
Công cụ Qsys
2.3.1 Tổng quan về công cụ Qsys
Qsys là một công cụ tích hợp trong bộ công cụ Quartus Prime của Altera (hiện là Intel) Được thiết kế để hỗ trợ việc kết nối và cấu hình các thành phần hệ thống trong các hệ thống FPGA (Field-Programmable Gate Array) Qsys giúp người phát triển thiết kế hệ thống FPGA kết hợp các thành phần logic tùy chỉnh, vi xử lý và các giao tiếp ngoại vi một cách hiệu quả.
Với Qsys, người sử dụng có thể kết hợp nhiều thành phần IP (Intellectual Property) khác nhau để tạo ra một hệ thống hoàn chỉnh trên FPGA Công cụ này cung cấp giao diện đồ họa để kết nối các thành phần và cấu hình chúng một cách dễ dàng Nó cũng hỗ trợ việc xử lý tín hiệu và quản lý bộ nhớ.
Qsys giúp tối ưu hóa hiệu suất, giảm thời gian phát triển và tăng tính linh hoạt trong thiết kế hệ thống FPGA, làm cho quá trình phát triển ứng dụng trên nền tảng FPGA trở nên thuận tiện hơn.
2.3.2 Xây dựng hệ thống SoPC bằng Qsys trên Quartus II
SoPC Qsys cơ bản bao gồm các phần thiết yếu sau:
Với các thành phần trên chúng ta đã có 1 hệ thống cơ bản có thể chạy chương trình HelloWorld.
Mở phần mềm Qsys trên Quartus II
Sau khi mở phần mềm Quartus II, ở giao diện chính trên Tab thanh công cụ chọn Tool Qsys Lúc này chương trình Quartus sẽ mở lên công cụ phát triển lõi
Hình 2- 5: Mở phần mềm Qsys
Tạo vi xử lý Nios cho hệ thống
Chọn kiểu lõi Nios: tùy vào quy mô và tính năng của project chúng ta sẽ chọn lõi cho phù hợp với project Trong project này không cần dùng nhiều chức năng nên ta sẽ chọn lõi có phiên bản đơn giản nhất là phiên bản Nios II/e như hình bên dưới
Hình 2- 6: Thêm 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
Trong dự án này chúng ta không dùng quá nhiều tính năng nên sẽ chọn các thông số mặc định Sau đó nhấn finish.
Lõi ID cung cấp cho hệ thống Qsys một mã định danh duy nhất Hệ thống bộ xử lý Nios II sử dụng lõi ID hệ thống để xác minh rằng một chương trình thực thi đã được biên dịch nhắm vào hình ảnh phần cứng thực tế được định cấu hình trong FPGA đích Nếu ID dự kiến trong tệp thực thi không khớp với lõi ID hệ thống trong FPGA, có thể phần mềm sẽ không thực thi chính xác.
Hình 2- 8: Thêm System ID Peripheral
Thêm bộ nhớ On-chip memory (RAM or ROM)
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 Chúng ta On-Chip Memory Chiều rộng mỗi ô nhớ là 32bit nếu là kit DE2 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- 9: Thêm on-chip memory
Kết nối các thành phần IP chúng ta hệ thống SoPC tối thiểu:
Hình 2- 10: Hệ thống SoPC tối thiểu
Công cụ Nios II Eclipse
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.
Các bước làm việc trên Nios II Eclipse
Chọn không gian lưu trữ dự án
Trong giao diện Quartus II chọn Tool Nios II Software Build Tools for
Eclipse Lúc này màn hình sẽ hiện lên giao diện như sau:
Hình 2- 11: Chọn không gian làm việc cho Nios II Đây là giao diện tạo thư mục cho không gian làm việc của dự án Nên đặt tên tệp có tên là software để hệ thống không tự tạo ra các thư mục không mong muốn và giúp người dùng dễ quản lý các dự án của mình trong tương lai Sau khi hoàn thành việc chọn không gian làm việc hãy chọn OK và lúc này công cụ Nios II elcipse sẽ được khởi động [3].
Trong giao diện chính chọn File New Nios II Application and BSP from Temple
Hình 2- 12: 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 Qsys 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 bấm Finish Kết thúc quá trình tạo dự án.
Nạp phần mềm xuống KIT
Right Click, chọn Run As 3 Nios II Hardware.
Hình 2- 14: Chạy chương trình Nios II Hardware
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, người dùng dễ giao tiếp.
- 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.
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
- 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
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ã đườ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
NỘI DUNG THỰC HIỆN
Sơ đồ tổng quát hệ thống
Hình 3- 1: Sơ đồ tổng quát hệ thống
Sơ đồ tổng quát bao gồm những thành phần:
• Khối xử lý là lõi Nios II dùng để xử dữ liệu tín hiệu.
• JTAG sử dụng trong quá trình nạp và debug gỡ lỗi trong quá trình phát triển hệ thống
• Pll dùng để chia tần số làm tần số vào của hệ thống
• System ID dùng để định danh thiết bị và quản lý, xác định tính toàn vẹn của hệ thống.
• SRAM dùng làm bộ nhớ tạm thời lưu các thông số của động cơ
• Các LED xanh kiểm tra trạng thái tín hiệu được ghi trên chân GPIO
• Các thanh trượt switch dùng để điều khiển động cơ
• Các chân GPIO kết nối với driver điều khiển motor bước
• Driver sử dụng nguồn 12v, nut reset để khởi hệ thống về trạng thái ban đầu.
Hình 3- 2: Chi tiết thiết kế
Chi tiết thiết kế hệ thống
3.2.1 Nios II Processor – Nios2_qsys_0
Với KIT De2-115 chọn lõi Nios II/e
Hình 3- 3: 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ý 32bit Với Jtag debug Module là Level 1 Gồm các thành phần tín hiệu cơ bản sau: o Clk: Clock Input o Reset_n: Reset Input o Data_master: Avalon Memory Mapped Master o Intruction_master: Avalon Memory Mapped Master o Jtag_debug_module_reset: Reset Output o Jtag_debug_module: Avalon Memory Mapped Slave o Custom_intruction_master: Custom Intruction Master
3.2.2 JTAG Debug Module – jtag_uart_0
3.2.3 SRAM On Chip – onchip_memory2_0
Tạo ra bộ nhớ Ram on Chip với tổng dung lượng có phạm vi từ 0 cho đến
67108864 bytes, tùy vào hệ thống cần ít hay nhiều ô nhớ.
3.2.5 Tạo các port I/O cho Nios II
Tùy thuộc vào project số lượng port I/O sẽ thay đổi, trong project này ta sẽ cần
3 port I/O: 1 port để điều khiển motor, 1 port điểu khiển led, 1 port để nhận giá trị từ các switch.
Port điều khiển motor gồm 4 bit tương đương với 4 GPIO.
Port điều khiển led gồm 4 bit tương đương với 4 led xanh.
Port nhận giá trị từ các switch gồm 16 bit tương đương với 16 switch.
Nhiệm vụ của các port được diễn tả như sau:
Với 4bits đầu ra chân GPIO ta làm tín hiệu đầu vào cho Driver L298N để điều khiển động cơ Với 16bits đầu vào được gán với các nút trượt Switch để điều khiển động cơ theo ý muốn như khởi động động cơ, dừng động cơ, thay đổi tốc độ, hướng quay Và cuối cùng là 4bits đầu ra gán với LED xanh để theo dõi tín hiệu của các chân GPIO Trước mắt, hệ thống đã đầy đủ những tính năng để điều khiển động cơ bản Để điều khiển các tín hiệu này thì trong thư viện của Eclipse Nios II đã có sẵn các hàm điều khiển, chẳng hạn như thư viện avalon_pio_regs.h, system.h Đây là 2 hàm rất quan trọng có thể điều khiển thiết bị ngoại vi thông qua khe cắm mở rộng GPIO trên KIT DE 2.
Hình 3- 7: Thêm Port I/O cho Nios II
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_RS, // RS
output wire LCD_RW, // RW
Lõi IP Vòng lặp khóa pha Altera (ALTPLL) thực hiện mạch vòng khóa pha (PLL) PLL là một hệ thống điều khiển phản hồi tự động điều chỉnh pha của tín hiệu được tạo cục bộ để phù hợp với pha của tín hiệu đầu vào PLL hoạt động bằng cách tạo ra tần số dao động để phù hợp với tần số của tín hiệu đầu vào
Với hệ thống SOPC này chọn tần số inclk bằng 50MHz, sang Tab OutputClocks clk c0 để nguyên giá trị không thay đổi , tiếp đó chúng ta cài tần số cho clk c1 cũng với tần số 50MHZ nhưng thay đổi phase bằng -3ns Ở đây clk c0 sẽ được dùng làm tần số của hệ thống và clk c1 làm tần số cho clock củaSRAM/SDRAM.
Hình 3- 10: Cài thông số cho clk c0
Hình 3- 11: Cài thông số cho clk c1
3.2.8 Tạo thành phần IPCore PWM
Vì trong IP Catalog của công cụ Qsys không có sẵn PWM nên chúng ta phải tạo IP từ file Verilog Sau đây là những bước để tạo IP PWM:
Thêm mới chọn File New Component sau đó ta sẽ thấy giao diện sau:
Hình 3- 12: Giao diện Component Editor
Tiếp theo chúng ta chon vào Files, ở phần Synthesis Files chọn Add File tìm đến file verilog có tên avalon_pwm.v Sau khi hoàn thành việc Add Files chúng ta sang phần Analyze Synthesis Files, lúc này sẽ xuất hiện một vài lỗi nhỏ, chúng ta sẽ sửa lỗi trong phần Signal & Interface.
• Xem hoặc chỉnh sửa các chân Cửa sổ Signal và Interfaces
Hình 3- 14: Cửa sổ Signal & Interfaces
Cuối cùng khi đã sửa hết lỗi, chọn và Finish và chúng ta đã có thành phần IP PWM với giao diện sau:
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
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- 16: 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- 17: Thời gian trong quá trình đọc dữ liệu từ cổng slave
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ờ
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- 18: Các tín hiệu giao tiếp và thời gian trong khi ghi dữ liệu ra cổng slave
Thiết lập trạng thái máy cho motor
3.3.1 Lưu đồ thuật toán điều khiển motor
Hình 3- 19: Lưu đồ thuật toán điều khiển motor
Vi sử lý Nios II để có thể điều khiển tín hiệu được đưa vào driver, trong đó biến current_state được sử dụng để có thể quản lý được trạng thái đầu vào hiện tại của driver (là những trạng thái tuần tự điều khiển chiều đảo cực của 2 cuộn dây trong motor) và biến dir là biến quản lý chiều quay của động cơ (là biến có khả năng tác động vào tuần tự thực hiện của trạng thái máy).
Motor sẽ chạy liên tục khi switch được bật(start),từ bảng trên chúng ta có thể suy ra tuần tự của đảo chiều của motor tương ứng với tuần tự các trạng thái theo sơ đồ biểu diễn bên dưới:
Hình 3- 20: Sơ đồ biểu diễn trạng thái máy(state machine) Để có thể điều khiển tốc độ của motor chúng ta có thể đưa vào một chu kì xung quản lý tần số đảo chiều của 2 mạch cầu H, dựa vào công thức sau: v=d T Công thức 3 - 1: tính vận tốc của motor dựa trên chu kì xung
d: Số lượng step mà motor thực hiện trong mỗi chu kì
T: chu kì Để có điều khiển được chiều quay của motor, chúng ta phải hiểu rằng motor cần một sự đảo cực của các cuộn dây với một trình tự nhất định, do đó chúng ta muốn cuộn dây quay theo chiều nào thì phải gửi tín hiệu theo đúng tuần tự của nó. Bảng sau đây sẽ trình bày tín hiệu tuần tự theo chiều quay của motor:
DIR HEX IN1 IN2 IN3 IN4 LA LB
Bảng 3- 1: Bảng biểu diễn các trạng thái đảo chiều của motor
Từ bảng trên có thể lập lịch được cho trạng thái máy cho output của Nios II processor tương đương với tuần tự chiều quay mong muốn của motor
Chiều thuận (thuận theo chiều kim đồng hồ)
Dir Output IN1 IN2 IN3 IN4 State
Bảng 3- 2: Trạng thái đảo chiều theo chiều thuận
Chiều nghịch (ngược lại so với kim đồng hồ)
Bảng 3- 3: Trạng thái đảo chiều theo chiều nghịch
Sơ đồ nguyên lý
3.4.1 Kết nối chân tín hiệu điều khiển ngoại vi Đề tài sử dụng các tín hiệu đầu ra của GPIO để điều khiển động cơ qua driver L298N Như đã nêu ở nguyên lý hoạt động của L298N ở mục trước, chúng ta cấp các tín hiệu 0 và 1 ở đầu ra 4 chân GPIO trên kit DE2 hay nói cách khác đó cũng là đầu vào của driver, ở đây chúng ta dùng
Hình 3- 21: Kết nối chân GPIO trên DE2 115
Sau đây là bảng chân kết nối tín hiệu:
Tên tín hiệu FPGA Pin Mô tả
Bảng 3- 4: Chân kết nối tín hiệu điều khiển GPIO1
3.4.2 Kết nối tín hiệu Switch và Led Để motor thực hiện nhiều chức năng hơn chúng ta dùng đến các phím switch có sẵn trên kit De2, tất cả 18sw ( sw0 – sw17), ta có thể dùng 10sw đề phòng các phím trượt lâu ngày không sử dụng dẫn đến hoạt động sai Đối với led chúng ta gán chân cho các led màu xanh ở phía trên các phím button Nó chỉ mang tính chất hiện thị tín hiệu của các chân GPIO.
Tên tín hiệu FPGA Pin Mô tả
Bảng 3- 5: Chân kết nối tín hiệu điều khiển switch
Tên tín hiệu FPGA Pin Mô tả
Bảng 3- 6: Chân kết nối tín hiệu điều khiển led xanh.
KẾT QUẢ, ĐÁNH GIÁ VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI
Hệ thống đã thực hiện
4.1.1 Giới thiệu tổng quan về hệ thống
Hệ thống được thiết kế trên phần mềm Quartus II với các công cụ có sẵn trong phần mền là Qsys và Nios II Eclipse Đề tài sử dụng chủ yếu 2 công cụ nói trên để thiết kế ra hệ thống điều khiển động cơ bước có cấu hình và hoạt động như sau:
- Thiết kế 4 chân đầu ra GPIO trên khe mở rộng chân JP5, cấu hình các chân làm đầu ra với độ rộng 4bits tương ứng với 4 chân input của motor driver Tín hiệu được tạo ra từ 4 chân này sẽ điều khiển hoạt động của motor thông qua motor driver.
- Thiết kế 4 chân đầu ra tương ứng vơi 4 led xanh để theo dõi các tín hiệu của các chân GPIO
- Thiết kế 5 chân input tương ứng với 5 switch:
• Switch 0: dùng để thay đổi hướng quay của động cơ
• Switch 1: dùng để bật/tắt động cơ.
• Switch 2,3,4 : dùng để thay đổi tốc độ động cơ
Khi gạt nút switch 1 thì động cơ bắt đầu hoạt động, gạt nút switch 0 để thay đổi hướng quay của động cơ; switch 2,3,4 thay đổi tốc độ quay của động cơ.
Hình 4- 1: Tổng quan hệ thống điều khiển motor
4.1.2 Các thành phần hệ thống nhúng trên Nios II
Các thành phần chính không thể thiếu đó là: Nios II Processor, On Chip Memory, JTAG UART Hệ thống dùng clock 50MHZ làm xung đầu vào, SRAM để lưu thông tin , LCD để hiện thị thông tin,
Hình 4- 2: Sơ đồ kết nối các thành phần
Mô phỏng các hệ thống dựa trên Nios II trong trình mô phỏng ModelSim với môi trường mô phỏng được tạo tự động mà Qsys và Nios II SBT dành cho Eclipse tạo ra Đặt clock với duty_cycle bằng 50 và period bằng 100, đăt tín hiệu chân reset lên mức 1, địa chỉ address ghi địa chỉ , tín hiệu wiredata ghi tín hiệu lên các chân.
Hình 4- 4: Mô phỏng hệ thống trên ModelSim
4.1.4 Đo đạc và kiểm tra kết quả
Đo đầu ra của các chân GPIO trên KIT
Các chân GPIO cho phép ghi giá trị nhị phân 4bits (0101, 1001, 0110, 1010). Giá trị của 2bits đầu và 2bits cuối phải ngược nhau thì động cơ mới hoạt động. Chúng ta thực hiện đo các tín hiệu được ghi ở mỗi chân tại 1 thời điểm Tín hiệu màu vàng và màu xanh mô tả giá trị được ghi tại 2 chân GPIO Độ cao mỗi ô vuông trên màn hình tương ứng với 5V độ rộng xung 50ms Với tín hiệu màu vàng và màu xanh điện áp đầu ra xấp xỉ gần bằng 4V, độ nhiễu rất nhỏ, tín hiệu ngược pha với nhau.
Hình 4- 5: Đo xung đầu ra chân GPIO_0 và GPIO_1 trên KIT gpio0 gpio1 gpio3 gpio1
Hình 4- 6: Đo xung đầu ra chân GPIO_1 và GPIO_3 trên KIT
Đo đầu ra của driver L298N Đầu ra output_1 và output_2 được mô tả lần lượt bởi tín hiệu màu vàng và xanh Điện áp đầu ra của 2 tín hiệu xấp xỉ 13V, độ nhiễu tín hiệu lớn Để dễ so sánh giá trị logic của tín hiệu trong cùng 1 thời điểm, đặt 2 tín hiệu cùng 1 hàng, ta thấy khi giá trị output_ 1 bằng 1 thì giá trị output_2 bằng 0 và ngược lại, điều này các tín hiệu mô tả đúng giá Vì muốn điều khiển động cơ quay thì giá trị của 2 tín hiệu phải khác nhau.
Hình 4- 7: Đo xung ra output1 và output2 của driver motor L298N output2 output1
Hình 4- 8: Đo xung đầu ra output3 và output4 của driver motor L298N
Khởi động động cơ bằng switch 1, lúc này màn hình LCD sẽ sáng, các led trạng thái nhấp nháy, gạt nút switch 2, 3, 4 để thay đổi tốc độ của động cơ, gạt nút switch 0 để đổi hướng động cơ theo chiều thuận hoặc nghịch kim đồng hồ,
Hình 4- 9: Kết nối và điều khiển trên KIT output3 output4
Led trạng thái switch điều khiển
Hình 4- 10: Chức năng của switch
Chạy chương trình điều khiển trên Eclipse, sau khi chạy Nios II
Hardware thì màn hình xuât hiện hộp thoại Nios II Console, nó sẽ cho biết chương trình đang chạy đúng hay không và hiện thị các thông số
Hình 4- 11: Giao diện Nios II Console khi chạy chương trình điều khiển direction start/stop speed 1,2,3
Hình 4- 12: Hệ thống khi hoạt động
Đánh giá hệ thống và kết quả
Đánh giá hệ thống: Tốc độ xử lý và độ chính xác của hệ thống phù hợp với yêu cầu thiết kế của đề tài, vì vậy khả năng mở rộng và phát triển của thiết kế rất lớn Độ ổn định của hệ thống: hệ thống hoạt động ổn định, các tín hiệu đầu ra không bị nhiễu so với sử dụng các vi điểu khiển thông thường, bên cạnh đó vẫn cần phải cải tiến về phương pháp tản nhiệt của hệ thống để duy trì hiệu suât khi vận hành liên tục. Đánh giá kết quả: Đề tài đặt ra nhiệm vụ “ Xây dựng chương trình điều khiển thiết bị trên nền hệ thống nhúng FPGA”, qua thời gian nghiên cứu và thực hiện với sự nỗ lực của bản thân, tinh thần làm việc nghiêm túc cùng với sự hướng dẫn của cô, nhóm em đã hoàn thành được hệ thống điều khiển motor bước trên nền FPGA Đề tài đạt được những yêu cầu về tốc độ tải,động cơ hoạt động ổn định và chính xác, các chức năng hoàn hiện, lưu được thông tin vào bộ nhớ SRAM và in kết quả lên màn hình LCD.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
Trong quá trình nghiên cứu và phát triển từ khi nhận đề tài nhóm đã hoàn thành đề tài xây dựng chương trình điều khiển thiết bị trên nền hệ thống nhúng FPGA qua đó đã tiếp thu được nhiều kinh nghiệm và kiến thức cùng với đó là những kết quả sau:
- Kiến thức về FPGA, KIT FPGA Altera DE2
- Nguyên lý hoạt động của Kit FPGA và step-motor.
- Xây dựng chương trình Verilog và hệ thống Nios II để điều khiển hệ thống.
- Xây dựng chương trình điều khiển step-motor bằng mô hình trạng thái máy.
- Đánh giá mức độ chiếm dụng tài nguyên trên FPGA, khả năng hoạt động điều khiển trên FPGA ổn định cao và bền hơn so với vi điều khiển thông thường.
Hướng phát triển đề tài:
Với những kết quả đã đạt được, nhóm em xây dựng hướng phát triển đề tài trong thời gian đến là cố gắng hoàn thiện hệ thống một cách tốt nhất và phát triển thành hệ thống điều khiển cánh tay robot Hoàn thiện hệ thống bằng cách kiểm soát được góc quay hiện tại của motor và tận dụng số lượng PIO dồi dào của FPGA để có thể điều khiển nhiều motor trong một hệ thống giúp tạo nên hệ thống cánh tay robot
Dù đã cố gắng rất nhiều, nhưng nhóm em vẫn không tránh khỏi những sai sót,trong việc xây dựng hệ thống, trong việc trình bày đồ án Mong sự góp ý của các thầy cô.
[1] Roger Woods, John McAllister, Gaye Lightbody, Ying Yi, Peter Y K Cheung
(2017), "FPGA-Based Implementation of Signal Processing Systems", “John Wiley & Sons”, pp.1-9
[2] Pong P Chu (2008), "FPGA Prototyping by Verilog Examples: Xilinx MicroBlaze MCS SoC", “Wiley-IEEE Press”, pp.19-26.
[3] Pong P Chu (2012), "Embedded Systems with Nios II Processor and Verilog Examples”, “Wiley-IEEE Press”, pp.265-301.
[4] A S Tamboli (2008), "FPGA-Based Embedded System Developer's Guide", Springer, pp.301-26.
[5] https://www.youtube.com/watch?v=NgMslBm1WnI
[6]https://www.terasic.com.tw/attachment/archive/502/
[7] https://www.intel.com/content/www/us/en/docs/programmable/683525/17-0/ introduction.html
[8] https://www.youtube.com/watch?v=O2LWTBfQ26s