/*******************************************************
假设需要发送的数据为8位,校验多项式一般为X16+X12+X5+1。************************************************************/
module CRC_Prj(clk,rst,m_x,en,Data_M_Out,err);
input clk;
input rst;
input [7:0]m_x;//发送的数据为8位
input en; //??????????????
output [7:0] Data_M_Out;
output err;
wire [23:0]data_x;
//wire hsend;
fasong u1(
.clk(clk),
.rst(clk),
.m_x(m_x),
.en(en),
.data_x(data_x)
// .hsend(hsend)
);
jieshou u2(
.clk(clk),
.rst(rst),
.data_x(data_x),
// .hsend(hsend),
.Data_M_Out(Data_M_Out),
.err(err)
);
endmodule
module fasong(
clk,rst,
m_x,en,
data_x//,hsend
);
input clk;
input rst;
input [7:0]m_x;//发送的数据为8位
input en; //??????????????
output [23:0]data_x;// jieshou 24位
//output hsend; //???????????????
//reg [7:0]m_x_r1; //发送模块寄存器
reg [23:0]data_x_r;
reg [15:0]yanzheng; //验证码模块寄存器
//reg hsend_r;
reg [23:0]dtemp; // 被除数
assign data_x = data_x_r;
//assign hsend = hsend_r;
parameter polynomial = 17'b10001000000100001;//多项式一般为X16+X12+X5+1。
always@(posedge clk or negedge rst)
if(!rst) //初始化
begin
dtemp <= 24'd0;
//hsend_r <= 1'b0;
end
else if(en == 1'b1)
begin
dtemp <= {m_x,16'd0}; //
if( dtemp[23] ) dtemp[23:7]<=dtemp[23:7]^polynomial;
if( dtemp[22] ) dtemp[22:6]<=dtemp[22:6]^polynomial;
if( dtemp[21] ) dtemp[21:5]<=dtemp[21:5]^polynomial;
if( dtemp[20] ) dtemp[20:4]<=dtemp[20:4]^polynomial;
if( dtemp[19] ) dtemp[19:3]<=dtemp[19:3]^polynomial;
if( dtemp[18] ) dtemp[18:2]<=dtemp[18:2]^polynomial;
if( dtemp[17] ) dtemp[17:1]<=dtemp[17:1]^polynomial;
if( dtemp[16] ) dtemp[16:0]<=dtemp[16:0]^polynomial;
data_x_r<={m_x,dtemp[15:0]}; //dtemp[15:0]为得到的余数式
// hsend_r<=1'b1;
end
//else
// hsend_r <= 1'b0;
endmodule
module jieshou(
clk,rst,
data_x,
//hsend,
Data_M_Out,err
);
input clk;
input rst;
input [23:0]data_x;
//input hsend;
output reg[7:0] Data_M_Out;
output reg err;
reg [23:0]dtemp;
parameter polynomial = 17'b10001000000100001;//多项式一般为X16+X12+X5+1。
always@(posedge clk or negedge rst)
if(!rst)
begin
Data_M_Out <= 8'b00000000;
err <= 0;
end
else// if(hsend == 1)
begin
dtemp<=data_x;
if( dtemp[23] ) dtemp[23:7]<=dtemp[23:7]^polynomial;
if( dtemp[22] ) dtemp[22:6]<=dtemp[22:6]^polynomial;
if( dtemp[21] ) dtemp[21:5]<=dtemp[21:5]^polynomial;
if( dtemp[20] ) dtemp[20:4]<=dtemp[20:4]^polynomial;
if( dtemp[19] ) dtemp[19:3]<=dtemp[19:3]^polynomial;
if( dtemp[18] ) dtemp[18:2]<=dtemp[18:2]^polynomial;
if( dtemp[17] ) dtemp[17:1]<=dtemp[17:1]^polynomial;
if( dtemp[16] ) dtemp[16:0]<=dtemp[16:0]^polynomial;
if(dtemp[15:0] == 16'b0000000000000000)
begin
Data_M_Out <= data_x[23:16];
err <= 1;
end
end
endmodule
下面是仿真图形
发送和接受匹配。。。。
文章评论(0条评论)
登录后参与讨论