Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

ĐẠI HỌC QUỐC GIA TP.

HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

KHOA ĐIỆN TỬ – VIỄN THÔNG


o0o

ĐỒ ÁN MÔN HỌC
Môn học : Hệ thống nhúng

Nhóm 12 Giảng viên


 Tạ Minh Quang – 20207066 Ths.Huỳnh Hữu Thuận

 Đinh Bửu Hiền – 20207032

 Lê Ngọc Hiếu – 20207033


Đồ án môn họ

1
MỤC LỤC

c
A. GIỚI THIỆU VỀ DE10-STANDARD............................3

1. Giới thiệu.....................................................................................3

2. Nội dung máy tính tiêu chuẩn DE10.........................................3


2.1 Thành phần FPGA.................................................................................................3

2.2 Bộ xử lý Nios® II...................................................................................................3

B. BÁO CÁO THỰC HÀNH...............................................5

1. Thiết kế phần cứng SoPC dùng...............................................5

2. Viết chương trình C.................................................................11

2.1 Cho 2 LED đơn chạy vòng từ trái sang phải hoặc từ phải sang trái. Cho phép

chuyển hướng chạy vòng bằng cách dùng 1 swtich (tùy thiết kế).............................11

2.2 Cho 6 LED 7 đoạn hiển thị đồng hồ theo quy ước: 2 LED hiển thị giờ trong

ngày (00 - 23), 2 LED hiển thị phút (00 - 59), 2 LED hiển thị giây (00 - 59) Càng

chính xác càng tốt - Thiết kế cách dùng switch để cho phép thiết lập thời gian bắt

đầu của đồng hồ (tùy sinh viên thiết kế)......................................................................11

2
A.GIỚI THIỆU VỀ DE10-STANDARD

1. Giới thiệu
- Tài liệu này mô tả một hệ thống máy tính có thể được thực hiện trên bảng
giáo dục và phát triển Intel® DE10-Standard. Hệ thống này, được gọi là
Máy tính tiêu chuẩn DE10, được thiết kế để sử dụng trong các thí nghiệm
về tổ chức máy tính và các hệ thống nhúng.

- Để hỗ trợ các thí nghiệm như vậy, hệ thống chứa các bộ xử lý nhúng, bộ
nhớ, thiết bị âm thanh và video và một số thiết bị ngoại vi I / O đơn giản.
Tệp lập trình FPGA thực hiện hệ thống này, cũng như các tệp nguồn thiết
kế của nó, có thể được lấy từ phần Chương trình Đại học trên trang web
của Intel.
2. Nội dung máy tính tiêu chuẩn DE10
- Một sơ đồ khối của hệ thống máy tính tiêu chuẩn DE10 được thể hiện
trong Hình 1. Như đã chỉ ra trong hình, các thành phần trong hệ thống
này được triển khai bằng cách sử dụng cả FPGA và Hệ thống xử lý cứng
(HPS) bên trong chip SoC Cyclone® V của Intel. FPGA triển khai hai bộ
xử lý Nios® II và một số cổng ngoại vi: mem-ory, mô-đun hẹn giờ, âm
thanh vào / ra, video vào / ra, PS / 2, analog-to-digital, nhận / truyền hồng
ngoại và các cổng song song được kết nối với công tắc và đèn. HPS bao
gồm bộ xử lý lõi kép ARM * Cortex * A9 và một bộ thiết bị pe-ripheral.
Hướng dẫn sử dụng bộ xử lý HPS và ARM được cung cấp trong một tài
liệu riêng, được gọi là Hệ thống máy tính tiêu chuẩn DE10 với ARM
Cortex A9.
2.1 Thành phần FPGA
Như thể hiện trong Hình 1, nhiều thành phần trong Máy tính tiêu chuẩn
DE10 được triển khai bên trong FPGA trong chip SoC Cyclone® V. Một số
thành phần này được mô tả trong phần này.

2.2 Bộ xử lý Nios® II
Bộ xử lý Intel Nios II là CPU 32 bit có thể được triển khai trong thiết bị Intel
FPGA. Hai phiên bản của bộ xử lý Nios II có sẵn, được chỉ định là tiết kiệm
(/ e) và nhanh (/ f). Máy tính tiêu chuẩn DE10 bao gồm hai phiên bản của
phiên bản Nios II/f, được cấu hình với hỗ trợ phần cứng dấu phẩy động.
Tổng quan về bộ xử lý Nios II có thể được tìm thấy trong tài liệu Giới thiệu
về Bộ xử lý Intel Nios II, được cung cấp trong trang web của Chương trình
Đại học. Một cách dễ dàng để bắt đầu làm việc với Máy tính tiêu chuẩn
DE10 và bộ xử lý Nios II là sử dụng một tiện ích có tên Intel® FPGA

3
Monitor Program. Nó cung cấp một cách dễ dàng để lắp ráp / biên dịch các
chương trình Nios II được viết bằng ngôn ngữ hợp ngữ hoặc ngôn ngữ C.
Chương trình màn hình, có thể được tải xuống từ trang web của Intel, là một
chương trình ứng dụng chạy trên máy chủ

Hình 1. Sơ đồ khối của máy tính tiêu chuẩn DE10

máy tính kết nối với bảng DE10-Standard. Chương trình giám sát có thể được
sử dụng để kiểm soát việc thực thi mã trên Nios II, liệt kê (và chỉnh sửa) nội
dung của các thanh ghi bộ xử lý, hiển thị / chỉnh sửa nội dung của bộ nhớ trên
bảng DE10-Standard và các hoạt động tương tự. Chương trình Giám sát bao
gồm Máy tính tiêu chuẩn DE10 như một hệ thống được thiết kế sẵn có thể được
tải xuống bảng DE10-Standard, cũng như một số chương trình mẫu bằng ngôn
ngữ hợp ngữ và C cho thấy cách sử dụng các thiết bị ngoại vi của Máy tính tiêu
chuẩn DE10. Một số hình ảnh cho thấy cách Máy tính tiêu chuẩn DE10 được
tích hợp với Chương trình Giám sát được mô tả trong Phần 8. Tổng quan về
Chương trình Màn hình có sẵn trong tài liệu Hướng dẫn Chương trình Giám sát
Intel® FPGA, được cung cấp trong trang web của Chương trình Đại học.

4
B.BÁO CÁO THỰC HÀNH

1. Thiết kế phần cứng SoPC dùng


(1) 6 LED 7 đoạn
(2) 10 LED đơn
(3) 10 switch
( Lưu ý : Mỗi thành phần là 1 Slave riêng.)

Table 1 : Giao diện thiết kế phần cứng(Platform Designer)

5
Table 1 : Giao diện thiết kế phần cứng(Platform Designer) (tt)

6
(1) Slave HEX 5 đại diện cho từng HEX trong LED 7 đoạn

7
(2) Slave thành phần LED với Width 10bits tương đương với 10 LED

8
(3) Slave thành phần SWITCH với Width 10bits tương đương với 10
SWITCH

9
File System.v sau khi Generate hoàn tất

Code Verilog :
Report.v
module REPORT
(
input CLOCK_50,
input [0:0] KEY,
input [9:0] SW,
output [7:0] HEX0,
output [7:0] HEX1,
output [7:0] HEX2,
output [7:0] HEX3,
output [9:0] LEDR,
output [7:0] HEX4,
output [7:0] HEX5
);

system nios_system(
.clk_clk
(CLOCK_50),
.reset_reset_n (KEY[0]),
.hex0_external_connection_export ({8'b0,HEX0}),
.hex1_external_connection_export ({8'b0,HEX1}),
.hex2_external_connection_export ({8'b0,HEX2}),
.hex3_external_connection_export ({8'b0,HEX3}),
.hex4_external_connection_export ({8'b0,HEX4}),
.switch_external_connection_export ({16'd0, SW}),
.led_external_connection_export ({16'd0, LEDR}),
.hex5_external_connection_export ({8'b0,HEX5})

);

10
2. Viết chương trình C
2.1 Cho 2 LED đơn chạy vòng từ trái sang phải hoặc từ phải
sang trái. Cho phép chuyển hướng chạy vòng bằng cách
dùng 1 swtich (tùy thiết kế).
2.2 Cho 6 LED 7 đoạn hiển thị đồng hồ theo quy ước: 2 LED
hiển thị giờ trong ngày (00 - 23), 2 LED hiển thị phút (00
- 59), 2 LED hiển thị giây (00 - 59) Càng chính xác càng
tốt - Thiết kế cách dùng switch để cho phép thiết lập thời
gian bắt đầu của đồng hồ (tùy sinh viên thiết kế).

Bài làm
Code C :
main.c
#include <stdio.h>
#include "io.h"
#include "system.h"
#include "altera_avalon_timer_regs.h"
#include "sys/alt_irq.h"
unsigned int counter = 0;
int data = 0x300;
int *led_pt = LED_BASE;
int *sw_pt = SWITCH_BASE;
int led_value = 0x300;
int value,value2;
int status;
int segment_decode [] = {0x40,
0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E}
;
void timer_Init(){
unsigned int period = 0;
// Stop Timer
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
ALTERA_AVALON_TIMER_CONTROL_STOP_MSK);
//Configure period
period = 50000000 - 1;
IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, period);
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, (period >> 16));
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | // Continue counting mode
ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | // Interrupt enable
ALTERA_AVALON_TIMER_CONTROL_START_MSK);// Start Timer
}
void Timer_IRQ_Handler(void* isr_context){
//Switch 0 dùng để dừng đồng hồ đang chạy
status = IORD(SWITCH_BASE, 0) & 0x1;
if (status != 1){
counter ++;
}
// Code để kích hoạt ngày giờ ở trên đồng hồ
int hours = counter / 3600;

11
int minutes = (counter % 3600) / 60;
int seconds = counter % 60;
//Switch 1 dùng để reset lại thời gian đang hiển thị
int reset1 = (IORD(SWITCH_BASE, 0) >> 1)& 0x1;

if (reset1 == 1){
hours = 0;
minutes = 0;
seconds = 0;
counter = 0;
}

if (hours >= 23 & minutes >= 59 & seconds >= 59){


hours = 0;
minutes = 0;
seconds = 0;
counter = 0;
}
if (hours == 24 ){
hours = 0;
minutes = 0;
seconds = 0;
counter = 0;
}
// Đoạn code dịch 2 led để led chạy vòng bằng 1 SWITCH
int sw_led = (*sw_pt >> 9)&0x1;
printf("*sw_led_value=%d\n", sw_led);
if(sw_led == 1)
led_value = (led_value >> 1) | ((led_value & 0x1) << 9);
else
led_value = (led_value << 1) | ((led_value & 0x200) >> 9);
// Hiển thị thời gian ra 6 led 7 đoạn
*led_pt = led_value;
int sec_0 = seconds % 10;
int sec_1 = seconds / 10;
int min_0 = minutes % 10;
int min_1 = minutes / 10;
int hour_0 = hours % 10;
int hour_1 = hours / 10;

int sec0 = (IORD(SWITCH_BASE,0) >> 2)& 0x1; //Switch 2 dùng để tăng hàng
đơn vị của giây
int sec1 = (IORD(SWITCH_BASE,0) >> 3)& 0x1; //Switch 3 dùng để tăng hàng
chục của giây

int min0 = (IORD(SWITCH_BASE,0) >> 4)& 0x1; //Switch 4 dùng để tăng hàng
đơn vị của phút

int min1= (IORD(SWITCH_BASE,0) >> 5)& 0x1; //Switch 5 dùng để tăng hàng
chục của phút

int hour0= (IORD(SWITCH_BASE,0) >> 6)& 0x1; //Switch 6 dùng để tăng hàng
đơn vị của giờ

if (sec0 ==1){
counter++;
}

if (sec1 == 1){
counter +=10;
12
}

if (min0 ==1){
counter +=60;
}

if (min1 ==1){
counter +=600;
}

if (hour0 ==1){
counter +=3600;
}

IOWR(HEX0_BASE, 0, segment_decode[sec_0]);
IOWR(HEX1_BASE, 0, segment_decode[sec_1]);
IOWR(HEX2_BASE, 0, segment_decode[min_0]);
IOWR(HEX3_BASE, 0, segment_decode[min_1]);
IOWR(HEX4_BASE, 0, segment_decode[hour_0]);
IOWR(HEX5_BASE, 0, segment_decode[hour_1]);

// Clear Timer interrupt bit


IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,
ALTERA_AVALON_TIMER_STATUS_TO_MSK);
}
void main(){
timer_Init();
alt_ic_isr_register(0, TIMER_0_IRQ, Timer_IRQ_Handler, (void*)0,
(void*)0);
while(1);
}

13

You might also like