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
CHƯƠNG 1: TỔNG QUAN VỀ VERILOG 1.1 Các thuật ngữ Verilog • Khoảng trắng: khoảng cách từ, chứa kí tự khoảng trắng • thích: Ghi lại chức bước thực • Định danh: Tên biến, tên module hay 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 người lập trình đặt, tên biến I/O port in-out mà chương trình sử dụng • Phép gán liên tục – assign Đặt bên khối always@ initial assign tên biến = biểu thức; Khai báo wire : wire: đường dây dẫn mạch điện dùng để kết nối cổng hay • module wire [msb:lsb] tên biến wire; Khai báo reg : • reg: reg (register) đối tượng liệu mà chứa có giá trị từ thủ tục gán • Reg dùng hàm 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ố Verilog 2.1.1 Biểu diễn giá trị logic Verilog Biểu diễn giá trị logic: Verilog HDL có giá trị logic LOGIC X or x Z or z Mô tả Mức 0, điều kiện sai Mức 1, điều kiện 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ó số: số nguyên khai báo dùng số định (hệ 2, 8, 10, 16) integer_name = size 'base value; Trong đó: • • • • integer_name: tên số nguyên cần dùng size: số bit nhị phân (biểu diễn số nguyên) base: số (theo đó: b – binary; o – octal; d – decimal; h - hexadecimal) value: giá trị thiết lập Ví dụ: 2.2 Tốn tử Verilog 2.2.1.Tốn tử số học: • • • • • + :cộng theo bit - :trừ theo bit * : nhân / :chia % : chia lấy dư Lưu ý: Nếu bit toán hạng toán tử số học x hay z kết x 2.2.2 Toán tử quan hệ: So sánh toán hạng trả giá trị (true/false) • • • • > (lớn ) < ( nhỏ ) >= (lớn ) Dịch phải 2.2.8 Toán tử điều kiện: “?:” kếtquả = (điều kiện ) ? kết điều kiện : kết điều kiện sai; Ví dụ: 2.2.9 Tốn tử ghép nối: • Ghép hai nhiều tốn hạng thành vectơ lớn • Sử dụng k{ hiệu “{}” dùng dấu phảy “ , ” để ngăn cách biểu thức ({a1, a2,… , aN}) • Những số khơng biết kích thước khơng thể thực kết nối 2.2.10 Tốn tử nhân bản: • Tạo nhiều mục chọn • Sử dụng k{ hiệu “{}” dùng dấu phảy “ , ” để ngăn cách biểu thức {n{ mục chọn }} • Trong đó: n - số nhân 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 liệu: Câu lệnh dùng assign, dùng để gán giá trị hay biểu thức đến biến kiểu wire 2.3.2 Mơ hình hành vi: Hành vi thiết kế mô tả cách sử dụng cấu trúc thủ tục: • Câu lệnh always: câu lệnh thực lặp lại nhiều lần • Câu lệnh initial: câu lệnh thực thi lần (dùng cho mơ phỏng) Chỉ có kiểu liệu ghi (reg) mới gán giá trị câu lệnh 2.3.3 Mơ hình cấu trúc: Mức cổng mức mơ tả hệ thống dạng liên kết cổng logic kèm theo mơ tả định thời (timing) có Mức sử dụng thành phần mơ hình cổng logic, Flip-Flop cell sẵn có để ghép nối với tạo thành chức mong muốn Việc kết nối xác định cách sử dụng net Cú pháp: khai báo cổng định nghĩa sẵn Verilog Têntừkhóa têncổng(output,input1,input2,…inputN); CHƯƠNG 3: CẤU TRÚC CỦA MODULE 3.1 Cách gọi module con: Khi mô-đun khởi tạo, phải xác định kết nối đến cổng module Có hai cách gọi để kết nối cổng module là: • Kết nối theo thứ tự cổng: thứ tự cổng module phải phù hợp với thứ tự • xuất cổng module 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ổng module top Port_name: tên cổng module 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 luôn kiểu net; bên ngồi khai báo kiểu net reg • Output: Bên ngồi ln kiểu net, bên kiểu net reg • Cổng khơng kết nối cho phép sử dụng dấu “ , ” Ví dụ: CHƯƠNG 4: MƠ TẢ HÀNH VI 4.1 Khối always initial a) Khối initial: • Chỉ thực thi lần từ lúc bắt đầu (của q trình mơ phỏng) • Khối initial dùng cho thực mã testbench • Một khối initial chứa nhiều câu lệnh phải kèm theo câu lệnh begin – end fork – join Ví dụ: b) Khối always: • Được thực lặp lại nhiều lần • Một khối always chứa nhiều câu lệnh phải kèm theo câu lệnh begin – end fork – join Cú pháp: Trong đó: • Sensitivity_list: danh sách tín hiệu kích thích • Mạch tổ hợp: ngõ vào • Mạch tuần tự: xung clk, ngõ vào điều khiển… 4.2 Câu lệnh khối lệnh gán thủ tục Câu lệnh khối nhóm hay nhiều câu lệnh mà cú pháp tác động giống câu lệnh đơn Có loại phát biểu khối Verilog: • Khối (begin…end): câu lệnh thực thi • Khối song song (fork…join): câu lệnh thực thi lúc a) Khối (begin…end): • Các câu lệnh thực thi • Khối lệnh kết thúc câu lệnh cuối thực thi • Một khối begin…end đặt nhãn cách tùy chọn, có nhãn đặt, khai báo cục phải kiểu reg • Một khối begin…end phải chứa câu lệnh b) Khối song song (fork…join): Các câu lệnh thực thi song song 4.3 Lệnh gán thủ tục: Sử dụng để gán đến liệu kiểu reg, chia 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 tuần tự, thực xong lệnh gán thực lệnh gán Kiểu gán non-blocking: (thường dùng cho mạch tuần tự) [tên biến]