Line 1... |
Line 1... |
#######################################################################
|
#######################################################################
|
## File: dma.IP
|
## File: dma.IP
|
##
|
##
|
## Copyright (C) 2014-2016 Alireza Monemi
|
## Copyright (C) 2014-2016 Alireza Monemi
|
##
|
##
|
## This file is part of ProNoC 1.7.0
|
## This file is part of ProNoC 1.8.0
|
##
|
##
|
## WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT
|
## WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT
|
## MAY CAUSE UNEXPECTED BEHAIVOR.
|
## MAY CAUSE UNEXPECTED BEHAIVOR.
|
################################################################################
|
################################################################################
|
|
|
$dma_multi_chan_wb = bless( {
|
$ipgen = bless( {
|
'parameters_order' => [
|
'description' => 'A wishbone bus round robin-based multi channel DMA (no byte enable is supported yet). The DMA supports burst data transaction.',
|
'CHANNEL',
|
'modules' => {
|
'MAX_TRANSACTION_WIDTH',
|
'dma_multi_chan_wb' => {},
|
'MAX_BURST_SIZE',
|
'shared_mem_fifos' => {},
|
'FIFO_B',
|
'dma_single_wb' => {}
|
'DEBUG_EN',
|
},
|
'Dw',
|
'plugs' => {
|
'S_Aw',
|
'clk' => {
|
'M_Aw',
|
'type' => 'num',
|
'TAGw',
|
'value' => 1,
|
'SELw'
|
'0' => {
|
],
|
'name' => 'clk'
|
|
},
|
|
'clk' => {}
|
|
},
|
|
'wb_slave' => {
|
|
'value' => 1,
|
|
'wb_slave' => {},
|
|
'type' => 'num',
|
|
'0' => {
|
|
'width' => 10,
|
|
'addr' => '0x9300_0000 0x93ff_ffff Memory Controller',
|
|
'name' => 'wb_slave'
|
|
}
|
|
},
|
|
'interrupt_peripheral' => {
|
|
'value' => 1,
|
|
'interrupt_peripheral' => {},
|
|
'type' => 'num',
|
|
'0' => {
|
|
'name' => 'interrupt_peripheral'
|
|
}
|
|
},
|
|
'wb_master' => {
|
|
'1' => {
|
|
'name' => 'wb_wr'
|
|
},
|
|
'wb_master' => {},
|
|
'value' => 2,
|
|
'type' => 'num',
|
|
'0' => {
|
|
'name' => 'wb_rd'
|
|
}
|
|
},
|
|
'reset' => {
|
|
'type' => 'num',
|
|
'reset' => {},
|
|
'value' => 1,
|
|
'0' => {
|
|
'name' => 'reset'
|
|
}
|
|
}
|
|
},
|
'ports_order' => [
|
'ports_order' => [
|
'reset',
|
'reset',
|
'clk',
|
'clk',
|
's_dat_i',
|
's_dat_i',
|
's_sel_i',
|
's_sel_i',
|
Line 50... |
Line 91... |
'm_wr_cyc_o',
|
'm_wr_cyc_o',
|
'm_wr_we_o',
|
'm_wr_we_o',
|
'm_wr_ack_i',
|
'm_wr_ack_i',
|
'irq'
|
'irq'
|
],
|
],
|
'module_name' => 'dma_multi_chan_wb',
|
'parameters_order' => [
|
'unused' => {
|
'CHANNEL',
|
'plug:wb_master[0]' => [
|
'MAX_TRANSACTION_WIDTH',
|
'dat_o',
|
'MAX_BURST_SIZE',
|
'bte_o',
|
'FIFO_B',
|
'rty_i',
|
'DEBUG_EN',
|
'err_i',
|
'Dw',
|
'tag_o'
|
'S_Aw',
|
],
|
'M_Aw',
|
'plug:wb_master[1]' => [
|
'TAGw',
|
'bte_o',
|
'SELw'
|
'rty_i',
|
|
'err_i',
|
|
'tag_o',
|
|
'dat_i'
|
|
],
|
],
|
'plug:wb_slave[0]' => [
|
'ip_name' => 'dma',
|
'bte_i',
|
'file_name' => '/home/alireza/mywork/mpsoc/src_peripheral/DMA/dma_multi_channel_wb.v',
|
'rty_o',
|
|
'tag_i',
|
|
'err_o'
|
|
]
|
|
},
|
|
'hdl_files' => [
|
'hdl_files' => [
|
'/mpsoc/src_noc/main_comp.v',
|
'/mpsoc/src_noc/main_comp.v',
|
'/mpsoc/src_noc/arbiter.v',
|
'/mpsoc/src_noc/arbiter.v',
|
'/mpsoc/src_peripheral/DMA/dma_multi_channel_wb.v',
|
'/mpsoc/src_peripheral/DMA/dma_multi_channel_wb.v',
|
'/mpsoc/src_noc/flit_buffer.v'
|
'/mpsoc/src_noc/flit_buffer.v'
|
],
|
],
|
'modules' => {
|
'version' => 4,
|
'shared_mem_fifos' => {},
|
'category' => 'DMA',
|
'dma_single_wb' => {},
|
'module_name' => 'dma_multi_chan_wb',
|
'dma_multi_chan_wb' => {}
|
'parameters' => {
|
|
'M_Aw' => {
|
|
'redefine_param' => 1,
|
|
'type' => 'Fixed',
|
|
'default' => '32',
|
|
'content' => '',
|
|
'info' => 'Parameter',
|
|
'global_param' => 'Parameter'
|
|
},
|
|
'CHANNEL' => {
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Number of DMA channels.
|
|
In case there are multiple active DMA channels, Each time one single active DMA channel get access to the wishbone bus using round robin arbiter. The Wishbone bus is granted for the winter channel until its FIFO is not full and the number of sent data is smaller than the burst size.',
|
|
'redefine_param' => 1,
|
|
'type' => 'Spin-button',
|
|
'default' => '1',
|
|
'content' => '1,32,1'
|
|
},
|
|
'SELw' => {
|
|
'info' => 'Parameter',
|
|
'global_param' => 'Parameter',
|
|
'redefine_param' => 1,
|
|
'default' => '4',
|
|
'type' => 'Fixed',
|
|
'content' => ''
|
|
},
|
|
'Dw' => {
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Wishbone bus Data size in bit',
|
|
'redefine_param' => 1,
|
|
'type' => 'Spin-button',
|
|
'default' => '32',
|
|
'content' => '8,1024,8'
|
|
},
|
|
'FIFO_B' => {
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Channel FIFO size in words.
|
|
All channels will share same FPGA block RAM. Hence, the total needed Block RAM words is the multiplication of channel num in channel FIFO size.
|
|
|
|
',
|
|
'content' => '2,4,8,16,32,64,128,256,512,1024,2048',
|
|
'default' => '4',
|
|
'type' => 'Combo-box',
|
|
'redefine_param' => 1
|
|
},
|
|
'MAX_BURST_SIZE' => {
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Maximum burst size in words.
|
|
The wishbone bus will be released each time one burst is completed or when the internal FIFO becomes full. The bus will be released for one clock cycle. Then in case, there are other active channels, another active channel will get access to the bus using round robin arbiter. This process will be continued until all desired data is transferred. ',
|
|
'content' => '2,4,8,16,32,64,128,256,512,1024,2048',
|
|
'redefine_param' => 1,
|
|
'type' => 'Combo-box',
|
|
'default' => '256'
|
|
},
|
|
'DEBUG_EN' => {
|
|
'content' => '',
|
|
'redefine_param' => 1,
|
|
'type' => 'Fixed',
|
|
'default' => '1',
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Parameter'
|
|
},
|
|
'TAGw' => {
|
|
'default' => '3',
|
|
'type' => 'Fixed',
|
|
'redefine_param' => 1,
|
|
'content' => '',
|
|
'info' => 'Parameter',
|
|
'global_param' => 'Parameter'
|
|
},
|
|
'S_Aw' => {
|
|
'info' => 'Parameter',
|
|
'global_param' => 'Parameter',
|
|
'type' => 'Fixed',
|
|
'default' => '8',
|
|
'redefine_param' => 1,
|
|
'content' => ''
|
|
},
|
|
'MAX_TRANSACTION_WIDTH' => {
|
|
'default' => '10',
|
|
'type' => 'Spin-button',
|
|
'redefine_param' => 1,
|
|
'content' => '2,32,1',
|
|
'info' => 'The width of maximum transaction size in words.
|
|
The maximum data that can be sent via one DMA channel will be 2 power of MAX_DMA_TRANSACTION_WIDTH in words.',
|
|
'global_param' => 'Parameter'
|
|
}
|
},
|
},
|
'gui_status' => {
|
'gui_status' => {
|
'status' => 'ideal',
|
'timeout' => 0,
|
'timeout' => 0
|
'status' => 'ideal'
|
},
|
},
|
'ports' => {
|
'ports' => {
|
|
'm_rd_sel_o' => {
|
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'intfc_port' => 'sel_o',
|
|
'range' => 'SELw-1 : 0',
|
|
'type' => 'output'
|
|
},
|
|
'm_rd_stb_o' => {
|
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'intfc_port' => 'stb_o',
|
|
'range' => '',
|
|
'type' => 'output'
|
|
},
|
|
'irq' => {
|
|
'type' => 'output',
|
|
'range' => '',
|
|
'intfc_port' => 'int_o',
|
|
'intfc_name' => 'plug:interrupt_peripheral[0]'
|
|
},
|
|
'm_rd_ack_i' => {
|
|
'range' => '',
|
|
'type' => 'input',
|
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'intfc_port' => 'ack_i'
|
|
},
|
's_cti_i' => {
|
's_cti_i' => {
|
'intfc_name' => 'plug:wb_slave[0]',
|
|
'intfc_port' => 'cti_i',
|
'intfc_port' => 'cti_i',
|
|
'intfc_name' => 'plug:wb_slave[0]',
|
'type' => 'input',
|
'type' => 'input',
|
'range' => 'TAGw-1 : 0'
|
'range' => 'TAGw-1 : 0'
|
},
|
},
|
's_we_i' => {
|
'm_wr_we_o' => {
|
|
'intfc_name' => 'plug:wb_master[1]',
|
|
'intfc_port' => 'we_o',
|
'range' => '',
|
'range' => '',
|
'intfc_port' => 'we_i',
|
'type' => 'output'
|
'type' => 'input',
|
|
'intfc_name' => 'plug:wb_slave[0]'
|
|
},
|
},
|
's_cyc_i' => {
|
'm_rd_cyc_o' => {
|
'range' => '',
|
'range' => '',
|
'intfc_port' => 'cyc_i',
|
'type' => 'output',
|
'type' => 'input',
|
'intfc_name' => 'plug:wb_master[0]',
|
'intfc_name' => 'plug:wb_slave[0]'
|
'intfc_port' => 'cyc_o'
|
},
|
},
|
's_dat_o' => {
|
'm_wr_dat_o' => {
|
'range' => 'Dw-1 : 0',
|
|
'intfc_port' => 'dat_o',
|
'intfc_port' => 'dat_o',
|
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'output',
|
'type' => 'output',
|
'intfc_name' => 'plug:wb_slave[0]'
|
'range' => 'Dw-1 : 0'
|
},
|
},
|
's_addr_i' => {
|
's_cyc_i' => {
|
'range' => 'S_Aw-1 : 0',
|
'range' => '',
|
'intfc_name' => 'plug:wb_slave[0]',
|
|
'type' => 'input',
|
'type' => 'input',
|
'intfc_port' => 'adr_i'
|
'intfc_name' => 'plug:wb_slave[0]',
|
|
'intfc_port' => 'cyc_i'
|
},
|
},
|
'm_wr_cyc_o' => {
|
'm_wr_ack_i' => {
|
'type' => 'output',
|
'range' => '',
|
'intfc_port' => 'cyc_o',
|
'type' => 'input',
|
'intfc_name' => 'plug:wb_master[1]',
|
'intfc_name' => 'plug:wb_master[1]',
|
'range' => ''
|
'intfc_port' => 'ack_i'
|
},
|
},
|
'm_rd_dat_i' => {
|
'clk' => {
|
'range' => 'Dw-1 : 0',
|
'intfc_port' => 'clk_i',
|
|
'intfc_name' => 'plug:clk[0]',
|
'type' => 'input',
|
'type' => 'input',
|
'intfc_port' => 'dat_i',
|
'range' => ''
|
'intfc_name' => 'plug:wb_master[0]'
|
|
},
|
},
|
'm_rd_cti_o' => {
|
'm_rd_cti_o' => {
|
'intfc_name' => 'plug:wb_master[0]',
|
'range' => 'TAGw-1 : 0',
|
'intfc_port' => 'cti_o',
|
|
'type' => 'output',
|
'type' => 'output',
|
'range' => 'TAGw-1 : 0'
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'intfc_port' => 'cti_o'
|
},
|
},
|
's_ack_o' => {
|
's_dat_o' => {
|
'range' => '',
|
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_port' => 'ack_o',
|
'intfc_port' => 'dat_o',
|
|
'range' => 'Dw-1 : 0',
|
'type' => 'output'
|
'type' => 'output'
|
},
|
},
|
'clk' => {
|
's_sel_i' => {
|
'range' => '',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_name' => 'plug:clk[0]',
|
'intfc_port' => 'sel_i',
|
|
'range' => 'SELw-1 : 0',
|
|
'type' => 'input'
|
|
},
|
|
's_we_i' => {
|
'type' => 'input',
|
'type' => 'input',
|
'intfc_port' => 'clk_i'
|
'range' => '',
|
|
'intfc_port' => 'we_i',
|
|
'intfc_name' => 'plug:wb_slave[0]'
|
|
},
|
|
'm_wr_cyc_o' => {
|
|
'intfc_name' => 'plug:wb_master[1]',
|
|
'intfc_port' => 'cyc_o',
|
|
'range' => '',
|
|
'type' => 'output'
|
},
|
},
|
'm_wr_cti_o' => {
|
'm_wr_cti_o' => {
|
'range' => 'TAGw-1 : 0',
|
|
'intfc_name' => 'plug:wb_master[1]',
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'output',
|
'intfc_port' => 'cti_o',
|
'intfc_port' => 'cti_o'
|
'range' => 'TAGw-1 : 0',
|
|
'type' => 'output'
|
},
|
},
|
's_dat_i' => {
|
'reset' => {
|
'range' => 'Dw-1 : 0',
|
'intfc_port' => 'reset_i',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_name' => 'plug:reset[0]',
|
'type' => 'input',
|
'type' => 'input',
|
'intfc_port' => 'dat_i'
|
|
},
|
|
'm_rd_stb_o' => {
|
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'intfc_port' => 'stb_o',
|
|
'type' => 'output',
|
|
'range' => ''
|
'range' => ''
|
},
|
},
|
's_sel_i' => {
|
'm_rd_dat_i' => {
|
'type' => 'input',
|
'type' => 'input',
|
'intfc_port' => 'sel_i',
|
'range' => 'Dw-1 : 0',
|
|
'intfc_port' => 'dat_i',
|
|
'intfc_name' => 'plug:wb_master[0]'
|
|
},
|
|
's_stb_i' => {
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'range' => 'SELw-1 : 0'
|
'intfc_port' => 'stb_i',
|
|
'range' => '',
|
|
'type' => 'input'
|
},
|
},
|
'm_rd_we_o' => {
|
's_addr_i' => {
|
|
'type' => 'input',
|
|
'range' => 'S_Aw-1 : 0',
|
|
'intfc_port' => 'adr_i',
|
|
'intfc_name' => 'plug:wb_slave[0]'
|
|
},
|
|
'm_rd_addr_o' => {
|
|
'range' => 'M_Aw-1 : 0',
|
'type' => 'output',
|
'type' => 'output',
|
'intfc_port' => 'we_o',
|
|
'intfc_name' => 'plug:wb_master[0]',
|
'intfc_name' => 'plug:wb_master[0]',
|
'range' => ''
|
'intfc_port' => 'adr_o'
|
},
|
},
|
'm_wr_dat_o' => {
|
's_dat_i' => {
|
'range' => 'Dw-1 : 0',
|
'range' => 'Dw-1 : 0',
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'input',
|
'type' => 'output',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_port' => 'dat_o'
|
'intfc_port' => 'dat_i'
|
},
|
},
|
'm_wr_stb_o' => {
|
'm_wr_stb_o' => {
|
'intfc_name' => 'plug:wb_master[1]',
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'output',
|
|
'intfc_port' => 'stb_o',
|
'intfc_port' => 'stb_o',
|
'range' => ''
|
|
},
|
|
'reset' => {
|
|
'range' => '',
|
'range' => '',
|
'intfc_name' => 'plug:reset[0]',
|
'type' => 'output'
|
'type' => 'input',
|
|
'intfc_port' => 'reset_i'
|
|
},
|
},
|
'm_wr_addr_o' => {
|
'm_wr_addr_o' => {
|
'range' => 'M_Aw-1 : 0',
|
|
'intfc_port' => 'adr_o',
|
'intfc_port' => 'adr_o',
|
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'output',
|
'type' => 'output',
|
'intfc_name' => 'plug:wb_master[1]'
|
|
},
|
|
'm_rd_addr_o' => {
|
|
'intfc_name' => 'plug:wb_master[0]',
|
|
'type' => 'output',
|
|
'intfc_port' => 'adr_o',
|
|
'range' => 'M_Aw-1 : 0'
|
'range' => 'M_Aw-1 : 0'
|
},
|
},
|
'm_wr_sel_o' => {
|
'm_rd_we_o' => {
|
'range' => 'SELw-1 : 0',
|
|
'intfc_name' => 'plug:wb_master[1]',
|
|
'type' => 'output',
|
'type' => 'output',
|
'intfc_port' => 'sel_o'
|
|
},
|
|
'm_wr_ack_i' => {
|
|
'range' => '',
|
'range' => '',
|
'intfc_port' => 'ack_i',
|
'intfc_port' => 'we_o',
|
'type' => 'input',
|
'intfc_name' => 'plug:wb_master[0]'
|
'intfc_name' => 'plug:wb_master[1]'
|
|
},
|
},
|
's_stb_i' => {
|
's_ack_o' => {
|
|
'intfc_port' => 'ack_o',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_name' => 'plug:wb_slave[0]',
|
'intfc_port' => 'stb_i',
|
'type' => 'output',
|
'type' => 'input',
|
|
'range' => ''
|
'range' => ''
|
},
|
},
|
'm_wr_we_o' => {
|
'm_wr_sel_o' => {
|
'range' => '',
|
|
'intfc_name' => 'plug:wb_master[1]',
|
'intfc_name' => 'plug:wb_master[1]',
|
'type' => 'output',
|
|
'intfc_port' => 'we_o'
|
|
},
|
|
'm_rd_cyc_o' => {
|
|
'range' => '',
|
|
'intfc_port' => 'cyc_o',
|
|
'type' => 'output',
|
|
'intfc_name' => 'plug:wb_master[0]'
|
|
},
|
|
'm_rd_sel_o' => {
|
|
'range' => 'SELw-1 : 0',
|
|
'intfc_port' => 'sel_o',
|
'intfc_port' => 'sel_o',
|
'type' => 'output',
|
'range' => 'SELw-1 : 0',
|
'intfc_name' => 'plug:wb_master[0]'
|
'type' => 'output'
|
},
|
|
'irq' => {
|
|
'type' => 'output',
|
|
'intfc_port' => 'int_o',
|
|
'intfc_name' => 'plug:interrupt_peripheral[0]',
|
|
'range' => ''
|
|
},
|
|
'm_rd_ack_i' => {
|
|
'range' => '',
|
|
'type' => 'input',
|
|
'intfc_port' => 'ack_i',
|
|
'intfc_name' => 'plug:wb_master[0]'
|
|
}
|
|
},
|
|
'parameters' => {
|
|
'DEBUG_EN' => {
|
|
'info' => 'Parameter',
|
|
'content' => '',
|
|
'type' => 'Fixed',
|
|
'deafult' => '1',
|
|
'global_param' => 'Parameter',
|
|
'redefine_param' => 1
|
|
},
|
|
'MAX_BURST_SIZE' => {
|
|
'redefine_param' => 1,
|
|
'type' => 'Combo-box',
|
|
'content' => '\'2,4,8,16,32,64,128,256,512,1024,2048\'',
|
|
'info' => 'Maximum burst size in words.
|
|
The wishbone bus will be released each time one burst is completed or when the internal FIFO becomes full. The bus will be released for one clock cycle. Then in case, there are other active channels, another active channel will get access to the bus using round robin arbiter. This process will be continued until all desired data is transferred. ',
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '256'
|
|
},
|
|
'MAX_TRANSACTION_WIDTH' => {
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '10',
|
|
'content' => '2,32,1',
|
|
'info' => 'The width of maximum transaction size in words.
|
|
The maximum data that can be sent via one DMA channel will be 2 power of MAX_DMA_TRANSACTION_WIDTH in words.',
|
|
'type' => 'Spin-button',
|
|
'redefine_param' => 1
|
|
},
|
|
'FIFO_B' => {
|
|
'redefine_param' => 1,
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '4',
|
|
'info' => 'Channel FIFO size in words.
|
|
All channels will share same FPGA block RAM. Hence, the total needed Block RAM words is the multiplication of channel num in channel FIFO size.
|
|
|
|
',
|
|
'content' => '\'2,4,8,16,32,64,128,256,512,1024,2048\'',
|
|
'type' => 'Combo-box'
|
|
},
|
|
'Dw' => {
|
|
'redefine_param' => 1,
|
|
'deafult' => '32',
|
|
'global_param' => 'Parameter',
|
|
'info' => 'Wishbone bus Data size in bit',
|
|
'content' => '8,1024,8',
|
|
'type' => 'Spin-button'
|
|
},
|
|
'TAGw' => {
|
|
'redefine_param' => 1,
|
|
'content' => '',
|
|
'info' => 'Parameter',
|
|
'type' => 'Fixed',
|
|
'deafult' => '3',
|
|
'global_param' => 'Parameter'
|
|
},
|
|
'M_Aw' => {
|
|
'type' => 'Fixed',
|
|
'info' => 'Parameter',
|
|
'content' => '',
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '32',
|
|
'redefine_param' => 1
|
|
},
|
|
'CHANNEL' => {
|
|
'redefine_param' => 1,
|
|
'info' => 'Number of DMA channels.
|
|
In case there are multiple active DMA channels, Each time one single active DMA channel get access to the wishbone bus using round robin arbiter. The Wishbone bus is granted for the winter channel until its FIFO is not full and the number od sent data is smaller than the burst size.',
|
|
'content' => '1,32,1',
|
|
'type' => 'Spin-button',
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '1'
|
|
},
|
|
'S_Aw' => {
|
|
'redefine_param' => 1,
|
|
'content' => '',
|
|
'info' => 'Parameter',
|
|
'type' => 'Fixed',
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '8'
|
|
},
|
|
'SELw' => {
|
|
'type' => 'Fixed',
|
|
'content' => '',
|
|
'info' => 'Parameter',
|
|
'global_param' => 'Parameter',
|
|
'deafult' => '4',
|
|
'redefine_param' => 1
|
|
}
|
|
},
|
|
'plugs' => {
|
|
'clk' => {
|
|
'clk' => {},
|
|
'type' => 'num',
|
|
'0' => {
|
|
'name' => 'clk'
|
|
},
|
|
'value' => 1
|
|
},
|
|
'wb_master' => {
|
|
'value' => 2,
|
|
'0' => {
|
|
'name' => 'wb_rd'
|
|
},
|
|
'1' => {
|
|
'name' => 'wb_wr'
|
|
},
|
|
'wb_master' => {},
|
|
'type' => 'num'
|
|
},
|
|
'interrupt_peripheral' => {
|
|
'type' => 'num',
|
|
'interrupt_peripheral' => {},
|
|
'0' => {
|
|
'name' => 'interrupt_peripheral'
|
|
},
|
|
'value' => 1
|
|
},
|
|
'wb_slave' => {
|
|
'type' => 'num',
|
|
'value' => 1,
|
|
'wb_slave' => {},
|
|
'0' => {
|
|
'addr' => '0x9300_0000 0x93ff_ffff Memory Controller',
|
|
'name' => 'wb_slave',
|
|
'width' => 10
|
|
}
|
|
},
|
|
'reset' => {
|
|
'0' => {
|
|
'name' => 'reset'
|
|
},
|
|
'value' => 1,
|
|
'reset' => {},
|
|
'type' => 'num'
|
|
}
|
}
|
},
|
},
|
'description' => 'A round robin based multi channel DMA (no byte enable). support burst data transaction.',
|
|
'ip_name' => 'dma',
|
|
'file_name' => '/home/alireza/mywork/mpsoc/src_peripheral/DMA/dma_multi_channel_wb.v',
|
|
'category' => 'DMA',
|
|
'system_h' => '#define ${IP}_STATUS_REG (*((volatile unsigned int *) ($BASE)))
|
'system_h' => '#define ${IP}_STATUS_REG (*((volatile unsigned int *) ($BASE)))
|
#define ${IP}_BURST_SIZE_ADDR_REG (*((volatile unsigned int *) ($BASE+4)))
|
#define ${IP}_BURST_SIZE_ADDR_REG (*((volatile unsigned int *) ($BASE+4)))
|
|
|
|
|
#define ${IP}_CHANNEL ${CHANNEL}
|
#define ${IP}_CHANNEL ${CHANNEL}
|
Line 422... |
Line 401... |
void ${IP}_transfer (unsigned int channel, unsigned int read_start_addr, unsigned int data_size, unsigned int write_start_addr){
|
void ${IP}_transfer (unsigned int channel, unsigned int read_start_addr, unsigned int data_size, unsigned int write_start_addr){
|
while ( ${IP}_channel_is_busy(channel)); // wait until DMA channel is busy
|
while ( ${IP}_channel_is_busy(channel)); // wait until DMA channel is busy
|
${IP}_RD_START_ADDR_REG(channel) = read_start_addr;
|
${IP}_RD_START_ADDR_REG(channel) = read_start_addr;
|
${IP}_DATA_SIZE_ADDR_REG(channel) = data_size;
|
${IP}_DATA_SIZE_ADDR_REG(channel) = data_size;
|
${IP}_WR_START_ADDR_REG(channel) = write_start_addr;
|
${IP}_WR_START_ADDR_REG(channel) = write_start_addr;
|
}'
|
}',
|
|
'description_pdf' => '/mpsoc/src_peripheral/DMA/DMA.pdf',
|
|
'unused' => {
|
|
'plug:wb_slave[0]' => [
|
|
'rty_o',
|
|
'bte_i',
|
|
'err_o',
|
|
'tag_i'
|
|
],
|
|
'plug:wb_master[0]' => [
|
|
'err_i',
|
|
'dat_o',
|
|
'rty_i',
|
|
'bte_o',
|
|
'tag_o'
|
|
],
|
|
'plug:wb_master[1]' => [
|
|
'err_i',
|
|
'dat_i',
|
|
'rty_i',
|
|
'bte_o',
|
|
'tag_o'
|
|
]
|
|
}
|
}, 'ip_gen' );
|
}, 'ip_gen' );
|