1

みんな。VHDL で 4 ビット乗算器を作成しようとしています。これは、組み込みの 2x16 LCD と C922 IC を介した 3x4 キーパッドを使用して Spartan 3E ボードに実装される予定です。

使用方法は次のとおりです。ユーザーがキーパッドから数字を入力し、確認のためにボタンを押し、2 番目の数字を入力し、もう一度確認ボタンを押すと、製品が LCD に表示されます。

これまでのところ、キーパッド + c922 と LCD のコードは問題ありません。乗数のコードはほぼ問題ありません。問題は、別の番号 (最終的には使用されない) が押されたときにのみ確認ボタンが機能することです。

これが私のコードです。以下は、ザイリンクス シミュレーションのスクリーンショットです。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity multi_4bit is
    Port ( CLK : in  STD_LOGIC;
        RESET : in  STD_LOGIC;
        Input : in  STD_LOGIC_VECTOR (3 downto 0);
        DAVBL : in  STD_LOGIC;
        Confirm : in STD_LOGIC;
        Output : out  STD_LOGIC_VECTOR (7 downto 0));
end multi_4bit;

architecture Behavioral of multi_4bit is

type state is (R,S0,S1,S2,S3,S4);
signal pstate, nstate: state;
signal A_sig, B_sig: STD_LOGIC_VECTOR(3 downto 0);

begin

state_transition: process(CLK,RESET)
begin
    if RESET = '1' then
        pstate <= R;
    elsif rising_edge(CLK) then
        pstate <= nstate;
    end if;
end process;

nstate_output: process(pstate,DAVBL,Input)
variable temp_var: STD_LOGIC_VECTOR(3 downto 0);
variable tempMult_var,tempProd_var: STD_LOGIC_VECTOR(7 downto 0);
begin
    case pstate is
        when R =>
            nstate <= S0;
            tempMult_var := (others => '0');
            tempProd_var := (others => '0');

            A_sig <= (others => '0');
            B_sig <= (others => '0');

            Output <= (others => '0');
        when S0 =>
            nstate <= S0;         

            if (DAVBL = '1') then
                A_sig <= Input;
                nstate <= S1;
            end if;
        when S1 =>
            nstate <= S1;

            if (Confirm = '1') then
                nstate <= S2;
            end if;
        when S2 =>
            nstate <= S2;

            if (DAVBL = '1') then
                B_sig <= Input;
                nstate <= S3;
            end if;
        when S3 =>
            nstate <= S3;

            if (Confirm = '1') then
                nstate <= S4;
            end if;

        when S4 =>
            nstate <= S0;

            for x in 0 to 3 loop
                temp_var := (A_sig AND (B_sig(x)&B_sig(x)&B_sig(x)&B_sig(x) ) );
                tempMult_var := "0000" & temp_var;
                if (x=0) then tempMult_var := tempMult_var;
                elsif (x=1) then tempMult_var := tempMult_var(6 downto 0)&"0";
                elsif (x=2) then tempMult_var := tempMult_var(5 downto 0)&"00";
                elsif (x=3) then tempMult_var := tempMult_var(4 downto 0)&"000";        
                end if;
                tempProd_var := tempProd_var + tempMult_var;
            end loop;

            Output <= tempProd_var;
            tempProd_var := (others => '0');
    end case;
end process;

end Behavioral;

確認ボタンで数字を押さない時のシミュレーション: ここに画像の説明を入力

確認ボタンで数字を押したときのシミュレーション: ここに画像の説明を入力

コードを 1 時間調べてみましたが、まだ何が問題なのかわかりません。助けていただける方、よろしくお願いします。

4

1 に答える 1

0

fru1tbat、Brian、および David が述べたように、ステート マシンの組み合わせ部分のセンシティビティ リストに問題があります。具体的には、Confirm入力がありません。入力がセンシティビティ リストにないためConfirm、ステート マシンは状態の変更を確認するときに、新しい出力/状態遷移を評価するために「ウェイクアップ」しません。適切に評価して出力を更新するには、別の条件 (別のボタンを押す) を待つ必要があります。

これを解決する方法は複数あります。

  • ステート マシン ロジックの完全な機密リストがあることを確認できます。
  • VHDL-2008 ではprocess(all)、センシティビティ リストに必要なすべての入力を自動的にリストするために使用できます (コンパイラのサポートは異なる場合があります)。
  • この問題を回避する「単一プロセス ステート マシン」スタイルの使用を選択できます。ただし、さまざまなスタイルのステート マシンには、考慮すべき長所と落とし穴があります。
于 2015-02-11T01:59:44.270 に答える