📄 crcreg.vhd
字号:
-------------------------------------------------------------------------------
-- Title : Parameterisable CRC Shift Register
-- Project :
-------------------------------------------------------------------------------
-- File : crcreg.vhd
-- Author : Davy Huang <Dai.Huang@Xilinx.com>
-- Company : Xilinx Inc
-- Created : 2001/02/06
-- Last update: 2001-04-18
-- Copyright : (c) Xilinx Inc 1999, 2000
-------------------------------------------------------------------------------
-- Description: A parameterisable shift register to caculate crc
-- Suppose the data width is w, this CRCSR can handle
-- any CRC caculation based on following polynomia
-- Polynomial = X^(w) + X^(f1) + X^(f2) + 1
-- where f1 and f2 are two feedbacks.
-- For example: Polynomial = x^8 + x^5 + x^4 + 1, which is
-- used for Dallas One-wire Serial Number device
-- Please refer to iButton standard at:
-- http://www.ibutton.com/ibuttons/standard.pdf
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2001/02/06 1.0 davy Created
-- 2001/02/14 1.1 davy Change to asyn. reset
-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CRCReg is
generic (width : natural := 8; -- register width
feedback1 : natural := 4;
feedback2 : natural := 5);
port (reset : in std_logic; -- asynchronous reset
clk : in std_logic; -- input clock
en : in std_logic; -- enable
d : in std_logic; -- data input (one bit)
q : out std_logic_vector( (width - 1) downto 0)); -- output (crc value)
end CRCReg;
architecture arch1 of CRCReg is
signal qt : std_logic_vector( (width - 1) downto 0);
signal feedback : std_logic;
begin
q <= qt;
feedback <= qt(0) xor d;
rArray : for i in 0 to width - 1 generate
-- caculate msb
msb : if i = (width -1) generate
msbff : process (clk, reset)
begin
if reset = '1' then
qt(i) <= '0';
elsif clk'event and clk = '1' then
if en = '1' then
qt(i) <= feedback;
end if;
end if;
end process msbff;
end generate msb;
-- caculate two feedback paths
feedbackb : if (i = (width - feedback1 -1 )) or (i = (width - feedback2 -1)) generate
feedbackf : process (clk, reset)
begin
if reset = '1' then
qt(i) <= '0';
elsif clk'event and clk = '1' then
if en = '1' then
qt(i) <= qt(i + 1) xor feedback;
end if;
end if;
end process feedbackf;
end generate feedbackb;
-- caculate other bits
othersb : if (i /= (width -1)) and (i /= (width - feedback1 -1 )) and (i /= (width - feedback2 -1)) generate
othersff : process (clk, reset)
begin
if reset = '1' then
qt(i) <= '0';
elsif clk'event and clk = '1' then
if en = '1' then
qt(i) <= qt(i+1);
end if;
end if;
end process othersff;
end generate othersb;
end generate rArray;
end arch1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -