Nội dung trình bày
1. Giới thiệu Verilog
2. Ví dụ mở đầu
3. Khái niệm cơ bản
4. Module, Port
5. Ví dụ ứng dụng
6. Tổ chức chương trình
7. Phương pháp thiết kế
4. Module, Port
Cấu trúc module
1)module <ten_module>(<danh sách cổng>);
2)// Khối khai báo: input, output, inout
3)// Khối khai báo biến: wire, reg …
4)// Khối định chỉ định liên tiếp: assign
5)// Khối lệnh: initial, always
6)endmodule
4. Module, Port
Ví dụ : mô phỏng mạch cộng 2 bit
1) module full_adder( a, b, cin, s, cout );
2) input a, b, cin;
3) output s, cout;
4) assign s = a ^ b ^ cin;
5) assign cout = (a&b) | (cin & (a|b));
6) endmodule
4. Module, Port
1) module full_adder( a, b, cin, s, cout );
•
Bắt đầu bằng từ khóa “module”
•
Tên module: full_adder
•
Danh sách cổng: ( a, b, cin, s, cout ) là tất cả
các cổng vào ra của mạch điện được mô
phỏng
4. Module, Port
2) input a, b, cin;
3) output s, cout;
•
Định nghĩa các cổng trong danh sách là cổng
vào, hay cổng ra
•
Dùng từ khóa
–
input: định nghĩa cổng vào
–
output: định nghĩa cổng ra
–
inout: định nghĩa cổng vừa vào, vừa ra
4. Module, Port
4) assign s = a ^ b ^ cin;
5) assign cout = (a&b) | (cin & (a|b));
•
Thực hiện tính toán và gán
•
Có từ khóa assign trước phép gán chứa biểu
thức bên vế phải
4. Module, Port
6) endmodule
•
Từ khóa kết thúc module
4. Module, Port
Chi tiết: Khối khai báo: input, output, inout
•
Input [msb:lsb] <danh sách ngõ vào>;
•
Output [msb:lsb] <danh sách ngõ ra>
•
Inout [ msb:lsb ] <danh sách vào_ra>
module T_FF(clk, rs, q);
input clk, rs;
output q;
endmodule
4. Module, Port
Quy tắc nối cổng ngoài với cổng trong
•
input phải kiểu reg, có thể nối với cổng kiểu reg, net
•
output phải kiểu reg hoặc net, nối với cổng kiểu net
•
inout phải kiểu net, nối với cổng kiểu net
4. Module, Port
Chi tiết: Khối khai báo: input, output, inout
•
Khai báo kiểu dữ liệu cho các cổng trong danh sách.
Mặc định là kiểu wire
module T_FF(clk, rs, q);
input clk, rs;
output q;
wire clk, rs;
reg q;
endmodule
4. Module, Port
Chi tiết: Khối chỉ định liên tiếp: assign
•
Để gán giá trị lên nets, thường nằm ngoài khối
initial và always
•
Thứ tự các lệnh gán không quan trọng
•
Cú pháp: assign <tên biến>=<biểuthức>
•
Wire [ 1:0 ] a = 2’b 01;
•
Assign b = c &d;
•
Assign d = x | y;
4. Module, Port
Chi tiết: Khối always
•
Là khối chứa các lệnh sẽ được thực hiện lặp lại
liên tục, vế phải phép gán có thay đổi giá trị
thì vế trái sẽ thay đổi theo ngay
•
Khối always thực hiện bằng mức: mức lên
hoặc mức xuống
•
Có thể có nhiều khối always trong một module
4. Module, Port
Chi tiết: Khối always
•
Always @(<điều kiện > or …)
•
Begin
•
… các lệnh…
•
end
Ví dụ:
always @
(posedge clk)
begin : D_FF
if (reset == 1)
q <= 0;
else
q <=d;
end end
4. Module, Port
Chi tiết: Khối initial
•
Giống khối always, nhưng khối lệnh chỉ thực hiện
một lần
•
Initial
•
Begin
•
… các lệnh…
•
end
initial
begin
clk = 0;
reset = 0;
enable = 0;
data = 0;
end
4. Module, Port
Chi tiết
•
Khối lệnh phải đặt trong begin…end
•
Các lệnh rẽ nhánh và lặp thì giống như NNLT C
–
if … else
–
case
–
for
–
while
–
forever
–
repeat
4. Module, Port
Lệnh if…else
if (biểu thức)
Begin
… câu lệnh…
end
else
Begin
… câu lệnh …
end
4. Module, Port
Ví dụ: if…else
if (reset == 1'b0)
counter <= 4'b0000;
else
if (enable == 1'b1 && up_en == 1'b1)
counter <= counter + 1'b1;
4. Module, Port
Lệnh case
Case (biểu thức)
Case 1:
Begin
… câu lệnh…
end
Case 2:
Begin
… câu lệnh…
end
…
default:
begin
… câu lệnh …
end
endcase
Ví dụ: case
module mux (a,b,c,d,sel,y);
input a, b, c, d;
input [1:0] sel;
output y;
reg y;
always @ (a or b or c or d or sel)
case (sel)
0 : y = a;
1 : y = b;
2 : y = c;
3 : y = d;
default : $display("Error in SEL");
endcase
endmodule
4. Module, Port
Lệnh for
For (biến đếm= giá trị; biến đếm </ <=/ >/ >=
giá trị; biến đếm = biến đếm +/- giá trị)
begin
… các lệnh…
end
4. Module, Port
Ví dụ: for
integer j;
For (j = 0; j<=7; j = j+1)
Begin
c[j] = a[j] & b[j];
d[j] = a[j] | b[j];
end
4. Module, Port
Lệnh while
While (biểu thức)
Begin
… các lệnh…
end
4. Module, Port
Ví dụ: while
while (data[0] == 0);
begin
loc = loc + 1;
data = data << 1;
end
4. Module, Port
Lệnh forever
•
Cú pháp: forever <lệnh>
•
Ví dụ:
initial begin
clk = 0;
forever #5 clk = !clk;
end