OpenCores
URL https://opencores.org/ocsvn/fully-pipelined-edge-detection-algorithms/fully-pipelined-edge-detection-algorithms/trunk

Subversion Repositories fully-pipelined-edge-detection-algorithms

[/] [fully-pipelined-edge-detection-algorithms/] [trunk/] [src/] [RobertsFilter.vhd] - Blame information for rev 14

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 muhammedko
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date: 01/13/2022 10:56:24 PM
6
-- Design Name: 
7
-- Module Name: RobertsFilter - Behavioral
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool Versions: 
11
-- Description: 
12
-- 
13
-- Dependencies: 
14
-- 
15
-- Revision:
16
-- Revision 0.01 - File Created
17
-- Additional Comments:
18
-- 
19
----------------------------------------------------------------------------------
20
LIBRARY IEEE;
21
USE IEEE.STD_LOGIC_1164.ALL;
22
USE work.OperatorOverloading_pkg.ALL;
23
USE work.EdgeDetection_pkg.ALL;
24
use IEEE.NUMERIC_STD.ALL;
25
 
26
 
27
ENTITY RobertsFilter IS
28
    PORT (
29
        CLK                     : IN STD_LOGIC;
30
        EdgeDetection_Enable    : IN STD_LOGIC;
31
        EdgeDetection_Disable   : IN STD_LOGIC;
32
        EdgeDetection_Din       : IN array2D(0 TO 1)(7 DOWNTO 0);
33
        EdgeDetection_Dout      : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
34
        EdgeDetection_Ready     : OUT STD_LOGIC
35
    );
36
END RobertsFilter;
37
 
38
ARCHITECTURE Behavioral OF RobertsFilter IS
39
 
40
signal Din_Buffer               : array3D(0 to 1)(0 to 1)(7 downto 0)   := (others => (others => (others => '0')));
41
 
42
signal MultArray_Reg_x          : array3D(0 to 1)(0 to 1)(16 downto 0)  := (others => (others => (others => '0')));
43
signal AddArray_Layer1_x        : array2D(0 to 1)(16 downto 0)          := (others => (others => '0'));
44
signal AddArray_Layer2_x        : std_logic_vector(16 downto 0)         := (others => '0');
45
signal Convolution_Res_x        : std_logic_vector(33 downto 0)         := (others => '0');
46
 
47
signal MultArray_Reg_y          : array3D(0 to 1)(0 to 1)(16 downto 0)  := (others => (others => (others => '0')));
48
signal AddArray_Layer1_y        : array2D(0 to 1)(16 downto 0)          := (others => (others => '0'));
49
signal AddArray_Layer2_y        : std_logic_vector(16 downto 0)         := (others => '0');
50
signal Convolution_Res_y        : std_logic_vector(33 downto 0)         := (others => '0');
51
 
52
signal EdgeDetection_Dout_Reg   : STD_LOGIC_VECTOR(33 DOWNTO 0)         := (others => '0');
53
 
54
    TYPE states IS (
55
        S_IDLE,
56
        S_CONVOLVE
57
    );
58
    SIGNAL state : states := S_IDLE;
59
 
60
    constant Coeff_x : array3D(0 to 1)(0 to 1)(7 downto 0) := (
61
        (x"01", x"00"),
62
        (x"00", x"FF")
63
    );
64
    constant Coeff_y : array3D(0 to 1)(0 to 1)(7 downto 0) := (
65
        (x"00", x"01"),
66
        (x"FF", x"00")
67
    );
68
 
69
    signal cntr         : integer range 0 to 7 := 0;
70
    signal cntrDisable  : integer range 0 to 7 := 0;
71
 
72
BEGIN
73
 
74
    P_MAIN : PROCESS (CLK)
75
    BEGIN
76
        IF rising_edge(CLK) THEN
77
            CASE state IS
78
                WHEN S_IDLE =>
79
                    EdgeDetection_Ready <= '0';
80
                    IF EdgeDetection_Enable THEN
81
                        state <= S_CONVOLVE;
82
                        Din_Buffer(0)           <=  EdgeDetection_Din;
83
                        Din_Buffer(1)           <= Din_Buffer(0);
84
                        cntr                    <= 0;
85
                    END IF;
86
 
87
                WHEN S_CONVOLVE =>
88
                    Din_Buffer(0)               <=  EdgeDetection_Din;
89
                    Din_Buffer(1)               <= Din_Buffer(0);
90
 
91
                    MultArray_Reg_x             <= Coeff_x * ("0" & Din_Buffer);
92
                    AddArray_Layer1_x(0)        <= std_logic_vector(signed(MultArray_Reg_x(0)(0)) + signed(MultArray_Reg_x(0)(1)));
93
                    AddArray_Layer1_x(1)        <= std_logic_vector(signed(MultArray_Reg_x(1)(0)) + signed(MultArray_Reg_x(1)(1)));
94
                    AddArray_Layer2_x           <= std_logic_vector(signed(AddArray_Layer1_x(0)) + signed(AddArray_Layer1_x(1)));
95
                    Convolution_Res_x           <= std_logic_vector(signed(AddArray_Layer2_x) * signed(AddArray_Layer2_x));
96
 
97
                    MultArray_Reg_y             <= Coeff_y * ("0" & Din_Buffer);
98
                    AddArray_Layer1_y(0)        <= std_logic_vector(signed(MultArray_Reg_y(0)(0)) + signed(MultArray_Reg_y(0)(1)));
99
                    AddArray_Layer1_y(1)        <= std_logic_vector(signed(MultArray_Reg_y(1)(0)) + signed(MultArray_Reg_y(1)(1)));
100
                    AddArray_Layer2_y           <= std_logic_vector(signed(AddArray_Layer1_y(0)) + signed(AddArray_Layer1_y(1)));
101
                    Convolution_Res_y           <= std_logic_vector(signed(AddArray_Layer2_y) * signed(AddArray_Layer2_y));
102
 
103
                    EdgeDetection_Dout_Reg  <= std_logic_vector(unsigned(Convolution_Res_x) + unsigned(Convolution_Res_y));
104
 
105
                    if cntr = 5 then
106
                        cntr    <= 0;
107
                        EdgeDetection_Ready <= '1';
108
                    else
109
                        cntr    <= cntr + 1;
110
                    end if;
111
 
112
                    if EdgeDetection_Disable = '1' then
113
                        cntrDisable <= cntrDisable + 1;
114
                    end if;
115
 
116
                    if cntrDisable = 6 then
117
                        state   <= S_IDLE;
118
                        EdgeDetection_Ready <= '0';
119
                        cntr    <= 0;
120
                        cntrDisable <= 0;
121
                    end if;
122
            END CASE;
123
        END IF;
124
    END PROCESS;
125
    EdgeDetection_Dout  <= EdgeDetection_Dout_Reg(31 downto 0);
126
END Behavioral;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.