【问题标题】:can't determine definition of operator ""-""无法确定运算符“”-“”的定义
【发布时间】:2015-09-25 12:12:06
【问题描述】:

我遇到了运算符“-”的错误。使用有符号类型和 ieee.numeric_std。我想问一下我对“for”的用法是否正确。


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_signed.ALL;
use IEEE.STD_LOGIC_TEXTIO.ALL;
use ieee.numeric_std.all;   

entity stage_1 is
Port ( 
clk : in bit;
imagem: in SIGNED (19999 DOWNTO 0);
imagemanterior: in SIGNED (19999 DOWNTO 0);
Ix: out SIGNED (24999 DOWNTO 0);
Iy: out SIGNED (24999 DOWNTO 0);
It: out SIGNED (24999 DOWNTO 0)
);
end stage_1;

architecture Behavioral of stage_1 is
begin
 process (clk)

 begin

If (clk 'event and clk = '1') then

for I in 0 to 2448 loop 
Ix(I*10+9 DOWNTO I*10) <= 1/4 * (imagemanterior((I+1)*8+7 DOWNTO (I+1)*8) -       imagemanterior(I*8+7 DOWNTO I*8) + imagemanterior ((I+1)*8+407 DOWNTO 

(I+1)*8+400) - imagemanterior(I*8+407 DOWNTO I*8+400) + imagem((I+1)*8+7 DOWNTO(I+1)*8) - imagem(I*8+7 DOWNTO I*8)+ imagem((I+1)*8+407 DOWNTO(I+1)*8) - imagem((I)*8+407 DOWNTO I*8 +400));

Iy(I*10+9 DOWNTO I*10) <= 1/4*(imagemanterior((I*8)+407 DOWNTO (I)*8+400) - imagemanterior(I*8+7 DOWNTO I*8) + imagemanterior((I+1)*8+407 DOWNTO (I+1)*8) - imagemanterior((I+1)*8+7 DOWNTO(I+1)*8) + imagem(I*8+407 DOWNTO I*8+400) - imagem(I*8+7 DOWNTO I*68) + imagem((I+1)*8+407 DOWNTO (I+1)*8+400) -imagem((I+1)*8+7 DOWNTO(I+1)*8));

It(I*10+9 DOWNTO I*10) <= 1/4 * (imagem(I*8+7 DOWNTO I*8)- imagemanterior((I*8+7)-I*8) + imagem((I*8)+407 DOWNTO I*8+400)- imagemanterior(I*8+407 DOWNTO I*8+400) +imagem((I+1)*8+7 DOWNTO(I+1)*8)- imagemanterior((I+1)*8+7 DOWNTO(I+1)*8) + imagem((I+1)*8+407 DOWNTO (I+1)*8+400)- imagemanterior((I+1)*8+407 DOWNTO (I+1)*8+400));

end loop;
end if ;
end process;
end Behavioral;

【问题讨论】:

  • 格式化您的问题:从文本中删除垃圾并从代码中删除空行。
  • 这是一个有用的资源:www.sscce.org
  • 删除std_logic_signed 如果- 的两个定义适合,编译器无法知道您的意思,所以在您消除歧义之前,两者都被重新定义为“隐藏”。
  • 尝试删除 IEEE.STD_LOGIC_1164.ALL 和 IEEE.STD_LOGIC_signed.ALL。我仍然遇到同样的错误。
  • 奇怪的是,我只在 It 行中得到错误,而且它在该行的第一个“-”中。

标签: vhdl operator-keyword definition


【解决方案1】:

我注释掉了与您的错误无关的作业。

您可以提供与错误相关的位置(指向哪一行)的指示。

在指定错误抱怨的- 运算符的右手操作数范围时,您基本上使用了- 运算符而不是downto。哪里标有注释:

 -- downto was "-"

您可以提供Minimal, Complete, and Verifiable example,在这种情况下,这意味着将与错误无关的东西扔掉。

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.std_logic_signed.all;
-- use ieee.std_logic_textio.all;
use ieee.numeric_std.all;   

entity stage_1 is
    port ( 
        clk:            in  bit;
        imagem:         in  signed (19999 downto 0);
        imagemanterior: in  signed (19999 downto 0);
        ix:             out signed (24999 downto 0);
        iy:             out signed (24999 downto 0);
        it:             out signed (24999 downto 0)
    );
end entity stage_1;

architecture behavioral of stage_1 is
begin
    process (clk)
    begin
        if (clk 'event and clk = '1') then
            for i in 0 to 2448 loop 
                --ix(i*10+9 downto i*10) <= 1/4 * (imagemanterior((i+1)*8+7 downto (i+1)*8) -       imagemanterior(i*8+7 downto i*8) + imagemanterior ((i+1)*8+407 downto 
                    -- (i+1)*8+400) - imagemanterior(i*8+407 downto i*8+400) + imagem((i+1)*8+7 downto(i+1)*8) - imagem(i*8+7 downto i*8)+ imagem((i+1)*8+407 downto(i+1)*8) - imagem((i)*8+407 downto i*8 +400));

                --iy(i*10+9 downto i*10) <= 1/4*(imagemanterior((i*8)+407 downto (i)*8+400) - imagemanterior(i*8+7 downto i*8) + imagemanterior((i+1)*8+407 downto (i+1)*8) - imagemanterior((i+1)*8+7 downto(i+1)*8) + imagem(i*8+407 downto i*8+400) - imagem(i*8+7 downto i*68) + imagem((i+1)*8+407 downto (i+1)*8+400) -imagem((i+1)*8+7 downto(i+1)*8));

                it( i*10 + 9 downto i * 10) <= 

                1/4 * ( 

                    imagem(i * 8 + 7 downto i * 8) - 

                    imagemanterior( (i * 8 + 7) downto i * 8) +   -- downto was "-"

                     imagem((i * 8 )+ 407 downto i * 8 + 400) - 

                     imagemanterior( i * 8 + 407 downto i * 8 + 400) +

                     imagem((i + 1) * 8 + 7 downto( i + 1) * 8) - 

                     imagemanterior((i + 1) * 8 + 7 downto(i + 1) * 8) + 

                     imagem((i + 1) * 8 + 407 downto (i + 1) * 8 + 400) - 

                     imagemanterior((i + 1) * 8 + 407 downto (i + 1) * 8 + 400)

                 ) ;

             end loop;
         end if ;
     end process;
end architecture behavioral;

在将- 运算符更改为保留字downto 之后,您的代码分析(我并没有声称它会运行,这需要一个测试台来驱动clk)。

添加一个基本的测试平台来驱动 clk

表明你的第一个作业:

            ix(i*10+9 downto i*10) <= 1/4 * (imagemanterior((i+1)*8+7 downto (i+1)*8) -       imagemanterior(i*8+7 downto i*8) + imagemanterior ((i+1)*8+407 downto 
                (i+1)*8+400) - imagemanterior(i*8+407 downto i*8+400) + imagem((i+1)*8+7 downto(i+1)*8) - imagem(i*8+7 downto i*8)+ imagem((i+1)*8+407 downto(i+1)*8) - imagem((i)*8+407 downto i*8 +400));

产生范围错误(右侧表达式的范围与左侧切片的范围不匹配)。

第二次赋值也是如此:

            iy(i*10+9 downto i*10) <= 1/4*(imagemanterior((i*8)+407 downto (i)*8+400) - imagemanterior(i*8+7 downto i*8) + imagemanterior((i+1)*8+407 downto (i+1)*8) - imagemanterior((i+1)*8+7 downto(i+1)*8) + imagem(i*8+407 downto i*8+400) - imagem(i*8+7 downto i*68) + imagem((i+1)*8+407 downto (i+1)*8+400) -imagem((i+1)*8+7 downto(i+1)*8));

以及最后一个(使用 - 运算符而不是 downto,已更正)。

这些都是运行时错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多