Dieser Entwurf implementiert ein PCI-Target ohne Burstunterstützung, das ein 4 KByte (1 K x 32 Bit) großes RAM über den PCI-Bus ansteuert. Der PCI Schnittstellenteil ist praktisch identisch mit dem "Board-Test"-Entwurf und wird daher an dieser Stelle nicht nochmals beschrieben.
Das PCI-Target belegt einen 4 KByte umfassenden Speicherbereich. Außerdem erfüllt das RAM die Prefetch-Bedingungen. Ansonsten ist die Konfiguration identisch mit der des Projektes "Board-Test".
[...]
--------------------------------------------------------------
-- Configure Base Address Registers
--------------------------------------------------------------
-- BAR0 : 4 KByte prefetchable memory space
cfg_int(0) <= ENABLE ;
cfg_int(32 downto 1) <= SIZE4K ;
cfg_int(33) <= PREFETCH ; -- Hier nun das Prefetch-Attribut gesetzt!
cfg_int(35 downto 34) <= TYPE00 ;
cfg_int(36) <= MEMORY ;
[...]
-- Primitiv aus der Xilinx-Bibliothek
entity RAMB4_S4 is
[...]
port (
ADDR : in std_logic_vector(9 downto 0); -- Adresse
CLK : in std_logic; -- Takt
DI : in std_logic_vector(4 downto 0); -- Dateneingang
EN : in std_logic; -- RAM Enable (Chip Select)
RST : in std_logic; -- Reset (Initialisierung des Speichers)
WE : in std_logic; -- Write Enable
DO : out std_logic_vector(4 downto 0) -- Datenausgang
);
end RAMB4_S4;
Bei der Implementierung wird es auf genau eines der 14 Block RAMs im Spartan-II abgebildet. Ausführliche Erklärungen zu den Block RAMs des Spartan-II befinden sich in der Spartan-II Dokumentation (Functional Description). Hier nur die wesentlichen Stichpunkte:
Als VHDL-Code für das bram_1k_32b Modul ergibt sich damit (gekürzt):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Einbinden der Xilinx Bibliothek
library UNISIM;
use UNISIM.Vcomponents.ALL;
entity bram_1k_32b is
port (
ADDR : in std_logic_vector(9 downto 0); -- Adresse
CLK : in std_logic; -- Takt
DIO : inout std_logic_vector(31 downto 0); -- bidirektionaler Datenbus (Tristate)
OE : in std_logic; -- Output Enable
RST : in std_logic; -- Reset (Initialisierung des RAMs)
WE : in std_logic -- Write Signal
);
end bram_1k_32b;
architecture rtl of bram_1k_32b is
constant LOGIC_1 : std_logic := '1';
-- Datenausgaenge der Block RAMs
signal dout : std_logic_vector(31 downto 0);
begin
-- Daten auf den Bus, wenn OE = '1' und WE = '0' (lesen)
DIO <= dout when OE = '1' and WE = '0' else (others => 'Z');
-- Block RAM fuer die Datenbits 0 - 3
blockram_inst0 : RAMB4_S4
port map (
ADDR => ADDR(9 downto 0),
CLK => CLK,
DI => DIO(3 downto 0),
EN => LOGIC_1,
RST => RST,
WE => WE,
DO => dout(3 downto 0)
);
-- Block RAM fuer die Datenbits 7 - 4
blockram_inst1 : RAMB4_S4
port map (
ADDR => ADDR(9 downto 0),
CLK => CLK,
DI => DIO(7 downto 4),
EN => LOGIC_1,
RST => RST,
WE => WE,
DO => dout(7 downto 4)
);
[...]
-- Block RAM fuer die Datenbits 31 - 28
blockram_inst7 : RAMB4_S4
port map (
ADDR => ADDR(9 downto 0),
CLK => CLK,
DI => DIO(31 downto 28),
EN => LOGIC_1,
RST => RST,
WE => WE,
DO => dout(31 downto 28)
);
end rtl;
Die Datei bram_1k_32b.vhd wird dem Projekt hinzugefügt.