CRC Generator(sender) and Checker(receiver) - 并行实现 VHDL
CRC Generator(sender) and Checker(receiver) - parallel implementation VHDL
我已经从以下网站生成了用于并行实现的 CRC 生成器 VHDL 代码 Sigmatone。
多项式为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 的消息将被传输。
但是,在接收端我收到了数据+CRC 消息,我需要通过 CRC 检测技术来检索消息。在发送方端,CRC 由带有附加零的消息生成以供计算。如果我再次找到消息,接收端会发生什么?
我是否应该使用相同的算法,但这次不是附加零,而是附加收到的 CRC?还是接收端算法变了?
(我用的是并行CRC计算)
有2种解决方案:
1.解法:
您可以计算所有输入数据的 CRC,并在将插入 CRC 的末尾附加零。接收器使用相同的算法对所有数据(有效载荷 + crc)计算 CRC。如果所有数据都正确,则 CRC 为零。
2。解法:
您计算所有数据字的 CRC 并将其直接附加在数据流之后。接收方使用相同的技术并将其 CRC 与发送的进行比较。如果它们相等,则所有数据都已正确传输。 (见大卫的评论)。
两种解决方案都可以使用种子值(CRC 起始值)。两边必须相等。
第二种解决方案速度更快,需要的缓冲区更少。
我已经从以下网站生成了用于并行实现的 CRC 生成器 VHDL 代码 Sigmatone。
多项式为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 的消息将被传输。
但是,在接收端我收到了数据+CRC 消息,我需要通过 CRC 检测技术来检索消息。在发送方端,CRC 由带有附加零的消息生成以供计算。如果我再次找到消息,接收端会发生什么?
我是否应该使用相同的算法,但这次不是附加零,而是附加收到的 CRC?还是接收端算法变了?
(我用的是并行CRC计算)
有2种解决方案:
1.解法:
您可以计算所有输入数据的 CRC,并在将插入 CRC 的末尾附加零。接收器使用相同的算法对所有数据(有效载荷 + crc)计算 CRC。如果所有数据都正确,则 CRC 为零。
2。解法:
您计算所有数据字的 CRC 并将其直接附加在数据流之后。接收方使用相同的技术并将其 CRC 与发送的进行比较。如果它们相等,则所有数据都已正确传输。 (见大卫的评论)。
两种解决方案都可以使用种子值(CRC 起始值)。两边必须相等。
第二种解决方案速度更快,需要的缓冲区更少。