Sinh viên thực hiện:
1. Họ và tên: ... MSSV: ... 2. Họ và tên: ... MSSV: ... Thời gian thực hiện: 4 tiết.
Mục đích
Bài thực tập này nhằm mục đích giúp sinh viên tìm hiểu cách giao tiếp của hệ thống nhúng với LED, Switch, LED 7 đoạn thông qua việc thiết kế một mạch có chức năng tương tự như mạch cộng 8 bit với đầu vào và đầu ra là các số thập lục phân.
Yêu cầu
Dựa vào các ngoại vi và chức năng hỗ trợ trên board DE2-115 để thiết kế một mạch cộng với các yêu cầu sau:
Viết chương trình cộng và hiển thị kết quả của 2 số thập lục phân lên các LED đơn và LED 7 đoạn bằng phần mềm Quartus II phiên bản 11.0 sử dụng công cụ QSys.
Giá trị đầu vào được nhập bằng cách thay đổi trạng thái các công tắc SW15 – SW0 và các trạng thái của các công tắc này được hiển thị lên các LED đỏ tương ứng LEDR15 – LEDR0.
Hiển thị các giá trị thập lục phân đầu vào đã nhập và kết quả thập lục phân đầu ra lên LED 7 đoạn HEX7 – HEX0.
CÁC NGOẠI VI CẦN SỬ DỤNG:
12
Số hạng thứ nhất:
o Đầu vào: SW15 – SW8
o Hiển thị trạng thái SW: LEDR15 – LEDR8 o Đầu ra: HEX7 – HEX6
Số hạng thứ hai:
o Đầu vào: SW7 – SW0
o Hiển thị trạng thái SW: LEDR7 – LEDR0 o Đầu ra: HEX5 – HEX4
Kết quả:
o Hiển thị: HEX3 – HEX0.
Các bước thực hiện 4.1.3.1 Sơ đồ hệ thống
Hình 4.1.2 Sơ đồ hệ thống
13
Hình 4.1.3 Lưu đồ giải thuật
4.1.3.2 Các bước thực hiện
Bước 1: Tạo hệ thống mới
Hình 4.1.4 Tạo project mới
Nhấp chuột vào biểu tượng để mở phần mềm Quartus II 11.0. Bắt đầu
Nhận giá trị số hạng thứ nhất bằng SW15 – SW8
Hiển thị giá trị lên 4 bit cao của LEDR
Nhận giá trị số hạng thứ hai bằng SW7 – SW0
Hiển thị giá trị lên 4 bit thấp của LEDR
Hiển thị số hạng thứ nhất lên led 7 đoạn thứ 7 và thứ 6. Hiển thị số hạng thứ nhất lên led 7 đoạn thứ 5 và thứ 4. Hiển thị số kết quả lên led 7 đoạn thứ 3-2-1-0.
Cộng hai số hạng
Nhập giá trị số hạng thứ nhất bằng SW15 – SW8
Nhập giá trị số hạng thứ hai bằng SW7 – SW0
Xuất giá trị lên 8 bit cao của LEDR
Xuất giá trị lên 8 bit thấp của LEDR
Hiển thị số hạng thứ nhất lên led 7 đoạn thứ 7 và thứ 6. Hiển thị số hạng thứ nhất lên led 7 đoạn thứ 5 và thứ 4. Hiển thị số kết quả lên led 7 đoạn thứ 3-2-1-0.
14
Chọn Create a New Project trong cửa sổ Start Designing như Hình 4.1.4 hoặc chọn File/ New Project Wizard trên thanh công cụ của cửa sổ Quartus II (Hình 4.1.5).
Hình 4.1.5 Tạo project mới
Trong cửa sổ New Project Wizard:
o Chọn đường dẫn lưu hệ thống và đặt tên cho project (Hình 4.1.6).
Hình 4.1.6 Chọn nơi lưu và đặt tên cho hệ thống
Hình 4.1.7 Add File [Page 2 of 5]
o Trong cửa sổ Add File [Page 2 of 5] chọn Next (Hình 4.1.7). Trong trường hợp xây dựng hệ thống bằng công cụ QSys bước này được bỏ qua cho đến khi tạo được file.quip.
o Trong cửa sổ Family & Device Settings [Page 3 of 5] chọn dòng vi xử lý tương ứng với Board mạch đnag sử dụng.
15
Board mạch được sử dụng trong bài nghiên cứu này là DE2- 115 (Hình 4.1.8) :
Device family chọn Cyclone IV E. Target device chọn “Specific” và ở
mục“Available Devices”EP4CE115F29C7. Nhấn “Next”.
o Trong cửa sổ EDA Tool Settings [page 4 of 5] để mặc định và chọn chọn Next (Hình 4.1.9).
o Trong cửa sổ Summary [page 5 of 5] chọn Finish để hoàn tất việc tạo project (Hình 4.1.10).
Hình 4.1.8 Family & Device Settings [page 3 of 5]
16
Hình 4.1.10 Cửa sổ tổng hợp.
Bước 2: Xây dựng hệ thống trên QSys
Tạo một hệ thống QSys bao gồm:
o CPU: cấu hình sử dụng core Nios II processor Nios II/s, JTAG Debug Module lever 2.
o RAM (On-Chip Memory (RAM or ROM)): 32 kB.
o SW (Peripherals Microcontroller Peripherals PIO): 16 bit – input.
o LEDR (PIO): 16 bit – output.
o HEX3_0 (University Program Generic IO Parallel Port): 3 to 0.
o HEX7_4 (Parallel Port): 7 to 4.
Trong cửa sổ Quartus chọn biểu tượng hoặc trên thanh công cụ vào Tools/QSys để mở công cụ QSys (Hình 4.1.11).
Tạo bộ xử lý trung tâm Nios II Processor: trong cửa sổ “Component Library” Processors Nios II Processor (Hình 4.1.12 )
Trong Tab “Core Nios II”: chọn “Nios II /s”(Hình 4.1.13) Trong Tab “JTAG Debug Module” : tại mục Select a
debugging level ta chọn Level 2 (Hình 4.1.14) Chọn “Finish” để hoàn thành việc thiết kế CPU. Đổi tên nios2_QSys_0 thành “CPU”.
17
Hình 4.1.11 Mở công cụ QSys
18
Hình 4.1.13 Chọn cấu hình sử dụng core Nios II/s
Hình 4.1.14 Thêm JTAG Debug Module
Chú ý: Ở phía dưới của tab Nios II Processor có hiện các error là do chúng ta chưa gán bộ nhớ vào CPU và hệ thống chưa được nối dây. Các bước này sẽ được thực hiện sau nên ta không cần bận tâm việc hệ thống báo lỗi.
19
Tạo bộ nhớ On-Chip Memory: trong Tab “Component Library” Memories and Memory Controllers On-Chip On-Chip Memory (RAM or ROM). (Hình 4.1.15). Trong cửa sổ On-Chip Memory (Hình 4.1.16) :
Block Type chọn “Auto”
Total Memory size = “32768” để xác định dung lượng bộ nhớ là 32Kb.
Không thay đổi các cài đặt mặc định khác. Chọn “Finish”.
Đổi tên on-chip memory thành “RAM”.
Hình 4.1.15 Thêm On-Chip Memory
20
Tạo cổng song song điều khiển LED 7 đoạn: Trong cửa sổ “Component Library” University Program Generic IO Parallel Port (Hình 4.1.17):
Ở mục “DE Board”: Chọn “DE2-115”
Ở mục Presets “I/O device”: chọn “Seven Segment Displays”
Ở mục “Seven Segment Digits” chọn: “3 to 0”. Chọn “Finish” để kết thúc.(Hình 4.1.18)
Đổi tên parallel_port_0 thành “HEX3_0”.
Thực hiện tương tự cho “HEX7_4”, chỉ thay đổi Seven Segment Digits” chọn: “7 to 4” (Hình 4.1.19)
Hình 4.1.17 Thêm Parallel Port
21
Hình 4.1.19 Thiết lập cho HEX7_4
22
Hình 4.1.21 Thiết lập cho Switch
23
Tạo ngõ vào /ra điều khiển LED đơn và công tắc: trong cửa sổ Component Library Peripherals Microcontroller Peripherals PIO (Hình 4.1.20):
o Tạo ngõ vào 16bit điều khiển công tắc (Hình 4.1.21):
Ở mục “Basic Settings” nhập giá trị “16” vào khung “Width”
Ở mục “Direction”Intput Chọn “Finish”.
Đổi tên thành “SW”.
o Tạo ngõ ra 16 bit điều khiển LED đơn: thực hiện tương tự như trên.
Ở mục “Direction” Output (Hình 4.1.22). Đổi tên thành “LEDR”.
Thực hiện nối dây để tạo địa chỉ cho hệ thống vừa tạo: o Tiến hành nối dây ở cột Connection
Nối tất cả “Clock input” của các thành phần đã tạo với nguồn xung “clk” (Hình 4.1.23).
Hình 4.1.23 Kết nối thành phần xung clock
Nối Reset Input của các thành phần khác với Reset_n của nguồn xung (Hình 4.1.24).
24
Hình 4.1.24 Kết nối thành phần Reset
Nối tất cả các thành phần “Avalon Memory mappel Slave” của RAM, SW, HEX3_0, HEX7_4 với “Avalon memory mapple Master” (data_master) của CPU (Hình 4.1.25). Nối thành phần “Avalon Memory mappel Slave”của RAM
với “Avalon memory mapple Master” (Intruction_master) của CPU.
Hình 4.1.25 Nối thành phần “Avalon Memory mappel Slave”
Sau khi nối dây cho hệ thống, double-click CPU để gán bộ nhớ cho nó (Hình 4.1.26).
25
Hình 4.1.26 Chọn bộ nhớ Ram cho hệ thống
o Tại mục Reset Vector/ Reset Vector Memory: chọn RAM.s1. o Mục Exception Vector/ Exception Vector Memory: chọn
RAM.s1.
o Chọn Finish để kết thúc.
o Sau khi gán bộ nhớ và nối dây cho hệ thống các error ở hình 4.1.13 sẽ không còn nữa.
Khai báo địa chỉ nền cho các phần cứng :
o Trên thanh công cụ: chọn SystemAuto-Assign Base Addresses. (Hình 4.1.27).
o Kết quả trước và sau khi gán địa chỉ nền được thể hiện trên (Hình 4.1.28 và 4.1.29).
26
Hình 4.1.28 Kết quả trước khi gán địa chỉ
Hình 4.1.29 Kết quả sau khi gán địa chỉ
Lấy thiết bị để thực hiện gán chân ở bước tiếp theo: ở cột Export, click vào external_connection tương ứng của SW, LEDR, HEX3_0, HEX7_4 (Hình 4.1.30).
Thực hiện biên dịch hệ thống:
o Trong tab Generate ta chọn Generate (Hình 4.1.31). o Chọn Save trong hộp thoại (Hình 4.1.32) xuất hiện. o Lưu tên của hệ thống là nios_sys (Hình 4.1.33).
Chờ một khoảng thời gian để biết kết quả biên dịch, kết quả biên dịch thành công (Hình 4.1.34). Chương trình biên dịch thành công là khi
27
không có lỗi, không cần quan tâm đến số lượng cảnh báo của hệ thống.
Hình 4.1.30 Hệ thống sau khi lấy chân external_connection
Hình 4.1.31 Chọn Generate để biên dịch hệ thống
28
Hình 4.1.33 Đường dẫn nơi lưu hệ thống
Hình 4.1.34 Kết quả quá trình biên dịch
Bước 3: Gán chân hệ thống
Quay lại phần mềm Quartus II 11.0:
Vào File trong cửa sổ Project Navigator:
o Click chuột phải Add/Remove File in Project (Hình 4.1.35) sẽ xuất hiện hộp thoại (Hình 4.1.36).
o Sau đó, chỉ đến file.qip với tên đã đặt ở Hình 4.1.33. Trong bài nghiên cứu này là nios_sys.qip (Hình 4.1.37).
o Chọn Add, Apply (Hình 4.1.38).
29
Hình 4.1.35 Project Navigator
Hình 4.1.36 Add file cho hệ thống
Hình 4.1.37 Chọn file nios_sys.qip để add
30
Hình 4.1.39 Kết quả sau quá trình add file.
Trong cửa sổ project Quartus’s ta chọn biểu tưởng hoặc vào File/New xuất hiện hộp thoại (Hình 4.1.40) chọn Block Diagram/Schematic File để mở cửa sổ gán chân cho hệ thống.
Hình 4.1.40 Cửa sổ gán chân cho hệ thống
Click vào biểu tượng để mở cửa sổ Symbol Tool.
Trong cửa sổ Symbol: Project nios_sys (Hình 4.1.41).
Thực hiện gán chân cho hệ thống tương ứng (Hình 4.1.42). o Vào Pin Toll để lấy ngõ vào Input/Output/Bidir. o Chọn Orthogonal Node Tool để lấy dây nối. o Chọn Orthogonal Bus Tool để lấy dây bus.
31
Hình 4.1. 41 Cửa sổ lấy sơ đồ khối hệ thống
Hình 4.1.42 Thực hiện gán chân cho hệ thống
Nhấp chuột phải vào nios_sys.qip chọn Set as Top-Level Entily (Hình 4.1.43).
Trên thanh côngcụ: Chọn Assignments/Import Assignments (Hình 4.1.44).
Chỉ đến tập tin DE2-115_pin_assignments.csv nhấn OK (Hình 4.1.45).
32
Hình 4.1.43 Set as Top-Level Entily cho file nios_sys.qip
Hình 4.1.44 Chọn Import Assignments.
Hình 4.1.45 Chọn file để gán chân.
Lưu lại hệ thống với đuôi .bdf, sau đó cũng chọn Set as Top-Level Entily tương tự như bước vừa nêu (Hình 4.1.46).
Nhấp chuột vào biểu tượng Start Compilation trên thanh công cụ hoặc vào Processing chọn Start Compilation để biên dịch, kiểm tra lỗi và gán chân (Hình 4.1.47).
33
Hình 4.1.46 Set as Top-Level Entily cho file LAB1.bdf
Hình 4.1.47 Biên dịch chương trình
Khi biên dịch thành công xuất hiện hộp thoại (Hình 4.1.48).
Hình 4.1.48 Kết quả biên dịch thành công
Sau khi biên dịch thành công tiến hành nạp file LAB1.sof xuống board. o Vào Programmer hoặc vào Tools/ Programmer trong cửa sổ
34
Hình 4.1.49 Programmer
o Trong cửa sổ Programer: chọn Add File chỉ đến file ứng dụng (LAB1.sof) đã thiết kế (Hình 4.1.50).
o Trong Hardware Setup chọn Hardware là USB-Blaster0 (Hình 4.1.51).
o Sau khi đã kết nối board DE2-115 với máy tính ta tiến hành nhấn Start để nạp. Kết quả nạp xuống thành công (Hình 4.1.52).
35
Hình 4.1.51 Kết nối board với hệ thống qua USB-Blaster
Sau khi nạp hệ thống xuống board ta đóng chương trình Programmer lại sau đó tiến hành viết chương trình và biên dịch cho hệ thống.
Hình 4.1.52 Kết quả nạp xuống thành công
Bước 4: Viết chương trình ứng dụng cho hệ thống
Mở chương trình Nios II 11.0 Software Buil Tools for Eclipse, chọn đường dẫn nơi lưu trữ phần mềm ứng dụng (Hình 4.1.53).
36
Hình 4.1.53 Chọn đường dẫn cho lưu trữ chương trình cho hệ thống
Trên thanh công cụ: File New Nios II Application and BSP from Template (Hình 41.54)
Trong cửa sổ Nios II Application and BSP form Template (Hình 4.1.55): o Tại mục SOPC Information File Name ta chỉ đường dẫn đến file
nios_sys.sopcinfo chứa thông tin phần cứng hệ thống.
o Trong mục Application project, đặt tên cho project của chương trình ứng dụng (ví dụ:”LAB1”).
o Trong mục Project template chọn project mẫu là Hello world small chứa chương trình mẫu.
o Chọn Finish để tạo project mới.
Hình 4.1.54 Tạo project mới cho hệ thống.
Trong cửa sổ Project Explorer nhấp phải chuột vào LAB1_ bsp [nios_sys] chọn Properties (Hình 4.1.56).
Trong cửa sổ Properties for LAB1_bsp: chọn Nios II BSP Properties, thiết đặt như Hình 4.1.57, chọn Apply OK.
37
Hình 4.1.55 Nios II Application and BSP form Template
38
Hình 4.1.57 Properties for LAB1_bsp
Trên cửa sổ Project Explorer mở chương trình hello_world_small.c trong thư mục LAB1, đây là chương trình demo in ra màn hình một chuỗi ký tự. Ta sẽ xóa chương trình này và gõ đoạn chương trình điều khiển sau đây vào: #include <system.h> char seven_seg[]={0x3F, //0 0x06, //1 0x5B, //2 0x4F, //3 0x66, //4 0x6D, //5 0x7C, //6 0x07, //7 0x7F, //8 0x67, //9 0x77, //A 0x7C, //B 0x39, //C 0x5E, //D 0x79, //E 0x71 //F
39 };
char hex_segs[] = {0,0,0,0,0,0,0,0};
// Mang luu gia tri se hien thi len 7SEG - 8 7seg tuong ung 8 phan tu trong mang
/* Ham hien thi gia tri len 7Seg */
void Hex_Display(char number, char order_7seg ) {
volatile int * HEX3_0 = (int *) HEX3_0_BASE; // dia chi cua 7seg 3-0
volatile int * HEX7_4 = (int *) HEX7_4_BASE; //dia chi cua 7seg 7_4
hex_segs[order_7seg] = seven_seg[number];// [vi tri cua 7SEG] = [gia tri hien thi]
*(HEX3_0) = *(int *)(hex_segs);//gan cac gia tri trong mang cho thanh ghi 7seg
*(HEX7_4) = *(int *)(hex_segs+4); }
/* Ham tinh tong 2 so 8 bit nhap vao tu switc va hien thi ra 7seg */
void Sum() {
int number1,number2, sum;
volatile int * SW = (int *) SW_BASE;//dia chi Switch
volatile int * LEDR = (int *) LEDR_BASE;//dia chi LED-RED
*LEDR = *SW;//Gan gia tri Switch cho LED
number1=((*SW&0xFF00)>>8);// number1: 8 bit cao (8-15) cua switch
number2=(*SW&0x00FF);// number2: 8 bit thap (0- 7) cua switch
sum = number1+number2;
/*Hien thi len LED 7 doan*/
Hex_Display((number1&0xF0)>>4,7); //Hien thi 4 bit cao cua number1 ra 7Seg thu 7
Hex_Display(number1&0x0F,6);// Hien thi 4 bit thap cua number1 ra 7Seg thu 6
Hex_Display((number2&0xF0)>>4,5);// Hien thi number2 ra 7Seg thu 5 va thu 4
Hex_Display(number2&0x0F,4);
Hex_Display((sum&0xF000)>>12,3;// Hien thi sum ra 7Seg 3-2-1 -0
Hex_Display((sum&0x0F00)>>8,2); Hex_Display((sum&0x00F0)>>4,1); Hex_Display(sum&0x000F,0);
40 } int main(){ while(1) { Sum(); }}
Nhấp chuột phải vào LAB1 chọn Buil Project (Hình 4.1.58)
Hình 4.1.58 Biên dịch chương trình vừa tạo
Nhấp chuột phải lên LAB1 chọn Run As/Run Cofigurations… (Hình 4.1.59).
o Xuất hiện cửa sổ Run Cofigurations.
o Nhấp đúp vào Nios II Harware để tạo New_configuration (Hình 4.1.60)
o Chọn “Target Connection”
o Ở mục “System ID” Check chọn “Ignore mismatched system ID” và “Ignore mismatched system timestamp”.
o Chọn “Apply” và “Run” để nạp chương trình ứng dụng xuống phần cứng.
41
Hình 4.1.59 Mở cửa sổ Run Cofigurations
42
Hình 4.1.61 Kết quả biên dịch thành công
Bước 5: Demo hệ thống
Sau khi đã biên dịch và nạp thành công tất cả các quá trình trên, tiến hành thực hiện thử các phép toán để kiểm tra xem đúng với mục tiêu đề ra hay chưa. Ví dụ: 0x01 + 0x03 = 0x04
Hình 4.1.62 Kết quả demo
Kết quả đạt được
Qua bài thực tập, sinh viên phải nắm vững được các thao tác kết nối giữa máy tính với board DE2-115.
Biết cách sử dụng phần mềm Quartus II 11.0 và QSys để tạo ra phần cứng của hệ thống. Sử dụng được công cụ Nios II Software Build Tools for Eclipse để lập trình phần mềm cho hệ thống nhúng đã thiết kế.
Nắm vững được cách giao tiếp giữa hệ thống nhúng với các ngoại vi LED đơn, switch và LED 7 đoạn.
Có thể thực hiện được phép cộng các số thập lục phân bằng chương trình đã viết.
43