⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc_rx.v

📁 本设计为CRC5接收效验模块。本设计模块用来接收数据的CRC效验。本模块共需要5个时钟周期来完成:
💻 V
字号:
//-------------本设计为CRC5接收效验模块
//---本设计模块用来接收数据的CRC效验。
//---本模块共需要5个时钟周期来完成:
//---第一个周期:模块初始化;
//---第2周期: 上升沿接收数据,调用函数CRC5处理前16bit
//---第3周期: 上升沿接收数据,调用函数CRC5_S处理第17bit;并接收来之数据流的CRC,用于与计算的CRC比较
//---第4个周期,输出比较结果,若接收来之数据流的CRC,等于计算的CRC,则Rx_over=1;否则Rx_over=0;
//---第5个周期,输出Rx_over=0,以便模块调用时接口的处理;



module CRC_Rx(clk,rset,data,Rx_over);
  input clk,rset;        //输入时钟、使能端
  input[15:0] data;       
  output Rx_over;    //CRC效验的握手信号,高电平有效,表示接受数据正确        
  reg Rx_over; 


  reg[2:0] i;            //完成整个数据的CRC运算的计数
  reg[4:0] crc_reg;      //用来存储CRC临时计算结果
  reg[4:0] crc_data;     //用来存储接收的CRC效验码,与计算出来的CRC进行比较!

  
always @(posedge clk)
  begin
    if(rset)    //初始化
      begin
        crc_reg<=5'b01001;    //按6C标准,预置01001 
        i<=3'b0;
        Rx_over<=1'b0;       
      end
    else if(i==0)        //调用函数CRC5处理前16bit,一个时钟完成
           begin
             crc_reg<=CRC5(data,crc_reg);   
             i<=i+1;
             Rx_over<=1'b0;               
           end
         else if(i==1)        //调用函数CRC5_S处理第17bit,一个时钟完成
                begin         
                  crc_reg<=CRC5_S(data[15],crc_reg);
                  crc_data<={data[14],data[13],data[12],data[11],data[10]};   //接收来之数据流的CRC,用于与计算的CRC比较
                  i<=i+1;
                  Rx_over<=1'b0; 
                end
              else if(i==2)    //输出比较结果
                     begin
                       i<=i+1;
                       if(crc_reg==crc_data)
                         Rx_over<=1'b1;
                       else  
                         Rx_over<=1'b0;
                     end
                   else if(i==3)
                          begin
                          Rx_over<=1'b0;
                          end
  end
///函数CRC5是对输入数据为整字的处理,在一个时钟内,调用一次,可以完成并行输入16bit的CRC处理。
function [4:0] CRC5;
  input[15:0] D;      //输入待处理的数据
  input[4:0] R;      //寄存器
  reg[4:0] R_temp;   //
  begin
    R_temp[0]=R[4]^R[3]^R[2]^D[15]^D[14]^D[13]^D[9]^D[8]^D[6]^D[5]^D[4]^D[2]^D[0];
    R_temp[1]=R[4]^R[3]^D[15]^D[14]^D[10]^D[9]^D[7]^D[6]^D[5]^D[3]^D[1];
    R_temp[2]=R[4]^R[0]^D[15]^D[11]^D[10]^D[8]^D[7]^D[6]^D[4]^D[2];
    R_temp[3]=R[4]^R[3]^R[2]^R[1]^R[0]^D[15]^D[14]^D[13]^D[12]^D[11]^D[7]^D[6]^D[4]^D[3]^D[2]^D[0];
    R_temp[4]=R[4]^R[3]^R[2]^R[1]^D[15]^D[14]^D[13]^D[12]^D[8]^D[7]^D[5]^D[4]^D[3]^D[1];
    CRC5=R_temp;
  end  
endfunction    


///函数CRC5_S是对输入数据为bit的处理,在一个时钟内,调用一次,可以完成串行输入1bit的CRC处理。
function [4:0] CRC5_S;
  input din;   //串行输入数据流(从MsB开始)
  input [4:0] crc5_reg;

  reg crc_r2,crc_r4;

  begin
    crc_r2=crc5_reg[2];
    crc5_reg[2:1]=crc5_reg[1:0];
    crc_r4=crc5_reg[4];
    crc5_reg[4]=crc5_reg[3];
    crc5_reg[0]=crc_r4^din;
    crc5_reg[3]=crc_r4^din^crc_r2;
    CRC5_S=crc5_reg;
  end
endfunction

endmodule  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -