CRC发生器(发送器)和校验器(接收器)-并行实现VHDL
我已经从下面的网站生成了用于并行实现的CRC生成器VHDL代码 多项式为100011101(0x1D),数据宽度为16位 代码如下: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 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的。