Thiết kế logic số
(Digital Logic design)
Bộ môn Điện tử máy tính
08/2018
1
Chủ đề 2
Tổng quan về Verilog HDL
Bộ môn Điện tử máy tính
08/2018
2
Nội dung
2.1 Verilog là gì?
2.2 Các thuật ngữ trong
Verilog
2.3 Cấu trúc chương trình
dùng ngôn ngữ Verilog
2.4 Bài tập
3
2.1. Verilog là gì?
Verilog là gì?
Ngôn ngữ mô tả phần cứng (Hardware Description Language)
được sử dụng trong việc thiết kế các các hệ thống số, các
mạch tích hợp...
Mọi kết cấu phần cứng đều có thể biểu diễn dưới dạng các
lệnh phần mềm, các hàm và thủ tục.
Cùng với ngôn ngữ VHDL, Verilog là một trong hai ngôn ngữ
mô tả phần cứng phổ biến nhất hiện nay.
4
2.1. Verilog là gì?
Lịch sử verilog?
Verilog Verilog-HDL ra đời năm 1984, được phát minh bởi Getway
Design Automation.
Chuẩn hóa: IEEE 1364 năm 1995, IEEE 1364-2001 năm 2001 – được
sử dụng rộng rãi nhất.
Năm 2005, SystemVerilog được giới thiệu như là một sự mở rộng
của Verilog.
Năm 2009, IEEE kết hợp chuẩn Verilog với SystemVerilog thành một
chuẩn duy nhất: IEEE 1800-2009.
Chuẩn mới nhất là: IEEE 1800-2012
Verilog cho phép mô tả hardware không chỉ ở mức cổng (gate level),
mức chuyển dịch thanh ghi (register-transfer level - RTL), mà còn cho
phép mô tả theo thuật toán.
5
2.2. Các thuật ngữ trong Verilog
Khoảng trắng:
Dùng để ngăn từ
Chứa những kí tự đặc biệt như kí tự space, kí tự tab, kí tự
xuống dòng
Một lệnh có thể viết trên một dòng hoặc nhiều dòng
Các dòng lệnh kết thúc bằng dấu ;
1 module addbit(a,b,ci,sum,co);
2 input a,b,ci;output sum, co;
3 wire a,b,ci,sum,co;endmodule
Không nên viết
6
2.2. Các thuật ngữ trong Verilog
Khoảng trắng:
1 module addbit (
2 a,
3 b,
4 ci,
5 sum,
6 co);
7 input a;
8 input b;
9 input ci;
10 output sum;
11 output co;
12 wire a;
13 wire b;
14 wire ci;
15 wire sum;
16 wire co;
17
18 endmodule
Nên viết
7
2.2. Các thuật ngữ trong Verilog
Chú thích: Dùng để ghi chú những câu lệnh hay đoạn lệnh để
dễ trong việc quan sát trong việc lập trình.
Dùng 2 dấu gạch xiên ‘//’ : // để viết chú thích trên 1 dòng
Dùng /* chú thích */: để viết chú thích nhiều dòng
module HALFADD (A, B, SUM, CARRY);
// Bộ cộng bán phần
input A, B;
output SUM, CARRY;
/* Đây là phần mô tả
mạch thiết kế */
assign SUM = A ^ B;
assign CARRY = A & B;
Endmodule
8
2.2. Các thuật ngữ trong Verilog
Định danh:
Từ định danh do người dùng quy định cho biến số, tên hàm,
tên môđun, tên khối và tên trường hợp.
Bắt đầu bằng các ký tự hoặc dấu gạch dưới
Không được bắt đầu bằng chữ số hoặc dấu $
Đặc biệt trong lập trình Verilog phân biệt chữ hoa với chữ
thường
Từ khóa: là dạng đặc biệt dành riêng để định nghĩa các cấu
trúc ngôn ngữ, được viết bằng chữ thường
reg example;
input a ;
input INPUT;
// reg là từ khóa, example là định danh
// input là từ khóa, a là định danh
// input là từ khóa, INPUT là định danh
9
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Cấu trúc chương trình dùng ngôn ngữ Verilog
Module ModuleName (PortList);
Port declaration
Net declaration
Register declaration
Parameter declaration
Mô tả mạch thiết kế
(…các câu lệnh…)
Endmodule
Module HALFADD (A, B,
SUM, CARRY);
Input A, B;
Output SUM, CARRY;
Assign SUM = A ^ B;
Assign CARRY = A & B;
Endmodule
10
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Khai báo module:
module tên module (tên biến I/O);
module: từ khóa bắt buộc của 1 chương trình verilog
tên module: có thể đặt tùy ý nhưng không được viết chữ số và
một số ký tự đặt biệt ở đầu.
(tên biến I/O): danh sách tất cả các cổng vào/ra của thiết kế,
mỗi cổng cách nhau bởi dấu “,”.
“ ; “ : kết thúc khai báo module cũng như kết thúc các dòng
lệnh.
Kết thúc bằng từ khóa endmodule
11
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Ví dụ:
module and_3 (A,B,C,Y);
module encoder8to3 (I,Y);
A
B
C
2
3
4
1
Y
12
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Khai báo port: Khai báo tất cả các cổng vào ra và độ rộng của
của các cổng đó.Mặc định cổng vào ra sẽ có độ rộng là 1 bit.
input [msb:lsb] biến;
output [msb:lsb] biến;
input: từ khóa để định nghĩa ngõ vào
output: từ khóa để định nghĩa ngõ ra
[msb:lsb]: độ rộng của của các cổng, ngõ vào/ra dạng bus
biến: liệt kê các ngõ vào/ra đã được khai báo trong module
“ ; “ : kết thúc khai báo port.
13
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Ví dụ:
input A,B,C;
output Y;
A
B
C
2
3
4
Y
1
input [7:0] I;
output [2:0] Y;
input [3:0] A,B;
input E;
output [2:0] Y;
SĐK phần cứng?
14
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Ví dụ: mô tả mạch cộng bán phần
module HALFADD (A, B, SUM, CARRY);
input A, B;
output SUM, CARRY;
assign SUM = A ^ B;
assign CARRY = A & B;
- Thực hiện tính toán và gán
- Dùng phép gán liên tục assign
Endmodule
15
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Phép gán liên tục – assign:
Là phép gán cơ bản nhất trong Verilog
Dùng để gán các giá trị cho wire của module, hay là cập nhật
giá trị của các port (wire)
Được đặt bên ngoài khối always@ hoặc initial
Được thực hiện đồng thời
Bất kì thay đổi nào của bên phải phép gán sẽ làm cho giá trị
bên trái thay đổi ngay lập tức.
assign tên biến = biểu thức;
16
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Ví dụ mô tả mạch tổ hợp dùng phát biểu assign?
1. Dùng verilog HDL mô tả mạch số sau:
a. F(A,B,C) = 1 ứng với tổ hợp biến có số lượng biến bằng 1 là
một số chẵn hoặc không có biến nào bằng 1. Các trường hợp
khác thì hàm bằng 0.
b. F(A,B,C,D) = 1 ứng với tổ hợp biến có ít nhất 2 biến bằng 1.
Các trường hợp khác thì hàm bằng 0.
c. Một mạch tổ hợp nhận vào một số nhị phân A=A3A2A1A0
(A0 là LSB) tạo ra ở ngã ra Y ở mức cao khi và chỉ khi
0010
d. Một mạch tổ hợp nhận vào một số BCD, có tên là X. Ngã ra
của mạch lên 1 khi thỏa điều kiện 1 ≤ X ≤5
17
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Sau khi khai báo các cổng chúng ta sẽ khai báo loại biến cho các
cổng vào ra, thường là reg và wire. Nếu không khai báo mặc
định các cổng sẽ có dữ liệu là wire.
Phân biệt giữa wire và reg trong thiết kế verilog:
Trong thiết kế verilog, có hai loại kiểu dữ liệu chủ yếu được
dùng là net và register (dây nối và thanh ghi)
wire là một kiểu dữ liệu sử dụng phổ biến thuộc kiểu net,
dùng cho mạch tổ hợp.
Register: là thành phần lưu trữ dữ liệu, reg có thể dùng cho
cả mạch tổ hợp và mạch tuần tự.
18
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Khai báo wire :
wire [msb:lsb] tên biến wire;
• wire: đường dây dẫn trong một mạch điện và được dùng để
kết nối các cổng hay các module.
wire enable;
wire [7:0] bus;
19
2.3. Cấu trúc chương trình dùng ngôn ngữ Verilog
Cấu trúc chương trình dùng ngôn ngữ Verilog
Khai báo reg :
• reg: reg (register) là đối tượng dữ liệu mà nó chứa có giá trị
từ một thủ tục gán kế tiếp. Reg chỉ được dùng trong hàm và
khối thủ tục.
reg [msb:lsb] tên biến reg;
reg FF1, FF2;
reg [3:0] COUNT;
20
2.4. Câu hỏi ôn tập
21