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