VHDL ile Generic Döngüsel Artıklık Denetimi (CRC) Tasarımı

Döngüsel Artıklık Denetimi (CRC) veri iletiminin doğru yapılıp yapılmadığının kontrolünü sağlamak için kullanılan hata tespit yöntemidir. Standarlarda farklı uzunluklarda CRC tanımlamaları yapılmıştır. Temelde XOR işleminin gerçekleştirilen CRC, farklı polinomlar ile de gerçekleştirilebilmektedir. Örneğin SD kartlarda kullanılan CRC7 ifadesi polinomu x7 + x3 + 1 şeklindedir.  Şekil 1’de CRC 7 için hesaplama blok şeması verilmiştir. Şekilden de görüleceği üzere CRC en anlamlı biti (MSB) ile giriş biti XOR işlemine tabi tutularak en anlamsız bite (LSB) atanmaktadır. Bu işlem polinomda tanım 1 ifadesinin gerçeklemektedir. x1, x2 ifadelerinin katsayıları 0 olduğundan CRC’nin 0. biti 1. bitine, 1. biti 2. bitine atanmaktadır. x3 ifadesinin katsayısı 0 olmadığından dolayı 3. bit değerine CRC’nin 0. Bitinin yeni değeri ile 2. bitinin eski değerinin XOR sonucu atanmaktadır. 4, 5 ve 6 bitlerin katsayıları 0 olduğundan bir önceki bit değerleri atamaları yapılmaktadır.

 

crc

Şekil 1 CRC 7 hesaplama

Aşağıda verilen VHDL kodlarında generik olarak CRC hesaplama işlemleri gerçeklenmiştir. 1. satırda tanımlı sabit ifadesi ile CRC’si hesaplanacak verinin uzunluğunu tanımlamaktayız.  2. satırda tanımlı sabit ifadesinde CRC uzunluğu tanımlanmaktadır. CRC 7 için bu değer 7 dir. 3 satırda ise CRC içinde kullanılacak polinom içerisinde kaç katsayısı 0’dan farklı parametre oldğunu göstermektedir. CRC 7 için yukarıda tanımladığımız polinom için bu değer 4’tür.  x7 +x4 + x3 +x2 + 1 şeklinde polinomda ise bu değer 5 olacaktır. 5. satırda ise bu katsayıların saklanacağı değerlerin indislerinin saklanacağı tip tanımı yapılmıştır. 6. satırda bu tipte sabit tanımlanmıştır. 8-21 satırları arasında CRC hesaplama işlemlerini yapan fonksiyon tanımlanmıştır.

  1. constant DATA_WIDTH : integer := 40;
  2. constant CRC_WIDTH : integer := 7;
  3. constant CRC_LENGTH : integer := 3;
  4.  
  5. type t_CRC_param is array (0 to CRC_LENGTH - 1) of integer;
  6. constant c_CRC_Param : t_CRC_param := (7, 3 , 1);
  7.  
  8. function f_CRC(r_data : std_logic_vector(DATA_LENGTH - 1 downto 0); CRC_Param : t_CRC_param; CRC_LENGTH : integer ) return std_logic_vector is
  9. variable v_CRC : std_logic_vector(CRC_WIDTH - 1 downto 0) := (others => '0');
  10. variable v_new : std_logic;
  11. begin
  12. for n_i in DATA_LENGTH - 1 downto 0 loop
  13. v_new := v_CRC(CRC_WIDTH - 1) xor r_data(n_i);
  14. v_CRC(CRC_WIDTH - 1 downto 1) := v_CRC(CRC_WIDTH - 2 downto 0);
  15. v_CRC(0) := v_new;
  16. for n_j in 1 to CRC_LENGTH - 2 loop
  17. v_CRC(c_CRC_Param(n_j)) := v_CRC(c_CRC_Param(n_j)) xor v_new;
  18. end loop;
  19. end loop;
  20. return v_CRC;
  21. end f_CRC;
  22.  
  23. signal r_data : std_logic_vector(DATA_LENGTH - 1 downto 0) := X"1100000900";
  24. signal r_CRC : std_logic_vector(CRC_WIDTH - 1 downto 0) := f_CRC(r_data, c_CRC_Param, CRC_LENGTH);

Tags:, ,

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir