[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [ethmac] CRC32
D,
Here you go, The first code is a CRC checker in VHDL the second is a psudo
random
packet generator with a CRC append. You can just use the part that
calculates teh FCS/CRC
i think it is clearly marked.
-----------------------------------------------------------------------
-- Code Starts here ---------------------------------------------------
-----------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE ieee.std_logic_unsigned.ALL;
ENTITY prp_recieve IS
PORT (
t_clk : IN std_logic;
Reset_n : IN std_logic;
TxDataValid : IN std_logic;
QuadRxData : IN std_logic_vector(3 DOWNTO 0));
END prp_recieve;
ARCHITECTURE behav OF prp_recieve IS
CONSTANT MagicNum : std_logic_vector(31 DOWNTO 0) := x"C704DD7B";
CONSTANT CRCPoly : std_logic_vector(31 DOWNTO 0) := x"04C11DB7";
TYPE state_type IS (Idle,
CRC_Calc,
CRC_Chk);
SIGNAL PRPRec_State : state_type;
SIGNAL BadPacketReg : std_logic_vector(20 DOWNTO 0);
SIGNAL PacketCntReg : std_logic_vector(20 DOWNTO 0);
BEGIN
QuadPumpPrpsRx: PROCESS (t_clk, Reset_n)
VARIABLE QuadCRCReg : std_logic_vector(31 DOWNTO 0);
VARIABLE XorEnCRC : std_logic_vector(31 DOWNTO 1);
BEGIN
IF Reset_n = '0' THEN
QuadCRCReg := (OTHERS => '1');
XorEnCRC := (OTHERS => QuadCRCReg(31));
BadPacketReg <= (OTHERS => '0');
PacketCntReg <= (OTHERS => '0');
ELSIF t_clk'event AND t_clk = '1' THEN
CASE PRPRec_State IS
WHEN Idle =>
QuadCRCReg := (OTHERS => '1');
IF TxDataValid = '1' AND QuadRxData = x"D" THEN
PRPRec_State <= CRC_Calc;
END IF;
WHEN CRC_Calc =>
IF TxDataValid = '1' THEN
-- Calculate the CRC for bit 0
XorEnCRC := (OTHERS => (QuadRxData(0) XOR QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadRxData(0) XOR QuadCRCReg(31));
-- Calculate the CRC for bit 1
XorEnCRC := (OTHERS => (QuadRxData(1) XOR QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadRxData(1) XOR QuadCRCReg(31));
-- Calculate the CRC for bit 2
XorEnCRC := (OTHERS => (QuadRxData(2) XOR QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadRxData(2) XOR QuadCRCReg(31));
-- Calculate the CRC for bit 3
XorEnCRC := (OTHERS => (QuadRxData(3) XOR QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadRxData(3) XOR QuadCRCReg(31));
ELSE
IF QuadCRCReg /= MagicNum THEN
BadPacketReg <= BadPacketReg + '1';
END IF;
PacketCntReg <= PacketCntReg + '1';
PRPRec_State <= Idle;
END IF;
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS QuadPumpPrpsRx;
END behav;
----------------------------------------------------------------------------
--
-- End of Code
----------------------------------------------------------------------------
--
-----------------------------------------------------------------------
-- Code Starts here ---------------------------------------------------
-----------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
ENTITY prp_generate IS
PORT (
m_clk : IN std_logic;
Reset_n : IN std_logic;
Tx_Packet : IN std_logic;
Rx_Data_Valid : OUT std_logic;
QuadTxData : OUT std_logic_vector(3 DOWNTO 0));
END prp_generate;
ARCHITECTURE behav OF prp_generate IS
----------------------------------------------------------------------------
-
-- Degree 16 Irreducible Polynomial
----------------------------------------------------------------------------
-
CONSTANT PRPSPoly : std_logic_vector(16 DOWNTO 0) := "10111000001101101";
----------------------------------------------------------------------------
-
CONSTANT CRCPoly : std_logic_vector(31 DOWNTO 0) := x"04C11DB7";
TYPE state_type IS (Idle,
Time_Delay,
Premble_Gen,
Data_Gen);
SIGNAL PRPGen_State : state_type;
--SIGNAL TimeDelay_Reg : std_logic_vector(14 DOWNTO 0);
SIGNAL TimeDelay_Reg : std_logic_vector(9 DOWNTO 0);
--SIGNAL DelayCount : std_logic_vector(6 DOWNTO 0);
SIGNAL PacketLength_Reg : std_logic_vector(9 DOWNTO 0);
--SIGNAL PacketLgthCnt : std_logic_vector(9 DOWNTO 0);
SIGNAL FCSApndCnt : integer;
SIGNAL PrembleLength : std_logic_vector(3 DOWNTO 0);
----------------------------------------------------------------------------
---
-- Test
----------------------------------------------------------------------------
---
SIGNAL PacketTxCnt : std_logic_vector(3 DOWNTO 0);
----------------------------------------------------------------------------
---
-- Test
----------------------------------------------------------------------------
---
BEGIN
QuadPumpPrbsTx: PROCESS (m_clk, Reset_n)
VARIABLE QuadSftRegTx : std_logic_vector(15 DOWNTO 0);
VARIABLE XorEnTx : std_logic_vector(15 DOWNTO 1);
VARIABLE QuadCRCReg : std_logic_vector(31 DOWNTO 0);
VARIABLE XorEnCRC : std_logic_vector(31 DOWNTO 1);
BEGIN
IF Reset_n = '0' THEN
QuadSftRegTx := (OTHERS => '1');
QuadCRCReg := (OTHERS => '1');
XorEnTx := (OTHERS => QuadSftRegTx(15));
XorEnCRC := (OTHERS => QuadCRCReg(31));
QuadTxData <= QuadSftRegTx(15 DOWNTO 12);
TimeDelay_Reg <= (OTHERS => '0');
--DelayCount <= (OTHERS => '0');
PacketLength_Reg <= (OTHERS => '0');
--PacketLgthCnt <= (OTHERS => '0');
FCSApndCnt <= 8;
PrembleLength <= "1111";
Rx_Data_Valid <= '0';
--PacketTxCnt <= (OTHERS => '0');
ELSIF m_clk'event AND m_clk = '1' THEN
CASE PRPGen_State IS
-----------------------------------------------------------------------
-- ****************** IDLE ****************
-----------------------------------------------------------------------
WHEN Idle =>
QuadCRCReg := (OTHERS => '1');
--Rx_Data_Valid <= '0';
IF Tx_Packet = '1' THEN
PRPGen_State <= Time_Delay;
--TimeDelay_Reg <= '1' & QuadSftRegTx(15 DOWNTO 2);
TimeDelay_Reg <= QuadSftRegTx(15 DOWNTO 6);
-- Pump the PRPS Generator once to randomize the bits
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
END IF;
-----------------------------------------------------------------------
-- ************** Time Delay **************
-----------------------------------------------------------------------
WHEN Time_Delay =>
IF TimeDelay_Reg /= 0 THEN
TimeDelay_Reg <= TimeDelay_Reg - '1';
ELSE
PRPGen_State <= Premble_Gen;
PacketLength_Reg <= QuadSftRegTx(15 DOWNTO 7) & '0';
--PacketLength_Reg <= "0010000000";
-- Pump the PRPS Generator once to randomize the bits
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
END IF;
-----------------------------------------------------------------------
-- ************ Premble Gen *************
-----------------------------------------------------------------------
WHEN Premble_Gen =>
Rx_Data_Valid <= '1';
IF PrembleLength /= 1 THEN
PrembleLength <= PrembleLength - '1';
QuadTxData <= "0101";
ELSE
QuadTxData <= "1101";
PrembleLength <= "1111";
PRPGen_State <= Data_Gen;
END IF;
-----------------------------------------------------------------------
-- ************** Data Gen **************
-----------------------------------------------------------------------
WHEN Data_Gen =>
IF PacketLength_Reg /= 0 THEN
PacketLength_Reg <= PacketLength_Reg - '1';
------------------------------------------------------------------
-- This will do 4 calculations of Prbs data in one clock.
-- The MAC Core wants bit 0 first
------------------------------------------------------------------
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
QuadTxData(0) <= QuadSftRegTx(15);
-- Calculate the CRC
XorEnCRC := (OTHERS => (QuadSftRegTx(15) XOR
QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadSftRegTx(15) XOR QuadCRCReg(31));
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
QuadTxData(1) <= QuadSftRegTx(15);
-- Calculate the CRC
XorEnCRC := (OTHERS => (QuadSftRegTx(15) XOR
QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadSftRegTx(15) XOR QuadCRCReg(31));
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
QuadTxData(2) <= QuadSftRegTx(15);
-- Calculate the CRC
XorEnCRC := (OTHERS => (QuadSftRegTx(15) XOR
QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadSftRegTx(15) XOR QuadCRCReg(31));
XorEnTx := (OTHERS => QuadSftRegTx(15));
QuadSftRegTx := (QuadSftRegTx(14 DOWNTO 0) XOR
(PRPSPoly(15 DOWNTO 1) AND XorEnTx))
& QuadSftRegTx(15);
QuadTxData(3) <= QuadSftRegTx(15);
-- Calculate the CRC
XorEnCRC := (OTHERS => (QuadSftRegTx(15) XOR
QuadCRCReg(31)));
QuadCRCReg := (QuadCRCReg(30 DOWNTO 0) XOR
(CRCPoly(31 DOWNTO 1) AND XorEnCRC))
& (QuadSftRegTx(15) XOR QuadCRCReg(31));
-------------------------------------------------------------------
-- Now append FCS/CRC
-------------------------------------------------------------------
ELSIF FCSApndCnt /= 0 THEN
QuadTxData(0) <= NOT QuadCRCReg((FCSApndCnt*4-1));
QuadTxData(1) <= NOT QuadCRCReg((FCSApndCnt*4-2));
QuadTxData(2) <= NOT QuadCRCReg((FCSApndCnt*4-3));
QuadTxData(3) <= NOT QuadCRCReg((FCSApndCnt*4-4));
FCSApndCnt <= FCSApndCnt - 1;
ELSE
FCSApndCnt <= 8;
PRPGen_State <= Idle;
Rx_Data_Valid <= '0';
--PacketTxCnt <= PacketTxCnt + 1;
END IF;
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS QuadPumpPrbsTx;
END behav;
----------------------------------------------------------------------------
--
-- End of Code
----------------------------------------------------------------------------
--
Matt Lake
-----Original Message-----
From: deepak80@hotmail.com [mailto:deepak80@hotmail.com]
Sent: Wednesday, April 30, 2003 7:28 PM
To: ethmac@opencores.org
Subject: [ethmac] CRC32
Anyone know where I can get hold of VHDL code for implementing CRC32
in Ethernet. All I can find is in Verilog. The entity will be reading in
4bit
nibbles at a time (MII format).
Thanking you lots
D
--
To unsubscribe from ethmac mailing list please visit
http://www.opencores.org/mailinglists.shtml
--
To unsubscribe from ethmac mailing list please visit http://www.opencores.org/mailinglists.shtml