You are on page 1of 31

BỘ GIÁO DỤC VÀ ĐÀO TẠO

THỰC HÀNH
HỆ THỐNG NHÚNG

Biên soạn: ThS. Phạm Hùng Kim Khánh

Tài Liệu Lưu Hành Tại HUTECH www.hutech.edu.vn


THỰC HÀNH HỆ THỐNG NHÚNG

Ấn bản 2016
MỤC LỤC I

MỤC LỤC
MỤC LỤC .................................................................................................................. 1
HƯỚNG DẪN ............................................................................................................. 2

BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN .......................................................................... 1

1.1 QSYS ................................................................................................................... 1


1.2 TÍCH HỢP HỆ THỐNG QSYS VÀO QUARTUS II.................................................................... 10
1.3 NẠP PHẦN MỀM CHO NIOS II ...................................................................................... 14
1.4 TÍCH HỢP HỆ THỐNG BẰNG SƠ ĐỒ KHỐI ......................................................................... 16

BÀI 2: ĐIỀU KHIỂN XUẤT/NHẬP ............................................................................... 19

2.1 XÂY DỰNG PHẦN CỨNG ............................................................................................. 19


2.2 XÂY DỰNG PHẦN MỀM NHÚNG ..................................................................................... 19

BÀI 3: HỎI VÒNG VÀ NGẮT ....................................................................................... 21

3.1 HỎI VÒNG ........................................................................................................... 21


3.2 NGẮT ................................................................................................................. 22

BÀI 4: LCD ................................................................................................................ 24

4.1 XÂY DỰNG PHẦN CỨNG ............................................................................................. 24


4.2 PHẦN MỀM NHÚNG .................................................................................................. 24
TÀI LIỆU THAM KHẢO ............................................................................................... 26
II HƯỚNG DẪN

HƯỚNG DẪN
MÔ TẢ MÔN HỌC
Thực hành Hệ thống nhúng là môn học hỗ trợ cho môn Hệ thống nhúng. Môn học
này thực hiện các mạch phần cứng và viết chương trình phần mềm để thực hiện một
hệ thống nhúng.

NỘI DUNG MÔN HỌC


− Bài 1: Hệ thống nhúng đơn giản.
− Bài 2: Điều khiển xuất / nhập.
− Bài 3: Hỏi vòng và ngắt.
− Bài 4: LCD.

KIẾN THỨC TIỀN ĐỀ


Môn học Thực hành Hệ thống nhúng cần sinh viên có nền tảng về Hệ thống nhúng.

YÊU CẦU MÔN HỌC


Người học phải dự học đầy đủ các buổi lên lớp và làm bài tập đầy đủ ở nhà.

CÁCH TIẾP NHẬN NỘI DUNG MÔN HỌC


Để học tốt môn này, sinh viên cần viết chương trình, giải các bài tập trước khi thực
hiện thí nghiệm.

PHƯƠNG PHÁP ĐÁNH GIÁ MÔN HỌC


Môn học được đánh giá gồm:

− Điểm quá trình: 30%. Hình thức và nội dung do Giáo viên quyết định, phù hợp với
quy chế đào tạo và tình hình thực tế tại nơi tổ chức học tập.

− Điểm thi: 70%. Hình thức thực hành trên board thí nghiệm và nộp báo cáo thí
nghiệm.
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
1

BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

1.1 Qsys
Trong bài này, Qsys dùng để tạo ra hệ thống bao gồm một bộ xử lý Nios II/e và một
khối bộ nhớ. Bộ vi xử lý Nios II/e xử lý dữ liệu. Khối bộ nhớ lưu trữ chương trình và dữ
liệu.

Các bước thực hiện như sau:

 Tạo project trên Quartus, chọn chip Cyclone II EP2C35F672C6.

 Tạo hệ thống Nios II sử dụng Altera Qsys:

Click vào biểu tượng Qsys hay chọn menu Tools > Qsys để tạo hệ thống Nios II.
2 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

Click File > Save và đặt tên là de2_blinker. Nhấn chuột phải vào clk_0, chọn
Rename và đổi tên thành clock_main.

 Sử dụng Qsys để tạo ra hệ thống niosii_sys, bao gồm các thành phần sau:

 Bộ xử lý Nios II/e

− Trong tab Component Library (bên trái), mở Embedded Processors, và click


vào Nios II Processor.
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
3

− Click Add. Xuất hiện hộp thoại cấu hình thông số cho Nios II.

− Dưới phần Select a Nios II core, chọn Nios II/e.

− Chọn Finish.

− Đổi tên nios2_qsys_0 thành nios2_proc.

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 4 errors.

 On-chip memory – RAM: Bộ nhớ trên chip, chế độ RAM với kích thước bộ nhớ
là 30 KB và độ rộng dữ liệu là 32 bits.
4 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

− Trên tab Component Library, trong Memories and Memory Controllers, mở


On-Chip, và click vào On-Chip Memory (RAM or ROM).

− Click Add. Bảng cấu hình thông số xuất hiện.

− Trong hộp thoại Total memory size, gõ vào 32K. Sau đó nhấn Finish.
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
5
− Đổi tên onchip_memory2_0 thành onchip_memory.

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 6 errors và 1 warning.

 Các PIO:

− Trên tab Component Library, trong Peripherals, mở Microcontroller


Peripheral, và click vào PIO (Parallel I/O).

− Click Add. Bảng cấu hình thông số xuất hiện.

− Phía dưới Basic Settings, chọn Input. Sau đó nhấn Finish.


6 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

− Đổi tên pio_0 thành switcher.

− Thêm vào PIO thứ hai với các thông số Width = 2, Direction là Output và đổi
tên thành led.

− Trên tab Component Library, trong Peripherals, mở Debug and


Performance, và click vào System ID Peripheral.
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
7
− Nhập vào giá trị tùy ý, ví dụ 1337. Đổi tên sysid_qsys_0 thành sysid_1337.

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 12 errors và 6 warnings.

− Thực hiện kết nối các xung clock với nhau:

 Clock_main > clk

 Nios2_proc > clk

 Onchip_memory > clk1

 Switcher > clk

 Led > clk

 Sysid_1337 > clk

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 7 errors và 6 warnings.

− Thực hiện kết nối các chân reset:

 Clock_main > clk_reset

 Nios2_proc > reset_n

 Onchip_memory > reset1

 Switcher > reset

 Led > reset

 Sysid_1337 > reset

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 2 errors và 6 warnings.

− Thực hiện kết nối Avalon Memories:

 Nios2_proc > data_master

 Nios2_proc > jtag_debug_module

 Onchip_memory > s1

 Switcher > s1

 Led > s1

 Sysid_1337 > control_slave


8 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 8 errors và 2 warnings.

− Thực hiện kết nối:

 Nios2_proc > instruction_master

 Nios2_proc > jtag_debug_module

 Onchip_memory > s1

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 10 errors và 2 warnings.

− Click chọn menu System > Assign Base Addresses.

Ghi chú: phía dưới cửa sổ lúc này sẽ có thông báo 2 errors và 2 warnings.

− Double-click vào nios_proc.

Trong phần Reset Vector chọn onchip_memory.s1.

Trong phần Exception Vector chọn onchip_memory.s1.

− Click Finish.

− Kết nối clock_main > clk_in_reset với nio2_proc > reset_n.

− Double-click vào cột Export của switcher > external_connection (Conduit).


BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
9

− Thực hiện tương tự cho led.

 Tạo hệ thống.

− Click vào tab Generation.

− Click Generate. Click Save và chờ hệ thống hoàn tất.

− Click Exit. Quay trở lại giao diện thiết kế của Quartus.
10 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

1.2 Tích hợp hệ thống Qsys vào Quartus II


− Trong Quartus, chọn Project > Add/Remove Files in Project.

− Nhấn vào nút ... và chọn file de2_blinker trong thư mục
..\de2_blinker\synthesis.

− Nhấn Add. Sau đó thực hiện Add tất cả các file trong thư mục submodules. Nhấn
OK.

− Trong Project Navigator, nhấn tab Files.


BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
11

− Nhấn chuột phải vào file de2_blinker/synthesis/de2_blinker.v và chọn Set as


Top-Level Entity.
12 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

− Chọn menu Processing > Start Compilation hay nhấn vào nút Start
Compilation

Thực hiện gán chân và nạp phần cứng.

− Chọn menu Assignments > Pin Planner.

− Trên hàng clk_clk, double click vào cột Location và nhập vào PIN_N2.

− Thực hiện tương tự cho các chân khác như hình.

− Đóng cửa sổ Pin Planner và thực hiện biên dịch lại (chọn menu Processing >
Start Compilation).
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
13
− Chọn menu Tools > Programmer, bấm vào nút Hardware Setup ở góc trên bên
trái và chọn USB-Blaster.
14 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

− Trong cửa sổ Programmer phải có tên file .sof (nếu chưa có thì nhấn vào nút
Add File để thêm vào).

− Gạt nút RUN / PROG trên kit DE2 (nằm bên trái LCD) sang RUN và nhấn vào
Start để cấu hình cho DE2.

Sau khi nạp xong, LEDR1 và LEDR2 sẽ tắt.

1.3 Nạp phần mềm cho Nios II


− Chọn menu Tools > Nios II Software Build Tools for Eclipse.

− Chọn Workspace, ví dụ như E:\Altera\Eclipse.

− Trong Eclipse, chọn menu File > New > Nios II Application and BSP from
Template.

− Trong SOPC Information File name, chọn E:\Altera\de2_blinker.sopcinfo.

− Trong CPU Name, chọn nios2_proc.

− Trong Project name, đặt tên cho project, ví dụ như blinker_lib.

− Trong Project template, chọn template là Hello World. Chọn Finish.

− Chọn menu File > New > Nios II Application.

− Đặt tên cho Project, ví dụ như app_to_board.

− Trong BSP location, chọn blinker_lib_bsp. Chọn Finish.

− Từ Project Explorer (bên trái), click chuột phải vào app_to_board, chọn New
> Source File.

− Trong Source file, gõ main.c; trong Template, chọn Default C source


template. Chọn Finish.

− Nhập đoạn mã sau:

#include "io.h"
#include "system.h"

void set_led(unsigned char led_pattern) {


IOWR(LED_BASE, 0, led_pattern);
}
void main() {
BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
15
unsigned char led_pattern = 0x00;
while (1) {
led_pattern = IORD(SWITCHER_BASE, 0);
set_led(led_pattern);
}
}
− Nhấn chuột phải vào app_to_board, chọn Run As > 3 Nios II Hardware.

− Nhấn chuột phải vào app_to_board, chọn Run As > Run Configurations.

− Trong Tab Target Connection, nhấn vào Refresh Connection (bên phải)

− Nhấn vào System ID Properties để kiểm tra thuộc tính hệ thống.


16 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

− Click chọn vào các check box Ignore mismatched system ID và Ignore
mismatched system timestamp.

− Nhấn Apply và sau đó nhấn Run. Kết quả:

Downloading 00008000 ( 0%)


Downloading 00008F1C (61%)
Downloaded 4KB in 0.0s

Verifying 00008000 ( 0%)


Verifying 00008F1C (61%)
Verified OK
Starting processor at address 0x00008020

− Dùng các công tắc SW0 và SW1 để kiểm tra LEDR0 và LEDR1.

1.4 Tích hợp hệ thống bằng sơ đồ khối


Thực hiện phần 1.1 như trên, sau đó thực hiện tích hợp vào Quartus như sau:

- Chọn menu File > New, sau đó chọn Block Diagram/Schematic File.

- Bấm vào Symbol Tool trên thanh công cụ.


BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN
17
- Trong khung Libraries, bấm vào Project và chọn de2_blinker.

- Nhấn chuột phải và chọn Generate Pins for Symbols Ports.

- Lưu sơ đồ thiết kế với tên de2_blinker.bdf.


18 BÀI 1: HỆ THỐNG NHÚNG ĐƠN GIẢN

- Nhấn chuột phải vào file de2_blinker.bdf và chọn Set as Top-Level Entity.

- Thêm các file vào project như phần 1.2.

- Nhấn Start Compilation để biên dịch.

- Chọn menu Assignments > Import Assignments, chỉ đến file


DE2_pin_assignments.csv.

- Đổi tên cho các port như hình.

- Nhấn Start Compilation để biên dịch.

- Tiếp tục quá trình nạp xuống phần cứng như 1.2 và nạp phần mềm như 1.3.

Bài 1.1: Viết lại đoạn mã để LEDR0 sáng khi SW0 on và SW2 on, LEDR1 sáng khi
SW0 on và SW1 on.

Bài 1.2: Sửa lại phần cứng để điều khiển LEDG0 và LEDG1.

Bài 1.3: Sửa lại phần cứng để điều khiển cho 8 Led LEDR0 – LEDR7.
BÀI 2: ĐIỀU KHIỂN XUẤT/NHẬP
19

BÀI 2: ĐIỀU KHIỂN XUẤT/NHẬP

2.1 Xây dựng phần cứng


Thiết kế phần cứng cho hệ thống bao gồm:

− Bộ xử lý Nios II/e với JTAG Debug Module Level 1 và các tùy chọn: Embedded
Multipliers for Hardware Multiply, Hardware Divide.

− Bộ nhớ RAM on-chip 32 KB.

− PIO ngõ vào 8 bit (đặt tên là new_number), gán cho 8 công tắc SW0 – SW7.

− PIO ngõ ra 8 bit (đặt tên là LED_green), gán cho LEDG0 – LEDG7.

− PIO ngõ ra 16 bit (đặt tên là LED_red), gán cho LEDR0 – LEDR15.

− System ID Peripheral (đặt tên là sysid_1338).

2.2 Xây dựng phần mềm nhúng


Bài 2.1: Viết chương trình đọc nội dung của các công tắc SW0 – SW7, hiển thị giá
trị tương ứng trên các LED xanh.

− Dùng Nios II Software Buile Tools for Eclipse để viết phần mềm cho Nios II
như sau:

#include "io.h"
#include "system.h"

void main() {
unsigned char sw = 0x00;

while (1) {
sw = IORD(NEW_NUMBER_BASE, 0);
IOWR(LED_GREEN_BASE, 0, sw);
}
}

Bài 2.2: Thêm vào phần cứng PIO với các thông số Width = 1, Direction là Input,
click chọn Synchnously capture và chọn Edge Type là FALLING (đặt tên PIO là accept
và gán cho phím KEY0). Viết chương trình nhận giá trị trên các SW0 – SW7, hiển thị
20 BÀI 2: ĐIỀU KHIỂN XUẤT/NHẬP

trên các LED xanh, nếu có nhấn phím KEY0 thì cộng giá trị hiện tại trên LED đỏ và
giá trị vừa nhập, sau đó hiện giá trị tổng trên LED đỏ.

− Dùng Nios II Software Buile Tools for Eclipse để viết phần mềm cho Nios II
như sau:

#include "io.h"
#include "system.h"

void main() {
unsigned char sw = 0x00;
unsigned char accept = 0xFF;
unsigned int red = 0;

while (1) {
sw = IORD(NEW_NUMBER_BASE, 0);
IOWR(LED_GREEN_BASE, 0, sw);
accept = IORD(ACCEPT_BASE,0);
if (!accept)
{
red = red + (unsigned int)sw;
while (!accept)
accept = IORD(ACCEPT_BASE,0);
}
IOWR(LED_RED_BASE,0,red);
}
Xóa đoạn in đậm và thực thi lại để so sánh.

Bài 2.3: Thêm vào phần cứng 6 LED 7 đoạn (HEX0 – HEX5) và hiện giá trị hex của
SW0 – SW7 trên HEX5 – HEX4, giá trị tổng hiện trên HEX3 – HEX0.

Bài 2.4: Thực hiện tương tự bài 2.3 nhưng hiện giá trị dạng thập phân. Nếu giá trị
vượt quá 99 hay 9999 thì hiện EE hay EEEE.
BÀI 3: HỎI VÒNG VÀ NGẮT
21

BÀI 3: HỎI VÒNG VÀ NGẮT

3.1 Hỏi vòng


Thiết kế phần cứng cho hệ thống bao gồm:

− Bộ xử lý Nios II/e với JTAG Debug Module Level 1 và các tùy chọn: Embedded
Multipliers for Hardware Multiply, Hardware Divide.

− Bộ nhớ RAM on-chip 32 KB.

− PIO ngõ vào 8 bit (đặt tên là switches), gán cho 8 công tắc SW0 – SW7.

− PIO ngõ ra 8 bit (đặt tên là LED_green), gán cho LEDG0 – LEDG7.

− PIO ngõ vào 4 bit (đặt tên là keys), gán cho KEY0 – KEY3, chọn thông số như hình:

− System ID Peripheral (đặt tên là sysid_1339).

Bài 3.1: Viết chương trình kiểm tra 4 công tắc KEY0 – KEY3, nếu có 1 phím được
nhấn thì đọc nội dung của các công tắc SW0 – SW7, hiển thị giá trị tương ứng trên
các LED xanh.

#include "io.h"
#include "system.h"

void main() {
int * switches_ptr = (int *)SWITCHES_BASE;
int * led_ptr = (int *)LEDS_BASE;
int * keys_ptr = (int *)KEYS_BASE;

while (1) {
if (*(keys_ptr+3) > 0)
{
*(led_ptr)=*(switches_ptr);
22 BÀI 3: HỎI VÒNG VÀ NGẮT

*(keys_ptr+3)=0;
}
}
}

Bài 3.2: Sửa chương trình trên để kiểm tra các công tắc như sau:

- Nhấn KEY0: hiện giá trị của SW0 lên LEDG0.

- Nhấn KEY1: hiện giá trị của SW1 – SW0 lên LEDG1 – LEDG0.

- Nhấn đồng thời KEY1 và KEY0: hiện giá trị của SW7 – SW0 lên LEDG7 – LEDG0.

3.2 Ngắt
Các bước thực hiện cho phép ngắt trên Nios II:

- Cấu hình PIO để kiểm tra xung cạnh lên / xuống và tạo yêu cầu ngắt (thiết kế
trong Qsys).

- Cho phép ngắt trong PIO (phần mềm C).

- Cho phép xử lý ngắt trong Nios II (phần mềm C).

- Viết chương trình con xử lý ngắt.

Thực hiện phần cứng như trên nhưng thêm phần ngắt cho keys.
BÀI 3: HỎI VÒNG VÀ NGẮT
23
Bài 3.3: Viết chương trình như bài 3.1 nhưng sử dụng ngắt (file ex.h sẽ đươc cung
cấp):

#include "io.h"
#include "system.h"
#include "ex.h"

void main(void) {
int * switches = (int *)SWITCHES_BASE;
int * led_ptr = (int *)LEDS_BASE;
int * keys_ptr = (int *)KEYS_BASE;
*(keys_ptr+2) = 0x0F; // cho phép ngắt tại 4 công tắc
__builtin_wrctl(3,1); // cho phép ngắt tại IRQ0
__builtin_wrctl(0,1); // đặt bit PIE = 1 để cho phép ngắt

while (1);
}

void interrupt_handler(void)
{
int ipending;
ipending = __builtin_rdctl(4); //Đọc thanh ghi ipending
if (ipending & 0x01) // Nếu IRQ0 = 1
keys_isr();
}

void keys_isr(void)
{
int * led_ptr = (int *) LEDS_BASE;
int * keys_ptr = (int *) KEYS_BASE;
int * switches = (int *) SWITCHES_BASE;
*(led_ptr) = *(switches);
*(keys_ptr + 3) = 0; //xóa cờ
}
Bài 3.4: Sửa chương trình trên để kiểm tra các công tắc như sau:

- Nhấn KEY0: tắt các Led.

- Nhấn KEY1: sáng tất cả các Led.

- Nhấn KEY2: đọc giá trị trên SW và xuất ra các Led.


24 BÀI 4: LCD

BÀI 4: LCD

4.1 Xây dựng phần cứng


Thiết kế phần cứng cho hệ thống bao gồm:

− Bộ xử lý Nios II/e với JTAG Debug Module Level 1 và các tùy chọn: Embedded
Multipliers for Hardware Multiply, Hardware Divide.

− Bộ nhớ RAM on-chip 32 KB.

− PIO ngõ vào 2 bit, gán cho KEY0 – KEY1.

− LCD.

− System ID Peripheral (đặt tên là sysid_1338).

4.2 Phần mềm nhúng


Bài 4.1: Nhập đoạn mã hiện giá trị trên LCD:
#include "sys/alt_stdio.h"
#include <unistd.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include <stdio.h>
#include "alt_types.h"
#include "altera_avalon_lcd_16207_regs.h"
#include "altera_avalon_lcd_16207.h"

char * LCD_display_ptr = (char *) LCD_BASE;


void lcd_init(void);
void lcd_test(void);

int main()
{

usleep(15000); /* Wait for more than 15 ms before init */


IOWR(LED_LCD_BASE,0,3);
lcd_init();
lcd_printf();

while (1);
return 0;
BÀI 4: LCD
25
}

void lcd_init(void)
{
*(LCD_display_ptr) = 0x38;
usleep(4000);
*(LCD_display_ptr) = 0x0C;
usleep(100);
*(LCD_display_ptr) = 0x06;
usleep(100);
*(LCD_display_ptr) = 0x01;
usleep(2000);
*(LCD_display_ptr) = 0x02;
usleep(2000);
}

void lcd_printf(void)
{
int i;
char message[] = "DH CN TPHCM \0";
char done[] = "KHOA CDDT \0";
for(i = 0; message[i] != 0; i++)
{
*(LCD_display_ptr+1) = message[i];
usleep(100);
}
*(LCD_display_ptr) = 0xC0;
usleep(1000);

for(i = 0; done[i] != 0; i++)


{
*(LCD_display_ptr+1) = done[i];
usleep(100);
}
}
Bài 4.2: Viết chương trình hiện chuỗi trên LCD:

- Dòng 1: Counter 1 = xxx

- Dòng 2: Counter 2 = yyy

- Nhấn KEY0: tăng giá trị xxx từ 123 – 456.

- Nhấn KEY1: giảm giá trị yyy từ 456 – 123.


TÀI LIỆU THAM KHẢO
[1] Phạm Hùng Kim Khánh – Giáo trình Hệ thống nhúng – ĐH Công nghệ TPHCM.

You might also like