Tải bản đầy đủ (.pdf) (28 trang)

Lecture 5 mô tả hành vi

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (824.73 KB, 28 trang )

Thiết kế logic số
(Digital Logic design)
Bộ môn Điện tử máy tính
08/2018

1


Chủ đề 5
MÔ TẢ HÀNH VI
Bộ môn Điện tử máy tính
08/2018

2


Nội dung

5.1 Khối always và khối initial
5.2 Câu lệnh khối và lệnh gán
thủ tục
5.3 Câu lệnh if và case

5.4 Câu lệnh lặp

3


5.1. Khối always và initial
1. 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:
initial <statements>
initial
begin
<statement>
<statement>
<statement>
end
4


5.1. Khối always và initial
Ví dụ:

module TB;//testbench mạch giải mã 2-4
reg [1:0] I;
wire [3:0] Y;
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];
endmodule
5


5.1. Khối always và initial
2. 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:
Always
<statement>
Always @(sensitivity_list)
<statement>

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…
6


5.1. Khối always và initial
2. Khối always:
Cú pháp Sensitivity_list:
// Verilog-1995 các tín hiệu được ngăn cách bởi từ
khóa or
@( [ edge ] signal [ or [ edge ] signal ] ... )
// 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
@*
edge = posedge | negedge (xung cạnh lên/cạnh xuống)

7


5.1. Khối always và initial
Ví dụ:

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
8



5.1. Khối always và initial
Ví dụ:

module demux1to4(D, S, Y);
input[1:0] S;
input
D;
output[3:0] Y;
reg[3:0] Y;
always @(D or S) // always @(D,S)
begin
case (S)
2'b00:Y= {3'b000,D};
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

9


5.1. Khối always và initial
Ví dụ:
module DFlipFlop(D,clk,sync_reset,Q);
input D; // Data input
input clk; // clock input

input sync_reset; // synchronous reset
output Q;
reg Q;
// output Q
always @(posedge clk)
begin
if(sync_reset==1'b1)
Q <= 1'b0; //phép gán non-blocking
else
Q <= D;
end
endmodule
10


5.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:
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

11


5.2. Câu lệnh khối và lệnh gán thủ tục
1. 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
reg.
Một khối begin…end phải chứa ít nhất 1 câu lệnh
Cú pháp:
begin [ :label[ local_declarations] ]
<statement>
end

12


5.2. Câu lệnh khối và lệnh gán thủ tục
2. Khối song song (fork…join):
Các câu lệnh được thực thi song song.
Cú pháp:
fork [ :label[ local_declarations] ]
<statements>
join

fork: Stimuli
#20 Data = 4'h0;
#30 Data = 4'hF;
Reset = 0;
#10 Reset = 1;
join

// This is executed last
// This is executed first

// It completes at time 30

13


5.2. Câu lệnh khối và lệnh gán thủ tục
3. 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.
[tên biến] = [biểu thức] ;

 Kiểu gán non-blocking: (thường dùng cho mạch tuần tự)
[tên biến] <= [biểu thức] ;

Các lệnh gán được thực hiện song song.

14


5.2. Câu lệnh khối và lệnh gán thủ tục
Ví dụ:
begin
a = 0;
#10 a = 1;
#5 a = 2;
end

/* time 0: a=0;

time 10: a=1;
time 15 (#10+#5): a=2; */

begin
a <= 0;
#10 a <= 1;
#5 a <= 2;
end

/* time 0: a=0;
time 5: a=2;
time 10: a=1; */

15


5.2. Câu lệnh khối và lệnh gán thủ tục
 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
ghi (reg)


Điều khiển dữ liệu kiểu net
(wire)

Sử dụng: “ = “ hoặc “<= “
trong câu lệnh

Sử dụng: “ = “ trong câu lệnh

Không dùng từ khóa assign

Dùng từ khóa assign

16


5.3. Câu lệnh if và case
1. Câu lệnh điều kiện if:
 Dạng 1: if
if (condition)
statements;
module if_1(latch,E,din);
input E,din;
output latch;
reg latch;
wire E,din;
always @ (E or din)
if (E)
begin
latch <= din;
end

endmodule
17


5.3. Câu lệnh if và case
 Dạng 2: if – else
if (condition)
statements;
else
statements;

 Dạng 3: if – else if – else
if (condition)
statements;
else if (condition)
statements;
................
else
statements;

Chú ý: khi có hơn 1
câu lệnh cần để thực
thi cho 1 điều kiện if
thì phải dùng begin end

18


5.3. Câu lệnh if và case
 Dạng 2: if – else module if_else(clk,din,reset,dff);

input clk,din,reset;
output dff;
reg dff;
wire clk,din,reset;
always @ (posedge clk) //clk cạnh lên
if (reset)
begin
dff <= 0;
end
else
begin
dff <= din;
end
endmodule
19


5.3. Câu lệnh if và case
 Dạng 3:
module if_3(counter,clk,reset,E,up_en,down_en);
input clk,reset,E,up_en,down_en;
output [3:0] counter;
reg [3:0] counter;
wire clk,reset,E, up_en, down_en;
always @ (posedge clk)
// nếu chân reset được tác động (mức 0)
if (reset == 1'b0)
begin
counter <= 4'b0000;
end

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


5.3. Câu lệnh if và case
 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)
begin
counter <= counter - 1'b1;
end
// nếu bộ đếm không cho phép đếm
else
begin
counter <= counter;
end
endmodule

21


5.3. Câu lệnh if và case
2. Câu lệnh case: cho phép lựa chọn trường hợp
 Cú pháp:
case (biểu thức)
< case1 > : < statement >

< case2 > : < statement >
.....
default : < statement >
endcase

 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
22


5.3. Câu lệnh if và case
 Ví dụ:
module MUX2_1(din_0,din_1,sel,y);
input din_0,din_1,sel;
output y;
reg y;
always @ (sel or din_0 or din_1)
begin
case(sel)
1'b0 : y = din_0; // 0: y = din_0;
1'b1 : y = din_1; // 1: y = din_1;
endcase
end
endmodule

23



5.4. Câu lệnh lặp
Câ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

24


5.4. Câu lệnh lặp
1. Lệnh lặp forever
 Thực thi một hoặc nhiều câu lệnh trong một vòng lặp vô hạn.
 Cú pháp:
forever
< statement >

 Ví dụ:
initial
begin : Clock
Clk = 0;
forever
#50 Clk = !Clk;
end

25



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×