CHƯƠNG 3: CẤU TRÚC CỦA 1 MODULE 3.1. Cách gọi module con: Khi một môđun được khởi tạo, phải xác định kết nối đến các cổng của các module. Có hai cách gọi để kết nối cổng các module là: • Kết nối theo thứ tự cổng: thứ tự các cổng trong module chính phải phù hợp với thứ tự xuất hiện các cổng trong module con. • Kết nối theo tên cổng: tên cổng phải phù hợp với module con, thứ tự không quan trọng. a) Kết nối theo thứ tự: Tên_module_con Nhãn(signal_1, signal_2,…, signal_N); b) Kết nối theo tên: Tên_module_con Nhãn (.port_name_1(signal_1, .port_name_2(signal_2,…,.port_name_n(signal_n); Trong đó: • Signal: tên các cổng của module top • Port_name: tên các cổng của module con Ví dụ: module adder_order(S,cout,A,B,cin); Input Port Declarations input 3:0 A ; input 3:0 B ; input cin ; Output Port Declarations output 3:0 S ; output cout ; Port Wires wire 3:0 A ; wire 3:0 B ; wire cin ; wire 3:0 S ; wire cout ; Internal variables wire c1 ; wire c2 ; wire c3 ; Code Starts Here addbit u0 (A0,B0,cin,S0,c1); addbit u1 (A1,B1,c1,S1,c2); addbit u2 (A2,B2,c2,S2,c3); addbit u3 (A3,B3,c3,S3,cout); endmodule Kết nối theo tên(by port name) : module adder_name(S,cout,A,B,cin); Input Port Declarations input 3:0 A ; input 3:0 B ; input cin ; Output Port Declarations output 3:0 S ; output cout ; Port Wires wire 3:0 A ; wire 3:0 B ; wire cin ; wire 3:0 S ; wire cout ; Internal variables wire c1 ; wire c2 ; wire c3 ; Code Starts Here addbit u0 (.a(A0),.b(B0),.ci(cin),.sum(S0),.co(c1)); addbit u1 (.a(A1),.b(B1),.ci(c1),.sum(S1),.co(c2)); addbit u2 (.a(A2),.b(B2),.ci(c2),.sum(S2),.co(c3)); addbit u3 (.a(A3),.b(B3),.ci(c3),.sum(S3),.co(cout)); endmodule 3.2. Quy định kết nối port: • Input: Kết nối bên trong luôn luôn là kiểu net; bên ngoài có thể khai báo kiểu net hoặc reg. • Output: Bên ngoài luôn là kiểu net, bên trong có thể là kiểu net hoặc reg. • Cổng không kết nối được cho phép sử dụng dấu “ , ” Ví dụ:
Trang 1(Digital Logic design)
Bộ môn Điện tử máy tính
08/2018
1
Trang 2Chủ đề 4
CẤU TRÚC MODULE
Bộ môn Điện tử máy tính
08/2018
Trang 33
4.1 Phương pháp thiết kế
4.2 Module
4.3 Quy định về kết nối port
4.4 Bài tập
Trang 41 Phương pháp thiết kế:
Top-down design:
Bottom-up design:
4.1 Phương pháp thiết kế
Top-Level
Sub-Block1 Sub-Block2
Leaf-cell Leaf-cell
Top-Level
Macro-cell1 Macro-cell2
Leaf-cell Leaf-cell
Trang 52 Module: là các khối xây dựng của thiết kế Verilog
Có 3 cách để mô tả chức năng:
Mức cổng (gate level)
Mức luồng dữ liệu (Dataflow level)
Mức hành vi (Behavioral or algorithmic level)
5
Trang 6Ví dụ: mô tả luồng dữ liệu mạch cộng 1 bit
module addbit (a,b,ci,sum,co);
//Input declaration
input a,b,ci;
//Ouput declaration
output sum;
output co;
//Port Data types
wire a,b,ci;
wire sum;
wire co;
//Code starts here
assign {co,sum} = a + b + ci;
endmodule // End of Module addbit
a b
ci
co sum
addbit
4.2 Module
Trang 7 Cách gọi module con:
Khi một mô-đun được khởi tạo, phải xác định kết nối đến
các cổng của các module
Có hai cách gọi để kết nối cổng các module là:
Kết nối theo thứ tự cổng: thứ tự các cổng trong
module chính phải phù hợp với thứ tự xuất hiện các cổng trong module con
Kết nối theo tên cổng: tên cổng phải phù hợp với
module con, thứ tự không quan trọng
7
Trang 8Kết nối theo thứ tự :
Kết nối theo tên :
Trong đó:
Signal: tên các cổng của module top
Port_name : tên các cổng của module con
4.2 Module
Trang 9Ví dụ: thực hiện mạch cộng 4 bit sử dụng mạch cộng 1 bit đã
thiết kế ở ví dụ trên
9
a b
ci
co
sum
a b
ci
co sum
a b
ci
co sum
c1 c2
ci
co sum
A0 B0 A1 B1
A2 B2 A3 B3
S0 S1
S2 S3
cin cout
Trang 10 Kết nối theo thứ tự (by port order) :
module adder_order(S,cout,A,B,cin);
// Input Port Declarations
input [3:0] A ;
input [3:0] B ;
input cin ;
// Output Port Declarations
output [3:0] S ;
output cout ;
// Port Wires
wire [3:0] A ;
wire [3:0] B ;
wire cin ;
wire [3:0] S ;
wire cout ;
4.2 Module
Trang 11 Kết nối theo thứ tự (by port order) :
11
// Internal variables
wire c1 ;
wire c2 ;
wire c3 ;
// Code Starts Here
addbit u0 (A[0],B[0],cin,S[0],c1);
addbit u1 (A[1],B[1],c1,S[1],c2);
addbit u2 (A[2],B[2],c2,S[2],c3);
addbit u3 (A[3],B[3],c3,S[3],cout);
endmodule // End Of Module adder
Trang 12 Kết nối theo tên (by port name) :
module adder_name(S,cout,A,B,cin);
// Input Port Declarations
input [3:0] A ;
input [3:0] B ;
input cin ;
// Output Port Declarations
output [3:0] S ;
output cout ;
// Port Wires
wire [3:0] A ;
wire [3:0] B ;
wire cin ;
wire [3:0] S ;
wire cout ;
4.2 Module
Trang 13 Kết nối theo tên (by port name) :
13
// Internal variables
wire c1 ;
wire c2 ;
wire c3 ;
// Code Starts Here
addbit u0 ( a (A[0]), b (B[0]), ci (cin), sum (S[0]), co (c1));
addbit u1 ( a (A[1]), b (B[1]), ci (c1), sum (S[1]), co (c2));
addbit u2 ( a (A[2]), b (B[2]), ci (c2), sum (S[2]), co (c3));
addbit u3 ( a (A[3]), b (B[3]), ci (c3), sum (S[3]), co (cout));
endmodule // End Of Module adder
Trang 143 Quy định kết nối port:
Input: Kết nối bên trong luôn luôn là kiểu net ; bên ngoài có
thể khai báo kiểu net hoặc reg
Output: Bên ngoài luôn là kiểu net , bên trong có thể là kiểu
net hoặc reg
Cổng không kết nối được cho phép sử dụng dấu “ , ”
4.3 Quy định kết nối port
Output
Input
Inout
Net or reg Net Net
Net or reg
Trang 15Ví dụ:
15
// D flip-flop
if (rst == 1'b1) begin
q <= 0;
q <= 1;
end else begin
q <= d;
end endmodule
q_not
pre
rst clk
Trang 16 Kết nối theo thứ tự (by port order) :
module by_order();
reg clk,d,rst,pre;
wire q;
// ở đây cổng thứ 2 (q_not) không được kết nối
dff u0 (q,,clk,d,rst,pre);
endmodule
4.3 Quy định kết nối port
Trang 17 Kết nối theo tên (by port name) :
17
module explicit();
reg clk,d,rst,pre;
wire q;
// Ở đây, q_not không được kết nối
// có thể kết nối các port không theo thứ tự
dff u0 ( q (q), d (d), clk(clk), q_not (),.rst(rst), pre (pre));
endmodule
Trang 184.4 Bài tập