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

File last commit:

r467:10ba15a05d8c (LFR-EM) WFP_MS-1-1-35 JC
r682:c53e1b6b3045 default
Show More
DMA_SubSystem_MUX.vhd
118 lines | 4.2 KiB | text/x-vhdl | VhdlLexer
/ lib / lpp / lpp_dma / DMA_SubSystem_MUX.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY lpp;
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_MUX IS
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 DMA_SubSystem_MUX;
ARCHITECTURE beh OF DMA_SubSystem_MUX IS
SIGNAL channel_ongoing : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL one_grant : STD_LOGIC;
SIGNAL more_than_one_grant : STD_LOGIC;
BEGIN
one_grant <= '0' WHEN fifo_grant = "00000" ELSE '1';
more_than_one_grant <= '0' WHEN fifo_grant = "00000" OR
fifo_grant = "00001" OR
fifo_grant = "00010" OR
fifo_grant = "00100" OR
fifo_grant = "01000" OR
fifo_grant = "10000" ELSE '1';
PROCESS (clk, rstn)
BEGIN -- PROCESS
IF rstn = '0' THEN -- asynchronous reset (active low)
channel_ongoing <= (OTHERS => '0');
fifo_burst_done <= (OTHERS => '0');
dma_send <= '0';
dma_valid_burst <= '0';
grant_error <= '0';
ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
grant_error <= '0';
IF run = '1' THEN
IF dma_done = '1' THEN
fifo_burst_done <= channel_ongoing;
ELSE
fifo_burst_done <= (OTHERS => '0');
END IF;
IF channel_ongoing = "00000" OR dma_done = '1' THEN
channel_ongoing <= fifo_grant;
grant_error <= more_than_one_grant;
dma_valid_burst <= one_grant;
dma_send <= one_grant;
ELSE
dma_send <= '0';
END IF;
ELSE
channel_ongoing <= (OTHERS => '0');
fifo_burst_done <= (OTHERS => '0');
dma_send <= '0';
dma_valid_burst <= '0';
END IF;
END IF;
END PROCESS;
-------------------------------------------------------------------------
all_channel : FOR I IN 4 DOWNTO 0 GENERATE
fifo_ren(I) <= dma_ren WHEN channel_ongoing(I) = '1' ELSE '1';
END GENERATE all_channel;
dma_data <= fifo_data(32*1-1 DOWNTO 32*0) WHEN channel_ongoing(0) = '1' ELSE
fifo_data(32*2-1 DOWNTO 32*1) WHEN channel_ongoing(1) = '1' ELSE
fifo_data(32*3-1 DOWNTO 32*2) WHEN channel_ongoing(2) = '1' ELSE
fifo_data(32*4-1 DOWNTO 32*3) WHEN channel_ongoing(3) = '1' ELSE
fifo_data(32*5-1 DOWNTO 32*4); --WHEN channel_ongoing(4) = '1' ELSE
dma_address <= fifo_address(32*1-1 DOWNTO 32*0) WHEN channel_ongoing(0) = '1' ELSE
fifo_address(32*2-1 DOWNTO 32*1) WHEN channel_ongoing(1) = '1' ELSE
fifo_address(32*3-1 DOWNTO 32*2) WHEN channel_ongoing(2) = '1' ELSE
fifo_address(32*4-1 DOWNTO 32*3) WHEN channel_ongoing(3) = '1' ELSE
fifo_address(32*5-1 DOWNTO 32*4); --WHEN channel_ongoing(4) = '1' ELSE
END beh;