Блин ничего не понимаю, в чем я ошибся, или что то совсем ничего не понимаю, вроде такая простая вещь а не работает как нужно (.
Весь подсчет разбил что бы было удобнее искать проблему, но ничего так и не нашел. Взял проверенный алгоритм на C#
Код
{
int crc = 0xFFFF;
byte[] msg = new byte[6];
msg[0] = 0x24;
msg[1] = 0x08;
msg[2] = 0x00;
msg[3] = 0x00;
msg[4] = 0x00;
msg[5] = 0x00;
for (int j = 0; j < 6; j++)
{
crc = crc ^ msg[j];
for (int i = 0; i < 8; i++)
{
bool ff = (crc & 1)==1;
crc = crc >> 1;
if (ff)
{
crc = crc ^ 0xA001;
}
}
}
}
Результат получается правильный 0X3EE7.
Переписал практически один в один под Verilog, обмен с модулем crc_mobus проверил 10 раз все работает.
Результат правильный но сдвинут 0X003E. Почему так получается куда смотреть уже мыслей нет.
Код
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
module crc_mobus(input clck, input datacrcini,input datacrcnew, input[7:0]datain, output[15:0] crcout, output crcrd);
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
reg[15:0] countcrc = 0;
reg[3:0] counterbytes = 0;
reg[3:0] statucountcrc = 0;
reg crcrdy = 0;
reg loaddata = 0;
reg bitlsb = 0;
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
always @(posedge clck)
begin
if(datacrcini)
begin
crcrdy = 0;
loaddata = 0;
statucountcrc = 0;
counterbytes = 0;
countcrc[15:0] = 16'b1111111111111111;
end
else if(datacrcnew) begin
if(loaddata == 0)
begin
loaddata = 1;
crcrdy = 0;
counterbytes = 0;
countcrc[15:0] = {8'b00000000,datain[7:0]} ^countcrc[15:0];
statucountcrc = 0;
end
end
else begin
if(counterbytes < 8)
begin
case(statucountcrc)
0:
begin
bitlsb = countcrc[0];
statucountcrc = 1;
end
1:
begin
countcrc = countcrc>>1;
statucountcrc = 2;
end
2:
begin
if(bitlsb)
begin
countcrc = countcrc ^ 16'b 1010000000000001;
end
counterbytes = counterbytes +1;
statucountcrc = 0;
end
default:
begin
statucountcrc = 0;
end
endcase
end
else begin
crcrdy = 1;
loaddata = 0;
end
end
end
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
assign crcout = countcrc;
assign crcrd = crcrdy;
endmodule