1

割り当て用に 1 ビット ALU を設計する必要があり、それを再利用して 4 つのユニットと 4 ビット ALU を作成します。

1ビットALUには2つの選択ラインと入力A、B、およびキャリーインがあります。

私の問題は、選択行とキャリーインフラグが選択する操作を選択することです。選択ラインとキャリーフラグを同時に使用して操作を選択する方法がわかりません。

たとえば、選択ライン「00」と Cin「0」は加算演算であり、Cin「1」は減算演算です。

以下で行ったことを行うことができますか?ご協力いただきありがとうございます。

entity ALU1Bit is
port(
    A:  IN std_logic_vector;
    B:  IN std_logic; 
    carryIn:      IN std_logic;                                  
    operation: IN std_logic_vector(1 downto 0); 

    F:   OUT std_logic;
    carryOut: OUT std_logic
    );
end ALU1Bit;

architecture Behavioral of ALU1Bit is

component Adder1Bit
port(
    carryIn:  IN std_logic;
    A: IN std_logic;
    B: IN std_logic;

    output:  OUT std_logic;
    F: OUT std_logic
    );
end component;

begin
carryIn <= '0';
    case operation is
        when...
carryIn <= '1';
    case operation is
        when...

end Behavioral;
4

1 に答える 1

0

あなたが見逃しているように見えるのは、ネストされた case ステートメントを持つことができるということです。あなたのコード:

carryIn <= '0';
    case operation is
        when...
carryIn <= '1';
    case operation is
        when...

ある種の正しい行にありますが、ケースステートメントはプロセス内にある必要があり、ブライアンが言うように、「0」と「1」をキャリーイン入力に割り当てようとしていますが、これは許可されていません。この 2 行の意味は、別の case ステートメントのように機能させることだったと思います。次のようなものが必要です。

process (carryIn, operation, ...)
begin
    case carryIn is
        when '0' =>
            case operation is
                when "00" => ...
                when "01" => ..
            end case;
        when '1' =>
            case operation is =>
            ...
    end case;
end process;

重複するケース、つまり、実際には同じことを行うこの構造内の 2 つ以上のケースがある可能性が高いようです。これらの場合に起こることを変更する必要があるたびに、それらを 2 回変更する必要があり、エラーが発生しやすいため、これは悪いことです。

この場合、上記のような 1 つの case ステートメントを使用できます。これは、列挙型を使用して操作モードを割り当てるだけです。次に例を示します。

type ALU_OP_type is (ADD, SUBTRACT, ...);
signal aluOp : ALU_OP_type;

次に、プロセスで:

    case carryIn is
        when '0' =>
            case operation is
                when "00" => aluOp <= ADD;
                when "01" => aluOp <= SUBTRACT;

など。最後に、これらの単純な読み取り可能な操作を使用して何かを行う別の case ステートメント (おそらく別のプロセス内):

    case aluOp is
        when ADD => ...
        when SUBTRACT => ...

あなたのコードは、「何をしようとしているのか」と「何かをする」にうまく分かれています。重複したキャリーイン/操作の組み合わせがない場合、これはおそらく努力する価値がありません。

于 2015-01-26T11:38:22.540 に答える