[X]关闭

PL部分实现旋转编码器测速遇到问题,求解

文档创建者:MasterYsu
浏览次数:2514
最后更新:2017-06-19
想拿ZYNQ做一个电机控制系统,PID和测速部分在PL部分实现,PS部分做可视化等。写了个旋转编码器测速的Verilog代码可是有部分总是被优化掉,求各路人士解答啊!
先介绍一下我用的编码器,A B相的,正转A超前B相90度,反转B超前A相90度。通过AB相的关系,来判断正反转。编码器转一圈A和B各有500个脉冲。
我现在想实现的功能是:PL部分对100Mhz进行计数,定时5ms对A相计数,通过在5ms内A相的脉冲数来计算转速,转速折合r/min的单位上。
现在的问题是,对于转速计算这部分的Verilog代码总是被优化掉。。。
下面是代码

module encoder(
input clk_i,
input rst_n,
input EncoderA_i,//编码器为500线
input EncoderB_i,
output Speed_o,
output Dir_o
    );
    reg [18:0] clk_cnt;//Fpga频率计数
    reg [18:0] Dir_A;//A相上升沿到来的计数
    reg [18:0] Dir_B;//B相上升沿到来的计数
    reg [31:0] speed=0;
    reg dir=0;//0 正方向 1反方向
    always@(posedge clk_i) begin
        if(rst_n==0) begin
            clk_cnt<=0;
            //speed<=0;
           // dir<=0;
         end
         else begin
            if(clk_cnt>=19'd50_0000) begin //100Mhz时钟计时5ms
                 clk_cnt<=0;
             end
            else clk_cnt<=clk_cnt+1'd1;           
         end
     end

     reg[18:0] A_cnt;
     always@(posedge EncoderA_i or negedge rst_n)begin
        if(rst_n==0) begin
            Dir_A<=0;
            A_cnt<=0;
        end
        else begin
            Dir_A<=clk_cnt;
            if(clk_cnt>=19'd50_0000)
                A_cnt<=0;
            else A_cnt<=A_cnt+1'd1;
        end
     end

     reg[18:0] B_cnt;
     always@(posedge EncoderB_i or negedge rst_n)begin
        if(rst_n==0) begin
            Dir_B<=0;
            B_cnt<=0;
        end
        else begin
            Dir_B<=clk_cnt;
            if(clk_cnt>=19'd50_0000)
                B_cnt<=0;
                else B_cnt<=B_cnt+1'd1;

        end
     end

     always@(*) begin
        if(Dir_A<Dir_B)
            dir<=1;
        else
            dir<=0;
        if(clk_cnt==19'd49_9999)begin
            speed<=24*A_cnt;//Speed 单位为 r/min 24是5ms测速周期的单位换算系数
         end
     end



     assign Speed_o = speed;
     assign Dir_o = dir;


endmodule

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则