J
janlee
Guest
Nel mio progetto ho utilizzo PCI9054 "C Mode" per il controllo FPGA e altri peripherals.Acturally atti PCI9054 come master bus locali e di destinazione PCI.
I realizzare con successo il ciclo di segnale di 32 bits read & write.But è abbastanza lento, l'intervallo tra due continuo né leggere né scrivere è superiore a 12 us.To registro di controllo nel FPGA non è un problema, ma per trasferire grande blocco di dati in in tempo reale non è accecptable.
Ora la mia domanda è come configurare il PCI9054 a lanch un trasferimento burst via funcions PLX's (mi chiedo che funzione posso usare), e come modificare il mio codice, ad adeguare il trasferimento.
Molti apprezzamenti.
Codice:---------------------------------------------
- Modulo: Modulo di interfaccia PCI9054
- File: PCI9054_IF.vhd
- Biblioteca: IEEE;
- Descrizione: Controller Interface PCI9054
- Simulator: Modelsim 5.8/WindowsXP
- Sintetizzatore:
- Autore:
- Creato: 06/07/2006
- Ultimo aggiornamento: 25/07/2006
---------------------------------------------library IEEE;
uso IEEE.std_logic_1164.ali;
uso ieee.std_logic_unsigned.all;
uso ieee.std_logic_arith.all;entità PCI9054_IF è
port (
RST_N: in std_logic;
LCLK: in std_logic;
LHOLD: in std_logic;
ADS_N: in std_logic;
BLAST_N: in std_logic;
LWDRD_N: in std_logic;
LA: in std_logic_vector (31 downto 2);
LD: inout std_logic_vector (31 downto 0);
LHOLDA: out std_logic;
READY_N: out std_logic;
ACK_n: in std_logic;
WR_n: out std_logic;
RD_n: out std_logic);
fine PCI9054_IF;architettura di RTL PCI9054_IF è
state_type tipo è (IDLE, START, WAITSTATE, last);
current_state segnale, next_state: state_type;
iready_n segnale: std_logic;iwr_n segnale, ird_n: std_logic;
iaddr segnale: std_logic_vector (31 downto 2);iniziare--
- Concessione per la richiesta di bus locali
processo (LCLK)
iniziare
if (LCLK'event e LCLK = '1 ') then
se LHOLD = '1 'then
LHOLDA <= LHOLD;
altro
LHOLDA <= '0 ';
end if;
end if;
end process;- Macchina a stati di transizione
processo (LCLK)
iniziare
se RST_n = '0 'then
Current_state <= IDLE;
elsif (LCLK'event e LCLK = '1 ') then
Current_state <= next_state;se current_state = IDLE e ADS_N = '0 'then
iaddr <= LA;
end if;READY_n <= iready_n;end if;
end process;- State Machine
processo (current_state, ADS_N, LWDRD_N, BLAST_N, ACK_n)
iniziare
Next_state <= current_state;
current_state caso è
quando IDLE =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se ADS_N = '0 'then
Next_state <= START;
altro
Next_state <= IDLE;
end if;quando START =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se BLAST_N = '0 'then
Next_state <= WAITSTATE;
altro
Next_state <= START;
end if;quando WAITSTATE =>
RD_n <= LWDRD_N;
WR_n <= non LWDRD_N;if (iaddr 31 downto 4) = B "0010_0000_0000_0000_1001_0000_0000", quindi
se ACK_n = '0 'then
Next_state <= last;
iready_n <= '0 ';
altro
Next_state <= WAITSTATE;
iready_n <= '1 ';
end if;
altro
Next_state <= last;
iready_n <= '0 ';
end if;L'ultima volta =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se ADS_N = '1 'e BLAST_N = '1' then
Next_state <= IDLE;
elsif ADS_N = '0 'then
Next_state <= START;
altro
Next_state <= last;
end if;when others =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
Next_state <= IDLE;
end case;
end process;end RTL;
I realizzare con successo il ciclo di segnale di 32 bits read & write.But è abbastanza lento, l'intervallo tra due continuo né leggere né scrivere è superiore a 12 us.To registro di controllo nel FPGA non è un problema, ma per trasferire grande blocco di dati in in tempo reale non è accecptable.
Ora la mia domanda è come configurare il PCI9054 a lanch un trasferimento burst via funcions PLX's (mi chiedo che funzione posso usare), e come modificare il mio codice, ad adeguare il trasferimento.
Molti apprezzamenti.
Codice:---------------------------------------------
- Modulo: Modulo di interfaccia PCI9054
- File: PCI9054_IF.vhd
- Biblioteca: IEEE;
- Descrizione: Controller Interface PCI9054
- Simulator: Modelsim 5.8/WindowsXP
- Sintetizzatore:
- Autore:
- Creato: 06/07/2006
- Ultimo aggiornamento: 25/07/2006
---------------------------------------------library IEEE;
uso IEEE.std_logic_1164.ali;
uso ieee.std_logic_unsigned.all;
uso ieee.std_logic_arith.all;entità PCI9054_IF è
port (
RST_N: in std_logic;
LCLK: in std_logic;
LHOLD: in std_logic;
ADS_N: in std_logic;
BLAST_N: in std_logic;
LWDRD_N: in std_logic;
LA: in std_logic_vector (31 downto 2);
LD: inout std_logic_vector (31 downto 0);
LHOLDA: out std_logic;
READY_N: out std_logic;
ACK_n: in std_logic;
WR_n: out std_logic;
RD_n: out std_logic);
fine PCI9054_IF;architettura di RTL PCI9054_IF è
state_type tipo è (IDLE, START, WAITSTATE, last);
current_state segnale, next_state: state_type;
iready_n segnale: std_logic;iwr_n segnale, ird_n: std_logic;
iaddr segnale: std_logic_vector (31 downto 2);iniziare--
- Concessione per la richiesta di bus locali
processo (LCLK)
iniziare
if (LCLK'event e LCLK = '1 ') then
se LHOLD = '1 'then
LHOLDA <= LHOLD;
altro
LHOLDA <= '0 ';
end if;
end if;
end process;- Macchina a stati di transizione
processo (LCLK)
iniziare
se RST_n = '0 'then
Current_state <= IDLE;
elsif (LCLK'event e LCLK = '1 ') then
Current_state <= next_state;se current_state = IDLE e ADS_N = '0 'then
iaddr <= LA;
end if;READY_n <= iready_n;end if;
end process;- State Machine
processo (current_state, ADS_N, LWDRD_N, BLAST_N, ACK_n)
iniziare
Next_state <= current_state;
current_state caso è
quando IDLE =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se ADS_N = '0 'then
Next_state <= START;
altro
Next_state <= IDLE;
end if;quando START =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se BLAST_N = '0 'then
Next_state <= WAITSTATE;
altro
Next_state <= START;
end if;quando WAITSTATE =>
RD_n <= LWDRD_N;
WR_n <= non LWDRD_N;if (iaddr 31 downto 4) = B "0010_0000_0000_0000_1001_0000_0000", quindi
se ACK_n = '0 'then
Next_state <= last;
iready_n <= '0 ';
altro
Next_state <= WAITSTATE;
iready_n <= '1 ';
end if;
altro
Next_state <= last;
iready_n <= '0 ';
end if;L'ultima volta =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
se ADS_N = '1 'e BLAST_N = '1' then
Next_state <= IDLE;
elsif ADS_N = '0 'then
Next_state <= START;
altro
Next_state <= last;
end if;when others =>
RD_n <= '1 ';
WR_n <= '1 ';
iready_n <= '1 ';
Next_state <= IDLE;
end case;
end process;end RTL;