1

私は2つの変数を比較しようとしています:

variable E1, E2 : unsigned(5 downto 0);

と:

if (E1 < E2) then
lt_val := '1';
end if;

しかし、コンパイルしようとするとそのエラーが発生します。

何が間違っているのかわかりません。

編集: これが完全なファイルです。unsigned を std_logic_vector に戻し、numeric_std ライブラリを使用しました。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity FPA is
    port (clk, st : in  std_logic;
          d1      : in  std_logic_vector(15 downto 0);
          d2      : in  std_logic_vector(15 downto 0);
          sum     : out std_logic_vector(15 downto 0);
          rdy     : out std_logic);

end FPA;

architecture behav of FPA is

    type state is (s0, s1, s2, s3, s4, s5, s6, s7);
    signal new_state : state;
    signal norm      : std_logic;
    signal lt, gt    : std_logic;

begin

    process is
        variable curr_state : state := s7;
    begin
        if clk = '1' then
            case curr_state is
                when s0 =>
                    if st = '1' then curr_state := s1;
                    end if;
                when s1 =>
                    curr_state := s2;
                when s2 =>
                    if gt = '1' then curr_state := s4;
                    end if;
                    if lt = '1' then curr_state := s3;
                    end if;
                    if not((lt = '1') or (gt = '1')) then
                        curr_state := s5;
                    end if;
                when s3 =>
                    curr_state := s1;
                when s4 =>
                    curr_state := s1;
                when s5 =>
                    if norm = '1' then
                        curr_state := s6;
                    else
                        curr_state := s7;
                    end if;
                when s6 =>
                    curr_state := s7;
                when s7 =>
                    if st = '0' then curr_state := s0;
                    end if;
            end case;
            new_state <= curr_state;
        end if;
        new_state <= curr_state;
        wait on clk;
    end process;

    process is
        variable E1                : std_logic_vector(5 downto 0);
        variable E2                : std_logic_vector(5 downto 0);
        variable sum_val           : std_logic_vector(15 downto 0);
        variable X, Y              : std_logic_vector(11 downto 0);
        variable SGR               : std_logic_vector(11 downto 0);
        variable rdy_val, norm_val : std_logic;
        variable gt_val, lt_val    : std_logic;
    begin

        -- defaults

        rdy_val := '0';
        case new_state is

            when s0 =>
                sum_val := "ZZZZZZZZZZZZZZZZ";
                E1      := d1(15 downto 10);
                X       := "01" & d1(9 downto 0);
                E2      := d2(15 downto 10);
                Y       := "01" & d2(9 downto 0);
            when s1 =>
                if (E1 < E2) then
                    lt_val := '1';
                end if;
                if (E1 > E2) then
                    gt_val := '1';
                end if;
                SGR := X + Y;
            when s2 =>
                if SGR(11) = '1' then
                    norm_val := '1';
                end if;
            when s3 =>
                X  := X ror 1;
                E1 := E1 + "000001";
            when s4 =>
                Y  := Y ror 1;
                E2 := E2 + "000001";
            when s5 =>
            when s6 =>
                SGR := SGR ror 1;
                E2  := E2 + "000001";
            when s7 =>
                sum_val := E2 & SGR(9 downto 0);
                rdy_val := '1';
        end case;

        rdy  <= rdy_val;
        lt   <= lt_val;
        gt   <= gt_val;
        sum  <= sum_val;
        norm <= norm_val;

        wait on new_state;
    end process;

end behav;
4

3 に答える 3

1

非標準パッケージを使用しない限り、比較演算子は std_logic_vector に対して定義されていません。あなたが言及した変更を行う前にあなたのコードがどのように見えたかはわかりませんが、コードが現在のように、行を変更することでこれを修正できるはずです

if (E1<E2) then

if (unsigned(E1) < unsigned(E2)) then

「+」演算子はstd_logic_vectorにも定義されていないため、E1とE2をunsignedとstd_logic_vectorの間で算術演算を行うたびにキャストする必要があることに注意してください。あなたの場合、E1 と E2 を std_logic_vector の代わりに符号なしとして定義する方が良いでしょう。(std_logic_unsigned など)

于 2012-10-01T09:28:29.623 に答える
1

E1and E2as を宣言unsignedすることは正しい選択でしたが、十分ではありませんでした。

他のいくつかの変数を として宣言しunsigned、入力を から に動的に変換std_logic_vectorし、変数を に動的に変換しunsignedて outputを割り当てる必要があります。sum_valstd_logic_vectorsum

次の行にパッチを適用しても問題ないようです (少なくとも ModelSim でコンパイルされます)。

    variable E1                : unsigned(5 downto 0);
    variable E2                : unsigned(5 downto 0);
    variable sum_val           : unsigned(15 downto 0);
    variable X, Y              : unsigned(11 downto 0);
    variable SGR               : unsigned(11 downto 0);
    -- ...
    E1      := unsigned(d1(15 downto 10));
    X       := unsigned("01" & d1(9 downto 0));
    E2      := unsigned(d2(15 downto 10));
    Y       := unsigned("01" & d2(9 downto 0));
    -- ...
    sum  <= std_logic_vector(sum_val);
于 2012-10-01T09:40:19.457 に答える
0

すべてのベクトルを元に戻しますunsigned(結局、それらは数値を表します)。

それでもコンパイルできない場合は、コンパイラに欠陥がある可能性があります (Modelsim では動作します)。

于 2012-10-01T10:18:39.350 に答える