0

Quartus II で CYCLONE III EP3C25 FPGA 用の VHDL プログラムを作成していますが、問題が発生しました。

私のプログラムの重要な部分は次のとおりです。

odata : out std_logic_vector(15 downto 0);

signal buf_data : std_logic_vector(255 downto 0);

signal nb_word : integer :=0;

Process(clk,RST)
begin
    if(RST='0') then
        nb_word<=0;
    elsif(clk'event and clk='0') then
        if(Current_state_w=s2) then
            if(nb_word<=X"F0") then
                nb_word<=nb_word+16;
            else
                nb_word<=0;
            end if;
        end if;
    end if;
end process;

Process(clk,RST)

begin
    if(RST='0') then
        odata<=(OTHERS=>'0');
    elsif(clk'event and clk='0') then
            odata<=buf_data(nb_word+15 downto nb_word);
    end if;
end process;

このコードは正常にコンパイルされていますが、私がやりたいことをしていないので、変更したかっただけです:

odata<=buf_data(nb_word+15 downto nb_word);

odata<=buf_data(nb_word downto nb_word-15);

そして、nb_word の初期化とリセットの値を 0 ではなく 15 に変更しました。

問題は、それを行ってコンパイルしようとすると、次のエラーが発生することです。

Error (10779): VHDL error at VL_control.vhd(99): expression is not constant

この行は、odata 行の変更に対応しています。

なぜこのエラーが発生したのか、本当に理解できません。足し算はできるのに引き算ができないのはなぜですか? また、別のシグナルを定義し、そのようなバッファをアドレス指定する前にシグナルで減算を実行しようとしました:

nb_word1 := (nb_word-15);
odata<=buf_data(nb_word downto nb_word1);

しかし、私はまだ同じエラーが発生します。それはどこから来たのですか?

4

2 に答える 2

1

nb_word整数の範囲に制限する必要があります。これにより、合成ツールは の値nb_word - 15が負になることはできないことを確実に認識できます。

また、整数をビット文字列リテラルと比較するのはなぜですか? なぜ言わないのif nb_word < 15ですか?

于 2012-11-30T15:06:26.717 に答える
-1

正しいテストを使用する方が簡単だったかもしれません

if nb_word < X"F0" then

それ以外の

if(nb_word<=X"F0") then

「odata」プロセスをそのままにしました。

ただし、必要な 3 つの場所すべてで nb_word の初期値を変更した限り (2 つだけ言及しました)、ソリューションがコンパイルに失敗した理由はわかりません。

ブール式を囲む無意味な括弧の流行はどこから来たのですか? についてはいろいろあるようですが…

于 2012-11-29T15:03:44.130 に答える