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 的初始化和重置值更改为 15 而不是 0。

问题是,当我这样做并尝试编译时,我得到了这个错误:

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”过程。

但是,我不确定为什么您的解决方案无法编译,只要您在所需的所有三个地方都更改了 nb_word 的初始值(您只提到了两个)。

布尔表达式周围无意义的括号的流行从何而来?好像有很多关于...

于 2012-11-29T15:03:44.130 回答