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ầygiúp đỡ trong việc tìm hiểu các kiến thức cần thiết cho đồ án, và ph
Trang 1LỜI NÓI ĐẦU
Sự phát triển ngày càng nhanh chóng của Internet và các ứng dụnggiao 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 quantrọng Các kết quả của khoa học mật mã ngày càng được triển khai trongnhiều lĩnh vực khác nhau của đời sống xã hội, trong đó phải kể đến rấtnhiều ứng dụng dân sự, thương mại, quân sự… Các ứng ụng mã hoá thôngtin 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à tronglĩ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áytí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ảomậ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 tavẫ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ìmhiể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
Trang 2của thuật toán khi tích hợp trên FPGA Từ nhiệm vụ đặt ra đó đề tài chialà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ầygiúp đỡ trong việc tìm hiểu các kiến thức cần thiết cho đồ án, và phươngpháp để hoàn thành đồ án; đồng thời cán bộ chỉ huy các cấp đã tạo điềukiệ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ữngngườ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
Trang 3
MỤC LỤC
LỜI NÓI ĐẦU 1
CHƯƠNG 1 FPGA VÀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL 5
1.1 TỔNG QUAN VỀ CÔNG NGHỆ FPGA 5
1.1.1 Sự phát triển của các thiết bị lập trình được 6
1.1.2 Cấu trúc cơ bản của FPGA 9
1.1.3 Ứng dụng của FPGA 13
1.2 GIỚI THIỆU NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL 14
1.2.1 Ngôn ngữ mô phỏng phần cứng (HDL) 14
1.2.1.1 Các phương pháp truyền thống 14
1.2.1.2 Ngôn ngữ mô phỏng phần cứng (HDL) 16
1.2.2 Ngôn ngữ mô phỏng phần cứng VHDL 16
1.2.2.1 Giới thiệu 16
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 17
1.2.2.3 Cấu trúc một mô hình hệ thống mô tả bằng VHDL 19
1.3 Kết luận chương 1 25
CHƯƠNG 2 THUẬT TOÁN MẬT MÃ RIJNDAEL 26
2.1 GIỚI THIỆU THUẬT TOÁN 26
2.2 KÝ HIỆU VÀ QUY ƯỚC 26
2.2.1 Các đầu vào và các đầu ra 26
2.2.2 Bytes 27
2.2.3 Các mảng của Bytes 27
2.2.4 Trạng thái 28
2.3 MỘT SỐ KHÁI NIỆM TOÁN HỌC 28
2.3.1 Phép cộng 29
2.3.2 Phép nhân 29
2.3.3 Phép nhân với x 30
2.3.4 Đa thức với hệ số trên GF( 2 8 ) 32
2.3.5 Phép nhân đa thức bậc 3 với x 34
2.4 PHƯƠNG PHÁP RIJNDAEL 35
2.4.1 Quá trình mã hoá 36
2.4.1.1 Phép biến đổi SubBytes 39
2.4.1.2 Phép biến đổi ShiftRows 41
2.4.1.3 Phép biến đổi MixColumns 42
2.4.1.4 Thao tác AddRoundKey 43
2.4.1.5 Phát sinh khoá của mỗi chu kỳ 44
2.4.2 Quá trình giải mã 46
2.4.2.1 Phép biến đổi InvShiftRows 48
2.4.2.2 Phép biến đổi InvSubBytes 49
2.4.2.3 Phép biến đổi InvMixColumns 50
2.4.2.4 Phép biến đổi AddRoundKey() 52
2.5 MỘT SỐ ỨNG DỤNG 52
2.6 KẾT LUẬN CHƯƠNG 2 53
2.6.1 Khả năng an toàn 53
2.6.2 Đánh giá 54
CHƯƠNG 3 THỰC HIỆN THUẬT TOÁN RIJNDAEL TRÊN FPGA VÀ 55
Trang 43.1 THỰC HIỆN THUẬT TOÁN RIJNDAEL TRÊN FPGA 55
3.1.1 Quá trình mã hóa và giải mã 55
3.1.2 Xây dựng các modul 57
3.1.3 Thực hiện thiết kế 63
3.2 KẾT QUẢ THỰC HIỆN 69
KẾT LUẬN 73
TÀI LIỆU THAM KHẢO 74
Trang 5CHƯƠ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ấtvớ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ủaquá 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êngbiệ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ốilogic thực hiện các chức năng cơ bản như AND, OR… hay phức tạp hơnnhư 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ạchkhác FPGA còn được gọi là thiết bị có khả năng tái cấu hình, được ứngdụ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:
Trang 6Có thể tổ hợp tuỳ ý các thành phần này để tạo ra các mạch chức năngnhư ý 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ễnthô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ư :
programmable khi sản xuất với số lượng nhỏ
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
Trang 7Mộ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ủacá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 đứtcầu chì đó) Điều nầy được thực hiện bởi một bộ nạp chương trình Cả hailoại PAL và PLA cho phép thực hiện các mạch logic tốc độ cao, tuy nhiêncấ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 PLDhoặc macrocell (tế bào vĩ mô ) ở trong một thiết bị đơn cùng với các đường
Trang 8nố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êucầu nhiều khối và sử dụng các đường nối đa năng giữa chúng để tạo nêncá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ạpvớ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ừ đầuvào đến đầu ra của mình dựa trên khuôn mẫu này CPLDs đưa ra cách đơngiả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áccô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ácchuẩ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óitrong một khuôn dạng rất nhỏ Điều này đã cung cấp một giải pháp tuyệtvờ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ớidiệ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
Trang 9FPGA đượ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úctrướ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 đến10000
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ộtmả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ủacá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 đượctí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 đạicò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ậnriêng lẻ trong khi vẫn bảo đảm hoạt động bình thường cho các bộ phậnkhá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 nhaubằ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ồmdã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
Trang 10chung Nguồn kết nối là các đoạn dây (segment) có thể có chiều dài khácnhau, bên trong các kết nối là các chuyển mạch lập trình được dùng để nốicác logic block với các segment hoặc giữa các segment với nhau Mạchlogic được cài đặt trong FPGA bằng cách ánh xạ logic vào các logic blockriê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:
logic được gọi là kiến trúc của nó Kiến trúc của khối logic có thể đượcthiết kế theo nhiều cách khác nhau Một số khối logic có thể chỉ là các cổngNAND 2 đầu vào, tuy nhiên cũng có thể nó là một bộ dồn kênh, hay cácbảng tìm kiếm LUT ( Luck-Up Table ) Trong một số loại FPGA các khốilogic có thể có cấu trúc hoàn toàn giống như PAL Hầu hết các khối logicchứa một số loại flip-flop để hỗ trợ cho việc thực hiện các mạch tuần tự
nguồn kết nối trong FPGA được gọi là kiến trúc routing Kiến trúc routinggồm các đoạn dây nối và các chuyển mạch lập trình được Các chuyểnmạch lập trình được có thể có nhiều cấu tạo khác nhau Giống như khốilogic, 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 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
Trang 11
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)
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ànhhai Slice tương tự nhau, một slice đơn có dạng như hình 1.5
thực hiện như LUT có bốn đầu vào Để hoạt động như một bộ tạo chứcnăng, mỗi một LUT có thể cung cấp một RAM 16 x 1 bit đồng bộ Hơnnữa hai LUT trong một Slice có thể được kết hợp để tạo RAM 16 x 2 bithoặc 32 x 1 bit đồng bộ
có thể được xếp đặt như một Flip – Flop loại D kích hoạt bằng sườn, hoặcnhư 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ộ
Trang 12tạ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 trongtrường hợp nhồi cấu hình Đường BY ép phần tử lưu trữ về trạng tháingượ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ượcmột cách hoàn toàn độc lập và chúng được chia sẻ bởi hai Flip – Flop trongmột Slice.
theo khối thành khối lớn hơn ( gọi là SelectRAM+ ), điều này cần bổ sungcá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ứctheo các cột
Hình 1.5: Cấu trúc Logic Cell trong FPGA
Trang 13Một FPGA có cấu trúc của các Logic Cell và các đường nối ( Hình1.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
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
mạch trong các sản phẩm thương mại thường chứa nhiều chíp SSI ( SmallScale Intergrated ) Trong nhiều trường hợp các chíp SSI này có thể đượcthay thế bằng FPGA và kết quả giảm dienj tích của bo mạch đi đáng kể
Trang 14 Chế tạo mẫu: FPGA rất lý tưởng cho các ứng dụng tạo sảnphẩm mẫu Giá thành thực hiện thấp và thời gian ngắn.
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ốngnhư 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ứcnăng hơn, do đó chúng ngày càng trở nên phức tạp hơn Các phương phápthiế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ướckhi đư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ụngcá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ềuphương pháp đã được sử dụng để tối thiểu hóa hàm Boolean nhằm tăngtính hiệu quả sử dụng các phần tử logic, chẳng hạn như phương pháp dùngbì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
Trang 15dưới dạng hàm Boolean Nhưng việc tối thiểu hóa cũng như xử lý hàngnghì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ạchchứ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ấutrúc Phương pháp thiết kế dựa trên sơ đồ được dùng phổ biến và có rấtnhiề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ácchỉ tiêu và chức năng chung nhất của hệ thống Để thiết kế một hệ thốngbằng phương pháp truyền thống, người thiết kế cần phải đi qua hai bướcthự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 độngcủ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ôngkhô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ý
Trang 16Mộ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 Booleanchỉ 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ămhàm phương pháp dựa trên sơ đồ chỉ có thể dùng để thiết kế lớn nhất chứatớ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ấtcủa các phương pháp thiết kế trước đây Nếu các phương pháp cũ đòi hỏiphả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ỏngphầ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ệcchuyể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ỉcuitHardware Description Language – ngôn ngữ mô phỏng phần cứng cho cácmạch tích hợp tốc độ cao VHDL là ngôn ngữ mô phỏng phần cứng đượcphát triển dùng cho chương trình VHSIC ( Very High Speed IntergratedCircuit) 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épphá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
Trang 17được ba công ty Intermetics, IBM và Texas Intruments bắt đầu nghiên cứuphá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áttriể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ữamộ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ỏngphầ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àiliệ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ạychúng Vì các ngôn ngữ mô phỏng phần cứng đó được các nhà cung cấpthiế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à cungcấ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ậpkhông gắn với bất kỳ một phương pháp thiết kế, bộ mô phỏng hay côngnghệ 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
Trang 18hay 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ápthiế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ó VHDLcũ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ụngmả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ácbả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ôngcầ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ênnhiều mức nhưng chỉ sử dụng một cú pháp chặt chẽ thống nhất cho mọimứ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ả
Trang 19Vì 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ộtnhóm thiết kế có thể trao đổi mô tả mức cao của các hệ thống con trongmộ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ộtnhó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ạicá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ủaVHDL 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êuphía ngoài của một phần tử hay một hệ thống Các thông tin có trong phầnkhai báo thực thể cho phép kết nối phần tử ( hệ thống) mà thực thể đó đạidiệ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ệ
Trang 20thống không được mô tả trong khai báo thực thể Cú pháp của khai báothực thể là:
được dùng để điều khiển kiến trúc và sự hoạt động của thực thể
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ình1.7)
&
b a
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY nand IS GENERIC (delay := 5 ns);
Trang 21Hì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 chophép thực thể sử dụng các định nghĩa trong thư viện về các tiêu chuẩn củaIEEE 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ềncho phần tử ( hệ thống) Phần chung có thể coi là các tham số định trướccủa phần tử, chẳng hạn như độ trễ Các cổng là phần giao diện vào ra củaphầ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ênbảng mạch Các cổng được khai báo là cổng vào, cổng ra, cổng hai chiềuhay 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 khaibá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ácphầ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áccâ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ổngNAND 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;
Trang 22Mô 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ềucấ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ổngNAND như sau:
Trang 23Mộ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.
Trang 24 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ùngchung, 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 khaibá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ácnhau 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óitươ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ủachú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ợpvới nó
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ảnthiế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ớithực thể nào Như vậy các kiến trúc khác nhau có thể cùng được gắn vớimột thực thể Điều này cho phép thay đổi bản mô tả ở thời điểm mô phỏnghay 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 khaibáo cuối cùng cho một thực thể sẽ được gắn với thực thể
Trang 25 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 độngcủa nó trong khi mô phỏng và các giá trị thu được có thể đem so sánh vớiyê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ườngkiểm tra có thể hiểu như một mạch kiểm tra ảo Môi trường kiểm tra sinh racá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 cungcấ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ànhphầ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ácnguồ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ả
Trang 26Data source : nguồn dữ liệu
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ácthiế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ộtFPGA 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
Trang 27CHƯƠNG 2 THUẬT TOÁN MẬT MÃ RIJNDAEL
2.1. GIỚI THIỆU THUẬT TOÁN
Với tốc độ và khả năng xử lý ngày càng được nâng cao của các bộ vi
xử lý hiện nay, các phương pháp mã hoá trước trở nên không an toàn trongbảo mật thông tin Do đó, Viện Tiêu Chuẩn và Công Nghệ Hoa kỲ( National Institute of Standards and Technology - NIST) đã quyết địnhchọn một chuẩn mã hoá mới với độ an toàn cao nhằm phục vụ nhu cầu bảomật thông tin trong liên lạc của Chính phủ Hoa Kỳ cũng như trong ứngdụng dân sự Thuật toán Rijndael do Vincent Rijmen và Joan Deaman đãđược chính thức chọn trở thành chẩn mã hoá nâng cao AES ( AdvancedEncryption Standard) từ ngày 02 tháng 10 năm 2000
Phương pháp mã hoá Rijndael là phương pháp mã hoá khối đối xứng,
nó có thể thực hiện với các khối dữ liệu 128 bit thông qua sử dụng các khoá
mã hoá với các kích thước 128, 192, hay 256 bit Phương pháp này thíchhợp ứng dụng trên nhiều hệ thống khác nhau từ các thẻ thông minh cho đếncác máy thính cá nhân
2.2. KÝ HIỆU VÀ QUY ƯỚC
2.2.1. Các đầu vào và các đầu ra
Đầu vào và đầu ra của thuật toán Rijndael gồm chuỗi 128 bit, đượcxem như một khối (block) Khoá mật mã cho thuật toán Rijndael là mộtchuỗi 128, 192 hoặc 256 bit Chiều dài của đầu vào, đầu ra, khoá mật mãkhác không được chấp nhận bởi chuẩn mã hoá này
Trang 28a hoặc a[n], với n phụ thuộc vào chiều dài của khoá, chiều dài của khoá
là 128 bít thì 0 < n < 16, dài 192 bit thì 0 < n < 24, dài 256 bit thì 0 < n <32
Các byte trong thuật toán Rijndael được biểu diễn dưới dạng xíchchuỗi các bit 0 hoặc 1, dạng như sau{b7,b6,b5,b4,b3,b2,b1,b0}, hoặcbiểu diễn dưới dạng một đa thức:
7 0
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7
7
i
i x b x
b x b x b x b x b x b b b
a0=Input0 input1input2…input7
a1=Input8 input9input10…input15
…
a15=Input120 input121 input121…input127
Có thể mở rộng với chuỗi 192 và 256 bit :
a n=Input8n input8 n 1input8 n 2…,input8 n 7
2.2.4. Trạng thái
Trang 29Hoạt động của thuật toán Rijndael được thực hiện trên một mảng haichiều, được gọi là trạng thái Một mảng trạng thái có 4 hàng, và N b cột, ởđây N b được tính bằng chiều dài của khối dữ liệu chia cho 32 Mảng trạngthái được ký hiệu là S[r,c], với 0 r 3, 0 c N b 1 Mỗi phần tửtrong mảng trạng thái chứa một byte dữ liệu Khi thực hiện mã hoá hoặcgiải mã bằng thuật toán Rijndael đầu vào được copy vào mảng trạng tháivới :
2.3. MỘT SỐ KHÁI NIỆM TOÁN HỌC
Mỗi byte trong thuật toán Rijndael được biểu diễn như trên đã trìnhbày, mỗi byte xem như một phần tử của trường Galois GF( 2 8), Trường GF(2 8)( Galois Field(2 8)) là trường nhị phân đồng thời phép cộng là phép cộng modul 2( kí hiệu ), còn phép nhân là phép và (AND) Cụ thể :
0 0 = 0 0 1 = 1 1 1 = 0
Trang 30( modulo) cho một đa thức tối giản (irreducible polynomial) bậc 8 Đa thức
được gọi là tối giản khi và chỉ khi đa thức này chỉ chia hết cho 1 và chínhmình Trong thuật toán Rijndael, đa thức tối giản được chọn là
Kết quả nhận được là một đa thức bậc nhỏ hơn 8 nên có thể được biểudiễn dưới dạng 1 byte
Trang 313 4 5 6 8 9
số nhị phân với bậc nhỏ hơn 8 tồn tại phần tử nghịch đảo của b(x), ký hiệu
là b 1 (x), được thực hiện bằng cách sử dụng thuật toán Euclide mở rộng
để tính toán đa thức a(x) và c(x) sao cho:
1 1
2 2
3 3
4 4
5 5
6 6
7 7
x b x b x b x b x b x b x b x
4 3
5 4
6 5
7 6
Trang 32 x b x b x b x b x b x b x b x b
1
3 2
4 3
5 4
6 5
4 3
5 4
6 5
7 6
8
7x b x b x b x b x b x b x b x m x b
4 3
5 4
6 5
7 6
8
7x b x b x b x b x b x b x b x m x
Như vậy, phép nhân với đa thức x ( hay phần tử {00000010}GF( 2 8 )
) có thể được thực hiện ở mức độ byte bằng một phép dịch trái và sau đóthực hiện tiếp phép toán XOR với giá trị {1b} nếu b7 1 Thao tác này
được ký hiệu là xtime() Phép nhân với các luỹ thừa của x có thể được thực hiện bằng cách áp dụng nhiều lần thao tác xtime() Kết quả của phép nhân
với một giá trị bất kỳ được xác định bằng cách cộng () các kết quả trunggian này lại với nhau
Khi đó, việc thực hiện phép nhân giữa hai phần tử a, b bất kỳ thuộcGF(2 8) có thể được tiến hành theo các bước sau:
cả các luỹ thừa của 2
giữa phần tử còn lại ( là b) với các thành phần là luỹ thừa của 2 được phântích từ a
Trang 33) (
i
i
i x a x
3 0
) (
i
i
i x b x
) (
) ( ) (
i
i i
a x
b x a
Phép nhân giữa a(x) và b(x) được thực hiện thông qua hai bước Trước tiên, thực hiện phép nhân thông thường c(x) = a(x)b(x).
2 2
3 3
4 4
5 5
6 6
Trang 34c6 a3 b3
Rõ ràng c(x) không thể được biểu diễn bằng một từ gồm 4 byte Đa thức c(x) có thể được đưa về một đa thức có bậc nhỏ hơn 4 bằng cách lấy c(x) modulo cho một đa thức bậc 4 Trong thuật toán Rijndael, đa thức bậc
3 3
Trong trường hợp đa thức a(x) cố định, phép nhân d(x) a(x) b(x)
có thể được biểu diễn dưới dạng ma trận như sau:
d d d d
3 0 1 2
2 3 0 1
1 2 3 0
a a a a
a a a a
a a a a
a a a a
x không phải là một đa thức tối giản trên GF(2 8) nên phép
nhân với một đa thức a(x) cố định được chọn bất kỳ không đảm bảo tính khả nghịch Vì vậy, trong phương pháp Rijndael đã chọn đa thức a(x) có phần tử nghịch đảo (modulo M(x))
Trang 35c c c c
00 00 01 00
00 00 00 01
01 00 00 00
b b b b
Như vậy, phép nhân với x hay các luỹ thừa của x sẽ tương ướng vớiphép dịch chuyển xoay vòng các byte thành phần trong một từ
Trong thuật toán Rijndael cần sử dụng đến đa thức x3 (
00
2
1
được sử dụng trong quá trình mở rộng khoá, thực hiện thao tác dịch chuyểnxoay vòng N w byte thành phần một từ.) nhằm xoay vòng 4 byte thànhphần của một từ được đưa vào Như vậy, nếu đưa vào tử gồm 4 byte
b0 ,b1 ,b2 ,b3 thì kết quả nhận được là từ gồm 4 byte b1 ,b2 ,b3 ,b0
2.4. PHƯƠNG PHÁP RIJNDAEL
Phương pháp mã hoá Rijndael bao gồm nhiều bước biến đổi đượcthực hiện tuần tự, kết quả đầu ra của bước biến đổi trước là đầu vào củabước biến đổi tiếp theo Kết quả trung gian giữa các bước biến đổi được gọi
là trạng thái.
Trang 36Một trạng thái có thể dược biểu diễn dưới dạng ma trận gồm 4 dòng
và N b cột với N b bằng với độ dài của khối dữ liệu chia cho 32 Mã khoáchính cũng được biểu diễn dưới dạng một ma trận gồm 4 dòng và N k cộtvới N k bằng với độ dài của khoá chia cho 32 Trong một số tình huống ,
ma trận biểu diễn một trạng thái hay mã khoá có thể được khảo sát nhưmảng một chiều chứa các phần tử có độ dài 4 byte, mỗi phần tử tương ứngvới một cột của ma trận
Một số ký hiệu sử dụng trong thuật toán:
N w : Số lượng byte trong một đơn vị dữ liệu “từ” Trong thuậttoán Rijndael, với 128 bit vào thì N w là 4
Trang 37
AddRoundKey(State, RoundKey)
i = 0
ByteSub(State) ShiftRow(State) MixColumn(State)
AddRoundKey(State, RoundKey)
i = i + 1
i < Nr
ByteSub(State) ShiftRow(State)
AddRoundKey(State, RoundKey)
No Yes
Quy trình mã hoá Rijndael sử dụng bốn phép biến đổi chính sau:
hiện hành Độ dài của mã khoá của chu kỳ bằng với kích thước của trạngthái