FPGAer:CRC校驗的FPGA實現


模2加法運算:1+1=0、0+1=1、0+0=0。模2減法運算:1-1=0、0-1=1、1-0=1、0-0=0。 

舉個例子:

ff ff 00 00(16)的生成多項式:

檢驗電路:

RTL代碼:

module shizhan(
input sys_clk,
input sys_rst_n,
input data,
input data_valid,
input crc_start,
output reg [7:0]crc_out,
output reg [5:0]num,
output reg crc_valid
);
reg [7:0]crc;
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
crc<=8'b0;
else if(crc_start)
crc<=8'b0;
else if(data_valid)begin
crc[0]<=crc[7]^data;
crc[1]<=crc[0]^crc[7]^data;
crc[2]<=crc[1]^crc[7]^data;
crc[3]<=crc[2];
crc[4]<=crc[3];
crc[5]<=crc[4];
crc[6]<=crc[5];
crc[7]<=crc[6];
end
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
num<=6'b0;
else if(crc_start)
num<=6'b0;
else if(num==6'd32)
num<=6'b0;
else if(data_valid)
num<=num+1'b1;
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)begin
crc_valid<=1'b0;
crc_out<=1'b0;
end
else if(num==32)begin
crc_valid<=1'b1;
crc_out<=crc;
end
endmodule

仿真代碼:

`timescale 1ns/1ns
module shizhan_tb;
reg sys_clk;
reg sys_rst_n;
reg data;
reg data_valid;
reg crc_start;
wire [7:0]crc_out;
wire [5:0]num;
wire crc_valid;
shizhan u_shizhan(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.data (data),
.data_valid (data_valid),
.crc_start (crc_start),
.crc_out (crc_out),
.num (num),
.crc_valid (crc_valid)
);
initial begin
sys_clk<=1'b1;
sys_rst_n<=1'b0;
data_valid<=1'b0;
data<=1'b1;
crc_start<=1'b0;
#10 sys_rst_n<=1'b1;
#50 data_valid<=1'b1;     
#320 data<=1'b0;        //ffff0000一共有32位,即11111111 11111111 00000000 00000000,所以經歷了16*20ns=320ns的高電平,接着320ns的低電平。
#320 data_valid<=1'b0;
#50 $stop;
end
always #10 sys_clk<=~sys_clk;
endmodule

檢驗正確:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM