用CPLD实现的1x,2x,4x通用正交编码器解码模块。
近日学习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 http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598790YDYDB3.jpg
1倍频 (原文件名:1x.jpg)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598791F6506H.jpg
2倍频 (原文件名:2x.jpg)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598792NR0TCJ.jpg
4倍频 (原文件名:4x.jpg) 写的很不错啊
编码器有抖动干扰的 也要做处理 在板子上测试过,没问题。板子用光耦隔离,也起到抗干扰作用。同时建议如EPM240等支持PIN施密特输入,设置为施密特输入,效果会好很多。这样程序上基本不用再做抗干扰处理了。 标记一下 mark 请教下 1x,2x,4x 是什么意思呢? 1x,2x,4x 指倍频系数。如正常600线的编码器。1x时一圈接收600个脉冲,2x则为1200脉冲,4x为2400脉冲。 mark 正交编码解码 楼主你好,我用EP2C8Q208C8芯片,不知道如何设置为施密特输入,请求你的帮助,谢谢! 前面加数字滤波就更好了。 辛苦了。。比较有用的资料 http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_693942S15NYJ.jpg
(原文件名:Unnamed.jpg)
效果还不错 mark mak mark 这个很早就做过了,两路信号正交,可以按编码信号得到4倍频,现在是想做到8X和16X 写的很好,值得借鉴,但是貌似没有做误码处理! 4x倍频是在硬件机制上实现的,是完全可靠的。如果做8x或16x只能利用软件倍频,不知道是否可行。 非常实用的资料,期待更高的倍频啊。 非常好啊!!! 是不是可以增加个wire error = ({A1, B1} ^ {A, B});来检测下AB出错,如果从AB=00直接跳到AB=11或者AB=01跳到AB=10都报个错,这样在方向判断前再加上if ((change)&&(error!=2'b11)) 是不是更好呢? 楼主,能将2个输入按原来的样子4倍频吗?谢谢 mark mark 学习 mark 学习 学习了,谢谢 好 东西 今天才看到 谢谢
参考一下 记号,以后再看 好东西 标记一下 这个好,正在开发的东西可以参照一下! 你好,我正想要你这个编码器接口模块,QQ292747058 好贴,写得很好,谢谢分享。 清新怡人 发表于 2018-8-6 00:43
好贴,写得很好,谢谢分享。
最喜欢看挖坟贴 不错 谢谢分享
页:
[1]