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