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.