OpenCores
URL https://opencores.org/ocsvn/fpga-median/fpga-median/trunk

Subversion Repositories fpga-median

[/] [fpga-median/] [trunk/] [rtl/] [state_machine.v] - Diff between revs 2 and 9

Only display areas with differences | Details | Blame | View Log

Rev 2 Rev 9
// +----------------------------------------------------------------------------
/* --------------------------------------------------------------------------------
// Universidade Federal da Bahia
 This file is part of FPGA Median Filter.
//------------------------------------------------------------------------------
 
// PROJECT: FPGA Median Filter
    FPGA Median Filter is free software: you can redistribute it and/or modify
//------------------------------------------------------------------------------
    it under the terms of the GNU General Public License as published by
// FILE NAME            : median.v
    the Free Software Foundation, either version 3 of the License, or
// AUTHOR               : Joo Carlos Bittencourt
    (at your option) any later version.
// AUTHOR'S E-MAIL      : joaocarlos@ieee.org
 
// -----------------------------------------------------------------------------
    FPGA Median Filter is distributed in the hope that it will be useful,
// RELEASE HISTORY
    but WITHOUT ANY WARRANTY; without even the implied warranty of
// VERSION  DATE        AUTHOR        DESCRIPTION
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// 1.0      2013-08-13  joao.nunes    initial version
    GNU General Public License for more details.
// 2.0      2013-09-06  laur.rami     fix minnor issues on memory address
 
// -----------------------------------------------------------------------------
    You should have received a copy of the GNU General Public License
// KEYWORDS: median, filter, image processing, state machine
    along with FPGA Median Filter.  If not, see <http://www.gnu.org/licenses/>.
// -----------------------------------------------------------------------------
-------------------------------------------------------------------------------- */
// PURPOSE: Windowing Memory Address Controller.
/* +----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
   Universidade Federal da Bahia
 
  ------------------------------------------------------------------------------
 
   PROJECT: FPGA Median Filter
 
  ------------------------------------------------------------------------------
 
   FILE NAME            : median.v
 
   AUTHOR               : Joo Carlos Bittencourt
 
   AUTHOR'S E-MAIL      : joaocarlos@ieee.org
 
   -----------------------------------------------------------------------------
 
   RELEASE HISTORY
 
   VERSION  DATE        AUTHOR        DESCRIPTION
 
   1.0      2013-08-13  joao.nunes    initial version
 
   2.0      2013-09-06  laur.rami     fix minnor issues on memory address
 
   -----------------------------------------------------------------------------
 
   KEYWORDS: median, filter, image processing, state machine
 
   -----------------------------------------------------------------------------
 
   PURPOSE: Windowing Memory Address Controller.
 
   ----------------------------------------------------------------------------- */
module state_machine
module state_machine
#(
#(
    parameter LUT_ADDR_WIDTH = 10,
    parameter LUT_ADDR_WIDTH = 10,
    parameter IMG_WIDTH = 234,
    parameter IMG_WIDTH = 234,
    parameter IMG_HEIGHT = 234
    parameter IMG_HEIGHT = 234
)(
)(
    input clk, // Clock
    input clk, // Clock
    input rst_n, // Asynchronous reset active low
    input rst_n, // Asynchronous reset active low
 
 
    output reg [LUT_ADDR_WIDTH-1:0] raddr_a,
    output reg [LUT_ADDR_WIDTH-1:0] raddr_a,
    output reg [LUT_ADDR_WIDTH-1:0] raddr_b,
    output reg [LUT_ADDR_WIDTH-1:0] raddr_b,
    output reg [LUT_ADDR_WIDTH-1:0] raddr_c,
    output reg [LUT_ADDR_WIDTH-1:0] raddr_c,
    output reg [LUT_ADDR_WIDTH-1:0] waddr,
    output reg [LUT_ADDR_WIDTH-1:0] waddr,
    output reg [1:0] window_line_counter,
    output reg [1:0] window_line_counter,
    output reg [9:0] window_column_counter,
    output reg [9:0] window_column_counter,
    output reg [9:0] memory_shift
    output reg [9:0] memory_shift
);
);
 
 
    reg valid;
    reg valid;
 
 
    always @(posedge clk or negedge rst_n)
    always @(posedge clk or negedge rst_n)
    begin : out_memory_counter
    begin : out_memory_counter
        if(~rst_n) begin
        if(~rst_n) begin
            waddr <= {LUT_ADDR_WIDTH{1'b0}};
            waddr <= {LUT_ADDR_WIDTH{1'b0}};
        end else if(valid) begin
        end else if(valid) begin
            waddr <= waddr + 1'b1;
            waddr <= waddr + 1'b1;
        end
        end
    end
    end
 
 
    always @(posedge clk or negedge rst_n)
    always @(posedge clk or negedge rst_n)
    begin : addr_counter
    begin : addr_counter
        if(~rst_n) begin
        if(~rst_n) begin
            window_column_counter <= 10'd0;
            window_column_counter <= 10'd0;
            window_line_counter <= 2'b00;
            window_line_counter <= 2'b00;
            raddr_a <= {LUT_ADDR_WIDTH{1'b0}};
            raddr_a <= {LUT_ADDR_WIDTH{1'b0}};
            raddr_b <= {LUT_ADDR_WIDTH{1'b0}};
            raddr_b <= {LUT_ADDR_WIDTH{1'b0}};
            raddr_c <= {LUT_ADDR_WIDTH{1'b0}};
            raddr_c <= {LUT_ADDR_WIDTH{1'b0}};
        end else begin
        end else begin
            if(window_column_counter != ((IMG_WIDTH/4)-1)) begin
            if(window_column_counter != ((IMG_WIDTH/4)-1)) begin
                window_column_counter <= window_column_counter + 1'b1;
                window_column_counter <= window_column_counter + 1'b1;
                valid <= 1'b1;
                valid <= 1'b1;
                raddr_a <= raddr_a + 1'b1;
                raddr_a <= raddr_a + 1'b1;
                raddr_b <= raddr_b + 1'b1;
                raddr_b <= raddr_b + 1'b1;
                raddr_c <= raddr_c + 1'b1;
                raddr_c <= raddr_c + 1'b1;
            end else begin
            end else begin
                window_column_counter <= 10'd0;
                window_column_counter <= 10'd0;
                case (window_line_counter)
                case (window_line_counter)
                    2'b00 :
                    2'b00 :
                    begin
                    begin
                        raddr_a <= raddr_a + 1'b1;
                        raddr_a <= raddr_a + 1'b1;
                        raddr_b <= raddr_b - window_column_counter;
                        raddr_b <= raddr_b - window_column_counter;
                        raddr_c <= raddr_c - window_column_counter;
                        raddr_c <= raddr_c - window_column_counter;
                        window_line_counter = window_line_counter + 1'b1;
                        window_line_counter = window_line_counter + 1'b1;
                    end
                    end
                    2'b01 :
                    2'b01 :
                    begin
                    begin
                        raddr_b <= raddr_b + 1'b1;
                        raddr_b <= raddr_b + 1'b1;
                        raddr_a <= raddr_a - window_column_counter;
                        raddr_a <= raddr_a - window_column_counter;
                        raddr_c <= raddr_c - window_column_counter;
                        raddr_c <= raddr_c - window_column_counter;
                        window_line_counter = window_line_counter + 1'b1;
                        window_line_counter = window_line_counter + 1'b1;
                    end
                    end
                    2'b10 :
                    2'b10 :
                    begin
                    begin
                        raddr_b <= raddr_b - window_column_counter;
                        raddr_b <= raddr_b - window_column_counter;
                        raddr_a <= raddr_a - window_column_counter;
                        raddr_a <= raddr_a - window_column_counter;
                        raddr_c <= raddr_c + 1'b1;
                        raddr_c <= raddr_c + 1'b1;
                        window_line_counter = 2'b00;
                        window_line_counter = 2'b00;
                    end
                    end
                    default :
                    default :
                    begin
                    begin
                        raddr_a <= {LUT_ADDR_WIDTH{1'b0}};
                        raddr_a <= {LUT_ADDR_WIDTH{1'b0}};
                        raddr_b <= {LUT_ADDR_WIDTH{1'b0}};
                        raddr_b <= {LUT_ADDR_WIDTH{1'b0}};
                        raddr_c <= {LUT_ADDR_WIDTH{1'b0}};
                        raddr_c <= {LUT_ADDR_WIDTH{1'b0}};
                    end
                    end
                endcase
                endcase
            end
            end
        end
        end
    end
    end
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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