搜索
bottom↓
回复: 5

仿制HCTL-2016的旋转增量(正交)编码器计数器

[复制链接]

出0入0汤圆

发表于 2009-6-8 16:34:39 | 显示全部楼层 |阅读模式
最近要用到旋转增量(正交)编码器,想买HCTL-2016,找不到货源,干脆自己现学VerilogHDL,做了一个解码器,呵呵
望大家批评指正,开发环境Quartus II 7.2
正交解码源文件波形文件ourdev_451944.rar(文件大小:3K) (原文件名:VerilogHDL_DECODER.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-6-8 17:43:39 | 显示全部楼层
大家都是看帖不回贴,也许是太简单了,偶还没入门,看了N多资料,憋出来的

出0入0汤圆

 楼主| 发表于 2009-6-8 17:46:57 | 显示全部楼层
//给懒人们贴上来,干脆
//        ***************************************************************
//
//        AB_DECODER.v                Decoder for phase A and B encoder
//       
//        V1.00        2009-6-04
//
//        Design by cqfeiyu in chongqing, all right reserved
//
//        ***************************************************************

module AB_DECODER
(
        DI_SYSCLK,
        DI_PHASE_A,
        DI_PHASE_B,
        DI_PHASE_Z,       
        DI_ADDER,
        DI_RD,
        DI_OE,
        DO_PULSE,
        DO_DIRECT,
        DO_COUNT
);

//        input
//
input DI_SYSCLK;
input DI_PHASE_A;
input DI_PHASE_B;
input DI_PHASE_Z;
input DI_RD;
input DI_OE;
input [1:0] DI_ADDER;
//        output
//
output DO_PULSE;
output DO_DIRECT;
output [7:0] DO_COUNT;

//        register
//
reg [23:0] ENCODER_COUNT;
reg [7:0] DO_COUNT;
reg [3:0] COUNT_PHASE_A;
reg [3:0] COUNT_PHASE_B;
reg [3:0] COUNT_PHASE_Z;

reg PULSE;
reg PULSE_LAST;
reg DO_DIRECT;

reg PHASE_A;
reg PHASE_B;
reg PHASE_Z;

reg PULSE_DOUBLE;
reg PULSE_DOUBLE_LAST;

reg PHASE_A_LAST;
reg PHASE_B_LAST;
reg PHASE_Z_LAST;

reg DI_RD_LAST;

reg DO_PULSE1;
reg DO_PULSE2;
reg DO_PULSE3;
reg DO_PULSE4;

assign DO_PULSE=PULSE_LAST;

always @(posedge DI_SYSCLK) begin
        COUNT_PHASE_A <= COUNT_PHASE_A << 1;
        COUNT_PHASE_A[0] <= DI_PHASE_A;
        COUNT_PHASE_B <= COUNT_PHASE_B << 1;
        COUNT_PHASE_B[0] <= DI_PHASE_B;
        COUNT_PHASE_Z <= COUNT_PHASE_Z << 1;
        COUNT_PHASE_Z[0] <= DI_PHASE_Z;
end

always @(posedge DI_SYSCLK) begin
        if(COUNT_PHASE_A == 4'b1111)
                PHASE_A = 1'B1;
        else PHASE_A = 1'B0;
        PHASE_A_LAST <= PHASE_A;
        DO_PULSE1 <= (!PHASE_A_LAST)& PHASE_A;
        DO_PULSE2 <= PHASE_A_LAST & (!PHASE_A);
end

always @(posedge DI_SYSCLK) begin
        if(COUNT_PHASE_B == 4'b1111)
                PHASE_B = 1'B1;
        else PHASE_B = 1'B0;
        PHASE_B_LAST <= PHASE_B;
        DO_PULSE3 <= (!PHASE_B_LAST)& PHASE_B;
        DO_PULSE4 <= PHASE_B_LAST & (!PHASE_B);
end

always @(posedge DI_SYSCLK) begin
        if(COUNT_PHASE_Z == 4'b1111)
                PHASE_Z = 1'B1;
        else PHASE_Z = 1'B0;
        PHASE_Z_LAST <= PHASE_Z;
end

always PULSE = DO_PULSE1 | DO_PULSE2 | DO_PULSE3 | DO_PULSE4;

always @(posedge DI_SYSCLK) begin
        if((DO_PULSE1 & PHASE_B) | (DO_PULSE2 & !PHASE_B) | (DO_PULSE3 & !PHASE_A) | (DO_PULSE4 & PHASE_A))DO_DIRECT<=1;
        else if((DO_PULSE1 & !PHASE_B) | (DO_PULSE2 & PHASE_B) | (DO_PULSE3 & PHASE_A) | (DO_PULSE4 & !PHASE_A))DO_DIRECT<=0;
end

always @(posedge DI_SYSCLK) begin
        PULSE_LAST<=PULSE;
        if((PHASE_Z_LAST==1)&&(PHASE_Z==0))ENCODER_COUNT = 24'd0;
        else if(PULSE_LAST)begin
                if(DO_DIRECT)ENCODER_COUNT<=ENCODER_COUNT + 1'b1;
                else ENCODER_COUNT<=ENCODER_COUNT- 1'b1;
        end
end

always @(posedge DI_SYSCLK) begin
        DI_RD_LAST<=DI_RD;
        if(DI_OE==1)DO_COUNT<=8'bZ;
        else if((DI_RD_LAST==0)&&(DI_RD==1))begin
                case(DI_ADDER)
                0:DO_COUNT<=8'd0;
                1:DO_COUNT<=ENCODER_COUNT[7:0];
                2:DO_COUNT<=ENCODER_COUNT[15:8];
                3:DO_COUNT<=ENCODER_COUNT[23:16];
                //default:DO_COUNT<=8'bZ;
                endcase
        end
end

endmodule

出0入0汤圆

 楼主| 发表于 2009-6-8 17:59:53 | 显示全部楼层

正交编码器计数仿真 (原文件名:AB_DECODER.jpg)

出0入0汤圆

发表于 2009-8-15 17:08:41 | 显示全部楼层
工业很多用这东东,还有仿制LS7166更好。

出0入0汤圆

发表于 2009-8-17 11:16:59 | 显示全部楼层
http://www.fpga4u.com/bbs/thread-148-1-2.html


我以前做的一个旋转编码器的例子
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 19:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表