Upload
ha-giang
View
633
Download
2
Embed Size (px)
Citation preview
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