打印

哪位大哥用verilog写过CRC16校验程序?

[复制链接]
7086|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小弟菜鸟,在这里求助大神们指点下。CRC16的基本原理我了解大概,但一到我写程序就困惑了。
我是用串口传输8字节数据,要生成一个两字节CRC16,串口一位一位传进来,8位一组,我是等数据全部传进来再生成一个CRC16还是进来8位处理数据一次?但我这款FPGA好像只能处理32位数据。还有,for是不可综合语句,要实现移位条件异或怎么实现呀?用计数器好像很麻烦啊。最后,网上有串行和并行方法,让我这新手更迷糊了。有谁写过CRC16的程序,能不能帮我指点迷津下,要是能共享下你下的CRC16程序那就更好啦,小弟在此先谢过啦

相关帖子

沙发
resxpl| | 2013-2-22 20:49 | 只看该作者
描述一个CRC算法需要讲清楚细节. 否则程序给你也是用不了的.
比如说:
生成多项式是多少?
比特顺序(MSB先传还是LSB先传)
前后是否有取反要求?
每次处理多少bit?

使用特权

评论回复
板凳
tzj123456tjz|  楼主 | 2013-2-23 10:33 | 只看该作者
我可以参考下你的程序吗?我这要求的是实现这样功能,用什么方法实现自由发挥。

使用特权

评论回复
地板
tzj123456tjz|  楼主 | 2013-2-23 13:42 | 只看该作者
我补充一下吧可以这样:生成多项式:G(x)=x16+x12+x5+1;比特顺序:MSB先传;前后没有取反要求;每次处理8bit

使用特权

评论回复
5
resxpl| | 2013-2-24 00:29 | 只看该作者

module crc1(data, crcin, crcout);
        input [7:0] data;
        input [15:0] crcin;
        output [15:0] crcout;
        reg [15:0] crcout;
       
        // CRC-16, polynomial = 0x11021, transmit msb first, 8 bits per group
        task get_crc;
                output [15:0] crcout;
                input [7:0] data;
                input [15:0] crc;
                reg [15:0] crcout;
        begin
                crcout[0] = crc[12] ^ crc[8] ^ data[4] ^ data[0];
                crcout[1] = crc[13] ^ crc[9] ^ data[5] ^ data[1];
                crcout[2] = crc[14] ^ crc[10] ^ data[6] ^ data[2];
                crcout[3] = crc[15] ^ crc[11] ^ data[7] ^ data[3];
                crcout[4] = crc[12] ^ data[4];
                crcout[5] = crc[13] ^ crc[12] ^ crc[8] ^ data[5] ^ data[4] ^ data[0];
                crcout[6] = crc[14] ^ crc[13] ^ crc[9] ^ data[6] ^ data[5] ^ data[1];
                crcout[7] = crc[15] ^ crc[14] ^ crc[10] ^ data[7] ^ data[6] ^ data[2];
                crcout[8] = crc[15] ^ crc[11] ^ crc[0] ^ data[7] ^ data[3];
                crcout[9] = crc[12] ^ crc[1] ^ data[4];
                crcout[10] = crc[13] ^ crc[2] ^ data[5];
                crcout[11] = crc[14] ^ crc[3] ^ data[6];
                crcout[12] = crc[15] ^ crc[12] ^ crc[8] ^ crc[4] ^ data[7] ^ data[4] ^ data[0];
                crcout[13] = crc[13] ^ crc[9] ^ crc[5] ^ data[5] ^ data[1];
                crcout[14] = crc[14] ^ crc[10] ^ crc[6] ^ data[6] ^ data[2];
                crcout[15] = crc[15] ^ crc[11] ^ crc[7] ^ data[7] ^ data[3];
        end
        endtask
       
        always @(data, crcin)
                get_crc(crcout, data, crcin);
               
endmodule

使用特权

评论回复
6
resxpl| | 2013-2-24 00:30 | 只看该作者
使用方法:

`timescale 1ns / 1ps

module crc1_tb1;

        // Inputs
        reg clk;
        reg [7:0] data;
        reg [15:0] crc;
       
        wire [15:0] crcout;

        // Instantiate the Unit Under Test (UUT)
        crc1 uut (
                .data(data),
                .crcin(crc),
                .crcout(crcout)
        );

        initial begin
                // Initialize Inputs
                clk = 0;
                data = 8'hFF;
                crc = 16'h0000;

        end
       
        always
        begin
                #50 clk = 0;
                #50 clk = 1;
        end
       
        always @(posedge clk)
                crc = crcout;
   
endmodule

使用特权

评论回复
7
resxpl| | 2013-2-24 00:39 | 只看该作者
仿真波形( crc1_tb1):

使用特权

评论回复
8
tzj123456tjz|  楼主 | 2013-2-25 18:54 | 只看该作者
谢谢你!

使用特权

评论回复
9
tzj123456tjz|  楼主 | 2013-2-25 19:28 | 只看该作者
我还有一个问题,你这个并行CRC算法为什么和我这个表不同啊?

4R$O7647X$G09}C8AZGD{@3.jpg (42.83 KB )

4R$O7647X$G09}C8AZGD{@3.jpg

使用特权

评论回复
10
resxpl| | 2013-2-25 20:17 | 只看该作者
应该是一样的, 编号有点差别.

使用特权

评论回复
11
guohao2243856| | 2013-10-16 10:05 | 只看该作者
请问一下,为什么用quartus自带的仿真功能去仿真,结果怎么和modelsim仿真结果不一样?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝