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: .v  Tên chỉ gồm ký tự chữ cái (phân biệt chữ hoa và chữ thường),

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 = <điều kiện>? : ;

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 @ () begin

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