Thiết kế logic số
(Digital Logic design)
Bộ môn Điện tửy tính
1
Chủ đề 5
MÔ TẢ HÀNH VI
Bộ môn Điện tửy tính
2
Nội dung
3
5.1 Khối always khối initial
5.2 Câu lệnh khối lệnh gán
thủ tục
5.3 Câu lệnh if case
5.4 Câu lệnh lặp
1.Khối initial:
Chỉ thực thi một lần từ lúc bắt đầu (của quá trình phỏng)
Khối initial dùng cho thực hiện 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.
pháp:
5.1. Khối always initial
4
initial <statements>
initial
begin
<statement>
<statement>
<statement>
end
dụ:
5.1. Khối always initial
5
module TB;//testbench mạch giải 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
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.
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 initial
6
Always @(sensitivity_list)
<statement>
Always
<statement>
2.Khối always:
pháp Sensitivity_list:
5.1. Khối always initial
7
// 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 tất cả các
tín hiệu 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)
dụ:
5.1. Khối always initial
8
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
dụ:
5.1. Khối always initial
9
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
dụ:
5.1. Khối always initial
10
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
Câu lệnh khối nhóm 2 hay nhiều câu lệnh pháp tác
động giống một câu lệnh đơn.
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 lệnh gán thủ tục
11
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 thể được đặt nhãn một cách tùy
chọn, nếu nhãn được đặt, các khai báo cục bộ phảikiểu
reg.
Một khối begin…end phải chứa ít nhất 1 câu lệnh
pháp:
12
begin [ :label[ local_declarations] ]
<statement>
end
5.2. Câu lệnh khối 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.
pháp:
13
fork [ :label[ local_declarations] ]
<statements>
join
fork: Stimuli
#20 Data = 4'h0;
#30 Data = 4'hF; // This is executed last
Reset = 0; // This is executed first
#10 Reset = 1;
join // It completes at time 30
5.2. Câu lệnh khối 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.
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.
14
[tên biến] = [biểu thức] ;
[tên biến] <= [biểu thức] ;
5.2. Câu lệnh khối lệnh gán thủ tục
dụ:
15
begin
a = 0; /* time 0: a=0;
#10 a = 1; time 10: a=1;
#5 a = 2; time 15 (#10+#5): a=2; */
end
begin
a <= 0; /* time 0: a=0;
#10 a <= 1; time 5: a=2;
#5 a <= 2; time 10: a=1; */
end
5.2. Câu lệnh khối lệnh gán thủ tục
Sự khác nhau giữa gán liên tục gán thủ tục:
16
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
5.2. Câu lệnh khối lệnh gán thủ tục
1.Câu lệnh điều kiện if:
Dạng 1: if
5.3. Câu lệnh if case
17
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
Dạng 2: if else
Dạng 3: if else if else
18
if (condition)
statements;
else
statements;
if (condition)
statements;
else if (condition)
statements;
................
else
statements;
Chú ý: khi 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
5.3. Câu lệnh if case
Dạng 2: if else
19
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
5.3. Câu lệnh if case
Dạng 3:
20
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
5.3. Câu lệnh if case

Preview text:

Thiết kế logic số (Digital Logic design)
Bộ môn Điện tử máy tính 1 Chủ đề 5 MÔ TẢ HÀNH VI
Bộ môn Điện tử máy tính 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 initial begin 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
Always @(sensitivity_list) 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; // This is executed last
Reset = 0; // This is executed first #10 Reset = 1;
join // 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; /* time 0: a=0; #10 a = 1; time 10: a=1; #5 a = 2;
time 15 (#10+#5): a=2; */ end begin a <= 0; /* time 0: a=0; #10 a <= 1; time 5: a=2; #5 a <= 2; time 10: a=1; */ end 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
Xuất hiện bên trong module always hay initial
Điều khiển dữ liệu kiểu thanh
Điều khiển dữ liệu kiểu net ghi (reg) (wire)
Sử dụng: “ = “ hoặc “<= “
Sử dụng: “ = “ trong câu lệnh 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)
Chú ý: khi có hơn 1 statements;
câu lệnh cần để thực thi cho 1 điều kiện if ................
thì phải dùng begin - else end statements; 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