Modulo CRC-9 problemi

Sezione dedicata al linguaggio di descrizione hardware per logiche programmabili

Modulo CRC-9 problemi

Postby navras » 05 Jul 2015, 12:12

Buongiorno a tutti, come da presentazione nell'apposito thread sono uno studente in ingegneria elettronica che si sta avventurando un po da autodidatta nel VHDL.

Quello che sto cercando di realizzare è un modulo che ha in ingresso:
-Messaggio (seriale di 56 bit)
-Variabile che controlla la modalità di Destinatario e Mittente
-Clock

In uscita:
-Array di 64 bit con in testa 56 bit contenenti il messaggio e in basso 8 bit che in base alla modalità tirano fuori 2 tipi di risultato: con MD=0 i bit di ridondanza; con MD=1 tutti 1 se quello che è arrivato è sbagliato, tutti 0 se corretto.

Problema:
Quando vado a vedere il registro per il conto di bit di ridondanza ogni volta vengono fuori come risultato UU.

Di seguito il codice da me realizzato:
Grazie a tutti

Code: Select all
library ieee;
use ieee.std_logic_1164.all;

entity serial_crc_ccitt is
   port (
      clk     :in  std_logic;
      md      :in  std_logic;   
      data_in :in  std_logic ;
      crc_out :out std_logic_vector (63 downto 0);
      messaggio: out std_logic_vector (55 downto 0);
      FCR     :out std_logic_vector (7 downto 0)
      );
end entity;

architecture rtl of serial_crc_ccitt is

signal res       : std_logic := '1';
signal contatore : integer := 0;
signal lsfr      : std_logic_vector (8 downto 0);
signal mess      : std_logic_vector (55 downto 0);
signal i         : integer := 0;

begin

-- Logic to CRC Calculation
process (clk) begin             

if (rising_edge(clk)) then         
   
   if (res = '1') then   
      
         lsfr <= (others => '0');
         res <= '0';
         contatore <= 0;
      
   end if;
   
   if (md = '0') then
      
   
   --Primi 56 cicli di clock salvo il messaggio, faccio gli altri 8 cicli di clock per finire il conto della FCR
   --Se md=0 : MITTENTE, dopo il messaggio ricavo l'FCR inserendo 8 0 per finire il conto
   --Se md=1 : DESTINATARIO, faccio shiftare tutti e 64 i bit in ingresso
   --I bit da 7 a 0 del registro lsfr sono il risultato
   --POLINOMIO 100010101
      lsfr(8) <= lsfr(7);      -- questo bit mi serve solo per salvare l'ultimo bit la FCR SONO I PRIMI 7
      lsfr(7) <= lsfr(6);
      lsfr(6) <= lsfr(5);
      lsfr(5) <= lsfr(4);
      lsfr(4) <= lsfr(3) xor lsfr(8);
      lsfr(3) <= lsfr(2);
      lsfr(3) <= lsfr(2);
      lsfr(2) <= lsfr(1) xor lsfr(8);
      lsfr(1) <= lsfr(0);
   
      if (contatore < 56) then
         lsfr(0) <= data_in xor lsfr(8);
      else
         lsfr(0) <= '0' xor lsfr(8);
      end if;
   
   
            
   
   if (contatore < 56) then          --Salvo il messaggio senza fermare il calcolo del FCR
      mess(55-contatore) <= data_in;   -- ad ogni fronte di clock il data_in seriale si posizione secondo la posizione del contatore in mess per i primi 56 cicli dove ho il messaggio
   end if;
   
   if (contatore = 63) then
            
      messaggio <= mess;         -- REGISTRI SEPARATI
      FCR <= lsfr(7 downto 0);   -- REGISTRI SEPARATI
      crc_out <= mess & lsfr(7 downto 0);
      res <= '1';                       -- quando finisce di contare mette su crc_out il messaggio in testa e il crc in coda(FORSE, DA CONTROLLARE)
      
   else contatore <= contatore + 1;      --se non ha finito incrementa il contatore e ricomincia da capo
   end if;
   end if;



if (md = '1') then         



lsfr(8) <= lsfr(7);
lsfr(7) <= lsfr(6);
lsfr(6) <= lsfr(5);
lsfr(5) <= lsfr(4);
lsfr(4) <= lsfr(3) xor lsfr(8);
lsfr(3) <= lsfr(2);
lsfr(2) <= lsfr(1) xor lsfr(8);
lsfr(1) <= lsfr(0);
lsfr(0) <= data_in xor lsfr(8);



if (contatore < 56) then          --Salvo il messaggio senza fermare il calcolo del FCR
   
   mess(55-contatore) <= data_in;   -- ad ogni fronte di clock il data_in seriale si posizione secondo la posizione del contatore in mess per i primi 56 cicli dove ho il messaggio

end if;

if (contatore = 63) and (lsfr /= "00000000") then
   
   lsfr <= (others => '1');    --se diverso da zero setto FCR a tutto 1
                          
end if;

if (contatore = 63) then

messaggio <= mess;         -- REGISTRI SEPARATI
FCR <= lsfr(7 downto 0);               -- REGISTRI SEPARATI
crc_out <= mess & lsfr(7 downto 0);
res <= '1';

end if;

end if;
end if;
end process;


end architecture rtl;
navras
 
Posts: 5
Joined: 05 Jul 2015, 11:57

Re: Modulo CRC-9 problemi

Postby Leonardo » 05 Jul 2015, 20:44

Ciao,

U vuol dire "uninitialized", devi sempre inizializzare tutti i segnali durante la simulazione

Leonardo
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 501
Joined: 29 May 2013, 22:31
Location: Parma

Re: Modulo CRC-9 problemi

Postby navras » 06 Jul 2015, 08:47

Grazie mille, risolto. Avevo 2 segnali appunto non inizializzati.
navras
 
Posts: 5
Joined: 05 Jul 2015, 11:57

Re: Modulo CRC-9 problemi

Postby navras » 06 Jul 2015, 16:32

SCUSATE RISOLTO
Volevo farvi anche una seconda domanda:
il polinomio è 100010101 con il quale trovo il gli 8 bit di ridondanza.

Il codice per far scorrere il messaggio di 56 bit dentro lo shift register da me scritto è questo:

Code: Select all
lsfr(8) <= lsfr(7);
      lsfr(7) <= lsfr(6);
      lsfr(6) <= lsfr(5);
      lsfr(5) <= lsfr(4);
      lsfr(4) <= lsfr(3) xor data_in xor lsfr(8);
      lsfr(3) <= lsfr(2);
      lsfr(2) <= lsfr(1) xor data_in xor lsfr(8);
      lsfr(1) <= lsfr(0);
      lsfr(0) <= data_in xor lsfr(8);


Faccio questo shift per 64 volte, ma non mi da un risultato corretto. Secondo voi dove sbaglio.

Grazie ancora
navras
 
Posts: 5
Joined: 05 Jul 2015, 11:57

Re: Modulo CRC-9 problemi

Postby Leonardo » 07 Jul 2015, 14:42

Ciao,

Hai risolto il secondo problema?
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 501
Joined: 29 May 2013, 22:31
Location: Parma

Re: Modulo CRC-9 problemi

Postby navras » 09 Jul 2015, 10:10

Si si grazie, era solo un problema di sincronizzazione tra i contatori del testbench e quello del CRC.

In compenso ora mi sta succedendo una cosa strana. Ho eliminato tutti i report che avevo inserito nel codice per controllarne il comportamento passo passo, ma quando vado a simulare continuano a venirmi fuori nella Console. Ah uso Aldec-HDL non so se può essere d'aiuto.
navras
 
Posts: 5
Joined: 05 Jul 2015, 11:57


Return to VHDL x FPGA

Who is online

Users browsing this forum: Bing [Bot] and 1 guest