---------------------------------------------------------------
-- B O R I S . V
-- $Id: boris.v,v 1.4 1995/04/25 07:42:18 sharring Exp $
-- Scott Harrington
-- Duke EE Project Spring/Fall 1994
-- Address Tracing System
-- Boris: Buffer Module FPGA
--
-- Each of the four identical Buffer Modules (Boris) handle a
-- 16-bit wide path and consist of this central FPGA, an
-- integrated interface (Natasha) to two 32kx8 bit SRAMs, and
-- several support buffers/drivers/latches. The Recording
-- Subsystem (Bullwinkle) consists of the Buffer Modules
-- (Boris), control PLDs, and other bus and configuration
-- logic for the FPGAs.
----------------------------------------------------------------
-----------------------
-- I/O descriptions: --
-----------------------
-- Clk: FPGA clock (period > half SRAM access time)
-- Data: 16 bit wide data stream from either local or remote PC
-- Mem: 16 bit wide data path (bidir) to/from SRAM
-- Addr: 15 bit address lines to SRAM
-- SRAM_WE: active low SRAM write enable
-- SRAM_CE: active low SRAM chip enable
-- SRAM_OE: active low SRAM output enable
-- Almost_Full: signals Bullwinkle PLDs to trigger a SRQ (stall request)
-- Full: has equivalent effect of SACK from Rocky; do extract
-- Chip_Select: decoded host address specifies this FPGA (of the 4)
-- Extract: selects extract/record mode of Bullwinkle
-- Trigger: edge triggers read/write to SRAM, then ptr increment
-- Debug: same pad as Init during config, can be read via port 300
ENTITY boris IS
PORT (
Clk: IN vlbit;
Chip_Select: IN vlbit;
Extract: IN vlbit;
Trigger: IN vlbit;
Data: INOUT vlbit_1d(15 downto 0);
Mem: INOUT vlbit_1d(15 downto 0);
Addr: OUT vlbit_1d(14 downto 0);
SRAM_WE: OUT vlbit;
SRAM_CE: OUT vlbit;
SRAM_OE: OUT vlbit;
Empty: BUFFER vlbit;
Almost_Full: BUFFER vlbit;
Full: BUFFER vlbit;
Debug: OUT vlbit
);
END boris;
ARCHITECTURE behav OF boris IS
-- wp is the RAM address of the next write location
-- The pointers will range from 0 to 32766 in a LFSR sequence
SIGNAL wp: vlbit_1d(14 downto 0);
-- rp is the RAM address of the next read location
SIGNAL rp: vlbit_1d(14 downto 0);
SIGNAL datain: vlbit_1d(15 downto 0); -- stuff coming in data ports
SIGNAL dataout: vlbit_1d(15 downto 0); -- stuff going out data ports
SIGNAL memin: vlbit_1d(15 downto 0); -- stuff coming from mem
SIGNAL memout: vlbit_1d(15 downto 0); -- stuff going out to mem
-- mem_oe controls the direction of the mem lines (in=0/out=1)
SIGNAL mem_oe: vlbit;
-- data_oe controls the direction of the data lines
SIGNAL data_oe: vlbit;
-- ext, trig, and cs are the CLK-synchronized values of
-- the Extract, Trigger, and Chip_Select inputs
SIGNAL ext: vlbit;
SIGNAL trig: vlbit;
SIGNAL cs: vlbit;
COMPONENT natasha
PORT(
Clk: IN vlbit;
Trig: IN vlbit;
Ext: IN vlbit;
CS: IN vlbit;
WE: OUT vlbit;
CE: OUT vlbit;
OE: OUT vlbit
);
END COMPONENT;
COMPONENT pointers
PORT(
Clk: IN vlbit;
Trig: IN vlbit;
Ext: IN vlbit;
CS: IN vlbit;
Full: BUFFER vlbit;
Almost_Full: BUFFER vlbit;
Empty: BUFFER vlbit;
Addr: BUFFER vlbit_1d(14 downto 0)
);
END COMPONENT;
BEGIN
PtrProc : pointers
PORT MAP(Clk, trig, ext, cs, Full, Almost_Full, Empty, Addr);
MemProc : natasha
PORT MAP(Clk, trig, ext, cs, SRAM_WE, SRAM_CE, SRAM_OE);
SyncInputs : PROCESS
BEGIN
WAIT UNTIL Clk'EVENT AND CLK = '1';
cs <= Chip_Select;
ext <= Extract;
trig <= Trigger AND Chip_Select;
END PROCESS;
Debug <= Almost_Full;
-- Set up bidirectional I/O on data and mem lines
data_oe <= cs AND ext;
mem_oe <= NOT SRAM_WE; -- SRAM_WE is active low
BidirDataProc : PROCESS(Clk, data_oe)
BEGIN
IF data_oe = '1' THEN
Data <= dataout;
ELSIF (Clk'EVENT AND Clk = '1' AND trig)
datain <= Data;
END IF;
END PROCESS;
BidirMemProc : PROCESS(Clk, mem_oe, Mem)
BEGIN
IF mem_oe = '1' THEN
Mem <= memout;
END IF;
memin <= Mem;
END PROCESS;
END behav;