发信人: 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]
|
|