|
近日学习CPLD,用到光电式正交编码器,看了些网上资料,消化一下。写了这个1x/2x/4x通用模块。模块占用5个宏单元,跟网上提供的基本一样,程序还算清晰。欢迎各位指点:
//==============================================================
// ENCODER
//==============================================================
module Encoder (clk, A, B, pulse, dir, x2, x4);
input clk, A, B, x2, x4;
output pulse, dir;
reg A1, B1, reg_cp, tim_cp, dir, pulse;
wire change = ({A1, B1} != {A, B}); // 发生状态变化时保持一个时钟周期'1'状态
always @ (posedge clk) begin
{A1, B1} <= {A, B}; // 一个时钟后保存端口状态
if (change) // 改变状态时检测方向
case ({A, B})
2'b00: begin
dir <= ({A1, B1} == 2'b01);
reg_cp = x2 | x4;
end
2'b01: begin
dir <= ({A1, B1} == 2'b11);
reg_cp = x4;
end
2'b11: begin
dir <= ({A1, B1} == 2'b10);
reg_cp = 1'b1;
end
2'b10: begin
dir <= ({A1, B1} == 2'b00);
reg_cp = x4;
end
endcase
tim_cp <= change & reg_cp; // 使脉冲滞后方向一个时钟
pulse <= tim_cp;
end
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|