Files
lt16lab/soc/peripheral/can_acf.v
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

346 lines
17 KiB
Verilog

//////////////////////////////////////////////////////////////////////
//// ////
//// can_acf.v ////
//// ////
//// ////
//// This file is part of the CAN Protocol Controller ////
//// http://www.opencores.org/projects/can/ ////
//// ////
//// ////
//// Author(s): ////
//// Igor Mohor ////
//// igorm@opencores.org ////
//// ////
//// ////
//// All additional information is available in the README.txt ////
//// file. ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2002, 2003, 2004 Authors ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//// The CAN protocol is developed by Robert Bosch GmbH and ////
//// protected by patents. Anybody who wants to implement this ////
//// CAN IP core on silicon has to obtain a CAN protocol license ////
//// from Bosch. ////
//// ////
//////////////////////////////////////////////////////////////////////
// synopsys translate_off
// `include "timescale.v"
// synopsys translate_on
`include "can_defines.v"
module can_acf
(
clk,
rst,
id,
/* Mode register */
reset_mode,
acceptance_filter_mode,
extended_mode,
acceptance_code_0,
acceptance_code_1,
acceptance_code_2,
acceptance_code_3,
acceptance_mask_0,
acceptance_mask_1,
acceptance_mask_2,
acceptance_mask_3,
go_rx_crc_lim,
go_rx_inter,
go_error_frame,
data0,
data1,
rtr1,
rtr2,
ide,
no_byte0,
no_byte1,
id_ok
);
parameter Tp = 1;
input clk;
input rst;
input [28:0] id;
input reset_mode;
input acceptance_filter_mode;
input extended_mode;
input [7:0] acceptance_code_0;
input [7:0] acceptance_code_1;
input [7:0] acceptance_code_2;
input [7:0] acceptance_code_3;
input [7:0] acceptance_mask_0;
input [7:0] acceptance_mask_1;
input [7:0] acceptance_mask_2;
input [7:0] acceptance_mask_3;
input go_rx_crc_lim;
input go_rx_inter;
input go_error_frame;
input [7:0] data0;
input [7:0] data1;
input rtr1;
input rtr2;
input ide;
input no_byte0;
input no_byte1;
output id_ok;
reg id_ok;
wire match;
wire match_sf_std;
wire match_sf_ext;
wire match_df_std;
wire match_df_ext;
// Working in basic mode. ID match for standard format (11-bit ID).
assign match = ( (id[3] == acceptance_code_0[0] | acceptance_mask_0[0] ) &
(id[4] == acceptance_code_0[1] | acceptance_mask_0[1] ) &
(id[5] == acceptance_code_0[2] | acceptance_mask_0[2] ) &
(id[6] == acceptance_code_0[3] | acceptance_mask_0[3] ) &
(id[7] == acceptance_code_0[4] | acceptance_mask_0[4] ) &
(id[8] == acceptance_code_0[5] | acceptance_mask_0[5] ) &
(id[9] == acceptance_code_0[6] | acceptance_mask_0[6] ) &
(id[10] == acceptance_code_0[7] | acceptance_mask_0[7] )
);
// Working in extended mode. ID match for standard format (11-bit ID). Using single filter.
assign match_sf_std = ( (id[3] == acceptance_code_0[0] | acceptance_mask_0[0] ) &
(id[4] == acceptance_code_0[1] | acceptance_mask_0[1] ) &
(id[5] == acceptance_code_0[2] | acceptance_mask_0[2] ) &
(id[6] == acceptance_code_0[3] | acceptance_mask_0[3] ) &
(id[7] == acceptance_code_0[4] | acceptance_mask_0[4] ) &
(id[8] == acceptance_code_0[5] | acceptance_mask_0[5] ) &
(id[9] == acceptance_code_0[6] | acceptance_mask_0[6] ) &
(id[10] == acceptance_code_0[7] | acceptance_mask_0[7] ) &
(rtr1 == acceptance_code_1[4] | acceptance_mask_1[4] ) &
(id[0] == acceptance_code_1[5] | acceptance_mask_1[5] ) &
(id[1] == acceptance_code_1[6] | acceptance_mask_1[6] ) &
(id[2] == acceptance_code_1[7] | acceptance_mask_1[7] ) &
(data0[0] == acceptance_code_2[0] | acceptance_mask_2[0] | no_byte0) &
(data0[1] == acceptance_code_2[1] | acceptance_mask_2[1] | no_byte0) &
(data0[2] == acceptance_code_2[2] | acceptance_mask_2[2] | no_byte0) &
(data0[3] == acceptance_code_2[3] | acceptance_mask_2[3] | no_byte0) &
(data0[4] == acceptance_code_2[4] | acceptance_mask_2[4] | no_byte0) &
(data0[5] == acceptance_code_2[5] | acceptance_mask_2[5] | no_byte0) &
(data0[6] == acceptance_code_2[6] | acceptance_mask_2[6] | no_byte0) &
(data0[7] == acceptance_code_2[7] | acceptance_mask_2[7] | no_byte0) &
(data1[0] == acceptance_code_3[0] | acceptance_mask_3[0] | no_byte1) &
(data1[1] == acceptance_code_3[1] | acceptance_mask_3[1] | no_byte1) &
(data1[2] == acceptance_code_3[2] | acceptance_mask_3[2] | no_byte1) &
(data1[3] == acceptance_code_3[3] | acceptance_mask_3[3] | no_byte1) &
(data1[4] == acceptance_code_3[4] | acceptance_mask_3[4] | no_byte1) &
(data1[5] == acceptance_code_3[5] | acceptance_mask_3[5] | no_byte1) &
(data1[6] == acceptance_code_3[6] | acceptance_mask_3[6] | no_byte1) &
(data1[7] == acceptance_code_3[7] | acceptance_mask_3[7] | no_byte1)
);
// Working in extended mode. ID match for extended format (29-bit ID). Using single filter.
assign match_sf_ext = ( (id[21] == acceptance_code_0[0] | acceptance_mask_0[0] ) &
(id[22] == acceptance_code_0[1] | acceptance_mask_0[1] ) &
(id[23] == acceptance_code_0[2] | acceptance_mask_0[2] ) &
(id[24] == acceptance_code_0[3] | acceptance_mask_0[3] ) &
(id[25] == acceptance_code_0[4] | acceptance_mask_0[4] ) &
(id[26] == acceptance_code_0[5] | acceptance_mask_0[5] ) &
(id[27] == acceptance_code_0[6] | acceptance_mask_0[6] ) &
(id[28] == acceptance_code_0[7] | acceptance_mask_0[7] ) &
(id[13] == acceptance_code_1[0] | acceptance_mask_1[0] ) &
(id[14] == acceptance_code_1[1] | acceptance_mask_1[1] ) &
(id[15] == acceptance_code_1[2] | acceptance_mask_1[2] ) &
(id[16] == acceptance_code_1[3] | acceptance_mask_1[3] ) &
(id[17] == acceptance_code_1[4] | acceptance_mask_1[4] ) &
(id[18] == acceptance_code_1[5] | acceptance_mask_1[5] ) &
(id[19] == acceptance_code_1[6] | acceptance_mask_1[6] ) &
(id[20] == acceptance_code_1[7] | acceptance_mask_1[7] ) &
(id[5] == acceptance_code_2[0] | acceptance_mask_2[0] ) &
(id[6] == acceptance_code_2[1] | acceptance_mask_2[1] ) &
(id[7] == acceptance_code_2[2] | acceptance_mask_2[2] ) &
(id[8] == acceptance_code_2[3] | acceptance_mask_2[3] ) &
(id[9] == acceptance_code_2[4] | acceptance_mask_2[4] ) &
(id[10] == acceptance_code_2[5] | acceptance_mask_2[5] ) &
(id[11] == acceptance_code_2[6] | acceptance_mask_2[6] ) &
(id[12] == acceptance_code_2[7] | acceptance_mask_2[7] ) &
(rtr2 == acceptance_code_3[2] | acceptance_mask_3[2] ) &
(id[0] == acceptance_code_3[3] | acceptance_mask_3[3] ) &
(id[1] == acceptance_code_3[4] | acceptance_mask_3[4] ) &
(id[2] == acceptance_code_3[5] | acceptance_mask_3[5] ) &
(id[3] == acceptance_code_3[6] | acceptance_mask_3[6] ) &
(id[4] == acceptance_code_3[7] | acceptance_mask_3[7] )
);
// Working in extended mode. ID match for standard format (11-bit ID). Using double filter.
assign match_df_std = (((id[3] == acceptance_code_0[0] | acceptance_mask_0[0] ) &
(id[4] == acceptance_code_0[1] | acceptance_mask_0[1] ) &
(id[5] == acceptance_code_0[2] | acceptance_mask_0[2] ) &
(id[6] == acceptance_code_0[3] | acceptance_mask_0[3] ) &
(id[7] == acceptance_code_0[4] | acceptance_mask_0[4] ) &
(id[8] == acceptance_code_0[5] | acceptance_mask_0[5] ) &
(id[9] == acceptance_code_0[6] | acceptance_mask_0[6] ) &
(id[10] == acceptance_code_0[7] | acceptance_mask_0[7] ) &
(rtr1 == acceptance_code_1[4] | acceptance_mask_1[4] ) &
(id[0] == acceptance_code_1[5] | acceptance_mask_1[5] ) &
(id[1] == acceptance_code_1[6] | acceptance_mask_1[6] ) &
(id[2] == acceptance_code_1[7] | acceptance_mask_1[7] ) &
(data0[0] == acceptance_code_3[0] | acceptance_mask_3[0] | no_byte0) &
(data0[1] == acceptance_code_3[1] | acceptance_mask_3[1] | no_byte0) &
(data0[2] == acceptance_code_3[2] | acceptance_mask_3[2] | no_byte0) &
(data0[3] == acceptance_code_3[3] | acceptance_mask_3[3] | no_byte0) &
(data0[4] == acceptance_code_1[0] | acceptance_mask_1[0] | no_byte0) &
(data0[5] == acceptance_code_1[1] | acceptance_mask_1[1] | no_byte0) &
(data0[6] == acceptance_code_1[2] | acceptance_mask_1[2] | no_byte0) &
(data0[7] == acceptance_code_1[3] | acceptance_mask_1[3] | no_byte0) )
|
((id[3] == acceptance_code_2[0] | acceptance_mask_2[0] ) &
(id[4] == acceptance_code_2[1] | acceptance_mask_2[1] ) &
(id[5] == acceptance_code_2[2] | acceptance_mask_2[2] ) &
(id[6] == acceptance_code_2[3] | acceptance_mask_2[3] ) &
(id[7] == acceptance_code_2[4] | acceptance_mask_2[4] ) &
(id[8] == acceptance_code_2[5] | acceptance_mask_2[5] ) &
(id[9] == acceptance_code_2[6] | acceptance_mask_2[6] ) &
(id[10] == acceptance_code_2[7] | acceptance_mask_2[7] ) &
(rtr1 == acceptance_code_3[4] | acceptance_mask_3[4] ) &
(id[0] == acceptance_code_3[5] | acceptance_mask_3[5] ) &
(id[1] == acceptance_code_3[6] | acceptance_mask_3[6] ) &
(id[2] == acceptance_code_3[7] | acceptance_mask_3[7] ) )
);
// Working in extended mode. ID match for extended format (29-bit ID). Using double filter.
assign match_df_ext = (((id[21] == acceptance_code_0[0] | acceptance_mask_0[0] ) &
(id[22] == acceptance_code_0[1] | acceptance_mask_0[1] ) &
(id[23] == acceptance_code_0[2] | acceptance_mask_0[2] ) &
(id[24] == acceptance_code_0[3] | acceptance_mask_0[3] ) &
(id[25] == acceptance_code_0[4] | acceptance_mask_0[4] ) &
(id[26] == acceptance_code_0[5] | acceptance_mask_0[5] ) &
(id[27] == acceptance_code_0[6] | acceptance_mask_0[6] ) &
(id[28] == acceptance_code_0[7] | acceptance_mask_0[7] ) &
(id[13] == acceptance_code_1[0] | acceptance_mask_1[0] ) &
(id[14] == acceptance_code_1[1] | acceptance_mask_1[1] ) &
(id[15] == acceptance_code_1[2] | acceptance_mask_1[2] ) &
(id[16] == acceptance_code_1[3] | acceptance_mask_1[3] ) &
(id[17] == acceptance_code_1[4] | acceptance_mask_1[4] ) &
(id[18] == acceptance_code_1[5] | acceptance_mask_1[5] ) &
(id[19] == acceptance_code_1[6] | acceptance_mask_1[6] ) &
(id[20] == acceptance_code_1[7] | acceptance_mask_1[7] ) )
|
((id[21] == acceptance_code_2[0] | acceptance_mask_2[0] ) &
(id[22] == acceptance_code_2[1] | acceptance_mask_2[1] ) &
(id[23] == acceptance_code_2[2] | acceptance_mask_2[2] ) &
(id[24] == acceptance_code_2[3] | acceptance_mask_2[3] ) &
(id[25] == acceptance_code_2[4] | acceptance_mask_2[4] ) &
(id[26] == acceptance_code_2[5] | acceptance_mask_2[5] ) &
(id[27] == acceptance_code_2[6] | acceptance_mask_2[6] ) &
(id[28] == acceptance_code_2[7] | acceptance_mask_2[7] ) &
(id[13] == acceptance_code_3[0] | acceptance_mask_3[0] ) &
(id[14] == acceptance_code_3[1] | acceptance_mask_3[1] ) &
(id[15] == acceptance_code_3[2] | acceptance_mask_3[2] ) &
(id[16] == acceptance_code_3[3] | acceptance_mask_3[3] ) &
(id[17] == acceptance_code_3[4] | acceptance_mask_3[4] ) &
(id[18] == acceptance_code_3[5] | acceptance_mask_3[5] ) &
(id[19] == acceptance_code_3[6] | acceptance_mask_3[6] ) &
(id[20] == acceptance_code_3[7] | acceptance_mask_3[7] ) )
);
// ID ok signal generation
always @ (posedge clk or posedge rst)
begin
if (rst)
id_ok <= 1'b0;
else if (go_rx_crc_lim) // sample_point is already included in go_rx_crc_lim
begin
if (extended_mode)
begin
if (~acceptance_filter_mode) // dual filter
begin
if (ide) // extended frame message
id_ok <=#Tp match_df_ext;
else // standard frame message
id_ok <=#Tp match_df_std;
end
else // single filter
begin
if (ide) // extended frame message
id_ok <=#Tp match_sf_ext;
else // standard frame message
id_ok <=#Tp match_sf_std;
end
end
else
id_ok <=#Tp match;
end
else if (reset_mode | go_rx_inter | go_error_frame) // sample_point is already included in go_rx_inter
id_ok <=#Tp 1'b0;
end
endmodule