You are on page 1of 3

CRC

P
R OwJ VHDL
EKTY

CRC w VHDL
Zabezpieczanie danych za
pomoc sum kontrolnych CRC
(Cyclic Redundancy Codes)
nie jest zbyt popularne w
projektach amatorskich, ale
jest rzecz obowizkow na
rynku profesjonalnym. CRC
od strony mikrokontrolerowej
przedstawilimy w serii
artykuw poczwszy
od EP1/2003. Teraz
przedstawimy implementacj
CRC w ukadach PLD.
Rekomendacje:
opisywany ukad stanowi
znakomit ilustracj
wykorzystania ukadw PLD oraz
posugiwania si jzykiem opisu
sprztu VHDL, a dodatkowo
pokazuje sposb implementacji
jednego z wanych algorytmw
zabezpieczajcych informacje.
Bdzie zatem interesujcy
dla wszystkich czytelnikw
zainteresowanych nowoczesn
technik cyfrow.

Programowa realizacja obliczania


CRC nie zawsze jest moliwa do zastosowania w praktycznej aplikacji,
gwnie ze wzgldu na czas niezbdny do wykonania oblicze. Znaczne
przyspieszenie wykonywania oblicze
mona uzyska realizujc je sprztowo, a do tego celu idealnie nadaj
si ukady PLD. Przykad pokazany
w artykule (suma kontrolna wykorzystywana w sieciach ATM oraz interfejsie SMbus, okrelana mianem HEC
lub sCRC8) jest tylko jednym z wielu moliwych algorytmw wyliczania
sumy kontrolnej. Jej wielomian generujcy ma posta: x8+x2+x+1, a zapis
szesnastkowy: 0x07.
Czytelnikom zainteresowanym poznaniem tajnikw CRC gorco polecam cykl artykuw opracowanych
przez Jarosawa Doliskiego, ktrego
pierwsz cz opublikowalimy w
EP1/2003. W tym artykule skupimy
si przede wszystkim na omwieniu
sprztowej implementacji algorytmw
obliczania CRC.

Jak przeoy wielomian na sprzt?

Najpowaniejszym zadaniem podczas realizacji projektu bdzie przekonwertowanie wielomianu do postaci


pudeka o zadanej przez uytkownika
liczbie wej i wyjciu, na ktrym pojawia si suma kontrolna po jej oblicze-

niu. Na przykadzie algorytmu sCRC8


pokaemy jak dokona konwersji.
Podstaw bdzie dla nas schemat
blokowy szeregowego generatora sumy
kontrolnej o konfiguracji odpowiadajcej wielomianowi. Dla wielomianu
x8+x2+x+1 schemat generatora pokazano na rys. 1.
Pierwszym, wydaje si take najprostszym w realizacji, sposobem
opisu bdzie wierne oddanie budowy ukadu pokazanego na schemacie, za pomoc rwna logicznych w
dowolnym jzyku HDL. Rozwizanie
rzeczywicie skuteczne, ale pod warunkiem, e generator CRC bdzie
zasilany danymi w postaci szeregowej
(bardzo istotne: najstarszy bit danych
jest podawany na wejcie DATA jako
pierwszy!). Jeli chcemy jednak wykorzysta moliwoci oferowane przez
ukady PLD lepszym wyjciem bdzie
badanie CRC dla sw o wikszej
dugoci. Co wtedy?
Ot znajc wielomian generujcy mona odnale rwnania logiczne
przypisane kademu bitowi CRC. Najprociej, cho jest to zadanie wymagajce dokadnoci, mona je utworzy
stosujc metod budowania rwna
krok-po-kroku. Polega ona na analizie
stanw poszczeglnych stopni generatora sumy kontrolnej po kadym cyklu
zegarowym. Jeeli liczba analizowanych

Rys. 1. Schemat ideowy generatora sCRC8

40

Elektronika Praktyczna 4/2005

CRC w VHDL

Rys. 2. Sposb konwersji generatora szeregowego na rwnolegy

cykli zegarowych bdzie rwna liczbie rejestrw (ogniw) wykorzystanych


w generatorze, to nastpia konwersja
generatora szeregowego na rwnolegy,
w przypadku przyjcia mniejszej liczby
cykli zegarowych moemy utworzy generator szeregowo-rwnolegy. Przykad
takiej czciowej konwersji pokazano na
rys. 2. Uzyskano generator dla wielomianu x8+x2+x+1 z rwnolegym wejciem czterobitowym. Rwnania logiczne odpowiadajce poszczeglnym bitom
pokazano poniej tablicy konwersji.
List. 1. Listing pakietu PCKG zawierajcego funkcj nextCRC
library IEEE;
use IEEE.std_logic_1164.all;

package PCKG is
function nextCRC
( data: std_logic_vector(7 downto 0);
prevCRC:
std_logic_vector(7 downto
0) )
return std_logic_vector;
end PCKG;
package body PCKG is
function nextCRC
( data: std_logic_vector(7 downto 0);
prevCRC:
std_logic_vector(7 downto
0) )
return std_logic_vector is
variable D: std_logic_vector(7 downto 0);
variable C: std_logic_vector(7 downto 0);
variable newCRC: std_logic_vector(7 downto 0);
begin
D := Data;
C := prevCRC;
newCRC(0) := D(7) xor D(6) xor
C(0) xor C(6) xor C(7);
newCRC(1) := D(6) xor D(1) xor
C(0) xor C(1) xor C(6);
newCRC(2) := D(6) xor D(2) xor
D(0) xor C(0) xor C(1) xor
C(2) xor C(6);
newCRC(3) := D(7) xor D(3) xor
D(1) xor C(1) xor C(2) xor
C(3) xor C(7);
newCRC(4) := D(4) xor D(3) xor
C(2) xor C(3) xor C(4);
newCRC(5) := D(5) xor D(4) xor
C(3) xor C(4) xor C(5);
newCRC(6) := D(6) xor D(5) xor
C(4) xor C(5) xor C(6);
newCRC(7) := D(7) xor D(6) xor
C(5) xor C(6) xor C(7);
return newCRC;
end nextCRC;

D(0) xor
D(0) xor
D(1) xor
D(2) xor
D(2) xor
D(3) xor

Nie ma jak funkcja

We wszystkich projektach dotychczas prezentowanych w EP wszelkie


zadania byy realizowane w plikach
zawierajcych opisy kompletnych moduw funkcjonalnych. Teraz pokaemy inne, bardziej uniwersalne podejcie - skorzystamy z funkcji.
W jzyku VHDL funkcja jest rodzajem podprogramu, ktry mona wywoa z wieloma zmiennymi wejciowymi, ale zwracany jest tylko jeden wynik. Funkcja moe by definiowana w
ciele opisu HDL (do tego celu suy
deklaracja function), ale w prezentowanym przykadzie posunlimy si krok
dalej: funkcja zostaa zadeklarowana
w osobnym pakiecie, ktry mona
wykorzysta do przechowywania take
innych wasnych funkcji i procedur.
Opis HDL pakietu zawierajcego funkcj nextCRC obliczajc now warto
CRC pokazano na list. 1. Pakiet nosi
nazw PCKG, a korzystanie z niego
bdzie moliwe po jawnym zadeklarowaniu go za pomoc dyrektywy use
work.pckg.all; w gwnym pliku projektu, jak to pokazano na list. 2. Zazwyczaj nie jest konieczne podawanie
cieki dostpu do biblioteki uytkownika (znajdujcej si domylnie w katalogu WORK, czyli biecym projektu)
za pomoc dyrektywy library WORK;.
Wywoanie funkcji z poziomu
opisu jest nadzwyczaj proste, polega
bowiem na przypisaniu wyniku dziaania funkcji wybranemu sygnaowi

D(5) xor

Elektronika Praktyczna 4/2005

Moliwoci newCRC

Na rys. 3 pokazano symbol generatora CRC powstaego w wyniku kompilacji opisu z list. 2. W takiej konfiguracji projektant musi zadba o sekwencyjne podawanie danych na wejcie
generatora i jego taktowanie. Naley
pamita, e peni moliwoci generatora CRC mona uzyska dla paczek 8
x 8-bitowych sw danych.
Kompletny projekt wymaga niewielkich zasobw logicznych, zajmuje
bowiem 13/36 makrokomrek ukadu XC9536XL (i pochodnych), co
przy obecnej cenie takiego ukadu
(XC9536XL-10 kosztuje 6,5 z brutto www.kamami.pl) oznacza, e koszt generatora CRC o przepywnoci bliskiej
452 Mb/s wynosi 2,35 z brutto. Nieco
gorzej pod wzgldem zajtoci zasobw
wypadaj ukady EPM7032S-10 firmy
Altera, bowiem zajte jest 20 z 32
makrokrek (co wynika z trudniejszej
implementacji w tych ukadach funktorw ExOR), a maksymalna moliwa
do uzyskania przepywno generatora
wynosi 444,5 Mb/s (przy czstotliwoci
taktowania 55,56 MHz - rys. 4).

Dziaa?

D(4) xor

end PCKG;

(moe to by magistrala wyjciowa


lub sygna zagrzebany zdefiniowany
za pomoc dyrektywy signal):
jakis_sygnal <= nazwa_funkcji
(parametr1, parametr3, parametr3,.);
Funkcja nextCRC oblicza CRC dla
sw 8-bitowych. Ma ona dwa parametry wejciowe:
- data - 8-bitowe wejcie kolejnego
bajtu danych,
- prevCRC - 8-bitowe wejcie danej o
wartoci dotychczas obliczonej CRC.
Naley pamita, e deklarowane
typy sygnaw wejciowych funkcji s
typu std_logic_vector i taki sam typ ma
dana uzyskiwana na wyjciu funkcji.
W wyniku wykonania funkcji nextCRC otrzymujemy 8-bitowe sowo newCRC, ktre zawiera now warto CRC
(w kolejnej rundzie oblicze newCRC
jest przypisywana zmiennej prevCRC).
Poniewa ukady czysto kombinacyjne sabo s przystosowane do pracy
z duymi czstotliwociami, dla zapewnienia bezpieczestwa projektu zmienna newCRC jest zatrzaskiwana w 8-bitowym rejestrze D. Aktualizacja sowa
wyjciowego odbywa si wraz z narastajcym zboczem sygnau CLK.

Rys. 3. Symbol generatora CRC


zbudowanego przez autora

Do weryfikacji poprawnoci dziaania


konieczny okaza si dostpny na stronie http://www.smbus.org/faq/crc8Applet.
htm kalkulator sumy kontrolnej. Czemu

41

CRC w VHDL
List. 2. Listing gwnego pliku projektu generatora sumy kontrolnej
sCRC8
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.pckg.all;

entity DALLAS is port (


DATA : in std_logic_vector(7 downto 0);
clk : in std_logic;
outCRC: out std_logic_vector(7 downto 0)
);
end DALLAS;
architecture behavioral of DALLAS is
signal newCRC : std_logic_vector(7 downto 0) :=
00000000;
begin
process (clk, DATA, newCRC)
begin
if clk = 1 and rising_edge(clk) then
newCRC <= nextCRC (DATA, newCRC);
else null;
end if;
end process;
outCRC <= newCRC;

Rys. 4. Widok okna analizatora czasowego programu Quartus II

end behavioral;

Generator generatorw

Rys. 5. Widok okna symulatora ModelSIM z wynikami symulacji generatora


sCRC8

akurat ten? Spord wielu dostpnych


na rnych stronach internetowych ten
kalkulator dziaa poprawnie! Jego moliwoci nie s co prawda zbyt due
(ograniczone do interesujcego nas wielomianu), ale wyniki dziaania okazay
si cakowicie wiarygodne w przeciwiestwie do szeregu innych kalkulatorw uniwersalnych.
Weryfikacj funkcjonaln przeprowadzono na pytce ewaluacyjnej z
ukadem XC9536XL. Projekt skompilowano za pomoc bezpatnego pakietu
WebPack ISE6.3.i, a symulacj programow umoliwi (take bezpatny)
ModelSIM XE 5.8 (rys. 5).
Problematyczne okazao si zweryfikowanie funkcjonalne projektu za
pomoc symulatora zaimplementowanego w rodowisku Quartus II, poniewa kompilator ignoruje przypisania inicjalizujce zmienne typu signal
newCRC : std_logic_vector(7 downto
0) := 00000000; dla ukadw MA-

X7KS. Drobny, aczkolwiek dokuczliwy,


zabieg wprowadzenia sygnau zerujcego i wstpnego zerowania rejestru
newCRC zapewni oczekiwany efekt.

Podsumowanie

Projekt prezentowany w artykule


jest doskona ilustracj najwaniejszej domeny ukadw PLD: sprztowa
realizacja algorytmw, ktre w wersji programowej zabieraj wiele czasu. Dua prdko liczenia CRC nie
jest oczywicie na co dzie niezbdna, ale warto zda sobie spraw, e
z odpowiednio szybkim obliczeniem
CRC stosowanej w CANbus nie radz
Bezpatne narzdzia
Projekt przedstawiony w artykule
przygotowano i przesymulowano za pomoc
bezpatnych narzdzi udostpnianych przez
producentw ukadw PLD (Altera i Xilinx):
Quartus II 4.2 oraz WebPack ISE 6.3i. S
one dostpne na stronach internetowych:
www.altera.com oraz www.xilinx.com.

Pod adresem:
http://www.easics.be/webtools/crctool
jest dostpny generator plikw w jzykach
VHDL i Verilog, umoliwiajcy utworzenie
niemale dowolnego generatora CRC.

sobie typowe mikrokontrolery, kopotliwe jest take programowe obliczanie CRC przy bezpiecznych transmisjach via IrDA, a nawet RS232
(oczywicie dla wikszych prdkoci).
Czytelnicy interesujcy si jzykami
opisu sprztu maj przy okazji moliwo poznania sposobu tworzenia i
korzystania z funkcji w jzyku VHDL,
mogli si take zapozna ze sposobem
korzystania z zewntrznych pakietw.
Piotr Zbysiski, EP
piotr.zbysinski@ep.com.pl

VTHD24B - 105.00 PLN


220V/130W z kompletem kocwek

VTHD22B - 135.00 PLN


220V/85W z kompletem kocwek

WIERTARKI
VTHD21B - 85.00 PLN
12-18V/18-45W z kompletem 40 kocwek

WIERTARKA MINI - 30.00 PLN


9-18V, do 18000obr./min

DETALICZNA SPRZEDA WYSYKOWA - Zamwienia przyjmuje Dzia Handlowy AVT


01-939 Warszawa, ul. Burleska 9, tel. (22) 568 99 50, fax (22) 568 99 55, e-mail: handlowy@avt.com.pl www.sklep.avt.com.pl

42

Elektronika Praktyczna 4/2005

You might also like