fpga_feixiang 发表于 2021-10-14 20:16:53

crc3

`timescale 1ns/1ns
module crc3;
reg clk,rst_n;

initial begin
clk=0;
rst_n=0;
#53 rst_n=1;
end
always #2 clk=~clk;


reg data_fm;
reg cnt;
always @(posedge clk or negedge rst_n)
           if(~rst_n)
                        cnt<=8'd0;
           else
                        cnt<=cnt+1'b1;


always @(posedge clk or negedge rst_n)
           if(~rst_n)
                        data_fm<={$random}%256;
           else if(cnt==8'hFF)
                        data_fm<={$random}%256;
                       




reg data;
reg en_crc;

always @(posedge clk or negedge rst_n)
           if(~rst_n)begin
                        en_crc<=1'b0;
                        data<=1'b0;end
           else case(cnt)
                        8'd2 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd3 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd4 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd5 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd6 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd7 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd8 :begin en_crc<=1'b1;data<=data_fm;end
                        8'd9 :begin en_crc<=1'b1;data<=data_fm;end
                        default:en_crc<=1'b0;
                endcase
               



wire crc_tb;

reg num_tb;       
always @(posedge clk or negedge rst_n)
           if(~rst_n)
                        num_tb<=8'd0;
           else if(cnt==8'hFF)
                        num_tb<=num_tb+1'b1;
integer fid;
initial fid=$fopen("CRC_DATA.DAT");
always @(posedge clk)
           if(cnt==8'd11)
                        $fdisplay(fid,"SDATA=%0h \tDb=%0b \tDh=%0h \tDd=%0d",data_fm ,crc_tb,crc_tb,crc_tb);

always @(posedge clk)
           if(num_tb>8'd99) begin
                $fclose(fid);
                $stop;
          
           end
               
//**************CRC计算*****************************************************
parameter CRC_INIT=3'b101;
reg crc_current;
wire crc_next;//G(X)=1101
assign crc_tb=crc_current;
always @(posedge clk or negedge rst_n)
           if(~rst_n)
                        crc_current<=CRC_INIT;
           else if(en_crc)
                        crc_current<=crc_next;
           else
                        crc_current<=CRC_INIT;

wire   feedback;
assign feedback=data^crc_current;
assign crc_next=(feedback*1'b1)^1'b0;
assign crc_next=(feedback*1'b0)^crc_current;
assign crc_next=(feedback*1'b1)^crc_current;
endmodule
页: [1]
查看完整版本: crc3