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初学者做一些有用的事情,那么欢迎你
答案 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_logic
或std_logic_vector
上进行任何数学运算。您需要使用重载数学运算符的unsigned
和signed
类型(此处可能为signed
)。使用numeric_std
库(您的VHDL环境应该具有该功能;它非常标准)。
如果你有一个真实实体,其输入是真实信号,它们应该是std_logic_vector
。然后,您需要按照this graph将其投放到signed
/ unsigned
。