Documente Academic
Documente Profesional
Documente Cultură
library work;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use work.components.all;
entity is
Port (
clk: in std_logic;
-- clock
rstn: in std_logic;
-- reset
start: in std_logic;
-- trigger state machine
dati: in std_logic_vector(31 downto 0); -- data input
adr: in std_logic_vector(7 downto 0);  -- address of the dma
register
reg_wen: in std_logic;
-- dma register write enable
fifo_wen: in std_logic;
-- dma fifo write enable
wr_rdn: in std_logic;
-- write/read signal to dma registers
cs: in std_logic;
-- chip select (dma_register)
bcr_cnten: in std_logic;
-- byte counter count enable
acr_cnten: in std_logic;
-- address counter count enable
lar_cnten: in std_logic;
-- local address counter count
enable
p2s_fifo_empty: in std_logic;
-- high and low p2s both empty
s2p_fifo_usedw: in std_logic_vector(6 downto 0);
mstr_busy: in std_logic;
stop: in std_logic;
-- PCI core signals stop current dma
abort: in std_logic;
-- PCI core signals abort current dma
last_xfr: in std_logic;
-- PCI core signals last transfer
local_busy: in std_logic;
-- sdram is busy
err_pend: in std_logic;
-- target abort, parity error, master
abort
lm_tsr: in std_logic_vector(9 downto 0);  -- master status
std_logics
isr_rd: in std_logic;
-- isr read signal
isr: out std_logic_vector(5 downto 0);
csr: out std_logic_vector(8 downto 0);
bcr: out std_logic_vector(16 downto 0);
acr: out std_logic_vector(31 downto 0);
lar: out std_logic_vector(25 downto 0);
req: out std_logic;
-- dma requesting a PCI core for data
transfer
local_start: out std_logic;
-- dma requesting sdram controller
to start data transfer
dato: out std_logic_vector(31 downto 0);  -- dma register read
data output
probe: out std_logic_vector(7 downto 0));
end dma;
architecture rtl of dma is
signal normal_termination: std_logic;
signal start_chain: std_logic;
signal chain_end: std_logic;
signal dma_bcr: std_logic_vector(16 downto 0);
signal dma_csr: std_logic_vector(8 downto 0);
signal dma_done: std_logic;
signal dma_error: std_logic;
signal chain_acr_ld: std_logic;
signal chain_bcr_ld: std_logic;
signal dma_fifo_rd: std_logic;
signal trans64: std_logic;
signal isr_in: std_logic_vector(5 downto 0);
signal dma_on: std_logic;
signal dma_acr: std_logic_vector(31 downto 0);
signal dma_isr: std_logic_vector(5 downto 0);
signal dma_lar: std_logic_vector(25 downto 0);
signal dma_fifo_dato: std_logic_vector(31 downto 0);
signal soft_flush: std_logic;
signal dma_reg_dati: std_logic_vector(31 downto 0);
signal reg_dat_sel: std_logic;
signal direction: std_logic;
signal acr_wr: std_logic;
signal csr_wr: std_logic;
signal csr_wr_reg: std_logic;
signal int_irq: std_logic;
signal local_irq: std_logic;
signal rst: std_logic;
signal req_int: std_logic;
signal high: std_logic;
signal dma_reg_hit: std_logic_vector(4 downto 0);
begin
 high <= '1';
 rst<= not rstn;
 soft_flush <= dma_csr(1);
 -- flush std_logic of the control status
register
 start_chain <= dma_isr(5);
 -- DMA chaining mode enable
 direction <= dma_csr(3);
 -- 1 for write, 0 for read
-- interrupt pending std_logic
 isr_in(0)<= err_pend or int_irq or (dma_isr(3) and not dma_csr(5));
 int_irq
<= local_irq;
-- assert local irq when there is error pending or DMA has completed local_irq<=
dma_isr(1) or (dma_isr(3) and not dma_csr(5)); isr_in(1) <= err_pend;
 isr_in(2) <= int_irq;
-- generate transfer complete status std_logic 3
 process(dma_done, isr_rd, csr_wr, acr_wr, dma_isr)-- dma_tc
begin
 if(dma_done = '1') then
isr_in(3) <= '1';
 elsif(isr_rd = '1' or csr_wr = '1' or acr_wr = '1') then
isr_in(3) <= '0';
 else
isr_in(3) <= dma_isr(3);
 end if;
end process;
-- write signal to the address counter
 acr_wr <= dma_reg_hit(1) and cs and reg_wen;
-- generate ad_loaded singal for the isr std_logic 4
 process(acr_wr, dma_isr, soft_flush, dma_done, dma_error)
begin
 if(acr_wr = '1') then
isr_in(4) <= '1';
 elsif(dma_isr(3) = '1' or soft_flush = '1' or dma_done = '1' or dma_error =
'1') then