⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_registers.v

📁 主要是说明can总线协议使用fpga的ip核实现
💻 V
📖 第 1 页 / 共 3 页
字号:
/* End: Tx data registers */reg           tx_successful_q;reg           overrun_q;reg           overrun_status;reg           transmission_complete;reg           transmit_buffer_status_q;reg           receive_buffer_status;reg           error_status_q;reg           node_bus_off_q;reg           node_error_passive_q;reg           transmit_buffer_status;reg           single_shot_transmission;reg           self_rx_request;reg           irq_n;// Some interrupts exist in basic mode and in extended mode. Since they are in different registers they need to be multiplexed.wire          data_overrun_irq_en;wire          error_warning_irq_en;wire          transmit_irq_en;wire          receive_irq_en;wire    [7:0] irq_reg;wire          irq;wire we_mode                  = cs & we & (addr == 8'd0);wire we_command               = cs & we & (addr == 8'd1);wire we_bus_timing_0          = cs & we & (addr == 8'd6) & reset_mode;wire we_bus_timing_1          = cs & we & (addr == 8'd7) & reset_mode;wire we_clock_divider_low     = cs & we & (addr == 8'd31);wire we_clock_divider_hi      = we_clock_divider_low & reset_mode;wire read = cs & (~we);wire read_irq_reg = read & (addr == 8'd3);assign read_arbitration_lost_capture_reg = read & extended_mode & (addr == 8'd11);assign read_error_code_capture_reg = read & extended_mode & (addr == 8'd12);/* This section is for BASIC and EXTENDED mode */wire we_acceptance_code_0       = cs & we &   reset_mode  & ((~extended_mode) & (addr == 8'd4)  | extended_mode & (addr == 8'd16));wire we_acceptance_mask_0       = cs & we &   reset_mode  & ((~extended_mode) & (addr == 8'd5)  | extended_mode & (addr == 8'd20));wire we_tx_data_0               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd10) | extended_mode & (addr == 8'd16)) & transmit_buffer_status;wire we_tx_data_1               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd11) | extended_mode & (addr == 8'd17)) & transmit_buffer_status;wire we_tx_data_2               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd12) | extended_mode & (addr == 8'd18)) & transmit_buffer_status;wire we_tx_data_3               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd13) | extended_mode & (addr == 8'd19)) & transmit_buffer_status;wire we_tx_data_4               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd14) | extended_mode & (addr == 8'd20)) & transmit_buffer_status;wire we_tx_data_5               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd15) | extended_mode & (addr == 8'd21)) & transmit_buffer_status;wire we_tx_data_6               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd16) | extended_mode & (addr == 8'd22)) & transmit_buffer_status;wire we_tx_data_7               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd17) | extended_mode & (addr == 8'd23)) & transmit_buffer_status;wire we_tx_data_8               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd18) | extended_mode & (addr == 8'd24)) & transmit_buffer_status;wire we_tx_data_9               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd19) | extended_mode & (addr == 8'd25)) & transmit_buffer_status;wire we_tx_data_10              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd26)) & transmit_buffer_status;wire we_tx_data_11              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd27)) & transmit_buffer_status;wire we_tx_data_12              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd28)) & transmit_buffer_status;/* End: This section is for BASIC and EXTENDED mode *//* This section is for EXTENDED mode */wire   we_interrupt_enable      = cs & we & (addr == 8'd4)  & extended_mode;wire   we_error_warning_limit   = cs & we & (addr == 8'd13) & reset_mode & extended_mode;assign we_rx_err_cnt            = cs & we & (addr == 8'd14) & reset_mode & extended_mode;assign we_tx_err_cnt            = cs & we & (addr == 8'd15) & reset_mode & extended_mode;wire   we_acceptance_code_1     = cs & we & (addr == 8'd17) & reset_mode & extended_mode;wire   we_acceptance_code_2     = cs & we & (addr == 8'd18) & reset_mode & extended_mode;wire   we_acceptance_code_3     = cs & we & (addr == 8'd19) & reset_mode & extended_mode;wire   we_acceptance_mask_1     = cs & we & (addr == 8'd21) & reset_mode & extended_mode;wire   we_acceptance_mask_2     = cs & we & (addr == 8'd22) & reset_mode & extended_mode;wire   we_acceptance_mask_3     = cs & we & (addr == 8'd23) & reset_mode & extended_mode;/* End: This section is for EXTENDED mode */always @ (posedge clk)begin  tx_successful_q           <=#Tp tx_successful;  overrun_q                 <=#Tp overrun;  transmit_buffer_status_q  <=#Tp transmit_buffer_status;  error_status_q            <=#Tp error_status;  node_bus_off_q            <=#Tp node_bus_off;  node_error_passive_q      <=#Tp node_error_passive;end/* Mode register */wire   [0:0] mode;wire   [4:1] mode_basic;wire   [3:1] mode_ext;wire         receive_irq_en_basic;wire         transmit_irq_en_basic;wire         error_irq_en_basic;wire         overrun_irq_en_basic;can_register_asyn_syn #(1, 1'h1) MODE_REG0( .data_in(data_in[0]),  .data_out(mode[0]),  .we(we_mode),  .clk(clk),  .rst(rst),  .rst_sync(set_reset_mode));can_register_asyn #(4, 0) MODE_REG_BASIC( .data_in(data_in[4:1]),  .data_out(mode_basic[4:1]),  .we(we_mode),  .clk(clk),  .rst(rst));can_register_asyn #(3, 0) MODE_REG_EXT( .data_in(data_in[3:1]),  .data_out(mode_ext[3:1]),  .we(we_mode & reset_mode),  .clk(clk),  .rst(rst));assign reset_mode             = mode[0];assign listen_only_mode       = extended_mode & mode_ext[1];assign self_test_mode         = extended_mode & mode_ext[2];assign acceptance_filter_mode = extended_mode & mode_ext[3];assign receive_irq_en_basic  = mode_basic[1];assign transmit_irq_en_basic = mode_basic[2];assign error_irq_en_basic    = mode_basic[3];assign overrun_irq_en_basic  = mode_basic[4];/* End Mode register *//* Command register */wire   [4:0] command;can_register_asyn_syn #(1, 1'h0) COMMAND_REG0( .data_in(data_in[0]),  .data_out(command[0]),  .we(we_command),  .clk(clk),  .rst(rst),  .rst_sync(command[0] & sample_point | reset_mode));can_register_asyn_syn #(1, 1'h0) COMMAND_REG1( .data_in(data_in[1]),  .data_out(command[1]),  .we(we_command),  .clk(clk),  .rst(rst),  .rst_sync(sample_point & (tx_request | (abort_tx & ~transmitting)) | reset_mode));can_register_asyn_syn #(2, 2'h0) COMMAND_REG( .data_in(data_in[3:2]),  .data_out(command[3:2]),  .we(we_command),  .clk(clk),  .rst(rst),  .rst_sync(|command[3:2] | reset_mode));can_register_asyn_syn #(1, 1'h0) COMMAND_REG4( .data_in(data_in[4]),  .data_out(command[4]),  .we(we_command),  .clk(clk),  .rst(rst),  .rst_sync(command[4] & sample_point | reset_mode));always @ (posedge clk or posedge rst)begin  if (rst)    self_rx_request <= 1'b0;  else if (command[4] & (~command[0]))    self_rx_request <=#Tp 1'b1;  else if ((~tx_state) & tx_state_q)    self_rx_request <=#Tp 1'b0;endassign clear_data_overrun = command[3];assign release_buffer = command[2];assign tx_request = command[0] | command[4];assign abort_tx = command[1] & (~tx_request);always @ (posedge clk or posedge rst)begin  if (rst)    single_shot_transmission <= 1'b0;  else if (tx_request & command[1] & sample_point)    single_shot_transmission <=#Tp 1'b1;  else if ((~tx_state) & tx_state_q)    single_shot_transmission <=#Tp 1'b0;end/*can_register_asyn_syn #(1, 1'h0) COMMAND_REG_OVERLOAD  // Uncomment this to enable overload requests !!!( .data_in(data_in[5]),  .data_out(overload_request),  .we(we_command),  .clk(clk),  .rst(rst),  .rst_sync(overload_frame & ~overload_frame_q));reg           overload_frame_q;always @ (posedge clk or posedge rst)begin  if (rst)    overload_frame_q <= 1'b0;  else    overload_frame_q <=#Tp overload_frame;end*/assign overload_request = 0;  // Overload requests are not supported, yet !!!/* End Command register *//* Status register */wire   [7:0] status;assign status[7] = node_bus_off;assign status[6] = error_status;assign status[5] = transmit_status;assign status[4] = receive_status;assign status[3] = transmission_complete;assign status[2] = transmit_buffer_status;assign status[1] = overrun_status;assign status[0] = receive_buffer_status;always @ (posedge clk or posedge rst)begin  if (rst)    transmission_complete <= 1'b1;  else if (tx_successful & (~tx_successful_q) | abort_tx)    transmission_complete <=#Tp 1'b1;  else if (tx_request)    transmission_complete <=#Tp 1'b0;endalways @ (posedge clk or posedge rst)begin  if (rst)    transmit_buffer_status <= 1'b1;  else if (tx_request)    transmit_buffer_status <=#Tp 1'b0;  else if (reset_mode || !need_to_tx)    transmit_buffer_status <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin  if (rst)    overrun_status <= 1'b0;  else if (overrun & (~overrun_q))    overrun_status <=#Tp 1'b1;  else if (reset_mode || clear_data_overrun)    overrun_status <=#Tp 1'b0;endalways @ (posedge clk or posedge rst)begin  if (rst)    receive_buffer_status <= 1'b0;  else if (reset_mode || release_buffer)    receive_buffer_status <=#Tp 1'b0;  else if (~info_empty)    receive_buffer_status <=#Tp 1'b1;end/* End Status register *//* Interrupt Enable register (extended mode) */wire   [7:0] irq_en_ext;wire         bus_error_irq_en;wire         arbitration_lost_irq_en;wire         error_passive_irq_en;wire         data_overrun_irq_en_ext;wire         error_warning_irq_en_ext;wire         transmit_irq_en_ext;wire         receive_irq_en_ext;can_register #(8) IRQ_EN_REG( .data_in(data_in),  .data_out(irq_en_ext),  .we(we_interrupt_enable),  .clk(clk));assign bus_error_irq_en             = irq_en_ext[7];assign arbitration_lost_irq_en      = irq_en_ext[6];assign error_passive_irq_en         = irq_en_ext[5];assign data_overrun_irq_en_ext      = irq_en_ext[3];assign error_warning_irq_en_ext     = irq_en_ext[2];assign transmit_irq_en_ext          = irq_en_ext[1];assign receive_irq_en_ext           = irq_en_ext[0];/* End Bus Timing 0 register *//* Bus Timing 0 register */wire   [7:0] bus_timing_0;can_register #(8) BUS_TIMING_0_REG( .data_in(data_in),  .data_out(bus_timing_0),  .we(we_bus_timing_0),  .clk(clk));assign baud_r_presc = bus_timing_0[5:0];assign sync_jump_width = bus_timing_0[7:6];/* End Bus Timing 0 register *//* Bus Timing 1 register */wire   [7:0] bus_timing_1;can_register #(8) BUS_TIMING_1_REG( .data_in(data_in),  .data_out(bus_timing_1),  .we(we_bus_timing_1),  .clk(clk));assign time_segment1 = bus_timing_1[3:0];assign time_segment2 = bus_timing_1[6:4];assign triple_sampling = bus_timing_1[7];/* End Bus Timing 1 register *//* Error Warning Limit register */can_register_asyn #(8, 96) ERROR_WARNING_REG( .data_in(data_in),  .data_out(error_warning_limit),  .we(we_error_warning_limit),  .clk(clk),  .rst(rst));/* End Error Warning Limit register *//* Clock Divider register */wire   [7:0] clock_divider;wire         clock_off;wire   [2:0] cd;reg    [2:0] clkout_div;reg    [2:0] clkout_cnt;reg          clkout_tmp;can_register_asyn #(1, 0) CLOCK_DIVIDER_REG_7( .data_in(data_in[7]),  .data_out(clock_divider[7]),  .we(we_clock_divider_hi),  .clk(clk),  .rst(rst));assign clock_divider[6:4] = 3'h0;can_register_asyn #(1, 0) CLOCK_DIVIDER_REG_3( .data_in(data_in[3]),  .data_out(clock_divider[3]),  .we(we_clock_divider_hi),  .clk(clk),  .rst(rst));can_register_asyn #(3, 0) CLOCK_DIVIDER_REG_LOW( .data_in(data_in[2:0]),  .data_out(clock_divider[2:0]),  .we(we_clock_divider_low),  .clk(clk),  .rst(rst));assign extended_mode = clock_divider[7];assign clock_off     = clock_divider[3];assign cd[2:0]       = clock_divider[2:0];always @ (cd)begin  case (cd)                       /* synthesis full_case parallel_case */     3'b000 : clkout_div = 3'd0;    3'b001 : clkout_div = 3'd1;    3'b010 : clkout_div = 3'd2;    3'b011 : clkout_div = 3'd3;    3'b100 : clkout_div = 3'd4;    3'b101 : clkout_div = 3'd5;    3'b110 : clkout_div = 3'd6;    3'b111 : clkout_div = 3'd0;  endcaseendalways @ (posedge clk or posedge rst)begin  if (rst)    clkout_cnt <= 3'h0;  else if (clkout_cnt == clkout_div)    clkout_cnt <=#Tp 3'h0;  else    clkout_cnt <= clkout_cnt + 1'b1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -