2

回転スイッチを調べて、それがどの位置にあるかをフィードバックすることが期待されるコードをVHDLで記述しました。

回転すると、ローターダイヤルからグレーコードが読み込まれ、状態が対応するグレーコード状態に切り替わります。

状態を変更するという行為は、ローターがどちらの方向にねじられているかを教えてくれるので、回路の後半でカウンターモジュールにアップ状態またはダウン状態を示すことができます。

状態が変化すると、パルスがオンにMagなり、1または0のいずれかがオンになりup_dwnます。

シミュレートすると機能しません。ときどきブリップMagが鳴りますが、変化はありませんup_dwn

状態が止まっているのではないかと思いSTARTます。

誰かが私が間違ったことを見て教えてくれませんか?

[Ed:QuartusIIバージョン9の使用]

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY EncoderV2    IS
PORT(
    CH_AB           :   IN  STD_LOGIC_VECTOR (1 downto 0);
    clk             :   IN  STD_LOGIC;
    nReset          :   IN  STD_LOGIC;
    up_dwn, Mag     :   OUT STD_LOGIC);

    END EncoderV2;

ARCHITECTURE a OF EncoderV2 IS  --  
TYPE STATE_TYPE IS ( START, s00, s01, s11, s10);
SIGNAL state:   STATE_TYPE;

BEGIN
PROCESS (clk, nReset)
BEGIN
    IF nReset = '0' THEN                        --    asynch Reset to zero
        state   <=  START;
    ELSIF clk'EVENT AND clk = '1' THEN          --  triggers on PGT
        CASE state IS 
            WHEN START =>
                    IF CH_AB ="00" THEN
                                state   <= s00;
                                Mag <='0';
                    ELSIF CH_AB="01" THEN
                                state   <= s01;
                                Mag <='0';
                    ELSIF CH_AB= "11" THEN
                                state   <= s11;
                                Mag <='0';
                    ELSIF CH_AB= "10" THEN
                                state   <= s10;
                                Mag <='0';
                    ELSE  state <= START;
                    END IF;

            WHEN s00 =>                 --  S10 <- S00 -> S01
                    IF CH_AB= "00" THEN
                                state   <= s00;
                                Mag <='0';
                    ELSIF CH_AB= "10" THEN
                                state   <= s10;
                                up_dwn  <= '0';
                                Mag <='1';
                    ELSIF CH_AB= "01" THEN
                                state   <= s01;
                                up_dwn  <='1';
                                Mag <='1';
                    ELSE  state <= START;
                    END IF;

            WHEN s01 =>                 --  S00 <- S01 -> S11
                    IF CH_AB= "01" THEN
                                state   <= s01;
                                Mag <='0';
                    ELSIF CH_AB= "00" THEN
                                state   <= s00;
                                up_dwn  <= '0';
                                Mag <='1';
                    ELSIF CH_AB= "11" THEN
                                state   <= s11;
                                up_dwn  <='1';
                                Mag <='1';
                    ELSE state <= START;
                    END IF;

            WHEN s11 =>                 --  S01 <- S11 ->S10
                    IF CH_AB= "11" THEN
                                state   <= s11;
                                Mag <='0';
                    ELSIF CH_AB= "01" THEN
                                state   <= s01;
                                up_dwn  <= '0';
                                Mag <='1';
                    ELSIF CH_AB= "10" THEN
                                state   <= s10;
                                up_dwn  <='1';
                                Mag <='1';
                    ELSE state <= START;
                    END IF;

            WHEN s10 =>                 --  S11 <- S10 -> S00
                    IF CH_AB= "10" THEN
                                state   <= s10;
                                Mag <='0';
                    ELSIF CH_AB= "11" THEN
                                state   <= s11;
                                up_dwn  <= '0';
                                Mag <='1';
                    ELSIF CH_AB= "00" THEN
                                state   <= s00;
                                up_dwn  <='1';
                                Mag <='1';
                    ELSE state <= START;
                    END IF;





            END CASE;
        END IF;
    END PROCESS;
END a;
4

1 に答える 1

0

私にとっては問題なく動作します...Modelsimでシミュレート

50、100、200MHzでシミュレートしました。私が疑問に思うのは、「IF .. nReset ='0'THEN」を使用することだけです。それを見て刺激ファイルで変更するまでに20分ほどかかりました。

于 2012-06-11T20:39:58.703 に答える