加载中…
个人资料
ECON工业嵌入设备
ECON工业嵌入设备
  • 博客等级:
  • 博客积分:0
  • 博客访问:78,711
  • 关注人气:32
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

fpga发脉冲和同步的技术

(2013-11-13 22:46:03)
fpga发脉冲和stm32定时器发脉冲的区别,fpga很轻松的实现任意频率的脉冲发送,算法如下
脉冲的速度通过设置脉冲宽度来表示,例如23.5T(T为fpga的clk的时间),也就是说每23.5T,脉冲口就反转一次
我的verilog代码如下
    always @(posedge clk)
    begin
    if(mem[13][0] == 1'b1)//轴使能位
    begin
      if(counter < pwmsetreg)//如果小于设置的脉宽,则每脉冲累加一个
            counter <= counter+10000;//10000表示1.0000t,4位小数精度
        else//大于设置的脉宽
            begin
                plusecnt <= plusecnt + 1;//脉冲计数+1
                counter <= counter - pwmsetreg;//累计的脉宽时间=累计的脉冲时间-设置的脉宽时间,免于累计误差
            end
        if(counter >= pwmsetreg2)//一个pwm脉冲由低位和高位组成,根据pwmsetreg2输出低位和高位
            pwm = 1;
        else
            pwm = 0;
    end
    else//轴未使能的情况下面,归0
    begin
    counter <= 0;
    pwm = 0;
    end
    end


同步技术点主要是如下
因为stm32和fpga间的带宽为8位,无法保证多轴的设置同步生效,所以同步同步位来通知刷新,例如针对3个轴的同步,首先stm32利用8位的fsmc总线写三个轴的速度寄存器(32位),在每个轴的速度寄存器写好后,在同步字节中写入0x07,这样fpga看到同步位就设置新设置的速度寄存器,使之生效,这样很好的做到了速度设置的高同步。
对于多字节读也采用这样的技术,例如,64位的编码器位置寄存器读,如果不采用同步位,那么64位的寄存器可能不完整,最好的办法是根据同步位,将当前的64位编码器位置刷新到一个64位的读寄存器,fsmc只能直接读64位寄存器。




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有