verilog hdl

57
LOGO Verilog HDL Nguyễn Hà Giang

Upload: ha-giang

Post on 24-Jul-2015

1.108 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Verilog HDL

LOGO

Verilog HDLNguyễn Hà Giang

Page 2: Verilog HDL

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

Page 3: Verilog HDL

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

Page 4: Verilog HDL

LOGOGiới thiệu chung về Verilog

Verilog là một ngôn ngữ mô tả phần cứng được dùng rộng rãi trong thiết kế mạch số

Verilog thường được dùng để mô tả thiết kế ở 4 dạng Thuật toán (các lệnh như: if, case, for, while…), Chuyển đổi thanh ghi, Các cổng kết nối Chuyển mạch.

Page 5: Verilog HDL

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

Page 6: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 7: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 8: Verilog HDL

LOGOKhoảng trống và chú thíchBlank space (\b), tabs (\t) và dòng mới (\n).

Chúng được bỏ qua trừ khi dùng để tách biệt các chú thích, định danh, số, chuỗi, từ khóa,

Khoảng trống không được bỏ qua trong chuỗiVerilog cho phép chú thích theo một hàng và

nhiều hàng // cho phep chu thich tren 1 hang /* cho phep chu thich tren nhieu hang */

Page 9: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 10: Verilog HDL

LOGOĐịnh danh và từ khóa Định danh là tên gán cho đối tượng để được tham chiếu

trong thiết kế. Định danh có thể bao gồm cả các ký tự số và dấu gạch dưới ( _ ), dấu $ nhưng phải bắt đầu bằng ký tự chữ hoặc dấu gạch dưới

Từ khóa: là dạng đặc biệt dành riêng để định nghĩa các cấu trúc ngôn ngữ, được viết bằng chữ thường

Ví dụ

reg example; // reg la tu khoa, example la dinh danh

input a ; // input la tu khoa, a la dinh danh

Page 11: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 12: Verilog HDL

LOGOCách biểu diễn số• Số thực: trong khai báo dùng từ khóa real ( VD : real a,b,c )• Số nguyên: Nếu chúng chứa những số mà không định rõ kích

thước thì kích thước mặc định là 32 bit, trong khai báo dùng từ khóa integer

• Ví dụ :

module module_songuyen();integer a, b, c;initialbegina = 12’h234; // a kich thuoc 12 bitb = 342; // b kich thuoc 32 bitc = -39; // c kich thuoc 32 bitendendmodule

Page 13: Verilog HDL

LOGOSố có cơ số Là những số nguyên nhưng được khai báo dùng những cơ số nhất

định, ví dụ hệ 8 (octal), hệ 16 (hexadecimal), hệ 10 (decimal), hệ nhị phân (binary)

Số có cơ số được khai báo như sau: <integer_name> = <bit_size>’<base_number><value>;

Trong đó: <integer_name> là tên của số nguyên mà ta cần dùng, <bit_size> là số bit nhị phân biểu diễn số nguyên, <base_number> là cơ số. Theo đó o là bát phân, h là hệ thập

lục phân, d la hệ thập phân, b là cho hệ nhị phân. <value> giá trị của số nguyên

Ví dụa = 4’b1001; // biểu diễn số nhị phân 4’b1001 = 4’d9

b = 5’o24; // biểu diễn bát phânc = 5’d24; // biểu diễn hệ mười

Page 14: Verilog HDL

LOGOSố biểu diễn thang thời gian

Thời gian mô phỏng trong verilog được khai báo với từ khóa time. Đơn vị cho thời gian được khai báo trong bộ định hướng biên dịch. Khai báo thang thời gian tuan thủ cú pháp sau:

‘timescale <ref_time>/<precision> Trong đó: <ref_time> và <precision> phải là những giá trị

nguyên như 1, 10, hay 100 tuy nhiên đơn vị thời gian được phép khai báo cùng với những giá trị nguyên này là fs, ps, ns, us, ms, s

Ví dụ: ‘timescale 100us/1ns; Có nghĩa là : nếu khai báo #10 thì thời gian trễ

thực là 10*100 = 1000us

Page 15: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 16: Verilog HDL

LOGOKiểu dữ liệu

Dữ liệu trong Verilog kiểu này có loại giá trị sau đây: 0 – biểu diễn logic 0 hoặc điều kiện sai 1 – biểu diễn logic 1 hoặc điều kiện đúng x – biểu diễn logic chưa biết z – biểu diễn trạng thái tổng trở cao

Verilog cho phép khai báo hai kiểu dữ liệu là reg và net. Reg (register) là một phần tử lưu trữ, cho phép giá trị lưu trữ trong kiểu dữ liệu này. Reg được dùng cho các câu lệnh cuả khối always và initial

Page 17: Verilog HDL

LOGOKiểu dữ liệu

Kiểu dữ liệu thuộc nhóm net (wire, wand, wor)được dùng nhiều nhất là kiểu wire thường dùng để biểu diễn kết nối, giá trị trên wire được cập nhật liên tục, wire net1; wire [2:0] net2; Reg [3:0] a1, a2;

Trong quá trình mô phỏng, nếu không có giá trị nào được gán vào những đối tượng được khai báo kiểu reg thì giá trị mặc định là X (không xác định), tương tự với kiểu wire sẽ là Z,

Page 18: Verilog HDL

LOGOWire Wire mô tả vật liệu đường dây dẫn trong một mạch và

được dùng để kết nối các cổng hay các module. Giá trị cua wire có thể đọc, nhưng không được gán trong hàm (function), hoặc khối (block).

Wire không lưu trữ giá trị của nó nhưng vẫn phải được thực thi bởi một lệnh gán kế tiếp hay bởi sự kết nối wire với ngõ ra của một cổng hoặc một module

Cú pháp: wire[msb:lsb] bien_wire;

Ví dụ:

wire temp;

wire [7:0]a,b;

Page 19: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 20: Verilog HDL

LOGOVector Net hoặc reg có thể được khai báo dưới dạng vector (độ

rộng nhiều bit). Nếu độ rộng bit không được chỉ rõ, mặc định là 1 bit

Ví dụ

Vector có thể được viết là [high#:low#] hoặc [low#:high#] nhưng số bên trái luôn là bit lớn nhất của vector

Ví dụ:

Wire a; //1 bit

Wire [7:0] test; //8 bit

Reg b; // 1 bit

a [4:0]; // đúng

a [0:4];// sai

Page 21: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử

Page 22: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 23: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 24: Verilog HDL

LOGOToán tử bit - wise So sánh từng bít hai toán hạng ~(NOT), &(AND),^~ ( XNOR )…

Page 25: Verilog HDL

LOGOToán tử bit - wise

Ví dụ :

// x = 4’b1010 , y = 4’b1101// z = 4’b10x1~x // = 4’b0101x&y // = 4’b1000x | y // = 4’b1111x ^ y // = 4’b0111x~^ y // = 4’b1000x & z // = 4’B10x0

Page 26: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 27: Verilog HDL

LOGOToán tử logic

Toán tử trả về giá trị 0 hoặc 1. Chúng có thể làm việc trên biểu thức, số nguyên, hoặc nhóm bit

!(NOT), &&(AND), ||(OR)…Toán hạng là vector khác 0 được xem như 1Nếu bất kỳ bit nào của toán hạng có giá trị x hay

z thì toán hạng được xem như x

Page 28: Verilog HDL

LOGOToán tử logic

Ví dụ:

// a = 3 , b = 0; // m= 2’b0x , n = 2’b10 a && b // ( logic 1 && logic 0 ) 0 a || b // ( logic 1 || logic 0 ) 1 !a // ( !logic1 0 )

( a==2 ) && ( b==0 ) // ( logic 1 && logic 0 ) 0

( m && n ) // ( x && logic 1 ) x

Page 29: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 30: Verilog HDL

LOGOToán tử kết nối / nhân bản Kết nối {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 Nhân bản {number {a1, a2,… , aN}} Ví dụ

assign d[7:4] = {d[0], d[1], d[2], d[3]};

assign d = {d[3:0], d[7:4]};

a = {3{4’b1011}}; // 12’b1011 1011 1011

{3{1’b1}} // 111

{3{a}} // {a, a, a}

Page 31: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 32: Verilog HDL

LOGOToán tử dịch

Dịch trái <<, dịch phải >>Ví dụ :

// x = 4’b1100

y = x >> 1; // y = 4’b0110

y = x << 1 ; // y = 4’b1000

y = x << 2 ; // y = 4’b0000

Page 33: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 34: Verilog HDL

LOGOToán tử điều kiện Bt điều kiên ? Bt đúng : bt sai Xét bt điều kiện• Nếu đúng ( logic 1 ) bt đúng được xét• Nếu sai ( logic 0 ) bt sai được xét• Nếu kết quả là x thì xét cả bt đúng và bt sai. So sánh

từng bit của kết quả 2 biểu thức, nếu kết quả giống nhau trả về kết quả đó ,nếu có bit khác nhau thì trả về x

Ví dụ :

wire [15:0]b = a? data : 16’bz;

/* a = 1 thì data được gán vào b

a = 0 thì b ở tổng trở cao

a = x thì b là x */

Page 35: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 36: Verilog HDL

LOGOToán tử quan hệ So sánh 2 toán hạng và trả về 0 hoặc 1 <, <=, >, >= Nếu 1 trong số các toán hạng có bit có giá trị x hoặc z

thì kết quả trả về là x Ví dụ :

// a = 4 , b = 3

// x = 4’b1010 , y = 4’b1101 , z = 4’b1xxx

a <= b // = 0

a > b // = 1

y >= x // = 1

y < z // = x

Page 37: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 38: Verilog HDL

LOGOToán tử bằng == và !=• Giá trị� x và z tương tự như toán tử quan hệ• Kết quả có thể là x

=== và !==• So sánh từng bit• x === x, z === z, x !== z• Kết quả luôn xác định (0 hoặc1)• Nếu kích thước 2 toán hạng không bằng nhau thì các bit

0 sẽ được thêm vào những bit trọng số cao của toán

hạng có kích thướcnhỏ

Page 39: Verilog HDL

LOGOToán tử bằng Ví dụ :

// a = 4 , b = 3

// x = 4’b1010 , y = 4’b1010

// z = 4’b0xxz , m = 3’bxxz , n = 4’b0xxx

a == b // 0

x != y // 1

x == z // x

z === m // 1

z === n // 0

m !== n // 1

Page 40: Verilog HDL

LOGOToán tử Toán tử bit – wise Toán tử logic Toán tử kết nối Toán tử nhân bản Toán tử dịch Toán tử điều kiện Toán tử quan hệ Toán tử bằng Toán tử số học

Page 41: Verilog HDL

LOGOToán tử số học

Thực hiện các phép tính số học. +, -, *, /, %. Bất kỳ bit nào trong toán hạng là x hoặc z thì kết quả là x Kích thước kết quả :

Phép nhân thì kích thướckếtquảbằng tổng kích thước 2 toán hạng

Các phép toán khác bằng chiều dài lớn nhất của toán hạng

Page 42: Verilog HDL

LOGOToán tử số học Ví dụ

a = 4’b0011 ; b = 4’b0100;

d = 6 ; e = 4 ;

m = 4’b101x ; n = 4’b1010

a * b // = 4’b1100

d / e // = 1

a + b // = 4’b0111

a - b // = 4’b0001

m + n // = 4’bx

13 % 3 // = 1

16 % 4 // = 0

Page 43: Verilog HDL

LOGOMột số quy ước của Verilog

Khoảng trống và chú thích Định danh và từ khóa Cách biểu diễn số Kiểu dữ liệu Vector Toán tử Phép gán

Page 44: Verilog HDL

LOGOPhép gán  2 kiếu phép gán : • kiếu blocking:        [tên biến] = [biểu thức] ;•   kiểu non-blocking: [tên biến] <= [biểu thức] ;

Kiếu blocking : 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 non-blocking : các lệnh gán được thực hiện song song

Page 45: Verilog HDL

LOGOPhép gánVí dụ 1:

initial begin#10 a = 0 ; #11 a = 1 ; #12 a = 0 ; #13 a = 1;

endinitial begin

$monitor("TIME = %tA = %b ",$time, a);#50 $finish ;

end

TIME = 0 A = x TIME = 10 A = 0TIME = 11 A = 0TIME = 12 A = 0TIME = 13 A = 0TIME = 21 A = 1TIME = 33 A = 0TIME = 46 A = 1

Page 46: Verilog HDL

LOGOPhép gán Ví dụ 2 :

initial begin#10 b <= 0 ; #11 b <= 1 ; #12 b <= 0 ; #13 b <=

1; endinitial begin

$monitor("TIME = %t B = %b ",$time, b) ;#50 $finish ;

end

TIME = 0 B = x TIME = 10 B = 0 TIME = 11 B = 0 TIME = 12 B = 0 TIME = 13 B = 0 TIME = 21 B = 1 TIME = 33 B = 0 TIME = 46 B = 1

Page 47: Verilog HDL

LOGOPhép gán Ví dụ 3 :

initial beginc = #10 0 ; c = #11 1 ; c = #12 0 ; c = #13 1 ;

end initial begin

$monitor("TIME = %t C= %b ",$time, c);#50 $finish ;

end

TIME = 0 C = xTIME = 10 C = 0TIME = 11 C = 0TIME = 12 C = 0TIME = 13 C = 0TIME = 21 C = 1TIME = 33 C = 0TIME = 46 C = 1

Page 48: Verilog HDL

LOGOPhép gán Ví dụ 4 :

initial begind <= #10 0 ; d <= #11 1 ; d <= #12 0 ; d <= #13 1 ;

end initial begin

$monitor("TIME = %t D= %b ",$time, d);#50 $finish ;

end

TIME = 0 D = xTIME = 10 D = 0TIME = 11 D = 1TIME = 12 D = 0TIME = 13 D = 1TIME = 21 D = 1TIME = 33 D = 1TIME = 46 D = 1

Page 49: Verilog HDL

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

Page 50: Verilog HDL

LOGOCấu trúc chung một chương trình dùng Verilog

//khai báo module Module module_name(tên biến I/O); //module_name

trùng tên file.v Input [msb:lsb] bien; Output [msb:lsb] bien; Inout [msb:lsb] bien; Reg [msb:lsb] bien reg; Wire [msb:lsb] bien wire; //khai bao khoi always hoac initial …cac lenh… endmodule

Page 51: Verilog HDL

LOGOModule Module luôn bắt đầu bằng từ khóa module. Tên module, danh sách

port, khai báo port phải hiện diện trước tiên trong định nghĩa module.

Danh sách port và khai báo port chỉ hiện diện khi module có port tương tác với môi trường bên ngoài

5 thành phần trong module là: Các khai báo biến Các phát biểu luồng dữ liệu Thể hiện qua các module thấp hơn Các khối hành vi Task hoặc function

Các thành phần này là tùy chọn,có thể ở bất kỳ nơi đâu trong module không cần theo thứ tự.

Kết thúc bằng từ khóa endmodule

Page 52: Verilog HDL

LOGOModule

// module co port

module nand_gate (c, a, b);

output c;

input a, b;

wire d;

and a1(d, a, b);

not n1(c, d);

endmodule

Ví dụ 1 :

Page 53: Verilog HDL

LOGOModule

Ví dụ 2

//module ko co port

`timescale 1ns / 1ps

module test_bench;

reg A, B;

wire C;

nand_gate S (C, A, B);

initial

begin

$moniter("A = %b, B = %b, C = %b \n", A, B, C); #10 A = 1'b0; B = 1'b0;

#10 A = 1'b0; B = 1'b1;

#10 A = 1'b1; B = 1'b0;

#10 A = 1'b1; B = 1'b1;

end

endmodule

Page 54: Verilog HDL

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

Page 55: Verilog HDL

LOGOPort Port cung cấp giao diện qua đó module có thể giao tiếp

với môi trường bên ngoài Kiểu của port cũng được khai báo một cách cụ thể: Đó

có thể là input, output hoặc inout Ví dụ:

module test1(a, b, c, d);intput a, b;output c;inout d;

….

Page 56: Verilog HDL

LOGOPort Nếu một cổng nào đó mà nhiều hơn 1 bit ta phải dùng ký

hiệu “[ ]” để chỉ ra độ rộng của bus Ví dụ:

module example(a, b, c, d);

intput [7:0] a, b;

output c;

inout [4:0] d;

Page 57: Verilog HDL

LOGO

www.themegallery.com

Nguyễn Hà Giang