基于ZYNQ的旋转编码器测速实验

硬件平台:ZYNQ XCZ7020
编码器:欧姆龙E6B2 500线编码器。
实现功能:每5ms测速周期对编码器进行脉冲计数,换算得到转速,并根据AB相关系得到旋转方向。
在写这块代码的时候也遇到了一些问题,程序虽小但也涉及到一些Veilog中易错的点。代码如下

module encoder(
input clk_i,
input rst_n,
input EncoderA_i,//编码器为500线
input EncoderB_i,
output [31:0] Speed_o,
output Dir_o
    );
    reg [18:0] clk_cnt;//Fpga频率计数
    reg [31:0] speed=0;
    reg dir=0;//0 正方向 1反方向
    reg stop;
    always@(posedge clk_i) begin
        if(rst_n==0) begin 
            clk_cnt<=0;
         end
         else begin
            if(clk_cnt==19'd50_0000) begin //100Mhz时钟计时5ms
                 clk_cnt<=0;
                 stop<=1;
             end
            else begin 
                clk_cnt<=clk_cnt+1'd1;
                stop<=0;
            end           
         end
     end
    reg[18:0] A_cnt;
    always@(posedge EncoderA_i) begin
        if(EncoderB_i==1'b1)
                dir<=1;
            else
                dir<=0;
    end
     always@(posedge EncoderA_i or negedge rst_n or posedge stop) begin

        if(rst_n==0)
            A_cnt<=0;
        else begin
            if(stop==1) begin
                A_cnt<=0;
            end
            else 
                A_cnt<=A_cnt+1;
         end
      end

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



     assign Speed_o = speed;
     assign Dir_o = dir;


endmodule

完成编码器模块的testbench测试之后,在AXI_lite总线中进行调用,并封装成IP,实现了ZYNQ的SOC开发,在PL部分进行测速,在PS部分实现数据的可视化。最后在进行管脚约束时遇到一个问题,编码器的脉冲输入信号是时钟信号,需要将其约束到具有时钟输入能力的管脚,官方daatasheet中表述为clock capable I/Os 这些管脚在ZYNQ中的标识为MRCC/SRCC。

若有问题请大家批评指正

你可能感兴趣的:(verilog语言,旋转编码器,zynq)