|  | 
 
 发表于 2012-10-27 15:36:52
|
显示全部楼层 
| 回复 9# zhangguo1286 
 
 module crc(
 input [3:0] data_in,
 input crc_en,
 output [4:0] crc_out,
 input rst,
 input clk);
 reg [4:0] lfsr_q,lfsr_c;
 assign crc_out = lfsr_q;
 always @(*) begin
 lfsr_c[0] = lfsr_q[1] ^ lfsr_q[4] ^ data_in[0] ^ data_in[3];
 lfsr_c[1] = lfsr_q[2] ^ data_in[1];
 lfsr_c[2] = lfsr_q[1] ^ lfsr_q[3] ^ lfsr_q[4] ^ data_in[0] ^ data_in[2] ^ data_in[3];
 lfsr_c[3] = lfsr_q[2] ^ lfsr_q[4] ^ data_in[1] ^ data_in[3];
 lfsr_c[4] = lfsr_q[0] ^ lfsr_q[3] ^ data_in[2];
 end // always
 always @(posedge clk, negedge rst) begin
 if(~rst) begin
 lfsr_q <= {5{1'b1}};
 end
 else begin
 lfsr_q <= crc_en ? lfsr_c : lfsr_q;
 end
 end // always
 endmodule // crc
 
 CRC module for data[3:0] ,   crc[4:0]=1+x^2+x^5;
 
 这是我在一个网站上生成的模块,我给他输入固定的值a,我通过计算应该输出的crc的值是07,但是他的输出却是很多数,只是07也在这些树当中,这个crc_en是什么控制的,不知道是不是这样。如果用这个模块
 --------------------------------------------------------------------------------
 -- Copyright (C) 1999-2008 Easics NV.
 -- This source file may be used and distributed without restriction
 -- provided that this copyright statement is not removed from the file
 -- and that any derivative work contains the original copyright notice
 -- and the associated disclaimer.
 --
 -- THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
 -- OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 --
 -- Purpose : synthesizable CRC function
 --   * polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
 --   * data width: 8
 --
 -- Info : tools@easics.be
 --        http://www.easics.com
 --------------------------------------------------------------------------------
 library ieee;
 use ieee.std_logic_1164.all;
 package PCK_CRC32_D8 is
 -- polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
 -- data width: 8
 -- convention: the first serial bit is D[7]
 function nextCRC32_D8
 (Data: std_logic_vector(7 downto 0);
 crc:  std_logic_vector(31 downto 0))
 return std_logic_vector;
 end PCK_CRC32_D8;
 
 package body PCK_CRC32_D8 is
 -- polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
 -- data width: 8
 -- convention: the first serial bit is D[7]
 function nextCRC32_D8
 (Data: std_logic_vector(7 downto 0);
 crc:  std_logic_vector(31 downto 0))
 return std_logic_vector is
 variable d:      std_logic_vector(7 downto 0);
 variable c:      std_logic_vector(31 downto 0);
 variable newcrc: std_logic_vector(31 downto 0);
 begin
 d := Data;
 c := crc;
 newcrc(0) := d(6) xor d(0) xor c(24) xor c(30);
 newcrc(1) := d(7) xor d(6) xor d(1) xor d(0) xor c(24) xor c(25) xor c(30) xor c(31);
 newcrc(2) := d(7) xor d(6) xor d(2) xor d(1) xor d(0) xor c(24) xor c(25) xor c(26) xor c(30) xor c(31);
 newcrc(3) := d(7) xor d(3) xor d(2) xor d(1) xor c(25) xor c(26) xor c(27) xor c(31);
 newcrc(4) := d(6) xor d(4) xor d(3) xor d(2) xor d(0) xor c(24) xor c(26) xor c(27) xor c(28) xor c(30);
 newcrc(5) := d(7) xor d(6) xor d(5) xor d(4) xor d(3) xor d(1) xor d(0) xor c(24) xor c(25) xor c(27) xor c(28) xor c(29) xor c(30) xor c(31);
 newcrc(6) := d(7) xor d(6) xor d(5) xor d(4) xor d(2) xor d(1) xor c(25) xor c(26) xor c(28) xor c(29) xor c(30) xor c(31);
 newcrc(7) := d(7) xor d(5) xor d(3) xor d(2) xor d(0) xor c(24) xor c(26) xor c(27) xor c(29) xor c(31);
 newcrc(8) := d(4) xor d(3) xor d(1) xor d(0) xor c(0) xor c(24) xor c(25) xor c(27) xor c(28);
 newcrc(9) := d(5) xor d(4) xor d(2) xor d(1) xor c(1) xor c(25) xor c(26) xor c(28) xor c(29);
 newcrc(10) := d(5) xor d(3) xor d(2) xor d(0) xor c(2) xor c(24) xor c(26) xor c(27) xor c(29);
 newcrc(11) := d(4) xor d(3) xor d(1) xor d(0) xor c(3) xor c(24) xor c(25) xor c(27) xor c(28);
 newcrc(12) := d(6) xor d(5) xor d(4) xor d(2) xor d(1) xor d(0) xor c(4) xor c(24) xor c(25) xor c(26) xor c(28) xor c(29) xor c(30);
 newcrc(13) := d(7) xor d(6) xor d(5) xor d(3) xor d(2) xor d(1) xor c(5) xor c(25) xor c(26) xor c(27) xor c(29) xor c(30) xor c(31);
 newcrc(14) := d(7) xor d(6) xor d(4) xor d(3) xor d(2) xor c(6) xor c(26) xor c(27) xor c(28) xor c(30) xor c(31);
 newcrc(15) := d(7) xor d(5) xor d(4) xor d(3) xor c(7) xor c(27) xor c(28) xor c(29) xor c(31);
 newcrc(16) := d(5) xor d(4) xor d(0) xor c(8) xor c(24) xor c(28) xor c(29);
 newcrc(17) := d(6) xor d(5) xor d(1) xor c(9) xor c(25) xor c(29) xor c(30);
 newcrc(18) := d(7) xor d(6) xor d(2) xor c(10) xor c(26) xor c(30) xor c(31);
 newcrc(19) := d(7) xor d(3) xor c(11) xor c(27) xor c(31);
 newcrc(20) := d(4) xor c(12) xor c(28);
 newcrc(21) := d(5) xor c(13) xor c(29);
 newcrc(22) := d(0) xor c(14) xor c(24);
 newcrc(23) := d(6) xor d(1) xor d(0) xor c(15) xor c(24) xor c(25) xor c(30);
 newcrc(24) := d(7) xor d(2) xor d(1) xor c(16) xor c(25) xor c(26) xor c(31);
 newcrc(25) := d(3) xor d(2) xor c(17) xor c(26) xor c(27);
 newcrc(26) := d(6) xor d(4) xor d(3) xor d(0) xor c(18) xor c(24) xor c(27) xor c(28) xor c(30);
 newcrc(27) := d(7) xor d(5) xor d(4) xor d(1) xor c(19) xor c(25) xor c(28) xor c(29) xor c(31);
 newcrc(28) := d(6) xor d(5) xor d(2) xor c(20) xor c(26) xor c(29) xor c(30);
 newcrc(29) := d(7) xor d(6) xor d(3) xor c(21) xor c(27) xor c(30) xor c(31);
 newcrc(30) := d(7) xor d(4) xor c(22) xor c(28) xor c(31);
 newcrc(31) := d(5) xor c(23) xor c(29);
 return newcrc;
 end nextCRC32_D8;
 end PCK_CRC32_D8;
 也是输人固定的的数,我不知道crc的输入是多少,同时输出的crc又是有很多数,按理说一个数据输入应该的到的是同一个crc的值啊,谢谢您的详细解说
 | 
 |