Tải bản đầy đủ (.docx) (17 trang)

Bài giảng ngôn ngữ mô tả phần cứng verilog

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.4 MB, 17 trang )

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(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


Biểu diễn giá trị logic: Verilog HDL có 4 giá trị logic
LOGIC
0
1
X or x
Z or z

Mô tả
Mức 0, điều kiện sai
Mức 1, điều kiện đúng
Mức tùy định
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.


2.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ụ:


2.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ụ:



2.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


2.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.


2.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);


CHƯƠ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 ;


wire 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ụ:



CHƯƠ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:


Trong đó:
• 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…


4.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ự)


[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


4.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







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




×