Upload
ngokiet
View
245
Download
6
Embed Size (px)
Citation preview
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
Ấn bản 2013
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
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
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
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:
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.
BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 3
SoPC Builder
Giao diện SoPC Builder
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
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
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
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
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).
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.
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.
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ẽ:
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.
BÀI 1: MỘT HỆ THỐNG MÁY TÍNH ĐƠN GIẢN 13
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.
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.
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:
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.
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
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.
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ẽ.
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
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.
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
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ẽ.
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
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ẽ.
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.
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, …
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:
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:
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
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
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
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"
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.
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.
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.
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.
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.
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ẽ.
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
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
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
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:
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
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:
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:
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
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)
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)
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:
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.
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
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.
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
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
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
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
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.
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.
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
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.
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:
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ô
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
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.
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.
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
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ỳ.
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ẽ).
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
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.
BÀI 5: GIAO TIẾP BUS 73
74 THỰC HÀNH HỆ THỐNG NHÚNG
JTAG UART.
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.
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.
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.
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).
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.
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:
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.
BÀI 5: GIAO TIẾP BUS 83
TÀI LIỆU THAM KHẢO