想拿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 
 
 |