TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO
GRADUATION RESEARCH 1
Giáo viên hướng dẫn:
TS. Nguyễn Kim Khánh
Sinh viên thực hiện :
Nguyễn Trường Giang
MSSV:
20100228
Lớp:
Việt Nhật IS2 K55
HÀ NỘI, 5/2014
Mục lục
1. Tìm hiểu về DE2i-150 Development Kit .............................................................. 1
1.1. Giới thiệu chung về DE2i-150....................................................................................................... 1
1.2. Cấu tạo của DE2i-150 ................................................................................................................... 1
1.2.1. Sơ đồ khối ............................................................................................................................. 1
1.2.3. Bộ vi xử lý............................................................................................................................. 2
1.2.3. Bộ FPGA................................................................................................................................. 3
1.3.Những điểm ưu việt của DE2i-150 ................................................................................................ 4
2. Tìm hiểu phần mềm Quartus II, ModelSim và ngôn ngữ lập trình VHDL ......... 5
2.1. Quartus II...................................................................................................................................... 5
2.1.1. Giới thiệu về Quartus II ......................................................................................................... 5
2.1.2. Tạo project ............................................................................................................................ 6
2.1.3. Biên dịch và nạp.................................................................................................................... 9
2.2. ModelSim Altera........................................................................................................................ 11
2.2.1. Giới thiệu về ModelSim Altera ........................................................................................... 11
2.2.2. Tạo một project với ModelSim Altera ................................................................................ 11
2.2.3. Biên dịch và chạy mô phỏng. .............................................................................................. 14
2.3. Sử dụng kết hợp Quartus II và ModelSim ................................................................................. 16
2.4. VHDL........................................................................................................................................... 17
2.4.1. Giới thiệu về VHDL .............................................................................................................. 17
2.4.2. Cấu trúc chương trình viết bằng VHDL ............................................................................... 17
2.3.3. Kiểu dữ liệu: ........................................................................................................................ 19
2.3.4. SIGNAL và VARIABLE ........................................................................................................... 20
2.3.4. Toán tử ................................................................................................................................ 20
2.4.5. GENERIC .............................................................................................................................. 21
2.4.6. Mã song song ...................................................................................................................... 22
2.4.7. Mã tuần tự .......................................................................................................................... 22
3.Tìm hiểu về FPGA................................................................................................ 24
3.1. Khái niệm ................................................................................................................................... 24
3.2. So sánh FPGA với các loại vi mạch khác ..................................................................................... 24
3.3. Cấu tạo của FPGA ....................................................................................................................... 24
3.3.1. Logic Blocks ....................................................................................................................... 25
3.3.2. Programmable Interconnects............................................................................................... 26
3.3.3. I/O Blocks ........................................................................................................................... 26
3.3.4. Các khối thiết kế sẵn ........................................................................................................... 27
3.4. Ứng dụng của FPGA ................................................................................................................... 27
4. Hướng nghiên cứu............................................................................................. 28
4.1. Hướng nghiên cứu: .................................................................................................................... 28
4.2. Lí do chọn đề tài: ........................................................................................................................ 28
4.2. Mục tiêu nghiên cứu .................................................................................................................. 28
4.4. Các vấn đề sẽ nghiên cứu........................................................................................................... 28
Danh mục tài liệu tham khảo ..................................................................................... 29
Danh mục hình vẽ
Hình 1.1: Sơ đồ khối của kit DE2i-150 ....................................................................... 1
Hình 2.1: Giao diện của Quartus II 12.0 ..................................................................... 5
Hình 3.1: Sơ đồ khối FPGA ...................................................................................... 25
Hình 3.2. Một số ví dụ của logic cell ......................................................................... 25
Hình 3.3. Sơ đồ khối chuyển mạch lập trình được ................................................... 26
Hình 3.4. Cấu trúc PIP ............................................................................................. 26
Hình 3.5. Một ví dụ mô hình I/O cell ......................................................................... 27
1. Tìm hiểu về DE2i-150 Development Kit
1.1. Giới thiệu chung về DE2i-150
DE2i-150 là một nền tảng đột phá, với sự kết hợp của bộ vi xử lí nhúng Intel N2600
và bộ Altera Cyclone IV GX FPGA của hãng Altera. Chính nhờ sự kết hợp này, DE2i150 trở thành một hệ thống máy tính đầy đủ tính năng, và có hiệu năng xử lý rất cao.
Đặc biệt, bộ Altera Cyclone IV GX FPGA nằm trên board DE2i-150 có thể tăng tốc
khả năng đáp ứng của hệ thống mà vẫn giữ nguyên chi phí giải pháp và hiệu quả năng
lượng.
DE2i-150 có đến 150.000 phần tử logic, với sự mền dẻo, linh hoạt của khả năng tái
cấu trúc phần cứng, nó có thể đáp ứng cho bất cứ nhiệm vụ nào.
Bộ vi xử lí của Intel và bộ thiết bị FPGA được liên kết với nhau thông qua 2 luồng
PCIe tốc độ cao, đảm bảo cho việc truyền dữ liệu giữa chúng đạt tốc độ cao.
Chính nhờ những điều này, DE2i-150 sẽ là một công cụ tuyệt vời để xử lý các tác vụ
đặc biệt, cũng như thiết kế phần cứng.
1.2. Cấu tạo của DE2i-150
1.2.1. Sơ đồ khối
Hình 1.1: Sơ đồ khối của kit DE2i-150
1
Qua sơ đồ trên, ta có thể nhận thấy, kit DE2i-150 gồm 2 khối: khối bên trái là Intel
Atom Processor, khối bên phải là FPGA Altera Cyclone GX. Hai khối liên kết với
nhau bởi 2 đường PCIe.
1.2.3. Bộ vi xử lý
Các thông số kĩ thuật:
CPU : Intel® Atom™ Dual Core Processor N2600( 1M Cache, 1.6GHz )
Intel® Hyper-Threading Technology
Intel SpeedStep® Technology
Instruction Set : 64-bit
Instruction Set Extensions : SSE2, SSE3, SSSE3
Integrated Graphics
Graphics Base Frequency : 400MHz
Chipset : Intel® NM10 Express Chipset
DMI x2 to CPU
Intel® High Definition Audio
Serial ATA (SATA) 3 Gb/s
Universal Serial Bus(USB) Hi-Speed USB 2.0
PCI Express Gen 1
Memory
DDR3 SO-DIMM SDRAM
Display
VGA
HDMI 1.3a
Intel® Centrino® Wireless-N 135
802.11b/g/n
Bluetooth 4.0
Wi-Fi Direct
Audio Codec
Realtek ALC272VA3-GR
BIOS
DIP package Bios Flash : GD25Q16
Programming Interface for Bios : Dedi-Prog Interface
Debug Interface
XDP header
Clock System
CK505 : 9VRS4339B
32768 Hz RTC crystal
27MHz VGA clock source
Ethernet
2
Intel® 82583V GbE Controller
10/100/1000 Mb/s RJ45
3 status indicting LEDs
Others
Power header for hard-disk
Current limit for USB
Buzzer
Mini PCIE header (Default for Intel® Centrino® Wireless-N 135 WiFi
module)
mSATA header
RTC battery : CR2032
1.2.3. Bộ FPGA
Các thông tin chi tiết của bộ FPGA:
Featured Devices
Cyclone IV EP4CGX150DF31 device
149,760 Les
720 M9K memory blocks
6,480 Kbits embedded memory
8 PLLs
FPGA configuration
JTAG and AS mode configuration
EPCS64 serial configuration device
On-board USB Blaster circuitry
Memory devices
128MB (32Mx32bit) SDRAM
4MB (1Mx32) SSRAM
64MB (4Mx16) Flash with 16-bit mode
SD Card socket
Provides SPI and 4-bit SD mode for SD Card access
Connectors
Ethernet 10/100/1000 Mbps ports
High Speed Mezzanine Card (HSMC)
40-pin expansion port
VGA-out connector
VGA DAC (high speed triple DACs)
DB9 serial connector for RS-232 port with flow control
Clock
Three 50MHz oscillator clock inputs
SMA connectors (external clock input/output)
3
Display
16x2 LCD module
Switches and indicators
18 slide switches and 4 push-buttons switches
18 red and 9 green LEDs
Eight 7-segment displays
Other features
Infrared remote-control receiver module
TV decoder (NTSC/PAL/SECAM) and TV-in connector
1.3.Những điểm ưu việt của DE2i-150
Sự kết hợp giữa bộ vi xử lí Intel Atom và bộ FPGA của Altera giúp cho kit trở
thành một hệ thống hoàn chỉnh, mạnh mẽ và đầy đủ các chức năng.
Số lượng thành phần logic lớn (150.000 phần tử logic) với khả năng tái cấu trúc
linh hoạt, mềm dẻo.
Được nhà sản xuất cung cấp các phần mềm, môi trường phù hợp trên cả
windown và linux
Có đầy đủ các hệ thống vào ra và kết nối mạng
4
2. Tìm hiểu phần mềm Quartus II,
ModelSim và ngôn ngữ lập trình VHDL
2.1. Quartus II
2.1.1. Giới thiệu về Quartus II
Quartus II là một sản phẩm phần mềm của hãng Altera . Nó cung cấp môi trường thiết
kế hoàn thiện, đa nền tảng, dễ dàng đáp ứng các nhu cầu thiết kế cụ thể. Nó là một
môi trường toàn diện cho việc thiết kế SOPC(system-on-a-programmable-chip).
Quartus II bao gồm các giải pháp cho cả quá trình thiết kế FPGA và CPLD.
Quartus II cung cấp các khả năng thiết kế sau:
Công cụ soạn thảo: VHDL, AHDL và Verilog HDL.
Là công cụ mạnh mẽ trong tổng hợp logic
Phân tích thời gian (timming analysis)
Tự động định vị lỗi
Place & Route
Có giao diện đồ họa và giao diện dòng lệnh tiện dụng
Tự động nhận diện các linh kiện khi kết nối
Phân tích logic nhúng với công cụ phân tích SignalTap II
….
Hình 2.1: Giao diện của Quartus II 12.0
5
2.1.2.Tạo project
Từ giao diện chính của Quartus II, chọn File > New Project Winzard
Chọn Next để tiếp tục, sau đó điền vào nởi lưu trữ project, nhập tên project
6
Chọn next để chọn file cần include vào project nếu có. Nếu không có thể ấn next ngay
Sau khi add file thành công, ấn next để tiếp tục thiết lập linh kiện (Family & Device
Settings), chọn FPGA mà ta dùng.
7
Ấn next để tiếp tục thiết lập bộ công cụ EDA, thường thì Quartus II sẽ mặc định công
cụ mô phỏng là ModelSim-Altera, và ngôn ngữ VHDL. Bạn có thể chọn ngôn ngữ và
bộ phỏng tùy ý, ngoài ra còn cung cấp bộ Timming, Symbol …
Ấn next để tiếp tục, một màn hình sẽ hiện ra ghi lại những thông số ta đã thiết lập cho
project.
Ấn Finish để hoàn thành, hoặc back để chỉnh sửa các thông số.
8
Sau khi project được tạo, chọn file > New file để tạo một file mới và bắt đầu lập trình.
Ấn file > Save để lưu file.
2.1.3.Biên dịch và nạp
Sau khi code xong một file, chỉ định chân pin cho đầu ra và đầu vào. Chọn Processing
> Start > Start Analysis & Elaboration. Sau đó chọn Assignments > Pins Planner,
chọn các chân cho đầu vào và đầu ra tùy vào từng thiết bị
9
Để biên dịch file ta chọn Processing > Start Compilation. Nếu file có lỗi sẽ hiện thông
báo ở dưới như hình dưới.
Có thể ấn trực tiếp vào lỗi để hiện thị đọa code bị lỗi. Quá trình biên dịch hoàn thành
khi không có lỗi, và ta bắt đầu nạp chương trình chạy vào phần cứng. Trước tiên có
thể nạp chương trình chạy vào phần cứng, ta phải kết nối phần cứng với máy tính. Sau
đó chọn Tools > Programmer, cửa sổ Programmer xuất hiện.
10
Click vào Hardware Setup, trong mục currently selected hardware chọn USB-Blaster
[USB-0]
Sau đó click vào Close.
Nếu trong Programmer chưa có file cần nạp thì chọn Add file để chọn file.
Chọn file cần nạp và ấn Start để bắt đầu nạp vào phần cứng.
2.2. ModelSim Altera
2.2.1. Giới thiệu về ModelSim Altera
ModelSim Altera cũng là một sản phẩm phần mềm do hãng Altera cung cấp, là một
công cụ vừa có khả năng lập trình phần cứng, vừa có khả năng chạy mô phỏng.
2.2.2. Tạo một project với ModelSim Altera
Từ giao diện chính, chọn File>New project, điền tên project và chọn đường dẫ để lưu
project.
11
Cửa sổ Add items to the Project hiện ra, yêu cầu thêm đối tượng vào cho Project.
Chọn Create New File.
12
Trong cửa sổ Create Project File, nhập tên của file, chọn kiểu file.
Sau khi tạo xong file, cửa sổ editor hiện ra, cho phép ta lập trình.
13
2.2.3. Biên dịch và chạy mô phỏng.
Sau khi đã tạo xong file, để biên dịch, chọn Compile>Compile All
Nếu không có lỗi gì xảy ra trong quá trình biên dịch, ta có thể bắt đầu chạy mô phỏng
bằng cách chon Simulate > Start Simulate.
14
Cửa sổ Start Simulation hiện ra, chọn vào tab Design > work > ten_file và ấn OK:
Để chọn dạng mô phỏng wave, chọn Add>To Wave>All items in region:
15
Trong tab Wave, chuột phải vào các biến đầu vào,chọn force để thiết lập giá trị, tiếp
tục chọn Simulate > Run 100
2.3. Sử dụng kết hợp Quartus II và ModelSim
Chúng ta có thể sử dụng kết hợp Quartus II và ModelSim để thiết kế mạch và chạy mô
phỏng.Trong đó Quartus II đóng vai trò là công cụ lập trình, và vẽ sơ đồ thiết kế
mạch,ModelSim đóng vai trò là công cụ chạy mô phỏng để kiểm tra tính đúng đắn của
mạch đã được thiết kế bằng Quartus II.
Để sử dụng kết hợp Quartus II và ModelSim, ta cần chọn ModelSim là công cụ mô
phỏng trong bước tạo project trong Quartus II(Xem mục 2.1.2.Tạo project) hoặc chuột
phải vào thiết bị trong Entity > Settings… > Simulation, trong mục Tool name >
ModelSim-Altera.
16
2.4. VHDL
2.4.1. Giới thiệu về VHDL
VHDL(Very high speed integrated circuit Hardware Description Language) là một
trong các ngôn ngữ mô tả phần cứng được sử dụng rộng rãi hiện nay. VHDL là ngôn
ngữ mô tả phần cứng cho các vi mạch tích hợp có tốc độ cao như FPGA, CPLD
…VHDL cũng được sử dụng như một ngôn ngữ lập trình song song.
VHDL là ngôn ngữ mô phỏng phần cứng được phát triển dùng cho chương trình
VHSIC (Very High Speed Intergrated Circuit) của bộ quốc phòng Mỹ. Mục tiêu của
việc phát triển VHDL là có được một ngôn ngữ mô phỏng phần cứng tiêu chuẩn và
thống nhất cho phép phát triển thử nghiệm các hệ thống số nhanh hơn, cũng như cho
phép dễ dàng đưa các hệ thống đó vào ứng dụng trong thực tế
2.4.2. Cấu trúc chương trình viết bằng VHDL
Một đoạn Code VHDL chuẩn cần có tối thiểu 3 mục sau:
LIBRARY(thư viện): chứa một danh sách của tất cả các thư viện được sử dụng
trong thiết kế. Ví dụ: ieee, std, work, …
VD:
LIBRARY library_name;
USE library_name.package_name.package_parts;
ENTITYI(thực thể): Mô tả các chân vào ra (I/O pins) của mạch. Cú pháp như
sau:
ENTITY entity_name IS
PORT (
port_name : signal_mode signal_type;
port_name : signal_mode signal_type;
...);
END entity_name;
Signal_mode: có thể là IN, OUT, INOUT, hoặc BUFFER
Signal_type: kiểu dữ liệu, có thể là BIT, STD_LOGIC, INTERGER…
Port_name: tên của cổng, có thể là bất cứ gì, ngoại trừ các từ khóa của VHDL
Vd:
ENTITY nand_gate IS
PORT (a, b : IN BIT;
x : OUT BIT);
END nand_gate;
ARCHITECTURE(kiến trúc): chứa mã VHDL, mô tả mạch sẽ họat động như
thế nào. Cú pháp như sau:
17
ARCHITECTURE architecture_name OF entity_name IS
[declarations]
BEGIN
(code)
END architecture_name;
[declarations]: phần mô tả, nơi các tín hiệu và các hằng được khai báo
Vd:
ARCHITECTURE tg OF nand_gate IS
BEGIN
x <= a NAND b;
END tg;
Các mô hình kiến trúc:
Mô hình hoạt động: mô tả các hoạt động của hệ thống, hệ thống đáp ứng
với tín hiệu đầu vào như thế nào, đưa ra kết quả gì ở đầu ra, dưới dạng
ngôn ngữ lập trình bậc cao. Cấu trúc có thể có Process, wait, if, case, for,
loop…
Vd: ARCHITECTURE behavioral of decode2x4 is
BEGIN
Process (A,B,ENABLE)
Variable ABAR,BBAR: bit;
Begin
ABAR := not A;
BBAR := not B;
If ENABLE = ‘1’ then
Z(3) <= not (A and B);
Z(0) <= not (ABAR and BBAR);
Z(2) <= not (A and BBAR);
Z(1) <= not (ABAR and B);
Else
Z <= not (ABAR and B);
End if;
End process;
END behavioral;
Mô hình cấu trúc: có thể gồm nhiều cấp cấu trúc, từ cổng logic đơn giản
đến xây dựng một hệ thống hoàn thiện. Thực chất việc mô tả cấu trúc là
mô tả các phần tử bên trong một hệ thống và sự kết hợp của các phần tử
đó
Khai báo các thành phần:
Component
18
Tên_componemt port [ danh sách ];
End component;
Mô hình kết hợp: là sự kết hợp của hai mô hình trên
2.3.3. Kiểu dữ liệu:
Các kiểu dữ liệu tiền định nghĩa:
BIT và BIT_VECTOR: 2 mức logic “0” và “1”
STD_LOGIC và STD_LOGIC_VECTOR
Hệ logic 8 giá trị sau đây được giới tiệu trong chuẩn IEEE 1164:
- ‘X’
không xác định ( bắt buộc)
- ‘0’
mức thấp ( bắt buộc)
- ‘1’
mức cao ( bắt buộc)
- ‘Z’
trở kháng cao
- ‘W’
không xác định (yếu)
- ‘L’
mức thấp ( yếu)
- ‘H’
mức cao ( yếu)
- ‘-’
không quan tâm
STD_ULOGIC và STD_ULOGIC_VECTOR: là mở rộng của
STD_LOGIC và STD_LOGIC_VECTOR, thêm một giá trị logic là ‘U’
Các kiểu dữ liệu người dùng định nghĩa:
Vd:
TYPE integer IS RANGE -2147483647 TO +2147483647;
-- định nghĩa kiểu interger
TYPE my_logic IS ('0', '1', 'Z');
-- Một tập con của std_logic mà người dùng định nghĩa
Các kiểu con: là kiểu dữ liệu đi kèm theo điều kiện dàng buộc
Vd:
SUBTYPE natural IS INTEGER RANGE 0 TO INTEGER'HIGH;
-- natural là một kiểu con (tập con) của INTEGER, với giá trị từ
0->INTERGER’HIGH
Mảng: là một tập hợp các giá trị cùng kiểu. Mảng có thể là mảng 1 chiều (1D),
hai chiều (2D), hoặc là mảng 1 chiều của 1 chiều(1Dx1D) và có thể là các
mảng có chiều cao hơn.
Để chỉ định một kiểu mảng mới:
TYPE type_name IS ARRAY (specification) OF data_type;
Để tạo sử dụng kiểu mảng mới:
SIGNAL signal_name: type_name [:= initial_value];
Mảng cổng
Kiểu bản ghi: tương tự như mảng, nhưng chứa những kiểu giá trị khác nhau
19
TYPE birthday IS RECORD
day: INTEGER RANGE 1 TO 31;
month: month_name;
END RECORD;
Kiểu dữ liệu có dấu và không dấu: được định nghĩa trong gói std_logic_arith
của thư viện ieee, dùng để biểu diễn số có dấu và không dấu.
Vd: SIGNAL x: SIGNED (7 DOWNTO 0);
SIGNAL y: UNSIGNED (0 TO 3);
Vd:
Chuyển đổi dữ liệu: VHDL không cho phép các phép toán trực tiếp ( số học,
logic, …) tác động lên các dữ liệu khác kiểu nhau.
Nhiều hàm chuyển đổi dữ liệu có thể được tìm trong gói std_logic_arith của
thư viện ieee:
conv_integer(p):chuyển đổi một tham số p của kiểu INTEGER,
UNSIGNED, SIGNED, hoặc STD_ULOGIC thành một giá trị
INTEGER. Lưu ý rằng STD_LOGIC_VECTOR không được kể đến.
conv_unsigned(p, b): chuyển đổi một tham số p của kiểu INTEGER,
UNSIGNED, SIGNED, hoặc STD_ULOGIC thành một giá trị
UNSIGNED với kích cỡ là b bit.
conv_signed(p, b): chuyển đổi một tham số p của kiểu INTEGER,
UNSIGNED, SIGNED, hoặc STD_ULOGIC thành một giá trị SIGNED
với kích cỡ là b bits.
conv_std_logic_vector(p, b): chuyển đổi một tham số p thuộc kiểu dữ
liệu INTEGER, UNSIGNED, SIGNED, hoặc STD_LOGIC thành một
giá trị STD_LOGIC_VECTOR với kích thước b bits.
2.3.4. SIGNAL và VARIABLE
VHDL có hai cách định nghĩa các giá trị không tĩnh: bằng SIGNAL hoặc bằng
VARIABLE.
SIGNAL có thể được khai báo trong PACKAGE, ENTITY hoặc
ARCHITECTURE (trong phần khai báo của nó).
VARIABLE có thể được mô tả bên trong một phần của mã tuần tự.
Giá trị của VARIABLE có thể không bao giờ định nghĩa ngoài PROCESS một cách
trực tiếp, nếu cần, thì nó phải được gán thành SIGNAL.
Phép toán gán cho SIGNAL là “<=” (ví dụ sig <= 5), trong khi với VARIABLE là
“:=” (ví dụ var := 5).
2.3.4. Toán tử
Toán tử gán: có 3 loại toán tử gán:
<= (dùng cho giá trị SIGNAL)
:= (dùng cho giá trị VARIABLE, CONSTANT, GENERIC)
=> (dùng cho các thành phần vector và các giá trị kiểu khác)
20
Vd:
SIGNAL x : STD_LOGIC;
VARIABLE y : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL w: STD_LOGIC_VECTOR(0 TO 7);
x <= ‘1’;
y := “0000”;
w <= “10000000”;
w <= (0 =>'1', OTHERS =>'0');
Toán tử logic: dùng cho BIT, STD_LOGIC, STD_ULIGIC,
BIT_VECTOR,STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR.
Bao gồm các toán tử logic: NOT, AND, OR, NAND, NOR, XOR, XNOR
Toán tử toán học: dùng cho các kiểu dữ liệu :INTEGER, SIGNED,
UNSIGNED, REAL
Bao gồm các toán tử:
+
Toán tử cộng.
Toán tử trừ.
*
Toán tử nhân.
/
Toán tử chia.
**
Toán tử lấy mũ.
MOD Phép chia lấy phần nguyên.
REM Phép chia lấy phần dư.
ABS Phép lấy giá trị tuyệt đối.
Toán tử so sánh
Có các toán tử so sánh sau:
=
So sánh bằng
/=
So sánh không bằng.
<
So sánh nhỏ hơn.
>
So sánh lớn hơn.
<=
So sánh nhỏ hơn hoặc bằng.
>=
So sánh lớn hơn hoặc bằng.
Toán tử dịch
Cú pháp sử dụng toán tử dịch là:
<left operand> <shift op eration> <right operand>
Trong đó:
<left operand> có kiểu là BIT_VECTOR
<right operand> có kiểu là INTEGER.
Có hai toán tử dịch:
- Sll Toán tử dịch trái. Điền 0 vào phía phải.
- Rll Toán tử dịch phải. Điền 0 vào phía trái.
2.4.5. GENERIC
GENERIC là một cách tạo các tham số dùng chung (giống như các biến static trong
các ngôn ngữ lập trình). Tham số này có thể gọi được từ bất cứ nơi nào, trong một
21