搜索
bottom↓
回复: 3

增量式光电编码器计数器程序(VHDL),欢迎各位测试拍砖.

[复制链接]

出0入0汤圆

发表于 2011-7-19 17:11:34 | 显示全部楼层 |阅读模式
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY ABC IS
   PORT (
      clk                     : IN std_logic;   
      clr                    : IN std_logic;   
      a                       : IN std_logic;   
      b                       : IN std_logic;   
      counter                 : BUFFER std_logic_vector(23 DOWNTO 0));   
END ABC;

ARCHITECTURE epm570 OF ABC IS
   SIGNAL cot                 :  std_logic_vector(1 DOWNTO 0);      
   SIGNAL prestate            :  std_logic_vector(1 DOWNTO 0);   
   SIGNAL state               :  std_logic_vector(1 DOWNTO 0);   
   SIGNAL judge               :  std_logic_vector(3 DOWNTO 0);     
   SIGNAL dire_0              :  std_logic;   
   SIGNAL cp_0                :  std_logic;   

BEGIN
   PROCESS(clr,clk)
   BEGIN
   IF(clr = '1')THEN  
   cot<=(OTHERS=>'0');
   prestate <=(OTHERS=>'0');
   state  <=(OTHERS=>'0');
   judge <=(OTHERS=>'0');
   dire_0<='0';
   cp_0 <='0';
   ELSE
           IF (clk'EVENT AND clk = '1')THEN
                  state(1) <= a;   
                  state(0) <= b;   
                  prestate <= state;  
                  judge <= prestate&state;  
                                CASE judge IS
                                WHEN "0010"=>cp_0 <= '1';dire_0 <= '1';          
                                WHEN "1011"=>cp_0 <= '1';dire_0 <= '1';   
                                WHEN "1101"=>cp_0 <= '1';dire_0 <= '1';   
                                WHEN "0100"=>cp_0 <= '1';dire_0 <= '1';   
                                WHEN "0001"=>cp_0 <= '1';dire_0 <= '0';   
                                WHEN "0111"=>cp_0 <= '1';dire_0 <= '0';   
                                WHEN "1110"=>cp_0 <= '1';dire_0 <= '0';   
                                WHEN "1000"=>cp_0<= '1';dire_0  <= '0';  
                                WHEN OTHERS => NULL;  
                                END CASE;
                        IF (cp_0 = '1') THEN
                                cot <= cot + "01";
                        END IF;
                          
                        IF (cot = "01") THEN
                                cot <= "00";   
                                cp_0 <= '0';   
                        END IF;               
                END IF;
                END IF;
   END PROCESS;

PROCESS(cp_0,clr,dire_0)
VARIABLE direction :INTEGER RANGE -1 TO 1;
BEGIN
        IF(dire_0 = '1') THEN
        direction :=1;
        ELSE
        direction :=-1;
        END IF;
          
        IF(clr = '1')THEN --
        counter <= (OTHERS=>'0') ;   
        ELSE
                IF (cp_0'EVENT AND cp_0 = '0')THEN
                counter <= counter + direction;
                END IF;
        END IF;
END PROCESS;
END epm570;

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-7-21 08:45:10 | 显示全部楼层
学习 帮顶了

出0入0汤圆

发表于 2011-7-21 09:01:23 | 显示全部楼层
module encoder(clk,reset,encoder_a,encoder_b,count_data);
input clk;
input reset;
input encoder_a;
input encoder_b;
output [31:0]count_data;
reg    [1:0]current_state;
reg    [1:0]next_state;       
reg    [31:0]count_data;
always@(posedge clk)
        if(!reset)
                begin
                        current_state<=2'b00;
                        next_state<=2'b00;
                end
                else
                        begin
                                current_state<=next_state;
                                next_state<={encoder_a,encoder_b};
                        end
always@(posedge clk)
        if(!reset)
                count_data<=2'b00;
        else
                case(current_state):
                        2'b00:
                                if(next_state==2'b01)
                                        count_data<count_data+32'b1;
                                else if(next_state=2'b10)
                                        count_data<count_data-32'b1;
                                        else
                                                count_data<=count_data;
                        2'b01:
                                if(next_state==2'b11)
                                        count_data<count_data+32'b1;
                                else if(next_state=2'b00)
                                        count_data<count_data-32'b1;
                                        else
                                                count_data<=count_data;
                        2'b11:
                                if(next_state==2'b10)
                                        count_data<count_data+32'b1;
                                else if(next_state=2'b01)
                                        count_data<count_data-32'b1;
                                        else
                                                count_data<=count_data;
                        2'b10:
                                if(next_state==2'b00)
                                        count_data<count_data+32'b1;
                                else if(next_state=2'b11)
                                        count_data<count_data-32'b1;
                                        else
                                                count_data<=count_data;
                        default:
                                count_data<=count_data;
                 endcase
endmodule

我用verilog HDL写了一个,已通过测试。VHDL的语言不是很熟,回头看看语法去

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-27 17:18

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

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