首页 > 其他分享 >【CRC校验方法】+【FPGA实现(发送端)】

【CRC校验方法】+【FPGA实现(发送端)】

时间:2024-04-09 21:22:29浏览次数:12  
标签:wire FPGA h55 crc 校验 CRC parameter reg hFF

书接上回:

https://www.cnblogs.com/VerweileDoch/p/18105959

发送端的逻辑和接收端类似,但是需要进行八位内的逆运算和取反:

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            r1_crc_value <= 32'h0;
        end else if(crc_cycle == 1'b1 && crc_cnt == 'd3) begin
            r1_crc_value <= 32'h0;
        end else if(i_vaild == 1'b0 && r1_i_vaild == 1'b1) begin
            r1_crc_value <= crc_value;
        end
    end

    reg [7:0] inver_i;
    always @(*) begin
        for (inver_i = 0;inver_i < 8;inver_i = inver_i + 1'b1 ) begin
            r2_crc_value[31 - inver_i] <= r1_crc_value[24 + inver_i];
            r2_crc_value[23 - inver_i] <= r1_crc_value[16 + inver_i];
            r2_crc_value[15 - inver_i] <= r1_crc_value[08 + inver_i];
            r2_crc_value[07 - inver_i] <= r1_crc_value[0  + inver_i];
        end
    end 

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            r_o_data <= 8'hff;
        end else if(r1_i_vaild == 1'b1 && crc_cycle == 1'b0) begin
            r_o_data <= r1_i_data;
        end else if(crc_cycle == 1'b1) begin
            r_o_data <= ~(r2_crc_value[(31-(crc_cnt << 3))-:8]);
        end else begin
            r_o_data <= 8'hff;
        end
    end

完整代码:

module CRC_buffer #(
    parameter   UDP_CODE             =  8'h11                                           ,
    parameter   TX_TARGET_PORT       = 16'd808                                          ,
    parameter   TX_SOURCE_PORT       = 16'd8080                                         ,
    parameter   RX_Sync_Frame        = 32'hF05AA50F                                     ,
    parameter   TX_SOURCE_Addr       = {8'd192,8'd168,8'd0,8'd1}                        ,
    parameter   TX_TARGET_Addr       = {8'hFF,8'hFF,8'hFF,8'hFF}                        ,
    //Length
    parameter   TX_PREAMBLE          = {8'h55,8'h55,8'h55,8'h55,8'h55,8'h55,8'h55,8'hD5},
    parameter   TX_TARGET_MAC        = {8'hFF,8'hFF,8'hFF,8'hFF,8'hFF,8'hFF}            ,// broadcast packet
    parameter   TX_SOURECE_MAC       = {8'hA8,8'hB2,8'h3C,8'h7D,8'h97,8'hD7}            , 
    parameter   Length_HeartBeat     = 16'd92                                           ,
    parameter   Length_UDP           = 16'd72                                           ,
    parameter   Length_HeartBeat_all = 8'd114                                           ,
    parameter   Length_EnCODE_Packet = 8'd114 
)(
    input   wire            sys_clk            ,
    input   wire            sys_rst_n          ,
    input   wire            i_vaild            ,
    input   wire  [7:0]     i_data             ,
    output  wire            o_vaild            ,
    output  wire  [7:0]     o_data                   
);
            wire  [31:00]   crc_value          ;
             reg  [31:00]   r1_crc_value       ;
             reg  [31:00]   r2_crc_value       ;

            reg             r1_i_vaild         ;  
            reg             r2_i_vaild         ;
            reg   [7:0]     r1_i_data          ;              
            reg   [15:00]   i_vaild_cnt        ;

            reg             crc_cycle          ;
            reg             r_crc_cycle        ;
            reg   [03:00]   crc_cnt            ;

            reg   [07:00]   r_o_data           ;

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            i_vaild_cnt <= 16'd0;
        end else if(i_vaild == 1'b1) begin
            if(i_vaild_cnt == Length_EnCODE_Packet - 1'b1) begin
                i_vaild_cnt <= 16'd0;
            end else begin
                i_vaild_cnt <= i_vaild_cnt + 1'b1;
            end
        end
    end

    always @(posedge sys_clk) begin
        r1_i_vaild  <= i_vaild;  
        r2_i_vaild  <= r1_i_vaild;
        r1_i_data   <= i_data ; 
        r_crc_cycle <=  crc_cycle;
    end

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            r1_crc_value <= 32'h0;
        end else if(crc_cycle == 1'b1 && crc_cnt == 'd3) begin
            r1_crc_value <= 32'h0;
        end else if(i_vaild == 1'b0 && r1_i_vaild == 1'b1) begin
            r1_crc_value <= crc_value;
        end
    end

    reg [7:0] inver_i;
    always @(*) begin
        for (inver_i = 0;inver_i < 8;inver_i = inver_i + 1'b1 ) begin
            r2_crc_value[31 - inver_i] <= r1_crc_value[24 + inver_i];
            r2_crc_value[23 - inver_i] <= r1_crc_value[16 + inver_i];
            r2_crc_value[15 - inver_i] <= r1_crc_value[08 + inver_i];
            r2_crc_value[07 - inver_i] <= r1_crc_value[0  + inver_i];
        end
    end 

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            crc_cycle <= 1'b0;
        end else if(crc_cycle == 1'b1 && crc_cnt == 'd3) begin
            crc_cycle <= 1'b0;
        end else if(i_vaild == 1'b0 && r1_i_vaild == 1'b1) begin
            crc_cycle <= 1'b1;
        end else begin
            crc_cycle <= crc_cycle;
        end
    end

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            crc_cnt <= 4'h0;
        end else if(crc_cycle == 1'b1) begin
            if(crc_cnt== 'd3) begin
                crc_cnt <= 4'h0;
            end else begin
                crc_cnt <= crc_cnt + 1'b1;
            end
        end else begin
            crc_cnt <= 4'h0;
        end
    end 

    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            r_o_data <= 8'hff;
        end else if(r1_i_vaild == 1'b1 && crc_cycle == 1'b0) begin
            r_o_data <= r1_i_data;
        end else if(crc_cycle == 1'b1) begin
            r_o_data <= ~(r2_crc_value[(31-(crc_cnt << 3))-:8]);
        end else begin
            r_o_data <= 8'hff;
        end
    end

    assign  o_vaild = (r2_i_vaild)||(r_crc_cycle);
    assign  o_data = r_o_data;

CRC32_D8_Out  CRC32_D8_Out_inst0 (
    .i_clk                   ( sys_clk       ),
    .i_rst_n                 ( sys_rst_n     ),
    .i_data                  ( i_data        ),
    .i_vaild                 ( i_vaild       ),

    .o_crc_error             (               ),
    .o_crc_end               (               ),
    .o_crc_value             ( crc_value     )
);
    reg [07:00] test_cnt;
    always @(posedge sys_clk) begin
        if(sys_rst_n == 1'b0) begin
            test_cnt <= 8'd0;
        end else if(o_vaild == 1'b1) begin
            test_cnt <= test_cnt + 1'b1;
        end else begin
            test_cnt <= 8'd0;
        end
    end 
endmodule

 

标签:wire,FPGA,h55,crc,校验,CRC,parameter,reg,hFF
From: https://www.cnblogs.com/VerweileDoch/p/18124855

相关文章

  • java-validation(数据校验)
    @PostMapping("/register")@SystemLog(BusinessName="注册用户")//启动AOP实现日志记录publicResponseResultregister(@Validated(ValidateType.INSERT.class)@RequestBodyTsUsertsUser){returntsUserService.register(tsUser);......
  • FPGA入门笔记012——嵌入式块RAM应用之ROM
    1、实验现象​ 实现一组固定的数据(三角波形表)存储在FPGA中使用IP核构建的片上ROM中,开发板上电后,系统开始从ROM中读出数据,并将数据直接通过并口输出。通过使用SignalTapII软件实时抓取并口上的数据,显示得到三角波形。然后使用Quartus软件中提供的In-SystemMemor......
  • 【IP层的校验和与UDP的校验和】+【FPGA实现】
    MAC层的校验是CRC,而IP层也有其校验机制。CRC保证数据包的传输正确; IP头校验和IP头校验和是一种错误检测机制,用于在互联网协议(IP)中保证IP头的数据完整性。当一个IP数据包从源主机发送到目的主机时,它经过许多路由器和交换机,校验和可以帮助这些中间设备检查数据包......
  • CRC报错查看
    前言查看交换机接口是否有CRC报错,本案例以华三交换机为例。CRC是指循环冗余校验错使用仪器测试链路。链路质量差或者线路光信号衰减过大会导致报文在传输过程中出错。如链路故障请更换网线或光纤。与别的正常的端口更换网线或光纤光模块,如端口更换后错包消失,端口更换回来错......
  • openGauss 用户口令强度校验机制
    用户口令强度校验机制可获得性本特性自openGauss1.1.0版本开始引入。特性简介对用户访问数据库所设置的口令强度进行校验。客户价值用户无法设置过低强度的口令,加固客户数据安全。特性描述初始化数据库、创建用户、修改用户时需要指定密码。密码必须满足强度校验,否则会提......
  • 校验ChatGPT 4真实性的三个经典问题:提供免费测试网站快速区分 GPT3.5 与 GPT4
    现在已经有很多ChatGPT的套壳网站,以下分享验明GPT-4真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是GPT-3.5还是GPT-4。大家可以在这个网站测试:https://ai.hxkj.vip,免登录可以问三条,登录之后无限制。咱们使用免登录的额度测试就已经够用了测试问题1:Wha......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • 基于FPGA的数据采集、编码、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RT
    介绍一个小项目,加强对FPGA相关接口的整体把握。硬件及软件代码梳理:硬件系统的主要功能框图,其中FPGA作为处理单元,实现了包括电流和电压的采集、千兆以太网通讯、SD卡本地数据存储和串口通讯等。已经过板级测试,测试包含:千兆网通讯收发测试、AD采集的数据验证、SD卡存储验证......
  • 【FPGA基础】Latch基础
    “本文主要转载自https://zhuanlan.zhihu.com/p/93133247,高屋建瓴。其中关于如何会产生latch的部分,转载自https://zhuanlan.zhihu.com/p/34408492?from_voters_page=true。”在FPGA的设计中,避免使用锁存器是几乎所有FPGA工程师的共识,Xilinx和Altera也在手册中提示大家要慎用......
  • 数据校验--校验生产辅材是否维护正确
    fromUSSyunwei.binimport*fromtqdmimporttqdmimportdecimalerror_list=set()#查询十分到家分账金额大于费用项金额的一半sql="select*fromuss_payunit.tcl_special_pardon_chargewhereshow_scene_type=1"#uat_DB=DB(sql=sql,DB={'ip':"10.74.149.251&quo......