蹲实验室折腾了两天FPGA终于把BISS-C协议编码器的坑填了。这次实现的Verilog方案有点意思,直接上硬货说说实现要点
雷尼绍BISS-C协议编码器verilog源码支持18/26/32/36bit配置也可以方便改成其他非标配置支持最高10M时钟频率由于是用FPGA纯verilog编写 1)方便移植部署 2)可以支持多路编码器同时读取 3)成功在板卡跑通 4)CRC并行计算只需要一个时钟周期先说配置灵活性这个方案用parameter玩得飞起。比如数据位宽直接做成参数化设计需要改位宽的时候不用重新写代码改个参数值就能切到36bit模式parameter DATA_WIDTH 36; //18/26/32/36可调 parameter CRC_ENABLE 1; //CRC开关底层用generate语法实现位宽自适应自动生成对应位数的移位寄存器和CRC计算模块。实测从18bit切到36bit配置资源消耗只增加了23%的LUT算是比较经济的实现方式。重点说说CRC并行计算这个黑科技。传统串行CRC要等数据传完才能开始算咱们这个方案在数据移位的同时就并行计算CRC。看这段核心代码always (*) begin crc_next crc_current; for(int i0; iDATA_WIDTH; i) begin crc_next (crc_next 1) ^ (data_bit[i] ? POLY_REV : 0); end end这里用了组合逻辑展开循环把整个数据位的异或操作压缩到一个时钟周期完成。实测在Artix-7上跑10MHz时钟毫无压力时序余量还剩3.2ns。比起串行方案处理36bit数据能省下35个时钟周期这对实时性要求高的场合太关键了。雷尼绍BISS-C协议编码器verilog源码支持18/26/32/36bit配置也可以方便改成其他非标配置支持最高10M时钟频率由于是用FPGA纯verilog编写 1)方便移植部署 2)可以支持多路编码器同时读取 3)成功在板卡跑通 4)CRC并行计算只需要一个时钟周期多路支持靠的是模块化设计每个编码器通道独立实例化genvar i; generate for(i0; i4; i) begin : ENCODER_CHANNELS biss_c_decoder #( .DATA_WIDTH(32), .CRC_ENABLE(1) ) u_decoder( .clk(sys_clk), .rst(sys_rst), .sdi(sdi_bus[i]), //...其他信号 ); end endgenerate实测四路同时工作时每路时钟能跑到9.8MHz资源占用比单路只多了3.2倍得益于共享全局时钟和复位。注意要给每路单独分配IOBUF避免信号互相干扰。移植性方面做了三点优化1) 全局异步复位设计2) 无IP核依赖3) 时序约束用Tcl脚本动态生成。最近给赛灵思和Intel的板子都移植过基本上改改时钟约束和管脚分配就能跑起来。最后说个踩坑经验BISS-C的MA线响应时序要特别注意。代码里用状态机实现的超时检测模块帮了大忙always (posedge clk) begin case(state) IDLE: if(ma_trigger) begin timeout_cnt 24d10_000_000; //1秒超时 state WAIT_ACK; end WAIT_ACK: begin timeout_cnt timeout_cnt - 1; if(sdo_response) state DATA_READ; else if(!timeout_cnt) state ERROR; end //...其他状态 endcase end这个机制有效避免了从站无响应导致的死锁实测在工业现场电磁干扰环境下也能稳定工作。完整代码已经跑通在自研的电机控制板上配合千兆以太网能做多轴同步采集算是给运动控制方案攒了个趁手的轮子。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466493.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!