今天调试了一个模块,多路步进点击的驱动,这个模块有data数据输入信号,包含了五个电机的脉冲数,有done信号,表示五路电机处理完了这一帧的数据。
因为你各路的处理情况不同,每一路都写了自己的分频器,计数器,但是需要统一的done信号表示所有的信号都完成了,一开始我是这样写的:
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
done_cnt <= 0;
done <= 0;
end
else if((flag1) || (flag2)|| (fla3)|| (flag4)|| (flag5))begin
if(done_cnt==4)begin
done <= 1;
done_cnt <= 0;
end
else
done_cnt <= done_cnt +1;
else begin
done_cnt <= done_cnt;
done <= 0;
end
之后用testbench调试时发现波形比较乱,和插补的数据不一致,后来一个模块一个模块地查,是最后的驱动模块对数据处理地不正确,结合自己写的感觉,觉得这一处可能不够严谨,多轴插补的每一次处理都是每个电机的同时转或者不转,如果多路同时完成,即在同一个系统时钟下,多路flag信号(各个电机的完成信号,也是单位脉冲信号)为高电平,那么上面写的代码就不严谨,它会造成少加一次甚至多次的错误,所以我尝试性地修改了一下,变成下面的一段:
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
pul1_done_r <= 0;
pul2_done_r <= 0;
pul3_done_r <= 0;
pul4_done_r <= 0;
pul5_done_r <= 0;
end
else if((flag1) || (flag2)|| (flag3)|| (flag4)|| (flag5))begin
if(flag1)
pul1_done_r <= 1;
if(flag2)
pul2_done_r <= 1;
if(flag3)
pul3_done_r <= 1;
if(flag4)
pul4_done_r <= 1;
if(flag5)
pul5_done_r <= 1;
end
else if(Data_done)begin
pul1_done_r <= 0;
pul2_done_r <= 0;
pul3_done_r <= 0;
pul4_done_r <= 0;
pul5_done_r <= 0;
end
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
done_r <= 0;
end
else if(pul1_done_r && pul2_done_r && pul3_done_r && pul4_done_r && pul5_done_r)
done_r <= 1;
else
done_r <= 0;
assign done = Data_done_r &&(pul1_done_r && pul2_done_r && pul3_done_r && pul4_done_r && pul5_done_r);
修改之后就正常了,当然,上面的代码还是有点不够简洁,不过我懒得修改了。
最后附上一张仿真图,纪念纪念