blob: 7e19b32402adbbebac7540c0964697888938e303 [file] [log] [blame]
// MIT License
// Copyright (c) [2022] [Yonga Technology Microelectronics R&D]
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// DESCRIPTION
// The yonga_can_packetizer module forms a CAN frame in accordance with CAN 2.0B standard
module yonga_can_packetizer(
input wire i_packetizer_clk,
input wire i_packetizer_rst,
input wire i_packetizer_en,
input wire i_drive_pulse,
input wire [11-1:0] i_packetizer_message_sid,
input wire i_packetizer_message_ide,
input wire i_packetizer_message_r0,
input wire i_packetizer_message_r1,
input wire i_packetizer_message_srr,
input wire [18-1:0] i_packetizer_message_eid,
input wire i_packetizer_message_rtr,
input wire [4-1:0] i_packetizer_message_dlc,
input wire [8-1:0] i_packetizer_message_data_byte_0,
input wire [8-1:0] i_packetizer_message_data_byte_1,
input wire [8-1:0] i_packetizer_message_data_byte_2,
input wire [8-1:0] i_packetizer_message_data_byte_3,
input wire [8-1:0] i_packetizer_message_data_byte_4,
input wire [8-1:0] i_packetizer_message_data_byte_5,
input wire [8-1:0] i_packetizer_message_data_byte_6,
input wire [8-1:0] i_packetizer_message_data_byte_7,
output wire o_packetizer_rdy,
input wire i_packetizer_req,
output reg o_packetizer_message_bit,
input wire i_packetizer_message_bit,
output reg o_ack_slot
);
// state registers
parameter STATE_IDLE = 0, STATE_SOF = 1 , STATE_SID = 2, STATE_RTR = 3, STATE_SRR = 4, STATE_IDE = 5, STATE_EID = 6,STATE_CTRL = 7,
STATE_DATA = 8, STATE_CRC = 9, STATE_ACK = 10, STATE_EOF = 11, STATE_IFS = 12;
reg [3:0] state_reg;
reg [3:0] state_reg_previous;
// data registers
reg [11-1:0] message_sid;
reg message_ide;
reg message_r0;
reg [18-1:0] message_eid;
reg message_rtr;
reg message_srr;
reg [6-1:0] message_control;
reg [4-1:0] message_dlc;
reg [64-1:0] message_data;
// control and status registers
reg prev_bit_reg;
reg [7-1:0] bit_counter_reg;
reg stuff_bit_exception_reg;
reg [4-1:0] num_of_consec_ones_reg;
reg [4-1:0] num_of_consec_zeros_reg;
reg packetizer_rdy_reg;
wire stuff_bit_exception_negedge;
reg stuff_bit_exception_prev;
// CRC register
reg [14:0] crc_reg;
wire next_bit;
wire crc_valid;
reg crc_enable;
reg prev_drive;
wire negedge_drive;
assign next_bit = state_reg != STATE_CRC ? o_packetizer_message_bit : 1'b0;
assign crc_valid = crc_enable & ~stuff_bit_exception_negedge;
assign negedge_drive = prev_drive & ~i_drive_pulse;
assign stuff_bit_exception_negedge = stuff_bit_exception_prev & ~stuff_bit_exception_reg;
always@(posedge i_packetizer_clk)
begin
prev_drive <= i_drive_pulse;
if(i_packetizer_rst == 1'b1)
begin
prev_bit_reg <= 1'b0;
stuff_bit_exception_reg <= 1'b0;
num_of_consec_ones_reg <= 4'b0;
num_of_consec_zeros_reg <= 4'b0;
bit_counter_reg <= 7'b0;
packetizer_rdy_reg <= 1'b0;
state_reg <= STATE_IDLE;
crc_reg <= 15'b0;
o_ack_slot <= 1'b0;
crc_enable <= 1'b0;
end
else
begin
stuff_bit_exception_prev <= stuff_bit_exception_reg;
state_reg_previous <= state_reg;
if(prev_drive) begin
if(crc_valid)
begin
//crc_next = next_bit ^ crc_reg[14];
crc_reg <= crc_reg << 1'b1;
if(next_bit ^ crc_reg[14])
begin
crc_reg <= (crc_reg<<1'b1) ^ 16'hC599;
end
//crc_reg = crc_reg & 16'h7FFF;
end
end
if(i_drive_pulse) begin
case(state_reg)
STATE_IDLE:
begin
packetizer_rdy_reg <= 1'b0;
o_packetizer_message_bit <= 1'b1;
message_sid <= i_packetizer_message_sid;
message_ide <= i_packetizer_message_ide;
message_eid <= i_packetizer_message_eid;
message_rtr <= i_packetizer_message_rtr;
message_srr <= i_packetizer_message_srr;
message_data <= {i_packetizer_message_data_byte_7,i_packetizer_message_data_byte_6, i_packetizer_message_data_byte_5, i_packetizer_message_data_byte_4, i_packetizer_message_data_byte_3, i_packetizer_message_data_byte_2, i_packetizer_message_data_byte_1, i_packetizer_message_data_byte_0};
if(i_packetizer_message_ide==1)
begin
message_control <= {i_packetizer_message_r1, i_packetizer_message_r0, i_packetizer_message_dlc};
end
else
begin
message_control <= {i_packetizer_message_ide, i_packetizer_message_r0, i_packetizer_message_dlc};
end
crc_reg <= 15'b0;
if(i_packetizer_message_dlc >= 4'd8 )
begin
message_dlc <= 4'd8;
end
else
begin
message_dlc <= i_packetizer_message_dlc;
end
//if(i_packetizer_en)
//begin
state_reg <= STATE_SOF;
crc_enable <= 1'b0;
//prev_bit_reg <= 1'b0;
//end
end
STATE_SOF :
begin
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else begin
o_packetizer_message_bit <= 1'b0;
// start counting bit levels - this is needed to inject stuff bits into bitstream
prev_bit_reg <= 1'b0;
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
crc_enable <= 1'b1;
state_reg <= STATE_SID;
end
end
STATE_SID :
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_sid[10];
crc_enable <= 1'b1;
prev_bit_reg <= ~message_sid[10];
// shift message_sid register left by 1-bit
message_sid <= message_sid << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd10)
begin
bit_counter_reg <= 7'd0;
if(message_ide==1)
state_reg <= STATE_SRR;
else
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_SID;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_sid[10])
begin
if(message_sid[10] == 1'b1)
begin
o_packetizer_message_bit <= message_sid[10];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_sid[10];
if(num_of_consec_ones_reg == 4'd3 && message_sid[10] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
//message_sid <= message_sid << 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_sid <= message_sid << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd10)
begin
bit_counter_reg <= 7'd0;
if(message_ide==1)
state_reg <= STATE_SRR;
else
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_SID;
end
end
end
else
begin
o_packetizer_message_bit <= message_sid[10];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_sid[10];
if(num_of_consec_zeros_reg == 4'd3 && message_sid[10] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_sid <= message_sid << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd10)
begin
bit_counter_reg <= 7'd0;
if(message_ide==1)
state_reg <= STATE_SRR;
else
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_SID;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_sid[10];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_sid <= message_sid << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_sid[10];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd10)
begin
bit_counter_reg <= 7'd0;
if(message_ide==1)
state_reg <= STATE_SRR;
else
state_reg <= STATE_RTR;
end
else begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_SID;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
STATE_RTR :
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_rtr;
crc_enable <= 1'b1;
prev_bit_reg <= ~message_rtr;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_CTRL;
end
else
begin
if(prev_bit_reg == message_rtr)
begin
if(message_rtr == 1'b1)
begin
o_packetizer_message_bit <= message_rtr;
crc_enable <= 1'b1;
prev_bit_reg <= message_rtr;
if(num_of_consec_ones_reg == 4'd3 && message_rtr == 1'b1)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_ones_reg <= 4'd0;
end
else
begin
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_CTRL;
end
end
else
begin
o_packetizer_message_bit <= message_rtr;
crc_enable <= 1'b1;
prev_bit_reg <= message_rtr;
if(num_of_consec_zeros_reg == 4'd3 && message_rtr == 1'b0)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_CTRL;
end
end
end
else
begin
o_packetizer_message_bit <= message_rtr;
crc_enable <= 1'b1;
prev_bit_reg <= message_rtr;
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_CTRL;
end
end
end
STATE_SRR :
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_srr;
crc_enable <= 1'b1;
prev_bit_reg <= ~message_srr;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_IDE;
end
else
begin
if(prev_bit_reg == message_srr)
begin
if(message_srr == 1'b1)
begin
o_packetizer_message_bit <= message_srr;
crc_enable <= 1'b1;
prev_bit_reg <= message_srr;
if(num_of_consec_ones_reg == 4'd3 && message_srr == 1'b1)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_ones_reg <= 4'd0;
end
else
begin
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_IDE;
end
end
else
begin
o_packetizer_message_bit <= message_srr;
crc_enable <= 1'b1;
prev_bit_reg <= message_srr;
if(num_of_consec_zeros_reg == 4'd3 && message_srr == 1'b0)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_IDE;
end
end
end
else
begin
o_packetizer_message_bit <= message_srr;
crc_enable <= 1'b1;
prev_bit_reg <= message_srr;
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_IDE;
end
end
end
STATE_IDE :
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_ide;
crc_enable <= 1'b1;
prev_bit_reg <= ~message_ide;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_EID;
end
else
begin
if(prev_bit_reg == message_ide)
begin
if(message_ide == 1'b1)
begin
o_packetizer_message_bit <= message_ide;
crc_enable <= 1'b1;
prev_bit_reg <= message_ide;
if(num_of_consec_ones_reg == 4'd3 && message_ide == 1'b1)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_ones_reg <= 4'd0;
end
else
begin
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_EID;
end
end
else
begin
o_packetizer_message_bit <= message_ide;
crc_enable <= 1'b1;
prev_bit_reg <= message_ide;
if(num_of_consec_zeros_reg == 4'd3 && message_ide == 1'b0)
begin
stuff_bit_exception_reg <= 1'b1;
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_EID;
end
end
end
else
begin
o_packetizer_message_bit <= message_ide;
crc_enable <= 1'b1;
prev_bit_reg <= message_ide;
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_EID;
end
end
end
STATE_EID :
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_eid[17];
crc_enable <= 1'b1;
prev_bit_reg <= ~message_eid[17];
// shift message_eid register left by 1-bit
message_eid <= message_eid << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd17)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_EID;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_eid[17])
begin
if(message_eid[17] == 1'b1)
begin
o_packetizer_message_bit <= message_eid[17];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_eid[17];
if(num_of_consec_ones_reg == 4'd3 && message_eid[17] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
//message_sid <= message_sid << 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_eid register left by 1-bit
message_eid <= message_eid << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd17)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_EID;
end
end
end
else
begin
o_packetizer_message_bit <= message_eid[17];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_eid[17];
if(num_of_consec_zeros_reg == 4'd3 && message_eid[17] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_eid register left by 1-bit
message_eid <= message_eid << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd17)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_RTR;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_EID;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_eid[17];
crc_enable <= 1'b1;
// shift message_eid register left by 1-bit
message_eid <= message_eid << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_eid[17];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd17)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_RTR;
end
else begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_EID;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
STATE_CTRL:
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_control[5];
crc_enable <= 1'b1;
// shift message control register left by 1-bit
message_control <= message_control << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_control[5];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd5)
begin
bit_counter_reg <= 7'd0;
if(message_rtr)
begin
state_reg <= STATE_CRC;
end
else
begin
state_reg <= STATE_DATA;
end
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CTRL;
//end
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_control[5])
begin
if(message_control[5] == 1'b1)
begin
o_packetizer_message_bit <= message_control[5];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_control[5];
if(num_of_consec_ones_reg == 4'd3 && message_control[5] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_control register left by 1-bit
message_control <= message_control << 1'b1;
// check if the current bit sent is the last bit of message_control field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd5)
begin
bit_counter_reg <= 7'd0;
if(message_rtr)
begin
state_reg <= STATE_CRC;
end
else
begin
state_reg <= STATE_DATA;
end
end
else begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CTRL;
end
end
end
else
begin
o_packetizer_message_bit <= message_control[5];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_control[5];
if(num_of_consec_zeros_reg == 4'd3 && message_control[5] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_control <= message_control << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd5)
begin
bit_counter_reg <= 7'd0;
if(message_rtr)
begin
state_reg <= STATE_CRC;
end
else
begin
state_reg <= STATE_DATA;
end
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CTRL;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_control[5];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_control <= message_control << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_control[5];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd5)
begin
bit_counter_reg <= 7'd0;
if(message_rtr)
begin
state_reg <= STATE_CRC;
end
else
begin
state_reg <= STATE_DATA;
end
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CTRL;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
STATE_DATA:
begin
if(message_dlc == 'd0)
begin
//message_data <= null;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else
state_reg <= STATE_CRC;
end
else if(message_dlc == 'd1)
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_data[7];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[7];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd7)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[7])
begin
if(message_data[7] == 1'b1)
begin
o_packetizer_message_bit <= message_data[7];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[7];
if(num_of_consec_ones_reg == 4'd3 && message_data[7] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd7)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[7];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[7];
if(num_of_consec_zeros_reg == 4'd3 && message_data[7] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd7)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_data[7];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[7];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd7)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd2)
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_data[15];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[15];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd15)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[15])
begin
if(message_data[15] == 1'b1)
begin
o_packetizer_message_bit <= message_data[15];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[15];
if(num_of_consec_ones_reg == 4'd3 && message_data[15] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if (bit_counter_reg == 7'd16)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[15];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[15];
if(num_of_consec_zeros_reg == 4'd3 && message_data[15] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd15)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_data[15];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[15];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd15)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd3)
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_data[23];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[23];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd23)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[23])
begin
if(message_data[23] == 1'b1)
begin
o_packetizer_message_bit <= message_data[23];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[23];
if(num_of_consec_ones_reg == 4'd3 && message_data[23] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd23)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[23];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[23];
if(num_of_consec_zeros_reg == 4'd3 && message_data[23] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd23)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_data[23];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[23];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd23)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd4)
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_data[31];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[31];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd31)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[31])
begin
if(message_data[31] == 1'b1)
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[31];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[31];
if(num_of_consec_ones_reg == 4'd3 && message_data[31] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd31)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[31];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[31];
if(num_of_consec_zeros_reg == 4'd3 && message_data[31] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd31)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[31];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[31];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd31)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd5)
begin
if(stuff_bit_exception_reg)
begin
// push stuff bit into FIFO
o_packetizer_message_bit <= ~message_data[39];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[39];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd39)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[39])
begin
if(message_data[39] == 1'b1)
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[39];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[39];
if(num_of_consec_ones_reg == 4'd3 && message_data[39] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd39)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[39];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[39];
if(num_of_consec_zeros_reg == 4'd3 && message_data[39] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd39)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[39];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[39];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd39)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd6)
begin
if(stuff_bit_exception_reg)
begin
// push stuff bit into FIFO
o_packetizer_message_bit <= ~message_data[47];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[47];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd47)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[47])
begin
if(message_data[47] == 1'b1)
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[47];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[47];
if(num_of_consec_ones_reg == 4'd3 && message_data[47] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd47)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[47];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[47];
if(num_of_consec_zeros_reg == 4'd3 && message_data[47] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd47)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[47];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[47];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd47)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else if(message_dlc == 'd7)
begin
if(stuff_bit_exception_reg)
begin
// push stuff bit into FIFO
o_packetizer_message_bit <= ~message_data[55];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[55];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd55)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[55])
begin
if(message_data[55] == 1'b1)
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[55];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[55];
if(num_of_consec_ones_reg == 4'd3 && message_data[55] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd55)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[55];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[55];
if(num_of_consec_zeros_reg == 4'd3 && message_data[55] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd55)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
// push next SID bit into FIFO
o_packetizer_message_bit <= message_data[55];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[55];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd55)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
else
begin
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~message_data[63];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
prev_bit_reg <= ~message_data[63];
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd63)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
else
begin
// check possible stuff condition
if(prev_bit_reg == message_data[63])
begin
if(message_data[63] == 1'b1)
begin
o_packetizer_message_bit <= message_data[63];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[63];
if(num_of_consec_ones_reg == 4'd3 && message_data[63] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd63)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
else
begin
o_packetizer_message_bit <= message_data[63];
crc_enable <= 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[63];
if(num_of_consec_zeros_reg == 4'd3 && message_data[63] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd63)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
end
end
end
else
begin
o_packetizer_message_bit <= message_data[63];
crc_enable <= 1'b1;
// shift message_sid register left by 1-bit
message_data <= message_data << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= message_data[63];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd63)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_CRC;
end
else
begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_DATA;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
end
STATE_CRC :
begin
crc_enable <= 1'b0;
if(stuff_bit_exception_reg)
begin
o_packetizer_message_bit <= ~crc_reg[14];
prev_bit_reg <= ~crc_reg[14];
// shift crc_reg register left by 1-bit
crc_reg <= crc_reg << 1'b1;
// reset stuff_bit_exception_reg
stuff_bit_exception_reg <= 1'b0;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd14)
begin
//o_packetizer_message_bit <= 1'b1;
bit_counter_reg <= 7'd0;
state_reg <= STATE_ACK;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CRC;
end
end
else
begin
if(bit_counter_reg == 7'd14)
begin
o_packetizer_message_bit <= 1'b1;
end
// check possible stuff condition
if(prev_bit_reg == crc_reg[14])
begin
if(crc_reg[14] == 1'b1)
begin
o_packetizer_message_bit <= crc_reg[14];
// set next value of prev_bit_reg
prev_bit_reg <= crc_reg[14];
if(num_of_consec_ones_reg == 4'd3 && crc_reg[14] == 1'b1)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
//message_sid <= message_sid << 1'b1;
// reset num_of_consec_ones_reg
num_of_consec_ones_reg <= 4'd0;
end
else
begin
// increment num_of_consec_ones_reg
num_of_consec_ones_reg <= num_of_consec_ones_reg + 1'b1;
// shift message_sid register left by 1-bit
crc_reg <= crc_reg << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd14)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_ACK;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CRC;
end
end
end
else
begin
o_packetizer_message_bit <= crc_reg[14];
// set next value of prev_bit_reg
prev_bit_reg <= crc_reg[14];
if(num_of_consec_zeros_reg == 4'd3 && crc_reg[14] == 1'b0)
begin
// stuff condition occurs
stuff_bit_exception_reg <= 1'b1;
// reset num_of_consec_zeros_reg
num_of_consec_zeros_reg <= 4'd0;
end
else
begin
// increment num_of_consec_zeros_reg
num_of_consec_zeros_reg <= num_of_consec_zeros_reg + 1'b1;
// shift message_sid register left by 1-bit
crc_reg <= crc_reg << 1'b1;
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd14)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_ACK;
end
else
begin
// increment bit counter
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CRC;
end
end
end
end
else
begin
o_packetizer_message_bit <= crc_reg[14];
// shift message_sid register left by 1-bit
crc_reg <= crc_reg << 1'b1;
// set next value of prev_bit_reg
prev_bit_reg <= crc_reg[14];
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd14)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_ACK;
end
else begin
bit_counter_reg <= bit_counter_reg + 1'b1;
state_reg <= STATE_CRC;
end
// reset stuff condition detect counters
num_of_consec_zeros_reg <= 4'd0;
num_of_consec_ones_reg <= 4'd0;
end
end
end
STATE_ACK :
begin
if(bit_counter_reg == 7'd0)
begin
o_packetizer_message_bit <= 1'b1;
end
else
begin
o_packetizer_message_bit <= 1'b1;
end
// check if the current bit sent is the last bit of SID field
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd1)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_EOF;
o_ack_slot <= 1'b1;
end
else
begin
state_reg <= STATE_ACK;
bit_counter_reg <= bit_counter_reg + 1'b1;
end
end
STATE_EOF :
begin
o_ack_slot <= 1'b0;
o_packetizer_message_bit <= 1'b1;
if(i_packetizer_en == 0)
state_reg <= STATE_IDLE;
else if(bit_counter_reg == 7'd6)
begin
bit_counter_reg <= 7'd0;
state_reg <= STATE_IDLE;
packetizer_rdy_reg <= 1'b1;
end
else
begin
state_reg <= STATE_EOF;
bit_counter_reg <= bit_counter_reg + 1'b1;
end
end
endcase
end
end
end
assign o_packetizer_rdy = packetizer_rdy_reg;
endmodule