Ví dụ, trong cuộc sống hàng ngày, gửi dữ liệu từ thiết bị này sang thiết bị khác bằng USB, bằng Bluetooth, bằng Ethernet,… CRC có độ tin cậy cao trong việc truyền dữ liệu vì thuật toán c
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH
KHOA ĐIỆN ĐIỆN TỬ
Trang 2MỤC LỤC
LÝ DO CHỌN ĐỀ TÀI 1
PHẦN NỘI DUNG 2
CHƯƠNG 1: TỔNG QUAN VỀ CRC 2
1.1 Khái quát CRC 2
1.2 Đa thức sinh 2
1.3 Hiệu năng 5
CHƯƠNG 2: TÌM HIỂU VỀ CRC ENCODER VÀ DECODER 6
2.1 Encoder / decoder là gì ? 6
2.2 CRC encoder / decoder 6
3.1 Encoder 10
3.2 Bộ Decoder 14
3.3 Đánh giá qua testbench 16
3.4 Nhận xét và đánh giá 22
KẾT LUẬN 24
Trang 31
LÝ DO CHỌN ĐỀ TÀITrong thời kỳ cách mạng công nghiệp 4.0, trong kỷ nguyên thông tin Ngày nay không còn ai nghi ngờ gì vai trò của thông tin trong đời sống, trong khoa học kỹ thuật, và trong mọi mặt của xã hội, dưới mọi quy mô, từ
xí nghiệp - công ty cho đến quốc gia và toàn cầu Việc nắm bắt thông tin thật nhanh, chính xác và kịp thời ngày càng đóng vai trò cốt yếu trong việc quản lý cũng như điều hành
- Nhiều người ít khi biết một chiếc máy tính hoạt động như thế nào, cách truyền dữ liệu ra sao Trong quá trình truyền, dữ liệu luôn bị tác động bởi nhiều yếu tố, làm sai lệch dữ liệu truyền và nhận Vì vậy hệ thống cần
có độ tin cậy cao với cơ chế phát hiện và sửa lỗi Đó chính là lý do chúng tôi lựa chọn đề tài tiểu luận: Cyclic Redundancy Check (CRC) encoder/decoder Việc phát hiện và sửa lỗi là một lĩnh vực đã được nghiên cứu sâu và ứng dụng mạnh mẽ Tuy nhiên, tiểu luận được trình bày có tính
cơ bản và tổng quan Tiểu luận chỉ nhằm mục đích tóm tắt lại những kiến thức mà nhóm chúng tôi đã thu nhận được qua một thời gian học tập ngắn
và qua tham khảo một số tài liệu tiểu luận gồm các phần như sau:
- Tổng quan và nguyên lí hoạt động của CRC
- Encoder và Decoder
- Thiết kế CRC Encoder và Decoder bằng VHL
Trang 42
PHẦN NỘI DUNG
CHƯƠNG 1: TỔNG QUAN VỀ CRC 1.1 Khái quát CRC
CRC (Cyclic Redundancy Check) là một phương pháp phát hiện lỗi được sử dụng trong truyền dữ liệu CRC thường được sử dụng trong mạng
kỹ thuật số và thiết bị lưu trữ để phát hiện những thay đổi ngẫu nhiên đối với dữ liệu thô Ví dụ, trong cuộc sống hàng ngày, gửi dữ liệu từ thiết bị này sang thiết bị khác bằng USB, bằng Bluetooth, bằng Ethernet,… CRC
có độ tin cậy cao trong việc truyền dữ liệu vì thuật toán của nó dựa trên mã tuần hoàn
Đa thức của bộ chia:
∑ (ký số x i ); với i là vị trí của ký số, i= 0÷ n; bộ chia có n+1 bit
Quan hệ giữa chuỗi đa thức với biểu diễn nhị phân được minh họa ở hình sau:
Trang 53
Một đa thức sinh của bộ chia cần được chọn theo các đặc tính sau:
- Chia đúng cho đa thức (x + 1)
Điều kiện đầu nhằm bảo đảm là tất cả các nhiễu bệt có độ dài bằng bậc của đa thức sinh đều được phát hiện Điều kiện thứ hai bảo đảm là tất cả các nhiễu bệt ảnh hưởng lên thứ tự bit lẻ được phát hiện
Ví dụ 1:
Rõ ràng là ta không thể chọn x (số nhị phân 10) hay x2 + x (số nhị phân 110) làm đa thức được vì chúng chia hết cho x Tuy nhiên, ta có thể chọn x+1 (tương ứng 11) do không chia hết cho x, mà chia hết cho (x+1), cũng như ta có thể chọn x2 + 1 (số nhị phân 101) do chia hết cho (x+1) Các đa thức chuẩn dùng trong bộ chia CRC được minh họa trong hình 13 Các số 12, 16, và 32 có liên quan đến kích thước của dư số CRC Bộ chia CRC tương ứng là 13, 17 và 33 bit
Đa thức sinh hoạt động như một bộ chia trong thuật toán CRC Việc sử dụng CRC phải sử dụng cùng một đa thức bộ tạo trên bộ mã hóa hoặc tại
Trang 6CRC dựa trên lý thuyết về mã sửa lỗi theo chu kỳ Việc sử dụng các mã tuần hoàn có hệ thống, mã hóa thông điệp bằng cách thêm giá trị kiểm tra
có độ dài cố định, nhằm mục đích phát hiện lỗi trong mạng truyền thông Trong Lớp OSI, CRC hoạt động trên lớp 2, cụ thể là Liên kết dữ liệu Liên kết dữ liệu có hai chức năng chính là Kiểm soát liên kết dữ liệu và Kiểm soát truy cập phương tiện Kiểm soát liên kết dữ liệu chịu trách nhiệm về thiết kế và các thủ tục giao tiếp giữa hai nút liền kề: giao tiếp từ nút tới nút
và kiểm soát truy cập phương tiện hoặc cách chia sẻ liên kết Kiểm soát Liên kết Dữ liệu có các chức năng bao gồm Kiểm soát Khung, Luồng và Lỗi, và các giao thức được triển khai bằng phần mềm giúp truyền tải các khung giữa các nút một cách trơn tru và đáng tin cậy
Cũng giống như nếu có một đa thức tạo G (x) với mã 𝑋 ^ 6 + X + 1, nó sẽ đại diện cho mã 1000011 Như trong Hình 1
Trang 8để truyền hoặc lưu trữ hiệu quả
2.2 CRC encoder / decoder
Trong tính toán hầu như không có sự khác biệt được thực hiện trên bộ mã hóa hoặc bộ giải mã Sự khác biệt xảy ra là nơi bộ mã hóa có một từ dữ liệu tăng cường và bộ giải mã có phần còn lại
Quá trình mã hóa ban đầu tạo ra một mã CRC duy nhất, dữ liệu được nhập trước, sau đó dữ liệu sẽ được sao chép vào bộ xử lý mã hóa, sau đó dữ liệu
sẽ nhận một số bit theo CRC được sử dụng, với nhị phân 0 Sau đó chia dữ liệu bit với bộ tạo đa thức Trong phép chia này, một bit được dịch chuyển trong mỗi lần chia và để xác định xem phần còn lại của phép chia sau đó
có được chia cho số chia đa thức hay không, cần phải chú ý đến MSB Việc phân chia hoàn tất cho đến khi bit dữ liệu cuối cùng trong từ dữ liệu tăng cường được sử dụng Sau khi hoàn thành, các kết quả còn lại sẽ được sử dụng làm mã CRC duy nhất Như trong hình sau
Trang 9Trong hình 4, cho thấy rằng khi bộ giải mã nhận được một từ mã đã có một
sự thay đổi khi gửi dữ liệu
Vẫn có sự sai sót trong việc phát hiện lỗi khi sử dụng mã này
Trang 108
Ví dụ: Dữ liệu phát là 111101, đa thức sinh là 1101
111101000 (3 bit 0 ngoài cùng là 3 bit 0 được thêm vào)
Trang 119
Khả năng kiểm tra lỗi của CRC:
Ví dụ ta có dữ liệu thu là 111100011 (0 là bit bị lỗi so với dữ liệu bên phát
Trang 1210
CHƯƠNG 3: THIẾT KẾ VÀ CODE VERILOG CHO BỘ CRC
ENCODER VÀ CRC DECODER 3.1 Encoder
3.1.1 Tổng quát
Encoder có vai trò tạo ra mã CRC Từ mã CRC này, nó sẽ được gắn vào
dữ liệu đầu vào, tạo dữ liệu đầu ra, dữ liệu này sau khi ra khỏi bộ encoder
sẽ được đưa vào bộ decoder để kiểm tra lỗi
Để tạo được mã CRC, bộ encoder này sẽ dùng CRC-4, bộ chia cố định là: x4 + x +1 Bộ có ngõ vào cơ bản sẽ là dữ liệu 8 bit để đưa dữ liệu vào, một ngõ vào là xung clock để mạch hoạt động, cùng với đó, mạch sẽ có hai ngõ vào khác gồm: ngõ vào en để cho phép mạch chạy hoặc dừng, ngõ vào reset để reset lại hoạt động của mạch
Vì dùng CRC-4, ngõ ra của bộ sẽ là mã CRC 4 bit, ngoài ra để biết được khi nào việc tính toán đã xong, có thêm ngõ ra mang tên “hoanthanh” với
“hoanthanh” lên mức 1 đồng nghĩa việc tính toán đã hoàn tất
Sơ đồ khối của Modules
Trang 1311
S
3.1.2 Thiết kế chi tiết
Đầu tiên là việc thiết kế cho ngõ vào Với xung clock, ngõ vào là “clk”, ngõ vào này tạo xung cho module, phần tạo mã CRC sẽ hoạt động với cạnh lên của xung clock, do đó cần để phần code tính toán CRC vào trong khối lệnh:
Dữ liệu vào 8 bit được đặt tên là “data” và được khai báo với độ dài 8 bit Trước khi trừ cho bộ chia CRC-5, data phải được them vào 4 bit 0 vào sau Dùng lần lượt các thanh ghi và dây sau:
- Thanh ghi “temp” 12 bit : mang dữ liệu của data, đồng thời có thêm 4 bit
0 vào sau
- Dây “datavao” 8 bit: có chức năng đưa dữ liệu của data vào temp
Muốn tạo một data có thêm 4 bit 0, giá trị của data sẽ được đưa vào 8 bit sau của thanh ghi temp, từ đó temp sẽ có giá trị với 4 bit đầu là 0 và 8 bit sau giống với data Dòng code sẽ được thực hiện như sau:
Trang 1412
Sau khi có gán 4 bit 0 thêm vào cho data xong, phần tiếp theo sẽ là tính CRC Như đã giới thiệu ở trên, bộ chia của encoder này là: x4 + x +1 nên
sẽ có giá trị nhị phân là 10011, giá trị này sẽ được gắn với tham số tên là
“bochia” Với bộ encoder này, phương pháp tính CRC sẽ là cơ bản nhất, tức là dùng phương pháp trượt Bộ sẽ dùng thêm một thanh ghi “m” 4 bit, thanh ghi này có vai trò là số thứ tự của các bít trong temp Khi trừ bộ chia
5 bit, chúng ta sẽ lần lượt dùng 5 bit, với bit bên trái cùng là bit có trọng số lớn nhất và có giá trị một, sau đó lấy thêm 4 bit tiếp theo rồi bắt đầu trừ Chính vì thế, tùy vào dữ liệu vào mà thanh ghi “m” sẽ mang giá trị khác nhau khi bắt đầu chia, nếu như dự liệu vào 8 bit mà bit trọng số lớn nhất
có giá trị là 1, “m” sẽ có giá trị là 7, rồi cứ tương tự với các giá trị khác Tiếp theo đó, 5 bit mang giá trị trừ xong sẽ được gán lại vào 5 bit vừa mới trừ Sau khi gán xong, “m” sẽ giảm cho đến khi bit thứ tự thứ “m” tiếp theo của temp mang giá trị 1, khi đó sẽ lại lấy 4 bit tiếp theo kể từ “m” để trừ cho bochia
Hoạt động tính toán này sẽ dừng lại và hoàn tất khi giá trị m=3, lý do là vì
dù có tính toán ra sao, dữ liệu cũng không thể được trừ tiếp cho bộ chia nếu có số bit thấp hơn số bit của bochia Khi đó, 4 bit có trọng số thấp nhất của thanh ghi temp chính là mã CRC cần tìm, ta sẽ gán nó vào trong ngõ
ra 4 bit mang tên là “CRC”
Giá trị của “m” khi bắt đầu sẽ là 11, còn khi bắt đầu trừ sẽ tùy thuộc vào data
Sau khi giải quyết phần tính toán CRC, phần tiếp theo sẽ là giải quyết các chân ngõ vào reset, en, ngõ ra “hoanthanh”
Với ngõ vào reset, nó được đặt tên là “rst”, khi rst = 1, mạch sẽ về lại ban đầu, tức biến m khi bắt đầu sẽ là 11, temp sẽ quay về lại giá trị khi bắt đầu trừ cho bochia, CRC về lại 0 Để được như vậy, chúng ta sẽ liên kết với
Trang 1513
khối gán dữ liệu cho temp và khối tính toán CRC Với khối gán dữ liệu cho temp, một điều kiện sẽ được thêm vào trước khi hoạt động, bộ encoder sẽ dùng luôn thanh ghi m cho tiện Thanh ghi “m" sẽ được mang điều kiện giá trị bất kỳ, miễn không nằm trong khoảng từ 11 đến 3 vì đây là giá trị
“m” chúng ta dùng trong khối tính toán Vì thế, thanh ghi “m" sẽ giả sử ban đầu mang giá trị là 12, điều kiện để thực hiện khối gán giá trị là m =
12, sau khi thực hiện gán xong, m phải bằng 11 để thực hiện khối tính toán Với các liên kết như vậy đã xong, giờ rst sẽ hoạt động mỗi khi lên 1, khi
đó, m sẽ bằng 12, giá trị temp sẽ được gán lại, các bước tính toán thực hiện lại từ đầu
Với ngõ vào en, nó sẽ kết hợp với việc dừng sau khi tính toán xong CRC ở khối tính toán trên, như vậy, mạch sẽ dừng nếu như m = 3 hoặc en = 1
Về ngõ ra “hoanthanh”, nó có nhiệm vụ báo hiệu việc tính toán CRC đã hoàn tất, nó sẽ lên một khi tính CRC đã xong tức khi m = 3 Việc gán giá trị cho hoanthanh sẽ dùng thông qua thanh ghi i
Trang 1715
thử dữ liệu truyền có bị lồi không Sơ đồ tổng quát của bộ decoder CRC –
4 như sau:
3.2.2 Thiết kế chi tiết
Cách thức hoạt động của bộ decoder này gần giống như của bộ encoder Các ngõ vào clk, en, rst, ngõ ra hoanthanh các thanh ghi hoàn toàn giống với của bộ encoder
Về ngõ vào codeworld, ngõ vào này giờ đây có sẵn 12 bit nên không cần gán them gì cả, khối gán giờ sẽ chỉ có câu lệnh duy nhất:
temp = datavao;
Với datavao là wire 12 bit được nối với ngõ vào codeword
Bộ decoder sẽ hoàn tất việc tính toán xong khi m bằng 3, giá trị của 4 bit trọng số bé nhất của temp sẽ được gán vào ngõ ra remainder Nếu giá trị này bằng 0, dữ liệu xem như không có sai sót xảy ra, ngược lại nếu khác
Trang 1816
không, dự liệu có thể đã xảy ra sai sót hoặc do lúc bắt đầu, dữ liệu giống hoàn toàn với bochia
3.3 Đánh giá qua testbench
3.3.1 Mô hình testbench tổng quát
Nối dây và các thanh ghi vào các ngõ vào/ra như sau:
Trang 2119
Đầu tiên, mạch bắt đầu từ clk = 0 , en = 1, rst = 0 trong 400ns, một khoảng
thời gian đủ lâu đối với xung clk có chu kỳ 20ns để chương trình hoạt động
hoàn chỉnh
Thứ hai, rst = 1 trong 20ns, chương trình sẽ được reset về lại ban đầu
Thứ 3, rst về lại, en về 0 trong 50ns, sau đó lên 1 lại đến hết
3.3.3 Kết quả
Với bộ Encoder
Trong 400ns đầu:
Trang 2220
Từ 400ns đầu trở về sau:
Với bộ Decoder: Do ngõ ra CRC của encoder là khi hoanthanh lên 1 là
1001 nên codeword của bộ decoder sẽ là 12'b110100111001
Trong 400ns đầu:
Trang 2321
Từ 400ns đầu trở về sau:
Trang 2422
Với bộ decoder: Với codeword = 12'b111100111001 (dữ liệu sai lệch với
codeword ở trên 1 bit
Như vậy, ngõ vào rst , en, khối dừng lại khi tính xong CRC, ngõ ra hoanthanh đã hoạt động hiệu quả
*Ở bộ decoder:
Trang 25Như vậy, có thể thấy 2 điều:
-Thứ nhất: Bộ encoder đã hoạt động đúng như yêu cầu
-Thứ hai: Bộ decoder cũng đã hoạt động đúng khi nó đã phát hiện được sự sai sót nếu như dữ liệu vào bị sai
Trang 2624
KẾT LUẬN
Nghiên cứu này được thiết kế và thực hiện bằng VHDL, thiết kế này đáp ứng được mong muốn và có kết quả phù hợp Giống như trong một bộ mã hóa nơi nó được chỉ định để tạo ra một mã duy nhất, sau đó được kết hợp với mã gốc thành một từ mã Trong bộ mã nơi nó được chỉ định để phân tích cú pháp từ mã đã nhận và xác nhận xem từ mã nhận được có lỗi hay không Nếu xảy ra lỗi loại bỏ dữ liệu, nếu không có lỗi thì tiếp tục Mong đợi thiết kế sẽ được tích hợp với các hệ thống trong tương lai
Trang 27Tài liệu tham khảo
1 Giáo trình Kỹ thuật truyền số liệu, NXB Đại học Quốc gia TP.HCM
2 P, P S., A, R., & Kotain, A S (2012) FPGA Implementation of Single
Bit Error Correction using CRC International Journal of Computer
Applications, 52(10), 2 - 6
3 Forouzan, B A., & Fegan, S C (2007) Data Communications and
Networking New York: McGraw-Hill Higher Education
4 ANDHI RACHMAN SALEH,SUNNY ARIEF SUDIRO,CRC 8-bit
Encoder-Decoder Component in FPGA using VHDL, 3-6
Trang 30end else
begin
case(temp[m])
khong: m <= m-1;
mot: begin
temp[m] <= temp[m] ^ bochia[4];
temp[m-1] <= temp[m-1] ^ bochia[3];
temp[m-2] <= temp[m-2] ^ bochia[2];
temp[m-3] <= temp[m-3] ^ bochia[1];
temp[m-4] <= temp[m-4] ^ bochia[0];
end endcase end end
assign hoanthanh = i;
assign CRC = temp[3:0];
endmodule
Trang 32if(rst == 1) begin
m = 12;
i = 1'b0;
end else if(m == 12) begin
begin
case(temp[m])
khong: m <= m-1;
mot: begin
temp[m] <= temp[m] ^ bochia[4];
temp[m-1] <= temp[m-1] ^ bochia[3];
temp[m-2] <= temp[m-2] ^ bochia[2];
Trang 33temp[m-3] <= temp[m-3] ^ bochia[1];
temp[m-4] <= temp[m-4] ^ bochia[0];
end endcase end end
assign hoanthanh = i;
assign remainder = temp[3:0];
endmodule
Trang 34BẢNG ĐÁNH GIÁ KẾT QUẢ LÀM VIỆC NHÓM