1389 lines
53 KiB
Verilog
1389 lines
53 KiB
Verilog
/////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// WISHBONE DMA Channel Select ////
|
|
//// ////
|
|
//// ////
|
|
//// Author: Rudolf Usselmann ////
|
|
//// rudi@asics.ws ////
|
|
//// ////
|
|
//// ////
|
|
//// Downloaded from: http://www.opencores.org/cores/wb_dma/ ////
|
|
//// ////
|
|
/////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Copyright (C) 2000-2002 Rudolf Usselmann ////
|
|
//// www.asics.ws ////
|
|
//// rudi@asics.ws ////
|
|
//// ////
|
|
//// 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 SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
|
|
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
|
|
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
|
|
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
|
|
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
|
|
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
|
|
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
|
|
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
|
|
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
|
|
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
|
|
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
|
|
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
|
|
//// POSSIBILITY OF SUCH DAMAGE. ////
|
|
//// ////
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
// CVS Log
|
|
//
|
|
// $Id: wb_dma_ch_sel.v,v 1.4 2002-02-01 01:54:45 rudi Exp $
|
|
//
|
|
// $Date: 2002-02-01 01:54:45 $
|
|
// $Revision: 1.4 $
|
|
// $Author: rudi $
|
|
// $Locker: $
|
|
// $State: Exp $
|
|
//
|
|
// Change History:
|
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.3 2001/10/19 04:35:04 rudi
|
|
//
|
|
// - Made the core parameterized
|
|
//
|
|
// Revision 1.2 2001/08/15 05:40:30 rudi
|
|
//
|
|
// - Changed IO names to be more clear.
|
|
// - Uniquifyed define names to be core specific.
|
|
// - Added Section 3.10, describing DMA restart.
|
|
//
|
|
// Revision 1.1 2001/07/29 08:57:02 rudi
|
|
//
|
|
//
|
|
// 1) Changed Directory Structure
|
|
// 2) Added restart signal (REST)
|
|
//
|
|
// Revision 1.4 2001/06/14 08:52:00 rudi
|
|
//
|
|
//
|
|
// Changed arbiter module name.
|
|
//
|
|
// Revision 1.3 2001/06/13 02:26:48 rudi
|
|
//
|
|
//
|
|
// Small changes after running lint.
|
|
//
|
|
// Revision 1.2 2001/06/05 10:22:36 rudi
|
|
//
|
|
//
|
|
// - Added Support of up to 31 channels
|
|
// - Added support for 2,4 and 8 priority levels
|
|
// - Now can have up to 31 channels
|
|
// - Added many configuration items
|
|
// - Changed reset to async
|
|
//
|
|
// Revision 1.1.1.1 2001/03/19 13:10:35 rudi
|
|
// Initial Release
|
|
//
|
|
//
|
|
//
|
|
|
|
`include "wb_dma_defines.v"
|
|
|
|
module wb_dma_ch_sel(clk, rst,
|
|
|
|
// DMA Request Lines
|
|
req_i, ack_o, nd_i,
|
|
|
|
// DMA Registers Inputs
|
|
pointer0, pointer0_s, ch0_csr, ch0_txsz, ch0_adr0, ch0_adr1, ch0_am0, ch0_am1,
|
|
pointer1, pointer1_s, ch1_csr, ch1_txsz, ch1_adr0, ch1_adr1, ch1_am0, ch1_am1,
|
|
pointer2, pointer2_s, ch2_csr, ch2_txsz, ch2_adr0, ch2_adr1, ch2_am0, ch2_am1,
|
|
pointer3, pointer3_s, ch3_csr, ch3_txsz, ch3_adr0, ch3_adr1, ch3_am0, ch3_am1,
|
|
pointer4, pointer4_s, ch4_csr, ch4_txsz, ch4_adr0, ch4_adr1, ch4_am0, ch4_am1,
|
|
pointer5, pointer5_s, ch5_csr, ch5_txsz, ch5_adr0, ch5_adr1, ch5_am0, ch5_am1,
|
|
pointer6, pointer6_s, ch6_csr, ch6_txsz, ch6_adr0, ch6_adr1, ch6_am0, ch6_am1,
|
|
pointer7, pointer7_s, ch7_csr, ch7_txsz, ch7_adr0, ch7_adr1, ch7_am0, ch7_am1,
|
|
pointer8, pointer8_s, ch8_csr, ch8_txsz, ch8_adr0, ch8_adr1, ch8_am0, ch8_am1,
|
|
pointer9, pointer9_s, ch9_csr, ch9_txsz, ch9_adr0, ch9_adr1, ch9_am0, ch9_am1,
|
|
pointer10, pointer10_s, ch10_csr, ch10_txsz, ch10_adr0, ch10_adr1, ch10_am0, ch10_am1,
|
|
pointer11, pointer11_s, ch11_csr, ch11_txsz, ch11_adr0, ch11_adr1, ch11_am0, ch11_am1,
|
|
pointer12, pointer12_s, ch12_csr, ch12_txsz, ch12_adr0, ch12_adr1, ch12_am0, ch12_am1,
|
|
pointer13, pointer13_s, ch13_csr, ch13_txsz, ch13_adr0, ch13_adr1, ch13_am0, ch13_am1,
|
|
pointer14, pointer14_s, ch14_csr, ch14_txsz, ch14_adr0, ch14_adr1, ch14_am0, ch14_am1,
|
|
pointer15, pointer15_s, ch15_csr, ch15_txsz, ch15_adr0, ch15_adr1, ch15_am0, ch15_am1,
|
|
pointer16, pointer16_s, ch16_csr, ch16_txsz, ch16_adr0, ch16_adr1, ch16_am0, ch16_am1,
|
|
pointer17, pointer17_s, ch17_csr, ch17_txsz, ch17_adr0, ch17_adr1, ch17_am0, ch17_am1,
|
|
pointer18, pointer18_s, ch18_csr, ch18_txsz, ch18_adr0, ch18_adr1, ch18_am0, ch18_am1,
|
|
pointer19, pointer19_s, ch19_csr, ch19_txsz, ch19_adr0, ch19_adr1, ch19_am0, ch19_am1,
|
|
pointer20, pointer20_s, ch20_csr, ch20_txsz, ch20_adr0, ch20_adr1, ch20_am0, ch20_am1,
|
|
pointer21, pointer21_s, ch21_csr, ch21_txsz, ch21_adr0, ch21_adr1, ch21_am0, ch21_am1,
|
|
pointer22, pointer22_s, ch22_csr, ch22_txsz, ch22_adr0, ch22_adr1, ch22_am0, ch22_am1,
|
|
pointer23, pointer23_s, ch23_csr, ch23_txsz, ch23_adr0, ch23_adr1, ch23_am0, ch23_am1,
|
|
pointer24, pointer24_s, ch24_csr, ch24_txsz, ch24_adr0, ch24_adr1, ch24_am0, ch24_am1,
|
|
pointer25, pointer25_s, ch25_csr, ch25_txsz, ch25_adr0, ch25_adr1, ch25_am0, ch25_am1,
|
|
pointer26, pointer26_s, ch26_csr, ch26_txsz, ch26_adr0, ch26_adr1, ch26_am0, ch26_am1,
|
|
pointer27, pointer27_s, ch27_csr, ch27_txsz, ch27_adr0, ch27_adr1, ch27_am0, ch27_am1,
|
|
pointer28, pointer28_s, ch28_csr, ch28_txsz, ch28_adr0, ch28_adr1, ch28_am0, ch28_am1,
|
|
pointer29, pointer29_s, ch29_csr, ch29_txsz, ch29_adr0, ch29_adr1, ch29_am0, ch29_am1,
|
|
pointer30, pointer30_s, ch30_csr, ch30_txsz, ch30_adr0, ch30_adr1, ch30_am0, ch30_am1,
|
|
|
|
// DMA Registers Write Back Channel Select
|
|
ch_sel, ndnr,
|
|
|
|
// DMA Engine Interface
|
|
de_start, ndr, csr, pointer, txsz, adr0, adr1, am0, am1,
|
|
pointer_s, next_ch, de_ack, dma_busy
|
|
);
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Module Parameters
|
|
//
|
|
|
|
// chXX_conf = { CBUF, ED, ARS, EN }
|
|
parameter [1:0] pri_sel = 2'h0;
|
|
parameter [3:0] ch0_conf = 4'h1;
|
|
parameter [3:0] ch1_conf = 4'h0;
|
|
parameter [3:0] ch2_conf = 4'h0;
|
|
parameter [3:0] ch3_conf = 4'h0;
|
|
parameter [3:0] ch4_conf = 4'h0;
|
|
parameter [3:0] ch5_conf = 4'h0;
|
|
parameter [3:0] ch6_conf = 4'h0;
|
|
parameter [3:0] ch7_conf = 4'h0;
|
|
parameter [3:0] ch8_conf = 4'h0;
|
|
parameter [3:0] ch9_conf = 4'h0;
|
|
parameter [3:0] ch10_conf = 4'h0;
|
|
parameter [3:0] ch11_conf = 4'h0;
|
|
parameter [3:0] ch12_conf = 4'h0;
|
|
parameter [3:0] ch13_conf = 4'h0;
|
|
parameter [3:0] ch14_conf = 4'h0;
|
|
parameter [3:0] ch15_conf = 4'h0;
|
|
parameter [3:0] ch16_conf = 4'h0;
|
|
parameter [3:0] ch17_conf = 4'h0;
|
|
parameter [3:0] ch18_conf = 4'h0;
|
|
parameter [3:0] ch19_conf = 4'h0;
|
|
parameter [3:0] ch20_conf = 4'h0;
|
|
parameter [3:0] ch21_conf = 4'h0;
|
|
parameter [3:0] ch22_conf = 4'h0;
|
|
parameter [3:0] ch23_conf = 4'h0;
|
|
parameter [3:0] ch24_conf = 4'h0;
|
|
parameter [3:0] ch25_conf = 4'h0;
|
|
parameter [3:0] ch26_conf = 4'h0;
|
|
parameter [3:0] ch27_conf = 4'h0;
|
|
parameter [3:0] ch28_conf = 4'h0;
|
|
parameter [3:0] ch29_conf = 4'h0;
|
|
parameter [3:0] ch30_conf = 4'h0;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Module IOs
|
|
//
|
|
|
|
input clk, rst;
|
|
|
|
// DMA Request Lines
|
|
input [30:0] req_i;
|
|
output [30:0] ack_o;
|
|
input [30:0] nd_i;
|
|
|
|
// Channel Registers Inputs
|
|
input [31:0] pointer0, pointer0_s, ch0_csr, ch0_txsz, ch0_adr0, ch0_adr1, ch0_am0, ch0_am1;
|
|
input [31:0] pointer1, pointer1_s, ch1_csr, ch1_txsz, ch1_adr0, ch1_adr1, ch1_am0, ch1_am1;
|
|
input [31:0] pointer2, pointer2_s, ch2_csr, ch2_txsz, ch2_adr0, ch2_adr1, ch2_am0, ch2_am1;
|
|
input [31:0] pointer3, pointer3_s, ch3_csr, ch3_txsz, ch3_adr0, ch3_adr1, ch3_am0, ch3_am1;
|
|
input [31:0] pointer4, pointer4_s, ch4_csr, ch4_txsz, ch4_adr0, ch4_adr1, ch4_am0, ch4_am1;
|
|
input [31:0] pointer5, pointer5_s, ch5_csr, ch5_txsz, ch5_adr0, ch5_adr1, ch5_am0, ch5_am1;
|
|
input [31:0] pointer6, pointer6_s, ch6_csr, ch6_txsz, ch6_adr0, ch6_adr1, ch6_am0, ch6_am1;
|
|
input [31:0] pointer7, pointer7_s, ch7_csr, ch7_txsz, ch7_adr0, ch7_adr1, ch7_am0, ch7_am1;
|
|
input [31:0] pointer8, pointer8_s, ch8_csr, ch8_txsz, ch8_adr0, ch8_adr1, ch8_am0, ch8_am1;
|
|
input [31:0] pointer9, pointer9_s, ch9_csr, ch9_txsz, ch9_adr0, ch9_adr1, ch9_am0, ch9_am1;
|
|
input [31:0] pointer10, pointer10_s, ch10_csr, ch10_txsz, ch10_adr0, ch10_adr1, ch10_am0, ch10_am1;
|
|
input [31:0] pointer11, pointer11_s, ch11_csr, ch11_txsz, ch11_adr0, ch11_adr1, ch11_am0, ch11_am1;
|
|
input [31:0] pointer12, pointer12_s, ch12_csr, ch12_txsz, ch12_adr0, ch12_adr1, ch12_am0, ch12_am1;
|
|
input [31:0] pointer13, pointer13_s, ch13_csr, ch13_txsz, ch13_adr0, ch13_adr1, ch13_am0, ch13_am1;
|
|
input [31:0] pointer14, pointer14_s, ch14_csr, ch14_txsz, ch14_adr0, ch14_adr1, ch14_am0, ch14_am1;
|
|
input [31:0] pointer15, pointer15_s, ch15_csr, ch15_txsz, ch15_adr0, ch15_adr1, ch15_am0, ch15_am1;
|
|
input [31:0] pointer16, pointer16_s, ch16_csr, ch16_txsz, ch16_adr0, ch16_adr1, ch16_am0, ch16_am1;
|
|
input [31:0] pointer17, pointer17_s, ch17_csr, ch17_txsz, ch17_adr0, ch17_adr1, ch17_am0, ch17_am1;
|
|
input [31:0] pointer18, pointer18_s, ch18_csr, ch18_txsz, ch18_adr0, ch18_adr1, ch18_am0, ch18_am1;
|
|
input [31:0] pointer19, pointer19_s, ch19_csr, ch19_txsz, ch19_adr0, ch19_adr1, ch19_am0, ch19_am1;
|
|
input [31:0] pointer20, pointer20_s, ch20_csr, ch20_txsz, ch20_adr0, ch20_adr1, ch20_am0, ch20_am1;
|
|
input [31:0] pointer21, pointer21_s, ch21_csr, ch21_txsz, ch21_adr0, ch21_adr1, ch21_am0, ch21_am1;
|
|
input [31:0] pointer22, pointer22_s, ch22_csr, ch22_txsz, ch22_adr0, ch22_adr1, ch22_am0, ch22_am1;
|
|
input [31:0] pointer23, pointer23_s, ch23_csr, ch23_txsz, ch23_adr0, ch23_adr1, ch23_am0, ch23_am1;
|
|
input [31:0] pointer24, pointer24_s, ch24_csr, ch24_txsz, ch24_adr0, ch24_adr1, ch24_am0, ch24_am1;
|
|
input [31:0] pointer25, pointer25_s, ch25_csr, ch25_txsz, ch25_adr0, ch25_adr1, ch25_am0, ch25_am1;
|
|
input [31:0] pointer26, pointer26_s, ch26_csr, ch26_txsz, ch26_adr0, ch26_adr1, ch26_am0, ch26_am1;
|
|
input [31:0] pointer27, pointer27_s, ch27_csr, ch27_txsz, ch27_adr0, ch27_adr1, ch27_am0, ch27_am1;
|
|
input [31:0] pointer28, pointer28_s, ch28_csr, ch28_txsz, ch28_adr0, ch28_adr1, ch28_am0, ch28_am1;
|
|
input [31:0] pointer29, pointer29_s, ch29_csr, ch29_txsz, ch29_adr0, ch29_adr1, ch29_am0, ch29_am1;
|
|
input [31:0] pointer30, pointer30_s, ch30_csr, ch30_txsz, ch30_adr0, ch30_adr1, ch30_am0, ch30_am1;
|
|
|
|
output [4:0] ch_sel; // Write Back Channel Select
|
|
output [30:0] ndnr; // Next Descriptor No Request
|
|
|
|
output de_start; // Start DMA Engine Indicator
|
|
output ndr; // Next Descriptor With Request (for current channel)
|
|
output [31:0] csr; // Selected Channel CSR
|
|
output [31:0] pointer; // LL Descriptor pointer
|
|
output [31:0] pointer_s; // LL Descriptor previous pointer
|
|
output [31:0] txsz; // Selected Channel Transfer Size
|
|
output [31:0] adr0, adr1; // Selected Channel Addresses
|
|
output [31:0] am0, am1; // Selected Channel Address Masks
|
|
|
|
input next_ch; // Indicates the DMA Engine is done
|
|
// with current transfer
|
|
input de_ack; // DMA engine ack output
|
|
|
|
input dma_busy;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Local Wires and Registers
|
|
//
|
|
|
|
reg [30:0] ack_o;
|
|
wire [30:0] valid; // Indicates which channel is valid
|
|
reg valid_sel;
|
|
reg [30:0] req_r; // Channel Request inputs
|
|
reg [30:0] ndr_r; // Next Descriptor Registered (and Request)
|
|
reg [30:0] ndnr; // Next Descriptor Registered (and Not Request)
|
|
wire [2:0] pri_out; // Highest unserviced priority
|
|
wire [2:0] pri0, pri1, pri2, pri3; // Channel Priorities
|
|
wire [2:0] pri4, pri5, pri6, pri7;
|
|
wire [2:0] pri8, pri9, pri10, pri11;
|
|
wire [2:0] pri12, pri13, pri14, pri15;
|
|
wire [2:0] pri16, pri17, pri18, pri19;
|
|
wire [2:0] pri20, pri21, pri22, pri23;
|
|
wire [2:0] pri24, pri25, pri26, pri27;
|
|
wire [2:0] pri28, pri29, pri30;
|
|
reg [4:0] ch_sel_d;
|
|
reg [4:0] ch_sel_r;
|
|
|
|
reg ndr;
|
|
reg next_start;
|
|
reg de_start_r;
|
|
reg [31:0] csr; // Selected Channel CSR
|
|
reg [31:0] pointer;
|
|
reg [31:0] pointer_s;
|
|
reg [31:0] txsz; // Selected Channel Transfer Size
|
|
reg [31:0] adr0, adr1; // Selected Channel Addresses
|
|
reg [31:0] am0, am1; // Selected Channel Address Masks
|
|
|
|
// Arbiter Request Inputs
|
|
wire [30:0] req_p0, req_p1, req_p2, req_p3;
|
|
wire [30:0] req_p4, req_p5, req_p6, req_p7;
|
|
wire [30:0] req_p8, req_p9, req_p10, req_p11;
|
|
wire [30:0] req_p12, req_p13, req_p14, req_p15;
|
|
wire [30:0] req_p16, req_p17, req_p18, req_p19;
|
|
wire [30:0] req_p20, req_p21, req_p22, req_p23;
|
|
wire [30:0] req_p24, req_p25, req_p26, req_p27;
|
|
wire [30:0] req_p28, req_p29, req_p30;
|
|
// Arbiter Grant Outputs
|
|
wire [4:0] gnt_p0_d, gnt_p1_d, gnt_p2_d, gnt_p3_d;
|
|
wire [4:0] gnt_p4_d, gnt_p5_d, gnt_p6_d, gnt_p7_d;
|
|
wire [4:0] gnt_p0, gnt_p1, gnt_p2, gnt_p3;
|
|
wire [4:0] gnt_p4, gnt_p5, gnt_p6, gnt_p7;
|
|
wire [4:0] gnt_p8, gnt_p9, gnt_p10, gnt_p11;
|
|
wire [4:0] gnt_p12, gnt_p13, gnt_p14, gnt_p15;
|
|
wire [4:0] gnt_p16, gnt_p17, gnt_p18, gnt_p19;
|
|
wire [4:0] gnt_p20, gnt_p21, gnt_p22, gnt_p23;
|
|
wire [4:0] gnt_p24, gnt_p25, gnt_p26, gnt_p27;
|
|
wire [4:0] gnt_p28, gnt_p29, gnt_p30;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Aliases
|
|
//
|
|
|
|
assign pri0[0] = ch0_csr[13];
|
|
assign pri0[1] = (pri_sel == 2'd0) ? 1'b0 : ch0_csr[14];
|
|
assign pri0[2] = (pri_sel == 2'd2) ? ch0_csr[15] : 1'b0;
|
|
assign pri1[0] = ch1_csr[13];
|
|
assign pri1[1] = (pri_sel == 2'd0) ? 1'b0 : ch1_csr[14];
|
|
assign pri1[2] = (pri_sel == 2'd2) ? ch1_csr[15] : 1'b0;
|
|
assign pri2[0] = ch2_csr[13];
|
|
assign pri2[1] = (pri_sel == 2'd0) ? 1'b0 : ch2_csr[14];
|
|
assign pri2[2] = (pri_sel == 2'd2) ? ch2_csr[15] : 1'b0;
|
|
assign pri3[0] = ch3_csr[13];
|
|
assign pri3[1] = (pri_sel == 2'd0) ? 1'b0 : ch3_csr[14];
|
|
assign pri3[2] = (pri_sel == 2'd2) ? ch3_csr[15] : 1'b0;
|
|
assign pri4[0] = ch4_csr[13];
|
|
assign pri4[1] = (pri_sel == 2'd0) ? 1'b0 : ch4_csr[14];
|
|
assign pri4[2] = (pri_sel == 2'd2) ? ch4_csr[15] : 1'b0;
|
|
assign pri5[0] = ch5_csr[13];
|
|
assign pri5[1] = (pri_sel == 2'd0) ? 1'b0 : ch5_csr[14];
|
|
assign pri5[2] = (pri_sel == 2'd2) ? ch5_csr[15] : 1'b0;
|
|
assign pri6[0] = ch6_csr[13];
|
|
assign pri6[1] = (pri_sel == 2'd0) ? 1'b0 : ch6_csr[14];
|
|
assign pri6[2] = (pri_sel == 2'd2) ? ch6_csr[15] : 1'b0;
|
|
assign pri7[0] = ch7_csr[13];
|
|
assign pri7[1] = (pri_sel == 2'd0) ? 1'b0 : ch7_csr[14];
|
|
assign pri7[2] = (pri_sel == 2'd2) ? ch7_csr[15] : 1'b0;
|
|
assign pri8[0] = ch8_csr[13];
|
|
assign pri8[1] = (pri_sel == 2'd0) ? 1'b0 : ch8_csr[14];
|
|
assign pri8[2] = (pri_sel == 2'd2) ? ch8_csr[15] : 1'b0;
|
|
assign pri9[0] = ch9_csr[13];
|
|
assign pri9[1] = (pri_sel == 2'd0) ? 1'b0 : ch9_csr[14];
|
|
assign pri9[2] = (pri_sel == 2'd2) ? ch9_csr[15] : 1'b0;
|
|
assign pri10[0] = ch10_csr[13];
|
|
assign pri10[1] = (pri_sel == 2'd0) ? 1'b0 : ch10_csr[14];
|
|
assign pri10[2] = (pri_sel == 2'd2) ? ch10_csr[15] : 1'b0;
|
|
assign pri11[0] = ch11_csr[13];
|
|
assign pri11[1] = (pri_sel == 2'd0) ? 1'b0 : ch11_csr[14];
|
|
assign pri11[2] = (pri_sel == 2'd2) ? ch11_csr[15] : 1'b0;
|
|
assign pri12[0] = ch12_csr[13];
|
|
assign pri12[1] = (pri_sel == 2'd0) ? 1'b0 : ch12_csr[14];
|
|
assign pri12[2] = (pri_sel == 2'd2) ? ch12_csr[15] : 1'b0;
|
|
assign pri13[0] = ch13_csr[13];
|
|
assign pri13[1] = (pri_sel == 2'd0) ? 1'b0 : ch13_csr[14];
|
|
assign pri13[2] = (pri_sel == 2'd2) ? ch13_csr[15] : 1'b0;
|
|
assign pri14[0] = ch14_csr[13];
|
|
assign pri14[1] = (pri_sel == 2'd0) ? 1'b0 : ch14_csr[14];
|
|
assign pri14[2] = (pri_sel == 2'd2) ? ch14_csr[15] : 1'b0;
|
|
assign pri15[0] = ch15_csr[13];
|
|
assign pri15[1] = (pri_sel == 2'd0) ? 1'b0 : ch15_csr[14];
|
|
assign pri15[2] = (pri_sel == 2'd2) ? ch15_csr[15] : 1'b0;
|
|
assign pri16[0] = ch16_csr[13];
|
|
assign pri16[1] = (pri_sel == 2'd0) ? 1'b0 : ch16_csr[14];
|
|
assign pri16[2] = (pri_sel == 2'd2) ? ch16_csr[15] : 1'b0;
|
|
assign pri17[0] = ch17_csr[13];
|
|
assign pri17[1] = (pri_sel == 2'd0) ? 1'b0 : ch17_csr[14];
|
|
assign pri17[2] = (pri_sel == 2'd2) ? ch17_csr[15] : 1'b0;
|
|
assign pri18[0] = ch18_csr[13];
|
|
assign pri18[1] = (pri_sel == 2'd0) ? 1'b0 : ch18_csr[14];
|
|
assign pri18[2] = (pri_sel == 2'd2) ? ch18_csr[15] : 1'b0;
|
|
assign pri19[0] = ch19_csr[13];
|
|
assign pri19[1] = (pri_sel == 2'd0) ? 1'b0 : ch19_csr[14];
|
|
assign pri19[2] = (pri_sel == 2'd2) ? ch19_csr[15] : 1'b0;
|
|
assign pri20[0] = ch20_csr[13];
|
|
assign pri20[1] = (pri_sel == 2'd0) ? 1'b0 : ch20_csr[14];
|
|
assign pri20[2] = (pri_sel == 2'd2) ? ch20_csr[15] : 1'b0;
|
|
assign pri21[0] = ch21_csr[13];
|
|
assign pri21[1] = (pri_sel == 2'd0) ? 1'b0 : ch21_csr[14];
|
|
assign pri21[2] = (pri_sel == 2'd2) ? ch21_csr[15] : 1'b0;
|
|
assign pri22[0] = ch22_csr[13];
|
|
assign pri22[1] = (pri_sel == 2'd0) ? 1'b0 : ch22_csr[14];
|
|
assign pri22[2] = (pri_sel == 2'd2) ? ch22_csr[15] : 1'b0;
|
|
assign pri23[0] = ch23_csr[13];
|
|
assign pri23[1] = (pri_sel == 2'd0) ? 1'b0 : ch23_csr[14];
|
|
assign pri23[2] = (pri_sel == 2'd2) ? ch23_csr[15] : 1'b0;
|
|
assign pri24[0] = ch24_csr[13];
|
|
assign pri24[1] = (pri_sel == 2'd0) ? 1'b0 : ch24_csr[14];
|
|
assign pri24[2] = (pri_sel == 2'd2) ? ch24_csr[15] : 1'b0;
|
|
assign pri25[0] = ch25_csr[13];
|
|
assign pri25[1] = (pri_sel == 2'd0) ? 1'b0 : ch25_csr[14];
|
|
assign pri25[2] = (pri_sel == 2'd2) ? ch25_csr[15] : 1'b0;
|
|
assign pri26[0] = ch26_csr[13];
|
|
assign pri26[1] = (pri_sel == 2'd0) ? 1'b0 : ch26_csr[14];
|
|
assign pri26[2] = (pri_sel == 2'd2) ? ch26_csr[15] : 1'b0;
|
|
assign pri27[0] = ch27_csr[13];
|
|
assign pri27[1] = (pri_sel == 2'd0) ? 1'b0 : ch27_csr[14];
|
|
assign pri27[2] = (pri_sel == 2'd2) ? ch27_csr[15] : 1'b0;
|
|
assign pri28[0] = ch28_csr[13];
|
|
assign pri28[1] = (pri_sel == 2'd0) ? 1'b0 : ch28_csr[14];
|
|
assign pri28[2] = (pri_sel == 2'd2) ? ch28_csr[15] : 1'b0;
|
|
assign pri29[0] = ch29_csr[13];
|
|
assign pri29[1] = (pri_sel == 2'd0) ? 1'b0 : ch29_csr[14];
|
|
assign pri29[2] = (pri_sel == 2'd2) ? ch29_csr[15] : 1'b0;
|
|
assign pri30[0] = ch30_csr[13];
|
|
assign pri30[1] = (pri_sel == 2'd0) ? 1'b0 : ch30_csr[14];
|
|
assign pri30[2] = (pri_sel == 2'd2) ? ch30_csr[15] : 1'b0;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Misc logic
|
|
//
|
|
|
|
// Chanel Valid flag
|
|
// The valid flag is asserted when the channel is enabled,
|
|
// and is either in "normal mode" (software control) or
|
|
// "hw handshake mode" (reqN control)
|
|
// validN = ch_enabled & (sw_mode | (hw_mode & reqN) )
|
|
|
|
always @(posedge clk)
|
|
req_r <= #1 req_i & ~ack_o;
|
|
|
|
assign valid[0] = ch0_conf[0] & ch0_csr[`WDMA_CH_EN] & (ch0_csr[`WDMA_MODE] ? (req_r[0] & !ack_o[0]) : 1'b1);
|
|
assign valid[1] = ch1_conf[0] & ch1_csr[`WDMA_CH_EN] & (ch1_csr[`WDMA_MODE] ? (req_r[1] & !ack_o[1]) : 1'b1);
|
|
assign valid[2] = ch2_conf[0] & ch2_csr[`WDMA_CH_EN] & (ch2_csr[`WDMA_MODE] ? (req_r[2] & !ack_o[2]) : 1'b1);
|
|
assign valid[3] = ch3_conf[0] & ch3_csr[`WDMA_CH_EN] & (ch3_csr[`WDMA_MODE] ? (req_r[3] & !ack_o[3]) : 1'b1);
|
|
assign valid[4] = ch4_conf[0] & ch4_csr[`WDMA_CH_EN] & (ch4_csr[`WDMA_MODE] ? (req_r[4] & !ack_o[4]) : 1'b1);
|
|
assign valid[5] = ch5_conf[0] & ch5_csr[`WDMA_CH_EN] & (ch5_csr[`WDMA_MODE] ? (req_r[5] & !ack_o[5]) : 1'b1);
|
|
assign valid[6] = ch6_conf[0] & ch6_csr[`WDMA_CH_EN] & (ch6_csr[`WDMA_MODE] ? (req_r[6] & !ack_o[6]) : 1'b1);
|
|
assign valid[7] = ch7_conf[0] & ch7_csr[`WDMA_CH_EN] & (ch7_csr[`WDMA_MODE] ? (req_r[7] & !ack_o[7]) : 1'b1);
|
|
assign valid[8] = ch8_conf[0] & ch8_csr[`WDMA_CH_EN] & (ch8_csr[`WDMA_MODE] ? (req_r[8] & !ack_o[8]) : 1'b1);
|
|
assign valid[9] = ch9_conf[0] & ch9_csr[`WDMA_CH_EN] & (ch9_csr[`WDMA_MODE] ? (req_r[9] & !ack_o[9]) : 1'b1);
|
|
assign valid[10] = ch10_conf[0] & ch10_csr[`WDMA_CH_EN] & (ch10_csr[`WDMA_MODE] ? (req_r[10] & !ack_o[10]) : 1'b1);
|
|
assign valid[11] = ch11_conf[0] & ch11_csr[`WDMA_CH_EN] & (ch11_csr[`WDMA_MODE] ? (req_r[11] & !ack_o[11]) : 1'b1);
|
|
assign valid[12] = ch12_conf[0] & ch12_csr[`WDMA_CH_EN] & (ch12_csr[`WDMA_MODE] ? (req_r[12] & !ack_o[12]) : 1'b1);
|
|
assign valid[13] = ch13_conf[0] & ch13_csr[`WDMA_CH_EN] & (ch13_csr[`WDMA_MODE] ? (req_r[13] & !ack_o[13]) : 1'b1);
|
|
assign valid[14] = ch14_conf[0] & ch14_csr[`WDMA_CH_EN] & (ch14_csr[`WDMA_MODE] ? (req_r[14] & !ack_o[14]) : 1'b1);
|
|
assign valid[15] = ch15_conf[0] & ch15_csr[`WDMA_CH_EN] & (ch15_csr[`WDMA_MODE] ? (req_r[15] & !ack_o[15]) : 1'b1);
|
|
assign valid[16] = ch16_conf[0] & ch16_csr[`WDMA_CH_EN] & (ch16_csr[`WDMA_MODE] ? (req_r[16] & !ack_o[16]) : 1'b1);
|
|
assign valid[17] = ch17_conf[0] & ch17_csr[`WDMA_CH_EN] & (ch17_csr[`WDMA_MODE] ? (req_r[17] & !ack_o[17]) : 1'b1);
|
|
assign valid[18] = ch18_conf[0] & ch18_csr[`WDMA_CH_EN] & (ch18_csr[`WDMA_MODE] ? (req_r[18] & !ack_o[18]) : 1'b1);
|
|
assign valid[19] = ch19_conf[0] & ch19_csr[`WDMA_CH_EN] & (ch19_csr[`WDMA_MODE] ? (req_r[19] & !ack_o[19]) : 1'b1);
|
|
assign valid[20] = ch20_conf[0] & ch20_csr[`WDMA_CH_EN] & (ch20_csr[`WDMA_MODE] ? (req_r[20] & !ack_o[20]) : 1'b1);
|
|
assign valid[21] = ch21_conf[0] & ch21_csr[`WDMA_CH_EN] & (ch21_csr[`WDMA_MODE] ? (req_r[21] & !ack_o[21]) : 1'b1);
|
|
assign valid[22] = ch22_conf[0] & ch22_csr[`WDMA_CH_EN] & (ch22_csr[`WDMA_MODE] ? (req_r[22] & !ack_o[22]) : 1'b1);
|
|
assign valid[23] = ch23_conf[0] & ch23_csr[`WDMA_CH_EN] & (ch23_csr[`WDMA_MODE] ? (req_r[23] & !ack_o[23]) : 1'b1);
|
|
assign valid[24] = ch24_conf[0] & ch24_csr[`WDMA_CH_EN] & (ch24_csr[`WDMA_MODE] ? (req_r[24] & !ack_o[24]) : 1'b1);
|
|
assign valid[25] = ch25_conf[0] & ch25_csr[`WDMA_CH_EN] & (ch25_csr[`WDMA_MODE] ? (req_r[25] & !ack_o[25]) : 1'b1);
|
|
assign valid[26] = ch26_conf[0] & ch26_csr[`WDMA_CH_EN] & (ch26_csr[`WDMA_MODE] ? (req_r[26] & !ack_o[26]) : 1'b1);
|
|
assign valid[27] = ch27_conf[0] & ch27_csr[`WDMA_CH_EN] & (ch27_csr[`WDMA_MODE] ? (req_r[27] & !ack_o[27]) : 1'b1);
|
|
assign valid[28] = ch28_conf[0] & ch28_csr[`WDMA_CH_EN] & (ch28_csr[`WDMA_MODE] ? (req_r[28] & !ack_o[28]) : 1'b1);
|
|
assign valid[29] = ch29_conf[0] & ch29_csr[`WDMA_CH_EN] & (ch29_csr[`WDMA_MODE] ? (req_r[29] & !ack_o[29]) : 1'b1);
|
|
assign valid[30] = ch30_conf[0] & ch30_csr[`WDMA_CH_EN] & (ch30_csr[`WDMA_MODE] ? (req_r[30] & !ack_o[30]) : 1'b1);
|
|
|
|
always @(posedge clk)
|
|
ndr_r <= #1 nd_i & req_i;
|
|
|
|
always @(posedge clk)
|
|
ndnr <= #1 nd_i & ~req_i;
|
|
|
|
// Start Signal for DMA engine
|
|
assign de_start = (valid_sel & !de_start_r ) | next_start;
|
|
|
|
always @(posedge clk)
|
|
de_start_r <= #1 valid_sel;
|
|
|
|
always @(posedge clk)
|
|
next_start <= #1 next_ch & valid_sel;
|
|
|
|
// Ack outputs for HW handshake mode
|
|
always @(posedge clk)
|
|
ack_o[0] <= #1 ch0_conf[0] & (ch_sel == 5'h0) & ch0_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[1] <= #1 ch1_conf[0] & (ch_sel == 5'h1) & ch1_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[2] <= #1 ch2_conf[0] & (ch_sel == 5'h2) & ch2_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[3] <= #1 ch3_conf[0] & (ch_sel == 5'h3) & ch3_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[4] <= #1 ch4_conf[0] & (ch_sel == 5'h4) & ch4_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[5] <= #1 ch5_conf[0] & (ch_sel == 5'h5) & ch5_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[6] <= #1 ch6_conf[0] & (ch_sel == 5'h6) & ch6_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[7] <= #1 ch7_conf[0] & (ch_sel == 5'h7) & ch7_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[8] <= #1 ch8_conf[0] & (ch_sel == 5'h8) & ch8_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[9] <= #1 ch9_conf[0] & (ch_sel == 5'h9) & ch9_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[10] <= #1 ch10_conf[0] & (ch_sel == 5'ha) & ch10_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[11] <= #1 ch11_conf[0] & (ch_sel == 5'hb) & ch11_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[12] <= #1 ch12_conf[0] & (ch_sel == 5'hc) & ch12_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[13] <= #1 ch13_conf[0] & (ch_sel == 5'hd) & ch13_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[14] <= #1 ch14_conf[0] & (ch_sel == 5'he) & ch14_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[15] <= #1 ch15_conf[0] & (ch_sel == 5'hf) & ch15_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[16] <= #1 ch16_conf[0] & (ch_sel == 5'h10) & ch16_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[17] <= #1 ch17_conf[0] & (ch_sel == 5'h11) & ch17_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[18] <= #1 ch18_conf[0] & (ch_sel == 5'h12) & ch18_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[19] <= #1 ch19_conf[0] & (ch_sel == 5'h13) & ch19_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[20] <= #1 ch20_conf[0] & (ch_sel == 5'h14) & ch20_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[21] <= #1 ch21_conf[0] & (ch_sel == 5'h15) & ch21_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[22] <= #1 ch22_conf[0] & (ch_sel == 5'h16) & ch22_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[23] <= #1 ch23_conf[0] & (ch_sel == 5'h17) & ch23_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[24] <= #1 ch24_conf[0] & (ch_sel == 5'h18) & ch24_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[25] <= #1 ch25_conf[0] & (ch_sel == 5'h19) & ch25_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[26] <= #1 ch26_conf[0] & (ch_sel == 5'h1a) & ch26_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[27] <= #1 ch27_conf[0] & (ch_sel == 5'h1b) & ch27_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[28] <= #1 ch28_conf[0] & (ch_sel == 5'h1c) & ch28_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[29] <= #1 ch29_conf[0] & (ch_sel == 5'h1d) & ch29_csr[`WDMA_MODE] & de_ack;
|
|
|
|
always @(posedge clk)
|
|
ack_o[30] <= #1 ch30_conf[0] & (ch_sel == 5'h1e) & ch30_csr[`WDMA_MODE] & de_ack;
|
|
|
|
// Channel Select
|
|
always @(posedge clk or negedge rst)
|
|
if(!rst) ch_sel_r <= #1 0;
|
|
else
|
|
if(de_start) ch_sel_r <= #1 ch_sel_d;
|
|
|
|
assign ch_sel = !dma_busy ? ch_sel_d : ch_sel_r;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Select Registers based on arbiter (and priority) outputs
|
|
//
|
|
|
|
always @(ch_sel or valid)
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: valid_sel = valid[0];
|
|
5'h1: valid_sel = valid[1];
|
|
5'h2: valid_sel = valid[2];
|
|
5'h3: valid_sel = valid[3];
|
|
5'h4: valid_sel = valid[4];
|
|
5'h5: valid_sel = valid[5];
|
|
5'h6: valid_sel = valid[6];
|
|
5'h7: valid_sel = valid[7];
|
|
5'h8: valid_sel = valid[8];
|
|
5'h9: valid_sel = valid[9];
|
|
5'ha: valid_sel = valid[10];
|
|
5'hb: valid_sel = valid[11];
|
|
5'hc: valid_sel = valid[12];
|
|
5'hd: valid_sel = valid[13];
|
|
5'he: valid_sel = valid[14];
|
|
5'hf: valid_sel = valid[15];
|
|
5'h10: valid_sel = valid[16];
|
|
5'h11: valid_sel = valid[17];
|
|
5'h12: valid_sel = valid[18];
|
|
5'h13: valid_sel = valid[19];
|
|
5'h14: valid_sel = valid[20];
|
|
5'h15: valid_sel = valid[21];
|
|
5'h16: valid_sel = valid[22];
|
|
5'h17: valid_sel = valid[23];
|
|
5'h18: valid_sel = valid[24];
|
|
5'h19: valid_sel = valid[25];
|
|
5'h1a: valid_sel = valid[26];
|
|
5'h1b: valid_sel = valid[27];
|
|
5'h1c: valid_sel = valid[28];
|
|
5'h1d: valid_sel = valid[29];
|
|
5'h1e: valid_sel = valid[30];
|
|
endcase
|
|
|
|
always @(ch_sel or ndr_r)
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: ndr = ndr_r[0];
|
|
5'h1: ndr = ndr_r[1];
|
|
5'h2: ndr = ndr_r[2];
|
|
5'h3: ndr = ndr_r[3];
|
|
5'h4: ndr = ndr_r[4];
|
|
5'h5: ndr = ndr_r[5];
|
|
5'h6: ndr = ndr_r[6];
|
|
5'h7: ndr = ndr_r[7];
|
|
5'h8: ndr = ndr_r[8];
|
|
5'h9: ndr = ndr_r[9];
|
|
5'ha: ndr = ndr_r[10];
|
|
5'hb: ndr = ndr_r[11];
|
|
5'hc: ndr = ndr_r[12];
|
|
5'hd: ndr = ndr_r[13];
|
|
5'he: ndr = ndr_r[14];
|
|
5'hf: ndr = ndr_r[15];
|
|
5'h10: ndr = ndr_r[16];
|
|
5'h11: ndr = ndr_r[17];
|
|
5'h12: ndr = ndr_r[18];
|
|
5'h13: ndr = ndr_r[19];
|
|
5'h14: ndr = ndr_r[20];
|
|
5'h15: ndr = ndr_r[21];
|
|
5'h16: ndr = ndr_r[22];
|
|
5'h17: ndr = ndr_r[23];
|
|
5'h18: ndr = ndr_r[24];
|
|
5'h19: ndr = ndr_r[25];
|
|
5'h1a: ndr = ndr_r[26];
|
|
5'h1b: ndr = ndr_r[27];
|
|
5'h1c: ndr = ndr_r[28];
|
|
5'h1d: ndr = ndr_r[29];
|
|
5'h1e: ndr = ndr_r[30];
|
|
endcase
|
|
|
|
always @(ch_sel or pointer0 or pointer1 or pointer2 or pointer3 or pointer4
|
|
or pointer5 or pointer6 or pointer7 or pointer8 or pointer9
|
|
or pointer10 or pointer11 or pointer12 or pointer13 or pointer14
|
|
or pointer15 or pointer16 or pointer17 or pointer18 or pointer19
|
|
or pointer20 or pointer21 or pointer22 or pointer23 or pointer24
|
|
or pointer25 or pointer26 or pointer27 or pointer28 or pointer29
|
|
or pointer30 )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: pointer = pointer0;
|
|
5'h1: pointer = pointer1;
|
|
5'h2: pointer = pointer2;
|
|
5'h3: pointer = pointer3;
|
|
5'h4: pointer = pointer4;
|
|
5'h5: pointer = pointer5;
|
|
5'h6: pointer = pointer6;
|
|
5'h7: pointer = pointer7;
|
|
5'h8: pointer = pointer8;
|
|
5'h9: pointer = pointer9;
|
|
5'ha: pointer = pointer10;
|
|
5'hb: pointer = pointer11;
|
|
5'hc: pointer = pointer12;
|
|
5'hd: pointer = pointer13;
|
|
5'he: pointer = pointer14;
|
|
5'hf: pointer = pointer15;
|
|
5'h10: pointer = pointer16;
|
|
5'h11: pointer = pointer17;
|
|
5'h12: pointer = pointer18;
|
|
5'h13: pointer = pointer19;
|
|
5'h14: pointer = pointer20;
|
|
5'h15: pointer = pointer21;
|
|
5'h16: pointer = pointer22;
|
|
5'h17: pointer = pointer23;
|
|
5'h18: pointer = pointer24;
|
|
5'h19: pointer = pointer25;
|
|
5'h1a: pointer = pointer26;
|
|
5'h1b: pointer = pointer27;
|
|
5'h1c: pointer = pointer28;
|
|
5'h1d: pointer = pointer29;
|
|
5'h1e: pointer = pointer30;
|
|
endcase
|
|
|
|
always @(ch_sel or pointer0_s or pointer1_s or pointer2_s or pointer3_s or pointer4_s
|
|
or pointer5_s or pointer6_s or pointer7_s or pointer8_s or pointer9_s
|
|
or pointer10_s or pointer11_s or pointer12_s or pointer13_s or pointer14_s
|
|
or pointer15_s or pointer16_s or pointer17_s or pointer18_s or pointer19_s
|
|
or pointer20_s or pointer21_s or pointer22_s or pointer23_s or pointer24_s
|
|
or pointer25_s or pointer26_s or pointer27_s or pointer28_s or pointer29_s
|
|
or pointer30_s )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: pointer_s = pointer0_s;
|
|
5'h1: pointer_s = pointer1_s;
|
|
5'h2: pointer_s = pointer2_s;
|
|
5'h3: pointer_s = pointer3_s;
|
|
5'h4: pointer_s = pointer4_s;
|
|
5'h5: pointer_s = pointer5_s;
|
|
5'h6: pointer_s = pointer6_s;
|
|
5'h7: pointer_s = pointer7_s;
|
|
5'h8: pointer_s = pointer8_s;
|
|
5'h9: pointer_s = pointer9_s;
|
|
5'ha: pointer_s = pointer10_s;
|
|
5'hb: pointer_s = pointer11_s;
|
|
5'hc: pointer_s = pointer12_s;
|
|
5'hd: pointer_s = pointer13_s;
|
|
5'he: pointer_s = pointer14_s;
|
|
5'hf: pointer_s = pointer15_s;
|
|
5'h10: pointer_s = pointer16_s;
|
|
5'h11: pointer_s = pointer17_s;
|
|
5'h12: pointer_s = pointer18_s;
|
|
5'h13: pointer_s = pointer19_s;
|
|
5'h14: pointer_s = pointer20_s;
|
|
5'h15: pointer_s = pointer21_s;
|
|
5'h16: pointer_s = pointer22_s;
|
|
5'h17: pointer_s = pointer23_s;
|
|
5'h18: pointer_s = pointer24_s;
|
|
5'h19: pointer_s = pointer25_s;
|
|
5'h1a: pointer_s = pointer26_s;
|
|
5'h1b: pointer_s = pointer27_s;
|
|
5'h1c: pointer_s = pointer28_s;
|
|
5'h1d: pointer_s = pointer29_s;
|
|
5'h1e: pointer_s = pointer30_s;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_csr or ch1_csr or ch2_csr or ch3_csr or ch4_csr
|
|
or ch5_csr or ch6_csr or ch7_csr or ch8_csr or ch9_csr
|
|
or ch10_csr or ch11_csr or ch12_csr or ch13_csr or ch14_csr
|
|
or ch15_csr or ch16_csr or ch17_csr or ch18_csr or ch19_csr
|
|
or ch20_csr or ch21_csr or ch22_csr or ch23_csr or ch24_csr
|
|
or ch25_csr or ch26_csr or ch27_csr or ch28_csr or ch29_csr
|
|
or ch30_csr )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: csr = ch0_csr;
|
|
5'h1: csr = ch1_csr;
|
|
5'h2: csr = ch2_csr;
|
|
5'h3: csr = ch3_csr;
|
|
5'h4: csr = ch4_csr;
|
|
5'h5: csr = ch5_csr;
|
|
5'h6: csr = ch6_csr;
|
|
5'h7: csr = ch7_csr;
|
|
5'h8: csr = ch8_csr;
|
|
5'h9: csr = ch9_csr;
|
|
5'ha: csr = ch10_csr;
|
|
5'hb: csr = ch11_csr;
|
|
5'hc: csr = ch12_csr;
|
|
5'hd: csr = ch13_csr;
|
|
5'he: csr = ch14_csr;
|
|
5'hf: csr = ch15_csr;
|
|
5'h10: csr = ch16_csr;
|
|
5'h11: csr = ch17_csr;
|
|
5'h12: csr = ch18_csr;
|
|
5'h13: csr = ch19_csr;
|
|
5'h14: csr = ch20_csr;
|
|
5'h15: csr = ch21_csr;
|
|
5'h16: csr = ch22_csr;
|
|
5'h17: csr = ch23_csr;
|
|
5'h18: csr = ch24_csr;
|
|
5'h19: csr = ch25_csr;
|
|
5'h1a: csr = ch26_csr;
|
|
5'h1b: csr = ch27_csr;
|
|
5'h1c: csr = ch28_csr;
|
|
5'h1d: csr = ch29_csr;
|
|
5'h1e: csr = ch30_csr;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_txsz or ch1_txsz or ch2_txsz or ch3_txsz or ch4_txsz
|
|
or ch5_txsz or ch6_txsz or ch7_txsz or ch8_txsz or ch9_txsz
|
|
or ch10_txsz or ch11_txsz or ch12_txsz or ch13_txsz or ch14_txsz
|
|
or ch15_txsz or ch16_txsz or ch17_txsz or ch18_txsz or ch19_txsz
|
|
or ch20_txsz or ch21_txsz or ch22_txsz or ch23_txsz or ch24_txsz
|
|
or ch25_txsz or ch26_txsz or ch27_txsz or ch28_txsz or ch29_txsz
|
|
or ch30_txsz )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: txsz = ch0_txsz;
|
|
5'h1: txsz = ch1_txsz;
|
|
5'h2: txsz = ch2_txsz;
|
|
5'h3: txsz = ch3_txsz;
|
|
5'h4: txsz = ch4_txsz;
|
|
5'h5: txsz = ch5_txsz;
|
|
5'h6: txsz = ch6_txsz;
|
|
5'h7: txsz = ch7_txsz;
|
|
5'h8: txsz = ch8_txsz;
|
|
5'h9: txsz = ch9_txsz;
|
|
5'ha: txsz = ch10_txsz;
|
|
5'hb: txsz = ch11_txsz;
|
|
5'hc: txsz = ch12_txsz;
|
|
5'hd: txsz = ch13_txsz;
|
|
5'he: txsz = ch14_txsz;
|
|
5'hf: txsz = ch15_txsz;
|
|
5'h10: txsz = ch16_txsz;
|
|
5'h11: txsz = ch17_txsz;
|
|
5'h12: txsz = ch18_txsz;
|
|
5'h13: txsz = ch19_txsz;
|
|
5'h14: txsz = ch20_txsz;
|
|
5'h15: txsz = ch21_txsz;
|
|
5'h16: txsz = ch22_txsz;
|
|
5'h17: txsz = ch23_txsz;
|
|
5'h18: txsz = ch24_txsz;
|
|
5'h19: txsz = ch25_txsz;
|
|
5'h1a: txsz = ch26_txsz;
|
|
5'h1b: txsz = ch27_txsz;
|
|
5'h1c: txsz = ch28_txsz;
|
|
5'h1d: txsz = ch29_txsz;
|
|
5'h1e: txsz = ch30_txsz;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_adr0 or ch1_adr0 or ch2_adr0 or ch3_adr0 or ch4_adr0
|
|
or ch5_adr0 or ch6_adr0 or ch7_adr0 or ch8_adr0 or ch9_adr0
|
|
or ch10_adr0 or ch11_adr0 or ch12_adr0 or ch13_adr0 or ch14_adr0
|
|
or ch15_adr0 or ch16_adr0 or ch17_adr0 or ch18_adr0 or ch19_adr0
|
|
or ch20_adr0 or ch21_adr0 or ch22_adr0 or ch23_adr0 or ch24_adr0
|
|
or ch25_adr0 or ch26_adr0 or ch27_adr0 or ch28_adr0 or ch29_adr0
|
|
or ch30_adr0 )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: adr0 = ch0_adr0;
|
|
5'h1: adr0 = ch1_adr0;
|
|
5'h2: adr0 = ch2_adr0;
|
|
5'h3: adr0 = ch3_adr0;
|
|
5'h4: adr0 = ch4_adr0;
|
|
5'h5: adr0 = ch5_adr0;
|
|
5'h6: adr0 = ch6_adr0;
|
|
5'h7: adr0 = ch7_adr0;
|
|
5'h8: adr0 = ch8_adr0;
|
|
5'h9: adr0 = ch9_adr0;
|
|
5'ha: adr0 = ch10_adr0;
|
|
5'hb: adr0 = ch11_adr0;
|
|
5'hc: adr0 = ch12_adr0;
|
|
5'hd: adr0 = ch13_adr0;
|
|
5'he: adr0 = ch14_adr0;
|
|
5'hf: adr0 = ch15_adr0;
|
|
5'h10: adr0 = ch16_adr0;
|
|
5'h11: adr0 = ch17_adr0;
|
|
5'h12: adr0 = ch18_adr0;
|
|
5'h13: adr0 = ch19_adr0;
|
|
5'h14: adr0 = ch20_adr0;
|
|
5'h15: adr0 = ch21_adr0;
|
|
5'h16: adr0 = ch22_adr0;
|
|
5'h17: adr0 = ch23_adr0;
|
|
5'h18: adr0 = ch24_adr0;
|
|
5'h19: adr0 = ch25_adr0;
|
|
5'h1a: adr0 = ch26_adr0;
|
|
5'h1b: adr0 = ch27_adr0;
|
|
5'h1c: adr0 = ch28_adr0;
|
|
5'h1d: adr0 = ch29_adr0;
|
|
5'h1e: adr0 = ch30_adr0;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_adr1 or ch1_adr1 or ch2_adr1 or ch3_adr1 or ch4_adr1
|
|
or ch5_adr1 or ch6_adr1 or ch7_adr1 or ch8_adr1 or ch9_adr1
|
|
or ch10_adr1 or ch11_adr1 or ch12_adr1 or ch13_adr1 or ch14_adr1
|
|
or ch15_adr1 or ch16_adr1 or ch17_adr1 or ch18_adr1 or ch19_adr1
|
|
or ch20_adr1 or ch21_adr1 or ch22_adr1 or ch23_adr1 or ch24_adr1
|
|
or ch25_adr1 or ch26_adr1 or ch27_adr1 or ch28_adr1 or ch29_adr1
|
|
or ch30_adr1 )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: adr1 = ch0_adr1;
|
|
5'h1: adr1 = ch1_adr1;
|
|
5'h2: adr1 = ch2_adr1;
|
|
5'h3: adr1 = ch3_adr1;
|
|
5'h4: adr1 = ch4_adr1;
|
|
5'h5: adr1 = ch5_adr1;
|
|
5'h6: adr1 = ch6_adr1;
|
|
5'h7: adr1 = ch7_adr1;
|
|
5'h8: adr1 = ch8_adr1;
|
|
5'h9: adr1 = ch9_adr1;
|
|
5'ha: adr1 = ch10_adr1;
|
|
5'hb: adr1 = ch11_adr1;
|
|
5'hc: adr1 = ch12_adr1;
|
|
5'hd: adr1 = ch13_adr1;
|
|
5'he: adr1 = ch14_adr1;
|
|
5'hf: adr1 = ch15_adr1;
|
|
5'h10: adr1 = ch16_adr1;
|
|
5'h11: adr1 = ch17_adr1;
|
|
5'h12: adr1 = ch18_adr1;
|
|
5'h13: adr1 = ch19_adr1;
|
|
5'h14: adr1 = ch20_adr1;
|
|
5'h15: adr1 = ch21_adr1;
|
|
5'h16: adr1 = ch22_adr1;
|
|
5'h17: adr1 = ch23_adr1;
|
|
5'h18: adr1 = ch24_adr1;
|
|
5'h19: adr1 = ch25_adr1;
|
|
5'h1a: adr1 = ch26_adr1;
|
|
5'h1b: adr1 = ch27_adr1;
|
|
5'h1c: adr1 = ch28_adr1;
|
|
5'h1d: adr1 = ch29_adr1;
|
|
5'h1e: adr1 = ch30_adr1;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_am0 or ch1_am0 or ch2_am0 or ch3_am0 or ch4_am0
|
|
or ch5_am0 or ch6_am0 or ch7_am0 or ch8_am0 or ch9_am0
|
|
or ch10_am0 or ch11_am0 or ch12_am0 or ch13_am0 or ch14_am0
|
|
or ch15_am0 or ch16_am0 or ch17_am0 or ch18_am0 or ch19_am0
|
|
or ch20_am0 or ch21_am0 or ch22_am0 or ch23_am0 or ch24_am0
|
|
or ch25_am0 or ch26_am0 or ch27_am0 or ch28_am0 or ch29_am0
|
|
or ch30_am0 )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: am0 = ch0_am0;
|
|
5'h1: am0 = ch1_am0;
|
|
5'h2: am0 = ch2_am0;
|
|
5'h3: am0 = ch3_am0;
|
|
5'h4: am0 = ch4_am0;
|
|
5'h5: am0 = ch5_am0;
|
|
5'h6: am0 = ch6_am0;
|
|
5'h7: am0 = ch7_am0;
|
|
5'h8: am0 = ch8_am0;
|
|
5'h9: am0 = ch9_am0;
|
|
5'ha: am0 = ch10_am0;
|
|
5'hb: am0 = ch11_am0;
|
|
5'hc: am0 = ch12_am0;
|
|
5'hd: am0 = ch13_am0;
|
|
5'he: am0 = ch14_am0;
|
|
5'hf: am0 = ch15_am0;
|
|
5'h10: am0 = ch16_am0;
|
|
5'h11: am0 = ch17_am0;
|
|
5'h12: am0 = ch18_am0;
|
|
5'h13: am0 = ch19_am0;
|
|
5'h14: am0 = ch20_am0;
|
|
5'h15: am0 = ch21_am0;
|
|
5'h16: am0 = ch22_am0;
|
|
5'h17: am0 = ch23_am0;
|
|
5'h18: am0 = ch24_am0;
|
|
5'h19: am0 = ch25_am0;
|
|
5'h1a: am0 = ch26_am0;
|
|
5'h1b: am0 = ch27_am0;
|
|
5'h1c: am0 = ch28_am0;
|
|
5'h1d: am0 = ch29_am0;
|
|
5'h1e: am0 = ch30_am0;
|
|
endcase
|
|
|
|
always @(ch_sel or ch0_am1 or ch1_am1 or ch2_am1 or ch3_am1 or ch4_am1
|
|
or ch5_am1 or ch6_am1 or ch7_am1 or ch8_am1 or ch9_am1
|
|
or ch10_am1 or ch11_am1 or ch12_am1 or ch13_am1 or ch14_am1
|
|
or ch15_am1 or ch16_am1 or ch17_am1 or ch18_am1 or ch19_am1
|
|
or ch20_am1 or ch21_am1 or ch22_am1 or ch23_am1 or ch24_am1
|
|
or ch25_am1 or ch26_am1 or ch27_am1 or ch28_am1 or ch29_am1
|
|
or ch30_am1 )
|
|
case(ch_sel) // synopsys parallel_case full_case
|
|
5'h0: am1 = ch0_am1;
|
|
5'h1: am1 = ch1_am1;
|
|
5'h2: am1 = ch2_am1;
|
|
5'h3: am1 = ch3_am1;
|
|
5'h4: am1 = ch4_am1;
|
|
5'h5: am1 = ch5_am1;
|
|
5'h6: am1 = ch6_am1;
|
|
5'h7: am1 = ch7_am1;
|
|
5'h8: am1 = ch8_am1;
|
|
5'h9: am1 = ch9_am1;
|
|
5'ha: am1 = ch10_am1;
|
|
5'hb: am1 = ch11_am1;
|
|
5'hc: am1 = ch12_am1;
|
|
5'hd: am1 = ch13_am1;
|
|
5'he: am1 = ch14_am1;
|
|
5'hf: am1 = ch15_am1;
|
|
5'h10: am1 = ch16_am1;
|
|
5'h11: am1 = ch17_am1;
|
|
5'h12: am1 = ch18_am1;
|
|
5'h13: am1 = ch19_am1;
|
|
5'h14: am1 = ch20_am1;
|
|
5'h15: am1 = ch21_am1;
|
|
5'h16: am1 = ch22_am1;
|
|
5'h17: am1 = ch23_am1;
|
|
5'h18: am1 = ch24_am1;
|
|
5'h19: am1 = ch25_am1;
|
|
5'h1a: am1 = ch26_am1;
|
|
5'h1b: am1 = ch27_am1;
|
|
5'h1c: am1 = ch28_am1;
|
|
5'h1d: am1 = ch29_am1;
|
|
5'h1e: am1 = ch30_am1;
|
|
endcase
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Actual Chanel Arbiter and Priority Encoder
|
|
//
|
|
|
|
// Select the arbiter for current highest priority
|
|
always @(pri_out or gnt_p0 or gnt_p1 or gnt_p2 or gnt_p3 or gnt_p4
|
|
or gnt_p5 or gnt_p6 or gnt_p7 )
|
|
case(pri_out) // synopsys parallel_case full_case
|
|
3'h0: ch_sel_d = gnt_p0;
|
|
3'h1: ch_sel_d = gnt_p1;
|
|
3'h2: ch_sel_d = gnt_p2;
|
|
3'h3: ch_sel_d = gnt_p3;
|
|
3'h4: ch_sel_d = gnt_p4;
|
|
3'h5: ch_sel_d = gnt_p5;
|
|
3'h6: ch_sel_d = gnt_p6;
|
|
3'h7: ch_sel_d = gnt_p7;
|
|
endcase
|
|
|
|
|
|
// Priority Encoder
|
|
wb_dma_ch_pri_enc
|
|
#( pri_sel,
|
|
ch0_conf,
|
|
ch1_conf,
|
|
ch2_conf,
|
|
ch3_conf,
|
|
ch4_conf,
|
|
ch5_conf,
|
|
ch6_conf,
|
|
ch7_conf,
|
|
ch8_conf,
|
|
ch9_conf,
|
|
ch10_conf,
|
|
ch11_conf,
|
|
ch12_conf,
|
|
ch13_conf,
|
|
ch14_conf,
|
|
ch15_conf,
|
|
ch16_conf,
|
|
ch17_conf,
|
|
ch18_conf,
|
|
ch19_conf,
|
|
ch20_conf,
|
|
ch21_conf,
|
|
ch22_conf,
|
|
ch23_conf,
|
|
ch24_conf,
|
|
ch25_conf,
|
|
ch26_conf,
|
|
ch27_conf,
|
|
ch28_conf,
|
|
ch29_conf,
|
|
ch30_conf)
|
|
u0(
|
|
.clk( clk ),
|
|
.valid( valid ),
|
|
.pri0( pri0 ),
|
|
.pri1( pri1 ),
|
|
.pri2( pri2 ),
|
|
.pri3( pri3 ),
|
|
.pri4( pri4 ),
|
|
.pri5( pri5 ),
|
|
.pri6( pri6 ),
|
|
.pri7( pri7 ),
|
|
.pri8( pri8 ),
|
|
.pri9( pri9 ),
|
|
.pri10( pri10 ),
|
|
.pri11( pri11 ),
|
|
.pri12( pri12 ),
|
|
.pri13( pri13 ),
|
|
.pri14( pri14 ),
|
|
.pri15( pri15 ),
|
|
.pri16( pri16 ),
|
|
.pri17( pri17 ),
|
|
.pri18( pri18 ),
|
|
.pri19( pri19 ),
|
|
.pri20( pri20 ),
|
|
.pri21( pri21 ),
|
|
.pri22( pri22 ),
|
|
.pri23( pri23 ),
|
|
.pri24( pri24 ),
|
|
.pri25( pri25 ),
|
|
.pri26( pri26 ),
|
|
.pri27( pri27 ),
|
|
.pri28( pri28 ),
|
|
.pri29( pri29 ),
|
|
.pri30( pri30 ),
|
|
.pri_out( pri_out )
|
|
);
|
|
|
|
// Arbiter request lines
|
|
// Generate request depending on priority and valid bits
|
|
|
|
assign req_p0[0] = valid[0] & (pri0==3'h0);
|
|
assign req_p0[1] = valid[1] & (pri1==3'h0);
|
|
assign req_p0[2] = valid[2] & (pri2==3'h0);
|
|
assign req_p0[3] = valid[3] & (pri3==3'h0);
|
|
assign req_p0[4] = valid[4] & (pri4==3'h0);
|
|
assign req_p0[5] = valid[5] & (pri5==3'h0);
|
|
assign req_p0[6] = valid[6] & (pri6==3'h0);
|
|
assign req_p0[7] = valid[7] & (pri7==3'h0);
|
|
assign req_p0[8] = valid[8] & (pri8==3'h0);
|
|
assign req_p0[9] = valid[9] & (pri9==3'h0);
|
|
assign req_p0[10] = valid[10] & (pri10==3'h0);
|
|
assign req_p0[11] = valid[11] & (pri11==3'h0);
|
|
assign req_p0[12] = valid[12] & (pri12==3'h0);
|
|
assign req_p0[13] = valid[13] & (pri13==3'h0);
|
|
assign req_p0[14] = valid[14] & (pri14==3'h0);
|
|
assign req_p0[15] = valid[15] & (pri15==3'h0);
|
|
assign req_p0[16] = valid[16] & (pri16==3'h0);
|
|
assign req_p0[17] = valid[17] & (pri17==3'h0);
|
|
assign req_p0[18] = valid[18] & (pri18==3'h0);
|
|
assign req_p0[19] = valid[19] & (pri19==3'h0);
|
|
assign req_p0[20] = valid[20] & (pri20==3'h0);
|
|
assign req_p0[21] = valid[21] & (pri21==3'h0);
|
|
assign req_p0[22] = valid[22] & (pri22==3'h0);
|
|
assign req_p0[23] = valid[23] & (pri23==3'h0);
|
|
assign req_p0[24] = valid[24] & (pri24==3'h0);
|
|
assign req_p0[25] = valid[25] & (pri25==3'h0);
|
|
assign req_p0[26] = valid[26] & (pri26==3'h0);
|
|
assign req_p0[27] = valid[27] & (pri27==3'h0);
|
|
assign req_p0[28] = valid[28] & (pri28==3'h0);
|
|
assign req_p0[29] = valid[29] & (pri29==3'h0);
|
|
assign req_p0[30] = valid[30] & (pri30==3'h0);
|
|
|
|
assign req_p1[0] = valid[0] & (pri0==3'h1);
|
|
assign req_p1[1] = valid[1] & (pri1==3'h1);
|
|
assign req_p1[2] = valid[2] & (pri2==3'h1);
|
|
assign req_p1[3] = valid[3] & (pri3==3'h1);
|
|
assign req_p1[4] = valid[4] & (pri4==3'h1);
|
|
assign req_p1[5] = valid[5] & (pri5==3'h1);
|
|
assign req_p1[6] = valid[6] & (pri6==3'h1);
|
|
assign req_p1[7] = valid[7] & (pri7==3'h1);
|
|
assign req_p1[8] = valid[8] & (pri8==3'h1);
|
|
assign req_p1[9] = valid[9] & (pri9==3'h1);
|
|
assign req_p1[10] = valid[10] & (pri10==3'h1);
|
|
assign req_p1[11] = valid[11] & (pri11==3'h1);
|
|
assign req_p1[12] = valid[12] & (pri12==3'h1);
|
|
assign req_p1[13] = valid[13] & (pri13==3'h1);
|
|
assign req_p1[14] = valid[14] & (pri14==3'h1);
|
|
assign req_p1[15] = valid[15] & (pri15==3'h1);
|
|
assign req_p1[16] = valid[16] & (pri16==3'h1);
|
|
assign req_p1[17] = valid[17] & (pri17==3'h1);
|
|
assign req_p1[18] = valid[18] & (pri18==3'h1);
|
|
assign req_p1[19] = valid[19] & (pri19==3'h1);
|
|
assign req_p1[20] = valid[20] & (pri20==3'h1);
|
|
assign req_p1[21] = valid[21] & (pri21==3'h1);
|
|
assign req_p1[22] = valid[22] & (pri22==3'h1);
|
|
assign req_p1[23] = valid[23] & (pri23==3'h1);
|
|
assign req_p1[24] = valid[24] & (pri24==3'h1);
|
|
assign req_p1[25] = valid[25] & (pri25==3'h1);
|
|
assign req_p1[26] = valid[26] & (pri26==3'h1);
|
|
assign req_p1[27] = valid[27] & (pri27==3'h1);
|
|
assign req_p1[28] = valid[28] & (pri28==3'h1);
|
|
assign req_p1[29] = valid[29] & (pri29==3'h1);
|
|
assign req_p1[30] = valid[30] & (pri30==3'h1);
|
|
|
|
assign req_p2[0] = valid[0] & (pri0==3'h2);
|
|
assign req_p2[1] = valid[1] & (pri1==3'h2);
|
|
assign req_p2[2] = valid[2] & (pri2==3'h2);
|
|
assign req_p2[3] = valid[3] & (pri3==3'h2);
|
|
assign req_p2[4] = valid[4] & (pri4==3'h2);
|
|
assign req_p2[5] = valid[5] & (pri5==3'h2);
|
|
assign req_p2[6] = valid[6] & (pri6==3'h2);
|
|
assign req_p2[7] = valid[7] & (pri7==3'h2);
|
|
assign req_p2[8] = valid[8] & (pri8==3'h2);
|
|
assign req_p2[9] = valid[9] & (pri9==3'h2);
|
|
assign req_p2[10] = valid[10] & (pri10==3'h2);
|
|
assign req_p2[11] = valid[11] & (pri11==3'h2);
|
|
assign req_p2[12] = valid[12] & (pri12==3'h2);
|
|
assign req_p2[13] = valid[13] & (pri13==3'h2);
|
|
assign req_p2[14] = valid[14] & (pri14==3'h2);
|
|
assign req_p2[15] = valid[15] & (pri15==3'h2);
|
|
assign req_p2[16] = valid[16] & (pri16==3'h2);
|
|
assign req_p2[17] = valid[17] & (pri17==3'h2);
|
|
assign req_p2[18] = valid[18] & (pri18==3'h2);
|
|
assign req_p2[19] = valid[19] & (pri19==3'h2);
|
|
assign req_p2[20] = valid[20] & (pri20==3'h2);
|
|
assign req_p2[21] = valid[21] & (pri21==3'h2);
|
|
assign req_p2[22] = valid[22] & (pri22==3'h2);
|
|
assign req_p2[23] = valid[23] & (pri23==3'h2);
|
|
assign req_p2[24] = valid[24] & (pri24==3'h2);
|
|
assign req_p2[25] = valid[25] & (pri25==3'h2);
|
|
assign req_p2[26] = valid[26] & (pri26==3'h2);
|
|
assign req_p2[27] = valid[27] & (pri27==3'h2);
|
|
assign req_p2[28] = valid[28] & (pri28==3'h2);
|
|
assign req_p2[29] = valid[29] & (pri29==3'h2);
|
|
assign req_p2[30] = valid[30] & (pri30==3'h2);
|
|
|
|
assign req_p3[0] = valid[0] & (pri0==3'h3);
|
|
assign req_p3[1] = valid[1] & (pri1==3'h3);
|
|
assign req_p3[2] = valid[2] & (pri2==3'h3);
|
|
assign req_p3[3] = valid[3] & (pri3==3'h3);
|
|
assign req_p3[4] = valid[4] & (pri4==3'h3);
|
|
assign req_p3[5] = valid[5] & (pri5==3'h3);
|
|
assign req_p3[6] = valid[6] & (pri6==3'h3);
|
|
assign req_p3[7] = valid[7] & (pri7==3'h3);
|
|
assign req_p3[8] = valid[8] & (pri8==3'h3);
|
|
assign req_p3[9] = valid[9] & (pri9==3'h3);
|
|
assign req_p3[10] = valid[10] & (pri10==3'h3);
|
|
assign req_p3[11] = valid[11] & (pri11==3'h3);
|
|
assign req_p3[12] = valid[12] & (pri12==3'h3);
|
|
assign req_p3[13] = valid[13] & (pri13==3'h3);
|
|
assign req_p3[14] = valid[14] & (pri14==3'h3);
|
|
assign req_p3[15] = valid[15] & (pri15==3'h3);
|
|
assign req_p3[16] = valid[16] & (pri16==3'h3);
|
|
assign req_p3[17] = valid[17] & (pri17==3'h3);
|
|
assign req_p3[18] = valid[18] & (pri18==3'h3);
|
|
assign req_p3[19] = valid[19] & (pri19==3'h3);
|
|
assign req_p3[20] = valid[20] & (pri20==3'h3);
|
|
assign req_p3[21] = valid[21] & (pri21==3'h3);
|
|
assign req_p3[22] = valid[22] & (pri22==3'h3);
|
|
assign req_p3[23] = valid[23] & (pri23==3'h3);
|
|
assign req_p3[24] = valid[24] & (pri24==3'h3);
|
|
assign req_p3[25] = valid[25] & (pri25==3'h3);
|
|
assign req_p3[26] = valid[26] & (pri26==3'h3);
|
|
assign req_p3[27] = valid[27] & (pri27==3'h3);
|
|
assign req_p3[28] = valid[28] & (pri28==3'h3);
|
|
assign req_p3[29] = valid[29] & (pri29==3'h3);
|
|
assign req_p3[30] = valid[30] & (pri30==3'h3);
|
|
|
|
assign req_p4[0] = valid[0] & (pri0==3'h4);
|
|
assign req_p4[1] = valid[1] & (pri1==3'h4);
|
|
assign req_p4[2] = valid[2] & (pri2==3'h4);
|
|
assign req_p4[3] = valid[3] & (pri3==3'h4);
|
|
assign req_p4[4] = valid[4] & (pri4==3'h4);
|
|
assign req_p4[5] = valid[5] & (pri5==3'h4);
|
|
assign req_p4[6] = valid[6] & (pri6==3'h4);
|
|
assign req_p4[7] = valid[7] & (pri7==3'h4);
|
|
assign req_p4[8] = valid[8] & (pri8==3'h4);
|
|
assign req_p4[9] = valid[9] & (pri9==3'h4);
|
|
assign req_p4[10] = valid[10] & (pri10==3'h4);
|
|
assign req_p4[11] = valid[11] & (pri11==3'h4);
|
|
assign req_p4[12] = valid[12] & (pri12==3'h4);
|
|
assign req_p4[13] = valid[13] & (pri13==3'h4);
|
|
assign req_p4[14] = valid[14] & (pri14==3'h4);
|
|
assign req_p4[15] = valid[15] & (pri15==3'h4);
|
|
assign req_p4[16] = valid[16] & (pri16==3'h4);
|
|
assign req_p4[17] = valid[17] & (pri17==3'h4);
|
|
assign req_p4[18] = valid[18] & (pri18==3'h4);
|
|
assign req_p4[19] = valid[19] & (pri19==3'h4);
|
|
assign req_p4[20] = valid[20] & (pri20==3'h4);
|
|
assign req_p4[21] = valid[21] & (pri21==3'h4);
|
|
assign req_p4[22] = valid[22] & (pri22==3'h4);
|
|
assign req_p4[23] = valid[23] & (pri23==3'h4);
|
|
assign req_p4[24] = valid[24] & (pri24==3'h4);
|
|
assign req_p4[25] = valid[25] & (pri25==3'h4);
|
|
assign req_p4[26] = valid[26] & (pri26==3'h4);
|
|
assign req_p4[27] = valid[27] & (pri27==3'h4);
|
|
assign req_p4[28] = valid[28] & (pri28==3'h4);
|
|
assign req_p4[29] = valid[29] & (pri29==3'h4);
|
|
assign req_p4[30] = valid[30] & (pri30==3'h4);
|
|
|
|
assign req_p5[0] = valid[0] & (pri0==3'h5);
|
|
assign req_p5[1] = valid[1] & (pri1==3'h5);
|
|
assign req_p5[2] = valid[2] & (pri2==3'h5);
|
|
assign req_p5[3] = valid[3] & (pri3==3'h5);
|
|
assign req_p5[4] = valid[4] & (pri4==3'h5);
|
|
assign req_p5[5] = valid[5] & (pri5==3'h5);
|
|
assign req_p5[6] = valid[6] & (pri6==3'h5);
|
|
assign req_p5[7] = valid[7] & (pri7==3'h5);
|
|
assign req_p5[8] = valid[8] & (pri8==3'h5);
|
|
assign req_p5[9] = valid[9] & (pri9==3'h5);
|
|
assign req_p5[10] = valid[10] & (pri10==3'h5);
|
|
assign req_p5[11] = valid[11] & (pri11==3'h5);
|
|
assign req_p5[12] = valid[12] & (pri12==3'h5);
|
|
assign req_p5[13] = valid[13] & (pri13==3'h5);
|
|
assign req_p5[14] = valid[14] & (pri14==3'h5);
|
|
assign req_p5[15] = valid[15] & (pri15==3'h5);
|
|
assign req_p5[16] = valid[16] & (pri16==3'h5);
|
|
assign req_p5[17] = valid[17] & (pri17==3'h5);
|
|
assign req_p5[18] = valid[18] & (pri18==3'h5);
|
|
assign req_p5[19] = valid[19] & (pri19==3'h5);
|
|
assign req_p5[20] = valid[20] & (pri20==3'h5);
|
|
assign req_p5[21] = valid[21] & (pri21==3'h5);
|
|
assign req_p5[22] = valid[22] & (pri22==3'h5);
|
|
assign req_p5[23] = valid[23] & (pri23==3'h5);
|
|
assign req_p5[24] = valid[24] & (pri24==3'h5);
|
|
assign req_p5[25] = valid[25] & (pri25==3'h5);
|
|
assign req_p5[26] = valid[26] & (pri26==3'h5);
|
|
assign req_p5[27] = valid[27] & (pri27==3'h5);
|
|
assign req_p5[28] = valid[28] & (pri28==3'h5);
|
|
assign req_p5[29] = valid[29] & (pri29==3'h5);
|
|
assign req_p5[30] = valid[30] & (pri30==3'h5);
|
|
|
|
assign req_p6[0] = valid[0] & (pri0==3'h6);
|
|
assign req_p6[1] = valid[1] & (pri1==3'h6);
|
|
assign req_p6[2] = valid[2] & (pri2==3'h6);
|
|
assign req_p6[3] = valid[3] & (pri3==3'h6);
|
|
assign req_p6[4] = valid[4] & (pri4==3'h6);
|
|
assign req_p6[5] = valid[5] & (pri5==3'h6);
|
|
assign req_p6[6] = valid[6] & (pri6==3'h6);
|
|
assign req_p6[7] = valid[7] & (pri7==3'h6);
|
|
assign req_p6[8] = valid[8] & (pri8==3'h6);
|
|
assign req_p6[9] = valid[9] & (pri9==3'h6);
|
|
assign req_p6[10] = valid[10] & (pri10==3'h6);
|
|
assign req_p6[11] = valid[11] & (pri11==3'h6);
|
|
assign req_p6[12] = valid[12] & (pri12==3'h6);
|
|
assign req_p6[13] = valid[13] & (pri13==3'h6);
|
|
assign req_p6[14] = valid[14] & (pri14==3'h6);
|
|
assign req_p6[15] = valid[15] & (pri15==3'h6);
|
|
assign req_p6[16] = valid[16] & (pri16==3'h6);
|
|
assign req_p6[17] = valid[17] & (pri17==3'h6);
|
|
assign req_p6[18] = valid[18] & (pri18==3'h6);
|
|
assign req_p6[19] = valid[19] & (pri19==3'h6);
|
|
assign req_p6[20] = valid[20] & (pri20==3'h6);
|
|
assign req_p6[21] = valid[21] & (pri21==3'h6);
|
|
assign req_p6[22] = valid[22] & (pri22==3'h6);
|
|
assign req_p6[23] = valid[23] & (pri23==3'h6);
|
|
assign req_p6[24] = valid[24] & (pri24==3'h6);
|
|
assign req_p6[25] = valid[25] & (pri25==3'h6);
|
|
assign req_p6[26] = valid[26] & (pri26==3'h6);
|
|
assign req_p6[27] = valid[27] & (pri27==3'h6);
|
|
assign req_p6[28] = valid[28] & (pri28==3'h6);
|
|
assign req_p6[29] = valid[29] & (pri29==3'h6);
|
|
assign req_p6[30] = valid[30] & (pri30==3'h6);
|
|
|
|
assign req_p7[0] = valid[0] & (pri0==3'h7);
|
|
assign req_p7[1] = valid[1] & (pri1==3'h7);
|
|
assign req_p7[2] = valid[2] & (pri2==3'h7);
|
|
assign req_p7[3] = valid[3] & (pri3==3'h7);
|
|
assign req_p7[4] = valid[4] & (pri4==3'h7);
|
|
assign req_p7[5] = valid[5] & (pri5==3'h7);
|
|
assign req_p7[6] = valid[6] & (pri6==3'h7);
|
|
assign req_p7[7] = valid[7] & (pri7==3'h7);
|
|
assign req_p7[8] = valid[8] & (pri8==3'h7);
|
|
assign req_p7[9] = valid[9] & (pri9==3'h7);
|
|
assign req_p7[10] = valid[10] & (pri10==3'h7);
|
|
assign req_p7[11] = valid[11] & (pri11==3'h7);
|
|
assign req_p7[12] = valid[12] & (pri12==3'h7);
|
|
assign req_p7[13] = valid[13] & (pri13==3'h7);
|
|
assign req_p7[14] = valid[14] & (pri14==3'h7);
|
|
assign req_p7[15] = valid[15] & (pri15==3'h7);
|
|
assign req_p7[16] = valid[16] & (pri16==3'h7);
|
|
assign req_p7[17] = valid[17] & (pri17==3'h7);
|
|
assign req_p7[18] = valid[18] & (pri18==3'h7);
|
|
assign req_p7[19] = valid[19] & (pri19==3'h7);
|
|
assign req_p7[20] = valid[20] & (pri20==3'h7);
|
|
assign req_p7[21] = valid[21] & (pri21==3'h7);
|
|
assign req_p7[22] = valid[22] & (pri22==3'h7);
|
|
assign req_p7[23] = valid[23] & (pri23==3'h7);
|
|
assign req_p7[24] = valid[24] & (pri24==3'h7);
|
|
assign req_p7[25] = valid[25] & (pri25==3'h7);
|
|
assign req_p7[26] = valid[26] & (pri26==3'h7);
|
|
assign req_p7[27] = valid[27] & (pri27==3'h7);
|
|
assign req_p7[28] = valid[28] & (pri28==3'h7);
|
|
assign req_p7[29] = valid[29] & (pri29==3'h7);
|
|
assign req_p7[30] = valid[30] & (pri30==3'h7);
|
|
|
|
// RR Arbiter for priority 0
|
|
wb_dma_ch_arb u1(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p0 ),
|
|
.gnt( gnt_p0_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 1
|
|
wb_dma_ch_arb u2(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p1 ),
|
|
.gnt( gnt_p1_d ),
|
|
.advance( next_ch )
|
|
);
|
|
|
|
// RR Arbiter for priority 2
|
|
wb_dma_ch_arb u3(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p2 ),
|
|
.gnt( gnt_p2_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 3
|
|
wb_dma_ch_arb u4(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p3 ),
|
|
.gnt( gnt_p3_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 4
|
|
wb_dma_ch_arb u5(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p4 ),
|
|
.gnt( gnt_p4_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 5
|
|
wb_dma_ch_arb u6(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p5 ),
|
|
.gnt( gnt_p5_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 6
|
|
wb_dma_ch_arb u7(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p6 ),
|
|
.gnt( gnt_p6_d ),
|
|
.advance( next_ch )
|
|
);
|
|
// RR Arbiter for priority 7
|
|
wb_dma_ch_arb u8(
|
|
.clk( clk ),
|
|
.rst( rst ),
|
|
.req( req_p7 ),
|
|
.gnt( gnt_p7_d ),
|
|
.advance( next_ch )
|
|
);
|
|
|
|
// Select grant based on number of priorities
|
|
assign gnt_p0 = gnt_p0_d;
|
|
assign gnt_p1 = gnt_p1_d;
|
|
assign gnt_p2 = (pri_sel==2'd0) ? 5'h0 : gnt_p2_d;
|
|
assign gnt_p3 = (pri_sel==2'd0) ? 5'h0 : gnt_p3_d;
|
|
assign gnt_p4 = (pri_sel==2'd2) ? gnt_p4_d : 5'h0;
|
|
assign gnt_p5 = (pri_sel==2'd2) ? gnt_p5_d : 5'h0;
|
|
assign gnt_p6 = (pri_sel==2'd2) ? gnt_p6_d : 5'h0;
|
|
assign gnt_p7 = (pri_sel==2'd2) ? gnt_p7_d : 5'h0;
|
|
|
|
endmodule
|