0

2進数を10進数に変換する方法は理解していますが、それを行うはずの次のコードは意味がありません。つまり、2 進数の 10 があるとすると、v(i) は 0 になるため、結果は 0 のままです。次の反復では、v(i) は 1 になるため、結果は 0 + 1 になります。ループが停止し、関数は、関数に入れられた 2 進数の値である 2 ではなく、1 である結果の値を返します。誰かが私が間違っている理由を教えてもらえますか? このコードは大学の課題に付属しているため、正しいはずです。ありがとう。:)

-------------------------------------------------------------------------------
-- convert std_logic vector v to natural
-------------------------------------------------------------------------------

FUNCTION s2n(v: std_logic_vector)
RETURN natural IS
VARIABLE result: natural := 0;
BEGIN
    FOR i IN v'range LOOP
            result := result * 2;
            IF v(i) = '1' THEN
                    result := result + 1;
            END IF;
    END LOOP;
    RETURN result;
END s2n;
4

1 に答える 1

1

ループは'range左から右に機能します。規則は、最上位ビットが左側にあることです。

それを最初にデコードすることにより、*2操作は予想どおりMSBでほとんどの場合実行されます。

(ところで、何らかの理由で範囲を逆にしたい場合は、'reverse_range属性を使用できます)

于 2012-05-21T12:04:59.437 に答える