基于FPGA的VHDL语言设计控制器SJA1000的IP软核设计

分析了can控制器sja1000的特点及can协议通信格式。设计了控制器sja1000的ip软核,能为应用提供一个性能优良的、易于移植的控制器sja1000,实现了对步进电机的控制。
控制局域网(can)属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。与一般的通信总线相比,can总线的数据通信可靠性、实时性和灵活性好,应用领域非常广泛,通常基于arm或51单片机,实现与can控制器的通信联络。fpga/sopc技术是实现嵌入式系统的最高形式,基于ip软核的设计与应用也必将成为替代硬核的一种发展趋势。凭借quartusli和niosii工具,基于fpga的vhdl(或verilog)语言设计的ip核能够提供灵活性和性能更好的控制器。
图1为一个基于fpga的控制器的can总线节点。其中pca82c251是can总线接收器,sja1000是can总线通信控制器,pmm8713是驱动步进电机的脉冲分配器,fpga模块在节点模型中对sja1000进行控制,并将接收到的帧信息进行处理,发送给脉冲分配器,以驱动步进电机。
在设计中采用自顶向下的设计方法。通过分析sja1000常用的控制芯片51单片机的功能,将其分为主要的4个模块:初始化模块、位查询模块、数据处理模块和缓冲区释放模块。
对sja1000完成控制功能的过程用状态图描述如图2所示,这也是系统的主状态机。4个状态对应上述的4个功能模块,首先在initial_st-ate完成对sja1000的初始化,在由init_end信号给出初始化完成标志后,进入查询状态,即query_rbs状态,由位查询模块完成此时对sja100 0的状态查询。如果查询到sja1000缓冲区有帧信息,将qrbs_end置“1”,进入下一个状态frame_cope,即帧处理状态,此时由数据处理模块完成对缓冲区的数据读取,并作处理。在读取完一帧数据后,需要释放缓冲区,为下一帧信息的接收做准备。此时状态转入了release_buff-er,对应功能模块中的缓冲区释放模块,此状态结束后又转入位查询状态,为下一帧信息接收做准备。
初始化模块主要在系统上电或重启后,先对sja1000进行初始化;位查询模块是在初始化完成后,对sja1000状态寄存器的接收缓冲区标志位不断进行查询,如果在缓冲区收到一帧信息后,则转入数据处理模块,否则继续进行查询;数据处理模块则是在查询到接收缓冲区有数据后,读入帧数据,并对帧数据进行处理;缓冲区释放模块是在一帧信息处理完毕后,释放缓冲区空间。
除了上述4个功能模块之外,还需要读写模块、双端口模块、模块接口控制逻辑等。
1 、读写模块
由sja1000的数据手册可知,sja1000提供的微处理器接口信号有地址数据复用总线ad0~ad7、地址锁存信号ale、片选信号、读写使能信号和、以及复位信号。
sja1000的数据信号和地址信号是时分复用的,而fpga中不存在地址的概念,对于fpga来说,输出的只有数据。因此设计的关键就是把s-ja1000中的寄存器地址当成数据写入到sja1000中,配合地址锁存信号ale和写允许信号完成对sja1000特定寄存器的命令字写入。读写使能信号是、以及复位信号。设计的关键就是把sja1000中的寄存器地址当成数据写入到sja1000中,配合地址锁存信号ale和写允许信号完成对sja1000特定寄存器的命令字写入。与写操作相似,只需严格按照时序,将ale、、、引脚的电平互相配合置高或置低,即可完成读操作。读写周期时序图如图3和图4所示。
设计时采用状态机的形式,由读写时序图可以看到,与sja1000读写相关的控制信号有ale、、、。无论读写,都必须先输出地址,由接口控制逻辑模块输入地址。ad[7..0]是数据双向流通的,由双端口模块组成,读写模块与之相接口,输入、输出设计分开。读写模块在与接口控制逻辑接口模块相连接时,输出的数据与输入的数据也设计分开。同样读写模块的开启信号与读/写选择信号也由接口控制逻辑给出。由quartusli生成的读写模块如图5所示。
在idle状态等待,当4个功能模块中需要使用读写功能时,由接口控制模块控制使该功能模块与读写模块连接,相应的功能模块输出地址到读写模块,接口控制模块配合给出读写选择信号,然后进入address状态,输出地址到sja1000,判断读写选择信号后,进入读状态或者写状态。在读写子状态只需按照时序图输出ale、cs、wr、rd的值即可,标志信号w_ok表示一次读/写完成。
在sja1000的读写过程中,对各个信号的持续时间有着严格的要求。以读操作为例,信号的有效持续时间必须最大为50 ns,因此在设计中,信号保持低电平的时间可以比这个时间长。
2、 接口控制逻辑模块
接口控制逻辑是本系统的核心模块,它与4个功能模块、读写模块相连接,由一个状态机组成,即系统的主状态机。在状态机的不同状态中,控制读写状态机与对应的功能模块相连接,3个模块互相配合完成一项功能。quartusli生成的模块图如6所示。
每一个功能模块都有对应的接口信号,而data_in_infer、addr_out_infer、data_in_infer、w_ok_in、r_ok_in是读写模块的信号接口。
需要注意的是,本系统中使用了主从状态机,即状态机的嵌套。在主状态进入初始化状态机后,立即给出一个enable信号,启动从状态机,并设置一个从状态机的完成信号finish(高电平有效),且初始值为低,然后在主状态机不停的检测finish信号,如果finish为高,则进入下一个状态,查询状态。而在从状态机中,则不停地检测enable信号,如果为高,则开始工作,当完成从状态机后,将finish信号置高。如此就完成了主从状态机的互动。接口控制逻辑模块中的start、end信号即为系统主从状态机互动信号。
3 、初始化模块
初始化模块的功能是完成sja1000的初始化。can2.0b规范允许sja1000工作在两种模式,即basiccan模式和pelican模式,上电默认为basiccan模式。在两种模式下都需要对sja1000的模式寄存器cr、验收码寄存器acr、验收屏蔽寄存器amr、总线定时寄存器btr0、btr1和输出控制寄存器ocr写入控制命令。
在本设计中,借用rom的思想,将需要读写的寄存器地址和数据统一编码,固化存储起来,对sja1000进行读写时,只需要按照一定的顺序读出数据和地址,输出到即可。
4 、位查询模块
位查询模块主要功能是在sja1000转入工作模式后能够读取存在接受缓冲区rxfifo的帧信息,在本设计中读取帧信息采用了查询方式,即不停地查询sja1000状态寄存器sr的rbs位,如果查询到rbs位为“1”,即表明接收缓冲区满,rxfifo中有可用信息,此时将转入数据处理模块,由数据处理模块进行数据读入,并进行处理。在查询过程中,对sja1000的状态寄存器进行了读操作。
5、 数据处理模块
数据处理模块功能是从sja1000的缓冲区读入数据,并作处理。在读入数据时,只需将输出的地址定位到sja1000接收缓冲区的数据场依次将数据从缓冲区读入即可。在can总线的通信中,发送的为帧信息,其数据帧结构如图7所示。
在对数据进行处理时,前16位为id,有用的数据是在帧中的数据场(data field)中,因此只需略过前16位,对后面最多8个字节的数据进行处理,分配到步进电机的引脚上即可。
6、 缓冲区释放模块与双端口模块
在缓冲区的数据被读入后,需要对缓冲区的数据清零,为后续的数据读入做准备。本质上仍是对sja1000的命令寄存器(cmr)写操作。在状态寄存器与接收缓冲区相关的位为rrb,置1即可释放缓冲区,这样就会导致接收缓冲区内的另一条信息立即有效,从而进入下一帧数据的数据查询、处理过程。
在本设计中,输出的数据引脚为双向引脚,设计成三态输出,这是因为双向端口在完成输入功能时,必须使端口处于高阻态,否则外部数据不能正确读入。
其设计关键在于,实体部分必须对端口属性进行申明,端口属性必须为inout类型,在构造体对输出信号进行有条件的高阻控制。
结语
can总线接口控制器由vhdl语言描述,易于修改和移植,可以将几个软核集成到一个fpga芯片上去,具有单片机所没有的优势,在汽车领域具有良好的应用前景。


三星贴片电容怎么测量好坏?出现双倍电压会产生什么影响?
AMETEK程控电源部发布Asterion系列交直流电源的3kVA新型号 ——具有高功率密度和易用触摸屏的新星产品
行业巨头争入智能家居市场 个性化的体验是关键
红外线测温仪设计难点及注意事项
亲见H1智能座机体验 沟通无价
基于FPGA的VHDL语言设计控制器SJA1000的IP软核设计
锂电池测试常见标准汇总
双向晶闸管和双向可控硅的区别
红米pro2什么时候上市?红米pro2与小米6一同归来,6G+128G+骁龙660!本月底自见分晓
气相色谱仪易发故障及检修
紫光展锐上线全新中端5G芯片平台——T765
Redmi小爱音箱Play正式开启预约售价为79元
大疆加入无人机集成试点计划 提升了无人机的安全性和效率优势
不止坚果?罗永浩曝发布会新机:128G
魅族pro7什么时候上市?魅族pro7最新消息:魅族性价比最好的机型会是魅族pro7吗?降价一年后比小米6还要贵?
分享智能家居发展主旋律:协同、融合、共生
技术资讯 I PCB 设计中的高速模拟版图设计技巧
N5227A网络分析仪
全球最大的氢气燃料电池展览在日本东京 Tokyo Big Sight开展
大尺寸触控面板结构是怎么样的?趋势又将如何?