blob: 13a11fb2e6fb55e02ea90645155a9ab625b3dfb2 [file] [log] [blame]
// SPDX-FileCopyrightText: 2021 renzym.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileContributor: Yasir Javed <info@renzym.com>
//////////////////////////////////////////////////////////////////////////////////
// Company: Renzym
// Engineer: Yasir Javed
// Design Name: Renzym Convolver
// Module Name: ren_conv
// Description: Renzym Convolver cumputes 3xN convolution. It is assumed that image
// and kernels are stored in external BRAMs. The results are written
// back to external BRAM too. Simlarly configurations are also assumed
// to be external. Based on configurations, this block will start
// working when start signal is asserted (level signal) and when done
// done signal will be asserted. There is an optional maxpool layer too.
//
// Configs and BRAMs are kept external, so that this generic block can
// remain independent and can mux between different configs and datas.
// It also keeps provision of making it cascadable open.
//
// External config block also ensures that there can be different such
// blocks for different interfaces (e.g. AXI, Wishbone etc.) without affecting
// rest of the design.
//
// Dependencies: Configs and BRAMs.
//
//////////////////////////////////////////////////////////////////////////////////
module ren_conv
#(
parameter KERN_COL_WIDTH = 3,
parameter COL_WIDTH = 8,
parameter KERN_CNT_WIDTH = 3,
parameter IMG_ADDR_WIDTH = 8,
parameter RSLT_ADDR_WIDTH = 8,
parameter SHFT_WIDTH = 4,
parameter IMG_DWIDTH = 24,
parameter KERN_DWIDTH = 24,
parameter RESULT_DWIDTH = 8
)
(
input clk,
input reset,
input start,
output done,
// Configurations
input [KERN_COL_WIDTH-1:0] kern_cols,
input [COL_WIDTH-1:0] cols,
input [KERN_CNT_WIDTH-1:0] kerns,
input [IMG_ADDR_WIDTH-1:0] stride,
input kern_addr_mode,
input [RSLT_ADDR_WIDTH-1:0] result_cols,
input [SHFT_WIDTH-1:0] shift,
input en_max_pool,
input [2:0] mask,
// BRAMs interface signals
input [IMG_DWIDTH-1:0] img_data,
input [KERN_DWIDTH-1:0] kern_data,
output [KERN_CNT_WIDTH+KERN_COL_WIDTH-1:0] kern_addr,
output [IMG_ADDR_WIDTH-1:0] img_addr,
output [RSLT_ADDR_WIDTH-1:0] result_addr,
output [RESULT_DWIDTH-1:0] result_data,
output result_valid,
output accum_ovrflow
);
wire clr_k_col_cnt;
wire clr_col_cnt;
agu
#(
.KERN_COL_WIDTH (KERN_COL_WIDTH ),
.COL_WIDTH (COL_WIDTH ),
.KERN_CNT_WIDTH (KERN_CNT_WIDTH ),
.IMG_ADDR_WIDTH (IMG_ADDR_WIDTH ),
.RSLT_ADDR_WIDTH (RSLT_ADDR_WIDTH )
)
agu_inst
(
.clk (clk ),
.reset (reset ),
.start (start ),
.en_result_addr (result_valid ),
.kern_cols (kern_cols ),
.cols (cols ),
.kerns (kerns ),
.stride (stride ),
.kern_addr_mode (kern_addr_mode ),
.result_cols (result_cols ),
.kern_addr (kern_addr ),
.img_addr (img_addr ),
.result_addr (result_addr ),
.clr_k_col_cnt (clr_k_col_cnt ),
.clr_col_cnt (clr_col_cnt ),
.done (done )
);
datapath
#(
.IMG_DWIDTH (24 ),
.KERN_DWIDTH (24 ),
.RESULT_DWIDTH (8 ),
.SHFT_WIDTH (4 )
)
datapath_inst
(
.clk (clk ),
.reset (reset ),
.start (start ),
.shift (shift ),
.en_max_pool (en_max_pool ),
.img_data (img_data ),
.kern_data (kern_data ),
.result_data (result_data ),
.result_valid (result_valid ),
.mask (mask ),
.clr_k_col_cnt (clr_k_col_cnt ),
.clr_col_cnt (clr_col_cnt ),
.accum_ovrflow (accum_ovrflow )
);
endmodule