90
BỘ GIÁO DỤC VÀ ĐÀO TẠO THỰC HÀNH HỆ THỐNG NHÚNG Biên soạn: ThS. Nguyễn Trọng Hải KS. Bùi Hữu Hiên www.hutech.edu.vn Tài Liệu Lưu Hành Tại HUTECH

THỰC HÀNH HỆ THỐNG NHÚNG

  • Upload
    ngokiet

  • View
    245

  • Download
    6

Embed Size (px)

Citation preview

Page 1: THỰC HÀNH HỆ THỐNG NHÚNG

BỘ GIÁO DỤC VÀ ĐÀO TẠO

THỰC HÀNH

HỆ THỐNG NHÚNG

Biên soạn: ThS. Nguyễn Trọng Hải KS. Bùi Hữu Hiên

www.hutech.edu.vn Tài Liệu Lưu Hành Tại HUTECH

Page 2: THỰC HÀNH HỆ THỐNG NHÚNG

THỰC HÀNH HỆ THỐNG NHÚNG

Ấn bản 2013

Page 3: THỰC HÀNH HỆ THỐNG NHÚNG
Page 4: THỰC HÀNH HỆ THỐNG NHÚNG

MỤC LỤC I

MỤC LỤC

MỤC LỤC .................................................................................................................... I

HƯỚNG DẪN............................................................................................................... II

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN .............................................................. 1

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP .................................................... 21

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP ............................................................... 41

BÀI 4: HỎI VÒNG VÀ NGẮT ....................................................................................... 54

BÀI 5: GIAO TIẾP BUS ............................................................................................... 60

TÀI LIỆU THAM KHẢO .................................................................................................84

Page 5: THỰC HÀNH HỆ THỐNG NHÚNG

II HƯỚNG DẪN

HƯỚNG DẪN Giới thiệu phần mềm Quartus II:

Quartus II là công cụ phần mềm phát triển của hãng Altera, cung cấp môi trường

thiết kế toàn diện cho các thiết kế SOPC (hệ thống trên 1 chip khả trình - system on a

programmable chip). Đây là phần mềm đóng gói tích hợp đầy đủ phục vụ cho thiết kế

logic với các linh kiện logic khả trình PLD, FPGA của Altera, gồm các dòng APEX,

Cyclone, FLEX, MAX, Stratix...Quatus ii cung cấp các khả năng thiết kế sau:

Môi trường thiết kế gồm các bản vẽ, sơ đồ khối, công cụ soạn thảo các ngôn

ngữ: AHDL, VHDL, và Verilog HDL.

Thiết kế LogicLock.

Là công cụ mạnh để tổng họp logic.

Khả năng mô phỏng chức năng và thời gian.

Phân tích thời gian.

Phân tích logic nhúng với công cụ phân tích SignalTap® II.

Cho phép xuất, tạo và kết nối các file nguồn để tạo ra các file chương trình.

Tự động định vị lỗi.

Khả năng lập trình và nhận diện linh kiện.

Phần mềm Ọuartus II sử dụng bộ tích hợp NativeLink® với các công cụ thiết

kế cung cấp việc truyền thông tin liền mạch giữa Quartus với các công cụ thiết kế

phần cứng EDA khác.

Quartus II cũng có thể đọc các file mạch (netlist) EDIF chuẩn, VHDL và

Verilog HDL cũng như tạo ra các file netlist này.

Quartus II có môi trường thiết kế đồ họa giúp nhà thiết kế dễ dàng viết mã,

biên dịch, soát lỗi, mô phỏng...

Với Quartus có thế kết hợp nhiều kiểu file trong 1 dự án thiết kế phân cấp. Có thể

dùng bộ công cụ tạo sơ đồ khối (Quartus Block Editor) để tạo ra sơ đồ khối mô tả

thiết kế ở mức cao, sau đó dùng các sơ đồ khối khác, các bản vẽ như: AHDL Text

Page 6: THỰC HÀNH HỆ THỐNG NHÚNG

HƯỚNG DẪN III

Design Files (.tdf). EDIF Input Files (.edfh VHDL Design Files (.vhd). and Verilog HDL

Design Files đế tạo ra thành phần thiết kế mức thấp.

Quartus II cho phép làm việc với nhiều file ở cùng thời điểm, soạn thảo file thiết kế

trong khi vấn có thế biên dịch hay chạy mô phỏng các dự án khác. Công cụ biên dịch

Quartus II nằm ở trung tâm hệ thống, cung cấp quy trình thiết kế mạnh cho phép tùy

biến đế đạt được thiết kế tối ưu trong dự án. Công cụ định vị lỗi tự động và các bàn

tin cảnh báo khiến việc phát hiện và sửa lỗi trở nên đơn giản hơn.

Sau khi cài Quartus II, giao diện như hình vẽ:

Giao diện Quartus II

Page 7: THỰC HÀNH HỆ THỐNG NHÚNG
Page 8: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 1

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN

GIẢN

1.1 MỤC ĐÍCH YÊU CẦU: Mục đích của bài tập này là để tìm hiểu làm thế nào để tạo ra và sử dụng một hệ

thống máy tính đơn giản. Hệ thống sẽ bao gồm một bộ xử lý Altera NiosII và một

chương trình ứng dụng. Chúng tôi sẽ sử dụng phần mềm Quartus II và SoPC Builder

để tạo ra phần cứng của hệ thống. Chúng tôi sẽ sử dụng phần mềm Altera Debug

Client để biên dịch, tải và chạy các chương trình ứng dụng.

1.2 PHẦN I: Trong bài tập này, bạn sẽ sử dụng Builder SoPC để tạo ra hệ thống như trong

hình, trong đó bao gồm một bộ xử lý Nios II/e và một khối bộ nhớ. Bộ vi xử lý Nios

II/e xử lý dữ liệu. Khối bộ nhớ lưu trữ chương trình và dữ liệu.

Hệ thống Nios II trong SoPC Builder

Các bước thực hiện như sau:

Page 9: THỰC HÀNH HỆ THỐNG NHÚNG

2 THỰC HÀNH HỆ THỐNG NHÚNG

1.2.1 Tạo một dự án Quartus II mới. Chọn Cyclone IIEP2C35F672C6 như chip mục

tiêu, đó là FPGA chip trên board DE2 Altera.

Trước tiên, ta phải tạo project trên Quartus trước, Chọn chip Cyclone II

EP2C35F672C6, đó là chip FPGA trên mạch Altera DE2.

giao diện thiết lập New Project

Sau đó, ta tạo một file mới block diagram cho toàn bộ hệ thống. Đặt tên file là

nios_2.pdf

Tạo file .pdf cho hệ thống

Tạo hệ thống Nios II sử dụng Altera SoPC Builder:

Click vào biểu tượng SoPC Builder để tạo hệ thống Nios II.

Page 10: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 3

SoPC Builder

Giao diện SoPC Builder

Page 11: THỰC HÀNH HỆ THỐNG NHÚNG

4 THỰC HÀNH HỆ THỐNG NHÚNG

1.2.2 Sử dụng Builder SoPC để tạo ra một hệ thống có tên là hệ thống nios_system,

trong đó bao gồm các thành phần sau:

On-chip memory – RAM: Bộ nhớ trên chip, chế độ RAM với kích thước bộ nhớ là

32 Kbytes và độ rộng dữ liệu là 32 bits.

Trên tab Component Library (bên tay trái của tab System Contents), trong

Memories and Memory Controllers, mở On-Chip, và click vào On-Chip Memory

(RAM or ROM).

Click Add. Bảng cấu hình thông số xuất hiện như hình vẽ.

Trong danh sách Block type, chọn Auto.

Trong hộp thoại Total memory size, đánh vào 30 để có 30 KB, chọn data with 32

Giao diện cấu hình tham số on-chip memory

Page 12: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 5 Bộ xử lý Nios II/e với JTAG Debug Module Level 1

Trong tab Component Library, mở Processors, và click vào Nios II

Processor.

Click Add. Xuất hiện hộp thoại cấu hình thông số cho Nios II như hình vẽ.

Dưới phần Select a Nios II core, chọn Nios II/e.

Trong danh sách Hardware multiplication type, chọn Embedded Multipliers.

Tắt mục Hardware divide

Trong phần Reset Vector chọn onchip_mem

Trong phần Exception Vectorchọn onchip_mem

Các mục khác để mặc định

Giao diện cấu hình tham số CPU Nios II /s Core

Page 13: THỰC HÀNH HỆ THỐNG NHÚNG

6 THỰC HÀNH HỆ THỐNG NHÚNG

Giao diện cấu hình tham số JTAG Debug Module

Click Finish. Quay trở lại tab SoPC System Contents, và một con CPU Nios II

đã xuất hiện trong bảng system contents.

1.2.3 Từ menu System, chọn Auto-Assign Base Addresses. Bây giờ bạn có hệ thống như trong hình vẽ:

Hệ thống Nios II hoàn chỉnh

Page 14: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 7

1.2.4 Tạo ra hệ thống, thoát khỏi Builder SoPC và trở về phần mềm Quartus II.

Click vào tab System Generation.

Chọn None cho Create simulation model.

Click Generate. Click Save và chờ hệ thống hoàn tất Nếu hệ thống yêu cầu đặt

tên thì đánh nios.

Click Exit. Quay trở lại giao diện thiết kế của quartus.

1.2.5 Tích hợp hệ thống SoPC Builder vào project Quartus II:

Trong phần này, chúng ta sẽ phải thực hiện các bước sau để hoàn thành thiết kế

hardware.

Tích hợp SoPC system vào project quartus II.

Gán chân.

Compile project.

Tích hợp SoPC system vào project.

Để tích hợp hệ thống SoPC vào hệ thống quartus .bdf, thực hiện các bước sau:

Chọn hộp thoại Symbol trên thanh công cụ.

Dưới mục Libraries, mở Project.

Chọn nios2_sys. Hộp thoại Symbol sẽ hiển thị symbol nios2_sys như hình vẽ.

Symbol nios

Page 15: THỰC HÀNH HỆ THỐNG NHÚNG

8 THỰC HÀNH HỆ THỐNG NHÚNG

Click OK. Quay trở lạ .bdf schematic. Symbol nios2_sys sẽ nằm trong không gian

thiết kế của quartus.

Nối các chân ngõ vào với các chân của Nios. Đưa chuột tới gần chân để nối dây

từ chân đó.

Lưu lại file .bdf hoàn chỉnh, clickSave trên menu File.

Hệ thống hoàn chỉnh

1.2.6 Gán chân:

Để gán chân FPGA, Thực hiện các bước sau:

Trong menu Processing, Vào Start, và click chọn Start Analysis & Elaboration

để chuẩn bị cho việc gán chân. Quá trình này có thể mất vài phút và kết thúc khi

có hộp thoại xác nhận xuất hiện.

Click OK.

Trên menu Assignments, click Pin Planner. Bảng Quartus II Pin Planner xuất

hiện.

gán chân như hình vẽ.

clk - PIN N2 (đó là chân xung clock 50 MHz).

reset n - PIN G26 (đó là chân nút nhấn KEY0).

Page 16: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 9

Hộp thoại Pin Planner

Trên menu Assignments, click Device. Bảng hội thoại Device xuất hiện.

Click Device and Pin Options, Bảng hội thoại Device and Pin Options xuất hiện.

Click vào trang Unused Pins.

Trong danh sách Reserve all unused pins , chọn As input tri-stated with

weak

pull-up . Với lựa chọn này, tất cả các chân không dùng trên thiết bị FPGA sẽ có

trạng thái tổng trở cao. Chú ý, luôn luôn dùng option này để tránh làm hư các chân

IO và linh kiện trên board do các chân không dùng có mức điện áp xung đột

Click OK để đóng các hộp thoại.

Biên dịch hệ thống và kiểm tra timing:

Chúng ta phải biên dịch hệ thống để tạo ra file .sof mà có thể download xuống

board. Sau khi biên dịch xong, chúng ta phải kiểm tra timing của thiết kế có làm việc

dưới điều khiện của phần cứng hay không. Để đảm bảo thiết kế đạt yêu cầu về

timing.ta thực hiện các bước sau:

Trên menu File, click New.

Trong danh sách file, Chọn Synopsys Design Constraints File (*.sdc).

Đặt tên là hw_leo.sdc và click OK. Mở file trong chương trình Editor.

Page 17: THỰC HÀNH HỆ THỐNG NHÚNG

10 THỰC HÀNH HỆ THỐNG NHÚNG

Thêm dòng lệnh create_clock: create_clock -name sopc_clk -period 20

[get_ports CLK].

Click Save.

Trong menu Assignments , chọn Settings .

Trong mục Timing Analyzer Setting ,chọn TimeQuest Timing Analyzer

Browse file hw_leo.sdc và nhấn add để thêm vào danh sách.

Bật mục Enable multicorner timing analysis during compilation như hình

vẽ:

Time Quest Timing Analyzer

Click OK và bắt đầu biên dịch.

Page 18: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 11 Sau khi biên dịch xong sẽ hiện ra bảng thông báo như hình vẽ:

Compilation Report

Đến đây, chúng ta đã hoàn tất thiết kế và sẵn sàng nạp chương trình xuống board

DE2 để thử nghiệm.

1.2.7 Biên dịch các dự án Quartus II:

Trong phần này, chúng ta sẽ download file .sof xuống board DE2. Thực hiện các

bước sau:

Kết nối board DE2 với máy tính host bằng cáp USB-Blaster, Sau đó cắm nguồn

vào board.

Trên menu Tools của phần mềm Quartus II, click Programmer. Công cụ Quartus

II Programmer xuất hiện với file cấu hình mặc định (nios_2.sof) như hình vẽ:

Page 19: THỰC HÀNH HỆ THỐNG NHÚNG

12 THỰC HÀNH HỆ THỐNG NHÚNG

Màn hình Welcome có thể xuất hiện. Đóng nó bằng cách nhấn vào"Workbench"

mũi tên ở góc trên bên phải.

Vào menu File - New - Project.

Page 20: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 13

Page 21: THỰC HÀNH HỆ THỐNG NHÚNG

14 THỰC HÀNH HỆ THỐNG NHÚNG

Chọn "Nios IIC/ C + +Application" và nhấp "Next".

Đặt tên cho chương trình.

Trong mục select target hardware chọn đường dẫn tới file nios.ptf vừa tạo ở

phần trên.

Trong mục select project template chọn Blank project.

Click Next.

Chọn Create a new system library name. Click finish.

Vào menu File, chọn New, chọn Source File.

Page 22: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 15 Đặt tên lab1.s, click Finish

1.3 PHẦN II Thiết Trong một máy tính kỹ thuật số tất cả các dữ liệu được biểu diễn như là

chuỗi gồm các số 1 và số 0.

Đoạn code chương trình Nios II ngôn ngữ Assembly trong hình sau sẽ kiểm tra số

số1 liên tiếp từ chuỗi dữ liệu và xác định số lượng tối đa số số 1 liên tiếp trong từ ngữ

đó. Ví dụ, 0x937a (1001001101111010) có tối đa là 4 số 1 liên tiếp. Đoạn code trong

hình tính toán số lượng 1s liên tiếp cho dữ liệu 0x90abcedf.

Page 23: THỰC HÀNH HỆ THỐNG NHÚNG

16 THỰC HÀNH HỆ THỐNG NHÚNG

Assembly-language code that counts consecutive ones

Type đoạn code chương trình trong hình trên vào cửa sổ như hình bên dưới:

Page 24: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 17

Thực hành đoạn code theo các bước sau:

Mở và cấu hình Altera Debug Client để sử dụng hệ thống đã tạo ở Phần I với

code trong hình 2.

Biên dịch và chạy chương trình.

Hãy xem quy trình thay đổi dữ liệu thanh ghi của bộ xử lý. Lưu ý rằng khi kết

thúc chương trình, ở thanh ghi r16 phải có giá trị là 4.

Gán 0x00000008 cho Program Counter. Điều này cho phép thực thi chương

trình một lần nữa (ở bước 6), mặc dù bỏ qua hai bước đầu.

Lúc này thêm một điểm ngắt tại địa chỉ 0x28. Chương trình sẽ tự động dừng khi

thực hiện xong.

Gán 0xabcdef90 cho thanh ghi r7. Nhấn F3 và quan sát có bao nhiêu bit 1 liên

tiếp?

1.4 PHẦN III Hướng dẫn biểu diễn chuỗi số 1 và số 0, tương tự như dữ liệu. Trong phần này,

chúng ta sẽ khảo sát quy trình được thực hiện như thế nào.

Thực hiện như sau:

Chạy lại chương trình (bằng cách chọn Actions > Load) để xóa các chỉnh sửa bộ

nhớ đã thực hiện trong phần II. Sau đó, thực thi chương trình chỉ một lần.

Sử dụng Nios II Processor Reference Handbook có sẵn trên trang web của Altera

để biểu diễn ngôn ngữ chương trình máy theo ngôn ngữ Assembly: and r3, r7, r16;

sra r7, r7, r3.

Sử dụng chức năng memory-fill của Altera Debug Client để đặt hai chỉ thị tại vị

trí bộ nhớ 0 và 4. Chúng ta nên lưu ý rằng sẽ không nhìn thấy những giá trị này được

cập nhật trong giao diện của Debug Client.

Đặt 0x00000000 cho Program Counter. Điều gì sẽ xảy ra thời gian này? Là để

xác minh câu trả lời mà bước trước đã hướng dẫn bạn đặt ở địa chỉ 0 và 4 (để xem

kết quả của chúng) và sau đó thì thực hiện phần còn lại của chương trình.

Page 25: THỰC HÀNH HỆ THỐNG NHÚNG

18 THỰC HÀNH HỆ THỐNG NHÚNG

Sử dụng chức năng memory-fill để thay đổi nhánh cuối cùng để trở về đầu

chương trình thay thế. Điều này sẽ loại bỏ các chỉnh sửa thủ công Program Counter.

Chạy lại chương trình cho đến khi số 1 và các dữ liệu đang được thử nghiệm vẫn

không đổi.

Bây giờ lặp lại các bước từ 1 - 6 , nhưng sử dụng chỉ dẫn srl r7, r7, r3 thay vì

sra r7, r7, r3. Sự khác biệt ở đây là gì?

1.5 PHẦN IV Trong hầu hết các chương trình ứng dụng, nhiều thành phần code sẽ được thực thi

nhiều lần từ các vị trí khác nhau trong một chương trình. Code có thể được thực thi

như một chương trình con. Một chương trình con có thể chạy từ bất cứ nơi nào trong

chương trình bằng cách sử dụng một lệnh gọi. Sau khi thực thi hoàn thành chương

trình con, chương trình chính quay trở lại thực hiện các lệnh tiếp sau vị trí gọi chương

trình con. Bây giờ chúng ta sẽ tạo ra một chương trình con để tính toán số bit 1 liên

tiếp, và sử dụng nó để tính toán số bit 1 và số bit 0 liên tiếp trong một thông tin dữ

liệu nhất định.

Bắt đầu với chương trình Phần II và chỉnh sửa nó như sau:

Dùng code tính toán số bit 1 liên tiếp và tạo một chương trình con. Sử dụng

thanh ghi r4 để nhận dữ liệu đầu vào và thanh ghi r2 để xuất kết quả.

Gọi chương trình con vừa tạo hai lần, một lần để tính toán số lượng bit1 liên tiếp

và một lần để tính toán số lượng bit 0 liên tiếp. Để tính toán số lượng bit 0 liên tiếp

các dữ liệu đầu vào phải đảo trước khi chạy chương trình con.

Ghi số lượng bit 1 liên tiếp vào thanh ghi r16 và số lượng bit 0 liên tiếp vào

thanh ghi r17

1.6 PHẦN V Đôi khi chúng ta quan tâm đến các chuỗi xen kẽ 1 và 0 dài nhất. Ví dụ, số nhị

phân 101101010001 có một chuỗi gồm 6 số xen kẽ giữa 1và 0, được đánh dấu ở đây:

101101010001. Sử dụng chương trình con được tạo ra trong Phần IV để đếm số

lượng các bit xen kẽ 1 và 0 liên tiếp. Ghi kết quả vào thanh ghi r18. Giả định rằng hai

Page 26: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 19

bit cuối cùng có thể là một phần của chuỗi dài nhất. Ví dụ, 1010 có 4 bit xen kẽ 1 và

0 liên tiếp. (Gợi ý: Điều gì xảy ra khi dịch sang phải hoặc trái 1 và XOR với số ban

đầu)

1.7 PHẦN VI Thực hiện các phần trước của bài tập này bằng cách sử dụng ngôn ngữ lập trình C.

Tạo một hàm có tên là count_ones, dùng hàm này đếm số bit 1 liên tiếp.

Page 27: THỰC HÀNH HỆ THỐNG NHÚNG

20 THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN

XUẤT/NHẬP

2.1 MỤC ĐÍCH YÊU CẦU: Mục đích của bài tập này là nghiên cứu việc sử dụng các thiết bị cung cấp khả

năng nhập và xuất cho bộ xử lý, và được điều khiển bởi phần mềm. Chúng ta sẽ khảo

sát các hoạt động I/O chương trình điều khiển từ cả hai quan điểm phần cứng và

phần mềm. Chúng ta sẽ sử dụng giao diện song song, PIOs, trong một hệ thống Nios

II thực hiện trên một board Altera DE2. Các kiến thức cơ bản cần thiết để làm bài tập

này có thể thu được từ hướng dẫn: Giới thiệu về bộ xử lý mềm Altera Nios II và Giới

thiệu về Altera SoPC Builder, có thể được tìm thấy trong phần chương trình Đại học

của trang web Altera. Giao diện PIO được sử dụng trong bài tập này, đó là một bộ

phận có thể được tạo ra bằng cách sử dụng các Builder SoPC để truyền nhận dữ liệu.

Ta có thể thiết lập cho chúng là đầu vào hoặc đầu ra ( hoặc cả hai hướng). Việc

truyền nhận được thực hiện song song và nó có thể bao hàm từ 1 đến 32 bit. Số

lượng bit, n, và hướng truyền dẫn được quy định bởi người sử dụng thông qua SoPC

Builder Altera. Giao diện PIO có thể chứa bốn thanh ghi thể hiện trong hình vẽ.

Page 28: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 21 Mỗi thanh ghi có độ dài là n bit. Những thanh ghi có mục đích sau đây:

Thanh ghi dữ liệu (Data register) chứa n bit dữ liệu được chuyển giao giữa các

giao diện PIO và bộ vi xử lý Nios II. Nó có thể được thực hiện như một đầu vào, đầu

ra, hoặc thanh ghi hai chiều bởi SoPC Builder.

Thanh ghi trực tiếp (Direction register) xác định hướng chuyển giao cho mỗi bit

dữ liệu n khi một giao diện hai chiều được tạo ra.

Thanh ghi Interrupt-mask được sử dụng để cho phép ngắt từ dòng đầu vào kết

nối với PIO.

Thanh ghi Edge-capture cho biết khi có một sự thay đổi của giá trị logic được

phát hiện trong các tín hiệu trên đường dây đầu vào kết nối với PIO.

Không phải tất cả các thanh ghi này được tạo ra trong một giao diện PIO nhất

định. Ví dụ thanh ghi Direction được bao gồm chỉ khi một giao diện hai chiều được

định rõ.

Những thanh ghi PIO có thể truy cập như thể chúng là bộ nhớ tọa độ. Bất kỳ địa

chỉ cơ sở có ít nhất bốn - bit có ý nghĩa bằng 0 có thể được giao cho một PIO (điều

này có thể được thực hiện tự động bởi SoPC Builder) này trở thành địa chỉ của thanh

ghi dữ liệu. Địa chỉ của ba thanh ghi còn lại có hiệu số của 4, 8, hoặc 12bytes ( 1, 2,

hoặc 3 từ). Mô tả đầy đủ của các module PIO có thể được tìm thấy trong các tài liệu

PIO Core with Avalon Interface. Mỗi một giao diện đó đều có sẵn trong phần tài liệu

của trang web Altera.

Nhiệm vụ ứng dụng trong bài tập này bao gồm thêm cùng một tập hợp các số 8 -

bit đã được nhập thông qua các thiết bị chuyển mạch chuyển đổi trên board DE2

Altera. Kết quả tổng được hiển thị trên đèn LED đơn và LED 7 đoạn.

2.2 PHẦN I: XÂY DỰNG HARDWARE Sử dụng 8 công tắc đảo chiều, SW7-0, ở đầu vào để nhập số. Sử dụng đèn màu

xanh, LEDG7-0, để hiển thị số được xác định bởi các công tắc đảo chiều. Sử dụng 16

đèn đỏ, LEDR15-0, để hiển thị tổng tích lũy. Một hệ thống Nios II, trong đó bao gồm

ba giao diện PIO, là phần cứng cần thiết cho công việc của chúng ta. Một mạch PIO

kết nối với các công tắc đảo chiều, sẽ cung cấp các dữ liệu đầu vào có thể được đọc

bởi bộ xử lý. Hai mạch PIO còn lại, kết nối với đèn màu xanh và đỏ, sẽ đảm nhiệm

Page 29: THỰC HÀNH HỆ THỐNG NHÚNG

22 THỰC HÀNH HỆ THỐNG NHÚNG

như giao diện đầu ra để cho phép hiển thị số lựa chọn các thiết bị chuyển mạch và

tổng tích lũy tương ứng.

Thực hiện các yêu cầu phần cứng bằng cách thực hiện một hệ thống Nios II trên

board DE2, như sau:

(1) Tạo một dự án Quartus II mới. Chọn Cyclone II EP2C35F672C6 như chip mục

tiêu, đó là chip FPGA trên bảng Altera DE2.

(2) Sử dụng Builder SoPC để tạo ra các mạch mong muốn, được gọi là

nios_system, trong đó bao gồm:

Bộ xử lý Nios II/s với JTAG Debug Module Level 1, chọn các tùy chọn sau:

- Embedded Multipliers for Hardware Multiply

- Hardware Divide

Bộ nhớ On-chip - chế độ bộ nhớ RAM và kích thước 32 Kbytes

Một mạch PIO 8 - bit đầu vào

Một mạch PIO 8 - bit đầu ra

Một mạch PIO 16 - bit đầu ra

SoPC Builder sẽ tự động gán các tên như Pio_0 , Pio_1 và Pio_2 đến ba thành

phần PIO. Ta có thể thay đổi các tên này thành một tên khác có ý nghĩa hơn trong khi

thiết kế. Ví dụ, chúng ta có thể chọn new_number, green_LEDs và red_LEDs.

(3) Từ menu System, chọn Auto - Assign Base Addresses. Nó sẽ gán địa chỉ cho

tất cả các thành phần trong hệ thống được thiết kế. Kết quả sẽ là một hệ thống như

thể hiện trong Hình vẽ.

(4) Khởi tạo Nios_system tạo file Verilog/VHDL, xác định các yêu cầu kết nối

cho thiết bị chuyển mạch và đèn LED trên kit DE2.

(5) Xác định các chân cần thiết để làm các kết nối cần thiết, bằng cách nhập

các tập tin pin - assignment thư mục DE2_pin_assignments_csv.

(6) Biên dịch dự án Quartus II.

(7) Lập trình và cấu hình FPGA Cyclone II trong board DE2 để khởi tạo hệ

thống.

Page 30: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 23

Hệ thống NIOS II được tạo bởi SoPC Builder

2.2.1 Bước 1: Tạo project trên Quartus II

Tạo Project mới

Mở phần mềm > Chọn “Create a New Project”

Đặt tên Project

Page 31: THỰC HÀNH HỆ THỐNG NHÚNG

24 THỰC HÀNH HỆ THỐNG NHÚNG

Trong công cụ Quartus II chọn File New Project Wizard, đặt tên project là

“lab2” (lưu ý: đường dẫn đến thư mục lưu project không chứa khoảng trắng).

Vào File > New > Chọn “Block Diagram/Schematic File”

Chọn FPGA là Cyclone II EP2C35F672C6.

Project sau khi tạo xong có giao diện như hình vẽ.

Page 32: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 25

2.2.2 Bước 2: Tạo hệ thống SoPC

Trong công cụ Quartus II chọn Tools SoPC Builder hoặc nhấn vào biểu

tượng

Trong công cụ Altera SoPC Builder Đặt System Name là nios_system, Targer

HDL là Verilog. Altera SoPC Builder gồm 2 tabs System Contents và System

Generation. Tab System Contents có giao diện như hình vẽ.

(1) Component Library: chứa các IP Cores đã được thiết kế sẵn của Altera

(2) chứa các IP Cores dùng được tích hợp vào hệ thống

(3) Target/Clock Settings: chứa các thông số hệ thống

Page 33: THỰC HÀNH HỆ THỐNG NHÚNG

26 THỰC HÀNH HỆ THỐNG NHÚNG

Thêm CPU NIOS II vào hệ thống bằng cách gõ “nios” vào khung tìm kiếm, chọn

Nios II.

Processor Add chọn NIOS II/s Finish. Thông số cấu hình được minh

họa như hình vẽ.

Thêm bộ nhớ On-chip Memory vào hệ thống bằng cách gõ “On-chip Memory” vào

khung tìm kiếm, chọn On-chip Memory Add chọn Total Memory size là 32

KB Finish. Thông số cấu hình được minh họa như hình vẽ.

Page 34: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 27 Thêm giao tiếp JTAG UART vào hệ thống bằng cách gõ “JTAG UART” vào khung tìm

kiếm, chọn JTAG_UART Add Finish.

Cài đặt lại thông số cho Nios II Processor bằng cách double-click vào cpu_0

chọn Reset Vector và Exception Vector trỏ vào on-chip_memory2_0 Finish.

Thông số cấu hình được minh họa như hình vẽ.

Thêm vào hệ thống giao tiếp IO đơn giản PIO bằng cách vào tab System Content

Peripherals Microcontroller Peripherals PIO (Parallel I/O) hoặc gõ chữ

“PIO” vào khung tìm kiếm trong tab Basic Settings chọn độ dài thanh ghi là 8

bits Direction là Finish.

Tương tự cho 8-bit PIO output và 16 - bit PIO output.

Page 35: THỰC HÀNH HỆ THỐNG NHÚNG

28 THỰC HÀNH HỆ THỐNG NHÚNG

Sau khi add khối PIO, tại cột Module Name, nhấn R để đổi tên pio_0, pio_1 và

pio_2 lần lượt thành new_number, green_LEDs và red_LEDs như hình vẽ.

2.2.3 Bước 3: gán địa chỉ tự động và gán IRQs

Chọn System Auto - Assign Base Addresses và Auto - Assign IRQs.

Hệ thống SoPC sau khi thiết lập xong được minh họa như hình dưới.

Cột Use báo hiệu thành phần nào được kết nối vào hệ thống SoPC.

Cột Connection mô tả kết nối master/slave giữa các thành phần trong hệ thống.

Cột Description mô tả tên gọi và kết nối của các thành phần trong hệ thống.

Cột Clock báo hiệu xung clock cấp cho từng thành phần trong hệ thống.

Cột Base, End báo hiệu địa chỉ bắt đầu và kết thúc của các thành phần trong hệ

thống.

Cột IRQ mô tả ngắt (interrupt) được sử dụng trong hệ thống. Các ngắt được

đánh số từ 0 trở đi. Ngắt 0 có mức ưu tiên cao nhất, rồi đến ngắt 1, 2, …

Page 36: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 29 Kiểm tra hệ thống SoPC còn lỗi hay không thông qua cửa sổ

Information.

2.2.4 Bước 3a: Tổng hợp hệ thống SoPC

Chọn Tab System Generation nhấn vào nút Generate Save. Nếu Generate

hoàn tất sẽ hiện ra thông báo

Sau khi thành công kiểm tra thư mục sẽ sinh ra file nios_system_inst.v hoặc

xxx_yyy_inst.v. Đây là mẫu sử dụng file top module chính của cả hệ thống.

Trong bước tạo SoPC cũng sinh ra file .sopcinfo đây là khai báo cấu hình phần

cứng dùng để tạo driver phần mềm trong NIOS II IDE.

2.2.5 Bước 4: Tích hợp hệ thống SoPC vào Project quartus

Trong Quartus chọn File> New…> Verilog HDL File. Mở xxx_yyy_inst.v và copy

toàn bộ nội dung vào trong file mới tạo trong quartus:

Page 37: THỰC HÀNH HỆ THỐNG NHÚNG

30 THỰC HÀNH HỆ THỐNG NHÚNG

Set file này thành top module.

2.2.6 Bước 5: Gán chân

Gán chân (pin) cho FPGA bằng cách vào Assignments Import Assignements

… Add file DE2_pin_assignments.csv vào.

2.2.7 Bước 6: Tổng hợp và biên dịch hệ thống SoPC để nạp xuống FPGA

Tiến hành biên dịch và tổng hợp bằng cách vào Processing Start Compilation

hoặc nhấn Ctrl+L.

2.2.8 Bước 7: Nạp xuống FPGA

Khi compile xong sẽ sinh ra file .sof, nạp file này xuống board.

Chúng ta đã có một con vi điều khiển hoàn chỉnh, giờ chỉ cần viết phần mềm nữa

để chạy hệ thống.

2.3 PHẦN II: XÂY DỰNG PHẦN MỀM NHÚNG CHO HỆ THỐNG SOPC

2.3.1 Thiết bị sử dụng:

Thực hiện các tác vụ mong muốn bằng cách sử dụng ngôn ngữ lập trình Nios II,

như sau:

Page 38: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 31 (1) Viết chương trình đọc nội dung của thiết bị chuyển mạch, hiển thị giá trị

tương ứng trên các LED màu xanh, thêm con số này vào tổng tích lũy, và hiển thị số

tổng trên các đèn LED màu đỏ.

(2) Sử dụng phần mềm Altera Debug Client để cài đặt và tải về chương trình.

(3) Bước đơn thông qua các chương trình và xác minh tính chính xác của nó

bằng cách nhập vào một vài số. Lưu ý rằng bước đơn thông qua chương trình sẽ cho

phép chúng ta thay đổi các con số đầu vào mà không đọc cùng một số nhiều lần.

Sử dụng phần mềm của Altera có tên Nios II Software Build Tools for Eclipse (gọi

tắt Nios II).

a. Mở Nios II

b. Chọn: File…. > New > Nios II App and BSP from template

c. Hiện hộp thoại

Page 39: THỰC HÀNH HỆ THỐNG NHÚNG

32 THỰC HÀNH HỆ THỐNG NHÚNG

Như nói ở trên trong mục

Trỏ đến file .sopcinfo được tạo trong PART 1, trong thư mục project.

d. Chọn Next

Page 40: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 33

BSP (Board Support Package!) đây là project chứa một số driver cho một số IP

core có sẵn trên hệ thống, cũng chứa thông tin cấu hình hệ thống ở dạng code C,

project này được tạo tự động.

Chọn Finish.

Thấy rõ điều này trong Project Explorer

Page 41: THỰC HÀNH HỆ THỐNG NHÚNG

34 THỰC HÀNH HỆ THỐNG NHÚNG

- Hello_world.c trong project helloworld là file sẽ code.

- system.h trong project helloworld_bsp là file sẽ tham chiếu các biến.

Nếu kiểm tra ta sẽ thấy rằng trường:

#define PIO_0_BASE 0x11000

có địa chỉ giống như khi xây dựng trong SoPC builder. Đây chính là địa chỉ cơ sở

của PIO_0.

Tương tự có thể kiểm tra PIO_1, PIO_2…

e. Đây là đoạn code giải quyết phần đầu của part 2 là xuất nội dung của SW ra

LED GREEN

Hello_world.c

//hello_world.c//

#include<stdio.h>

#include"system.h"

Page 42: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 35

intmain()

{

volatileunsignedchar* inputSW;

volatileunsignedchar* outputGREEN;

inputSW = (unsignedchar*)PIO_0_BASE;

outputGREEN = (unsignedchar*) PIO_1_BASE;

while (1){

*outputGREEN = *inputSW;

}

}

f. Biên dịch code C

g. Chạy hệ thống trên board DE2

Cần làm 2 điều:

1. Nạp phần cứng, dùng Quartus II Programmer nạp file .sof xuống.

2. Nạp phần mềm.

Bước 1: nạp trong Quartus cũng được hoặc từ NIOS II chọn đúng file .sof sinh ra

từ part 1.

Page 43: THỰC HÀNH HỆ THỐNG NHÚNG

36 THỰC HÀNH HỆ THỐNG NHÚNG

Bước 2: Cấu hình nạp:

Chọn Run> Run Configurations…

Double-click vào Nios II Hardware. Nếu trước đó đã cắm board và nạp file .sof

thành công thì sẽ không còn dấu X đỏ nữa. Chỉ cần nhấn Run là được.

Page 44: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 37

2.4 PHẦN III: Trong phần này, chúng ta muốn thêm khả năng chạy các chương trình ứng dụng

liên tục và kiểm soát việc đọc số mới bằng cách kèm một chuyển đổi nút bấm được

kích hoạt bởi người sử dụng khi một số mới sẵn sàng đọc. Các hoạt động muốn là

người sử dụng cung cấp các số tiếp theo bằng cách thiết lập các công tắc chuyển đổi

cho phù hợp và sau đó nhấn một nút bấm chuyển đổi để cho biết con số này sẵn sàng

để đọc.

Để thực hiện tác vụ này là cần thiết để thực hiện cơ chế giám sát trạng thái của

mạch được sử dụng để đầu vào những con số. Đề án I/O thông dụng là sử dụng trạng

thái ban đầu được xóa về 0. Flag này sau đó được thiết lập về 1 ngay sau khi giao

diện thiết bị I/O đã sẵn sàng chuyển giao dữ liệu tiếp theo. Khi chuyển dữ liệu, flag

một lần nữa xóa về 0. Như vậy, bộ vi xử lý có thể thăm dò tình trạng flag để xác định

khi một truyền dữ liệu I/O có thể được thực hiện. Trong trường hợp của chúng tôi, các

thiết bị I/O là người dùng tay đặt công tắc bật tắt. Giao diện I/O là một mạch PIO

được tạo ra bởi SoPC Builder. Để cung cấp một trạng thái flag, chúng ta sẽ tạo ra một

PIO một - bit đặc biệt và sử dụng khả năng cạnh chụp của nó. PIO này là rất giống

với PIO thường xuyên, và nó phù hợp với bản đồ đăng ký trong hình 1. Nó được định

nghĩa trong thư mục Altera lên Avalon DE2 Pio, mà đã được bao gồm trong dự án.

Bước 1. Tạo một project Quartus II mới thực hiện các thông số tương tự phần 1.

Bước 2. Copy thư mục Avalon Pio Altera DE2 lên vào thư mục project.

Page 45: THỰC HÀNH HỆ THỐNG NHÚNG

38 THỰC HÀNH HỆ THỐNG NHÚNG

Mở SoPC Builder, trong đó cho thấy các hệ thống phụ Nios II tồn tại. Để thực hiện

các thư mục Pio Altera lên Avalon DE2 thể nhìn thấy bằng Builder SoPC, nhấn vào

menu File của Builder SoPC vào mục Refresh Component List. DE2 - PIO sẽ được

liệt kê theo chương trình Avalon Components > University Program DE2 Board.

Bước 3. Tạo ra một tình trạng flag PIO sử dụng các thành phần DE2 - PIO. Cấu

hình là một cổng đầu vào với độ rộng một bit. Ngoài ra, tại Input Options tab chọn

tính năng Synchronously capture đồng bộ được kích hoạt bởi Falling edge.

Bước 4. Tạo ra các hệ thống phụ Nios II mới.

Page 46: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN XUẤT/NHẬP 39

Bước 5. Sửa Verilog/VHDL file mà xác định hệ thống hoàn chỉnh. Sử dụng các

nút bấm chuyển đổi Key 1 là đầu vào cho các tình trạng flag PIO (Nút công tắc đang

hoạt động thấp).

Bước 6. Nhập pin và lập dự án.

2.5 PHẦN IV: Trong các phần trước tổng số tích lũy được hiển thị trên đèn LED màu đỏ. Bây giờ,

làm tăng thêm thiết kế của bạn để hiển thị tổng số này như là một số HEX trên màn

hình 7-segment hex3-HEX0, ngoài các đèn LED màu đỏ.

2.6 PHẦN V: Tăng cường thiết kế của bạn và các chương trình ứng dụng để hiển thị tổng tích

lũy trên LED 7 đoạn như một số thập phân (chứ không phải là hệ thập lục phân) số.

Các chương trình ứng dụng nên làm việc chuyển đổi số lượng cần thiết. Lưu ý: Bạn có

thể sử dụng các hướng dẫn div chỉ khi bạn chỉ định các tùy chọn phần cứng chia trong

Phần I.

Page 47: THỰC HÀNH HỆ THỐNG NHÚNG

40 THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN

XẾP

3.1 MỤC ĐÍCH YÊU CẦU: Mục đích của bài này là để tìm hiểu về chương trình con và liên kết chương trình

con trong môi trường Nios II. Bài này bao gồm các khái niệm về chuyển đổi tham số

và ngăn xếp.

3.2 PHẦN I: Ta sử dụng một hệ thống Nios II bao gồm một khối trên bộ nhớ chip và một

module JTAG UART để giao tiếp với máy chủ. Thực hiện hệ thống như sau:

(1) Tạo một Project Quartus II mới. Chọn Cyclone II EP2C35F672C6 (target

chip), đó là con chip FPGA trên board Altera DE2.

(2) Sử dụng Builder SoPC để tạo ra một hệ thống có tên là nios_system, trong

đó bao gồm các thành phần sau:

Bộ xử lý Nios II/s với JTAG Debug Module Level 1

Bộ nhớ On - chip - chế độ bộ nhớ RAM và kích thước 32 Kbytes

(3) Từ menu System, chọn Auto - Assign Base Addresses. Ta sẽ có 1 hệ

thống như trong hình vẽ.

Page 48: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 41

Hệ thống Nios II thực hiện bởi SoPC Builder

(4) Tạo ra hệ thống, thoát khỏi Builder SoPC và trở về phần mềm Quartus II.

(5) Khởi tạo hệ thống Nios II được tạo ra trong module Verilog/VHDL.

(6) Chỉ định các kết nối chân:

Clk - PINN2 (50MHz clock)

reset_n - PING26 (nhấn switch KEY0)

(7) Biên dịch và chạy chương trình Quatus II.

(8) Khởi động chương trình và cấu hình Cyclone II FPGA trên board DE2 để thực

hiện hệ thống.

Các bước thực hiện:

Bước 1: Tạo một dự án Quartus II mới. Chọn Cyclone II EP2C35F672C6 như

chip mục tiêu, đó là con chip FPGA trên board Altera DE2.

Tạo một project có tên là doan

Page 49: THỰC HÀNH HỆ THỐNG NHÚNG

42 THỰC HÀNH HỆ THỐNG NHÚNG

Đặt tên cho project vừa tạo

Chọn chip xử lý Cyclone II EP2C35F672C6

Chọn chip Cyclone II EP2C35F672C6

Bước 2: Sử dụng Builder SoPC (System on Programable Chip) để tạo ra một hệ

thống có tên là hệ thống Nios, trong đó bao gồm các thành phần sau:

Tạo hệ thống với tên Nios_system

Page 50: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 43

Đặt tên cho hệ thống Nios

Bộ xử lý Nios II/s với JTAG Debug Module Level 1

Tạo CPU sử dụng Nios II/s

Page 51: THỰC HÀNH HỆ THỐNG NHÚNG

44 THỰC HÀNH HỆ THỐNG NHÚNG

Bộ nhớ On – chip - chế độ bộ nhớ RAM và kích thước 32 Kbytes

Bộ nhớ Onchip với 32760 bytes

Bước 3: Từ menu System, chọn Auto – Assign Base Addresses

Ta được hệ thống có cấu hình như sau:

Page 52: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 45

Hệ thống Nios II được thực hiện bởi SoPC Builder

Bước 4: Tạo ra hệ thống, thoát khỏi Builder SoPC và trở về phần mềm Quartus

II

Bước 5: Khởi tạo hệ thống Nios II trong module viết bằng ngôn ngữ Verilog

Code Chương trình:

module part1 (CLOCK_50,KEY);

input CLOCK_50;

input KEY;

system IC1(

.clk_0(CLOCK_50),

.reset_n(KEY), );

End module

Page 53: THỰC HÀNH HỆ THỐNG NHÚNG

46 THỰC HÀNH HỆ THỐNG NHÚNG

3.3 PHẦN II: Ta muốn sắp xếp một danh sách của 32 - bit số tích cực theo thứ tự giảm dần.

Danh sách này được biểu diễn dưới dạng một tập tin trong đó mục 32 - bit đầu tiên

cung cấp các kích thước (phần tử số) của danh sách và phần còn lại của các mục là

những con số được sắp xếp. Thực hiện các nhiệm vụ mong muốn, bằng cách sử dụng

ngôn ngữ assembly Nios II, như sau:

(1) Viết một chương trình mà có thể sắp xếp một danh sách bao gồm một file

được tải trong bộ nhớ bắt đầu từ vị trí LIST_FILE. Giả sử rằng trong danh sách là đủ

lớn để nó không có thể được tái tạo trong bộ nhớ có sẵn. Do đó, quá trình sắp xếp

phải được thực hiện "tại chỗ", để cả hai danh sách được sắp xếp và danh sách ban

đầu chiếm vị trí bộ nhớ giống nhau.

(2) Biên dịch và tải về chương trình bằng cách sử dụng Altera Debug Client.

(3) Tạo ra một danh sách mẫu, tải nó vào bộ nhớ, và chạy chương trình của

bạn.

Lưu ý: Các tập tin có chứa danh sách có thể được nạp vào bộ nhớ bằng cách sử

dụng Debug Client.

Thực hiện:

Viết chương trình sắp xếp 32 - bit số tích cực theo thứ tự giảm dần bằng ngôn ngữ

Assembly.

Code chương trình:

include “ nios_macros.s”

text

global_start

_start:

movia r8, SIZE

movia r9, LIST

BEGIN_SORT:

Page 54: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 47

ldwio r20 , 0(r8)

RESTART_SOFT:

mov r18, r0

movi r19 , 1

mov r10, r9

SORT_LOOP:

ldwio r16 , 0(r10)

ldwio r17 , 4(r8)

blt r16, r17 , SKIP_SWAP

SWAP:

swio r17, o(r10)

stwio r16, 4(r10)

movi r18,1

SKIP_SWAP:

addi r19, r19, 1

addi r10, r10, 4

bne r19, r20, SORT_LOOP

bne r18, r0, RESTART_SORT

END:

br END

org 0x01000

LIST_FILE:

SIZE:

word 0

LIST:

Page 55: THỰC HÀNH HỆ THỐNG NHÚNG

48 THỰC HÀNH HỆ THỐNG NHÚNG

end

Sử dụng trình biên dịch Nios II

3.4 PHẦN III: Trong phần này, chúng ta sẽ sử dụng một chương trình con để thực hiện nhiệm vụ

sắp xếp. Để thực hiện các chương trình con chung, các nội dung của thanh ghi được

sử dụng bởi các chương trình con phải được lưu trên ngăn xếp khi vào và khôi phục

trước khi rời khỏi chương trình con. Lưu ý rằng ngăn xếp phải được tạo ra bằng cách

khởi tạo các con trỏ ngăn xếp sp, thanh ghi r27. Đó là một cách thực hiện phổ biến

để bắt đầu ngăn xếp ở một vị trí bộ nhớ địa chỉ cao và làm cho nó phát triển theo

hướng địa chỉ thấp hơn. Con trỏ ngăn xếp đã được điều chỉnh một cách rõ ràng khi

một mục được đặt trên hoặc gỡ bỏ khỏi ngăn xếp. Để làm cho ngăn xếp tăng từ cao

đến các địa chỉ thấp, con trỏ ngăn xếp phải đượcgiảm đi 4 trước khi một mục mới

Page 56: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 49

được đặt trên ngăn xếp và nó phải được tăng thêm 4 sau khi một mục được lấy ra

khỏi ngăn xếp.

Thực hiện các công việc trước đây bằng cách thay đổi chương trình của bạn từ

phần II như sau:

(1) Viết một chương trình con, được gọi là SORT, có thể sắp xếp một danh sách

các kích thước bất kỳ được đặt ở một vị trí tùy ý trong bộ nhớ. Giả sử rằng kích thước

và vị trí của danh sách là thông số được truyền cho chương trình con thông qua thanh

ghi, như là:

Kích thước tham số được đưa ra bởi các nội dung thanh ghi Nios II r2.

Địa chỉ của mục đầu tiên trong danh sách được đưa ra bởi các nội dung

thanh ghi r3

(2) Viết chương trình chính khởi tạo con trỏ ngăn xếp, đặt các thông số cần thiết

vào sổ thanh ghi r2 và r3, và sau đó gọi chương trình con SORT. Danh sách này được

nạp vào bộ nhớ tại vị trí LIST_FILE.

(3) Biên dịch và tải về chương trình.

(4) Tạo ra một danh sách mẫu, tải nó vào bộ nhớ, và chạy chương trình.

Code chương trình:

include “ nios_macros.s”

text

equ STACK, 0xB000

global_start

_start:

movie sp, STACk

mov fp, sp

movia r8, SIZE

movia t9, LIST

ldwio r2, 0(r8)

Page 57: THỰC HÀNH HỆ THỐNG NHÚNG

50 THỰC HÀNH HỆ THỐNG NHÚNG

mov r3, r9

call SORT

END:

br END

SORT:

subi sp, sp, 28

stw ra, 0(sp)

stw fp, 4(sp)

stw r8, 8(sp)

stw r16, 12(sp)

stw r17, 16(sp)

stw r18, 20(sp)

stw r19, 24(sp)

addi fp, sp, 28

BEGIN_SORT:

RESTART_SORT:

mov r18, r0

movi r19, 1

mov r8, r3

SORT_LOOP:

END_SORT:

ldw ra, 0(sp)

ldw fp, 4(sp)

Page 58: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 3: CHƯƠNG TRÌNH CON VÀ NGĂN XẾP 51 ldw r8, 8(sp)

ldw r16, 12(sp)

ldw r17, 16(sp)

ldw r18, 20(sp)

ldw r19, 24(sp)

addi sp, sp, 28

ret

org 0x01000

LIST_FILE:

SIZE:

word 0

LIST:

end

3.5 PHẦN IV: Sửa đổi chương trình của bạn từ Phần III để các tham số được truyền từ chương

trình chính cho chương trình con qua ngăn xếp, thay vì thông qua thanh ghi.

Biên dịch, tải về và chạy chương trình của bạn.

3.6 PHẦN V: Một bộ xử lý Nios II sử dụng thanh ghi ra (r31) để giữ địa chỉ trở lại khi một

chương trình con được gọi. Trong trường hợp chương trình con lồng nhau, nơi một

chương trình con gọi chương trình con khác, điều cần thiết phải đảm bảo rằng địa chỉ

ban đầu không bị mất khi một địa chỉ mới được đặt vào thanh ghi ra. Điều này có thể

được thực hiệnbằng cách lưu trữ các địa chỉ ban đầu trên ngăn xếp và sau đó tải lại

vào thanh ghi ra sau khi trở về từ chương trình con thứ hai.

Để chứng minh các khái niệm về chương trình con lồng nhau, chúng ta sẽ sử dụng

các thuật toán của giai thừa của một số nguyên n cho trước. Giai thừa của n được xác

định như sau:

Page 59: THỰC HÀNH HỆ THỐNG NHÚNG

52 THỰC HÀNH HỆ THỐNG NHÚNG

n!=n(n−1)(n−2)···×2×1

Nó cũng có thể được tính toán đệ quy như: n!=n(n−1)!

Chú ý là: 0!=1

Viết một chương trình có sử dụng đệ quy để tính giai thừa của n. Chương trình có

bao gồm một chương trình con, được gọi là FACTOR, mà tự gọi cho chính nó nhiều lần

cho đến khi giai thừa mong muốn đã được xác định. Chương trình chính phải thông

qua n như một tham số cho chương trình con bằng cách đặt nó vào ngăn xếp.

Lưu ý: Kể từ khi chương trình con của bạn sẽ sử dụng các lệnh hỗn hợp, mul, điều

quan trọng là trong phần I bạn tạo ra phiên bản Nios II/s của bộ xử lý. Phiên bản tiết

kiệm, Nios II/e, không thực hiện các lệnh mul.

Biên dịch, tải về và chạy chương trình của bạn. Xác minh tính đúng đắn của nó

bằng cách thử nghiệm giá trị khác nhau của n.

Page 60: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 53

BÀI 4: HỎI VÒNG VÀ NGẮT

4.1 MỤC ĐÍCH YÊU CẦU: Mục đích của bài tập này là để tìm hiểu làm thế nào để gửi và nhận dữ liệu từ thiết

bị I/O. Có hai phương pháp được sử dụng để nhận biết có hay không có dữ liệu gửi

hoặc thiết bị I/O. phương pháp đầu tiên, hỏi vòng, là nơi mà các bộ xử lý truy vấn các

thiết bị để xem họ có thể nhận được dữ liệu hoặc dữ liệu có sẵn. Phương pháp thứ

hai, ngắt, là khi các thiết bị báo cho bộ vi xử lý chúng có thể nhận được dữ liệu hoặc

là chúng có dữ liệu sẵn, mà không cần một yêu cầu rõ ràng nào từ bộ xử lý.

Một hệ thống đơn giản và thường được sử dụng để truyền dữ liệu giữa bộ xử lý và

thiết bị I/O được biết đến dưới tên là Universal Asynchronous Receiver Transmitter

(UART). Một giao diện UART (mạch) được đặt giữa bộ xử lý và thiết bị I/O. Nó xử lý

dữ liệu một ký tự 8-bit tại một thời điểm. Việc truyền dữ liệu giữa UART và bộ vi xử lý

được thực hiện theo kiểu dữ liệu song song, nơi mà tất cả các bit ký tự được truyền

cùng lúc sử dụng dây riêng biệt. Tuy nhiên, việc truyền dữ liệu giữa UART và thiết bị

I/O cũng có thể được thực hiện theo kiểu dữ liệu nối tiếp, tức là mỗi bit dữ liệu được

truyền trong một thời điểm khác nhau.

SoPC Builder Altera có thể thực hiện một giao diện của các loại UART để sử dụng

trong các hệ thống Nios II, được gọi là JTAG UART. Mạch này có thể được sử dụng để

cung cấp một giao tiếp giữa bộ xử lý Nios II và máy chủ thông qua việc kết nối với

board DE2 Altera. Hình vẽ cho thấy một sơ đồ khối của mạch JTAG UART.

Sơ đồ khối của mạch JTAG UART

Page 61: THỰC HÀNH HỆ THỐNG NHÚNG

54 THỰC HÀNH HỆ THỐNG NHÚNG

Một bên JTAG UART kết nối với công tắc cấu trúc Avalon, trong khi ở phía bên kia

nó kết nối các máy chủ thông qua giao diện USB-Blaster. Phần lõi của JTAG UART

chứa hai thanh ghi: Data register và Control register, được truy cập bởi bộ xử lý

như là một vị trí nhớ. Địa chỉ của Control register cao hơn so với các địa chỉ cấp cho

Data register là 4 byte. Phần lõi của JTAG UART cũng chứa hai FIFOs có chức năng

như là bộ đệm lưu trữ, một FIFO cho dữ liệu nối tiếp được truyền đến các máy chủ và

một cho dữ liệu nối tiếp nhận được từ máy chủ. Hình 2 cho thấy định dạng của các

thanh ghi.

Thanh ghi trong JTAG UART

Các trường trong Data register được sử dụng như sau:

b7-0 (DATA) là một ký tự 8-bit được ghi vào Write FIFO khi một thao tác Store

được thực hiện bởi bộ vi xử lý, hoặc nó là một ký tự đọc từ Read FIFO khi một thao

tác Load được thực hiện.

b15 (RVALID) cho biết có các trường dữ liệu chứa một ký tự hợp lệ có thể được

đọc bởi bộ xử lý. Bit này được thiết lập lên 1 nếu trường dữ liệu là hợp lệ, nếu không

nó sẽ bị xóa về 0.

b31-16 (RAVAIL) cho biết số lượng các ký tự còn lại trong Read FIFO (sau khi

thực tác vụ read này).

Các trường trong các Control register được sử dụng như sau:

b0 (RE) cho phép ngắt đọc khi được set lên 1.

b1 (WE) cho phép ngắt ghi khi được set lên 1.

Page 62: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 55 b8 (RI) chỉ ra rằng một ngắt Đọc đang chờ nếu giá trị của nó là 1 và việc Đọc dữ

liệu trong thanh ghi Data register sẽ tự động xóa các bit 0.

b9 (WI) chỉ ra rằng một ghi ngắt đang chờ nếu giá trị là 1.

b10 (AC) cho thấy rằng đã có sự hoạt động của JTAG (chẳng hạn như hỏi dò

máy chủ JTAG UART để xác minh rằng có một kết nối tồn tại) kể từ khi bit được xóa.

Ghi vào AC là 1 và xóa nó là 0.

b31-16 (WSPACE) cho biết số lượng khoảng trống có sẵn trong Write FIFO.

Thông tin thêm về JTAG UART có thể được tìm thấy trong Chương 5 của cẩm nang

thiết bị ngoại vi nhúng Altera.

Trong bài tập này, chúng ta sẽ sử dụng JTAG UART để truyền các ký tự ASCII được

mã hóa giữa một bộ xử lý Nios II thực hiện trên kit DE2 và máy chủ. Chúng ta cũng

sẽ sử dụng một "mạch định thời" để tạo trễ cố định.

4.2 PHẦN I: Sử dụng Builder SoPC để tạo ra các hệ thống trong hình vẽ, trong đó bao gồm một

bộ xử lý Nios II/e, một JTAG UART, một memory block và một Interval Timer.

Hệ thống Nios II mong muốn

Page 63: THỰC HÀNH HỆ THỐNG NHÚNG

56 THỰC HÀNH HỆ THỐNG NHÚNG

(1) Tạo một project Quartus II mới. Chọn Cyclone II EP2C35F672C6 như chip

mục tiêu, đó là con chip FPGA trên board Altera DE2.

(2) Sử dụng Builder SoPC để tạo ra một hệ thống có tên là hệ thống Nios, trong

đó bao gồm các thành phần sau:

Bộ xử lý Nios II/s với JTAG debug Module Level 1

Bộ nhớ On - chip - chế độ bộ nhớ RAM kích thước 32 Kbytes

Page 64: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 57

JTAG UART - sử dụng các thiết lập mặc định

Page 65: THỰC HÀNH HỆ THỐNG NHÚNG

58 THỰC HÀNH HỆ THỐNG NHÚNG

Interval Timer - nằm trong phần thành phần có tên khác

- Đối với các tùy chọn phần cứng - cài sẵn cấu hình lựa chọn đơn giản ngắt

định kỳ

- Đối với chu kỳ Time out chọn một chu kỳ cố định là 500 mS như thể hiện

trong hình vẽ.

Đặc tả cho Interval Timer

Page 66: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 59 (3) Từ menu System, chọn địa chỉ Auto-Assign. Bây giờ bạn cần phải có hệ

thống thể hiện trong hình vẽ.

Hệ thống Nios II thực hiện bởi SOPC Builder

(4) Tạo ra hệ thống, thoát khỏi trình Builder SoPC và trở về phần mềm Quartus

II.

Page 67: THỰC HÀNH HỆ THỐNG NHÚNG

60 THỰC HÀNH HỆ THỐNG NHÚNG

(5) Khởi tạo hệ thống Nios II được tạo ra trong một mô-đun Verilog/VHDL.

(6) Gán chân:

- CLK - PIN N2 (Đây là xung clock 50 MHz)

- thiết lập lại n - PIN G26 (Đây là nút nhấn công tắc KEY0)

(7) Biên dịch các project Quartus II.

Page 68: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 61

(8) Chương trình và cấu hình FPGA Cyclone II trong board DE2 để thực hiện các

hệ thống vừa được tạo ra.

4.3 PHẦN II: JTAG UART có thể gửi các ký tự ASCII với Altera Debug Client, nơi mà sẽ hiển thị

những ký tự ở cửa sổ thiết bị đầu cuối của nó. Khi các trường WSPACE trong Control

register của JTAG UART có một giá trị khác zero JTAG UART có thể chấp nhận ký tự

mới được ghi vào Altera Debug Client. Viết một ký tự để Debug Client thăm dò, hỏi

Page 69: THỰC HÀNH HỆ THỐNG NHÚNG

62 THỰC HÀNH HỆ THỐNG NHÚNG

vòng (tiếp tục đọc) thanh ghi này cho đến khi có khoảng trống. Một khi khoảng trống

có sẵn thì các ký tự ASCII có thể được ghi vào Data register của JTAG UART.

Viết một chương trình ngôn ngữ assembly Nios II để hiển thị chữ Z xấp xỉ mỗi 500

ms trong cửa sổ thiết bị đầu cuối của Altera Debug Client. Tạo ra và thực hiện các

chương trình như sau:

(1) Bằng cách sử dụng ngôn ngữ assembly Nios II, viết một vòng lặp để đọc

Control register trong JTAG UART và lặp đi lặp lại như thế cho đến khi có một vài

khoảng trống sẵn sàng để ghi.

(2) Ghi chữ Z vào Data register.

(3) Bằng cách sử dụng Altera Debug Client, biên dịch và nạp chương trình ngôn

ngữ assembly.

(4) Chạy chương trình này bằng cách sử dụng tính năng single step. Nếu bạn

chạy chương trình này bằng cách sử dụng chế độ Continue mode, ký tự sẽ được gửi

đến cửa sổ thiết bị đầu cuối nhanh hơn xử lý của Debug Client có thể.

(5) Trong mã ngôn ngữ assembly, tạo ra một vòng lặp trễ để ký tự chỉ được in

vào khoảng mỗi nữa sau của chu kỳ.

(6) Biên dịch lại, tải và chạy chương trình.

4.4 PHẦN III: JTAG UART có thể nhận được các ký tự ASCII từ cửa sổ thiết bị đầu cuối, cũng tốt

như được viết ra. Bit RVALID, b15, trong Data register cho thấy có hay không một

giá trị trong DATA field tức là một ký tự ASCII hợp lệ đã được nhận.

Nếu nhiều ký tự vẫn đang chờ đợi để đọc, RAVAIL field sẽ có một giá trị khác

zero.

Viết một chương trình để thực hiện một nhiệm vụ "như một máy đánh chữ"; có

nghĩa là, đọc từng ký tự được nhận bởi JTAG UART từ máy chủ và sau đó hiển thị ký

tự này trong cửa sổ thiết bị đầu cuối của Debug Client.

Sử dụng tính năng hỏi dò để xác định xem một ký tự mới có sẵn trong JTAG UART

hay không.

Page 70: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 63 Lưu ý: con trỏ phải được ở trong cửa sổ thiết bị đầu cuối của Debug Client để ghi

các ký tự đến cổng nhận của JTAG UART.

4.5 PHẦN IV: Cơ chế hỏi dò (Polling) trong JTAG UART là kém hiệu quả do việc đọc đi đọc lại

các thanh ghi của nó để xác định trạng thái UART. Các overhead xác định nếu có một

ký tự mới hiện diện có ý nghĩa tác động đến việc thực thi của chương trình.

Vì vậy, thay vì hỏi dò ta có thể sử dụng cơ chế ngắt, cho phép bộ vi xử lý có thể

làm những công việc hữu ích khác thay vì chờ đợi một dấu hiệu truyền nhận I/O để

thực thi.

Tạo ra một trình phục vụ ngắt để đọc các ký tự nhận được từ máy chủ bởi JTAG

UART. Đặt trình phục vụ ngắt thường lệ tại địa chỉ hex 0x20, bởi vì đây là vị trí mặc

định cho các xử lý ngoại lệ được lựa chọn bởi SoPC Builder. Địa chỉ trở lại ngoại lệ

trong thanh ghi ea phải được giảm đi 4 cho ngắt ngoài. Đoạn code mẫu dưới đây cho

thấy một cấu trúc khung của của một đoạn chương trình phục vụ ngắt được viết bằng

ngôn ngữ assembly Nios II.

.include “nios_macros.s”

.text

.org 0x20 /* Place the interrupt service routine */

/* at the appropriate address */

ISR:

rdctl et, ctl4 /* Check if an external */

beq et, r0, SKIP EA DEC /* interrupt has occurred */

subi ea, ea, 4 /* If yes, decrement ea to execute */

/* interrupted instruction */

SKIP_EA_DEC:

... the interrupt-service routine

END ISR:

Page 71: THỰC HÀNH HỆ THỐNG NHÚNG

64 THỰC HÀNH HỆ THỐNG NHÚNG

Eret /* Return from exception */

.global_start

_start: /* Program start location */

... enable interrupts code

... the main program code

LOOP:

br LOOP /* Endless loop */

.end

Thanh ghi điều khiển ctl3 của Nios II còn được gọi là kích hoạt, cho phép ngắt

trên từng cơ sở. Lưu ý rằng khi hệ thống được tạo ra trong Phần I, JTAG UART được

thiết lập ngắt mức 0. Điều này có nghĩa là bit 0 của thanh ghi điều khiển ctl3 phải

được đặt lên 1 để cho phép ngắt của JTAG UART hoạt động.

Thực hiện như sau:

(1) Tạo ra một thủ tục ngắt để đọc một ký tự từ JTAG UART.

lưu ý:

• Các dịch vụ ngắt thường xuyên phải được đặt ở 0x20 địa chỉ bộ nhớ.

• Để cho phép ngắt, giá trị thích hợp phải được ghi vào Control register của JTAG

UART, và các thanh ghi điều khiển của Nios II là ctl0 và ctl3.

(2) Trong đoạn chương trình phục vụ ngắt của bạn, sử dụng phương pháp hỏi dò

để hiển thị các ký tự nhận được từ máy chủ trong cửa sổ thiết bị đầu cuối của Altera

Debug Client.

(3) Biên dịch, tải và chạy chương trình.

Nếu chương trình không hoạt động trong thử nghiệm đầu tiên, bạn phải debug nó

và sửa chữa các sai sót. Một hỗ trợ trong việc sửa lỗi là tính năng đơn - bước của

Altera Debug Client, cho phép người dùng quan sát dòng chảy chấp hành và nội dung

của các thanh ghi của Nios II như là mỗi lệnh đang được thực thi. Tuy nhiên, phương

pháp này không thể được sử dụng khi ngắt được tham gia, vì ngắt sẽ tự động bị vô

Page 72: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 65

hiệu hóa khi đơn bước qua một chương trình. Vì vậy, sử dụng các điểm ngắt như một

trợ giúp trong việc gỡ lỗi.

Cũng lưu ý rằng ngắt có thể tự động bị vô hiệu hóa khi một trình phục vụ ngắt

được bắt đầu và tái kích hoạt khi thoát khỏi trình phục vụ ngắt này. Điều này có nghĩa

rằng nếu một số ứng dụng yêu cầu ngắt lồng nhau, các ngắt sẽ phải được kích hoạt

lại trong đoạn chương trình phục vụ ngắt.

4.6 PHẦN V: Trong phần này, chúng tôi muốn viết một chương trình sử dụng ngắt để đọc các ký

tự nhận được JTAG UART từ máy chủ và hiển thị các ký tự cuối cùng nhận được lặp đi

lặp lại mỗi 500 mili giây. Trong phần II, chúng tôi sử dụng một vòng lặp trễ để tạo ra

một khoảng thời gian xấp xỉ độ dài này. Bây giờ, chúng tôi muốn sử dụng bộ đếm thời

gian (Interval Timer) cho mục đích này. Bộ Interval Timer cần phải ngắt bộ xử lý

mỗi 500 ms, lúc đó một ký tự sẽ được ghi vào cửa sổ đầu cuối của Debug Client.

Chức năng truy cập nội của Interval Timer sẽ được thiết lập để xác định một giá

trị chính xác và sau đó giảm dầm trong mỗi chu kỳ xung nhịp. Khi counter đếm đến

0, một sự kiện định thời ("timeout") được cho là đã xảy ra. Tại thời điểm này

Interval Timer có thể gây ra một yêu cầu ngắt và truy cập có thể được thiết lập lại

để trở về giá trị chỉ định ban đầu. Interval Timer có một tập các thanh ghi 16-bit có

thể được truy cập như một vị trí bộ nhớ, tương tự như JTAG UART. Hai trong số các

thanh ghi đó là Status và Control được thể hiện trong hình vẽ. Địa chỉ của Status

register là địa chỉ cơ bản được giao cho Interval Timer, trong khi địa chỉ của

Control register có vị trí cao hơn 4 byte.

Thanh ghi trong Interval Timer

Page 73: THỰC HÀNH HỆ THỐNG NHÚNG

66 THỰC HÀNH HỆ THỐNG NHÚNG

Các bit trong Status register được sử dụng như sau:

b0 (TO) là bit báo hiệu của bộ định thời “timeout”. Nó được tự động set lên 1 khi

bộ đếm nội bộ trong Interval Timer đếm đến 0 (do phần cứng). Nó vẫn còn lưu ở

mức 1 cho đến khi nó được xóa vồ 0 một cách rõ ràng bởi bộ xử lý (ghi vào là 0 do

code chương trình).

b1 (RUN) ở logic 1 khi bộ đếm nội bộ đang chạynó là bằng 0 nếu bộ đếm dừng.

Bit này không thể thay đổi bằng cách ghi vào Status register được.

Các bit trong Control register được sử dụng như sau:

b0 (ITO) cho phép Interval Timer ngắt khi được set lên 1.

b1 (CONT) xác định cách thức của chức năng truy cập nội bộ ứng xử khi nó đạt

đến 0. Nếu bit CONT = 1, bộ đếm sẽ chạy liên tục bằng cách tải lại giá trị đếm xác

định ban đầu khi nó đạt đến 0 và nó sẽ dừng hẳn không tải lại nữa nếu bit CONT =

0.

b2 (START) làm cho bộ truy cập nội bắt đầu chạy khi bit này được set lên 1, ghi

bởi đoạn chương trình.

b3 (STOP) dừng truy cập nội bộ khi được set lên 1 bởi đoạn chương trình.

Thông tin thêm về Interval Timer có thể được tìm thấy trong chương 12 của tài

liệu Altera Embedded Peripherals Hand-book.

Để kích hoạt cả hai ngắt, từ Interval Timer và JTAG UART cho việc đọc các ký tự

(Phần IV), cả hai bit b1 và b0 của thanh ghi điều khiển ctl3 phải được set lên 1. Như

đã thấy trong hình vẽ, JTAG UART là dòng ngắt 0 (hoặc b0) và Interval Timer (hoặc

b1) là dòng ngắt 1. Thanh ghi điều khiển ctl4, còn được gọi là ipending, có thể được

sử dụng để xác định ngắt đã xảy ra. Nếu một ngắt bị vô hiệu hóa bằng cách sử dụng

thanh ghi điều khiển ctl3, nó sẽ không thể gây ra một ngắt để trình phục vụ ngắt

thực hiện, và cũng sẽ không được hiển thị như đã được kích hoạt trong thanh ghi điều

khiển ctl4, ngay cả khi thiết bị lái yêu cầu dòng ngắt của nó sang 1.

Thực hiện các bước như sau:

(1) Chỉnh sửa chương trình từ Phần IV, từ đó chương trình chính sẽ cho phép

ngắt và sau đó chờ đợi với một vòng lặp vô hạn.

Page 74: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 4: HỎI VÒNG VÀ NGẮT 67 (2) Chỉnh sửa đoạn chương trình phục vụ ngắt để xử lý Interval Timer và cả

ngắt đọc của JTAG UART.

(3) Để cho phép ngắt, giá trị thích hợp phải được ghi vào Control register của

JTAG UART và các thanh ghi điều khiển của Interval Timer và Nios II là ctl0 và

ctl3.

(4) Biên dịch, tải và chạy chương trình.

Page 75: THỰC HÀNH HỆ THỐNG NHÚNG

68 THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS

5.1 MỤC ĐÍCH YÊU CẦU: Mục đích của bài tập này là tìm hiểu về giao tiếp bus. Trong các thiết kế sử dụng

SoPC Builder của hãng Altera, bộ xử lư Nios II kết nối với những thiết bị ngoại vi bằng

việc sử dụng bộ chuyển đổi cấu trúc Avalon (Avalon Switch Fabric). Để kết nối tới bộ

chuyển đổi cấu trúc, đòi hỏi phải có SoPC Builder. Trong bài tập này, Avalon to

External Bus Bridge SoPC sẽ được sử dụng để thay thế SoPC Builder. Việc thay thế

này cho phép người thiết kế có thể chế tạo và kết nối một thiết bị ngoại vi đến hệ

thống Nios II trong phần mềm Quatus II. Hình 1 cho chúng ta thấy tín hiệu bus và

thông tin thời gian cho bus ngoài. Những tín hiệu cần thiết:

Address - k bits (lên tới 32 bits). Địa chỉ của dữ liệu được truyền đi. Địa chỉ được

sắp xếp theo kích thước dữ liệu. Với 32- bit dữ liệu, địa chỉ bits Address1 - 0 bằng 0.

Tín hiệu byte - enable có thể được sử dụng để truyền ít hơn 4 byte.

BusEnable - 1 bit. Chỉ ra rằng tất cả tín hiệu khác đều phù hợp và có một quá

trình truyền dữ liệu sẽ xảy ra.

RW - 1 bit. Việc truyền dữ liệu là một quá trình Đọc (1) hoặc Ghi (0).

ByteEnable - 16, 8, 4, 2 hoặc 1 bits. Mỗi bit chỉ ra byte tương ứng được đọc hoặc

ghi. Những tín hiệu này tích cực mức cao.

WriteData - 128, 64, 32, 16 hoặc 8 bits. Dữ liệu được ghi vào thiết bị ngoại vi

trong suốt quá trình truyền.

Acknowledge - 1 bit. Được thiết bị ngoại vi sử dụng để báo quá trình truyền dữ

liệu đă hoàn thành.

ReadData - 128, 64, 32, 16 hoặc 8 bit. Dữ liệu được đọc từ thiết bị ngoại vi

trong quá trình truyền.

IRQ - 1 bit. Được thiết bị ngoại vi sử dụng để ngắt bộ xử lý Nios II. Đây là một

tín hiệu không bắt buộc.

Bus có tính đồng bộ - tất cả tín hiệu bus tới thiết bị ngoại vi phải được đọc khi có

cạnh lên của xung clock. Các tín hiệu Address, RW, ByteEnable và WriteData phải

Page 76: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 69

được thiết lập giá trị thích hợp trước khi bắt đầu truyền dữ liệu. Sau đó, tín hiệu

BusEnable được gán bằng 1. Nếu tín hiệu RW bằng 1 thì quá trình Đọc dữ liệu sẽ xảy

ra và thiết bị ngoại vi phải gán tín hiệu ReadData bằng một giá trị thích hợp và tín

hiệu Acknowledge được gán bằng 1. Tín hiệu Acknowledge phải được duy trì bằng 1

trong một chu kỳ. Tín hiệu ReadData không được thay đổi trong khi tín hiệu

Acknowledge đang được xác nhận. Nếu tín hiệu Acknowledge trải ra hai hoặc nhiều

chu kỳ, nó có thể bị Avalon Switch Fabric hiểu như một quá trình khác tương ứng do

đó tín hiệu Acknowledge phải được duy trì bằng 1 trong một chu kỳ.

Nếu tín hiệu RW bằng 0 thì quá trình Ghi sẽ diễn ra và thiết bị ngoại vi sẽ ghi giá

trị lên các đường Write Data đến vị trí thích hợp. Khi thiết bị ngoại vi hoàn tất quá

trình Ghi nó phải xác nhận tín hiệu Acknowledge trong một chu kỳ.

Page 77: THỰC HÀNH HỆ THỐNG NHÚNG

70 THỰC HÀNH HỆ THỐNG NHÚNG

5.2 PHẦN I: Hình vẽ sau đây mô tả hệ thống mà chúng ta muốn thiết kế và thực hiện.

The desired Nios II system

Hệ thống gồm: bộ xử lý Nios II, JTAG UART, khối bộ nhớ On-chip và bộ Avalon to

External Bus Bridge có thể được tạo ra bằng cách sử dụng SoPC Builder (Hình vẽ).

Page 78: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 71

The Nios II system specified in the SoPC Builder

Ngoại vi “SLAVE” (tớ ) sẽ là một module Verilog/VHDL. Các bus ngoài đã được đề

cập ở phần trước được bộ Avalon to External Bus Bridge kết nối với bộ chuyển đổi cấu

trúc Avalon (Avalon Switch Fabric) của hệ thống Nios II. Bộ chuyển đổi cấu trúc là

mạng lưới lien kết chính cho các ngoại vi trong hệ thống được tạo bởi SoPC Builder.

Ngoại vi “SLAVE” bao gồm 4 thanh ghi 16-bit cộng với mạch cần thiết để hiển thị

nội dung của những thaanh ghi này lên led 7 đoạn trên board DE2. Các thanh ghi có

thể truy cập như vị trí bộ nhớ, do đó bộ vi xử lý Nios II có thể ghi dữ liệu vào chúng.

Để tạo thuận lợi cho việc thực hiện các thiết bị ngoại vi mong muốn, ba module đã

định nghĩa trong Verilog/VHDL được cung cấp. Trong ba module được cung cấp, có

một module đã đầy đủ. Hai module còn lại được cung cấp dưới dạng bộ khung và phải

được hoàn thành như một phần của bài tập này. Ba module đó là:

Lab5- Part1 (đã đầy đủ)

Peripheral_on_External_Bus (bộ khung)

Seven_Segment_Display (bộ khung)

Khi hệ thống được tạo ra, hãy chỉnh sửa module Verilog/VHDL, Peripheral_

on_External_Bus để kết nối với Avalon to External Bus Bridge. Cũng như chỉnh sửa

các module chứa 4 thanh ghi. Mỗi thanh ghi nên chứa ¼ vùng địa chỉ mà SoPC

Page 79: THỰC HÀNH HỆ THỐNG NHÚNG

72 THỰC HÀNH HỆ THỐNG NHÚNG

Builder gán cho Avalon to External Bus Bridge. Dùng led 7 đoạn Hex3-0 để hiển thị

nội dung của các thanh ghi. Dùng SW1 hoặc SW2 để chọn chỉ một thanh ghi cho mỗi

lần hiển thị lên led 7 đoạn.

Các bước thực hiện như sau:

(1) Tạo project Quartus II với tên Lab5_part1. Chọn Cyclone II EP2C35F672C6.

(2) Sử dụng SoPC Builder để tạo ra hệ thống với tên nios_system, bao gồm các

thành phần:

Bộ xử lư Nios II/s với JTAG Debug Module Level 1.

Bộ nhớ On - chip: chọn chế độ RAM và kích thước bộ nhớ là 32 Kbytes.

Page 80: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 73

Page 81: THỰC HÀNH HỆ THỐNG NHÚNG

74 THỰC HÀNH HỆ THỐNG NHÚNG

JTAG UART.

Page 82: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 75 Avalon to External Bus Bridge – chọn 16-bit data và khoảng địa chỉ là

512Kbytes. Những thông số được lựa chọn nhằm đơn giản hóa việc kết nối đến chip

SRAM trong phần II của bài tập này. Trong cửa sổ SoPC Builder, chọn Avalon

Components > University Program DE2 Board > Avalon to External Bus Bridge.

(3) Kết nối Avalon to External Bus Bridge tới cổng data_master của Nios II và

hủy kết nối đến port instruction_master bằng cách xóa đường kết nối trong cửa sổ

SOPC Builder.

(4) Vào menu System, chọn Auto-Assign Base Addresses.

(5) Thoát SOPC Builder và trở lại phần mềm Quartus II.

(6) Thêm ba module Verilog/VHDL như trong hình vào project.

(7) Kiểm tra tính chuẩn xác của hệ thống Nios II đã được tạo với module

Lab5_Part1.

(8) Chỉnh sửa module Peripheral_on_External_Bus để có thể kết nối bốn thanh

ghi 16-bit với Avalon Switch.

Page 83: THỰC HÀNH HỆ THỐNG NHÚNG

76 THỰC HÀNH HỆ THỐNG NHÚNG

(9) Chỉnh sửa Seven_Segment_Display để hiển thị bốn thanh ghi lên led 7 đoạn

bằng mã Hex.

Page 84: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 77

(10) Gán chân bằng file DE2_pin_assignment.csv.

(11) Biên dịch project Quartus II bằng cách chọn Tool > Start Compile.

Page 85: THỰC HÀNH HỆ THỐNG NHÚNG

78 THỰC HÀNH HỆ THỐNG NHÚNG

(12) Lập trình và cấu hình Cyclone II FPGA trên Board DE2 để thực hành hệ

thống vừa tạo.

(13) Tạo chương trình Nios II bằng ngôn ngữ lập trình assembly để ghi bốnsố

16-bit khác nhau vào bốn thanh ghi.

(14) Dùng Altera Debug Client để biên dịch, nạp code và chạy chương trình.

Kiểm chứng các thanh ghi được để hiển thị bằng cách dùng các switch SW1-0.

5.3 PHẦN II: Trong phần này, chúng ta sẽ thực hiện một ngoại vi khác, như một bộ điều khiển

truy nhập vào chip SRAM trên board DE2 – phải kết nối chip SRAM với Avalon Switch

Fabric. SRAM sử dụng các tín hiệu sau:

SRAM_ADDR17–0 - 18 - bit, ngõ vào. Địa chỉ của những dữ liệu 16-bit.

SRAM_CE_N - 1-bit, ngõ vào. Cho biết những tín hiệu khác khả dụng

(ChipEnable).

Page 86: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 79 SRAM_WE_N - 1-bit, ngõ vào. Cho biết là quá trình Ghi dữ liệu

(WriteEnable).

SRAM_OE_N - 1-bit, ngõ vào. Cho biết là quá trình Đọc dữ liệu

(Output/ReadEnable).

SRAM_UB_N - 1-bit, ngõ vào. Cho biết byte cao hơn là Đọc hoặc Ghi

(Upper Byte Enable).

SRAM_LB_N - 1-bit, ngõ vào. Cho biết byte thấp hơn là Đọc hoặc Ghi

(Lower Byte Enable).

Hình vẽ sau mô tả quá trình của tín hiệu SRAM. Chú ý rằng SRAM hoàn thành việc

truyền dữ liệu trong một chu kỳ. Cũng như cần phải lưu ý rằng tất cả tín hiệu điều

khiển tích cực mức thấp. Tín hiệu SRAM_Write_Data là tín hiệu nội tương đương

SRAM_DQ, nhưng chỉ được dùng trong quá trình ghi dữ liệu. Tín hiệu này phải có trở

kháng cao ngoại trừ trong quá trình ghi dữ liệu, khi đó tín hiệu này được đặt sao cho

dữ liệu có thể được truyền đi.

SRAM có thể đọc và ghi một giá trị 16-bit trong 1 chu kỳ xung clock 50-MHz. Bộ

điều khiển SRAM hoạt động như một ngoại vi “tớ”.

Thực hiện theo các bước sau:

(1) Tạo project mới tên tên Lab5_part2. Dùng SoPC Builder như phần 1. Tạo hệ

thống Nios II phù hợp.

Page 87: THỰC HÀNH HỆ THỐNG NHÚNG

80 THỰC HÀNH HỆ THỐNG NHÚNG

(2) Thêm vào project 2 tập tin Verilog/VHDL gồm Lab5 Part2 và SRAM

Controller.

(3) Biên dịch project và cấu hình chip Cyclone II.

(4) Viết chương trình Nios II bằng ngôn ngữ assembly để ghi một vài dữ liệu

mẫu vào SRAM và đọc những dữ liệu này vào thanh ghi xử lý.

(5) Chạy chương trình và kiểm chứng. Có thê kiểm tra bộ điều khiển SRAM bằng

Altera Debug Client.

5.4 PHẦN III: Trong phần này chúng ta sẽ kết hợp thiết kế trong phần I và II, sử dụng một bộ

Avalon to External Bus Bridge kết nối hai 2 thiết bị ngoại vi. Một ngoại vi giữ vai trò là

bộ điều khiển SRAM và ngoại vi còn lại như bốn thanh ghi lien kết với mạch hiển thị.

Thực hiện theo các bước sau:

Page 88: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 81 (1) Tạo project mới với tên Lab5_part3.

(2) Sử dụng SOPC Builder tạo một hệ thống nhưng chọn vùng địa chỉ của

Avalon to External Bus Bridge là 1024 Kbyte.

(3) Chuẩn bị tập tin Verilog/VHDL tạo hệ thống Nios II để thực thi:

Bộ điều khiển SRAM sử dụng 512 Kbyte địa chỉ.

Bốn thanh ghi sử dụng khoảng địa chỉ còn lại.

(4) Sử dụng các đoạn code Verilog/VHDL trong phần I và phần II để chỉnh sửa

phù hợp với yêu cầu.

(5) Viết chương trình Nios II bằng ngôn ngữ assembly để ghi một vài dữ liệu

mẫu vào SRAM và đọc những dữ liệu này vào 4 thanh ghi.

(6) Chạy chương trình và kiểm chứng.

Page 89: THỰC HÀNH HỆ THỐNG NHÚNG
Page 90: THỰC HÀNH HỆ THỐNG NHÚNG

BÀI 5: GIAO TIẾP BUS 83

TÀI LIỆU THAM KHẢO