CRC发生器(发送器)和校验器(接收器)-并行实现VHDL

CRC发生器(发送器)和校验器(接收器)-并行实现VHDL,vhdl,crc,Vhdl,Crc,我已经从下面的网站生成了用于并行实现的CRC生成器VHDL代码 多项式为100011101(0x1D),数据宽度为16位 代码如下: -- ######################################################################## -- CRC Engine RTL Design -- Copyright (C) www.ElectronicDesignworks.com -- Source code generated by Elect

我已经从下面的网站生成了用于并行实现的CRC生成器VHDL代码

多项式为100011101(0x1D),数据宽度为16位

代码如下:

-- ########################################################################
-- CRC Engine RTL Design 
-- Copyright (C) www.ElectronicDesignworks.com 
-- Source code generated by ElectronicDesignworks IP Generator (CRC).
-- Documentation can be downloaded from www.ElectronicDesignworks.com 
-- ******************************** 
--            License     
-- ******************************** 
-- This source file may be used and distributed freely provided that this
-- copyright notice, list of conditions and the following disclaimer is
-- not removed from the file.                    
-- Any derivative work should contain this copyright notice and associated disclaimer.                    
-- This source code file is provided "AS IS" AND WITHOUT ANY WARRANTY, 
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
-- PARTICULAR PURPOSE.
-- ********************************
--           Specification 
-- ********************************
-- File Name       : CRC8_DATA16.vhd    
-- Description     : CRC Engine ENTITY 
-- Clock           : Positive Edge 
-- Reset           : Active High
-- First Serial    : MSB 
-- Data Bus Width  : 16 bits 
-- Polynomial      : (0 2 3 4 8)                   
-- Date            : 16-Jun-2015  
-- Version         : 1.0        
-- ########################################################################

LIBRARY IEEE ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_arith.all ;
USE ieee.std_logic_unsigned.all ;

ENTITY crc_gen IS 
   PORT(           
           clock      : IN  STD_LOGIC; 
           reset      : IN  STD_LOGIC; 
           soc        : IN  STD_LOGIC; 
           data       : IN  STD_LOGIC_VECTOR(15 DOWNTO 0); 
           data_valid : IN  STD_LOGIC; 
           eoc        : IN  STD_LOGIC; 
           crc        : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); 
           crc_valid  : OUT STD_LOGIC 
       );
end crc_gen; 

ARCHITECTURE behave OF crc_gen IS 

 SIGNAL crc_r          : STD_LOGIC_VECTOR(7 DOWNTO 0);
 SIGNAL crc_c          : STD_LOGIC_VECTOR(7 DOWNTO 0);
 SIGNAL crc_i          : STD_LOGIC_VECTOR(7 DOWNTO 0);
 SIGNAL crc_const      : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000";

begin


crc_i    <= crc_const when soc = '1' else
            crc_r;

crc_c(0) <= data(0) XOR data(4) XOR data(5) XOR data(6) XOR data(13) XOR crc_i(5) XOR data(15) XOR crc_i(7) XOR data(10) XOR crc_i(2); 
crc_c(1) <= data(1) XOR data(5) XOR data(6) XOR data(7) XOR data(14) XOR crc_i(6) XOR data(11) XOR crc_i(3); 
crc_c(2) <= data(0) XOR data(2) XOR data(7) XOR data(8) XOR crc_i(0) XOR data(12) XOR crc_i(4) XOR data(4) XOR data(5) XOR data(13) XOR crc_i(5) XOR data(10) XOR crc_i(2); 
crc_c(3) <= data(0) XOR data(1) XOR data(3) XOR data(8) XOR data(9) XOR crc_i(1) XOR crc_i(0) XOR data(14) XOR crc_i(6) XOR data(11) XOR crc_i(3) XOR data(4) XOR data(15) XOR crc_i(7) XOR data(10) XOR crc_i(2); 
crc_c(4) <= data(0) XOR data(1) XOR data(2) XOR data(9) XOR crc_i(1) XOR data(12) XOR crc_i(4) XOR data(11) XOR crc_i(3) XOR data(6) XOR data(13) XOR crc_i(5); 
crc_c(5) <= data(1) XOR data(2) XOR data(3) XOR data(10) XOR crc_i(2) XOR data(13) XOR crc_i(5) XOR data(12) XOR crc_i(4) XOR data(7) XOR data(14) XOR crc_i(6); 
crc_c(6) <= data(2) XOR data(3) XOR data(4) XOR data(11) XOR crc_i(3) XOR data(14) XOR crc_i(6) XOR data(13) XOR crc_i(5) XOR data(8) XOR data(15) XOR crc_i(7) XOR crc_i(0); 
crc_c(7) <= data(3) XOR data(4) XOR data(5) XOR data(12) XOR crc_i(4) XOR data(15) XOR crc_i(7) XOR data(14) XOR crc_i(6) XOR data(9) XOR crc_i(1); 
crc_gen_process : PROCESS(clock, reset) 
BEGIN                                    
 IF(reset = '1') THEN  
    crc_r <= "00000000" ;
 ELSIF( clock 'EVENT AND clock = '1') THEN 
    IF(data_valid = '1') THEN 
         crc_r <= crc_c; 
    END IF; 
 END IF;    
END PROCESS crc_gen_process;      


crc_valid_gen : PROCESS(clock, reset) 
BEGIN                                    
 If(reset = '1') THEN 
     crc_valid <= '0'; 
 ELSIF( clock 'EVENT AND clock = '1') THEN 
    IF(data_valid = '1' AND eoc = '1') THEN 
        crc_valid <= '1'; 
    ELSE 
        crc_valid <= '0'; 
    END IF; 
 END IF;    
END PROCESS crc_valid_gen; 

crc <= crc_r;

END behave;
——########################################################################
--CRC引擎RTL设计
--版权所有(C)www.ElectronicDesignworks.com
--由ElectronicDesignworks IP生成器(CRC)生成的源代码。
--文档可从www.ElectronicDesignworks.com下载
-- ******************************** 
--许可证
-- ******************************** 
--此源文件可自由使用和分发,前提是
--版权声明、条件列表和以下免责声明
--未从文件中删除。
--任何衍生作品均应包含本版权声明和相关免责声明。
--此源代码文件按“原样”提供,不提供任何担保,
--甚至没有对产品的适销性或适用性的暗示保证
--特殊目的。
-- ********************************
--规格
-- ********************************
--文件名:CRC8_DATA16.vhd
--描述:CRC引擎实体
--时钟:正边缘
--复位:激活高电平
--第一连载:MSB
--数据总线宽度:16位
--多项式:(02348)
--日期:2015年6月16日
--版本:1.0
-- ########################################################################
图书馆IEEE;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_arith.all;
使用ieee.std_logic_unsigned.all;
实体crc_gen是
港口(
时钟:标准逻辑;
复位:在标准逻辑中;
soc:标准逻辑;
数据:标准逻辑向量(15到0);
数据有效:在标准逻辑中;
eoc:标准逻辑;
crc:输出标准逻辑向量(7到0);
crc\u有效:输出标准\u逻辑
);
结束crc_gen;
crc_gen的体系结构是
信号crc\u r:标准逻辑向量(7到0);
信号crc_c:STD_逻辑_向量(7到0);
信号crc_i:STD_逻辑_向量(7到0);
信号crc常数:标准逻辑向量(7到0):=“00000000”;
开始
crc_i有两种解决方案:

1。解决方案:
您可以对所有输入数据计算CRC,并在插入CRC的末尾附加零。接收器对所有数据(有效载荷+CRC)使用相同的算法计算CRC。如果所有数据正确,CRC为零

2。解决方案:
计算所有数据字上的CRC,并将其直接附加到数据流之后。接收器使用相同的技术,并将其CRC与传输的CRC进行比较。如果它们相等,则所有数据都正确传输。(见大卫的评论)

两种解决方案都可以使用种子值(CRC起始值)。双方必须平等


第二种解决方案速度更快,所需缓冲区更少。

通过传输端的CRC运行消息并传输CRC。在接收端,将消息通过相同的CRC,并将结果与接收到的CRC进行比较。关于第一种解决方案:我对接收到的消息使用相同的算法+CRC。结果值不是零!关于第二个解决方案:我已经实现了这个解决方案。但是,如果在传输过程中CRC本身损坏,但消息保持不变,该怎么办。即使消息保持不变,结果仍将显示CRC不匹配。这就是我在使用此解决方案时的想法。如果我能得到预期的第一个解决方案结果,那就太好了。关于解决方案1:结果是否为零取决于您的CRC/LFSR实现。有32种可能实现“CRC”。我不确定是否所有变量在使用CRC后都具有零的数学特性。有关CRC的更多详细信息,请查看。CRC总是检查数据和CRC值是否有错误,因为CRC是输入数据流的一部分(TX:zero,RX:CRC值)。这里的CRC实现是并行的。因此,它将在一个时钟周期内发生。LFSR将占用更多的时钟周期。Wikipedia(这不是一篇经过验证的文章,但是)说它可以作为解决方案1实现,而不需要使用CRC进行计算,但我不知道为什么它不适用于带有CRC的消息!您的实现不是完全并行的,只是单词parallel:)。通常会展开字中每一位的按位CRC计算,并在每个时钟周期计算一个值。我们的PoC库有一个可变CRC模块,可以配置每个多项式和字大小。也许这段代码是你的参考。它是基于LFSR的。