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