0

FPGA、基本的な(しかし難しい)プロジェクトをプログラミングするためのVHDLを学んでいます。私はこのALUを持っています。4 ビット ALU であると想定されます。しかし、 Add操作をresultisの値にしたい場合UUUU。他のすべての操作については、正常に機能しています。

何かアドバイスはありますか?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

use IEEE.NUMERIC_STD.ALL;


entity ALU is
    Port (
                clk: in std_logic;
                reset: in std_logic;
                operation: in std_logic_vector (2 downto 0)
          );
end ALU;

architecture Behavioral of ALU is
    signal A : std_logic_vector (3 downto 0) := "0001";
    signal B : std_logic_vector (3 downto 0) := "1111";
    signal result : std_logic_vector (7 downto 0);
    signal flags : std_logic_vector (2 downto 0);   -- [S,OF,Z] 
begin

    process (operation) begin
        flags <= (others => '0');
        result <= (others => '0');
        case operation is
            when "000" => 
                result <= std_logic_vector((unsigned("0000"&A) + unsigned(B)));
                flags(1) <= result(4);
            when "001" =>
                if (A >= B) then
                    result <= std_logic_vector(unsigned("0000"&A) - unsigned(B));
                    flags(2) <= '0';
                else
                    result <= std_logic_vector(unsigned("0000"&B) - unsigned(A));
                    flags(2) <= '1';
                end if;
            when "010" =>
                result <= "0000"&A and "0000"&B;
            when "011" =>
                result <= "0000"&A or "0000"&B;
            when "100" =>
                result <= "0000"&A xor "0000"&B;
            when "101" =>
                result <= not ("1111"&A);
            when "110"  =>
                result <= not ("1111"&B);
            when "111" =>
                result <= std_logic_vector(unsigned(A) * unsigned(B));
            when others =>
                result <= (others => 'Z');
        end case;
    end process;

end Behavioral;
4

2 に答える 2

1

Uすべての sが発生していることを確認できる唯一の方法(コードをそのまま使用) は、プロセス実行されない場合です。operationこれは、追加操作のシグナルにトランザクションが存在してはならないことを意味します。

これは、より多くの質問を提起するだけです:

あなたは間違いなくUs を取得していますか (Xおそらく s ではありませんか?): 他の何かが信号を駆動していますか?

テストベンチのコードを投稿できますか?

于 2011-11-17T13:09:52.280 に答える
0

コードを見て最初に思い浮かぶのは次の 2 つです。

  1. Aプロセス機密リストにとを含める必要がありBます (現在は のみが含まれていますoperation)。

  2. プロセス後にのみ更新され、それ自体は再び機密リストに含まれていないため、変更されたresult(4)値を反映するためにプロセスが再度トリガーされることはありません。最適なオプションは、おそらく合計を に格納し、それをと オーバーフロー ビットに割り当てることです。flags(1)result(4)resultvariableresult

于 2011-11-17T12:40:34.023 に答える