📄 edge_detector.txt
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
library BEH_INT;
use BEH_INT.IMAGE_PROCESSING.all;
entity EDGE_DETECTOR is
generic( NUM_ROWS: NATURAL;
NUM_COLS: NATURAL);
Port ( CLOCK : in STD_LOGIC;
EDGE_START : in STD_LOGIC;
INPUT : in STD_LOGIC;
OUTPUT : inout STD_LOGIC );
end EDGE_DETECTOR;
architecture BEHAVIORAL of EDGE_DETECTOR is
type MEMORY_ARRAY is array(1 to 3, 1 to NUM_COLS) of PIXEL;
begin
SOBEL: process
CONSTANT THRESHOLD: FILTER_OUT:=1020;
variable BUSY1,BUSY2 : std_logic:='0';
variable A : PIXEL3_3:=((0,0,0),(0,0,0),(0,0,0));
variable TEMP : PIXEL;
variable E_H : FILTER_OUT;
variable E_V : FILTER_OUT;
variable MAG : FILTER_OUT;
variable X1:NATURAL:=1;
variable Y1:NATURAL:=1;
variable X2:NATURAL:=1;
variable Y2:NATURAL:=1;
variable COUNT_R1,COUNT_R2: INTEGER:=0;
variable MEMORY: MEMORY_ARRAY;
begin
wait until rising_edge(CLOCK);
if EDGE_START ='1' then
BUSY1:='1';
end if;
if BUSY1 ='1' then
MEMORY(X1,Y1):=INPUT;
if COUNT_R1=2 and Y1=1 then
BUSY2:='1';
end if;
Y1:=Y1+1;
if Y1=NUM_COLS+1 then
Y1:=1;
X1:=X1+1;
COUNT_R1:=COUNT_R1+1;
end if;
if X1=4 then
X1:=1;
end if;
if COUNT_R1=NUM_ROWS then
BUSY1:='0';
end if;
end if;
if BUSY2='1' then
for J in 1 to 2 loop
for I in 1 to 3 loop
A(I, J):= A(I, J+1);
end loop;
end loop;
for I in 1 to 3 loop
X2:= (COUNT_R2 +I-1)mod 3+1;
A(I, 3):=memory(X2,Y2);
end loop;
Y2:=Y2+1;
if Y2=NUM_COLS+1 then
COUNT_R2:=COUNT_R2+1;
Y2:=1;
end if;
if COUNT_R2 = NUM_ROWS-2 then
BUSY2 := '0';
end if;
E_H := HORIZONTAL_FILTER(A);
E_V := VERTICAL_FILTER(A);
COMPARE(E_H,E_V);
MAG:= MAGNITUDE(M,P);
if MAG >= THRESHOLD then
TEMP := FOREGROUND;
else
TEMP := BACKGROUND;
end if;
OUTPUT <= TEMP;
end if;
end process SOBEL;
end BEHAVIORAL;
IMAGE_PROCESSING包声明
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package IMAGE_PROCESSING is
constant FOREGROUND:INTEGER:=255;
constant BACKGROUND:INTEGER:=0;
subtype PIXEL is INTEGER;
type PIX3 is array (1 to 3) of PIXEL;
type PIXEL3_3 is array(1 to 3, 1 to 3) of PIXEL;
subtype FILTER_OUT is INTEGER;
subtype DIRECTION is STD_LOGIC_VECTOR(2 downto 0);
function WEIGHT ( X1,X2,X3: PIXEL)
return FILTER_OUT;
function SHIFT_LEFT ( A: PIX3; B: PIXEL)
return PIX3;
function HORIZONTAL_FILTER ( A: PIXEL3_3)
return FILTER_OUT;
function VERTICAL_FILTER ( A: PIXEL3_3)
return FILTER_OUT;
function DIAGONAL_L_FILTER ( A: PIXEL3_3)
return FILTER_OUT;
function DIAGONAL_R_FILTER ( A: PIXEL3_3)
return FILTER_OUT;
function MAGNITUDE ( A,B:in FILTER_OUT;MAG:in FILTER_OUT)
return FILTER_OUT;
end IMAGE_PROCESSING;
IMAGE_PROCESSING包主体的描述
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package body IMAGE_PROCESSING is
function WEIGHT ( X1,X2,X3: PIXEL)
return FILTER_OUT is
begin
return X1+ 2*X2 + X3;
end WEIGHT;
function SHIFT_LEFT ( A: PIX3; B: PIXEL)
return PIX3 is
begin
return A(2) & A(3) & B;
end SHIFT_LEFT;
function HORIZONTAL_FILTER ( A: PIXEL3_3)
return FILTER_OUT is
begin
return WEIGHT( A(1,1), A(1,2), A(1,3) ) - WEIGHT( A(3,1), A(3,2), A(3,3) );
end HORIZONTAL_FILTER;
function VERTICAL_FILTER ( A: PIXEL3_3)
return FILTER_OUT is
begin
return WEIGHT( A(1,3), A(2,3), A(3,3)) -WEIGHT(A(1,1), A(2,1), A(3,1));
end VERTICAL_FILTER;
function MAGNITUDE (A,B:in FILTER_OUT;
MAG:out FILTER_OUT)
return FILTER_OUT is
variable AH: FILTER_OUT:=0;
variable AV: FILTER_OUT:=0;
begin
if AH <0 then AH := -AH;
else AH:=AH
end if;
if AV <0 then AV := -AV;
else AV := AV;
end if;
MAG:=AH+AV;
end MAGNITUDE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -