Tải bản đầy đủ (.pdf) (13 trang)

đồ án môn học môn học hệ thống nhúng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.68 MB, 13 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH </b>

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

KHOA ĐIỆN TỬ – VIỄN THƠNG <small>o0o </small>

<b>Mơn học : Hệ thống nhúng </b>

<small>• </small>

<b>Tạ Minh Quang – 20207066 Ths.Huỳnh Hữu Thuận</b>

<small>• </small>

<b>Đinh Bửu Hiền – 20207032</b>

<small>• </small>

<b>Lê Ngọc Hiếu – 20207033 </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>A. GIỚI THIỆU VỀ DE10-STANDARD </b>

<b>1. Giới thiệu </b>

- 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.

<b>2. Nội dung máy tính tiêu chuẩn DE10 </b>

- 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.

<i><b>2.1 Thành phần FPGA </b></i>

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.

<i><b>2.2 Bộ xử lý Nios® II </b></i>

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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

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ủ

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

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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>B. BÁO CÁO THỰC HÀNH </b>

<b>1. Thiết kế phần cứng SoPC dùng </b>

(1) 6 LED 7 đoạn (2) 10 LED đơn (3) 10 switch

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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

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

SWITCH

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>File System.v sau khi Generate hoàn tất </b>

Code Verilog :

<b>Report.v </b>

<small>module REPORT ( </small>

<small>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 ); </small>

<small>system nios_system( .clk_clk </small>

<small>(CLOCK_50), </small>

<small>.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}), </small>

<small>.led_external_connection_export ({16'd0, LEDR}), .hex5_external_connection_export ({8'b0,HEX5}) </small>

<small>); </small>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>2. Viết chương trình C </b>

<i><b>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ế). </b></i>

<i><b>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>

<b><small>void timer_Init(){ </small></b>

<small>// Stop Timer</small>

<small>IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_STOP_MSK); </small>

<small>//Configure period</small>

<small>period = 50000000 - 1; </small>

<small>IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, period); </small>

<small>IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, (period >> 16)); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, </small>

<small>ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | // Continue counting mode</small>

<small>ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | // Interrupt enable</small>

<small>ALTERA_AVALON_TIMER_CONTROL_START_MSK);// Start Timer</small>

<small>} </small>

<b><small>void Timer_IRQ_Handler(void</small></b><small>* isr_context){ </small>

<small>//Switch 0 dùng để dừng đồng hồ đang chạy</small>

<small>status = IORD(SWITCH_BASE, 0) & 0x1; </small>

<b><small>if</small></b><small> (status != 1){ counter ++; } </small>

<small>// Code để kích hoạt ngày giờ ở trên đồng hồ</small>

<b><small>int</small></b><small> hours = counter / 3600; </small>

<b><small>int</small></b><small> minutes = (counter % 3600) / 60; </small>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b><small>int</small></b><small> seconds = counter % 60; </small>

<small>//Switch 1 dùng để reset lại thời gian đang hiển thị </small>

<b><small>int</small></b><small> reset1 = (IORD(SWITCH_BASE, 0) >> 1)& 0x1; </small>

<b><small>if</small></b><small> (reset1 == 1){ hours = 0; minutes = 0; seconds = 0; counter = 0; } </small>

<b><small>if</small></b><small> (hours >= 23 & minutes >= 59 & seconds >= 59){ hours = 0; </small>

<small>minutes = 0; seconds = 0; counter = 0; } </small>

<b><small>if</small></b><small> (hours == 24 ){ hours = 0; minutes = 0; seconds = 0; counter = 0; } </small>

<small>// Đoạn code dịch 2 led để led chạy vòng bằng 1 SWITCH</small>

<b><small>int</small></b><small> sw_led = (*sw_pt >> 9)&0x1; </small>

<b><small>printf</small></b><small>("*sw_led_value=%d\n", sw_led); </small>

<b><small>if</small></b><small>(sw_led == 1) </small>

<small>led_value = (led_value >> 1) | ((led_value & 0x1) << 9); </small>

<small>led_value = (led_value << 1) | ((led_value & 0x200) >> 9); </small>

<small>// Hiển thị thời gian ra 6 led 7 đoạn </small>

<small>*led_pt = led_value; </small>

<b><small>int</small></b><small> sec_0 = seconds % 10; </small>

<b><small>int</small></b><small> sec_1 = seconds / 10; </small>

<b><small>int</small></b><small> min_0 = minutes % 10; </small>

<b><small>int</small></b><small> min_1 = minutes / 10; </small>

<b><small>int</small></b><small> hour_0 = hours % 10; </small>

<b><small>int</small></b><small> hour_1 = hours / 10; </small>

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

<b><small>int</small></b><small> sec1 = (IORD(SWITCH_BASE,0) >> 3)& 0x1; //Switch 3 dùng để tăng hàng chục của giây</small>

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

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

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

<b><small>if</small></b><small> (sec0 ==1){ counter++; } </small>

<b><small>if</small></b><small> (sec1 == 1){ counter +=10; </small>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b><small>if</small></b><small> (min0 ==1){ counter +=60; } </small>

<b><small>if</small></b><small> (min1 ==1){ </small>

<small>counter +=600; } </small>

<b><small>if</small></b><small> (hour0 ==1){ </small>

<small>counter +=3600; } </small>

<small>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]); </small>

<small>// Clear Timer interrupt bit</small>

<small>IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, ALTERA_AVALON_TIMER_STATUS_TO_MSK); </small>

</div>

×