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;