hoangquang.dientu@gmail.com Nhận hướng dẫn thiết kế số sử dụng ngôn ngữ Verilog-HDL trên FPGA
BÀI 3: NGÔN NGỮ LẬP TRÌNH PHẦN CỨNG VERILOG HDL (PHẦN 1)
1
FPGA Class
30/05/2013
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
2
FPGA Class
30/05/2013
Quy tắc đặt tên (1)
Quy tắc đặt tên áp dụng cho tên file module, tên tín hiệu, tên
các thông số do người thiết kế tạo ra.
Tên project trùng tên file với module chính (top module).
Top module là module kết nối tất cả các module con (sub-module).
Tên file trùng tên module:
số và dấu gạch dưới và phải bắt đầu với một ký tự chữ.
Không dùng các tên như VDD, VCC, VSS, GND, VREF kể cả
chữ hoa và chữ thường.
Không trùng các từ khóa của ngôn ngữ lập trình. Không kết thúc tên với dấu gạch dưới, không sử dụng
nhiều dấu gạch dưới liên tiếp.
3
FPGA Class
30/05/2013
Quy tắc đặt tên (2)
Không đặt tên trùng nhau. Với tín hiệu clock nên là: clock, clk hoặc ck Với tín hiệu reset nên là: reset, rst hoặc
reset_n, rst_n.
Tên càng gợi nhớ và càng ngắn càng tốt. Tên các tín hiệu, các port, thanh ghi nên đặt
chữ in thường.
Tên các tham số (parameter, define) nên đặt
chữ in hoa.
4
FPGA Class
30/05/2013
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
5
FPGA Class
30/05/2013
Cấu trúc một thiết kế
6
FPGA Class
30/05/2013
Mỗi module là một file. Các module sẽ được kết nối với nhau (ngõ vào module này nối với ngõ ra module khác ở top module). Tên project trùng tên với top module.
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
7
FPGA Class
30/05/2013
Khai báo một module
module example (//input
từ khóa tên module
a, b,
danh sách port //ouput
y);
input a; khai báo tín hiệu ngõ vào
input [2:0] b;
khai báo tín hiệu ngõ ra output y;
reg y; khai báo kiểu tín hiệu ngõ ra
---------------------
các hàm và lệnh always, assign, case, if, for
---------------------
8
FPGA Class
30/05/2013
kết thúc module endmodule
Ví dụ về khai báo module
Đoạn code mô tả bộ mux 2 sang 1 Mux 2 sang 1
9
FPGA Class
30/05/2013
Mạch sau khi tổng hợp bằng Quartus
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
10
FPGA Class
30/05/2013
Các loại toán tử và mức ưu tiên
Cao
11
FPGA Class
30/05/2013
Thấp
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
12
FPGA Class
30/05/2013
Hàm ASSIGN và toán tử điều kiện
Phải là kiểu dữ liệu “wire”
assign
Phải là phép gán blocking toán tử điều kiện
Ví dụ: assign mux_out = sel? din_1: din_0;
Kết thúc một dòng lệnh bằng dấu “chấm phẩy”
assign mux_out = sel_1? (sel_2?din_2:din_1): din_0;
13
FPGA Class
30/05/2013
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
14
FPGA Class
30/05/2013
Cấu trúc ALWAYS@
always @ (
Liệt kê tất các tín hiệu bên phải biểu thức gán
end
case, if, (không có assign)
Danh sách độ nhạy không được khai báo đầy đủ (Thiếu tín hiệu C)
Được khai báo đầy đủ (Đây là mạch tổ hợp)
always @ (*) begin y = A & B & C; end
assign y = A & B & C;
Chú ý rằng y được khai báo kiểu wire
Với kiểu viết như thế này chúng ta không sợ thiếu danh sách độ nhạy
15
FPGA Class
30/05/2013
Kiểu dữ liệu của tín hiệu được gán trong cấu trúc always phải là reg
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
16
FPGA Class
30/05/2013
Gán blocking (=) và non-blocking (<=)
Không bao giờ dùng chung hai phép gán blocking và non- blocking trong cùng 1 hàm case, if, always.
Dùng cho mạch tổ hợp Dùng cho mạch tuần tự
17
FPGA Class
30/05/2013
C = DIN
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
18
FPGA Class
30/05/2013
posedge và negedge
Hai từ khóa này dùng trong danh sách độ nhạy
của cấu trúc always. posedge nghĩa là xét tại cạnh lên của tín hiệu. negedge nghĩa là xét tại cạnh xuống của tín hiệu.
Không thiết kế với cả posedge và negedge
trong cùng 1 cấu trúc always.
Chỉ nên sử dụng 1 khai báo posedge hoặc
negedge (đơn clock) nếu có thể.
Thường dùng posedge.
19
FPGA Class
30/05/2013
Nội dung chính
Quy tắc đặt tên Cấu trúc một thiết kế Khai báo module Các loại toán tử Hàm assign Cấu trúc always Phép gán blocking và non-blocking posedge và negedge Bài tập ví dụ
20
FPGA Class
30/05/2013
Bài tập ví dụ
1. Diễn giải chức năng của
2. Xác định ngõ vào (tín hiệu
mạch?
vào) và ngõ ra (tín hiệu ra của mạch)? Từ đó vẽ sơ đồ chân tín hiệu.
1. Với If 2. Với Case
3. Dùng kết hợp assign và
always
3. Viết RTL code bằng ngôn ngữ Verilog mô tả mạch bên theo các cách sau: 1. Chỉ dùng hàm assign 2. Chỉ dùng hàm always@
4. Đưa ra phương án kiểm tra
21
FPGA Class
30/05/2013
trên KIT DE1.
KẾT THÚC BÀI 3
22
FPGA Class
30/05/2013