CHƯƠNG 1: TỔNG QUAN VỀ VERILOG 1.1. Các thuật ngữ trong Verilog • Khoảng trắng: khoảng cách giữa các từ, chứa các kí tự khoảng trắng • chú thích: Ghi chú lại chức năng hoặc bước thực hiện • Định danh: Tên của biến, tên module hay các khối, hàm, tên trường hợp • Từ khóa: Chữ thường, dùng để định nghĩa cấu trúc ngôn ngữ 1.2. Cấu trúc chương trình dùng ngôn ngữ Verilog module tenmodule(tenbienIO); Khai báo Port Khai báo Kiểu đường dây Khai báo Các parameter Mô tả mạch thiết kế(Câu lệnh) endmodule Khai báo module: module tenmodule(tenbienIO); Trong đó tenmodule do người lập trình đặt, tên biến IO lần lượt là các port inout mà chương trình sử dụng Phép gán liên tục – assign • Đặt bên ngoài khối always hoặc initial assign tên biến = biểu thức; • Khai báo 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 msb:lsb tên biến wire; • 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; CHƯƠNG 2: TOÁN TỬ VERILOG 2.1. Biểu diễn số trong Verilog 2.1.1. Biểu diễn giá trị logic trong Verilog Biểu diễn giá trị logic: Verilog HDL có 4 giá trị logic LOGIC Mô tả 0 Mức 0, điều kiện sai 1 Mức 1, điều kiện đúng X or x Mức tùy định Z or z Trạng thái tổng
Trang 1CHƯƠNG 1: TỔNG QUAN VỀ VERILOG 1.1 Các thuật ngữ trong Verilog
• Khoảng trắng: khoảng cách giữa các từ, chứa các kí tự khoảng trắng
• chú thích: Ghi chú lại chức năng hoặc bước thực hiện
• Định danh: Tên của biến, tên module hay các khối, hàm, tên trường hợp
• Từ khóa: Chữ thường, dùng để định nghĩa cấu trúc ngôn ngữ
1.2 Cấu trúc chương trình dùng ngôn ngữ Verilog
module tenmodule(tenbienI/O);
Khai báo Port
Khai báo Kiểu đường dây
Khai báo Các parameter
Mô tả mạch thiết kế(Câu lệnh)
endmodule
Khai báo module:
module tenmodule(tenbienI/O);
Trong đó tenmodule do người lập trình đặt, tên biến I/O lần lượt là các port in-out mà chương trình sử dụng
Phép gán liên tục – assign
• Đặt bên ngoài khối always@ hoặc initial
assign tên biến = biểu thức;
• Khai báo 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 [msb:lsb] tên biến wire;
• 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;
CHƯƠNG 2: TOÁN TỬ VERILOG 2.1 Biểu diễn số trong Verilog
2.1.1 Biểu diễn giá trị logic trong Verilog
Trang 2Biểu diễn giá trị logic: Verilog HDL có 4 giá trị logic
0 Mức 0, điều kiện sai
1 Mức 1, điều kiện đúng
X or x Mức tùy định
Z or z Trạng thái tổng trở cao
2.1.2 Cách biểu diễn số:
Số có cơ số: số nguyên được khai báo dùng những cơ số nhất định (hệ 2, 8, 10, 16)
integer_name = size 'base value;
Trong đó:
• integer_name: tên của số nguyên cần dùng
• size: số bit nhị phân (biểu diễn số nguyên)
• base: cơ số (theo đó: b – binary; o – octal; d – decimal; h - hexadecimal)
• value: giá trị thiết lập
Ví dụ:
2.2 Toán tử trong Verilog
2.2.1.Toán tử số học:
• + :cộng theo bit
• - :trừ theo bit
• * : nhân
• / :chia
• % : chia lấy dư
Lưu ý : Nếu bất kì bit nào của một toán hạng trong toán tử số học là x hay z thì kết quả là x
Trang 32.2.2 Toán tử quan hệ:
So sánh 2 toán hạng và trả về giá trị 0 hoặc 1 (true/false)
• > (lớn hơn )
• < ( nhỏ hơn )
• >= (lớn hơn hoặc bằng )
• <= (nhỏ hơn hoặc bằng)
2.2.3 Toán tử so sánh bằng:
• == Bằng logic
• != Không bằng logic
Tương tự như toán tử quan hệ, ta có:
• === bằng (so sánh từng bit)
• !== không bằng (so sánh từng bit)
Khi các toán hạng không bằng nhau về chiều dài, thì toán hạng ngắn hơn sẽ thêm số 0 vào
vị trí bit có nghĩa nhất (MSB)
2.2.4 Toán tử logic:
• &&: And logic
• ||: Or logic
• !: Not (bù) logic
Kết quả trả về giá trị 0 hoặc 1 (1 bit đơn)
Chúng có thể làm việc trên biểu thức, số nguyên, hoặc nhóm bit
Toán hạng là vector khác 0 được xem như 1
Lưu ý: Nếu bất kì z bit nào của toán hạng có giá trị x hay z thì toán hạng được xem như x
Ví dụ:
Trang 42.2.5 Toán tử thao tác trên bit (bitwise):
So sánh từng bit hai toán hạng, gồm các toán tử:
• ~ Not – Phép đảo bit
• & And – Phép and theo bit
• ~& Nand – Phép nand theo bit
• | Or – Phép or theo bit
• ~| nor – Phép nor theo bit
• ^ Xor – Phép xor theo bit
• ~^/^~ Xnor – Phép xnor theo bit
Ví dụ:
2.2.6 Toán tử giảm:
Những toán tử giảm hoạt động trên tất cả các bit của toán hạng đơn và kết quả trả về là 1 bit
Gồm các toán tử giống toán tử thao tác trên bit (bitwise)
Ví dụ:
Trang 52.2.7 Toán tử dịch: Gồm các toán tử logic:
• << Dịch trái
• >> Dịch phải
2.2.8 Toán tử điều kiện: “?:”
kếtquả = (điều kiện ) ? kết quả điều kiện đúng : kết quả điều kiện sai;
Ví dụ:
2.2.9 Toán tử ghép nối:
• Ghép hai hoặc nhiều toán hạng thành một vectơ lớn
• Sử dụng k{ hiệu “{}” và dùng dấu phảy “ , ” để ngăn cách các biểu thức ({a1, a2,… , aN})
• Những hằng số không biết kích thước không thể thực hiện kết nối
Trang 62.2.10 Toán tử nhân bản:
• Tạo ra nhiều bản sao của một mục chọn
• Sử dụng k{ hiệu “{}” và dùng dấu phảy “ , ” để ngăn cách các biểu thức {n{ mục chọn }}
• Trong đó: n - số nhân bản của mục chọn
2.3 Các mô hình mô tả mạch dùng Verilog HDL
2.3.1 Mô tả theo mô hình luồng dữ liệu:
Câu lệnh cơ bản được dùng là assign, dùng để gán một giá trị hay biểu thức đến một biến kiểu wire
2.3.2 Mô hình hành vi:
Hành vi của thiết kế được mô tả bằng cách sử dụng cấu trúc thủ tục:
• Câu lệnh always: câu lệnh được thực hiện lặp lại nhiều lần
• Câu lệnh initial: câu lệnh chỉ thực thi 1 lần (dùng cho mô phỏng)
Chỉ có kiểu dữ liệu thanh ghi (reg) mới mới có thể được gán giá trị trong những câu lệnh này
Trang 72.3.3 Mô hình cấu trúc:
Mức cổng là mức mô tả hệ thống dưới dạng liên kết các cổng logic kèm theo mô tả định thời (timing) nếu có
Mức này sử dụng các thành phần mô hình cổng logic, các Flip-Flop hoặc các cell sẵn có để ghép nối với nhau tạo thành chức năng mong muốn
Việc kết nối được xác định bằng cách sử dụng những net
Cú pháp: khai báo các cổng được định nghĩa sẵn trong Verilog
Têntừkhóa têncổng(output,input1,input2,…inputN);
Trang 8CHƯƠNG 3: CẤU TRÚC CỦA 1 MODULE 3.1 Cách gọi module con:
Khi một mô-đun được khởi tạo, phải xác định kết nối đến các cổng của các module
Có hai cách gọi để kết nối cổng các module là:
• Kết nối theo thứ tự cổng: thứ tự các cổng trong module chính phải phù hợp với thứ tự xuất hiện các cổng trong module con
• Kết nối theo tên cổng: tên cổng phải phù hợp với module con, thứ tự không quan trọng
a) Kết nối theo thứ tự:
Tên_module_con Nhãn(signal_1, signal_2,…, signal_N);
b) Kết nối theo tên:
Tên_module_con Nhãn (.port_name_1(signal_1, port_name_2(signal_2,
…,.port_name_n(signal_n);
Trong đó:
• Signal: tên các cổng của module top
• Port_name: tên các cổng của module con
Ví dụ:
module adder_order(S,cout,A,B,cin);
// Input Port Declarations
input [3:0] A ;
input [3:0] B ;
input cin ;
// Output Port Declarations
output [3:0] S ;
output cout ;
// Port Wires
wire [3:0] A ;
wire [3:0] B ;
wire cin ;
wire [3:0] S ;
wire cout ;
// Internal variables
wire c1 ;
wire c2 ;
Trang 9wire c3 ;
// Code Starts Here
addbit u0 (A[0],B[0],cin,S[0],c1);
addbit u1 (A[1],B[1],c1,S[1],c2);
addbit u2 (A[2],B[2],c2,S[2],c3);
addbit u3 (A[3],B[3],c3,S[3],cout);
endmodule
Kết nối theo tên(by port name) :
module adder_name(S,cout,A,B,cin);
// Input Port Declarations
input [3:0] A ;
input [3:0] B ;
input cin ;
// Output Port Declarations
output [3:0] S ;
output cout ;
// Port Wires
wire [3:0] A ;
wire [3:0] B ;
wire cin ;
wire [3:0] S ;
wire cout ;
// Internal variables
wire c1 ;
wire c2 ;
wire c3 ;
// Code Starts Here
addbit u0 (.a(A[0]),.b(B[0]),.ci(cin),.sum(S[0]),.co(c1));
addbit u1 (.a(A[1]),.b(B[1]),.ci(c1),.sum(S[1]),.co(c2));
addbit u2 (.a(A[2]),.b(B[2]),.ci(c2),.sum(S[2]),.co(c3));
addbit u3 (.a(A[3]),.b(B[3]),.ci(c3),.sum(S[3]),.co(cout));
endmodule
3.2 Quy định kết nối port:
• Input: Kết nối bên trong luôn luôn là kiểu net; bên ngoài có thể khai báo kiểu net hoặc reg.
• Output: Bên ngoài luôn là kiểu net, bên trong có thể là kiểu net hoặc reg
• Cổng không kết nối được cho phép sử dụng dấu “ , ”
Ví dụ:
Trang 11CHƯƠNG 4: MÔ TẢ HÀNH VI 4.1 Khối always và initial
a) Khối initial:
• Chỉ thực thi một lần từ lúc bắt đầu (của quá trình mô phỏng)
• Khối initial dùng cho thực hiện mã testbench
• Một khối initial chứa nhiều hơn 1 câu lệnh phải kèm theo câu lệnh begin – end hoặc fork – join
Ví dụ:
b) Khối always:
• Được thực hiện lặp lại nhiều lần
• Một khối always chứa nhiều hơn 1 câu lệnh phải kèm theo câu lệnh begin – end hoặc fork – join
Cú pháp:
Trang 12Trong đó:
• Sensitivity_list: danh sách tín hiệu kích thích
• Mạch tổ hợp: các ngõ vào
• Mạch tuần tự: xung clk, các ngõ vào điều khiển…
Trang 134.2 Câu lệnh khối và lệnh gán thủ tục
Câu lệnh khối nhóm 2 hay nhiều câu lệnh mà cú pháp tác động giống một câu lệnh đơn
Có 2 loại phát biểu khối trong Verilog:
• Khối tuần tự (begin…end): các câu lệnh được thực thi tuần tự
• Khối song song (fork…join): các câu lệnh được thực thi cùng lúc
a) Khối tuần tự (begin…end):
• Các câu lệnh được thực thi tuần tự
• Khối lệnh kết thúc khi câu lệnh cuối cùng được thực thi
• Một khối begin…end có thể được đặt nhãn một cách tùy chọn, nếu có nhãn được đặt, các khai báo cục bộ phải là kiểu reg
• Một khối begin…end phải chứa ít nhất 1 câu lệnh
b) Khối song song (fork…join):
Các câu lệnh được thực thi song song
4.3 Lệnh gán thủ tục:
Sử dụng để gán đến dữ liệu kiểu reg, chia là 2 kiểu gán:
Kiểu gán blocking: (thường dùng cho mạch tổ hợp)
[tên biến] = [biểu thức] ;
Các lệnh thực hiện tuần tự, thực hiện xong lệnh gán này mới thực hiện lệnh gán kế tiếp
Kiểu gán non-blocking: (thường dùng cho mạch tuần tự)
Trang 14[tên biến] <= [biểu thức] ;
Các lệnh gán được thực hiện song song
4.4 Câu lệnh if và case
Trang 154.5 Câu lệnh lặp: xuất hiện trong các khối thủ tục gồm 4 lệnh lặp
Trang 16• Lệnh lặp forever
• Lệnh lặp repeat
• Lệnh lặp while
• Lệnh lặp for
Câu lệnh lặp phải được đặt trong khối begin – end nếu có nhiều hơn 1 câu lệnh được thực thi