CHƯƠNG 4: MÔ TẢ HÀNH VI 4.1. Khối always và initial a) Khối initial: • Chỉ thực thi một lần từ lúc bắt đầu (của quá trình mô phỏng) • Khối initial dùng cho thực hiện mã testbench • Một khối initial chứa nhiều hơn 1 câu lệnh phải kèm theo câu lệnh begin – end hoặc fork – join. Ví dụ: b) Khối always: • Được thực hiện lặp lại nhiều lần • Một khối always chứa nhiều hơn 1 câu lệnh phải kèm theo câu lệnh begin – end hoặc fork – join. Cú pháp: Trong đó: • Sensitivity_list: danh sách tín hiệu kích thích • Mạch tổ hợp: các ngõ vào • Mạch tuần tự: xung clk, các ngõ vào điều khiển… 4.2. Câu lệnh khối và lệnh gán thủ tục Câu lệnh khối nhóm 2 hay nhiều câu lệnh mà cú pháp tác động giống một câu lệnh đơn. Có 2 loại phát biểu khối trong Verilog:
Trang 1Thiết kế logic số
(Digital Logic design)
Bộ môn Điện tử máy tính
08/2018
Trang 2Chủ đề 5
MÔ TẢ HÀNH VI
Bộ môn Điện tử máy tính
08/2018
Trang 41 Khối initial:
Chỉ thực thi một lần từ lúc bắt đầu (của quá trình mô phỏng)
Khối initial dùng cho thực hiện mã testbench
Một khối initial chứa nhiều hơn 1 câu lệnh phải kèm theo câu
lệnh begin – end hoặc fork – join
Cú pháp:
5.1 Khối always và initial
initial <statements>
initial begin
<statement>
<statement>
<statement>
end
Trang 5Ví dụ:
5.1 Khối always và initial
module TB;//testbench mạch giải mã 2-4
decoder_2to4 uut ( .I(I),
Y(Y) );
initial begin
I=2'b00;
end always
#100 I[0] = ~I[0];//đơn vị ns
always #200 I[1] = ~I[1];
Trang 62 Khối always:
Được thực hiện lặp lại nhiều lần
Một khối always chứa nhiều hơn 1 câu lệnh phải kèm theo
câu lệnh begin – end hoặc fork – join
Cú pháp:
Trong đó:
Sensitivity_list: danh sách tín hiệu kích thích
Mạch tổ hợp: các ngõ vào
Mạch tuần tự: xung clk, các ngõ vào điều khiển…
5.1 Khối always và initial
Always @(sensitivity_list)
<statement>
Always
<statement>
Trang 72 Khối always:
Cú pháp Sensitivity_list:
5.1 Khối always và initial
// Verilog-1995 các tín hiệu được ngăn cách bởi từ
khóa or
// Verilog-2001 có thể dùng dấu “,”
@( [ edge ] signal [ , [ edge ] signal ] )
//Verilog-2001 có thể dùng “*” để liệt kê tất cả các
tín hiệu và biến ( mạch tổ hợp )được đọc bởi các câu
lệnh trong khối always
@*
Trang 8Ví dụ:
5.1 Khối always và initial
module decoder_2to4(
input [1:0] I, output [3:0] Y );
reg [3:0] Y_TAM ;
always @(*)//hoặc @(I)
begin case (I) 2'b00: Y_TAM = 4'b0001;
2'b01: Y_TAM = 4'b0010;
2'b10: Y_TAM = 4'b0100;
2'b11: Y_TAM = 4'b1000;
endcase end
assign Y=Y_TAM;
endmodule
Trang 9Ví dụ:
5.1 Khối always và initial
module demux1to4(D, S, Y);
2'b01:Y= {2'b00,D,1'b0};
2'b10:Y= {1'b0,D,2'b00};
2'b11:Y= {D,3'b000};
endcase end
endmodule
Trang 10Ví dụ:
5.1 Khối always và initial
module DFlipFlop(D,clk,sync_reset,Q);
input D; // Data input
input clk; // clock input
input sync_reset; // synchronous reset
Trang 11Câu lệnh khối nhóm 2 hay nhiều câu lệnh mà cú pháp tác
động giống một câu lệnh đơn
Có 2 loại phát biểu khối trong Verilog:
Khối tuần tự (begin…end): các câu lệnh được thực thi
tuần tự
Khối song song (fork…join): các câu lệnh được thực thi
cùng lúc
5.2 Câu lệnh khối và lệnh gán thủ tục
Trang 121 Khối tuần tự (begin…end):
Các câu lệnh được thực thi tuần tự
Khối lệnh kết thúc khi câu lệnh cuối cùng được thực thi
Một khối begin…end có thể được đặt nhãn một cách tùy
chọn, nếu có nhãn được đặt, các khai báo cục bộ phải là kiểu
Trang 132 Khối song song (fork…join):
Các câu lệnh được thực thi song song
#30 Data = 4'hF; // This is executed last
Reset = 0; // This is executed first
#10 Reset = 1;
5.2 Câu lệnh khối và lệnh gán thủ tục
Trang 143 Lệnh gán thủ tục: sử dụng để gán đến dữ liệu kiểu reg, chia là
2 kiểu gán:
Kiểu gán blocking: (thường dùng cho mạch tổ hợp)
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 gán non-blocking: (thường dùng cho mạch tuần tự)
Các lệnh gán được thực hiện song song
[tên biến] = [biểu thức] ;
[tên biến] <= [biểu thức] ;
5.2 Câu lệnh khối và lệnh gán thủ tục
Trang 16 Sự khác nhau giữa gán liên tục và gán thủ tục:
Lệnh gán thủ tục Lệnh gán liên tục
Xuất hiện bên trong khối lệnh
always hay initial Xuất hiện bên trong module
Điều khiển dữ liệu kiểu thanh
Trang 171 Câu lệnh điều kiện if:
end
Trang 185.3 Câu lệnh if và case
Trang 19 Dạng 2: if – else module if_else(clk,din,reset,dff);
dff <= din;
end
5.3 Câu lệnh if và case
Trang 20// nếu chân cho phép E và đếm lên được tác động
else if (E == 1'b1 && up_en == 1'b1)
begin
counter <= counter + 1'b1;
end
5.3 Câu lệnh if và case
Trang 21 Dạng 3:
// nếu chân cho phép E và đếm xuống được tác động
else if (E == 1'b1 && down_en == 1'b1)
5.3 Câu lệnh if và case
Trang 222 Câu lệnh case: cho phép lựa chọn trường hợp
Cú pháp:
Câu lệnh case so sánh biểu thức với một loạt các trường hợp
và thực thi câu lệnh hoặc nhóm câu lệnh liên kết với trường
hợp trùng khớp
Với các trạng thái tín hiệu Z → sử dụng casez
Với các trạng thái tín hiệu X, Z → sử dụng casex
Trang 24Câu lệnh lặp: xuất hiện trong các khối thủ tục gồm 4 lệnh lặp
Lệnh lặp forever
Lệnh lặp repeat
Lệnh lặp while
Lệnh lặp for
Câu lệnh lặp phải được đặt trong khối begin – end nếu có
nhiều hơn 1 câu lệnh được thực thi
5.4 Câu lệnh lặp
Trang 262 Lệnh lặp repeat
Thực thi một câu lệnh với một số lần cố định
Các câu lệnh sẽ không được thực thi nếu biểu thức có giá trị:
Trang 273 Lệnh lặp while
Thực thi một phát biểu cho đến khi một biểu thức trở thành
sai (false)
Nếu biểu thức có giá trị bắt đầu đã là sai (false) thì phát biểu
sẽ không được thực thi lần nào
Trang 284 Lệnh lặp for
Lặp lại sự thực thi các câu lệnh theo số lần nhất định
Cú pháp:
Giá trị đàu tiên của chỉ số lặp (initial_assignment)
Xác định điều kiện ngừng vòng lặp (expression)
Xác định sự thay đổi, tăng hoặc giảm số lần nhảy