VHDL:在这种情况下不能有这样的操作数(sobel过滤器)

时间:2012-05-09 12:37:20

标签: vhdl fpga xilinx

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_arith.all;
    --use ieee.std_logic_unsigned.all;
    --use ieee.std_logic_signed.all;


    entity sobel is 
         port ( 
              top_left_pixel      : in  std_logic; 
              top_middle_pixel    : in  std_logic; 
              top_right_pixel     : in  std_logic; 
              middle_left_pixel   : in  std_logic; 
              middle_right_pixel  : in  std_logic; 
              bottom_left_pixel   : in  std_logic; 
              bottom_middle_pixel : in  std_logic; 
              bottom_right_pixel  : in  std_logic; 
              sobelx              : out std_logic; 
              sobely              : out std_logic 
         ); 
    end entity sobel; 

    architecture noddy of sobel is 
        signal p1 : std_logic := top_left_pixel;
        signal p2 : std_logic := top_middle_pixel;
        signal p3 : std_logic := top_right_pixel;
        signal p4 : std_logic := middle_left_pixel;
        signal p6 : std_logic := middle_right_pixel;
        signal p7 : std_logic := bottom_left_pixel;
        signal p8 : std_logic := bottom_middle_pixel;
        signal p9 : std_logic := bottom_right_pixel;

        signal sobelx_s : integer;
        signal sobely_s : integer; 

    begin 
        -- Same error on both these lines
         sobelx_s <= (p3 - p1) + ((p6 & '0') - (p4 & '0')) + (p9 - p7); 

         sobely_s <= (bottom_left_pixel - top_left_pixel) + ((bottom_middle_pixel & '0') - (top_middle_pixel & '0')) + (bottom_right_pixel - top_right_pixel); 

    end architecture noddy; 

我正在尝试用很少的经验在VHDL中构建一个sobel滤波器。这个实体只是为了试用它来测试,看看sobel算法是否适用于输入数据。

有什么建议吗?

所有的答案都非常感谢,如果你能指导一个完整的VHDL初学者做一些有用的事情,那么欢迎你

2 个答案:

答案 0 :(得分:2)

该代码looks familiar :)我认为architecture noddy有点不寻常......

尝试这一点(来自上面的链接):

entity sobel is

    port (
        top_left_pixel      : in  integer;
        top_middle_pixel    : in  integer;
        top_right_pixel     : in  integer;
        middle_left_pixel   : in  integer;
        middle_right_pixel  : in  integer;
        bottom_left_pixel   : in  integer;
        bottom_middle_pixel : in  integer;
        bottom_right_pixel  : in  integer;
        sobelx              : out integer;
        sobely              : out integer
    );

end entity sobel;
architecture noddy of sobel is

begin  -- architecture noddy

    sobelx <= (-1*top_left_pixel)+(-2*middle_left_pixel)+(-1*bottom_left_pixel)
              +(1*top_right_pixel)+(2*middle_right_pixel)+(1*bottom_right_pixel);
    sobely <= (-1*top_left_pixel)+(-2*top_middle_pixel)+(-1*top_right_pixel)
              +(1*bottom_left_pixel)+(2*bottom_middle_pixel)+(1*bottom_right_pixel);
end architecture noddy;

答案 1 :(得分:1)

首先,Sobel算子通常使用卷积应用于灰度图像。或者也许你真的想要一个二进制图像。所以Sobel矩阵就像是:

-1 0 +1
-2 0 +2
-1 0 +1

进行横向更改。你想用原始图像卷积它。首先尝试使用灰度输入,然后尝试使用二进制图像输入。

您收到VHDL错误的原因是您无法添加+)或在std_logicstd_logic_vector上进行任何数学运算。您需要使用重载数学运算符的unsignedsigned类型(此处可能为signed)。使用numeric_std库(您的VHDL环境应该具有该功能;它非常标准)。

如果你有一个真实实体,其输入是真实信号,它们应该是std_logic_vector。然后,您需要按照this graph将其投放到signed / unsigned