##// END OF EJS Templates
Few fixes....
Few fixes. Whole LFR simulation WIP.

File last commit:

r611:ec07182522e1 simu_with_Leon3
r682:c53e1b6b3045 default
Show More
DMA_SubSystem.vhd
240 lines | 8.4 KiB | text/x-vhdl | VhdlLexer
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY lpp;
USE lpp.apb_devices_list.ALL;
USE lpp.lpp_ad_conv.ALL;
USE lpp.iir_filter.ALL;
USE lpp.FILTERcfg.ALL;
USE lpp.lpp_memory.ALL;
--USE lpp.lpp_waveform_pkg.ALL;
USE lpp.lpp_dma_pkg.ALL;
--USE lpp.lpp_top_lfr_pkg.ALL;
--USE lpp.lpp_lfr_pkg.ALL;
USE lpp.general_purpose.ALL;
LIBRARY techmap;
USE techmap.gencomp.ALL;
LIBRARY grlib;
USE grlib.amba.ALL;
USE grlib.stdlib.ALL;
USE grlib.devices.ALL;
USE GRLIB.DMA2AHB_Package.ALL;
ENTITY DMA_SubSystem IS
GENERIC (
hindex : INTEGER := 2;
CUSTOM_DMA : INTEGER := 1);
PORT (
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
run : IN STD_LOGIC;
-- AHB
ahbi : IN AHB_Mst_In_Type;
ahbo : OUT AHB_Mst_Out_Type;
---------------------------------------------------------------------------
fifo_burst_valid : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
fifo_data : IN STD_LOGIC_VECTOR(32*5-1 DOWNTO 0);
fifo_ren : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
---------------------------------------------------------------------------
buffer_new : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
buffer_addr : IN STD_LOGIC_VECTOR(32*5-1 DOWNTO 0);
buffer_length : IN STD_LOGIC_VECTOR(26*5-1 DOWNTO 0);
buffer_full : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
buffer_full_err : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
---------------------------------------------------------------------------
grant_error : OUT STD_LOGIC;
---------------------------------------------------------------------------
debug_vector : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
);
END DMA_SubSystem;
ARCHITECTURE beh OF DMA_SubSystem IS
COMPONENT DMA_SubSystem_GestionBuffer
GENERIC (
BUFFER_ADDR_SIZE : INTEGER;
BUFFER_LENGTH_SIZE : INTEGER);
PORT (
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
-- run : IN STD_LOGIC;
buffer_new : IN STD_LOGIC;
buffer_addr : IN STD_LOGIC_VECTOR(BUFFER_ADDR_SIZE-1 DOWNTO 0);
buffer_length : IN STD_LOGIC_VECTOR(BUFFER_LENGTH_SIZE-1 DOWNTO 0);
buffer_full : OUT STD_LOGIC;
buffer_full_err : OUT STD_LOGIC;
burst_send : IN STD_LOGIC;
burst_addr : OUT STD_LOGIC_VECTOR(BUFFER_ADDR_SIZE-1 DOWNTO 0));
END COMPONENT;
COMPONENT DMA_SubSystem_Arbiter
PORT (
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
run : IN STD_LOGIC;
data_burst_valid : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
data_burst_valid_grant : OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END COMPONENT;
COMPONENT DMA_SubSystem_MUX
PORT (
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
run : IN STD_LOGIC;
fifo_grant : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
fifo_data : IN STD_LOGIC_VECTOR(32*5-1 DOWNTO 0);
fifo_address : IN STD_LOGIC_VECTOR(32*5-1 DOWNTO 0);
fifo_ren : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
fifo_burst_done : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
dma_send : OUT STD_LOGIC;
dma_valid_burst : OUT STD_LOGIC;
dma_address : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
dma_data : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
dma_ren : IN STD_LOGIC;
dma_done : IN STD_LOGIC;
grant_error : OUT STD_LOGIC);
END COMPONENT;
-----------------------------------------------------------------------------
SIGNAL dma_send : STD_LOGIC;
SIGNAL dma_valid_burst : STD_LOGIC; -- (1 => BURST , 0 => SINGLE)
SIGNAL dma_done : STD_LOGIC;
SIGNAL dma_ren : STD_LOGIC;
SIGNAL dma_address : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL dma_data : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL burst_send : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL fifo_grant : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL fifo_address : STD_LOGIC_VECTOR(32*5-1 DOWNTO 0); --
SIGNAL ahbo_s : AHB_Mst_Out_Type;
SIGNAL fifo_ren_s : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN -- beh
debug_vector <= fifo_ren_s(0) &
dma_data(1 DOWNTO 0) &
ahbi.HREADY &
ahbo_s.HWDATA(1 DOWNTO 0) &
ahbi.HGRANT(hindex) &
ahbo_s.HTRANS(0) &
ahbo_s.HLOCK;
ahbo <= ahbo_s;
fifo_ren <= fifo_ren_s;
-----------------------------------------------------------------------------
-- DMA
-----------------------------------------------------------------------------
GR_DMA : IF CUSTOM_DMA = 0 GENERATE
lpp_dma_singleOrBurst_1 : lpp_dma_singleOrBurst
GENERIC MAP (
tech => inferred,
hindex => hindex)
PORT MAP (
HCLK => clk,
HRESETn => rstn,
run => run,
AHB_Master_In => ahbi,
AHB_Master_Out => ahbo_s,
send => dma_send,
valid_burst => dma_valid_burst,
done => dma_done,
ren => dma_ren,
address => dma_address,
data => dma_data);
END GENERATE GR_DMA;
LPP_DMA_IP : IF CUSTOM_DMA = 1 GENERATE
lpp_dma_SEND16B_FIFO2DMA_1 : lpp_dma_SEND16B_FIFO2DMA
GENERIC MAP (
hindex => hindex,
vendorid => VENDOR_LPP,
deviceid => 10,
version => 0)
PORT MAP (
clk => clk,
rstn => rstn,
AHB_Master_In => ahbi,
AHB_Master_Out => ahbo_s,
ren => dma_ren,
data => dma_data,
send => dma_send,
valid_burst => dma_valid_burst,
done => dma_done,
address => dma_address);
END GENERATE LPP_DMA_IP;
-----------------------------------------------------------------------------
-- RoundRobin Selection Channel For DMA
-----------------------------------------------------------------------------
DMA_SubSystem_Arbiter_1: DMA_SubSystem_Arbiter
PORT MAP (
clk => clk,
rstn => rstn,
run => run,
data_burst_valid => fifo_burst_valid,
data_burst_valid_grant => fifo_grant);
-----------------------------------------------------------------------------
-- Mux between the channel from Waveform Picker and Spectral Matrix
-----------------------------------------------------------------------------
DMA_SubSystem_MUX_1: DMA_SubSystem_MUX
PORT MAP (
clk => clk,
rstn => rstn,
run => run,
fifo_grant => fifo_grant,
fifo_data => fifo_data,
fifo_address => fifo_address,
fifo_ren => fifo_ren_s,
fifo_burst_done => burst_send,
dma_send => dma_send,
dma_valid_burst => dma_valid_burst,
dma_address => dma_address,
dma_data => dma_data,
dma_ren => dma_ren,
dma_done => dma_done,
grant_error => grant_error);
-----------------------------------------------------------------------------
-- GEN ADDR
-----------------------------------------------------------------------------
all_buffer : FOR I IN 4 DOWNTO 0 GENERATE
DMA_SubSystem_GestionBuffer_I : DMA_SubSystem_GestionBuffer
GENERIC MAP (
BUFFER_ADDR_SIZE => 32,
BUFFER_LENGTH_SIZE => 26)
PORT MAP (
clk => clk,
rstn => rstn,
-- run => run,
buffer_new => buffer_new(I),
buffer_addr => buffer_addr(32*(I+1)-1 DOWNTO I*32),
buffer_length => buffer_length(26*(I+1)-1 DOWNTO I*26),
buffer_full => buffer_full(I),
buffer_full_err => buffer_full_err(I),
burst_send => burst_send(I),
burst_addr => fifo_address(32*(I+1)-1 DOWNTO 32*I)
);
END GENERATE all_buffer;
END beh;