I. Vị trí, tính chất của mô đun:
- Vị trí: Trước khi học mô đun này cần hoàn thành các môn học cơ sở nghề và một số mô đun chuyên môn nghề như: PLC cơ bản, Kỹ thuật Vi điều khiển.
- Tính chất: Là mô đun tự chọn trong chương trình đào tạo ngành/ nghề Điện tử công nghiệp.
II. Mục tiêu mô đun:
- Về kiến thức:
+ Trình bày được nguyên lý hệ điều khiển lập trình cỡ nhỏ
+ Phân tích được cấu tạo phần cứng và nguyên tắc hoạt động của bộ lập trình cỡ nhỏ.
- Về kỹ năng:
+ Thực hiện được một số bài toán ứng dụng đơn giản trong công nghiệp.
+ Kết nối thành thạo phần cứng của bộ lập trình cỡ nhỏ, PC với thiết bị ngoại vi.
+ Viết chương trình và nạp được chương trình vào bộ lập trình cỡ nhỏ để thực hiện được một số bài toán ứng dụng đơn giản trong công nghiệp.
- Về năng lực tự chủ và trách nhiệm:
+ Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập.
125 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 19/02/2024 | Lượt xem: 127 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi mạch số lập trình (Trình độ: Trung cấp/Cao đẳng nghề), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
v Timing Simulation (Mô phỏng có tham số thời gian): Sau bước
Place and Route người thiết kế có thể thực hiện mô phỏng thiết kế ở
mức cổng logic đã được định vị trí và định tuyến trên CPLD, để thực
hiên mô phỏng hoạt động của thiết kế mà có tính đến các tham số thời
gian trễ, thời gian thiết lập, của các cổng logic trong CPLD. Bước
này rất quan trọng với những thiết kế phức tạp, tốc độ lớn.
v Configuration (Cấu hình): Gọi chương trình điều khiển việc nạp cấu
hình, thực hiện kết nối thiết bị nạp (cáp nạp) đến CPLD và nạp file
cấu hình cho CPLD. Với CPLD của hãng Xilinx, quá trình lập trình
có thể thực hiện ngay trong hệ thống nhờ công cụ JTAG, hoặc sử
dụng bộ lập trình thiết bị chuyên dụng, ví dụ như công cụ JTAG Data
I/O, theo chuẩn IEEE/ANSI 1149.1_1190. Công cụ JTAG là một bộ
60
các nguyên tắc thiết kế, hỗ trợ quá trình kiểm tra, lập trình cho thiết bị
và gỡ rối trên chip, trên bo mạch và trên hệ thống. Khả năng lập trình
trên hệ thống là ưu điểm của CPLD, cho phép hàn trực tiếp thiết bị
lên PCB. Nếu có thay đổi trong thiết kế, sẽ không phải tháo thiết bị ra
khỏi bo mạch, mà đơn giản chỉ phải lập trình lại trên hệ thống.
61
BÀI 3: CÁC PHÉP TOÁN SỐ CỦA BỘ LẬP TRÌNH CỠ NHỎ
Mục tiêu:
- Trình bày được các phép toán so sánh, các phép toán số.
- Lập trình, kết nối, chạy thử các phép toán so sánh,phép toán số, trong các
bài toán thực tế.
- Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập.
Nội dung chính:
3.1.Chức năng truyền dẫn
3.1.1. Truyền Byte, Word, Doubleword.
Xilinx đã cung cấp các công cụ thiết kế hoàn chỉnh, cho phép thực hiện
thiết kế trên các thiết bị logic khả trình của Xilinx. Các công cụ này kết hợp
cộng nghệ tiên tiến với giao diện đồ họa linh hoạt, dễ sử dụng để người thiết
kế có thể có được thiết kế tối ưu.
Bộ công cụ phần mềm hiện tại đang sử dụng rộng rãi là ISE với nhiều
phiên bản phần mềm khác nhau, các phiên bản sau được hỗ trợ thêm các dòng
thiết bị mới. Trong chương này trình bày chi tiết về cách cài đặt và sử dụng
phần mềm ISE 12.1 (phiên bản phần mềm 2010).
Xilinx cũng cung cấp ISE dưới dạng các gói phần mềm có cấu hình khác
nhau với giá thành khác nhau, tiêu biểu là ISE WebPACK và ISE Foundation:
v ISE WebPACK: bản miễn phí có thể dùng để thiết kế cho tất cả các
họ CPLD và một số họ FPGA của Xilinx.
v Gói phần mềm Foundation: có thể thiết kế cho tất cả các loại FPGA
và CPLD của Xilinx.
Ngoài ra, Xilinx còn phát triển các bộ công cụ phần mềm tiện ích khác
như System Generator hỗ trợ cho các thiết kế DSP, hay EDK (Embeded
Development Kit) hỗ trợ cho các thiết kế nhúng.
Ta có thể tải phần mềm ISE WebPACK từ trang web:
Để cài đặt chương trình ISE WebPACK 12.1 ta tiến hành các bước sau:
v Từ folder chứa phần mềm ta kich đúp vào file setup, và làm theo các
bước sau:
62
- Chọn Next
Hình 5.1
- Đánh dấu tick
vào ô: i accept
the terms of
this software
licence
- Sau đó kích
Next
Hình 5.2
63
- Đánh dấu tick
vào ô: i accept
the terms of
this software
licence
- Sau đó kích
Next
Hình 5.3
- Chọn ISE
WebPACK sau
đó nhấn Next
Hình 5.4
64
- Chọn Next
Hình 5.5
- Kích vào cửa
sổ Browse để
chọn đường
dẫn chứa
chương trình
cài đặt sau đó
kích Next
Hình 5.6
65
- Kích Install
Hình 5.7
- Sau khi chọn
Install,
chương trình
bắt đầu được
cài đặt như
hình 5.8. Ta
đợi cho đến
khi quá trình
cài đặt hoàn
thành
Hình 5.8
66
- Sau khi quá
trình cài đặt
hoàn thành,
hộp thoại quản
lý cấu hình
của Xilinx sẽ
xuất hiện để ta
chọn các loại
license khác
nhau như hình
5.9.
Hình 5.9
Ta có thể chọn một trong năm dạng license.
v Start Now! -30 Day trial (No Bitstream): cho phép ta sử dụng
miễn phí trong 30 ngày, và không tạo được Bitstream.
v Get Free ISE Webpack License: Nhận license ISE WebPACK từ
trang web của Xilinx.
v Start 30 Day Evalation: Sử dụng phiên bản evaluation trong 30
ngày
v Get My Purchased License (s): Mua license của Xilinx
v Local Existing License (s): chọn tới đường dẫn chứa license có
sẵn trong máy tính được cài đặt.
Với license có sẵn trong máy tính ta chọn Locate Existing License (s),
sau đó chọn Next, khi đó sẽ xuất hiện hộp thoại như hình 5.10.
67
Hình 5.10
- Ta kích vào
Copy License,
sau đó chọn
đến đường
dẫn chứa file
License như
hình 5.11, sau
đó nhấn Open
để hoàn thành
quá trình cài
đặt.
Hình 5.11
68
Sau khi cài đặt xong, ta kích vào biểu tượng Xilinx ISE Design Suite
12.1 trên màn hình máy tính (hình 5.12a) hoặc vào Start -> All Programs ->
Xilinx ISE Design Suite 12.1 -> ISE Design Tool -> Project Navigator
(hình 5.12b) để khởi động ISE.
(a)
(b)
Hình 5.12– Khởi động ISE 12.1
Sau khi khởi động ISE sẽ xuất hiện giao diện chương trình ISE với các
cửa sổ soạn thảo như hình 5.13.
Cửa sổ soạn thảo
Cửa sổ thông báo
Cửa sổ quản lý
source và project
Hình 5.13 – Giao diện chương trình ISE 12.1
69
Tạo Project trên ISE
Để tạo project trên ISE ta vào File -> New Project, khi đó sẽ xuất hiện
hộp thoại như hình 5.14.
Hình 5.14
v Tại vùng Name: ta đặt tên của project
v Location và Working Directory: tên thư mục chứa project
- Sau đó chọn Next, sẽ
xuất hiện hộp thoại
thiết lập cho project
như hình 5.15.
- Sau khi đã thiết lập cho
project, nếu ta muốn
thay đổi thiết lập thì
kích chuột phải vào
cửa sổ quản lý project
và chọn Design
Properties.
Hình 5.15 – Cửa sổ thiết lập cho project
Trong đó:
70
v Family: ta chọn họ linh kiện
v Device: chọn tên linh kiện
v Package: chọn dạng đóng gói của linh kiện
v Speed: chọn tốc độ
v Synthesis Tool: chọn công cụ tổng hợp
v Simulator: chọn công cụ mô phỏng, có thể sử dụ Isim
VHDL/Verilog đã được tích hợp sẵn trong ISE hay công cụ mô
phỏng Modelsim.
v Preferred Language: ngôn ngữ viết chương trình, ở đây ta viết bằng
chương trình Verilog, do đó ta chọn Verilog.
- Sau đó kích
Next và finish
thì quá trình
tạo một project
hoàn thành như
hình 5.16
Hình 5.16
71
- Để add chương
trình có sẵn
vào project ta
kích chuột phải
vào cửa sổ
quản lý project,
sau đó chọn
Add Source
như hình 5.17.
Khi đó sẽ xuất
hiện hộp thoại
để ta add
source chương
trình đã tạo ra
trước đó vào
project.
Hình 5.17 – Add source chương trình có sẵn vào
project
- Để thêm một
source chương
trình mới vào
project ta kích
chuột phải vào
cửa sổ quản lý
project, sau đó
chọn New
Source. Khi đó
sẽ xuất hiện
hộp thoại như
hình 5.18. Ta
đặt tên soure
mới vào File
name. Hình 5.18 – Thêm new source vào project
Trong đó:
v IP (CORE Generator & Architecture Wizard): tạo IP CORE có
sẵn từ ISE
v Schematic: tạo một schematic mới
v Verilog Module: tạo một soure chương trình Verilog mới
v Verilog Test Fixture: tạo soure chương trình mô phỏng Verilog mới
v VHDL Module: Tạo source chương trình VHDL mới
72
v VHDL Test Bench: tạo testbench cho module VHDL
Ở đây, ta viết chương trình bằng ngôn ngữ Verilog cho nên ta quan tâm
chủ yếu là IP (CORE Generator & Architecture Wizard), Verilog Module
và Verilog Test Fixture.
- Để tạo Verilog
Module mới ta
chọn Verilog
Module, đặt
tên vào ô file
name sau đó
kích Next, sẽ
xuất hiện hộp
thoại như hình
5.19 để ta khai
báo các ngõ
vào ra. Ta kích
Next để bỏ qua
bước này.
Hình 5.19 – Đặt tên ngõ vào ra của new source
- Sau đó kích
finish thì một
source chương
trình mới được
tạo ra như hình
5.20.
Hình 5.20 – Màn hình soạn thảo của new source
73
- Để tạo source chương trình
mô phỏng bằng Verilog ta
làm tương tự như tạo
source chương trình
Verilog mới, nhưng thay vì
chọn Verilog Module ta
chọn Verilog Test Fixture,
sau đó chọn Next sẽ xuất
hiện hộp thoại như hình
5.21. Ta chọn module cần
tạo file mô phỏng (ở đây là
soure chương trình a), sau
đó kích Next và finish thì
một source chương trình
mô phỏng cho chương trình
a sẽ được tạo ra như hình
5.22.
Hình 5.21
Hình 5.22 – Cửa sổ soạn thảo chương trình mô phỏng
74
3.2. Chức năng so sánh
3.2.1. Chức năng dịch chuyển
Modelsim là công cụ hỗ trợ mô phỏng của Mentor Graphics
Corporation, cho phép mô phỏng kết quả thực thi thiết kế trên ISE, mô tả cho
ta thấy dạng sóng, số liệu,của các tín hiệu trong chương trình.
Modelsim có nhiều dạng khác nhau như Modelsim SE, Modelsim
PE,và mỗi dạng có nhiều phiên bản khác nhau như Modelsim SE 6.1a,
Modelsim SE 6.3b, Modelsim SE 6.5a, Modelsim PE 6.1a, Modelsim-
pe_student_edition 10.1a,Trong đó Modelsim-pe_student_edition là phiên
bản cung cấp license miễn phí cho sinh viên nghiên cứu và học tập (download
từ website:
Để cài đặt Modelsim-pe_student_edition 10.1a, ta kích đúp vào file
chương trình modelsim-pe_student_edition.exe, khi đó chương trình
Modelsim-pe_student_edition sẽ bắt đầu được cài đặt (hình 5.23).
Hình 5.23 - Bắt đầu cài đặt modelsim-pe_student_edition
Sau khi quá trình cài đặt được khởi tạo, sẽ xuất hiện hộp thoại như hình
5.24, ta chọn Next để tiếp tục quá trình cài đặt.
75
Hình 5.24
Sau khi chọn Next sẽ xuất hiện hộp thoại như hình 5.25, ta tiếp tục chọn
Yes để tiếp tục quá trình cài đặt.
Hình 5.25
76
Sau khi chọn Yes, sẽ xuất hiện hộp thoại như hình 5.26, hộp thoại này
cho phép ta thay đổi đường dẫn chứa chương trình cài đặt. Sau khi thay đổi
xong ta chọn Next.
Hình 5.26 – Chọn đường dẫn chứa chương trình cài đặt
- Chọn Next
Hình 5.27
77
- Sau khi chọn
Next, chương
trình chính bắt
đầu được cài
đặt như hình
5.28, ta đợi cho
đến khi chương
trình cài đặt
được hoàn
thành.
Hình 5.28
- Sau khi quá
trình cài đặt
hoàn thành,
chương trình
hỏi ta có tạo
Shortcut trên
desktop không
(hình 5.29) ,
nếu ta muốn
tạo thì chọn
Yes, còn không
muốn tạo thì
chọn No.
Hình 5.29
78
- Chọn Yes để
add đường dẫn
cho chương
trình modelsim
vừa được cài
đặt (hình 5.30).
Hình 5.30 – Add đường dẫn cho modelsim
- Sau khi add
đường dẫn
xong, ta chọn
finish để kết
thúc quá trình
cài đặt
modelsim,
đồng thời tại
thời điểm đó
chương trình sẽ
dẫn đường link
tới website của
Mentor
Graphics
Corporation để
ta điền thông
tin yêu cầu
license.
Hình 5.31 – Kết thúc cài đặt và yêu cầu license
Sau khi đã nhận được license qua email, ta copy license vào thư mục
chương trình modelsim vừa cài đặt, sau đó thiết lập môi trường biến và
license cho modelsim theo các bước như sau:
79
v Kích chuột phải vào My
computer, chọn Properties
(hình 5.32).
Hình 5.32
v Sau khi hộp thoại System
Properties xuất hiện, ta vào
Advanced, chọn Enviroment
Variables (hình 5.33).
Hình 5.33
80
v Từ hộp thoại Enviroment
Variables ta chọn New
(hình 5.34), sau đó:
- Tại vùng Variable
name: ta điền:
LM_LICENSE_FILE
- Tại vùng Variable
value: ta chọn đường
dẫn tới file license đã
nhận trước đó.
- Sau đó nhấn Ok để kết
thúc việc thiết lập
license.
Hình 5.34
Chú ý là, để yêu cầu và nhận được license qua email, thì trong quá trình
cài đặt máy tính phải được kết nối internet.
Sau khi cài đặt xong modelsim, ta có thể khởi động modelsim bằng nhiều
cách khác nhau:
v Ta vào: Start -> All Program -> Modelism PE Student Edition 10.1a ->
Modelsim
v Khởi động modelsim
bằng cách kích vào biểu
tượng của modelsim
trên desktop (hình 5.35)
Hình 5.35 – Biểu tượng Modelsim trên
desktop
v Khởi động modelsim bằng cách link từ ISE
3.2.2. Chức năng chuyển đổi( Converter)
Mô phỏng trên ISE:
Phần mềm ISE cung cấp cho ta một công cụ hỗ trợ mô phỏng tích hợp
sẵn trong ISE là Isim (VHDL/Verilog).
81
Để thiết lập link mô phỏng gọi chương trình ISim có sẵn trong ISE, ta
khởi động ISE lên, sau đó kích chuột phải vào cửa sổ quản lý project chọn
Design Properties, khi đó một cửa sổ mới được mở ra như hình 5.36.
Hình 5.36 – Thiết lập cho project
Tại mục Simulator ta chọn ISim (VHDL/Verilog), sau đó nhấn ok.
Để bắt đầu quá trình mô phỏng, trên ISE ta chọn Simulation, sau đó chọn
file chương trình cần mô phỏng như hình 5.37.
82
Hình 5.37 – Chọn file cần mô phỏng
Sau khi chọn file chương trình cần mô phỏng, ta kích đúp vào biểu tượng
mô phỏng Simulate Behavioral Model trong cửa sổ Processes để gọi
chương trình mô phỏng ISim như hình 5.38.
Hình 5.38 – Gọi chương trình mô phỏng
Sau khi gọi chương trình mô phỏng ISim, cửa sổ giao diện chương trình
ISim sẽ được mở lên với các các vùng soạn thảo như hình 5.39.
83
Giá trị của tín hiệu
hiện thời
Vùng lệnh
Vùng quản lý source
Dạng sóng của tín
hiệu mô phỏng
Vùng quản lý tên của
tín hiệu
Hình 5.39 – Giao diện chương trình ISim
Vùng quản lý Source: cho phép ta truy cập vào nội dung của source
chương trình. Để đọc nội dung của một source chương trình, ta kích đúp vào
tên của source chương trình cần đọc thì nội dung của source đó sẽ hiện ra
(hình 5.40).
Hình 5.40 – Đọc nội dung của source chương trình
84
Vùng quản lý tên của tín hiệu (Name), vùng giá trị hiện thời của tín hiệu
(Value) và vùng dạng sóng của tín hiệu mô phỏng cho phép ta theo dõi, phân
tích và thao tác trên dạng sóng của tín hiệu.
Để copy, xóa, cắt hay sửa lại tên của tín hiệu nào thì ta kích chuột phải
vào tên hay dạng sóng của tín hiệu đó như hình 5.41.
Trong đó:
- Cut: cho phép ta cắt
tín hiệu
- Copy: cho phép copy
tín hiệu
- Delete: cho phép xóa
tín hiệu
- Rename: sửa tên của
tín hiệu
Hình 5.41 – Thao tác trên dạng sóng của tín hiệu
Khi khởi tạo mô phỏng, thì mặc định dữ liệu sẽ được hiện dưới dạng kiểu
dữ liệu nhị phân, để thay đổi kiểu dữ liệu của tín hiệu nào ta kích chuột phải
vào tín hiệu đó, sau đó chọn Radix, khi đó sẽ xuất hiện một danh sách các
kiểu dữ liệu để ta lựa chọn như hình 5.42.
85
Trong đó:
- Binary: kiểu nhị phân
- Hexadecimal: kiểu thập
lục phân
- Unsigned Decimal:
kiểu thập phân không
dấu
- Signed Decimal: kiểu
thập phân có dấu
- Octal: kiểu octal
- ASCII: kiểu mã ASCII
Hình 5.42 – Chọn kiểu dữ liệu cho tín hiệu
Mặc định, khi khởi tạo thì màu sắc của tất cả các dạng sóng là giống
nhau. Do đó, nếu trong quá trình mô phỏng có nhiều dạng sóng thì vấn đề
quan sát trở nên khó khăn, vì vậy ISim cho phép ta thay đổi màu sắc của dạng
sóng để dễ dàng quan sát hơn. Để thay đổi màu của dạng sóng, ta kích chuột
phải vào dạng sóng cần quan sát, sau dó chọn Signal Color, khi đó sẽ hiện ra
một danh sách các màu sắc để ta lựa chọn như hình 5.43.
Hình 5.43 – Thay đổi màu sắc của dạng sóng tín hiệu
86
Trong quá trình quan sát dạng sóng, nếu có quá nhiều dạng sóng, lúc đó
ta muốn quan sát dạng sóng nào thì ta kích chuột phải vùng quản lý tên dạng
sóng và chọn Find (hình 5.44a), sau đó gõ tên dạng sóng cần quan sát vào
vùng Find, sau đó nhấn enter sẽ hiện ra dạng sóng mà ta cần tìm (hình 5.44b).
(a) (b)
Hình 5.44 – Tìm dạng sóng
Để biết được tín hiệu mà ta đang quan sát được xử lý ở đâu trong chương
trình thì ta kích chuột phải vào dạng sóng đó (hình 5.45a) sau đó chọn Go To
Source Code, khi đó chương trình sẽ chỉ tới tín hiệu mà ta cần biết xử lý ở
đâu trong chương trình (hình 5.45b).
(a) (b)
Hình 5.45 – Link từ dạng sóng tới chương trình
87
Đối với những tín hiệu nhiều bit, khi đó trạng thái mà ta quan sát được là
giá trị của nhiều bit. Để quan sát giá trị của từng bit ta kích vào tín hiệu đó
như hình 5.46.
Hình 5.46 – Quan sát giá trị của từng bit
Trong trường hợp ta chưa quan sát được trạng thái của dạng sóng mà ta
cần quan sát do thời gian của mô phỏng ngắn hơn thời điểm trạng thái đó xuất
hiện, lúc đó để quan sát trạng thái này, ta vào Simulation chọn Run All (hình
5.47a), sau đó muốn ngừng mô phỏng lúc nào ta vào Simlation và chọn
break (hình 5.47b).
(a) (b)
Hình 5.47 – (a): Chạy mô phỏng Run All, (b): Ngừng mô phỏng
88
Nếu ta không muốn chạy mô phỏng Run All, thì ta chạy mô phỏng theo
từng bước cho đến khi có được số liệu mà ta cần quan sát. Để chạy mô phỏng
từng bước ta vào Simulation và chọn Step hoặc Run như hình 5.48.
Hình 5.48 – Chạy mô phỏng từng bước
Để chia dạng sóng thành những khoảng thời gian nhỏ đều nhau, ta chọn
Add Marker, khi đó tín hiệu sẽ được chia thành các khoảng thời gian nhỏ đều
nhau như hình 5.49(a).
Trong quá trình quan sát, nếu ta muốn xóa Add Marker nào ta kích chuột
phải vào Add Marker đó và chọn Delete Marker (hình 5.49b), còn nếu muốn
xóa hết Add Marker thì ta chọn Delete All Markers (hình 5.49b).
(a) (b)
Hình 5.49 – Chia tín hiệu quan sát thành các khoảng thời gian bằng nhau
89
Khi ta muốn nới rộng dạng sóng quan sát ở vùng nào, ta kéo và giữ chuột
giữa ở vùng đó (hình 5.50a), khi đó dạng sóng ở vùng đó sẽ được nới rộng ra
hình (5.50b).
(a) (b)
Hình 5.50 – Nới rộng dạng sóng
Ngoài ra ISim còn hỗ trợ nhiều chức năng khác nữa như; zoom in, zoom
out,..và một số chức năng khác để thao tác trên dạng sóng như những phần
mềm khác.
Mô phỏng trên modelsim:
Để thiết lập link mô phỏng gọi chương trình modelism_pe_student, ta
khởi động ISE lên, sau đó kích chuột phải vào cửa sổ quản lý project chọn
Design Properties, khi đó một cửa sổ mới được mở ra như hình 5.51.
90
Hình 5.51 – Thiết lập chọn chương trình mô phỏng
Tại mục Simulator ta chọn Modelsim_PE Verilog sau đó nhấn ok.
Để bắt đầu quá trình mô phỏng, trên ISE ta chọn Simulation, sau đó chọn
file chương trình cần mô phỏng như hình 5.52.
Hình 5.52 – Chọn file cần mô phỏng
Sau khi chọn file chương trình cần mô phỏng, ta kích đúp vào biểu tượng
mô phỏng Simulate Behavioral Model trong cửa sổ Processes để gọi
chương trình mô phỏng modelsim_pe_student như hình 5.53.
Hình 5.53 – Gọi chương trình mô phỏng
91
Sau khi gọi chương trình mô phỏng modelim_pe_student, cửa sổ giao
diện chương trình modelsim_pe_student sẽ được mở lên với các các vùng
soạn thảo như hình 5.54.
Vùng lệnh
Vùng quản lý source
Dạng sóng của tín
hiệu mô phỏng
Vùng quản lý tên của
tín hiệu
Vùng quản lý dạng sóng
Vùng hiển thị tín hiệu I/O
và các tín hiệu khác
Giá trị hiện thời của
tín hiệu
Vùng hiển thị source
chương trình
Hình 5.54 – Giao diện chương trình modelsim_pe_student
Vùng quản lý Source: cho phép ta truy cập vào nội dung của source
chương trình. Để đọc nội dung của một source chương trình, ta kích đúp vào
tên của source chương trình cần đọc thì nội dung của source đó sẽ hiện ra ở
vùng hiển thị source chương trình như hình 5.55.
Hình 5.55 – Đọc nội dung của source chương trình
92
Vùng quản lý tên của tín hiệu, vùng giá trị hiện thời của tín hiệu và vùng
dạng sóng của tín hiệu mô phỏng cho phép ta theo dõi, phân tích và thao tác
trên dạng sóng của tín hiệu.
Để copy, xóa, cắt hay sửa lại tên của tín hiệu nào thì ta kích chuột phải
vào tên hay dạng sóng của tín hiệu đó sau đó chọn Edit như hình 5.56.
Trong đó:
- Cut: cho phép ta cắt
tín hiệu
- Copy: cho phép copy
tín hiệu
- Delete: cho phép xóa
tín hiệu
- Paste: dán tín hiệu đã
cắt hoặc copy
Hình 5.56 – Thao tác trên dạng sóng của tín hiệu
Khi khởi tạo mô phỏng, thì mặc định dữ liệu sẽ được hiện dưới dạng kiểu
dữ liệu nhị phân, để thay đổi kiểu dữ liệu của tín hiệu nào ta kích chuột phải
vào tín hiệu đó, sau đó chọn Radix, khi đó sẽ xuất hiện một danh sách các
kiểu dữ liệu để ta lựa chọn như hình 5.57.
93
Trong đó:
- Binary: kiểu nhị phân
- Octal: kiểu dữ liệu octal
- Decimal: kiểu thập phân
có dấu
- Hexadecimal: kiểu thập
lục phân
- Unsigned: kiểu thập
phân không dấu
- ASCII: kiểu mã ASCII
- Time: kiểu time
Hình 5.57 – Chọn kiểu dữ liệu cho tín hiệu
Mặc định, khi khởi tạo thì màu sắc của tất cả các dạng sóng là giống
nhau. Do đó, nếu trong quá trình mô phỏng có nhiều dạng sóng thì vấn đề
quan sát trở nên khó khăn, vì vậy modelsim cho phép ta thay đổi màu sắc của
dạng sóng để dễ dàng quan sát hơn. Để thay đổi màu của dạng sóng, ta kích
chuột phải vào dạng sóng cần quan sát, sau đó chọn Properties như hình
5.58a, khi đó sẽ xuất hiện hộp thoại như hình 5.58b. Từ hộp thoại này, trong
vùng Wave Color, ta chọn Colors sẽ hiện ra danh sách bảng màu để ta chọn
màu sắc cần thay đổi, còn muốn thay đổi màu của tên dạng sóng thì trong
vùng Name Colors ta chọn Color để thay đổi màu của tên dạng sóng.
(a) (b)
94
Hình 5.58 – Thay đổi màu sắc của dạng sóng tín hiệu
Để quan sát dạng sóng ở dạng tín hiệu analog thì ta kích chuột phải vào
tên dạng sóng, sau đó chọn Format -> Analog như hình 5.59. Để quay lại
dạng sóng dưới dạng tín hiệu số ta chọn Literal. Chú ý là tín hiệu 1 bit không
quan sát được dưới dạng tín hiệu analog.
Hình 5.59 – Lựa chọn quan sát tín hiệu dưới dạng số hoặc tương tự
Trong quá trình quan sát dạng sóng, nếu có quá nhiều dạng sóng, lúc đó
ta muốn quan sát dạng sóng nào thì ta sử dụng công cụ tìm kiếm dạng sóng
đó. Để tìm kiếm dạng sóng, ta vào Edit -> Find, khi đó sẽ xuất hiện ô tìm
kiếm dạng sóng như hình 5.60, ta gõ tên dạng sóng cần tìm thì chương trình
sẽ link tới tên dạng sóng đó
95
Hình 5.60 – Tìm dạng sóng
Đối với những tín hiệu nhiều bit, khi đó trạng thái mà ta quan sát được là
giá trị của nhiều bit. Để quan sát giá trị của từng bit ta kích vào tín hiệu đó
như hình 5.61
96
Hình 5.61 – Quan sát giá trị của từng bit
Trong trường hợp ta chưa quan sát được trạng thái của dạng sóng mà ta
cần quan sát do thời gian của mô phỏng ngắn hơn thời điểm trạng thái đó xuất
hiện, lúc đó để quan sát trạng thái này, ta vào Simulation ->Run-> Run All
(hình 5.62a), sau đó muốn ngừng mô phỏng lúc nào ta sẽ vào Simlation và
chọn break (hình 5.62b).
(a) (b)
Hình 5.62 – (a): Chạy mô phỏng Run All, (b): Ngừng mô phỏng
97
Trong trường
hợp sau khi ngừng
mô phỏng, ta muốn
chạy tiếp chương
trình mô phỏng ta
vào Simulation -
>Run-> Run All và
chọn Continue.
Hình 5.63 – Chạy tiếp chương trình mô phỏng
Nếu ta không muốn chạy mô phỏng Run All, thì ta chạy mô phỏng theo
từng bước cho đến khi có được số liệu mà ta cần quan sát. Để chạy mô phỏng
từng bước ta vào Simulation và chọn Run 100 hoặc Run-Next như hình
5.64.
Hình 5.64 – Chạy mô phỏng từng bước
Để phân chia dạng sóng thành những khoảng khác nhau, ta kích vào
Insert Cursor (hình 5.65) khi đó các cursor được thêm vào như hình 5.65.
Trong trường hợp muốn xóa các cursor thì ta kích vào Delete Cursor.
98
Hình 5.65 – Chia dạng sóng thành các khoảng khác nhau
Khi ta muốn nới rộng dạng sóng quan sát ở vùng nào, ta giữ và kéo chuột
giữa ở vùng đó (hình 5.66a), khi đó dạng sóng ở vùng đó sẽ được nới rộng ra
hình (5.66b).
(a) (b)
Hình 5.66 – Nới rộng dạng sóng
Để đọc dữ liệu của một tín hiệu trong quá trình thực thi mô phỏng thì ta
kích chuột phải vào dạng sóng chọn Add -> To List -> Selected Items như
hình 5.67.
99
Hình 5.67 – Đọc dữ liệu của tín hiệu
Khi
đó sẽ
xuất hiện
hộp thoại
List –
Default
(hình
5.68)
hiển thị
các giá trị
của tín
hiệu
trong quá
trình mô
phỏng.
Hình 5.68 – Đọc dữ liệu của tín hiệu mô phỏng
100
Để biết tín
hiệu mình đang
xử lý ở trong
Dataflow thì ta
kích chuột phải
vào dạng sóng và
chọn Add -> To
Dataflow ->
Selected Items
như hình 5.69.
Hình 5.69 – Lựa chọn tín hiệu tới Dataflow
Khi đó cửa sổ Dataflow được mở ra, hiển thị cho ta biết tín hiệu mà
chúng ta muốn biết trong Dataflow như hình 5.70.
Hình 5.70 – Hiển thị tín hiệu trong Dataflow
101
Để hiển thị toàn bộ tín hiệu và sơ đồ kết nối schematic từ chương trình
mà ta đã viết, thì ta chọn toàn bộ tín hiệu, sau đó vẫn chọn Add -> To
Dataflow -> Selected Items như ở bước trên, thì toàn bộ tín hiệu và kết nối
schematic từ chương trình mà ta đã viết xuất hiện như hình 5.71.
Hình 5.71 – Hiển thị tất cả các tín hiệu và schematic trong Dataflow
Dataflow cũng chính là nơi chỉ ra cho ta thấy sơ đồ mạch điện thiết kế
của chương trình mà ta đã viết.
Để hiển thị dạng sóng
trong cửa sổ Dataflow, ta
chọn Show Wave như hình
5.72.
Hình 5.72 chọn Show Wave trong Dataflow
Khi đó, trong cửa sổ Dataflow sẽ hiển thị dạng sóng mô phỏng như hình
5.73.
102
Hình 5.73 – Hiển thị dạng sóng trong Dataflow
Trong cửa sổ Dataflow, khi ta kích vào chân tín hiệu hay một khối trong
schematic thì trong vùng quản lý dạng sóng sẽ link tới tín hiệu hay khối đó và
ngược lại.
Để tao tác hiển thị toàn bộ hay một phần schematic trong Dataflow ta có
thể thực hiện các công cụ thao tác như trong hình 5.74.
Thao tác để hiển thị
toàn bộ hay một phần
sơ đồ mạch
Hình 5.74 – Thao tác để hiển thị toàn bộ hay một phần mạch trong
Dataflow
103
Để xuất tín
hiệu ra dưới dạng
file ảnh, thì ta
vào Edit ->
Export ->
Image, khi đó
một hộp thoại
xuất hiện như
hình 5.75, ta điền
tên cần lưu vào ô
File name, và
chọn nơi để lưu
phai ảnh, sau đó
nhấn Save.
Hình 5.75 – Xuất dạng sóng ra file ảnh
Để xem và biết các khối lệnh, thanh ghi,đã sử dụng trong chương
trình, thì trong modelsim ta chọn Capacity, khi đó cửa sổ Capacity sẽ hiện ra
cho ta thấy số lượng các khối lệnh, thanh ghi,đã sử dụng trong chương trình
như hình 5.76
Hình 5.76 – Cửa sổ Capacity
104
Để tao tác các bước
mô phỏng, ngừng mô
phỏng,..trước đó thì ta
có thể vào của sổ quản
lý lệnh như hình 5.77,
sau đó dùng phím di
chuyển lên xuống trên
bàn phím để chọn lệnh
sau đó nhấn enter thì
chương trình sẽ được
thực thi.
Hình 5.77 – Gọi lệnh từ cửa sổ lệnh trong
modelsim
Ngoài những thao tác trong việc sử dụng phần mềm modelsim như đã
trình bày ở trên, thì modelsim còn hỗ trợ nhiều chức năng và nhiều phím tắt
khác,người học có thể khai thác thêm trên phần mềm modelsim.
3.3. Đồng hồ thời gian
Trong giai đoạn Translate, thì Netlist của chương trình được biên dịch
thành dạng EDIF (Electronic Device Interchangeable Format) hoặc định dạng
NGC (một định dạng netlist riêng của Xilinx), sau đó kết hợp với hai file quy
định ràng buộc của thiết kế.
v NFC (Native Constraint File): chứa những thông tin vật lý về thời
gian, tốc độ, các tham số vật lý ký sinh,của chip FPGA là đối tượng
sẽ tiến hành cấu hình.
v UCF (User Contraint File): chữa những ràng buộc yêu cầu từ phía
người dùng thiết kế với vi mạch của mình. UCF được xem là một
phần quan trọng trong thiết kế, nếu như mô tả chức năng chỉ qui định
mạch định làm gì thì trong file UCF sẽ chứa những yêu cầu đòi hỏi về
tốc độ (timing contraint) cũng như mức độ sử dụng tài nguyên. Các
yêu cầu này là cơ sở cho các quá trình biên dịch trong ISE tối ưu hóa
thiết kế. Để có thể viết được những yêu cầu này thì người thiết kế
trước hết phải rất hiểu thiết kế của mình, chẳng hạn như trong thiết kế
có dùng những tín hiệu xung nhịp như thế nào, khu vực tổ hợp nào có
khả năng gây ra thời gian trễ nhất và ước tính được giá trị của độ trễ.
Việc gán chân trong FPGA do người dùng thiết kế, do đó trong file UCF
có chứa các qui định về việc gán chân tương thích với thiết bị. Cách gán chân
này phụ thuộc vào từng loại FPGA và từng mạch ứng dụng FPGA cụ thể.
Việc gán chân trong Verilog được thực hiện theo cấu trúc câu lệnh như sau:
(*LOC = “Chân thiết bị”*) loại_tín_hiệu tên_tín_hiệu;
Trong đó:
v Chân thiết bị: là chân của FPGA thực tế
105
v Loại tín hiệu: là tín hiệu ngõ vào (input), ngõ ra (output) hay tín
hiệu vào/ra (inout).
v Tên tín hiệu: là tên mà người thiết kế đặt trong module.
Chú ý là, nếu tín hiệu có bao nhiêu bit thì số chân phải được gán tương
ứng bằng với số bit của tín hiệu. Tên của chân ta được phép gán tùy ý theo
cấu hình chân của FPGA được dùng trong thiết kế. Để hiểu rõ hơn việc gán
chân cho FPGA ta xem xét ví dụ sau:
Ví dụ:
module tichhop_led (clk, dem);
(*LOC = "P78"*) input clk; //--- gán chân P78 cho tín hiệu clk --
--
(* LOC ="P129,P128,P127,P126,P123,P122,P120,P119"*) output
[7:0] dem;
//-------gán các chân P129, P128, P127, P126, P123,
P122, // P120, P119
//-------cho tín hiệu “dem” có 8 ngõ vào----------------------
-
reg clk1;
reg [7:0] dem;
reg [3:0] dem1;
reg [3:0] dem2;
integer N;
always @ (posedge clk)
begin
begin
if (N<1000000) begin
clk1=clk1;
N=N+1;
end
else begin
clk1=~clk1;
N=0;
if(dem1==9) begin
dem1=0;
106
if(dem2==9) dem2=0;
else dem2= dem2+1;
end
else begin
dem1= dem1+1;
dem2=dem2;
end
end
end
dem ={dem1,dem2};
end
endmodule
Trong ví dụ trên, tín hiệu “clk” được gán với chân “P78”, tín hiệu “dem
[7:0]” có 8 bit, do đó được gán tương ứng với các chân “P129, P128, P127,
P126, P123, P122, P120, P119”. Trong đó tín hiệu “dem” tại vị trí bit thứ 8,
tức là “dem[7]” được gán với chân “P129”,, và tín hiệu “dem” tại vị trí bit
thứ nhất, tức là “dem[0]” được gán với chân “P119”. Việc gán này là do tùy ý
người thiết kế, nếu ta không thích gán bit “dem[7]” với chân “P129” thì ta có
thể gán với chân khác.
Tín hiệu clock được gán tùy ý, nhưng FPGA có hỗ trợ các chân clock thì
ta nên gán các tín hiệu clock với các chân clock mà FPGA hỗ trợ để hệ thống
hoạt động tốt hơn.
107
BÀI 4:LẮP ĐẶT MÔ HÌNH ĐIỀU KHIỂN BẰNG LẬP TRÌNH CỠ NHỎ
Mục tiêu:
- Phân tích qui trình công nghệ của một số mạch máy sản xuất.
- Lập trình được một số mạch ứng dụng thường gặp trong thực tế.
- Nạp chương trình, vận hành và kiểm tra mạch hoạt động theo yêu cầu kỹ
thuật
- Chủ động, sáng tạo và đảm bảo an toàn trong quá trình học tập.
Nội dung chính:
4.1. Giới thiệu
Trong một thời gian dài, các ngôn ngữ lập trình như Pascal, C,thường
được dùng để thực hiện các chương trình máy tính, và chúng đã phát triển
một cách kỳ điệu. Tương tự thế, trong lĩnh vực hệ thống số, các nhà thiết kế
cảm thấy cần phải có một ngôn ngữ chuẩn để mô tả các mạch số, chính vì vậy
mà ngôn ngữ mô tả phần cứng HDL (Hardware Description Languages) ra
đời.
Ngôn ngữ mô tả phần cứng HDL là ngôn ngữ lập trình mềm dùng để mô
tả hoạt động mong muốn của phần cứng. HDL tạo điều kiện để mô tả phần
cứng ở mức hành vi trừu tượng và mô hình cấu trúc phần cứng.
Trong mô hình hành vi trừu tượng, ngôn ngữ mô tả phần cứng tạo điều
kiện để dễ dàng cho việc mô tả trừu tượng hành vi của phần cứng đối với các
mục đích đặc tả (chỉ rõ chi tiết kỹ thuật). Hành vi này không bị chi phối bởi
các khía cạnh cấu trúc hoặc thiết kế của ý định phần cứng.
Mô hình cấu trúc phần cứng có khả năng được mô hình hóa trong ngôn
ngữ mô tả phần cứng mà không cần quan tâm đến hành vi của thiết kế.
Hành vi của phần cứng có thể được mô hình và được miêu tả ở mức trừu
tượng khác nhau trong suốt quá trình thiết kế. Các mô hình mức cao mô tả
một cách trừu tượng hoạt động của phần cứng, trong khi đó các mô hình mức
càng thấp sẽ bao gồm càng nhiều chi tiết hơn, chẳng hạng như suy ra được
cấu trúc của phần cứng. Với HDL các nhà thiết kế mạch ngày nay trở thành
các nhà lập trình để tạo ra các IC chuyên dụng, rút ngắn thời gian để thiết kế
một IC chuyên dụng.
Cách nối dây
HDL có nhiều ưu điểm so với kiểu thiết kế mạch truyền thống:
108
v Các thiết kế có thể được mô tả một cách rất trừu tượng bằng cách sử
dụng HDL. Các nhà thiết kế có thể viết mô tả RTL mà không cần lựa
chọn một đặc tính công nghệ sản xuất nào, vì các công cụ tổng hợp
logic có thể tự động chuyển đổi thiết kế qua một công nghệ sản xuất
bất kỳ theo yêu cầu. Nếu một công nghệ mới xuất hiện, các nhà thiết
kế cũng không cần thiết kế lại mạch của họ. Họ dễ dàng đưa mô tả
RTL vào công cụ tổng hợp logic và tạo ra một netlist mức cổng mới,
sử dụng đặc tính công nghệ sản xuất mới. Công cụ tổng hợp logic sẽ
tối ưu mạch điện trong phạm vi điều chỉnh phù hợp với công nghệ
mới.
v Bằng cách thiết kế với HDL, chức năng kiểm tra thiết kế có thể diễn
ra sớm hơn trong chu trình thiết kế. Từ khi người thiết kế làm việc ở
mức RTL, họ đã có thể tối ưu và thay đổi mô tả RTL cho đến khi nó
đạt được mức chức năng mong muốn. Hầu hết các lỗi thiết kế được
giới hạn tại điểm này, điều này có ý nghĩa làm giảm thời gian của chu
kỳ thiết kế bởi vì xác suất gặp lỗi sau thời điểm tạo netlist hoặc layout
vật ý là rất nhỏ.
v Việc thiết kế với HDL tương tự như chương trình máy tính. Một mô
tả văn bản với các đoạn giải thích làm cho việc phát triển và sửa lỗi
mạch dễ dàng hơn. Nó cũng tạo nên một hình dung của thiết kế, so
sánh với sơ đồ mạch mức cổng.
Nền tảng của thiết kế HDL đã có, cùng với sự tăng nhanh độ phức tạp
của các mạnh điện và công cụ EDA tinh vi, HDL bây giờ là phương thức tối
ưu cho các thiết kế số lớn, hầu như không một nhà thiết kế mạch số nào bỏ
qua nền tảng thiết kế HDL.
4.3. Các mô hình và bài tập ứng dụng
4.3.1. Điều khiển van điện từ 2 cuộn dây
a. Lời giải thích:
Các chú thích được đưa vào với mục đích giải thích các câu lệnh, hay
chỉ rõ mục đích, nhằm tăng tính dễ đọc, dễ sửa lỗi và phát triển chương trình.
Có hai cách viết chú thích.
v Cách 1: Chú thích được viết trên một hàng thì bắt đầu với ký hiệu “ //
” và lời chú thích
v Cách 2: Chú thích trên nhiều hàng thì bắt đầu chú thích với ký hiệu
“/*” và kết thúc với ký hiệu “ */ ”
Ví dụ:
// chú thích trên một hàng
/* chú thích trên nhiều hàng */
b. Hằng số:
Có hai kiểu viết hằng số trong Verilog là sized và unsized.
109
Hằng số kiểu sized: khai báo hằng số kiểu sized thì ta quan tâm đến tầm
giá trị của hằng số. Có thể coi hằng số có kiểu sized như hằng số có kiểu.
Dạng biểu diễn: ‘
Trong đó:
v : được biểu diễn dưới dạng số thập phân để chỉ số bit tối
đa của hằng số.
v : chỉ hệ cơ số
v : Chứa giá trị hằng số và phải phù hợp với <base
format>
Ví dụ:
4’b1111; //đây là số nhị phân 4 bit
12’habc; //đây là số thập lục phân 12 bit
16’d255; // đây là số thập phân 16 bit
Hằng số kiểu unsized: Khai náo hằng số kiểu unsized thì không quan
tâm đến tầm giá trị của hằng số. Ta có thể coi hằng số kiểu unsized như hằng
số không có kiểu.
Dạng biểu diễn: ‘
Nếu không có thì ngầm định là thập phân. Do không
khai báo nên số bit tối đa phụ thuộc vào trình mô phỏng, trình biên
dịch và có giá trị bit tối thiểu là 32 bit.
Ví dụ:
23456; // đây là số thập phân 32 bit
‘hc3; // đây là số hex 32 bit
‘o21; // đây là số octan 32 bit
c. Giá trị tùy định và tổng trở cao:
Verilog có hai ký hiệu biểu diễn giá trị tùy định và tổng trở cao, là những
giá trị quan trọng trong thiết kế mạch số:
Giá trị tùy định ký hiệu là “ x ”, và giá trị tổng trở cao ký hiệu là “ z ”.
Ví dụ:
12’h13x; //đây là số hex 12 bit, 4 bit thấp có giá trị tùy định
2’bzz; //đây là số nhị phân 2 bit có giá trị tổng trở cao
d. Số âm:
Số âm có thể được biểu diễn bằng cách đặt một dấu trừ phía trước trị số
chỉ kích thước. Các hằng số kích thước luôn luôn dương. Giá trị không hợp lệ
khi ta đặt dấu trừ giữa và .
Ví dụ:
-6’d3; //số âm 3
110
-4’d-2; //cách biểu diễn không hợp lệ
e. Chuỗi ký tự:
Là một loạt các ký tự nằm trong dấu ngoặc kép “ ”. Chuỗi phải nằm
trong một hàng và không chứa ký tự Enter. Các ký tự trong chuỗi có thể là mã
thoát, chuỗi được xử lý như các giá trị liên tục trong bảng mã ASCII.
f. Kí tự gạch dưới và dấu hỏi:
Một kí tự gạch dưới “-” được chấp nhận bất kỳ đâu trong một số ngoại
trừ ký tự đầu tiên. Ký tự gạch dưới được cho vào dùng để tăng tính dễ đọc của
các con số và được bỏ đi trong trình biên dịch của Verilog.
Một dấu chấm hỏi “?” trong Verilog được sử dụng thay cho z trong biểu
diễn số.
Ví dụ:
12’b1111_0000_1100; //dùng thêm các ký tự gạch dưới cho dễ đọc
4’b10?? ; //tương dươi với 4’b10zz
4.3.2. Điều khiển hệ thống cung cấp khí nén.
a. Giá trị thiết lập:
Trong Verilog hỗ trợ bốn giá trị (bảng 6.1) và tám mức độ mạnh để mô
tả các chức năng của phần cứng thực.
Bảng 6.1: Các giá trị thiết lập
0 Mức không, hoặc điều kiện không thỏa
1 Mức một, hoặc điều kiện đúng
X Giá trị tùy định
Z Trạng thái tổng trở cao, hoặc trạng thái động
Tám mức thường được sử dụng để giải quyết xung đột giữa các tín hiệu
khác nhau trong mạch số. Giá trị 0 và 1 có thể có thêm mức độ ưu tiên theo
bảng 6.2.
Bảng 6.2: Các mức ưu tiên
Mức ưu tiên Độ ưu tiên
111
Mức ưu tiên Loại Cao nhất
Supply Driving
Strong Driving
Pull Driving
Large Storage
Weak Driving
Medium Storage
Small Storage
hightz High
Impedance
Thấp nhất
Hai tín hiệu có mức độ ưu tiên cùng điều khiển một đường dây, tín hiệu
có độ ưu tiên cao sẽ được chọn. Ví dụ, nếu hai tín hiệu có độ ưu tiên là
strong1 và weak0 xung đột, kết quả được giải quyết là strong1. Nếu hai tín
hiệu có mức ưu tiên bằng nhau, thì kết quả là không xác định.
b. Kiểu net:
Dùng để mô tả sự kết nối trong các mạch phần cứng thực. Kiểu net thực
sự là tên của các đường kết nối trong mạch.
Kiểu net thường được khai báo bằng từ khóa wire. Giá trị mặc định là z
và có độ rộng là 1 bit.
Chú ý là net không phải là từ khóa, mà là một lớp dữ liệu như wire,
wand, wor, tri, triand, trior, trireg,trong đó, wire được sử dụng thường
xuyên nhất
wire
Ví dụ:
wire a; //khai báo dây a trong mạch
c. Kiểu reg:
Biến kiểu reg dùng để lưu trữ giá trị như một thanh ghi. Giá trị được lưu
trữ cho đến khi có giá trị khác ghi đè lên nó. Không được nhầm lẫn kiểu thanh
ghi trong Verilog với các thanh ghi phần cứng trong mạch thực. Trong
Verilog, thanh ghi có nghĩa là một biến lưu dữ liệu, không cần xung clock
như thanh ghi phần cứng. Giá trị các thanh ghi có thể thay đổi bất kì lúc nào.
Các kiểu thanh ghi thông thường được khai báo bởi từ khóa reg. Giá trị
mặc định là x, độ rộng mặc định là 1 bit.
reg ;
112
Ví dụ:
reg a; //khai báo biến a để lưu dữ liệu
initial
begin
a = 1’b1; //cho biến a lưu giá trị 1
#100 a = 1’b0; //sau 100 đơn vị thời gian cho a lưu giá trị 0
end
d. Kiểu Vector:
Net và reg có thể được khai báo như một vector (độ rộng nhiều bit). Biến
kiểu vector khai báo dạng sau [MSB:LSB], bit có trọng số cao nhất luôn luôn
nằm bên trái ngoặc vuông.
[MSB:LSB] ;
Ví dụ:
wire [7:0] a; //khai báo biến a kiểu net với độ rộng 8 bit
reg [9:0] b; //khai báo biến b kiểu reg với độ rộng 10 bit
e. Kiểu mảng:
Mảng là một biến cấu trúc trong đó có nhiều phần tử cùng kiểu, mỗi
phần tử là một biến của mảng. Mỗi biến thành phần này là một biến bình
thường và chỉ để phân biệt giữa phần tử này với phần tử kia. Như vậy, để truy
xuất tới một phần tử của mảng ta cần biết được chỉ số của nó. Verilog chỉ cho
phép biến mảng có kiểu là reg, integer, time, real, realtime và vector. Verilog
chỉ cho phép định nghĩa mảng một chiều, số phần tử trên một chiều gọi là
kích thước của chiều đó.
[MSB:LSB] ;
Ví dụ:
reg [7:0] port_a [0:7]; /* khai báo kiểu mảng có 8 phần tử,
mỗi phần tử có độ rộng 8 bit */
integer counter [0:7]; /* khai báo kiểu mảng có 8 phần tử,
mỗi phần tử có độ rộng 1 bit */
counter [4]; //truy suất phần tử thứ 5 của mảng counter
f. Các kiểu dữ liệu Real, Integer và Time Register:
Integer là kiểu dữ liệu thường được dùng cho việc đếm. Các biến được
khai báo bằng từ khóa integer. Mặc dù có thể sử dụng reg theo cách tương tự,
nhưng sẽ thuận lợi hơn nếu sử dụng integer cho mục đích đếm, mặc định độ
113
rộng của integer phụ thuộc vào độ rộng đơn vị nhớ của hệ thống, ít nhất là 32
bit.
integer ;
Ví dụ:
integer counter; //mục đích thông thường sử dụng trong bộ đếm
Real là các biến số thực được khai báo bằng từ khóa real, các biến số
thực không có giới hạn, giá trị mặc định là 0. Khi giá trị biến được chuyển
sang dạng số nguyên, số thực được làm tròn đến giá trị số nguyên nhỏ nhất.
real ;
Ví dụ:
real a; //khai báo biến số thực a
initial
begin
a = 4e10; //a được gán giá trị theo số mũ
a = 2.13; //a được gán giá trị 2.13
end
Time là một kiểu dữ liệu đặc biệt dùng để khai báo biến kiểu thời gian.
Một biến thời gian được khao báo bằng từ khóa time. Độ rộng của biến ít nhất
là 64 bit. Hàm chức năng $time được dùng để lấy thời gian mô phỏng tức
thời.
time ;
Ví dụ:
time save_s; //khai báo một biến thời gian
initial
save_s = $time; //lưu lại thời gian mô phỏng tức thời
g. Kiểu chuỗi:
Chuỗi được lưu trong reg. Mỗi biến phải đủ rộng để chứa chuỗi, mỗi kí
tự trong chuỗi dài 1 byte. Nếu độ rộng thanh ghi chứa chuỗi rộng hơn chiều
dài chuỗi thì verilog sẽ lấp đầy bằng giá trị 0. Nếu độ rộng thanh ghi nhỏ hơn,
verilog sẽ bỏ bớt kí tự chuỗi. Vì vậy, phải luôn khai báo chuỗi có độ rộng lớn
hơn hoặc bằng độ rộng cần thiết.
Ví dụ:
reg [8*8:1] bien_chuoi; //khai báo biến rộng 9 byte
initial
bien_chuoi = “hello hdl”; //chuỗi có thể chứa trong biến
114
chuỗi có thể chứa những mã thoát sau:
Bảng 6.3: Bảng mã thoát
Mã thoát Chức năng
\n Xuống dòng
\t Tab
%% %
\\ \
\” ”
h. Khai báo hằng số
Verilog cho phép khai báo hằng số trong module bằng từ khóa
parameter. Các giá trị hằng số có thể thay đổi trong quá trình thực hiện
module bằng việc dùng phát biểu defparam. Trong verilog còn có hằng số cục
bộ, là hằng số được định nghĩa bằng từ khóa localparam, giá trị của nó không
bị thay đổi bằng phát biểu defparam, và được sử dụng để bảo vệ chống lại
việc vô ý định lại giá trị hằng số.
parameter = ;
Ví dụ:
parameter a = 5; //định nghĩa hằng port a
localparam b = 4’h5, c =4’h8; //định nghĩa hằng số cục bộ4.3.3 Đieቹ u khieቻ n hệ thoቷ ng cung caቷ p thuỷ lực
a. Chỉ thị hệ thống:
Verilog cung cấp các chỉ thị để hệ thống thực hiện các nhiệm vụ như
hiển thị lên màng hình, theo dõi giá trị của các đường dây, dừng, và kết thúc
chương trình. Các chỉ thị bắt đầu bằng $. Ở đây, trình bày các chỉ
thị hệ thống thường dùng nhất.
Để hiển thị thông tin ta dùng hàm $dislay, lúc này hệ thống sẽ hiển thị
giá trị của biến, hoặc chuỗi hay biểu thức.
Cách dùng: $dislay (p1,p2,,pn);
P1,p2,..,pn có thể là chuỗi hay biến, hoặc biểu thức. Dạng $dislay rất
giống với printf trong ngôn ngữ C. Chuỗi hiển thị được định dạng theo các
quy định cho trong bảng 6.4
Bảng 6.4: Bảng chỉ thị hệ thống
Mã định dạng Hiển thị
115
%d hay %D Hiển thị giá trị theo cơ số 10
%b hay %B Hiển thị giá trị theo kiểu nhị phân
%s hay %S Hiển thị chuỗi
%h hay %H Hiển thị biến theo cơ số 16
%c hay %C Hiển thị kí tự ASCII
%m hay %M Hiển thị theo thứ bậc
%v hay %V Hiển thị theo mức ưu tiên
5o hay %O Hiển thị theo hệ cơ số 8
%t hay %T Hiển thị thời gian hiện hành
%e hay %E Hiển thị theo kiểu khoa học (ví dụ 3e10)
%f hay %F Hiển thị số thực theo kiểu thập phân
%g hay %G Hiển thị số thực theo kiểu khoa học hoặc thập
phân, sao cho ngắn nhất
Để theo dõi thông tin, verilog cung cấp một cơ chế theo dõi sự thay đổi
của tín hiệu, đó là chỉ thị $monitor.
Cách dùng: $monitor (p1,p2,..,pn);
Định dạng của $monitor cũng giống như $dislay, $monitor chỉ cần gọi
một lần, sẽ hiển thị liên tục các giá trị của biến hay tín hiệu khi có bất kì sự
thay đổi nào. Chỉ một danh sách theo dõi hoạt động tại một thời điểm, nếu có
nhiều hơn một chỉ thị $monitor trong quá trình mô phỏng, thì chỉ thị $monitor
cuối cùng sẽ hoạt động.
Hai chỉ thị thường được sử dụng để mở hoặc tắt các chức năng theo dõi
là $monitoron và $monitoroff.
Quá trình theo dõi mặc định được bắt đầu cùng với việc mô phỏng,
nhưng có thể được mở và tắt trong quá trình mổ phỏng bằng hai chỉ thị trên.
Để dừng và kết thúc mô phỏng, verilog cung cấp chỉ thị $stop.
Cách dùng: $stop;
Chỉ thị $stop được sử dụng để dừng quá trình để sửa lỗi, thay đổi tín hiệu
trong thiết kế,..đưa quá trình mô phỏng vào chế độ treo.
Chỉ thị $finish dùng để kết thúc mô phỏng.
Cách dùng: $finish;
116
b. Chỉ thị biên dịch:
Verilog cung cấp một số chỉ thị biên dịch. Tất cả các chỉ thị được định
nghĩa bởi cấu trúc ‘. Hai chỉ thị biên dịch hữu ích nhất là ‘define và
‘inclucde.
‘define dùng để định nghĩa macro trong verilog, nó giống như #define
trong ngôn ngữ C.
‘include dùng để cho phép đưa vào một file mã nguồn verilog trong
chương trình khác trong quá trình biên dịch. Cách làm việc giống như
#include trong C. Chỉ thị này thường dùng để thêm vào nội dung toàn cục
hoặc các định nghĩa thông dụng.
4.3.4. Điều khiển hệ thống thông gió
a.Các thành phần trong một module:
Module là một cấu trúc cơ bản của ngôn ngữ verilog. Mọi thành phần
trong verilog đều chứa trong module. Một module có khả năng giao tiếp với
các module khác thông qua các port. Cấu trúc bên trong của module này
không thể truy suất từ các module khác, đây là một tính chất rất linh hoạt của
verilog giúp người thiết kế có thể thay đổi cấu trúc bên trong của module mà
không làm ảnh hưởng đến các thiết kế khác.
Cấu trúc của một module trong verilog như hình 6.3.
Hình 6.3 – Cấu trúc module trong verilog
Định nghĩa một module bắt đầu bằng từ khóa module và phải kết thúc
bằng từ khóa endmodule. Mỗi module phải có tên riêng đại diện cho module
đó, khai báo các port (nếu có), tùy chọn khai báo các thông số (parameter)
phải đặt ở đầu module. Port list và port chỉ có khi module có bất kì cổng giao
tiếp với môi trường bên ngoài. Có năm thành phần bên trong module là: khai
117
báo biến, các câu lệnh mức dataflow, tạo các module thấp hơn, khối lệnh hành
vi, và nhiệm vụ - chức năng của module. Các thành phần có thể đặt bất kỳ
đâu, bất kỳ vị trì nào bên trong module. Verilog cho phép ghép nhiều module
được định nghĩa trong cùng một file. Các module có thể được định nghĩa tại
bất kì vị trí nào của file.
b.Port :
Port cung cấp giao diện, qua đó module có thể truyền thông với môi
trường bên ngoài. Các thành phần bên trong module không nhìn thấy được từ
môi trường bên ngoài. Sự thay đổi các thành phần bên trong không ảnh hưởng
đến môi trường bên ngoài, miễn là giao diện không bị thay đổi. Điều này cung
cấp tính linh hoạt mạnh cho người thiết kế.
Danh sách các port là tùy chọn, và được khai báo khi định nghĩa module.
Nếu module không trao đổi bất kỳ tín hiệu nào với bên ngoài, thì ta không cần
danh sách các port.
Tất cả các port trong danh sách port đều phải được khai báo trong
module, mỗi port trong khai báo có thể thuộc một trong ba dạng sau:
Từ khóa Loại port
input Port ngõ vào
output Port ngõ ra
inout Port hai chiều (vào/ra)
Lưu ý là các port input và inout thường được khai báo dưới dạng wire,
nếu port output lưu trữ giá trị của port thì phải được khai báo dưới dạng reg.
Có nhiều quy luật chi phối các kết nối port khi các module được thể hiện
bên trong module khác, Trình mô phỏng sẽ báo lỗi nếu ta vi phạm các quy
luật kết nối port. Các quy luật được tóm tắt như sau:
Hình 6.4 – Nguyên tắc kết nối port
118
v Input: ở bên trong thì port input luôn luôn có kiểu net, còn bên ngoài
port input có thể được kết nối đến một biến kiểu reg hoặc kiểu net.
v Ouput: ở bên trong port output có kiểu reg hoặc kiểu net, còn bên noài
port output phải luôn luôn được nối với biến kiểu net và không được
nối với biến kiểu reg.
v Inout: ở bên trong port inout phải luôn luôn có kiểu net, còn ở bên
ngoài port inout phải luôn luôn được nối với kiểu net.
v Tương thích độ rộng: việc nối các mục bên trong và bên ngoài có kích
thước khác nhau là hợp lệ khi thực hiện nối port giữa các module, và
lúc này sẽ có kèm theo cảnh báo (warning).
v Port không kết nói: verilog cho phép port duy trì không kết nối. Một
vài port ngõ ra có thể chỉ đơn thuần dùng để gỡ rối.
Để kết nối đến tín hiệu bên ngoài, thì verilog hỗ trợ hai phương pháp
thực hiện kết nối giữa các tín hiệu được chỉ rõ trong thể hiện module và các
port trong định nghĩa module. Hai phương pháp này không được trộn lẫn với
nhau.
v Kết nối theo danh sách thứ tự: kết kết nối này cho thấy sự tương tác
1–1 rất trực quan. Cụ thể, tín hiệu trong module chính phải truyền vào
module con theo đúng thứ tự các port đã được module con định nghĩa
sẵn.
Ví dụ:
module Top;
//Declare connection variables
reg [3:0]A,B;
reg C_IN;
wire [3:0] SUM;
wire C_OUT;
//Instantiate fulladd4, call it fa_ordered.
//Signals are connected to ports in order (by position)
fulladd4 fa_ordered(SUM, C_OUT, A, B, C_IN);
...
...
Endmodule
v Kết nối theo tên: các tín hiệu của module chính truyền vào module
con không cần đúng thứ tự, mà phải phù hợp với tên. Đây là ưu điểm
119
của verilog, bởi vì danh sách các port có thể rất dài, khi đó việc kết
nối theo vị trí rất dễ bị lỗi.
Ví dụ:
// kết nối đến module con theo tên
fulladd4 fa_byname(.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN),
.a(A),);
// Các port không sử dụng có thể bỏ qua, không cần viết tên
vào
fulladd4 fa_byname(.sum(SUM), .b(B), .c_in(C_IN), .a(A),);
4.3.5. Điều khiển động cơ thuận nghịch
Loại cổng AND/OR:
Các cổng and/or có nhiều ngõ vào và một ngõ ra. Tên đầu tiên trong
danh sách các port kết nối với cổng là một ngõ ra, và các tên còn lại là các
ngõ vào. Các cổng and/or cơ bản trong verilog là and, or, xor, nand, nor và
xnor. Kí hiệu của các cổng and/or hai ngõ vào và một ngõ ra như hình 6.5.
Hình 6.5 – Ký hiệu các loại cổng and/or
Người thiết kế dễ dàng thêm các ngõ vào khi thực hiện các cổng tương
ứng. Ta có thể không cần chỉ rõ tên thể hiện của các cổng, điều này cho phép
thực hiện vài trăm cổng mà không cần đặt tên.
Ví dụ:
wire OUT, IN1, IN2;
// các cổng cơ bản
and a1(OUT, IN1, IN2);
nand na1(OUT, IN1, IN2);
or or1(OUT, IN1, IN2);
120
nor nor1(OUT, IN1, IN2);
xor x1(OUT, IN1, IN2);
xnor nx1(OUT, IN1, IN2);
// có nhiều hơn 2 ngõ, đây là cổng nand 3 ngõ vào
nand na1_3inp(OUT, IN1, IN2, IN3);
// cổng không cần tên
and (OUT, IN1, IN2);
Bảng 6.5 – Bảng sự thật các cổng
Loại cổng Bufif/Notif:
Cổng bufif/notif có một ngõ vào và có một hoặc nhiều ngõ ra. Các cổng
cơ bản được cung cấp bởi verilog là bufif và notif, ngõ vào là in và ngõ ra là
out. Các loại cổng bufif/notif được thể hiện trong verilog là bufif1, notif1,
bufif0 và notif0.
121
Hình 6.6 – Ký hiệu các loại cổng bufif và notif
Các loại cổng này chỉ truyền tín hiệu khi có tín hiệu điều khiển, và sẽ ở
trạng thái tổng trở cao khi không có tín hiệu điều khiển.
Ví dụ:
//cổng bufif.
bufif1 b1 (out, in, ctrl);
bufif0 b0 (out, in, ctrl);
//cổng notif
notif1 n1 (out, in, ctrl);
notif0 n0 (out, in, ctrl);
Các ví dụ:
v Bộ dồn kênh 4-1 (4-1 multiplexer):
Sơ đồ cổng logic
Mô tả trực quan các cổng trong verilog:
// bộ dồn kênh 4-1, với các ngõ in/out như trong sơ đồ cổng
module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);
// khai báo các in/out
output out;
122
input i0, i1, i2, i3;
input s1, s0;
// Khai báo các dây nối bên trong
wire s1n, s0n;
wire y0, y1, y2, y3;
// hiện thực các cổng
//Tạo các tín hiệu s1n và s0
not (s1n, s1);
not (s0n, s0);
// Các cổng and 3 ngõ vào
and (y0, i0, s1n, s0n);
and (y1, i1, s1n, s0);
and (y2, i2, s1, s0n);
and (y3, i3, s1, s0);
// Cổng or 4 ngõ vào.
or (out, y0, y1, y2, y3);
endmodule
v Bộ cộng 1 bit:
Sơ đồ cổng logic
Mô tả trong verilog:
// Khai báo bộ cộng 1 bit
module fulladd (sum, c_out, a, b, c_in);
// Khai báo các cổng IO
output sum, c_out;
input a, b, c_in;
// Các dây nối bên trong
wire s1, c1, c2;
// Hiện thực các cổng logic
xor (s1, a, b);
123
and (c1, a, b);
xor (sum, s1, c_in);
and (c2, s1, c_in);
xor (c_out, c2, c1);
endmodule
Các file đính kèm theo tài liệu này:
- giao_trinh_vi_mach_so_lap_trinh_trinh_do_trung_capcao_dang_n.pdf