📄 wb_dma_ch_sel.v
字号:
///////////////////////////////////////////////////////////////////////// //////// 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: wb_dma_ch_sel.v,v $// Revision 1.4 2002/02/01 01:54:45 rudi//// - Minor cleanup//// 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 Linesinput [30:0] req_i;output [30:0] ack_o;input [30:0] nd_i;// Channel Registers Inputsinput [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 Selectoutput [30:0] ndnr; // Next Descriptor No Requestoutput de_start; // Start DMA Engine Indicatoroutput ndr; // Next Descriptor With Request (for current channel)output [31:0] csr; // Selected Channel CSRoutput [31:0] pointer; // LL Descriptor pointeroutput [31:0] pointer_s; // LL Descriptor previous pointeroutput [31:0] txsz; // Selected Channel Transfer Sizeoutput [31:0] adr0, adr1; // Selected Channel Addressesoutput [31:0] am0, am1; // Selected Channel Address Masksinput next_ch; // Indicates the DMA Engine is done // with current transferinput de_ack; // DMA engine ack outputinput dma_busy;//////////////////////////////////////////////////////////////////////// Local Wires and Registers//reg [30:0] ack_o;wire [30:0] valid; // Indicates which channel is validreg valid_sel;reg [30:0] req_r; // Channel Request inputsreg [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 prioritywire [2:0] pri0, pri1, pri2, pri3; // Channel Prioritieswire [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 CSRreg [31:0] pointer;reg [31:0] pointer_s;reg [31:0] txsz; // Selected Channel Transfer Sizereg [31:0] adr0, adr1; // Selected Channel Addressesreg [31:0] am0, am1; // Selected Channel Address Masks // Arbiter Request Inputswire [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 Outputswire [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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -