ロータリエンコーダ信号処理回路

信号処理回路ブロック図
     VHDL記述では方向と逓倍パルス発生回路と4ビットUP/DNカウンタ回路はコンポーネント宣言し、構造化記述をしています。

1 方向と逓倍パルス発生回路ブロック図
        このVHDL記述はコンポーネント宣言した下位モジュールです。
2 4ビットUP/DNカウンタブロック図
        同じくコンポーネント宣言した下位モジュールのVHDL記述です。
3 UP/DNカウンタのカスケード接続
        4ビットUP/DNカウンタをカスケード接続して16ビットUP/DNカウンタを構成しています。

信号処理回路ブロック図
ロータリエンコーダ信号処理回路ブロック図
信号処理回路のVHDL記述
entity enc_proc1 is
    Port ( RESET : in std_logic;
             CLK : in std_logic;           -- 6MHz
             XSEL : in std_logic_vector(1 downto 0);
             FA : in std_logic;             --A相パルス
             FB : in std_logic;             --B相パルス
             CLR : in std_logic;
             LAT : in std_logic;
             SEL : in std_logic_vector(1 downto 0);
             DAT : out std_logic_vector(3 downto 0);
             CW : out std_logic_vector(2 downto 0);   --チェック用出力
             CCW : out std_logic_vector(2 downto 0);
             DIR : out std_logic;
             MONCW : out std_logic;         --モニタ出力
             MONCCW : out std_logic);      --モニタ出力
end enc_proc1;
architecture Behavioral of enc_proc1 is
    component updnclk124
        port (RESET,CLK,A,B : in std_logic;
                NOM1P,NOM2P,NOM4P : out std_logic;
                REV1P,REV2P,REV4P : out std_logic);
    end component;
    component updncnt_4
        port (RESET,CLK,UPDN,CYIN,BRIN : in std_logic;
                Q : out std_logic_vector(3 downto 0);
                CYOUT,BROUT : out std_logic);
    end component;
    signal A,B :std_logic;
    signal ECLK : std_logic;
    signal NOM1P,NOM2P,NOM4P : std_logic;
    signal REV1P,REV2P,REV4P : std_logic;
    signal up,dn :std_logic;
    signal udflag : std_logic;
    signal updnclk : std_logic;
    signal Q1K,Q100,Q10,Q1 : std_logic_vector(3 downto 0);
    signal CYOUT1K,CYOUT100,CYOUT10,CYOUT1 : std_logic;
    signal BROUT1K,BROUT100,BROUT10,BROUT1 : std_logic;
    signal CLEAR : std_logic;
-- UP/DN counter latch registers
    signal DBUF1K,DBUF100,DBUF10,DBUF1 : std_logic_vector(3 downto 0);
    signal SELDB : std_logic_vector(3 downto 0);
begin
-- Encoder A,B to UP/DOWN CLOCK X1,X2,X4
    A <= FA; B <= FB;
    ECLK <= CLK;
    U0 : updnclk124 port map (RESET,ECLK,A,B,NOM1P,NOM2P,NOM4P,REV1P,REV2P,REV4P);
-- Select UP and DOWN x?
process (XSEL) begin
    case XSEL is
        when "00" => up <= not NOM1P; dn <= not REV1P; -- x1
        when "01" => up <= not NOM2P; dn <= not REV2P; -- x2 アップ/ダウンカウンタ
        when "10" => up <= not NOM4P; dn <= not REV4P; -- x4   クロック選択
        when others => up <= not NOM1P; dn <= not REV1P; -- x1
    end case;
end process;
-- Monitor x1 ,x2 ,x4
    CW(0) <= NOM1P; CW(1) <= NOM2P; CW(2) <= NOM4P;
    CCW(0) <= REV1P; CCW(1) <= REV2P; CCW(2) <= REV4P;
process (RESET,up,dn) begin
    if (RESET = '0' or dn = '0') then
        udflag <= '0';                     -- Down
    elsif(up = '0') then
        udflag <= '1';                     -- Up
    end if;
end process;
process (udflag) begin
    if (udflag = '1') then
        updnclk <= up;
    else
        updnclk <= dn;
    end if;
end process;
    CLEAR <= RESET and CLR;
    V0 : updncnt_4 port map (CLEAR,updnclk,udflag,'1','1',Q1,CYOUT1,BROUT1);
    V1 : updncnt_4 port map (CLEAR,updnclk,udflag,CYOUT1,BROUT1,Q10,CYOUT10,BROUT10);
    V2 : updncnt_4 port map
    (CLEAR,updnclk,udflag,CYOUT10,BROUT10,Q100,CYOUT100,BROUT100);
    V3 : updncnt_4 port map
    (CLEAR,updnclk,udflag,CYOUT100,BROUT100,Q1K,CYOUT1K,BROUT1K);
process (LAT) begin
    if (LAT'event and LAT = '1') then
        DBUF1K <= Q1K;    --Q(15)〜Q(12)
        DBUF100 <= Q100; --Q(11)〜Q(8)   アップ/ダウン
        DBUF10 <= Q10;     --Q(7)〜Q(4)    カウンタ出力
        DBUF1 <= Q1;        --Q(3)〜Q(0)    をラッチする
    end if;
end process;
process (SEL) begin
    case SEL is
        when "00" => SELDB <= DBUF1;
        when "01" => SELDB <= DBUF10;
        when "10" => SELDB <= DBUF100;   --ラッチ出力選択
        when "11" => SELDB <= DBUF1K;
        when others => SELDB <= "0000";
    end case;
end process;
    DAT <= SELDB;
    MONCW <= not udflag; MONCCW <= udflag;
    DIR <= udflag;
end Behavioral;

戻る

方向と逓倍パルス発生回路ブロック図
正転/逆転判別&逓倍クロック発生回路ブロック図
方向と逓倍パルス発生回路のVHDL記述
entity updnclk124 is
    port (RESET,CLK,A,B : in std_logic;
            NOM1P,NOM2P,NOM4P : out std_logic;
            REV1P,REV2P,REV4P : out std_logic);
    end updnclk124;
architecture behavioral of updnclk124 is
    signal TNOM1P,TREV1P : std_logic;
    signal TNOM2P,TREV2P : std_logic;
    signal TNOM4P,TREV4P : std_logic;
    signal ASQ,BSQ : std_logic_vector(1 downto 0);
    signal ARISE,AFALL,BRISE,BFALL : std_logic;
begin
process (RESET,CLK) begin
    if(RESET = '0') then
        ASQ <= "00";
    elsif(CLK'event and CLK = '1') then
        ASQ(1) <= ASQ(0);
        ASQ(0) <= A;
    end if;
end process;
process (RESET,CLK) begin
    if (RESET='0') then
        BSQ <= "00";
    elsif(CLK'event and CLK = '1') then
        BSQ(1) <= BSQ(0);
        BSQ(0) <= B;
    end if;
end process;
-- ** detect edge of A and B **
    ARISE <= ASQ(0) and (not ASQ(1));
    AFALL <= not ASQ(0) and ASQ(1);
    BRISE <= BSQ(0) and (not BSQ(1));
    BFALL <= not BSQ(0) and BSQ(1);
-- ** X1 normal , reverse pulse
    TNOM1P <= ARISE and (not B);
    TREV1P <= AFALL and (not B);
-- ** X2 normal , reverse pulse
    TNOM2P <= (AFALL and B) or TNOM1P;
    TREV2P <= (ARISE and B) or TREV1P;
-- ** X4 normal , reverse pulse
    TNOM4P <= (BRISE and A) or (BFALL and (not A)) or TNOM2P;
    TREV4P <= (BRISE and not A) or (BFALL and A) or TREV2P;
    NOM1P <= TNOM1P; NOM2P <= TNOM2P; NOM4P <= TNOM4P;
    REV1P <= TREV1P; REV2P <= TREV2P; REV4P <= TREV4P;
end Behavioral;

戻る

4ビットUP/DNカウンタブロック図
4ビットアップダウンカウンタ回路ブロック図
4ビットUP/DNカウンタのVHDL記述
entity updncnt_4 is
    port (RESET,CLK,UPDN,CYIN,BRIN : in std_logic;
            Q : out std_logic_vector(3 downto 0);
            CYOUT,BROUT : out std_logic);
end updncnt_4;
architecture behavioral of updncnt_4 is
   signal TQ : std_logic_vector(3 downto 0);
begin
process (RESET,CLK) begin
   if (RESET = '0') then
      TQ <= "0000";
   elsif (CLK'event and CLK = '1') then
      if(UPDN = '1' and CYIN = '1') then
         if(TQ = "1111") then
            TQ <= "0000";
         else
            TQ <= TQ + '1';
         end if;
      elsif(UPDN = '0' and BRIN = '1') then
         if(TQ = "0000") then
            TQ <= "1111";
         else
            TQ <= TQ - '1';
         end if;
      end if;
   end if;
end process;
process (TQ,CYIN) begin
   if(TQ = "1111" and CYIN = '1') then
      CYOUT <= '1';
   else
      CYOUT <= '0';
   end if;
end process;
process (TQ,BRIN) begin
   if(TQ= "0000" and BRIN = '1') then
      BROUT <= '1';
   else
      BROUT <= '0';
   end if;
end process;
   Q <= TQ;
end Behavioral;

戻る

UP/DNカウンタのカスケード接続図
カスケード接続による16ビットアップダウンカウンタ回路ブロック図

戻る

信号表
信号名 入力/出力 説     明
FA 入力 エンコーダA相信号を入力する
FB 入力 エンコーダB相信号を入力する
CLK 入力 システムクロックを入力する(6MHz)
RESET 入力 '0'でリセットされる
DAT3 出力 ラッチデータ出力
DAT2 出力 ラッチデータ出力
DAT1 出力 ラッチデータ出力
DAT0 出力 ラッチデータ出力
SEL1 入力 ラッチデータ選択信号
SEL0 入力 ラッチデータ選択信号
LAT 入力 '0'→'1'の立ち上がりでラッチする
CLR 入力 '0'でアップ/ダウンカウンタをクリアする
DIR 出力 '0'で逆転(CCW),'1'で正転(CW)
CW2 出力 チェック用正転×4クロック
CW1 出力 チェック用正転×2クロック
CW0 出力 チェック用正転×1クロック
CCW2 出力 チェック用逆転×4クロック
CCW1 出力 チェック用逆転×2クロック
CCW0 出力 チェック用逆転×1クロック
XSEL1 入力 ×1,×2,×4選択信号
XSEL0 入力 ×1,×2,×4選択信号
MONCW 出力 '0'で正転
MONCCW 出力 '0'で逆転

戻る