精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>教育园地>>● 电子技术>>EDA类>>CRC32 VHDL SOURCE CODE

主题:CRC32 VHDL SOURCE CODE
发信人: siemens()
整理人: camelsu(2001-01-30 01:24:15), 站内信件
--FROM FREECORE.COM  
--by  thw 
-- top level MODULE "CRC32". It pairs with CRC16 which is optional.
-- Written for Altera's appnote, and utilized in HDLC DS3 controller.

-- The code below builds CRC byte wide input data path to 32 bit CRC g
enerator.
-- The data is latched on an input byte strobe. Every fourth strobe th
e CRC
-- register holds new CRC value.
-- Generator also outputs a valid CRC flag. It's purpose is to test in
tegrity
-- of received data. The data, followed by CRC32 has to be fed into th
e
-- generator byte at a time, the CRC flag on the last byte strobe indi
cates
-- coherent data.
--
-- Written by Peter Szymanski
-- rev 0  7/1/95
-- rev 1  7/26/95 ; fixed an off by 1 bug in term calc
-- rev 2  8/23/95 ; reversed the polynomial per software emulator
--
-- Input bytes on their LSB hold data received first, x32 is first ter
m.
-- The polynomial is:
-- x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+x0
-- where x32 xors with shift regs bit0, x0 feeds bit31, x26 xors with 
bit6 and feeds bit5
-- left column are shift regs bit positions, next current contents wit
h '-' signs
-- indicating XOR gate outputs. m(n) = c(n) xor d(n), c-reg contents, 
d-input data
-- 
-- after first shift
-- d0 @ x0|    
--   |
-- c0   |  c1          
-- c1   |  c2      
-- c2   |  c3
-- c3   |  c4   
-- c4   |  c5        
-- c5   |- c6                                       m0
-- c6   |  c7     
-- c7   |  c8  
-- c8   |- c9                                     m0
-- c9   |- c10                                 m0        
-- c10   |  c11
-- c11    |  c12          
-- c12   |  c13
-- c13   |  c14
-- c14   |  c15
-- c15   |- c16                        m0
-- c16   |  c17
-- c17   |  c18
-- c18   |  c19
-- c19   |- c20                           m0
-- c20   |- c21                        m0
-- c21   |- c22                     m0
-- c22   |  c23        
-- c23   |- c24                  m0
-- c24   |- c25               m0
-- c25   |  c26     
-- c26   |- c27            m0
-- c27   |- c28         m0
-- c28   |  c29
-- c29   |- c30      m0
-- c30   |- c31   m0
-- c31   |- m0
-- ---     -----------------------------------------------------------
---
-- s0      s1
--
-- second
-- d1 @ x1|    
--   |
-- c0   |  c2      
-- c1   |  c3
-- c2   |  c4   
-- c3   |  c5        
-- c4   |  c6                                        m0
-- c5   |- c7                                        m1     
-- c6   |  c8  
-- c7   |  c9                                     m0
-- c8   |- c10                                 m0 m1       
-- c9   |- c11                                 m1
-- c10    |  c12          
-- c11   |  c13
-- c12   |  c14
-- c13   |  c15
-- c14   |  c16                        m0
-- c15   |- c17                              m1
-- c16   |  c18
-- c17   |  c19
-- c18   |  c20                           m0
-- c19   |- c21                        m0 m1
-- c20   |- c22               m0 m1
-- c21   |- c23                     m1
-- c22   |  c24                  m0
-- c23   |- c25               m0 m1
-- c24   |- c26               m1
-- c25   |  c27            m0
-- c26   |- c28         m0 m1
-- c27   |- c29         m1
-- c28   |  c30      m0
-- c29   |- c31   m0 m1
-- c30   |- m0 m1
-- c31    |-    m1
-- ---     -----------------------------------------------------------
---
-- s0      s1

--     third shift
--   |
-- c0   |  c3
-- c1   |  c4   
-- c2   |  c5        
-- c3   |  c6                                        m0
-- c4   |  c7                                        m1     
-- c5   |- c8                m2
-- c6   |  c9                                     m0
-- c7   |  c10                                 m0 m1       
-- c8   |- c11                                 m1 m2
-- c9     |- c12                                 m2         
-- c10   |  c13
-- c11   |  c14
-- c12   |  c15
-- c13   |  c16                        m0
-- c14   |  c17                              m1
-- c15   |- c18                              m2
-- c16   |  c19
-- c17   |  c20                           m0
-- c18   |  c21                        m0 m1
-- c19   |- c22               m0 m1 m2
-- c20   |- c23                     m1 m2
-- c21   |- c24                  m0 m2
-- c22   |  c25               m0 m1
-- c23   |- c26               m1 m2
-- c24   |- c27            m0 m2
-- c25   |  c28         m0 m1
-- c26   |- c29         m1 m2
-- c27   |- c30      m0 m2
-- c28   |  c31   m0 m1
-- c29   |- m0 m1 m2
-- c30    |-    m1 m2
-- c31    |-    m2
-- ---     -----------------------------------------------------------
---

--     fourth shift
--   |
-- c0   |  c4   
-- c1   |  c5        
-- c2   |  c6                                        m0
-- c3   |  c7                                        m1     
-- c4   |  c8                m2
-- c5   |- c9                                     m0 m3
-- c6   |  c10                                 m0 m1       
-- c7   |  c11                                 m1 m2
-- c8     |- c12                                 m2 m3         
-- c9   |- c13                                 m3
-- c10   |  c14
-- c11   |  c15
-- c12   |  c16                        m0
-- c13   |  c17                              m1
-- c14   |  c18                              m2
-- c15   |- c19                              m3
-- c16   |  c20                           m0
-- c17   |  c21                        m0 m1
-- c18   |  c22               m0 m1 m2
-- c19   |- c23                     m1 m2 m3
-- c20   |- c24                  m0 m2 m3
-- c21   |- c25               m0 m1 m3
-- c22   |  c26               m1 m2
-- c23   |- c27            m0 m2 m3
-- c24   |- c28         m0 m1 m3
-- c25   |  c29         m1 m2
-- c26   |- c30      m0 m2 m3
-- c27   |- c31   m0 m1 m3
-- c28    |     m0 m1 m2
-- c29    |-    m1 m2 m3
-- c30    |-    m2 m3
-- c31    |-    m3
-- ---     -----------------------------------------------------------
---
-- s0      s4

--     fifth shift
-- c0   |  c5        
-- c1   |  c6                                        m0
-- c2   |  c7                                        m1     
-- c3   |  c8                m2
-- c4   |  c9                                     m0 m3
-- c5   |- c10                                 m0 m1 m4       
-- c6   |  c11                                 m1 m2
-- c7     |  c12                                 m2 m3         
-- c8   |- c13                                 m3 m4
-- c9   |- c14                                 m4
-- c10   |  c15
-- c11   |  c16                        m0
-- c12   |  c17                              m1
-- c13   |  c18                              m2
-- c14   |  c19                              m3
-- c15   |- c20                           m0 m4
-- c16   |  c21                        m0 m1
-- c17   |  c22               m0 m1 m2
-- c18   |  c23                     m1 m2 m3
-- c19   |- c24                  m0 m2 m3 m4
-- c20   |- c25               m0 m1 m3 m4
-- c21   |- c26               m1 m2 m4
-- c22   |  c27            m0 m2 m3
-- c23   |- c28         m0 m1 m3 m4
-- c24   |- c29         m1 m2 m4
-- c25   |  c30      m0 m2 m3
-- c26   |- c31   m0 m1 m3 m4
-- c27    |-    m0 m1 m2 m4
-- c28    |     m1 m2 m3
-- c29    |-    m2 m3 m4
-- c30    |-    m3 m4
-- c31    |-    m4
-- ---     -----------------------------------------------------------
---
-- s0      s5


--     sixth shift
-- c0   |  c6                                        m0
-- c1   |  c7                                        m1     
-- c2   |  c8                m2
-- c3   |  c9                                     m0 m3
-- c4   |  c10                                 m0 m1 m4       
-- c5   |- c11                                 m1 m2 m5
-- c6     |  c12                                 m2 m3         
-- c7   |  c13                                 m3 m4
-- c8   |- c14                                 m4 m5
-- c9   |- c15                                 m5
-- c10   |  c16                        m0
-- c11   |  c17                              m1
-- c12   |  c18                              m2
-- c13   |  c19                              m3
-- c14   |  c20                           m0 m4
-- c15   |- c21                        m0 m1 m5
-- c16   |  c22               m0 m1 m2
-- c17   |  c23                     m1 m2 m3
-- c18   |  c24                  m0 m2 m3 m4
-- c19   |- c25               m0 m1 m3 m4 m5
-- c20   |- c26               m1 m2 m4 m5
-- c21   |- c27            m0 m2 m3 m5
-- c22   |  c28         m0 m1 m3 m4
-- c23   |- c29         m1 m2 m4 m5
-- c24   |- c30      m0 m2 m3 m5
-- c25   |  c31   m0 m1 m3 m4
-- c26    |-    m0 m1 m2 m4 m5
-- c27    |-    m1 m2 m3 m5
-- c28    |     m2 m3 m4
-- c39    |-    m3 m4 m5
-- c30    |-    m4 m5
-- c31    |-    m5
-- ---     -----------------------------------------------------------
---
--
--     seventh shift
-- c0   |  c7                                        m1     
-- c1   |  c8                m2
-- c2   |  c9                                     m0 m3
-- c3   |  c10                                 m0 m1 m4       
-- c4   |  c11                                 m1 m2 m5
-- c5     |- c12                                 m2 m3 m6 m0  
-- c6   |  c13                                 m3 m4
-- c7   |  c14                                 m4 m5 
-- c8   |- c15                                 m5 m6    m0
-- c9   |- c16                        m0 m6       m0 
-- c10   |  c17                              m1
-- c11   |  c18                              m2
-- c12   |  c19                              m3
-- c13   |  c20                           m0 m4
-- c14   |  c21                        m0 m1 m5
-- c15   |- c22               m0 m1 m2 m6          m0
-- c16   |  c23                     m1 m2 m3
-- c17   |  c24                  m0 m2 m3 m4
-- c18   |  c25               m0 m1 m3 m4 m5
-- c19   |- c26               m1 m2 m4 m5 m6             m0
-- c20    |- c27            m0 m2 m3 m5 m6                m0
-- c21   |- c28         m0 m1 m3 m4 m6                   m0
-- c22   |  c29         m1 m2 m4 m5
-- c23   |- c30      m0 m2 m3 m5 m6                      m0
-- c24   |- c31   m0 m1 m3 m4 m6                         m0
-- c25    |     m0 m1 m2 m4 m5
-- c26    |-    m1 m2 m3 m5 m6                            m0
-- c27    |-    m2 m3 m4 m6                               m0          
              
-- c28    |     m3 m4 m5
-- c29    |-    m4 m5 m6                                  m0
-- c30    |-    m5 m6                                     m0
-- c31    |-    m6                                        m0
-- ---     -----------------------------------------------------------
---
-- s0      s7


--     eighth shift     
-- c0   |  c8                m2
-- c1   |  c9                                     m0 m3
-- c2   |  c10                                 m0 m1 m4       
-- c3   |  c11                                 m1 m2 m5
-- c4     |  c12                                 m2 m3 m6 m0  
-- c5   |- c13                                 m3 m4 m7    m1
-- c6   |  c14                                 m4 m5 
-- c7   |  c15                                 m5 m6    m0
-- c8   |- c16                        m0 m6 m7    m0 m1
-- c9   |- c17                              m1 m7          m1
-- c10   |  c18                              m2
-- c11   |  c19                              m3
-- c12   |  c20                           m0 m4
-- c13   |  c21                        m0 m1 m5
-- c14   |  c22               m0 m1 m2 m6          m0
-- c15   |- c23                     m1 m2 m3 m7             m1
-- c16   |  c24                  m0 m2 m3 m4
-- c17   |  c25               m0 m1 m3 m4 m5
-- c18   |  c26               m1 m2 m4 m5 m6             m0
-- c19    |- c27            m0 m2 m3 m5 m6 m7             m0 m1
-- c20   |- c28         m0 m1 m3 m4 m6 m7                m0 m1
-- c21   |- c29         m1 m2 m4 m5 m7                      m1
-- c22   |  c30      m0 m2 m3 m5 m6                      m0
-- c23   |- c31   m0 m1 m3 m4 m6 m7                      m0 m1
-- c24    |-    m0 m1 m2 m4 m5 m7                            m1
-- c25    |     m1 m2 m3 m5 m6                            m0
-- c26    |-    m2 m3 m4 m6 m7                            m0 m1       
                
-- c27    |-    m3 m4 m5 m7                                  m1
-- c28    |     m4 m5 m6                                  m0
-- c29    |-    m5 m6 m7                                  m0 m1
-- c30    |-    m6 m7                                     m0 m1
-- c31    |-    m7                                           m1
-- ---     -----------------------------------------------------------
---
-- s0      s8
--
-- these are the contents of the shift register on the eights shift
--
--
--
--
--
entity CRC32 is
   port(
RST:  in vlbit;   -- HDLC controller generated reset
  -- derived from bit 8 of status byte
BYTE_CLK:  in vlbit;   -- HDLC controller byte clock
DATA_BYTE:  in vlbit_1d(7 downto 0); -- data octets
EN:  in vlbit;   -- CRC enable synched to BYTE_CLK
CRC_OK:   out vlbit;   -- hi of CRC equals to "0"
LW_STB:   out vlbit   -- BYTE_CLK wide LW strobe
);
--
end CRC32;

architecture RTL_CRC32 of CRC32 is

CONSTANT  hex_0:    vlbit_1d(15 downto 0) := "0000000000000000"; -- si
xteen zeros
CONSTANT  Lhex_0:   vlbit_1d(31 downto 0) := "000000000000000000000000
00000000"; -- 32 zeros
CONSTANT  Lhex_1:   vlbit_1d(31 downto 0) := "111111111111111111111111
11111111"; -- 32 ones
CONSTANT  GEN_32:   vlbit_1d(31 downto 0) := "000001001100000100011101
10110111"; -- 04C11DB7 generator polynomial
--                                            x32+x26+x23+x22+x16+x12+
x11+x10+x8+x7+x5+x4+x2+x1+x0
--CONSTANT  residue:  vlbit_1d(31 downto 0) := "1100011100000100110111
0101111011"; -- C704DD7B residue bit flip
CONSTANT  residue:  vlbit_1d(31 downto 0) :=   "1101111010111011001000
0011100011"; -- DEBB20E3 residue
--
---------------------------------------------- Local Signals ---------
---------------------------
signal CRC_Reg:    vlbit_1d(31 downto 0);  -- holds current CRC value

signal IX:     vlbit_1d(7  downto 0);  -- intermediate XOR terms
signal byte_cnt:   vlbit_1d(1  downto 0);  -- local byte count
signal Last_W:     vlbit_1d(31 downto 0);  -- holds last long word
--
begin
----------------------------------------------------------------------
-----------------------------
-- compute interim terms for the first byte.
--
IX(0) <= CRC_Reg(0) xor DATA_BYTE(0); -- compute interm. byte product
0 first bit of a byte
IX(1) <= CRC_Reg(1) xor DATA_BYTE(1); -- compute interm. byte product

IX(2) <= CRC_Reg(2) xor DATA_BYTE(2); -- compute interm. byte product

IX(3) <= CRC_Reg(3) xor DATA_BYTE(3); -- compute interm. byte product

IX(4) <= CRC_Reg(4) xor DATA_BYTE(4); -- compute interm. byte product

IX(5) <= CRC_Reg(5) xor DATA_BYTE(5); -- compute interm. byte product

IX(6) <= CRC_Reg(6) xor DATA_BYTE(6); -- compute interm. byte product

IX(7) <= CRC_Reg(7) xor DATA_BYTE(7); -- compute interm. byte product
7 last bit of a byte
--
--
Gen_Rx_CRC32: process
begin
wait until ((BYTE_CLK'event and BYTE_CLK='1') or (RST = '1'));
if RST = '1' then
CRC_Reg <= Lhex_1; -- stat byte, clear reg
else
--
CRC_REG(0) <= not EN or (CRC_REG(8) xor IX(2)
);
CRC_REG(1) <= not EN or (CRC_REG(9) xor IX(0) xor IX(3)
);
CRC_REG(2) <= not EN or (CRC_REG(10) xor IX(0) xor IX(1) xor IX(4)
);
CRC_REG(3) <= not EN or (CRC_REG(11) xor IX(1) xor IX(2) xor IX(5)
);
CRC_REG(4) <= not EN or (CRC_REG(12) xor IX(0) xor IX(2) xor IX(3) xor
IX(6) );
CRC_REG(5) <= not EN or (CRC_REG(13) xor IX(1) xor IX(3) xor IX(4) xor
IX(7) );
CRC_REG(6) <= not EN or (CRC_REG(14) xor IX(4) xor IX(5)
);
CRC_REG(7) <= not EN or (CRC_REG(15) xor IX(0) xor IX(5) xor IX(6)
);
CRC_REG(8) <= not EN or (CRC_REG(16) xor IX(1) xor IX(6) xor IX(7)
);
CRC_REG(9) <= not EN or (CRC_REG(17) xor IX(7)
);
CRC_REG(10) <=not EN or (CRC_REG(18) xor IX(2)
);
CRC_REG(11) <=not EN or (CRC_REG(19) xor IX(3)
);
CRC_REG(12) <=not EN or (CRC_REG(20) xor IX(0) xor IX(4)
);
CRC_REG(13) <=not EN or (CRC_REG(21) xor IX(0) xor IX(1) xor IX(5)
);
CRC_REG(14) <=not EN or (CRC_REG(22) xor IX(1) xor IX(2) xor IX(6)
);
CRC_REG(15) <=not EN or (CRC_REG(23) xor IX(2) xor IX(3) xor IX(7)
);
CRC_REG(16) <=not EN or (CRC_REG(24) xor IX(0) xor IX(2) xor IX(3) xor
IX(4) );
CRC_REG(17) <=not EN or (CRC_REG(25) xor IX(0) xor IX(1) xor IX(3) xor
IX(4) xor IX(5) );
CRC_REG(18) <=not EN or (CRC_REG(26) xor IX(0) xor IX(1) xor IX(2) xor
IX(4) xor IX(5) xor IX(6) );
CRC_REG(19) <=not EN or (CRC_REG(27) xor IX(1) xor IX(2) xor IX(3) xor
IX(5) xor IX(6) xor IX(7) );
CRC_REG(20) <=not EN or (CRC_REG(28) xor IX(3) xor IX(4) xor IX(6) xor
IX(7) );
CRC_REG(21) <=not EN or (CRC_REG(29) xor IX(2) xor IX(4) xor IX(5) xor
IX(7) );
CRC_REG(22) <=not EN or (CRC_REG(30) xor IX(2) xor IX(3) xor IX(5) xor
IX(6) );
CRC_REG(23) <=not EN or (CRC_REG(31) xor IX(3) xor IX(4) xor IX(6) xor
IX(7) );
CRC_REG(24) <=not EN or ( IX(0) xor IX(2) xor IX(4) xor IX(5)
xor IX(7) );
CRC_REG(25) <=not EN or ( IX(0) xor IX(1) xor IX(2) xor IX(3)
xor IX(5) xor IX(6) );
CRC_REG(26) <=not EN or ( IX(0) xor IX(1) xor IX(2) xor IX(3)
xor IX(4) xor IX(6) xor IX(7));
CRC_REG(27) <=not EN or ( IX(1) xor IX(3) xor IX(4) xor IX(5)
xor IX(7) );
CRC_REG(28) <=not EN or ( IX(0) xor IX(4) xor IX(5) xor IX(6)
);
CRC_REG(29) <=not EN or ( IX(0) xor IX(1) xor IX(5) xor IX(6)
xor IX(7) );
CRC_REG(30) <=not EN or ( IX(0) xor IX(1) xor IX(6) xor IX(7)
);
CRC_REG(31) <=not EN or ( IX(1) xor IX(7)
);
--
end if;
--
end process;
--
--
--
--

Gen_CRC_OK: process(CRC_REG)
begin
if CRC_REG = residue then
CRC_OK <= '1';
else
CRC_OK <= '0';
end if;
end process;
--
Gen_Byte_Count: process -- set the strobe to even byte
VARIABLE byte_cnt_tmp: vlbit_1d(2 downto 0);
begin
wait until ((BYTE_CLK'event and BYTE_CLK='1') or RST = '1');
byte_cnt_tmp := b"000";
if RST = '1' then -- SPARC reset
byte_cnt <= b"00";
else --
if EN = '1' then -- past offset
byte_cnt_tmp := ADDUM(byte_cnt, b"01");
byte_cnt <= byte_cnt_tmp(1 downto 0);
end if;
end if;
end process;
--

Gen_LW_STB: process(byte_cnt) -- this decodes the forth byte, register
ed output
begin
-- wait until (BYTE_CLK'event and BYTE_CLK='1');
if byte_cnt = b"11" then
LW_STB <= '1';
else
LW_STB <= '0';
end if;
end process;
--
--
end RTL_CRC32;


--
-----------EDA IN 21 CENTRY -----------
无限空间的电子技术资料和自由EDA&工程软件站点
http://eda.silversand.net
Personal homesite:
thw.163.net siemens.163.net
Business :

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 203.93.7.52]

[关闭][返回]