如何用FPGA实现CAN总线通信控制器_第1页
如何用FPGA实现CAN总线通信控制器_第2页
如何用FPGA实现CAN总线通信控制器_第3页
如何用FPGA实现CAN总线通信控制器_第4页
如何用FPGA实现CAN总线通信控制器_第5页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何用FPGA实现CAN总线通信控制器CAN总线(ControllerAreaNetwork)是控制器局域网的简称,是20世纪80年代初德国BOSCH公司为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信协议。目前,CAN总线已经被列入ISO国际标准,称为ISO11898。CAN总线已经成为工业数据通信的主流技术之一。CAN总线作为数字式串行通信技术,与其他同类技术相比,在可靠性、实时性和灵活性方面具有独特的技术优势,主要特点如下:CAN总线是一种多主总线,总线上任意节点可在任意时刻主动地向网络上其他节点发送信息而不分主次,因此可在各节点之间实现自由通信。CAN总线采用非破坏性总线仲裁技术。但多个节点同时向总线发送信息时,优先级低的节点会主动退出发送,而最高优先级的节点可以不受影响地继续传输数据,从而大大节省总线冲突的仲裁时间。即使在网络负载很重的情况下也不会发生网络瘫痪情况。CAN总线的通信介质可以是双绞线、同轴电缆或光导纤维,选择灵活。CAN总线的通信速率可达1Mbit/s(此时通信距离最长为40米),通信距离最远可达10km(速率在5kbit/s以下)。CAN总线上的节点信息分成不同的优先级,可以满足不同级别的实时要求,高优先级的数据可以在134μs内得到传输。CAN总线通过报文滤波即可实现点对点、一点对多点及全局广播等几种方式传送数据,无需专门的调度。CAN总线的数据采用短帧结构,传输时间短,受干扰概率低,具有极好的检错效果。CAN总线采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。CAN总线上的器件可被置于无任何内部活动的睡眠方式,相当于未连接到总线上,可以有效降低系统功耗。CAN总线上的节点在错误严重的情况下具有自动关闭输出的功能,以使总线上其他节点的操作不受影响。CAN总线卓越的特性、极高的可靠性和独特的设计,特别适合工业过程中监控设备的互连,因此,越来越受到工业界的重视,并被公认为是最有前途的现场总线之一。另外,CAN总线协议已被国际标准化组织认可,技术比较成熟,控制的芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数通讯。CAN总线插卡可以任意插在PCATXT兼容机上,方便地构成分布式监控系统。因此,用FPGA实现CAN总线通信控制器具有非常重要的应用价值。本篇将通过一个实例讲解利用FPGA实现CAN总线通信控制器的实现方法。第三篇内容摘要:本篇会介绍程序的仿真与测试以及总结等相关内容。四、程序的仿真与测试CAN总线通信控制器的仿真程序,需要模拟数据的发送和接收。下面是测试程序的部分代码://连接can_top模块can_topi_can_top(.cs_can_i(cs_can),.clk_i(clk),.rx_i(rx_and_tx),.tx_o(tx),.irq_on(irq),.clkout_o(clkout));//产生24MHz时钟initialbeginclk=0;forever#21clk=~clk;end//初始化initialbeginstart_tb=0;cs_can=0;rx=1;extended_mode=0;tx_bypassed=0;rst_i=1‘b0;ale_i=1’b0;rd_i=1‘b0;wr_i=1’b0;port_0_o=8‘h0;port_0_en=0;port_free=1;rst_i=1;#200rst_i=0;#200start_tb=1;end//产生延迟的tx信号(CAN发送器延迟)alwaysbeginwait(tx);repeat(4*BRP)@(posedgeclk);//4timequantsdelay#1delayed_tx=tx;wait(~tx);repeat(4*BRP)@(posedgeclk);//4timequantsdelay#1delayed_tx=tx;endassignrx_and_tx=rx&(delayed_tx|tx_bypassed);//Whenthissignalison,txisnotloopedbacktotherx.//主程序initialbeginwait(start_tb);//设置总线时序寄存器write_register(8’d6,{`CAN_TIMING0_SJW,`CAN_TIMING0_BRP});write_register(8‘d7,{`CAN_TIMING1_SAM,`CAN_TIMING1_TSEG2,`CAN_TIMING1_TSEG1});//设置时钟分频寄存器extended_mode=1’b0;write_register(8‘d31,{extended_mode,3’h0,1‘b0,3’h0});//Settingthenormalmode(notextended)//设置接收代码和接收寄存器write_register(8‘d16,8’ha6);//acceptancecode0write_register(8‘d17,8’hb0);//acceptancecode1write_register(8‘d18,8’h12);//acceptancecode2write_register(8‘d19,8’h30);//acceptancecode3write_register(8‘d20,8’h0);//acceptancemask0write_register(8‘d21,8’h0);//acceptancemask1write_register(8‘d22,8’h00);//acceptancemask2write_register(8‘d23,8’h00);//acceptancemask3write_register(8‘d4,8’he8);//acceptancecodewrite_register(8‘d5,8’h0f);//acceptancemask#10;repeat(1000)@(posedgeclk);//开关复位模式write_register(8‘d0,{7’h0,~(`CAN_MODE_RESET)});repeat(BRP)@(posedgeclk);//在复位后设置总线空闲repeat(11)send_bit(1);test_full_fifo;//testcurrentlyswitchedonsend_frame;//testcurrentlyswitchedoffbus_off_test;//testcurrentlyswitchedoffforced_bus_off;//testcurrentlyswitchedoffsend_frame_basic;//testcurrentlyswitchedoffsend_frame_extended;//testcurrentlyswitchedoffself_reception_request;//testcurrentlyswitchedoffmanual_frame_basic;//testcurrentlyswitchedoffmanual_frame_ext;//testcurrentlyswitchedoff$display(“CANTestbenchfinished!”);$stop;end在测试过程中通过多个任务来分别验证程序的各个功能模块。下面的程序用于验证强制关闭总线任务://强制关闭总线任务taskforced_bus_off;//Forcingbus-offbywritinftotx_err_cntregisterbegin//切换到复位模式write_register(8‘d0,{7’h0,`CAN_MODE_RESET});//设置时钟分频寄存器write_register(8‘d31,{1’b1,7‘h0});//Settingtheextendedmode(notnormal)//写数据到寄存器中write_register(8’d15,255);//切换复位模式write_register(8‘d0,{7’h0,~(`CAN_MODE_RESET)});#2500000;//切换复位模式write_register(8‘d0,{7’h0,`CAN_MODE_RESET});//写数据到寄存器中write_register(8‘d15,245);//关闭复位模式write_register(8’d0,{7‘h0,~(`CAN_MODE_RESET)});#1000000;endendtask//forced_bus_off下面的程序验证如何发送一个基本格式的帧数据://发送一个基本格式的帧taskmanual_frame_basic;begin//切换到复位模式write_register(8’d0,{7‘h0,(`CAN_MODE_RESET)});//设置寄存器write_register(8’d4,8‘h28);//acceptancecodewrite_register(8’d5,8‘hff);//acceptancemaskrepeat(100)@(posedgeclk);//切换复位模式write_register(8’d0,{7‘h0,~(`CAN_MODE_RESET)});//模块复位后设置总线空闲repeat(11)send_bit(1);write_register(8’d10,8‘h55);//WritingID[10:3]=0x55write_register(8’d11,8‘h57);//WritingID[2:0]=0x2,rtr=1,length=7write_register(8’d12,8‘h00);//databyte1write_register(8’d13,8‘h00);//databyte2write_register(8’d14,8‘h00);//databyte3write_register(8’d15,8‘h00);//databyte4write_register(8’d16,8‘h00);//databyte5write_register(8’d17,8‘h00);//databyte6write_register(8’d18,8‘h00);//databyte7write_register(8’d19,8‘h00);//databyte8tx_bypassed=1;//Whenthissignalison,txisnotloopedbacktotherx.forkbeginself_reception_request_command;endbegin#2200;repeat(1)//开始发送数据beginsend_bit(0);//帧起始send_bit(0);//IDsend_bit(1);//IDsend_bit(0);//IDsend_bit(1);//IDsend_bit(0);//IDsend_bit(1);//IDsend_bit(0);//IDsend_bit(1);//IDsend_bit(0);//IDsend_bit(1);//IDsend_bit(0);//IDsend_bit(1);//RTRsend_bit(0);//IDEsend_bit(0);//r0send_bit(0);//DLCsend_bit(1);//DLCsend_bit(1);//DLCsend_bit(1);//DLCsend_bit(1);//CRCsend_bit(1);//CRCsend_bit(0);//CRCstuffsend_bit(0);//CRC6send_bit(0);//CRCsend_bit(0);//CRCsend_bit(0);//CRCsend_bit(1);//CRCstuffsend_bit(0);//CRC0send_bit(0);//CRCsend_bit(1);//CRCsend_bit(0);//CRCsend_bit(1);//CRC5send_bit(1);//CRCsend_bit(0);//CRCsend_bit(1);//CRCsend_bit(1);//CRCbsen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论