verilog hdl

Post on 24-Jul-2015

1.109 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

LOGO

Verilog HDLNguyễn Hà Giang

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

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.

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

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

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

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 */

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

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

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

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

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

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

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

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

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,

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;

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

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

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ử

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

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

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

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

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

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

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

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

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}

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

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

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

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 */

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

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

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

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ỏ

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

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

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

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

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

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

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

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

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

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

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

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

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

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 :

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

LOGONội dung

Giới thiệu chung về Verilog1

Một số quy ước

3

2

Module

Port4

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;

….

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;

LOGO

www.themegallery.com

Nguyễn Hà Giang

top related