fpga 关于模块内对多个计数的变量统一得出done信号的认识

今天调试了一个模块,多路步进点击的驱动,这个模块有data数据输入信号,包含了五个电机的脉冲数,有done信号,表示五路电机处理完了这一帧的数据。

因为你各路的处理情况不同,每一路都写了自己的分频器,计数器,但是需要统一的done信号表示所有的信号都完成了,一开始我是这样写的:

 

 

[email protected](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信号(各个电机的完成信号,也是单位脉冲信号)为高电平,那么上面写的代码就不严谨,它会造成少加一次甚至多次的错误,所以我尝试性地修改了一下,变成下面的一段:

 

[email protected](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

 

[email protected](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);

 

修改之后就正常了,当然,上面的代码还是有点不够简洁,不过我懒得修改了。

 

最后附上一张仿真图,纪念纪念

 

fpga 关于模块内对多个计数的变量统一得出done信号的认识