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.. Tệp lập trình FPGA thực hiện hệ thống này, c
Trang 1ĐẠ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
Môn học : Hệ thống nhúng
• Tạ Minh Quang – 20207066 Ths.Huỳnh Hữu Thuận
• Đinh Bửu Hiền – 20207032
• Lê Ngọc Hiếu – 20207033
Trang 2MỤC LỤC
Đồ án môn họ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
Trang 3A 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
Monitor Program Nó cung cấp một cách dễ dàng để lắp ráp / biên dịch các
Trang 4chươ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
Trang 5B 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
Table 1 : Giao diện thiết kế phần cứng(Platform Designer)
Trang 6Table 1 : Giao diện thiết kế phần cứng(Platform Designer) (tt)
Trang 7(1) Slave HEX 5 đại diện cho từng HEX trong LED 7 đoạn
Trang 8(2) Slave thành phần LED với Width 10bits tương đương với 10 LED
Trang 9(3) Slave thành phần SWITCH với Width 10bits tương đương với 10
SWITCH
Trang 10File 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),
.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})
);
Trang 112 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"
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(){
// 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;
int minutes = (counter % 3600) / 60;
Trang 12int 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;
Trang 13if (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);
}