LỜI NÓI ĐẦU
Sự phát triển ngày càng nhanh chóng của Internet và các ứng dụng
giao dịch điện tử trên mạng, nhu cầu bảo vệ thông tin trong các hệ thống và
ứng dụng điện tử ngày càng được quan tâm và có ý nghĩa hết sức quan
trọng. Các kết quả của khoa học mật mã ngày càng được triển khai trong
nhiều lĩnh vực khác nhau của đời sống xã hội, trong đó phải kể đến rất
nhiều ứng dụng dân sự, thương mại, quân sự… Các ứng ụng mã hoá thông
tin cá nhân, trao đổi thông tin kinh doanh, thực hiện các giao dịch điện tử
qua mạng…đã trở nên gần gũi và quen thuộc với mọi người. Nhất là trong
lĩnh vực quân sự cần phải có độ bảo mật cao.
Với sự phát triển của công nghệ hiện nay, các bộ xử lý có tốc độ và
khả năng xử lý ngày càng cao, nhiều phương pháp mã hoá đã không còn
đảm bảo độ an toàn cao, đòi hỏi cần phải có một phương pháp mã hoá mới
có thể đảm bảo độ an toàn cho thông tin. Phương pháp mã hoá Rijndael ra
đời đã đáp ứng được phần nào độ an toàn mà các phương pháp mật mã
trước còn hạn chế.
Bên cạnh đó, các phương pháp thiết kế với trợ giúp đắc lực của máy
tính dựa trên nền tảng công nghệ FPGA đã và đang tỏ rõ tính ưu việt của
nó. Không những chúng đáp ứng được yêu cầu về mặt tích hợp, về tính bảo
mật mà còn giúp giảm thiểu giá thành thiết kế và rút ngẵn thời gian thiết
kế. Mặc dù ra đời từ cách đây hơn 2 thập kỷ, công nghệ FPGA ở nước ta
vẫn còn là một lĩnh vực tương đối mới mẻ, đặc biệt là đối với các sinh viên.
Vì thế tôi chọn đề tài: “ Tích hợp thuật toán mật mã Rijndael trên FPGA”.
Nhệm vụ đặt ra của đề tài là: nghiên cứu về công nghệ FPGA, tìm
hiểu về thuật toán mật mã Rijndael và cài đặt thuật toán bằng ngôn ngữ mô
tả phần cứng VHDL, sử dụng phần mềm tích hợp để mô phỏng thực hiện
1
của thuật toán khi tích hợp trên FPGA. Từ nhiệm vụ đặt ra đó đề tài chia
làm 3 chương sau:
Chương I : FPGA và ngôn ngữ mô tả phần cứng VHDL.
Chương II: Thuật toán mật mã Rijndael.
Chương III: Thực hiện thuật toán Rijndael trên FPGA
Trong quá trình làm đồ án tôi đã được các thầy giáo, đặc biệt thầy
giúp đỡ trong việc tìm hiểu các kiến thức cần thiết cho đồ án, và phương
pháp để hoàn thành đồ án; đồng thời cán bộ chỉ huy các cấp đã tạo điều
kiện rất nhiều về mặt thời gian cho tôi thực hiện nhiêm vụ đồ án được giao.
Tôi rất chân thành cảm ơn các thầy và cán bộ chỉ huy các cấp là những
người đóng góp một phần rất lớn cho việc hoàn thành đồ án này của tôi.
2
MỤC LỤC
CHƯƠNG 1 4
CÔNG NGHỆ FPGA VÀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL 4
1.1.1.Sự phát triển của các thiết bị lập trình được 5
1.1.2.Cấu trúc cơ bản của FPGA 8
1.1.3.Ứng dụng của FPGA 12
1.2.1.Ngôn ngữ mô phỏng phần cứng (HDL) 13
1.2.1.1 Các phương pháp truyền thống 13
1.2.1.2 Ngôn ngữ mô phỏng phần cứng (HDL) 15
1.2.2.Ngôn ngữ mô phỏng phần cứng VHDL 15
1.2.2.1 Giới thiệu 15
1.2.2.2 VHDL có một số ưu điểm hơn hẳn các ngôn ngữ mô phỏng phần
cứng khác 16
1.2.2.3 Cấu trúc một mô hình hệ thống mô tả bằng VHDL 18
THUẬT TOÁN MẬT MÃ RIJNDAEL 26
2.6.1. Khả năng an toàn 54
2.6.2. Đánh giá 55
CHƯƠNG 3 56
THỰC HIỆN THUẬT TOÁN RIJNDAEL TRÊN FPGA VÀ KẾT QUẢ 56
3.1. THỰC HIỆN THUẬT TOÁN RIJNDAEL TRÊN FPGA 56
3.1.1 Quá trình mã hóa và giải mã 56
3.1.2. Xây dựng các modul 58
3.1.3. Thực hiện thiết kế 65
3.2. KẾT QUẢ THỰC HIỆN 71
KẾT LUẬN 75
TÀI LIỆU THAM KHẢO 76
3
CHƯƠNG 1
CÔNG NGHỆ FPGA VÀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL
1.1. TỔNG QUAN VỀ CÔNG NGHỆ FPGA
Công nghệ chế tạo vi mạch điện tử ngày nay đang có sự thay đổi lớn:
từ một mạch tích hợp vi điện tử với cơ sở thiết bị công nghệ tiên tiến chế
tạo ra với số lượng lớn chuyển dần sang các mạch chuyên dụng sản xuất
với lô nhỏ tại các cơ sở có điều kiện công nghệ chưa phát triển. Sự thay đổi
đó được hình thành nhờ các công cụ thiết kế tự động. Động lực chính của
quá trình thay đổi này là nhằm giảm thời gian thiết kế, chế tạo vi mạch và
tăng tính linh hoạt cho người thiết kế lập trình với những ứng dụng riêng
biệt.
FPGA (Field-programmable Gate Array) là một thiết bị bán dẫn (IC)
chứa các cổng logic có khả năng lập trình được. Chúng bao gồm các khối
logic thực hiện các chức năng cơ bản như AND, OR… hay phức tạp hơn
như các hàm toán học, bộ giải mã, trigger, register… và cả các phần tử nhớ,
các mạng lưới kết nối có thể lập trình và các khối vào ra với các mạch
khác. FPGA còn được gọi là thiết bị có khả năng tái cấu hình, được ứng
dụng rộng rãi cho việc thiết kế các vi mạch chuyên dụng. Và chúng ta có
thể biến nó thành một con IC có chức năng và tốc độ rất cao.
Một cách tổng quát FPGA được cấu tạo từ 3 thành phần:
Khối Logic
Mạng kết nối trong có thể lập trình
Khối vào/ra
4
Có thể tổ hợp tuỳ ý các thành phần này để tạo ra các mạch chức năng
như ý muốn.
1.1.1. Sự phát triển của các thiết bị lập trình được
Các thiết bị lập trình được đóng vai trò quan trọng lâu dài trong thiết
kế các vi mạch với những ứng dụng riêng biệt trong ngành điện tử - viễn
thông. Chúng là các chíp đa dụng có thể được cấu hình theo nhiều cách cho
ứng dụng. Loại đầu tiên của thiết bị lập trình được sử dụng rộng rãi là
PROM (Programmable Read Only Memory). PROM là thiết bị lập trình
được một lần gồm một dãy các ô nhớ chỉ đọc.
Có hai loại PROM cơ bản, một loại chỉ có thể lập trình bởi nhà sản
xuất gọi là mask programmable và một loại có thể lập trình bởi người sử
dụng gọi là field programmable. Các chíp mask programmable có tốc độ
làm việc cao vì các kết nối bên trong thiết bị được thực hiện bằng phần
cứng ngay từ khi sản xuất. Ngược lại, các kết nối của field programmable
luôn cần đến một số loại chuyển mạch lập trình được (cầu chì, transistos )
vì vậy tốc độ chậm hơn kết nối cứng. Tuy nhiên, thiết bị field
programmable có nhiều ưu điểm giá trị hơn là sự hạn chế về tốc độ như :
Các chíp field programmable rẻ hơn các chíp mask
programmable khi sản xuất với số lượng nhỏ
Các chíp field programmable có thể lập trình tức thì trong một
thời gian rất ngắn, trong khi các chíp mask programmable khi sản xuất phải
mất hàng tháng.
Hai biến thể của PROM là EPROM (Erasable Programmble Read
Only Memory) và EEPROM (Electrically Erasable Programmable Read
Only Memory) chúng đều có chung một ưu điểm là có thể xóa và lập trình
nhiều lần.
5
Một loại thiết bị lập trình được khác được thiết kế đặc biệt để thể hiện
các mạch logic là PLD (Programmable Logic Device) : Một PLD thông
thường gồm một dãy các cổng AND được nối với một dãy các cổng OR.
Loại cơ bản nhất của PLD là PAL ( Programmable Array Logic). PAL gồm
một khối các cổng AND lập trình được nối đến một khối các cổng OR cố
định. Một loại PLD khác linh hoạt hơn đó là PLA (Programmable Logic
Array) cũng có cấu trúc giống PAL nhưng tất cả các kết nối là lập trình
được. Cấu trúc này có các mắt lưới của các đường nối theo chiều ngang và
chiều đướng. Tại mỗi điểm giao nhau là một cầu chì, với sự trợ giúp của
các công cụ phần mềm, người thiết kế có thể lựa chọn mỗi nối nào không
được nối thì hủy cầu chì mà không cần dùng đó đi ( nung nóng và đốt đứt
cầu chì đó). Điều nầy được thực hiện bởi một bộ nạp chương trình. Cả hai
loại PAL và PLA cho phép thực hiện các mạch logic tốc độ cao, tuy nhiên
cấu trúc đơn giản của chúng chỉ cho phép thực hiện các mạch logic cỡ nhỏ.
Hình1.1: Cấu trúc của PLA Hình1.2: Cấu trúc của PAL
Để thực thi các mạch yêu cầu nhiều đầu vào và nhiều đầu ra có nhiều
chíp tinh vi hơn gọi là thiết bị logic lập trình phức hợp CPLD ( Complex
Programmable Logic Device), họ này là kết quả của việc tăng mật độ của
họ PLDs lên nhiều lần. Khái niệm này được hiểu là có một số khối PLD
hoặc macrocell (tế bào vĩ mô ) ở trong một thiết bị đơn cùng với các đường
6
nối liền đa năng giữa chúng. Các đường nối của các đơn vị logic đơn giản
có thể được thực thi ở trong một khối đơn. Nhiều đơn vị logic phức tạp yêu
cầu nhiều khối và sử dụng các đường nối đa năng giữa chúng để tạo nên
các kết nối phức tạp hơn.
Các CPLDs cực kỳ thích hợp trong việc mô tả các cổng logic phức tạp
với tốc độ lớn 200 Mhz. Khuôn mẫu thời gian cho CPLD rất dễ tính toán,
bởi thế trước khi bắt đầu thiết kế chúng ta có thể tính toán các tốc độ từ đầu
vào đến đầu ra của mình dựa trên khuôn mẫu này. CPLDs đưa ra cách đơn
giản nhất để thực hiện một thiêt kế, một thiết kế có thể được mô tả bởi các
sơ đồ hoặc bằng một ngôn ngữ mô tả phần cứng, đơn giản khi sử dụng các
công cụ phát triển để tối ưu hóa, nạp và mô phỏng thiết kế. Các công cụ
thiết kế tạo ra một file chương trình ma file này được dùng để đưa các
chuẩn logic vào trong một chíp CPLD cùng với chức năng mong muốn.
Giả sử nếu cần có một sự thay đổi về thiết kế, chúng ta có thể đưa sự thay
đổi dó vào trong công cụ phát triển CPLD và thực thi trên nó sau đó có thể
kiểm tra lại ngay thiết kế. CPLD có mức tích hợp rất cao và được đóng gói
trong một khuôn dạng rất nhỏ. Điều này đã cung cấp một giải pháp tuyệt
vời cho những người thiết kế cần sản phẩm của mình được gói nhỏ gọn với
diện tích bo mạch bị giới hạn về khoảng không gian.
Hình 1.3 : Cấu trúc của CPLD
7
FPGA được công ty Xilinx giới thiệu lần đầu vào năm 1985 nhằm tạo
ra một thiết bị lập trình có độ tích hợp cao. FPGA cho phép tính hợp số
lượng tương đối lớn các phần tử bán dẫn vào một vi mạch so với kiến trúc
trước đó là CPLD. FPGA có khả năng chứa tới từ 100 000 đến hàng tỷ
cổng logic, trong khi CPLD chỉ chứa từ 10 000 đến 100 000 cổng logic,
con số này đối với PAL, PLA còn thấp hơn nữa chỉ đạt vài nghìn đến
10000.
Kiến trúc của FPGA là kiến trúc mảng các khối logic, khối logic nhỏ
hơn nhiều nếu đem so sánh với một khối SPLD ( SPLD thường là một
mảng logic AND/OR lập trình được có kích thước xác định và chứa một số
lượng hạn chế các phần tử logic đồng bộ), ưu điểm này giúp FPGA có thể
chứa nhiều hơn các phần tử logic và phát huy tối đa khả năng lập trình của
các phần tử logic và hệ thống mạch kết nối, để đạt được mục đích này thì
kiến trúc FPGA phức tạp hơn nhiều so với CPLD.
Một điểm khác biệt với CPLD là trong những FPGA hiện đại được
tích hợp nhiều những bộ logic số học đã sơ bộ tối ưu hóa, hỗ trợ RAM,
ROM, tốc độ cao, hay các bộ nhân cộng.
Ngoài khả năng tái cấu trúc vi mạch toàn cục, một số FPGA hiện đại
còn hỗ trợ tái cấu trúc bộ phận, tức là khả năng tái cấu trúc một bộ phận
riêng lẻ trong khi vẫn bảo đảm hoạt động bình thường cho các bộ phận
khác.
1.1.2. Cấu trúc cơ bản của FPGA
FPGA gồm một dãy các phần tử rời rạc có thể được kết nối với nhau
bằng các nguồn kết nối chung, các kết nối giữa các phần tử có thể lập trình
được. Hình 1.4 giới thiệu về mô hình tổng quát của một FPGA. Nó gồm
dãy 2 chiều các logic block có thể được kết nối bằng các nguồn kết nối
8
chung. Nguồn kết nối là các đoạn dây (segment) có thể có chiều dài khác
nhau, bên trong các kết nối là các chuyển mạch lập trình được dùng để nối
các logic block với các segment hoặc giữa các segment với nhau. Mạch
logic được cài đặt trong FPGA bằng cách ánh xạ logic vào các logic block
riêng rẽ và sau đó nối các logic block cần thiết qua các chuyển mạch.
Trong đó có các khối:
Các khối logic (logic block) : cấu trúc và nội dung của khối
logic được gọi là kiến trúc của nó. Kiến trúc của khối logic có thể được
thiết kế theo nhiều cách khác nhau. Một số khối logic có thể chỉ là các cổng
NAND 2 đầu vào, tuy nhiên cũng có thể nó là một bộ dồn kênh, hay các
bảng tìm kiếm LUT ( Luck-Up Table ). Trong một số loại FPGA các khối
logic có thể có cấu trúc hoàn toàn giống như PAL. Hầu hết các khối logic
chứa một số loại flip-flop để hỗ trợ cho việc thực hiện các mạch tuần tự.
Các nguồn tài nguyên kết nối : Cấu trúc và nội dung của các
nguồn kết nối trong FPGA được gọi là kiến trúc routing. Kiến trúc routing
gồm các đoạn dây nối và các chuyển mạch lập trình được. Các chuyển
mạch lập trình được có thể có nhiều cấu tạo khác nhau. Giống như khối
logic, có nhiều cách để thiết kế kiến trúc routing như : Transistor truyền
( pass - transistor) được điều khiển bởi cell SRAM, cầu chì nghịch ( anti
-fuse), EPROM transistor và EEPROM transistor
Các cổng vào/ra : Các đặc tính I/O của các đầu vào và đầu ra
được hỗ trợ tới 19 các chuẩn tín hiệu khác nhau bao gồm : LVDS, BLVDS,
LVPECL, LVCMOS, HSTL, SSTL và GTL.
9
Hình 1.4 : Mô tả mô hình của một FPGA
Các khối cơ bản của LB ( Logic block ) của FPGA chính là logic cell (
LC : gọi là tế bào logic).
Mỗi một logic cell bao gồm một bộ tạo chức năng ( hay bộ tạo
hàm ) 4 đầu vào, logic nhớ và phần tử lưu trữ ( Filip – Flop loại D ). Đầu ra
bộ tạo chức năng của mỗi Logic Cell điều khiển cả đầu ra LB hoặc đầu vào
D của Flip – Flop. Mỗi một LB có chứa 4 Logic Cell và được tổ chức thành
hai Slice tương tự nhau, một slice đơn có dạng như hình 1.5.
Look – Up Table ( LUT ): Các bộ tạo chức năng của FPGA
thực hiện như LUT có bốn đầu vào. Để hoạt động như một bộ tạo chức
năng, mỗi một LUT có thể cung cấp một RAM 16 x 1 bit đồng bộ. Hơn
nữa hai LUT trong một Slice có thể được kết hợp để tạo RAM 16 x 2 bit
hoặc 32 x 1 bit đồng bộ.
Storage Element : Các phần tử lưu trữ trong Slice của FPGA
có thể được xếp đặt như một Flip – Flop loại D kích hoạt bằng sườn, hoặc
như một bộ đốt nhạy mức. Các đầu vào D có thể được điều khiển hoặc bởi
bộ tạo chức năng trong Slice hoặc trực tiếp từ đầu vào các Slice ( bỏ qua bộ
10
tạo chức năng). Thêm các đường Clock ( CLK ) và Clock Enable ( CE )
( Hình 1.5 ), mỗi Slice có các tín hiệu Set và Reset đồng bộ ( SR và BY ).
Đường SR ép các phần tử lưu trữ về trạng thái khởi tạo, đặc biệt trong
trường hợp nhồi cấu hình. Đường BY ép phần tử lưu trữ về trạng thái
ngược lại. Như đã được lựa chọn hai đường này có thể được sắp xếp để
hoạt động không đồng bộ. Tất cả các tín hiệu điều khiển có thể đảo ngược
một cách hoàn toàn độc lập và chúng được chia sẻ bởi hai Flip – Flop trong
một Slice.
Block RAM : Trong FPGA hợp nhất một vài bộ nhớ RAM
theo khối thành khối lớn hơn ( gọi là SelectRAM+ ), điều này cần bổ sung
các LUT RAM đã được phân phối và kiến trúc bộ nhớ không bền vững này
được thực hiện trong các LB, các khối bộ nhớ Block RAM được tổ chức
theo các cột.
Hình 1.5: Cấu trúc Logic Cell trong FPGA
11
Một FPGA có cấu trúc của các Logic Cell và các đường nối ( Hình
1.6), mà các đường nối này nằm dưới sự điều khiển của người thiết kế. Với
họ FPGA hiện nay đã vượt quá giới hạn 10 triệu cổng.
Hình 1.6 : Cấu trúc của FPGA
1.1.3. Ứng dụng của FPGA
FPGA có thể ứng dụng trong hầu hết các ứng dụng hiện đang dùng
CPLD, PLD và các mạch tích hợp nhỏ. Dưới đây là các ứng dụng điển hình
của FPGA :
Các mạch tính hợp ứng dụng đặc biệt.
Thiết kế mạch ngẫu nhiên: Mạch logic ngẫu nhiên thường
được thực hiện bằng PAL. Nếu tốc độ của mạch không đòi hỏi khắt khe thì
mạch có thể thực hiện thay thế bằng FPGA.
Thay thế các chíp tích hợp nhỏ cho mạch ngẫu nhiên: Các
mạch trong các sản phẩm thương mại thường chứa nhiều chíp SSI ( Small
Scale Intergrated ). Trong nhiều trường hợp các chíp SSI này có thể được
thay thế bằng FPGA và kết quả giảm dienj tích của bo mạch đi đáng kể.
12
Chế tạo mẫu: FPGA rất lý tưởng cho các ứng dụng tạo sản
phẩm mẫu. Giá thành thực hiện thấp và thời gian ngắn.
Máy tính dựa trên FPGA : Một loại máu tính mới có thể được
chế tạo với các FPGA có thể tái lập trình ngay trên FPGA. Các máy này có
một bo mạch chứa các FPGA mà các chân nối với các chíp lân cận giống
như thông thường.
1.2. GIỚI THIỆU NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL
Hiện nay các mạch tích hợp ngày càng thưc hiện được nhiều chức
năng hơn, do đó chúng ngày càng trở nên phức tạp hơn. Các phương pháp
thiết kế mạch truyền thống như dùng tối thiểu hóa hàm Boolean hay dùng
sơ đồ các phần tử không còn đáp ứng được các yêu cầu đặt ra khi thiết kế.
Hơn nữa các mạch thiết kế ra yêu cầu phải được thử nghiệm kỹ lưỡng trước
khi đưa vào chế tạo hàng loạt.
Hơn nữa cần phải xây dựng một bộ tài liệu hướng dẫn vận hành hệ
thống hoàn chỉnh dễ hiểu và thống nhất. Vì thế người ta thường sử dụng
các ngôn ngữ mô phỏng phần cứng làm phương tiện thiết kế, mô phỏng thử
nghiệm các hệ thống số.
1.2.1. Ngôn ngữ mô phỏng phần cứng (HDL)
1.2.1.1 Các phương pháp truyền thống
Phương pháp thiết kế dùng hàm Boolean
Tất cả các mạch dựa trên các phần tử logic cơ bản gồm cổng logic và
các mạch flip-flop đều có thể thiết kế bằng các hàm Boolean. Có nhiều
phương pháp đã được sử dụng để tối thiểu hóa hàm Boolean nhằm tăng
tính hiệu quả sử dụng các phần tử logic, chẳng hạn như phương pháp dùng
bìa cacno. Về mặt lý thuyết bất kỳ hệ thống số nào cũng có thể biểu diễn
13
dưới dạng hàm Boolean. Nhưng việc tối thiểu hóa cũng như xử lý hàng
nghìn hàm logic rõ ràng là không thể. Trong khi các yêu cầu thiết kế hệ
thống hiện nay đòi hỏi tới hàng nhiều nghìn hàm Boolean.
Phương pháp thiết kế dựa trên sơ đồ
Trong phương pháp này, người thiết có thể sử dụng thêm các mạch
chức năng thông dụng khác ngoài các phần tử cơ bản là cổng và flip-flop.
Như vậy, phương pháp này cho phép thiết kế hệ thống một cách có cấu
trúc. Phương pháp thiết kế dựa trên sơ đồ được dùng phổ biến và có rất
nhiều phần mềm thiết kế cung cấp cho người thiết kế một giao diện thiết kế
đồ họa thuận tiện. Trong nhiều năm phương pháp này là phương pháp được
sử dụng chủ yếu trong ngành công nghiệp chế tạo phần cứng số.
Nhược điểm của các phương pháp thiết kế truyền thống
Mặc dù có ưu điểm là dễ hiểu và dễ sử dụng, phương pháp thiết kế
dùng hàm Boolean và phương pháp thiết kế dựa trên sơ đồ có một số nhược
điểm. Nhược điểm lớn nhất của các phương pháp này là chúng chỉ mô tả hệ
thống dưới dạng mảng các phần tử nối với nhau. Nhìn vào một hệ thống
được mô tả bằng hai phương pháp trên ta không thể lập tức chỉ ra được các
chỉ tiêu và chức năng chung nhất của hệ thống. Để thiết kế một hệ thống
bằng phương pháp truyền thống, người thiết kế cần phải đi qua hai bước
thực hiện toàn thủ công : đó là chuyển từ các yêu cầu về chức năng của hệ
thống sang sơ đồ mạch của hệ thống. Cũng tương tự khi cần hiểu được một
hệ thống người phân tích cần phân tích sơ đồ mạch của hệ thống chuyển nó
thành các hàm Boolean sau đó mới lập lại được các chức năng, hoạt động
của hệ thống. Và các bược nói trên hoàn toàn phải thực hiện thủ công
không có bất kỳ sự trợ giúp nào của máy tính. Ở đây người thiết kế chỉ có
thể sử dụng máy tính làm cộng cụ hỗ trợ trong việc vẽ sơ đồ mạch của hệ
thống và chuyển từ sơ đồ mạch sang công cụ tổng hợp mạch vật lý.
14
Một nhược điểm khác của phương pháp thiết kế truyền thống là sự
giới hạn trong độ phức tạp của hệ thống. Phương pháp dùng hàm Boolean
chỉ có thể dùng để thiết kế các hệ thống lớn nhất biểu diễn bởi vài trăm
hàm . phương pháp dựa trên sơ đồ chỉ có thể dùng để thiết kế lớn nhất chứa
tới 6000 phần tử.
1.2.1.2 Ngôn ngữ mô phỏng phần cứng (HDL)
Ngôn ngữ mô phỏng phần cứng giải quyết được nhược điểm lớn nhất
của các phương pháp thiết kế trước đây. Nếu các phương pháp cũ đòi hỏi
phải chuyển đổi từ mô tả hệ thống sang tập hợp các hàm logic bằng tay thì
bước chuyển đổi đó hoàn toàn không cần thiết khi dùng ngôn ngữ mô
phỏng phần cứng. Hầu hết các công cụ thiết kế dùng ngôn ngữ mô phỏng
phần cứng đều cho phép sử dụng biểu đồ trạng thái cho các hệ thống tuần
tự cũng như cho phép sử dụng bảng chân lý cho hệ thống tổng hợp. Việc
chuyển đổi từ các biểu đồ trạng thái và bảng chân lý sang mã ngôn ngữ mô
phỏng phần cứng được thực hiện tự động. Ngôn ngữ mô phỏng phần cứng
được dùng nhiều nhất để thiết kế cho các thiết bị logic lập trình được từ
loại đơn giản đến các loại phức tạp như ma trận cổng lập trình được.
1.2.2. Ngôn ngữ mô phỏng phần cứng VHDL
1.2.2.1 Giới thiệu
VHDL là viết tắt của cụm từ Very High Speed Intergrated Cỉcuit
Hardware Description Language – ngôn ngữ mô phỏng phần cứng cho các
mạch tích hợp tốc độ cao. 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 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ế. Ngôn ngữ VHDL
15
được ba công ty Intermetics, IBM và Texas Intruments bắt đầu nghiên cứu
phát triển vào 7/1983. Phiên bản đầu tiên được công bố vào 8/1985. Sau đó
VHDL được đề xuất để tổ chức IEEE xem xét thành một tiêu chuẩn. Năm
1987, đã đưa ra tiêu chuẩn về VHDL – tiêu chuẩn IEEE – 1076 -1987.
VHDL được phát triển để giải quyết các khó khăn trong việc phát
triển, thay đổi và lập tài liệu cho các hệ thống số. Như ta đã biết, một hệ
thống số có rất nhiều tài liệu mô tả. Để có thể vận hành bảo trì sửa chữa
một hệ thống ta cần tìm hiểu tài liệu đó kỹ kưỡng. Với ngôn ngữ mô phỏng
phần cứng tốt việc xem xét các tài liệu mô tả trở nên dễ dàng hơn vì bộ tài
liệu đó có thể được thực thi để mô phỏng hoạt động của hệ thống. Như thế
ta có thể xem xét toàn bộ các phần tử của hệ thống hoạt động trong một mô
hình thống nhất.
Trước khi VHDL ra đời, có nhiều ngôn ngữ mô phỏng phần cứng
được sử dụng nhưng không có một tiêu chuẩn thống nhất. Các ngôn ngữ
mô phỏng phần cứng đó được phát triển để phục vụ các bộ mô phỏng chạy
chúng. Vì các ngôn ngữ mô phỏng phần cứng đó được các nhà cung cấp
thiết bị phát triển, nên mang các đặc trưng gắn với các thiết bị của nhà cung
cấp đó và thuộc sở hữu của nhà cung cấp.
Trong khi đó, VHDL được phát triển như một ngôn ngữ độc lập
không gắn với bất kỳ một phương pháp thiết kế, bộ mô phỏng hay công
nghệ phần cứng nào. Người thiết kế có thể tự do lựa chọn công nghệ,
phương pháp thiết kế trong khi vấn sử dụng một ngôn ngữ duy nhất.
1.2.2.2 VHDL có một số ưu điểm hơn hẳn các ngôn ngữ mô
phỏng phần cứng khác
Thứ nhất là tính công cộng
VHDL được phát triển dưới sự bảo trợ của chính phủ Mỹ và hiện nay
là một tiêu chuẩn của IEEE, VHDL không thuộc sở hữu của bất kỳ cá nhân
16
hay tổ chức nào. Do đó VHDL được sự hỗ trợ của nhiều nhà sản xuất thiết
bị cũng như nhiều nhà cung cấp công cụ thiết kế mô phỏng hệ thống. Đây
là một ưu điểm nổi bật của VHDL, giúp VHDL trở nên ngày càng phổ
biến.
Khả năng hỗ trợ nhiều công nghệ và phương pháp thiết kế
VHDL cho phép thiết kế bằng nhiều phương pháp như phương pháp
thiết kế từ trên xuống, hay từ dưới lên dựa vào các thư viện sẵn có. VHDL
cũng hỗ trợ cho nhiều loại công cụ xây dựng mạch như sử dụng công nghệ
đồng bộ hay không đồng bộ, sử dụng ma trận lập trình được hay sử dụng
mảng logic ngẫu nhiên. Như vậy VHDL có thể phục vụ tốt cho nhiều mục
đích thiết kế khác nhau, từ việc thiết kế các phần tử phổ biến đến việc thiết
kế các IC ứng dụng đặc biệt.
Tính độc lập với công nghệ
VHDL hoàn toàn độc lập với công nghệ chế tạo phần cứng. Một mô tả
hệ thống dùng VHDL thiết kế ở mức cổng có thể được chuyển thành các
bản tổng hợp mạch khác nhau tùy thuộc công nghệ chế tạo phần cứng mới
ra đời nó có thể được áp dụng ngay cho các hệ thống đã thiết kế. Đây cũng
là một ưu điểm quan trọng của VHDL, nó cho phép người thiết kế không
cần quan tâm đến công nghệ chế tạo phần cứng mới ra đời.
Khả năng mô tả mở rộng:
VHDL cho phép mô tả hoạt động của phần cứng từ mức hệ thống số
cho đến mức cổng. VHDL có khả năng mô tả hoạt động của hệ thống trên
nhiều mức nhưng chỉ sử dụng một cú pháp chặt chẽ thống nhất cho mọi
mức. Như thế ta có thể mô phỏng một bản thiết kế bao gồm cẩ các hệ con
được mô tả ở mức cao và các hệ con được mô tả chi tiết.
Khả năng trao đổi kết quả
17
Vì VHDL là một tiêu chuẩn được chấp nhận, nên một mô hình VHDL
có thể chạy trên mọi bộ mô tả đáp ứng được tiêu chuẩn VHDL. Các kết quả
mô tả hệ thống có thể được trao đổi giữa các nhà thiết kế sử dụng công cụ
thiết kế khác nhau nhưng cùng tuân theo tiêu chuẩn VHDL. Cũng như, một
nhóm thiết kế có thể trao đổi mô tả mức cao của các hệ thống con trong
một hệ thống lớn; trong khi các hệ thống con được thiết kế độc lập.
Khả năng hỗ trợ thiết kế mức lớn và khả năng sử dụng lại
các thiết kế
VHDL được phát triển như một ngôn ngữ lập trình bậc cao, vì vậy nó
có thể được sử dụng để thiết kế một hệ thống lớn với sự tham gia của một
nhóm nhiều người. Bên trong ngôn ngữ VHDL có nhiều tính năng hỗ trợ
việc quản lý, thử nghiệm và chia sẻ thiết kế. Và nó cũng cho phép dùng lại
các phần đã có sẵn.
1.2.2.3 Cấu trúc một mô hình hệ thống mô tả bằng VHDL
Phần này sẽ nhằm giới thiệu sơ qua về cấu trúc khung cơ bản của
VHDL khi mô tả cho một mô hình thiết kế thực.
Thông thường một mô hình VHDL bao gồm ba phần: thực thể
(Entity), kiến trúc (Architecture), gói (Package) và các cấu hình. Trong một
số trường hợp mô hình còn có thêm các môi trường kiểm tra.
Thực thể (Entity )
Khai báo thực thể trong VHDL là câu lệnh định nghĩa các chỉ tiêu
phía ngoài của một phần tử hay một hệ thống. Các thông tin có trong phần
khai báo thực thể cho phép kết nối phần tử ( hệ thống) mà thực thể đó đại
diện với phần tử ( hệ thống) khác. Thực chất việc khai báo thực thể chính là
khai báo giao diện của hệ thống với bên ngoài. Hoạt động thực chất của hệ
18
thống không được mô tả trong khai báo thực thể. Cú pháp của khai báo
thực thể là:
Entity entity_name is
[generic (generic_declaration);]
[port (port_declaration);]
{entity_declaration_item{constants, type, signals};}
End [entity_name];
• Khai báo generic dùng để khai báo các hằng mà chúng có thể
được dùng để điều khiển kiến trúc và sự hoạt động của thực thể.
• Khai báo cổng (port) được dùng để khai báo các cổng vào, ra
của thực thể.
• Khai báo Entity_declaration_item dùng để khai báo các hằng,
kiểu dữ liệu hoặc tín hiệu mà nó có thể được sử dụng trong khi
mô tả hoạt động hoặc cấu trúc của thực thể.
Dưới đây là một ví dụ khai báo thực thể cho một cổng NAND ( Hình
1.7).
19
Hình 1.7 : Khai báo thực thể một cổng NAND
Câu lệnh LIBRARY IEEE và USE IEEE.std_logic_1164.ALL cho
phép thực thể sử dụng các định nghĩa trong thư viện về các tiêu chuẩn của
IEEE. Khai báo thực thể bao gồm tên của thực thể và một tập các cổng và
phần chung. Trong đó phần chung GENERIC là các hằng số được truyền
cho phần tử ( hệ thống). Phần chung có thể coi là các tham số định trước
của phần tử, chẳng hạn như độ trễ. Các cổng là phần giao diện vào ra của
phần tử. Các cổng có thể tương ứng với các chân IC, hay các đầu nối trên
bảng mạch. Các cổng được khai báo là cổng vào, cổng ra, cổng hai chiều
hay bộ đệm.
Kiến trúc ( Arrchitecture)
Một khai báo thực thể đều phải đi kèm với ít nhất một kiến trúc tương
ứng. VHDL cho phép khai báo nhiều kiến trúc cho một thực thể. Một khai
báo kiến trúc có thể bao gồm các khai báo về các tín hiệu bên trong, các
phần tử bên trong hệ thống hay mô tả theo mô hình cấu trúc. Tuy nhiên một
hệ thống có thể bao gồm cả mô tả theo mô hình hoạt động và mô tả theo
mô hình cấu trúc.
•Mô tả kiến trúc theo mô hình hoạt động
Mô hình hoạt động mô tả các hoạt động của hệ thống dưới dạng các
câu lệnh của ngôn ngữ lập trình bậc cao. Các câu lệnh đó có thể là
PROCESS, WAIT, IF, CASE, FOR-LOOP Ví dụ, kiến trúc của cổng
NAND nói trên có thể mô tả theo mô hình hoạt động như sau:
ARCHITECTURE behaviour OF nand IS
BEGIN
c <= NOT (a AND b) AFTER delay;
20
END behaviour;
Ta thấy kiến trúc của phần tử NAND có một lệnh gán tín hiệu mô tả
chức năng của phần tử. Câu lệnh này được thực thi khi một trong hai cổng
a, b thay đổi giá trị.Và câu lệnh gán có độ trễ, tức thì tín hiệu ở bên trái sẽ
thay đổi tương ứng sau thời gian trễ.
•Mô tả kiến trúc theo mô hình cấu trúc
Mô hình cấu trúc của một phần tử ( hệ thống) có thể bao gồm nhiều
cấp cấu trúc bắt đầu từ một cổng logic đơn giản để xây dựng mô tả cho một
hệ thống hoàn thiện. Thực chất của việc mô tả theo mô hình cấu trúc là mô
tả các phần tử con bên trong hệ thống và sự kết nối của các phần tử con đó.
Như với ví dụ mô tả mô hình cấu trúc một flip-flop RS gồm hai cổng
NAND như sau:
21
Các gói (Package)
Mục đích chính của gói là tập hợp các phần tử có thể bị chia sẻ bởi hai
hay nhiều đơn vị thiết kế ( hay các phần tử có thể dùng chung được). Nó có
chưa các kiểu dữ liệu, các hằng, các chương trình con để dùng chung giữa
các thiết kế.
Một gói bao gồm hai thành phần: phần khai báo gói và phần thân gói.
22
• Phần khai báo gói
Một khai báo gói được dùng để cất giữ hang loạt các khai báo dùng
chung, chẳng hạn như các phần tử, các kiểu, các thủ tục, các hàm. Các khai
báo này có thể nhập vào đơn vị thiết kế khác bởi việc sử dụng một mệnh đề
USE.
• Phần than gói
Sự khác biệt giữa khai báo gói và than gói cũng giống như sự khác
nhau giữa khai báo của một thực thể và phần than kiến trúc của nó. Cú
pháp của một phần than gói như sau:
Package body package_name is
{package_declaration_item}
End[package_name]
Một than gói được dùng để lưu các định nghĩa của một hàm và thủ
tục, mà các hàm và thủ tục này đã được khai báo trong phần khai báo gói
tương ứng. Vì vậy, phần than gói luôn được kết hợp với phần khai báo của
chúng, ngược lại một khai báo gói luôn luôn có ít nhất một than gói kết hợp
với nó.
Cấu hình
Việc khai báo cấu hình tương tự như việc liệt kê các phần của bản
thiết kế. Khai báo cấu hình thực chất là chỉ ra kiến trúc nào được gắn với
thực thể nào. Như vậy các kiến trúc khác nhau có thể cùng được gắn với
một thực thể. Điều này cho phép thay đổi bản mô tả ở thời điểm mô phỏng
hay tổng hợp hệ thống. Việc khai báo cấu hình là tùy chọn, cũng có thể sử
dụng cấu hình mặc định do VHDL cung cấp – khi đó kiến trúc được khai
báo cuối cùng cho một thực thể sẽ được gắn với thực thể.
23
Môi trường kiểm tra
Một trong các nhiệm vụ rất quan trọng là kiểm tra vản mô tả thiết kế.
Kiểm tra một mô hình VHDL được thực hiện bằng cách quán sát hoạt động
của nó trong khi mô phỏng và các giá trị thu được có thể đem so sánh với
yêu cầu thiết kế.
Hình 1.8 Sơ đồ tổng quát chương trình thử
Thông thường các bộ mô phỏng có cung cấp khả năng kiểm tra,
nhưng cũng có thể xây dựng một môi trường kiểm tra VHDL. Môi trường
kiểm tra có thể hiểu như một mạch kiểm tra ảo. Môi trường kiểm tra sinh ra
các tác động lên bản thiết kế và cho phép quan sát hoặc so sánh kết quả
hoạt động của bản mô tả thiết kế. Thông thường thì các bản mô tả đều cung
cấp chương trình thử. Nhưng ta cũng có thể xây dựng chương trình thử
(testbench). Mạch thử thực chất là sự kết hợp của tổng hợp nhiều thành
phần. Nó gồm ba thành phần: mô hình VHDL đã qua kiểm tra, nguồn dữ
liệu và bộ quan sát. Hoạt động của mô hình VHDL được kích thích bởi các
nguồn dữ liệu và kiểm tra tính đúng đắn thông qua bộ quan sát. Trên đây là
sơ đồ tổng quát của một chương trình thử (Testbench) ( Hình 1.8 ).
Trong đó : DUT : ( device under test) mô hình VHDL cần kiểm tra
Observer: khối quan sát kết quả
24
Data source : nguồn dữ liệu
1.3. Kết luận chương 1
Chương một đồ án đã trình bày một cách khái quát về công nghệ
FPGA và ngôn ngữ mô tả phần cứng VHDL. Từ lịch sử phát triển của các
thiết bị lập trình được tới sự ra đời của FPGA, định nghĩa, cấu trúc của một
FPGA và một số ứng dụng của FPGA hiện nay, giúp chúng ta có cơ sở về
FPGA. Và cũng nắm một cách khái quát ngôn ngữ VHDL sẽ được dùng để
xây dựng chương trình cho đồ án.
25