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">
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA ĐIỆN TỬ – VIỄN THƠNG <small>o0o </small>
<small>• </small>
<small>• </small>
<small>• </small>
- 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.
- 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"><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><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>