1
    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 初学者引导到有用的东西,不客气

4

2 回答 2

2

那个代码看起来很熟悉:) 我觉得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;
于 2012-05-09T14:52:25.380 回答
1

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

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

用于水平变化。您想将其与原始图像进行卷积。首先尝试使用灰度输入,然后您可以尝试使用二进制图像输入。

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

如果你有一个真实的实体,其中的输入是真实的信号,它们应该是std_logic_vector. 然后,您需要按照此图signed将它们转换为/ 。unsigned

于 2012-05-09T15:02:45.783 回答