13:15:17
BÀI 4: THIẾT KẾ HỆ THỐNG
NHÚNG TRÊN KIT DE-2
1. Hệ thống nhúng trên DE-2.
2. Thiết kế phần cứng cho kit DE-2 dùng Qsys.
3. Tích hợp phần cứng vào Quartus Project.
4. Thiết kế phần mềm dùng Nios II Software.
5. Các ngoại vi cơ bản: công tắc nhấn, LCD, …
Bài 4
1
13:15:17
Bài 4
2
1
13:21:53
Hệ thống nhúng
trên DE-2
Bài 4
3
13:21:53
CPU Nios II
Bài 4
4
2
13:21:53
CPU Nios II
clk, reset_n: nối với clk và reset của nguồn xung clock.
data_master: kết nối với các chân slave của bộ nhớ và ngoại vi
instruction_master: kết nối với slave của bộ nhớ
Bài 4
5
13:21:53
Bộ nhớ on-chip
clk1: nối với clk của nguồn xung clock.
reset1: nối với reset của nguồn xung clock
s1: kết nối với data và instruction của CPU Nios II.
Bài 4
6
3
13:21:53
Ngoại vi
clk: nối với clk của nguồn xung clock.
reset: nối với reset của nguồn xung clock
s1: kết nối với data của CPU Nios II.
external_connection: kết nối với các chân của kit DE-2
Bài 4
7
13:21:53
Kiểm tra
clk: nối với clk của nguồn xung clock.
reset: nối với reset của nguồn xung clock
Control_slave: kết nối với data của CPU Nios II.
Bài 4
8
4
13:21:53
Qsys
Thiết kế hệ thống sau:
Phần cứng:
-
- Nhấn SW1: Led sáng dần.
- Nhấn SW2: tắt tất cả các Led.
Clock.
CPU Nios II.
On-chip memory.
PIO1: input, Width = 2
PIO2:output, Width = 8
System ID
Bài 4
9
13:21:53
Qsys
B1: Khởi động Quartus, chọn File > New Project Wizard:
Bài 4
10
5
13:21:53
B2:
Chọn Family là Cyclone II, chọn Available devices là EP2C35F672C6
Finish
Bài 4
11
13:21:53
B3:
Chọn Tools > Qsys trên menu hay click biểu tượng Qsys trên
thanh công cụ
Bài 4
12
6
13:21:53
Nguồn xung clock có sẵn của hệ thống:
Bổ sung CPU Nios II:
- Double-click vào Nio II Processsor.
- Chọn Nios II core là Nios II/e.
- Nhấn Finish.
Bài 4
Bổ sung on-chip memory 32KB:
13
13:21:53
Bổ sung PIO input 2 bit (SW) và PIO output 8 bit (Led):
Bài 4
14
7
13:21:53
Đặt tên lại cho các Component:
click chuột phải vào Component,
chọn Rename
Bài 4
15
13:21:53
Kết nối các chân của các Component:
- Clk của clk_main với clk của các
component khác.
- Clk_reset của clk_main với reset
của các component khác.
- Data_master của CPU Nios II với slave
(s1) của các component khác (trừ
clk_main).
- Instruction_master của CPU Nios II
với slave (s1) của memory (RAM).
Back >>
Bài 4
16
8
13:21:53
Gán địa chỉ cơ sở cho các thành phần:
Double-click vào CPU Nios II: chọn
Reset Vector và Exception Vector.
Bài 4
17
13:21:53
Double-click vào cột Export trên hàng external_connection của sw:
Tương tự cho component led:
Bài 4
18
9
13:21:53
Chọn File > Save
Chọn tab Generation, sau đó nhấn Generate
Bài 4
19
13:21:53
Tích hợp vào Quartus Project
B1: Quay lại Quartus, chọn Project > Add/Remove Files in Project
B2: Nhấp vào nút Browse (…)
Bài 4
20
10
13:21:53
B3: Chọn thư mục synthesis, phần File name, chọn All Files, chọn file .qip
Nhấn Open, sau đó nhấn OK
Bài 4
21
13:21:53
B4:
Trong
cửa
số
Project
Navigator, chọn tab Files, nhấn
chuột phải vào file .qip và chọn
Set as Top-Level Entity
B5: Chọn menu Processing >
Start Compilation hay nhấn nút
Start Compilation trên thanh
công cụ
Bài 4
22
11
13:21:53
Kết quả sau khi biên dịch:
B6: Thực hiện gán chân trên kit DE-2:
- 2 SW: nối với 2 toggle switch SW0, SW1
- 8 Led: nối với 8 LEDR0 - 7
CLOCK_50,PIN_N2
SW[0],PIN_N25
SW[1],PIN_N26
LEDR[0],PIN_AE23
LEDR[1],PIN_AF23
LEDR[2],PIN_AB21
LEDR[3],PIN_AC22
LEDR[4],PIN_AD22
LEDR[5],PIN_AD23
LEDR[6],PIN_AD21
LEDR[7],PIN_AC21
Bài 4
23
13:21:53
Gán chân bằng sơ đồ chân:
Xem sơ đồ chân tại (file DE2_pin_assigments.csv):
/>
B6.1: Chọn menu Assigments > Pin Planner
Bài 4
24
12
13:21:53
B6.2: Double-click vào cột Location và gán cho các chân trên kit DE-2:
CLOCK_50,PIN_N2
LEDR[0],PIN_AE23
LEDR[1],PIN_AF23
LEDR[2],PIN_AB21
LEDR[3],PIN_AC22
LEDR[4],PIN_AD22
LEDR[5],PIN_AD23
LEDR[6],PIN_AD21
LEDR[7],PIN_AC21
SW[0],PIN_N25
SW[1],PIN_N26
Đóng cửa sổ Pin Planner
Bài 4
25
13:21:53
Gán chân bằng sơ đồ khối:
B6.1: Chọn menu File > New, chọn Block Diagram/Schematic File
B6.2: Bấm vào Symbol Tool trên thanh công cụ.
Bài 4
26
13
13:21:53
B6.3: Trong khung Libraries, bấm vào Project và chọn tên tương ứng.
Nhấn chuột phải và chọn Generate Pins for Symbols Ports.
Bài 4
27
13:21:53
B6.4: Chọn File > Save để lưu sơ đồ và chọn Processing >
Start Compilation để biên dịch.
B6.5: Chọn menu Assignments > Import Assignments, chỉ
đến file DE2_pin_assignments.csv
B6.6: Gán chân, sau đó chọn File > Save để lưu và Set as Top-Level
Entity cho file .bdf
Bài 4
28
14
13:21:53
B7: Thực hiện biên dịch lại (chọn menu Processing > Start Compilation).
B8: Nạp phần cứng
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.
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.
Bài 4
29
13:21:53
Xây dựng phần mềm
Chọn menu Tools > Nios II
Software Build Tools for Eclipse
Bài 4
30
15
13:21:53
Chọn Workspace, ví dụ như E:\Altera\Eclipse
Trong Eclipse, chọn menu File > New > Nios II Application and
BSP from Template
Bài 4
31
13:21:53
Trong SOPC Information File name, chọn file .sopcinfo trong project. Đặt
tên cho project, chọn Project Template là Hello World. Nhấn Finish.
Bài 4
32
16
13:21:53
Chọn menu File > New > Nios II Application
Đặt tên Project, nhấn vào nút Browse (…) để chọn BSP. Nhấn Finish
Bài 4
Nhấn chuột phải vào project đã tạo tại cửa sổ Project Explorer
33
13:21:53
Nhấn chuột phải vào project đã tạo tại cửa sổ Project Explorer,
chọn New > Source File
Bài 4
34
17
Nhập tên file (main.c), trong phần Template, chọn Default C
13:21:53
source template.
Nhập đoạn mã sau:
#include "io.h"
#include "system.h"
int main()
{
unsigned char sw;
while (1)
{
sw = IORD(SW_BASE, 0);
if (sw == 0x01) // SW0
on, SW1: off
IOWR(LED_BASE,0,0xFF);
else
IOWR(LED_BASE,0,0x00);
}
return 0;
Bài 4
}
35
13:21:53
Nhấn Ctrl-S để lưu mã lệnh.
Nhấn chuột phải vào sw2_led8_board, chọn Run As > 3 Nios
II Hardware
Bài 4
36
18
Chọn
tab
Target
Connection,
nhấn
vào
System
ID
13:21:53
Properties để kiểm tra trạng thái hệ thống (có thể Refresh
Connections trước).
Bài 4
Click chọn vào các check box Ignore mismatched system ID và
37
13:21:53
Ignore mismatched system timestamp
Nhấn Apply và sau đó nhấn Run.
Gạt công tắc toggle SW[0] on và SW[1] off -> 8 Led Red sáng.
Khác: 8 Led tắt
Bài 4
38
19
13:21:53
Gạt công tắc toggle SW[0] on và SW[1] off -> 8 Led Red sáng.
Khác: 8 Led tắt
IORD(SW_BASE,
#include "io.h"
#include "system.h"
0):
đọc
giá
trị
từ
thiết bị ngoại vi
SW_BASE: địa chỉ thiết bị, được đăt
int main()
tên khi thiết kế phần cứng (Qsys)
{
unsigned char s;
0: địa chỉ offset
while (1)
{
s = IORD(SW_BASE, 0);
IOWR(LED_BASE,0,0xFF): xuất
if (s == 0x01)
giá trị 0xFF ra thiết bị
// SW0 on, SW1: off
ngoại vi, địa chỉ LED_BASE
IOWR(LED_BASE,0,0xFF);
else
IOWR(LED_BASE,0,0x00);
}
return 0;
Bài 4
39
}
13:21:53
4.1. Viết mã lệnh theo yêu cầu:
- SW1 on: Led sáng dần từ LEDR[0] – LEDR[7], thời gian delay
là 300 ms (dùng hàm usleep để delay, vd: usleep(1000) delay
1 ms).
- SW0 off: dừng quá trình chạy Led.
4.2. Thiết kế hệ thống nhúng mô phỏng đèn giao thông đơn giản: một
công tắc on/off toàn hệ thống, một công tắc chọn chế độ hoạt
động bình thường / đèn vàng nhấp nháy, 3 Led tương ứng Led
xanh, vàng và đỏ.
1. Thiết kế phần cứng trên Qsys.
2. Thiết kế sơ đồ chân hay sơ đồ khối trên Quartus.
3. Viết phần mềm điều khiển
Bài 4
40
20
13:21:53
Công tắc nhấn (pushbutton)
Bài 4
41
13:21:53
Yêu cầu:
- Nhấn KEY0: sáng dần từ LEDG0 – LEDG7, lặp lại quá trình liên
tục.
- Nhấn KEY0 lần nữa: dừng quá trình
Bài 4
42
21
13:21:53
#include "io.h"
#include "system.h"
int main()
{
unsigned char
unsigned char
unsigned char
0x07 ,0x0F, 0x1F,
push;
push_check = 0;
led[8] = {0x01, 0x03,
0x3F, 0x7F,0xFF};
unsigned char cnt = 0;
while (1)
{
push = IORD(PUSH_BASE,0);
if (push == 1)
{
if (push_check == 1)
push_check = 0;
else
push_check = 1;
while (push == 1)
push = IORD(PUSH_BASE,0);
}
if (push_check == 1)
{
IOWR(LED_BASE,0,led[cnt]);
cnt++;
if (cnt == 8)
cnt = 0;
usleep(200000);
}
}
return 0;
}
Bài 4
43
13:21:53
4.3.
Thiết kế hệ thống nhúng mô phỏng một đồng hồ số đơn giản:
hiển thị giờ, phút, giây trên 6 Led 7 đoạn, một công tắc nhấn
chỉnh giờ, một công tắc nhấn chỉnh phút.
1. Thiết kế phần cứng trên Qsys.
2. Thiết kế sơ đồ chân hay sơ đồ khối trên Quartus.
3. Viết phần mềm điều khiển
Bài 4
44
22
13:21:53
LCD
B1: Thiết kế trên Qsys:
Bài 4
45
13:21:53
LCD
B2: Thiết kế sơ đồ khối trên Quartus:
Bài 4
46
23
13:21:53
LCD
B3: Viết phần mềm:
void lcd_init(void);
void lcd_test(void);
int main()
{
IOWR(LED_LCD_BASE,0,3);
lcd_init();
lcd_test();
while (1) ;
return 0;
}
void lcd_init(void)
{
IOWR(LCD_BASE,0,0x38);usleep(4100);
IOWR(LCD_BASE0,0,0x0C);usleep(100);
IOWR(LCD_BASE0,0,0x06);usleep(100);
IOWR(LCD_BASE0,0,0x01);usleep(100);
IOWR(LCD_BASE0,0,0x02);usleep(100);
}
void lcd_test(void)
{
int i;
char line1[17] = “VIEN KT HUTECH \0";
char line2[15] = “BM DTU TR THONG \0";
for(i = 0; line1[i] != 0; i++)
{
IOWR (LCD_BASE,2,line1[i]);usleep(100);
}
IOWR(LCD_BASE0,0,0xC0);usleep(100);
for(i = 0; line2[i] != 0; i++)
{
IOWR (LCD_BASE,2,line2[i]);usleep(100);
}
}
Bài 4
47
13:21:53
LCD
4.4. Viết mã lệnh theo yêu cầu:
- 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.
Bài 4
48
24