-1

これは完全なコードです

library ieee;
use ieee.std_logic_1164.all;

entity move_key_detector is
    PORT(
        clk : IN STD_LOGIC;
        done : IN STD_LOGIC;
        hex : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
        up, down : out std_logic
    );
END move_key_detector;

architecture arch of move_key_detector is

    type statetype is (IDLE, RECEIVED_BREAK);
    signal next_state, current_state : statetype :=IDLE;

begin

process (Clk) begin
    if(rising_edge(Clk)) then
        current_state <= next_state;
    end if;
end process;


process(done) begin
next_state <= current_state;
    case current_state is
        when IDLE=>
            if(done = '1') then
                if (hex = "00011101") then up <= '1';
                elsif(hex = "00011011") then down <= '1';
                --check to see if a break code is sent
                elsif (hex = "11110000") then next_state <= RECEIVED_BREAK; 
                end if;
            end if;
        when RECEIVED_BREAK=>
            if(done ='1') then
                if (hex = "00011101") then up <= '0';
                elsif(hex="00011011") then down <= '0';
                end if;
                next_state <= IDLE;
            end if;
        end case;
end process;

エラーは次のとおりです。

エラー (10821): move_key_detector.vhd(31) での HDL エラー: サポートされているレジスタ モデルと動作が一致しないため、"down" のレジスタを推測できません

情報 (10041): move_key_detector.vhd(29) での「ダウン」の推定ラッチ

エラー (10821): move_key_detector.vhd(31) での HDL エラー: サポートされているレジスタ モデルと動作が一致しないため、"up" のレジスタを推測できません

情報 (10041): move_key_detector.vhd(29) での "up" の推測ラッチ

エラー (10818): move_key_detector.vhd(41) で "next_state" のレジスタを推測できません。これは、クロック エッジの外で値を保持していないためです。

エラー (10818): move_key_detector.vhd(33) で "next_state" のレジスタを推測できません。これは、クロック エッジの外で値を保持していないためです。

この種のエラーが発生しています。HDLマニュアルを読んでこの推奨事項に従いましたが、これを修正する方法はまだわかりません。

誰でも私を助けることができますか?どうもありがとうございました!

4

1 に答える 1

2

なぜ2番目のプロセスがあるのですか?非同期コードを意図したものが含まれているようです。

if および case コンストラクトを使用できるようにプロセスが必要な場合は、目的の出力に影響を与える可能性があるものをすべてプロセス センシティビティ リストに入れる必要があります (つまり、done AND current_state & hex)。

また、next_state に 2 つの異なる値を割り当てている可能性もあります。これは、FPGA をターゲットにしている場合は一般的に悪いことです。「next_state <= current_state」を case ステートメント内に移動し、case/if ステートメントのすべてのブランチにすべての用語を明示的に割り当てることをお勧めします (動作に期待していることを少し推測していますが、一般的な結果が得られるはずです考え):

case current_state is
    when IDLE=>
        if(done = '1') then
            if (hex = "00011101") then 
                up <= '1';
                down <= '0';
                next_state <= current_state;
            elsif(hex = "00011011") then 
                up <= '0';
                down <= '1';
                next_state <= current_state;
            --check to see if a break code is sent
            elsif (hex = "11110000") then 
                up <= '0';
                down <= '0';
                next_state <= RECEIVED_BREAK; 
            ...

非同期ロジックを生成する場合は、選択したシグナル割り当てをプロセス外で使用することもできます。

up/down/next_state 信号のラッチを実際に推測しようとしている場合は、コードで直接、または質問で、何をしたいのかをより明確にする必要があります。

于 2011-11-18T23:22:22.540 に答える