URL
https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk
Subversion Repositories qaz_libs
[/] [qaz_libs/] [trunk/] [video/] [src/] [avf_kernel_buffer.sv] - Rev 49
Compare with Previous | Blame | View Log
////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2019 Authors and OPENCORES.ORG //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer. //////// //////// This source file is free software; you can redistribute it //////// and/or modify it under the terms of the GNU Lesser General //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any //////// later version. //////// //////// This source is distributed in the hope that it will be //////// useful, but WITHOUT ANY WARRANTY; without even the implied //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //////// PURPOSE. See the GNU Lesser General Public License for more //////// details. //////// //////// You should have received a copy of the GNU Lesser General //////// Public License along with this source; if not, download it //////// from http://www.opencores.org/lgpl.shtml //////// //////////////////////////////////////////////////////////////////////////moduleavf_kernel_buffer #(N, U, L, AW)(axis_if axis_in,axis_if axis_out,input aclk,input aresetn);// --------------------------------------------------------------------axis_if #(.N(N*L), .U(U)) a_buffer(.*);avf_line_buffer #(N, U, L, AW) line_buffer_i(.axis_out(a_buffer), .*);// --------------------------------------------------------------------localparam W = N * L * 8;localparam UB = (W*L) - 1;reg [UB:0] column;always_ff @(posedge aclk)if(a_buffer.tvalid & a_buffer.tready)column <= {a_buffer.tdata, column[UB:W]};// --------------------------------------------------------------------reg [(N*8)-1:0] kernel[L][L];generatefor(genvar j = 0; j < L * L; j++)begin: kernel_genassign kernel[j/L][j%L] = column[j*N*8 +: N*8];endendgenerate// --------------------------------------------------------------------wire sof = a_buffer.tvalid & a_buffer.tready & a_buffer.tuser[0];wire sol = a_buffer.tvalid & a_buffer.tready & a_buffer.tuser[1];wire eol = a_buffer.tvalid & a_buffer.tready & a_buffer.tlast;wire eof = a_buffer.tvalid & a_buffer.tready & a_buffer.tuser[2];wire primed;// --------------------------------------------------------------------enum reg [4:0]{PRIME = 5'b0_0001,SOL = 5'b0_0010,INITIALIZED = 5'b0_0100,READY = 5'b0_1000,EOL = 5'b1_0000} state, next_state;// --------------------------------------------------------------------always_ff @(posedge aclk)if(~aresetn)state <= PRIME;elsestate <= next_state;// --------------------------------------------------------------------always_combcase(state)PRIME: if(primed)next_state = SOL;elsenext_state = PRIME;SOL: if(axis_out.tready)next_state = READY;elsenext_state = SOL;READY: if(eol)next_state = EOL;elsenext_state = READY;EOL: if(axis_out.tready)next_state = PRIME;elsenext_state = EOL;default: next_state = PRIME;endcase// --------------------------------------------------------------------reg [$clog2(L)-1:0] count;assign primed = (count >= L - 1) & a_buffer.tvalid & a_buffer.tready;wire changing_state = (next_state != state);wire reset_counter = changing_state & (state != EOL);always_ff @(posedge aclk)if(~aresetn | reset_counter)count <= 0;else if(a_buffer.tvalid & a_buffer.tready)count <= count + 1;// --------------------------------------------------------------------reg sof_r;always_ff @(posedge aclk)if(~aresetn | (state == READY))sof_r <= 0;else if(sof)sof_r <= 1;// --------------------------------------------------------------------assign a_buffer.tready = (state == PRIME) | axis_out.tready;assign axis_out.tvalid = (state != PRIME) & a_buffer.tvalid;assign axis_out.tdata = column;// assign axis_out.tlast = a_buffer.tlast;assign axis_out.tlast = (state == EOL);// assign axis_out.tuser = a_buffer.tuser;assign axis_out.tuser[0] = (state == SOL) & sof_r;assign axis_out.tuser[1] = (state == SOL);assign axis_out.tuser[2] = (state == EOL) & eof;// --------------------------------------------------------------------endmodule
