| // File name: wb_CAN.sv |
| // Created: 5/14/2021 |
| // Author: Zachary Ellis |
| // Version: 1.0 Initial Design Entry |
| // Description: Top module of CAN controller wishbone peripheral |
| |
| module wb_CAN ( |
| //wishbone interface |
| input wb_clk_i, |
| input wb_rst_i, |
| input [31:0] wb_adr_i, |
| input [31:0] wb_dat_i, |
| input [3:0] wb_sel_i, |
| input wb_we_i, |
| input wb_cyc_i, |
| input wb_stb_i, |
| output wb_ack_o, |
| output [31:0] wb_dat_o, |
| //CAN interface |
| input CANRX, |
| output CAN_TX |
| ); |
| |
| wire tx_strobe, tx_bitstuff, tx_end_data, tx_byte_complete; |
| wire [3:0] tx_byte_num; |
| wire curr_sample; |
| wire form_error; |
| wire [1:0] rx_err_code, tx_err_code; |
| wire start_err_tx; |
| wire bitstrobe; |
| wire [1:0] error_state; |
| wire CAN_out; |
| wire bit_error; |
| wire ack_error; |
| wire bitstuff_error; |
| wire CRC_Error; |
| wire tx_enable; |
| wire [8:0] REC, TEC; |
| wire [3:0] TS1, TS2; |
| wire [2:0] LEC; |
| wire [3:0] occupancy; |
| wire full, empty, overrun; |
| wire [31:0] data_L, data_H; |
| wire [28:0] ID_out; |
| wire [3:0] pkt_size_out; |
| wire read_fifo, tx_arb_loss, tx_done; |
| wire rx_busy, tx_busy; |
| wire ACK; |
| wire CAN_clk, CAN_nRST; |
| wire RTR_out, EXT_out; |
| wire [4:0] fmi_out; |
| wire fifo_read, fifo_clear; |
| wire overrun_enable; |
| wire [19:0] mask_enable; |
| wire tx_pkt_ready; |
| wire [28:0] tx_ID; |
| wire [3:0] tx_pkt_size; |
| wire tx_EXT, tx_RTR; |
| wire [63:0] tx_data; |
| wire tx_dataphase; |
| wire bitstrobe_shift; |
| |
| |
| |
| `ifdef SIM //vivado and yosys disagree |
| reg [19:0] [30:0] filters; |
| reg [19:0] [30:0] masks; |
| `else |
| reg [30:0] filters[19:0]; |
| reg [30:0] masks[19:0]; |
| `endif |
| |
| assign CAN_TX = error_state[1] ? CAN_out : CAN_out & ACK; |
| |
| wb_slave U1 ( |
| //wb_interface |
| .wb_clk_i(wb_clk_i), |
| .wb_rst_i(wb_rst_i), |
| .wb_adr_i(wb_adr_i), |
| .wb_dat_i(wb_dat_i), |
| .wb_sel_i(wb_sel_i), |
| .wb_we_i(wb_we_i), |
| .wb_cyc_i(wb_cyc_i), |
| .wb_stb_i(wb_stb_i), |
| .wb_ack_o(wb_ack_o), |
| .wb_dat_o(wb_dat_o), |
| //connection to the rest of the peripheral |
| //general inputs |
| .bitstrobe(bitstrobe), |
| .curr_sample(curr_sample), |
| .rx_busy(rx_busy), |
| .tx_busy(tx_busy), |
| //general outputs |
| .CAN_clk(CAN_clk), |
| .CAN_nRST(CAN_nRST), |
| .tx_enable(tx_enable), |
| //timing stuff |
| .TS1(TS1), //need to add this to timer |
| .TS2(TS2), //need to add this to timer |
| //error stuff |
| .REC(REC[7:0]), |
| .TEC(TEC[7:0]), |
| .error_passive(error_state[0]), |
| .bus_off(error_state[1]), |
| .LEC(LEC), //need to add this to ECU |
| //fifo stuff |
| .fifo_occupancy(occupancy), |
| .fifo_full(full), |
| .fifo_empty(empty), |
| .fifo_overrun(overrun), |
| .fifo_data_L(data_L), |
| .fifo_data_H(data_H), |
| .fifo_ID(ID_out), |
| .fifo_pkt_size(pkt_size_out), |
| .fifo_RTR(RTR_out), |
| .fifo_EXT(EXT_out), |
| .fifo_fmi(fmi_out), |
| .fifo_read(fifo_read), |
| .fifo_clear(fifo_clear), |
| .overrun_enable(overrun_enable), |
| .mask_enable(mask_enable), |
| .filter_0(filters[0]), |
| .mask_0(masks[0]), |
| .filter_1(filters[1]), |
| .mask_1(masks[1]), |
| .filter_2(filters[2]), |
| .mask_2(masks[2]), |
| .filter_3(filters[3]), |
| .mask_3(masks[3]), |
| .filter_4(filters[4]), |
| .mask_4(masks[4]), |
| .filter_5(filters[5]), |
| .mask_5(masks[5]), |
| .filter_6(filters[6]), |
| .mask_6(masks[6]), |
| .filter_7(filters[7]), |
| .mask_7(masks[7]), |
| .filter_8(filters[8]), |
| .mask_8(masks[8]), |
| .filter_9(filters[9]), |
| .mask_9(masks[9]), |
| .filter_10(filters[10]), |
| .mask_10(masks[10]), |
| .filter_11(filters[11]), |
| .mask_11(masks[11]), |
| .filter_12(filters[12]), |
| .mask_12(masks[12]), |
| .filter_13(filters[13]), |
| .mask_13(masks[13]), |
| .filter_14(filters[14]), |
| .mask_14(masks[14]), |
| .filter_15(filters[15]), |
| .mask_15(masks[15]), |
| .filter_16(filters[16]), |
| .mask_16(masks[16]), |
| .filter_17(filters[17]), |
| .mask_17(masks[17]), |
| .filter_18(filters[18]), |
| .mask_18(masks[18]), |
| .filter_19(filters[19]), |
| .mask_19(masks[19]), |
| .read_fifo(read_fifo), |
| //tx mailbox output to TCU |
| .tx_done(tx_done), //add to TCU |
| .tx_arb_loss(tx_arb_loss),//add to TCU |
| .tx_pkt_ready(tx_pkt_ready), |
| .tx_ID(tx_ID), |
| .tx_pkt_size(tx_pkt_size), |
| .tx_RTR(tx_RTR), |
| .tx_EXT(tx_EXT), |
| .tx_data(tx_data) |
| ); |
| |
| CAN_receiver U2 ( |
| .clk(CAN_clk), |
| .nRST(CAN_nRST), |
| .TS1(TS1), |
| .TS2(TS2), |
| .CANRX(CANRX), |
| .tx_busy(tx_busy), |
| .error_state(error_state), |
| .fifo_clear(fifo_clear), |
| .enable_overrun(overrun_enable), |
| .mask_enable(mask_enable), |
| .filter_0(filters[0]), |
| .mask_0(masks[0]), |
| .filter_1(filters[1]), |
| .mask_1(masks[1]), |
| .filter_2(filters[2]), |
| .mask_2(masks[2]), |
| .filter_3(filters[3]), |
| .mask_3(masks[3]), |
| .filter_4(filters[4]), |
| .mask_4(masks[4]), |
| .filter_5(filters[5]), |
| .mask_5(masks[5]), |
| .filter_6(filters[6]), |
| .mask_6(masks[6]), |
| .filter_7(filters[7]), |
| .mask_7(masks[7]), |
| .filter_8(filters[8]), |
| .mask_8(masks[8]), |
| .filter_9(filters[9]), |
| .mask_9(masks[9]), |
| .filter_10(filters[10]), |
| .mask_10(masks[10]), |
| .filter_11(filters[11]), |
| .mask_11(masks[11]), |
| .filter_12(filters[12]), |
| .mask_12(masks[12]), |
| .filter_13(filters[13]), |
| .mask_13(masks[13]), |
| .filter_14(filters[14]), |
| .mask_14(masks[14]), |
| .filter_15(filters[15]), |
| .mask_15(masks[15]), |
| .filter_16(filters[16]), |
| .mask_16(masks[16]), |
| .filter_17(filters[17]), |
| .mask_17(masks[17]), |
| .filter_18(filters[18]), |
| .mask_18(masks[18]), |
| .filter_19(filters[19]), |
| .mask_19(masks[19]), |
| .read_fifo(read_fifo), |
| .ACK(ACK), |
| .busy(rx_busy), |
| .bitstuff_error(bitstuff_error), |
| .form_error(form_error), |
| .rx_err_code(rx_err_code), |
| .CRC_Error(CRC_Error), |
| .bitstrobe(bitstrobe), |
| .tx_strobe(tx_strobe), |
| .curr_sample(curr_sample), |
| .occupancy(occupancy), |
| .full(full), |
| .empty(empty), |
| .overrun(overrun), |
| .data_L(data_L), |
| .data_H(data_H), |
| .ID_out(ID_out), |
| .pkt_size_out(pkt_size_out), |
| .RTR_out(RTR_out), |
| .EXT_out(EXT_out), |
| .fmi_out(fmi_out), |
| .fifo_read(fifo_read) |
| ); |
| |
| TCU U3 ( |
| .clk(wb_clk_i), |
| .tx_strobe(tx_strobe), |
| .bitstrobe(bitstrobe), |
| .nRST(CAN_nRST), |
| .pkt_ready(tx_pkt_ready), |
| .tx_enable(tx_enable), |
| .rx_busy(rx_busy), |
| .byte_num(tx_byte_num), |
| .byte_complete(tx_byte_complete), |
| .enddata(tx_end_data), |
| .pkt_size(tx_pkt_size), |
| .msg_id(tx_ID), |
| .data(tx_data), |
| .RTR(tx_RTR), |
| .EXT(tx_EXT), |
| .curr_sample(curr_sample), |
| .start_err_tx(start_err_tx), |
| .error_state(error_state), |
| .busy(tx_busy), |
| .Dataphase(tx_dataphase), |
| .bitstuff(tx_bitstuff), |
| .CANTX(CAN_out), |
| .bit_error(bit_error), |
| .ack_error(ack_error), |
| .tx_err_code(tx_err_code), |
| .tx_arb_loss(tx_arb_loss), |
| .tx_done(tx_done) |
| ); |
| |
| tx_timer U4 ( |
| .nRST(CAN_nRST), |
| .tx_strobe(tx_strobe), |
| .dataphase(tx_dataphase), |
| .bitstuff(tx_bitstuff), |
| .pkt_size(tx_pkt_size), |
| .byte_complete(tx_byte_complete), |
| .byte_num(tx_byte_num), |
| .end_data(tx_end_data) |
| ); |
| |
| ECU U5 ( |
| .bitstrobe(bitstrobe), |
| .tx_strobe(tx_strobe), |
| .nRST(CAN_nRST), |
| .curr_sample(curr_sample), |
| .rx_bitstuff_error(bitstuff_error), |
| .rx_form_error(form_error), |
| .rx_crc_error(CRC_Error), |
| .tx_bit_error(bit_error), |
| .tx_ack_error(ack_error), |
| .rx_code(rx_err_code), |
| .tx_code(tx_err_code), |
| .start_err_tx(start_err_tx), |
| .TEC(TEC), |
| .REC(REC), |
| .error_state(error_state), |
| .LEC(LEC) |
| ); |
| |
| endmodule |