Commit 7b04e424 authored by egousiou's avatar egousiou

folders restructuring; one core for both spec and svec

git-svn-id: http://svn.ohwr.org/fmc-tdc@127 85dfdc96-de2c-444c-878d-45b388be74a9
parent 0f663caf
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: DMA controller (dma_controller.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 0.2
--
-- description: Manages the DMA transfers.
--
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 30-09-2010 (mcattin) Add status, error and abort
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
entity dma_controller is
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- Interrupt request
dma_ctrl_irq_o : out std_logic_vector(1 downto 0);
---------------------------------------------------------
-- To the L2P DMA master and P2L DMA master
dma_ctrl_carrier_addr_o : out std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_o : out std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_o : out std_logic_vector(31 downto 0);
dma_ctrl_len_o : out std_logic_vector(31 downto 0);
dma_ctrl_start_l2p_o : out std_logic; -- To the L2P DMA master
dma_ctrl_start_p2l_o : out std_logic; -- To the P2L DMA master
dma_ctrl_start_next_o : out std_logic; -- To the P2L DMA master
dma_ctrl_byte_swap_o : out std_logic_vector(1 downto 0);
dma_ctrl_abort_o : out std_logic;
dma_ctrl_done_i : in std_logic;
dma_ctrl_error_i : in std_logic;
---------------------------------------------------------
-- From P2L DMA master
next_item_carrier_addr_i : in std_logic_vector(31 downto 0);
next_item_host_addr_h_i : in std_logic_vector(31 downto 0);
next_item_host_addr_l_i : in std_logic_vector(31 downto 0);
next_item_len_i : in std_logic_vector(31 downto 0);
next_item_next_l_i : in std_logic_vector(31 downto 0);
next_item_next_h_i : in std_logic_vector(31 downto 0);
next_item_attrib_i : in std_logic_vector(31 downto 0);
next_item_valid_i : in std_logic;
---------------------------------------------------------
-- Wishbone slave interface
wb_clk_i : in std_logic; -- Bus clock
wb_adr_i : in std_logic_vector(3 downto 0); -- Adress
wb_dat_o : out std_logic_vector(31 downto 0); -- Data in
wb_dat_i : in std_logic_vector(31 downto 0); -- Data out
wb_sel_i : in std_logic_vector(3 downto 0); -- Byte select
wb_cyc_i : in std_logic; -- Read or write cycle
wb_stb_i : in std_logic; -- Read or write strobe
wb_we_i : in std_logic; -- Write
wb_ack_o : out std_logic -- Acknowledge
);
end dma_controller;
architecture behaviour of dma_controller is
------------------------------------------------------------------------------
-- Wishbone slave component declaration
------------------------------------------------------------------------------
component dma_controller_wb_slave is
port (
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(3 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
clk_i : in std_logic;
-- Port for std_logic_vector field: 'DMA engine control' in reg: 'DMACTRLR'
dma_ctrl_o : out std_logic_vector(31 downto 0);
dma_ctrl_i : in std_logic_vector(31 downto 0);
dma_ctrl_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA engine status' in reg: 'DMASTATR'
dma_stat_o : out std_logic_vector(31 downto 0);
dma_stat_i : in std_logic_vector(31 downto 0);
dma_stat_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA start address in the carrier' in reg: 'DMACSTARTR'
dma_cstart_o : out std_logic_vector(31 downto 0);
dma_cstart_i : in std_logic_vector(31 downto 0);
dma_cstart_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA start address (low) in the host' in reg: 'DMAHSTARTLR'
dma_hstartl_o : out std_logic_vector(31 downto 0);
dma_hstartl_i : in std_logic_vector(31 downto 0);
dma_hstartl_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA start address (high) in the host' in reg: 'DMAHSTARTHR'
dma_hstarth_o : out std_logic_vector(31 downto 0);
dma_hstarth_i : in std_logic_vector(31 downto 0);
dma_hstarth_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA read length in bytes' in reg: 'DMALENR'
dma_len_o : out std_logic_vector(31 downto 0);
dma_len_i : in std_logic_vector(31 downto 0);
dma_len_load_o : out std_logic;
-- Port for std_logic_vector field: 'Pointer (low) to next item in list' in reg: 'DMANEXTLR'
dma_nextl_o : out std_logic_vector(31 downto 0);
dma_nextl_i : in std_logic_vector(31 downto 0);
dma_nextl_load_o : out std_logic;
-- Port for std_logic_vector field: 'Pointer (high) to next item in list' in reg: 'DMANEXTHR'
dma_nexth_o : out std_logic_vector(31 downto 0);
dma_nexth_i : in std_logic_vector(31 downto 0);
dma_nexth_load_o : out std_logic;
-- Port for std_logic_vector field: 'DMA chain control' in reg: 'DMAATTRIBR'
dma_attrib_o : out std_logic_vector(31 downto 0);
dma_attrib_i : in std_logic_vector(31 downto 0);
dma_attrib_load_o : out std_logic
);
end component dma_controller_wb_slave;
------------------------------------------------------------------------------
-- Constants declaration
------------------------------------------------------------------------------
constant c_IDLE : std_logic_vector(2 downto 0) := "000";
constant c_DONE : std_logic_vector(2 downto 0) := "001";
constant c_BUSY : std_logic_vector(2 downto 0) := "010";
constant c_ERROR : std_logic_vector(2 downto 0) := "011";
constant c_ABORT : std_logic_vector(2 downto 0) := "100";
------------------------------------------------------------------------------
-- Signals declaration
------------------------------------------------------------------------------
-- DMA controller registers
signal dma_ctrl : std_logic_vector(31 downto 0);
signal dma_stat : std_logic_vector(31 downto 0);
signal dma_cstart : std_logic_vector(31 downto 0);
signal dma_hstartl : std_logic_vector(31 downto 0);
signal dma_hstarth : std_logic_vector(31 downto 0);
signal dma_len : std_logic_vector(31 downto 0);
signal dma_nextl : std_logic_vector(31 downto 0);
signal dma_nexth : std_logic_vector(31 downto 0);
signal dma_attrib : std_logic_vector(31 downto 0);
signal dma_ctrl_load : std_logic;
signal dma_stat_load : std_logic;
signal dma_cstart_load : std_logic;
signal dma_hstartl_load : std_logic;
signal dma_hstarth_load : std_logic;
signal dma_len_load : std_logic;
signal dma_nextl_load : std_logic;
signal dma_nexth_load : std_logic;
signal dma_attrib_load : std_logic;
signal dma_ctrl_reg : std_logic_vector(31 downto 0);
signal dma_stat_reg : std_logic_vector(31 downto 0);
signal dma_cstart_reg : std_logic_vector(31 downto 0);
signal dma_hstartl_reg : std_logic_vector(31 downto 0);
signal dma_hstarth_reg : std_logic_vector(31 downto 0);
signal dma_len_reg : std_logic_vector(31 downto 0);
signal dma_nextl_reg : std_logic_vector(31 downto 0);
signal dma_nexth_reg : std_logic_vector(31 downto 0);
signal dma_attrib_reg : std_logic_vector(31 downto 0);
-- DMA controller FSM
type dma_ctrl_state_type is (DMA_IDLE, DMA_START_TRANSFER, DMA_TRANSFER,
DMA_START_CHAIN, DMA_CHAIN,
DMA_ERROR, DMA_ABORT);
signal dma_ctrl_current_state : dma_ctrl_state_type;
-- status signals
signal dma_status : std_logic_vector(2 downto 0);
signal dma_error_irq : std_logic;
signal dma_done_irq : std_logic;
begin
------------------------------------------------------------------------------
-- Wishbone slave instanciation
------------------------------------------------------------------------------
dma_controller_wb_slave_0 : dma_controller_wb_slave port map (
rst_n_i => rst_n_i,
wb_clk_i => wb_clk_i,
wb_addr_i => wb_adr_i,
wb_data_i => wb_dat_i,
wb_data_o => wb_dat_o,
wb_cyc_i => wb_cyc_i,
wb_sel_i => wb_sel_i,
wb_stb_i => wb_stb_i,
wb_we_i => wb_we_i,
wb_ack_o => wb_ack_o,
clk_i => clk_i,
dma_ctrl_o => dma_ctrl,
dma_ctrl_i => dma_ctrl_reg,
dma_ctrl_load_o => dma_ctrl_load,
dma_stat_o => open,
dma_stat_i => dma_stat_reg,
dma_stat_load_o => open,
dma_cstart_o => dma_cstart,
dma_cstart_i => dma_cstart_reg,
dma_cstart_load_o => dma_cstart_load,
dma_hstartl_o => dma_hstartl,
dma_hstartl_i => dma_hstartl_reg,
dma_hstartl_load_o => dma_hstartl_load,
dma_hstarth_o => dma_hstarth,
dma_hstarth_i => dma_hstarth_reg,
dma_hstarth_load_o => dma_hstarth_load,
dma_len_o => dma_len,
dma_len_i => dma_len_reg,
dma_len_load_o => dma_len_load,
dma_nextl_o => dma_nextl,
dma_nextl_i => dma_nextl_reg,
dma_nextl_load_o => dma_nextl_load,
dma_nexth_o => dma_nexth,
dma_nexth_i => dma_nexth_reg,
dma_nexth_load_o => dma_nexth_load,
dma_attrib_o => dma_attrib,
dma_attrib_i => dma_attrib_reg,
dma_attrib_load_o => dma_attrib_load
);
------------------------------------------------------------------------------
-- DMA controller registers
------------------------------------------------------------------------------
p_regs : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
dma_ctrl_reg <= (others => '0');
dma_stat_reg <= (others => '0');
dma_cstart_reg <= (others => '0');
dma_hstartl_reg <= (others => '0');
dma_hstarth_reg <= (others => '0');
dma_len_reg <= (others => '0');
dma_nextl_reg <= (others => '0');
dma_nexth_reg <= (others => '0');
dma_attrib_reg <= (others => '0');
elsif rising_edge(clk_i) then
-- Control register
if (dma_ctrl_load = '1') then
dma_ctrl_reg <= dma_ctrl;
end if;
-- Status register
dma_stat_reg(2 downto 0) <= dma_status;
dma_stat_reg(31 downto 3) <= (others => '0');
-- Target start address
if (dma_cstart_load = '1') then
dma_cstart_reg <= dma_cstart;
end if;
-- Host start address lowest 32-bit
if (dma_hstartl_load = '1') then
dma_hstartl_reg <= dma_hstartl;
end if;
-- Host start address highest 32-bit
if (dma_hstarth_load = '1') then
dma_hstarth_reg <= dma_hstarth;
end if;
-- DMA transfer length in byte
if (dma_len_load = '1') then
dma_len_reg <= dma_len;
end if;
-- next item address lowest 32-bit
if (dma_nextl_load = '1') then
dma_nextl_reg <= dma_nextl;
end if;
-- next item address highest 32-bit
if (dma_nexth_load = '1') then
dma_nexth_reg <= dma_nexth;
end if;
-- Chained DMA control
if (dma_attrib_load = '1') then
dma_attrib_reg <= dma_attrib;
end if;
-- next item received => start a new transfer
if (next_item_valid_i = '1') then
dma_ctrl_reg(0) <= '1';
dma_cstart_reg <= next_item_carrier_addr_i;
dma_hstartl_reg <= next_item_host_addr_l_i;
dma_hstarth_reg <= next_item_host_addr_h_i;
dma_len_reg <= next_item_len_i;
dma_nextl_reg <= next_item_next_l_i;
dma_nexth_reg <= next_item_next_h_i;
dma_attrib_reg <= next_item_attrib_i;
end if;
-- Start DMA, 1 tick pulse
if (dma_ctrl_reg(0) = '1') then
dma_ctrl_reg(0) <= '0';
end if;
end if;
end process p_regs;
dma_ctrl_byte_swap_o <= dma_ctrl_reg(3 downto 2);
------------------------------------------------------------------------------
-- IRQ output assignement
------------------------------------------------------------------------------
dma_ctrl_irq_o <= dma_error_irq & dma_done_irq;
------------------------------------------------------------------------------
-- DMA controller FSM
------------------------------------------------------------------------------
p_fsm : process (clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
dma_ctrl_current_state <= DMA_IDLE;
dma_ctrl_carrier_addr_o <= (others => '0');
dma_ctrl_host_addr_h_o <= (others => '0');
dma_ctrl_host_addr_l_o <= (others => '0');
dma_ctrl_len_o <= (others => '0');
dma_ctrl_start_l2p_o <= '0';
dma_ctrl_start_p2l_o <= '0';
dma_ctrl_start_next_o <= '0';
dma_status <= c_IDLE;
dma_error_irq <= '0';
dma_done_irq <= '0';
dma_ctrl_abort_o <= '0';
elsif rising_edge(clk_i) then
case dma_ctrl_current_state is
when DMA_IDLE =>
-- Clear done irq to make it 1 tick pulse
dma_done_irq <= '0';
if(dma_ctrl_reg(0) = '1') then
-- Starts a new transfer
dma_ctrl_current_state <= DMA_START_TRANSFER;
end if;
when DMA_START_TRANSFER =>
-- Clear abort signal
dma_ctrl_abort_o <= '0';
if (unsigned(dma_len_reg(31 downto 2)) = 0) then
-- Requesting a DMA of 0 word length gives a error
dma_error_irq <= '1';
dma_ctrl_current_state <= DMA_ERROR;
else
-- Start the DMA if the length is not 0
if (dma_attrib_reg(1) = '0') then
-- L2P transfer (from target to PCIe)
dma_ctrl_start_l2p_o <= '1';
elsif (dma_attrib_reg(1) = '1') then
-- P2L transfer (from PCIe to target)
dma_ctrl_start_p2l_o <= '1';
end if;
dma_ctrl_current_state <= DMA_TRANSFER;
dma_ctrl_carrier_addr_o <= dma_cstart_reg;
dma_ctrl_host_addr_h_o <= dma_hstarth_reg;
dma_ctrl_host_addr_l_o <= dma_hstartl_reg;
dma_ctrl_len_o <= dma_len_reg;
dma_status <= c_BUSY;
end if;
when DMA_TRANSFER =>
-- Clear start signals, to make them 1 tick pulses
dma_ctrl_start_l2p_o <= '0';
dma_ctrl_start_p2l_o <= '0';
if (dma_ctrl_reg(1) = '1') then
-- Transfer aborted
dma_ctrl_current_state <= DMA_ABORT;
elsif(dma_ctrl_error_i = '1') then
-- An error occurs !
dma_error_irq <= '1';
dma_ctrl_current_state <= DMA_ERROR;
elsif(dma_ctrl_done_i = '1') then
-- End of DMA transfer
if(dma_attrib_reg(0) = '1') then
-- More transfer in chained DMA
dma_ctrl_current_state <= DMA_START_CHAIN;
else
-- Was the last transfer
dma_status <= c_DONE;
dma_done_irq <= '1';
dma_ctrl_current_state <= DMA_IDLE;
end if;
end if;
when DMA_START_CHAIN =>
-- Catch the next item in host memory
dma_ctrl_current_state <= DMA_CHAIN;
dma_ctrl_host_addr_h_o <= dma_nexth_reg;
dma_ctrl_host_addr_l_o <= dma_nextl_reg;
dma_ctrl_len_o <= X"0000001C";
dma_ctrl_start_next_o <= '1';
when DMA_CHAIN =>
-- Clear start next signal, to make it 1 tick pulse
dma_ctrl_start_next_o <= '0';
if (dma_ctrl_reg(1) = '1') then
-- Transfer aborted
dma_ctrl_current_state <= DMA_ABORT;
elsif(dma_ctrl_error_i = '1') then
-- An error occurs !
dma_error_irq <= '1';
dma_ctrl_current_state <= DMA_ERROR;
elsif (next_item_valid_i = '1') then
-- next item received
dma_ctrl_current_state <= DMA_START_TRANSFER;
end if;
when DMA_ERROR =>
dma_status <= c_ERROR;
-- Clear error irq to make it 1 tick pulse
dma_error_irq <= '0';
if(dma_ctrl_reg(0) = '1') then
-- Starts a new transfer
dma_ctrl_current_state <= DMA_START_TRANSFER;
end if;
when DMA_ABORT =>
dma_status <= c_ABORT;
dma_ctrl_abort_o <= '1';
if(dma_ctrl_reg(0) = '1') then
-- Starts a new transfer
dma_ctrl_current_state <= DMA_START_TRANSFER;
end if;
when others =>
dma_ctrl_current_state <= DMA_IDLE;
dma_ctrl_carrier_addr_o <= (others => '0');
dma_ctrl_host_addr_h_o <= (others => '0');
dma_ctrl_host_addr_l_o <= (others => '0');
dma_ctrl_len_o <= (others => '0');
dma_ctrl_start_l2p_o <= '0';
dma_ctrl_start_p2l_o <= '0';
dma_ctrl_start_next_o <= '0';
dma_status <= (others => '0');
dma_error_irq <= '0';
dma_done_irq <= '0';
dma_ctrl_abort_o <= '0';
end case;
end if;
end process p_fsm;
end behaviour;
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for GN4124 core DMA controller
---------------------------------------------------------------------------------------
-- File : async_regs.vhd
-- Author : auto-generated by wbgen2 from async_regs.wb
-- Created : Wed Oct 6 15:30:35 2010
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE async_regs.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity dma_controller_wb_slave is
port (
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(3 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
clk_i : in std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA engine control' in reg: 'DMACTRLR'
dma_ctrl_o : out std_logic_vector(31 downto 0);
dma_ctrl_i : in std_logic_vector(31 downto 0);
dma_ctrl_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA engine status' in reg: 'DMASTATR'
dma_stat_o : out std_logic_vector(31 downto 0);
dma_stat_i : in std_logic_vector(31 downto 0);
dma_stat_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA start address in the carrier' in reg: 'DMACSTARTR'
dma_cstart_o : out std_logic_vector(31 downto 0);
dma_cstart_i : in std_logic_vector(31 downto 0);
dma_cstart_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA start address (low) in the host' in reg: 'DMAHSTARTLR'
dma_hstartl_o : out std_logic_vector(31 downto 0);
dma_hstartl_i : in std_logic_vector(31 downto 0);
dma_hstartl_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA start address (high) in the host' in reg: 'DMAHSTARTHR'
dma_hstarth_o : out std_logic_vector(31 downto 0);
dma_hstarth_i : in std_logic_vector(31 downto 0);
dma_hstarth_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA read length in bytes' in reg: 'DMALENR'
dma_len_o : out std_logic_vector(31 downto 0);
dma_len_i : in std_logic_vector(31 downto 0);
dma_len_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'Pointer (low) to next item in list' in reg: 'DMANEXTLR'
dma_nextl_o : out std_logic_vector(31 downto 0);
dma_nextl_i : in std_logic_vector(31 downto 0);
dma_nextl_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'Pointer (high) to next item in list' in reg: 'DMANEXTHR'
dma_nexth_o : out std_logic_vector(31 downto 0);
dma_nexth_i : in std_logic_vector(31 downto 0);
dma_nexth_load_o : out std_logic;
-- Ports for asynchronous (clock: clk_i) std_logic_vector field: 'DMA chain control' in reg: 'DMAATTRIBR'
dma_attrib_o : out std_logic_vector(31 downto 0);
dma_attrib_i : in std_logic_vector(31 downto 0);
dma_attrib_load_o : out std_logic
);
end dma_controller_wb_slave;
architecture syn of dma_controller_wb_slave is
signal dma_ctrl_int_read : std_logic_vector(31 downto 0);
signal dma_ctrl_int_write : std_logic_vector(31 downto 0);
signal dma_ctrl_lw : std_logic ;
signal dma_ctrl_lw_delay : std_logic ;
signal dma_ctrl_lw_read_in_progress : std_logic ;
signal dma_ctrl_lw_s0 : std_logic ;
signal dma_ctrl_lw_s1 : std_logic ;
signal dma_ctrl_lw_s2 : std_logic ;
signal dma_ctrl_rwsel : std_logic ;
signal dma_stat_int_read : std_logic_vector(31 downto 0);
signal dma_stat_int_write : std_logic_vector(31 downto 0);
signal dma_stat_lw : std_logic ;
signal dma_stat_lw_delay : std_logic ;
signal dma_stat_lw_read_in_progress : std_logic ;
signal dma_stat_lw_s0 : std_logic ;
signal dma_stat_lw_s1 : std_logic ;
signal dma_stat_lw_s2 : std_logic ;
signal dma_stat_rwsel : std_logic ;
signal dma_cstart_int_read : std_logic_vector(31 downto 0);
signal dma_cstart_int_write : std_logic_vector(31 downto 0);
signal dma_cstart_lw : std_logic ;
signal dma_cstart_lw_delay : std_logic ;
signal dma_cstart_lw_read_in_progress : std_logic ;
signal dma_cstart_lw_s0 : std_logic ;
signal dma_cstart_lw_s1 : std_logic ;
signal dma_cstart_lw_s2 : std_logic ;
signal dma_cstart_rwsel : std_logic ;
signal dma_hstartl_int_read : std_logic_vector(31 downto 0);
signal dma_hstartl_int_write : std_logic_vector(31 downto 0);
signal dma_hstartl_lw : std_logic ;
signal dma_hstartl_lw_delay : std_logic ;
signal dma_hstartl_lw_read_in_progress : std_logic ;
signal dma_hstartl_lw_s0 : std_logic ;
signal dma_hstartl_lw_s1 : std_logic ;
signal dma_hstartl_lw_s2 : std_logic ;
signal dma_hstartl_rwsel : std_logic ;
signal dma_hstarth_int_read : std_logic_vector(31 downto 0);
signal dma_hstarth_int_write : std_logic_vector(31 downto 0);
signal dma_hstarth_lw : std_logic ;
signal dma_hstarth_lw_delay : std_logic ;
signal dma_hstarth_lw_read_in_progress : std_logic ;
signal dma_hstarth_lw_s0 : std_logic ;
signal dma_hstarth_lw_s1 : std_logic ;
signal dma_hstarth_lw_s2 : std_logic ;
signal dma_hstarth_rwsel : std_logic ;
signal dma_len_int_read : std_logic_vector(31 downto 0);
signal dma_len_int_write : std_logic_vector(31 downto 0);
signal dma_len_lw : std_logic ;
signal dma_len_lw_delay : std_logic ;
signal dma_len_lw_read_in_progress : std_logic ;
signal dma_len_lw_s0 : std_logic ;
signal dma_len_lw_s1 : std_logic ;
signal dma_len_lw_s2 : std_logic ;
signal dma_len_rwsel : std_logic ;
signal dma_nextl_int_read : std_logic_vector(31 downto 0);
signal dma_nextl_int_write : std_logic_vector(31 downto 0);
signal dma_nextl_lw : std_logic ;
signal dma_nextl_lw_delay : std_logic ;
signal dma_nextl_lw_read_in_progress : std_logic ;
signal dma_nextl_lw_s0 : std_logic ;
signal dma_nextl_lw_s1 : std_logic ;
signal dma_nextl_lw_s2 : std_logic ;
signal dma_nextl_rwsel : std_logic ;
signal dma_nexth_int_read : std_logic_vector(31 downto 0);
signal dma_nexth_int_write : std_logic_vector(31 downto 0);
signal dma_nexth_lw : std_logic ;
signal dma_nexth_lw_delay : std_logic ;
signal dma_nexth_lw_read_in_progress : std_logic ;
signal dma_nexth_lw_s0 : std_logic ;
signal dma_nexth_lw_s1 : std_logic ;
signal dma_nexth_lw_s2 : std_logic ;
signal dma_nexth_rwsel : std_logic ;
signal dma_attrib_int_read : std_logic_vector(31 downto 0);
signal dma_attrib_int_write : std_logic_vector(31 downto 0);
signal dma_attrib_lw : std_logic ;
signal dma_attrib_lw_delay : std_logic ;
signal dma_attrib_lw_read_in_progress : std_logic ;
signal dma_attrib_lw_s0 : std_logic ;
signal dma_attrib_lw_s1 : std_logic ;
signal dma_attrib_lw_s2 : std_logic ;
signal dma_attrib_rwsel : std_logic ;
signal ack_sreg : std_logic_vector(9 downto 0);
signal rddata_reg : std_logic_vector(31 downto 0);
signal wrdata_reg : std_logic_vector(31 downto 0);
signal bwsel_reg : std_logic_vector(3 downto 0);
signal rwaddr_reg : std_logic_vector(3 downto 0);
signal ack_in_progress : std_logic ;
signal wr_int : std_logic ;
signal rd_int : std_logic ;
signal bus_clock_int : std_logic ;
signal allones : std_logic_vector(31 downto 0);
signal allzeros : std_logic_vector(31 downto 0);
begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
wrdata_reg <= wb_data_i;
bwsel_reg <= wb_sel_i;
bus_clock_int <= wb_clk_i;
rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
allones <= (others => '1');
allzeros <= (others => '0');
--
-- Main register bank access process.
process (wb_clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
dma_ctrl_lw <= '0';
dma_ctrl_lw_delay <= '0';
dma_ctrl_lw_read_in_progress <= '0';
dma_ctrl_rwsel <= '0';
dma_ctrl_int_write <= "00000000000000000000000000000000";
dma_stat_lw <= '0';
dma_stat_lw_delay <= '0';
dma_stat_lw_read_in_progress <= '0';
dma_stat_rwsel <= '0';
dma_stat_int_write <= "00000000000000000000000000000000";
dma_cstart_lw <= '0';
dma_cstart_lw_delay <= '0';
dma_cstart_lw_read_in_progress <= '0';
dma_cstart_rwsel <= '0';
dma_cstart_int_write <= "00000000000000000000000000000000";
dma_hstartl_lw <= '0';
dma_hstartl_lw_delay <= '0';
dma_hstartl_lw_read_in_progress <= '0';
dma_hstartl_rwsel <= '0';
dma_hstartl_int_write <= "00000000000000000000000000000000";
dma_hstarth_lw <= '0';
dma_hstarth_lw_delay <= '0';
dma_hstarth_lw_read_in_progress <= '0';
dma_hstarth_rwsel <= '0';
dma_hstarth_int_write <= "00000000000000000000000000000000";
dma_len_lw <= '0';
dma_len_lw_delay <= '0';
dma_len_lw_read_in_progress <= '0';
dma_len_rwsel <= '0';
dma_len_int_write <= "00000000000000000000000000000000";
dma_nextl_lw <= '0';
dma_nextl_lw_delay <= '0';
dma_nextl_lw_read_in_progress <= '0';
dma_nextl_rwsel <= '0';
dma_nextl_int_write <= "00000000000000000000000000000000";
dma_nexth_lw <= '0';
dma_nexth_lw_delay <= '0';
dma_nexth_lw_read_in_progress <= '0';
dma_nexth_rwsel <= '0';
dma_nexth_int_write <= "00000000000000000000000000000000";
dma_attrib_lw <= '0';
dma_attrib_lw_delay <= '0';
dma_attrib_lw_read_in_progress <= '0';
dma_attrib_rwsel <= '0';
dma_attrib_int_write <= "00000000000000000000000000000000";
elsif rising_edge(wb_clk_i) then
-- advance the ACK generator shift register
ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
ack_in_progress <= '0';
else
dma_ctrl_lw <= dma_ctrl_lw_delay;
dma_ctrl_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_ctrl_lw_read_in_progress = '1')) then
dma_ctrl_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_ctrl_int_read;
end if;
dma_stat_lw <= dma_stat_lw_delay;
dma_stat_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_stat_lw_read_in_progress = '1')) then
dma_stat_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_stat_int_read;
end if;
dma_cstart_lw <= dma_cstart_lw_delay;
dma_cstart_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_cstart_lw_read_in_progress = '1')) then
dma_cstart_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_cstart_int_read;
end if;
dma_hstartl_lw <= dma_hstartl_lw_delay;
dma_hstartl_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_hstartl_lw_read_in_progress = '1')) then
dma_hstartl_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_hstartl_int_read;
end if;
dma_hstarth_lw <= dma_hstarth_lw_delay;
dma_hstarth_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_hstarth_lw_read_in_progress = '1')) then
dma_hstarth_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_hstarth_int_read;
end if;
dma_len_lw <= dma_len_lw_delay;
dma_len_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_len_lw_read_in_progress = '1')) then
dma_len_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_len_int_read;
end if;
dma_nextl_lw <= dma_nextl_lw_delay;
dma_nextl_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_nextl_lw_read_in_progress = '1')) then
dma_nextl_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_nextl_int_read;
end if;
dma_nexth_lw <= dma_nexth_lw_delay;
dma_nexth_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_nexth_lw_read_in_progress = '1')) then
dma_nexth_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_nexth_int_read;
end if;
dma_attrib_lw <= dma_attrib_lw_delay;
dma_attrib_lw_delay <= '0';
if ((ack_sreg(1) = '1') and (dma_attrib_lw_read_in_progress = '1')) then
dma_attrib_lw_read_in_progress <= '0';
rddata_reg(31 downto 0) <= dma_attrib_int_read;
end if;
end if;
else
if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
case rwaddr_reg(3 downto 0) is
when "0000" =>
if (wb_we_i = '1') then
dma_ctrl_int_write <= wrdata_reg(31 downto 0);
dma_ctrl_lw <= '1';
dma_ctrl_lw_delay <= '1';
dma_ctrl_lw_read_in_progress <= '0';
dma_ctrl_rwsel <= '1';
else
dma_ctrl_lw <= '1';
dma_ctrl_lw_delay <= '1';
dma_ctrl_lw_read_in_progress <= '1';
dma_ctrl_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0001" =>
if (wb_we_i = '1') then
dma_stat_int_write <= wrdata_reg(31 downto 0);
dma_stat_lw <= '1';
dma_stat_lw_delay <= '1';
dma_stat_lw_read_in_progress <= '0';
dma_stat_rwsel <= '1';
else
dma_stat_lw <= '1';
dma_stat_lw_delay <= '1';
dma_stat_lw_read_in_progress <= '1';
dma_stat_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0010" =>
if (wb_we_i = '1') then
dma_cstart_int_write <= wrdata_reg(31 downto 0);
dma_cstart_lw <= '1';
dma_cstart_lw_delay <= '1';
dma_cstart_lw_read_in_progress <= '0';
dma_cstart_rwsel <= '1';
else
dma_cstart_lw <= '1';
dma_cstart_lw_delay <= '1';
dma_cstart_lw_read_in_progress <= '1';
dma_cstart_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0011" =>
if (wb_we_i = '1') then
dma_hstartl_int_write <= wrdata_reg(31 downto 0);
dma_hstartl_lw <= '1';
dma_hstartl_lw_delay <= '1';
dma_hstartl_lw_read_in_progress <= '0';
dma_hstartl_rwsel <= '1';
else
dma_hstartl_lw <= '1';
dma_hstartl_lw_delay <= '1';
dma_hstartl_lw_read_in_progress <= '1';
dma_hstartl_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0100" =>
if (wb_we_i = '1') then
dma_hstarth_int_write <= wrdata_reg(31 downto 0);
dma_hstarth_lw <= '1';
dma_hstarth_lw_delay <= '1';
dma_hstarth_lw_read_in_progress <= '0';
dma_hstarth_rwsel <= '1';
else
dma_hstarth_lw <= '1';
dma_hstarth_lw_delay <= '1';
dma_hstarth_lw_read_in_progress <= '1';
dma_hstarth_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0101" =>
if (wb_we_i = '1') then
dma_len_int_write <= wrdata_reg(31 downto 0);
dma_len_lw <= '1';
dma_len_lw_delay <= '1';
dma_len_lw_read_in_progress <= '0';
dma_len_rwsel <= '1';
else
dma_len_lw <= '1';
dma_len_lw_delay <= '1';
dma_len_lw_read_in_progress <= '1';
dma_len_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0110" =>
if (wb_we_i = '1') then
dma_nextl_int_write <= wrdata_reg(31 downto 0);
dma_nextl_lw <= '1';
dma_nextl_lw_delay <= '1';
dma_nextl_lw_read_in_progress <= '0';
dma_nextl_rwsel <= '1';
else
dma_nextl_lw <= '1';
dma_nextl_lw_delay <= '1';
dma_nextl_lw_read_in_progress <= '1';
dma_nextl_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "0111" =>
if (wb_we_i = '1') then
dma_nexth_int_write <= wrdata_reg(31 downto 0);
dma_nexth_lw <= '1';
dma_nexth_lw_delay <= '1';
dma_nexth_lw_read_in_progress <= '0';
dma_nexth_rwsel <= '1';
else
dma_nexth_lw <= '1';
dma_nexth_lw_delay <= '1';
dma_nexth_lw_read_in_progress <= '1';
dma_nexth_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when "1000" =>
if (wb_we_i = '1') then
dma_attrib_int_write <= wrdata_reg(31 downto 0);
dma_attrib_lw <= '1';
dma_attrib_lw_delay <= '1';
dma_attrib_lw_read_in_progress <= '0';
dma_attrib_rwsel <= '1';
else
dma_attrib_lw <= '1';
dma_attrib_lw_delay <= '1';
dma_attrib_lw_read_in_progress <= '1';
dma_attrib_rwsel <= '0';
end if;
ack_sreg(5) <= '1';
ack_in_progress <= '1';
when others =>
-- prevent the slave from hanging the bus on invalid address
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end case;
end if;
end if;
end if;
end process;
-- Drive the data output bus
wb_data_o <= rddata_reg;
-- DMA engine control
-- asynchronous std_logic_vector register : DMA engine control (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_ctrl_lw_s0 <= '0';
dma_ctrl_lw_s1 <= '0';
dma_ctrl_lw_s2 <= '0';
dma_ctrl_o <= "00000000000000000000000000000000";
dma_ctrl_load_o <= '0';
dma_ctrl_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_ctrl_lw_s0 <= dma_ctrl_lw;
dma_ctrl_lw_s1 <= dma_ctrl_lw_s0;
dma_ctrl_lw_s2 <= dma_ctrl_lw_s1;
if ((dma_ctrl_lw_s2 = '0') and (dma_ctrl_lw_s1 = '1')) then
if (dma_ctrl_rwsel = '1') then
dma_ctrl_o <= dma_ctrl_int_write;
dma_ctrl_load_o <= '1';
else
dma_ctrl_load_o <= '0';
dma_ctrl_int_read <= dma_ctrl_i;
end if;
else
dma_ctrl_load_o <= '0';
end if;
end if;
end process;
-- DMA engine status
-- asynchronous std_logic_vector register : DMA engine status (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_stat_lw_s0 <= '0';
dma_stat_lw_s1 <= '0';
dma_stat_lw_s2 <= '0';
dma_stat_o <= "00000000000000000000000000000000";
dma_stat_load_o <= '0';
dma_stat_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_stat_lw_s0 <= dma_stat_lw;
dma_stat_lw_s1 <= dma_stat_lw_s0;
dma_stat_lw_s2 <= dma_stat_lw_s1;
if ((dma_stat_lw_s2 = '0') and (dma_stat_lw_s1 = '1')) then
if (dma_stat_rwsel = '1') then
dma_stat_o <= dma_stat_int_write;
dma_stat_load_o <= '1';
else
dma_stat_load_o <= '0';
dma_stat_int_read <= dma_stat_i;
end if;
else
dma_stat_load_o <= '0';
end if;
end if;
end process;
-- DMA start address in the carrier
-- asynchronous std_logic_vector register : DMA start address in the carrier (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_cstart_lw_s0 <= '0';
dma_cstart_lw_s1 <= '0';
dma_cstart_lw_s2 <= '0';
dma_cstart_o <= "00000000000000000000000000000000";
dma_cstart_load_o <= '0';
dma_cstart_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_cstart_lw_s0 <= dma_cstart_lw;
dma_cstart_lw_s1 <= dma_cstart_lw_s0;
dma_cstart_lw_s2 <= dma_cstart_lw_s1;
if ((dma_cstart_lw_s2 = '0') and (dma_cstart_lw_s1 = '1')) then
if (dma_cstart_rwsel = '1') then
dma_cstart_o <= dma_cstart_int_write;
dma_cstart_load_o <= '1';
else
dma_cstart_load_o <= '0';
dma_cstart_int_read <= dma_cstart_i;
end if;
else
dma_cstart_load_o <= '0';
end if;
end if;
end process;
-- DMA start address (low) in the host
-- asynchronous std_logic_vector register : DMA start address (low) in the host (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_hstartl_lw_s0 <= '0';
dma_hstartl_lw_s1 <= '0';
dma_hstartl_lw_s2 <= '0';
dma_hstartl_o <= "00000000000000000000000000000000";
dma_hstartl_load_o <= '0';
dma_hstartl_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_hstartl_lw_s0 <= dma_hstartl_lw;
dma_hstartl_lw_s1 <= dma_hstartl_lw_s0;
dma_hstartl_lw_s2 <= dma_hstartl_lw_s1;
if ((dma_hstartl_lw_s2 = '0') and (dma_hstartl_lw_s1 = '1')) then
if (dma_hstartl_rwsel = '1') then
dma_hstartl_o <= dma_hstartl_int_write;
dma_hstartl_load_o <= '1';
else
dma_hstartl_load_o <= '0';
dma_hstartl_int_read <= dma_hstartl_i;
end if;
else
dma_hstartl_load_o <= '0';
end if;
end if;
end process;
-- DMA start address (high) in the host
-- asynchronous std_logic_vector register : DMA start address (high) in the host (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_hstarth_lw_s0 <= '0';
dma_hstarth_lw_s1 <= '0';
dma_hstarth_lw_s2 <= '0';
dma_hstarth_o <= "00000000000000000000000000000000";
dma_hstarth_load_o <= '0';
dma_hstarth_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_hstarth_lw_s0 <= dma_hstarth_lw;
dma_hstarth_lw_s1 <= dma_hstarth_lw_s0;
dma_hstarth_lw_s2 <= dma_hstarth_lw_s1;
if ((dma_hstarth_lw_s2 = '0') and (dma_hstarth_lw_s1 = '1')) then
if (dma_hstarth_rwsel = '1') then
dma_hstarth_o <= dma_hstarth_int_write;
dma_hstarth_load_o <= '1';
else
dma_hstarth_load_o <= '0';
dma_hstarth_int_read <= dma_hstarth_i;
end if;
else
dma_hstarth_load_o <= '0';
end if;
end if;
end process;
-- DMA read length in bytes
-- asynchronous std_logic_vector register : DMA read length in bytes (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_len_lw_s0 <= '0';
dma_len_lw_s1 <= '0';
dma_len_lw_s2 <= '0';
dma_len_o <= "00000000000000000000000000000000";
dma_len_load_o <= '0';
dma_len_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_len_lw_s0 <= dma_len_lw;
dma_len_lw_s1 <= dma_len_lw_s0;
dma_len_lw_s2 <= dma_len_lw_s1;
if ((dma_len_lw_s2 = '0') and (dma_len_lw_s1 = '1')) then
if (dma_len_rwsel = '1') then
dma_len_o <= dma_len_int_write;
dma_len_load_o <= '1';
else
dma_len_load_o <= '0';
dma_len_int_read <= dma_len_i;
end if;
else
dma_len_load_o <= '0';
end if;
end if;
end process;
-- Pointer (low) to next item in list
-- asynchronous std_logic_vector register : Pointer (low) to next item in list (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_nextl_lw_s0 <= '0';
dma_nextl_lw_s1 <= '0';
dma_nextl_lw_s2 <= '0';
dma_nextl_o <= "00000000000000000000000000000000";
dma_nextl_load_o <= '0';
dma_nextl_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_nextl_lw_s0 <= dma_nextl_lw;
dma_nextl_lw_s1 <= dma_nextl_lw_s0;
dma_nextl_lw_s2 <= dma_nextl_lw_s1;
if ((dma_nextl_lw_s2 = '0') and (dma_nextl_lw_s1 = '1')) then
if (dma_nextl_rwsel = '1') then
dma_nextl_o <= dma_nextl_int_write;
dma_nextl_load_o <= '1';
else
dma_nextl_load_o <= '0';
dma_nextl_int_read <= dma_nextl_i;
end if;
else
dma_nextl_load_o <= '0';
end if;
end if;
end process;
-- Pointer (high) to next item in list
-- asynchronous std_logic_vector register : Pointer (high) to next item in list (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_nexth_lw_s0 <= '0';
dma_nexth_lw_s1 <= '0';
dma_nexth_lw_s2 <= '0';
dma_nexth_o <= "00000000000000000000000000000000";
dma_nexth_load_o <= '0';
dma_nexth_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_nexth_lw_s0 <= dma_nexth_lw;
dma_nexth_lw_s1 <= dma_nexth_lw_s0;
dma_nexth_lw_s2 <= dma_nexth_lw_s1;
if ((dma_nexth_lw_s2 = '0') and (dma_nexth_lw_s1 = '1')) then
if (dma_nexth_rwsel = '1') then
dma_nexth_o <= dma_nexth_int_write;
dma_nexth_load_o <= '1';
else
dma_nexth_load_o <= '0';
dma_nexth_int_read <= dma_nexth_i;
end if;
else
dma_nexth_load_o <= '0';
end if;
end if;
end process;
-- DMA chain control
-- asynchronous std_logic_vector register : DMA chain control (type RW/WO, clk_i <-> wb_clk_i)
process (clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_attrib_lw_s0 <= '0';
dma_attrib_lw_s1 <= '0';
dma_attrib_lw_s2 <= '0';
dma_attrib_o <= "00000000000000000000000000000000";
dma_attrib_load_o <= '0';
dma_attrib_int_read <= "00000000000000000000000000000000";
elsif rising_edge(clk_i) then
dma_attrib_lw_s0 <= dma_attrib_lw;
dma_attrib_lw_s1 <= dma_attrib_lw_s0;
dma_attrib_lw_s2 <= dma_attrib_lw_s1;
if ((dma_attrib_lw_s2 = '0') and (dma_attrib_lw_s1 = '1')) then
if (dma_attrib_rwsel = '1') then
dma_attrib_o <= dma_attrib_int_write;
dma_attrib_load_o <= '1';
else
dma_attrib_load_o <= '0';
dma_attrib_int_read <= dma_attrib_i;
end if;
else
dma_attrib_load_o <= '0';
end if;
end if;
end process;
rwaddr_reg <= wb_addr_i;
-- ACK signal generation. Just pass the LSB of ACK counter.
wb_ack_o <= ack_sreg(0);
end syn;
-------------------------------------------------------------------------------
-- Title : Main package file
-- Project : Generics RAMs and FIFOs collection
-------------------------------------------------------------------------------
-- File : genram_pkg.vhd
-- Author : Tomasz Wlostowski
-- Company : CERN BE-CO-HT
-- Created : 2011-01-25
-- Last update: 2011-05-11
-- Platform :
-- Standard : VHDL'93
-------------------------------------------------------------------------------
--
-- Copyright (c) 2011 CERN
--
-- This source file is free software; you can redistribute it
-- and/or modify it under the terms of the GNU Lesser General
-- Public License as published by the Free Software Foundation;
-- either version 2.1 of the License, or (at your option) any
-- later version.
--
-- This source is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-- PURPOSE. See the GNU Lesser General Public License for more
-- details.
--
-- You should have received a copy of the GNU Lesser General
-- Public License along with this source; if not, download it
-- from http://www.gnu.org/licenses/lgpl-2.1.html
--
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2011-01-25 1.0 twlostow Created
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
package genram_pkg is
function f_log2_size (A : natural) return natural;
-- Single-port synchronous RAM
component generic_spram
generic (
g_data_width : natural;
g_size : natural;
g_with_byte_enable : boolean := false;
g_init_file : string := "";
g_addr_conflict_resolution : string := "read_first") ;
port (
rst_n_i : in std_logic;
clk_i : in std_logic;
bwe_i : in std_logic_vector((g_data_width+7)/8-1 downto 0);
we_i : in std_logic;
a_i : in std_logic_vector(f_log2_size(g_size)-1 downto 0);
d_i : in std_logic_vector(g_data_width-1 downto 0);
q_o : out std_logic_vector(g_data_width-1 downto 0));
end component;
component generic_dpram
generic (
g_data_width : natural;
g_size : natural;
g_with_byte_enable : boolean := false;
g_addr_conflict_resolution : string := "read_first";
g_init_file : string := "";
g_dual_clock : boolean := true);
port (
rst_n_i : in std_logic := '1';
clka_i : in std_logic;
bwea_i : in std_logic_vector(g_data_width/8-1 downto 0);
wea_i : in std_logic;
aa_i : in std_logic_vector(f_log2_size(g_size)-1 downto 0);
da_i : in std_logic_vector(g_data_width-1 downto 0);
qa_o : out std_logic_vector(g_data_width-1 downto 0);
clkb_i : in std_logic;
bweb_i : in std_logic_vector(g_data_width/8-1 downto 0);
web_i : in std_logic;
ab_i : in std_logic_vector(f_log2_size(g_size)-1 downto 0);
db_i : in std_logic_vector(g_data_width-1 downto 0);
qb_o : out std_logic_vector(g_data_width-1 downto 0));
end component;
component generic_async_fifo
generic (
g_data_width : natural;
g_size : natural;
g_show_ahead : boolean := false;
g_with_rd_empty : boolean := true;
g_with_rd_full : boolean := false;
g_with_rd_almost_empty : boolean := false;
g_with_rd_almost_full : boolean := false;
g_with_rd_count : boolean := false;
g_with_wr_empty : boolean := false;
g_with_wr_full : boolean := true;
g_with_wr_almost_empty : boolean := false;
g_with_wr_almost_full : boolean := false;
g_with_wr_count : boolean := false;
g_almost_empty_threshold : integer := 0;
g_almost_full_threshold : integer := 0);
port (
rst_n_i : in std_logic := '1';
clk_wr_i : in std_logic;
d_i : in std_logic_vector(g_data_width-1 downto 0);
we_i : in std_logic;
wr_empty_o : out std_logic;
wr_full_o : out std_logic;
wr_almost_empty_o : out std_logic;
wr_almost_full_o : out std_logic;
wr_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0);
clk_rd_i : in std_logic;
q_o : out std_logic_vector(g_data_width-1 downto 0);
rd_i : in std_logic;
rd_empty_o : out std_logic;
rd_full_o : out std_logic;
rd_almost_empty_o : out std_logic;
rd_almost_full_o : out std_logic;
rd_count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0));
end component;
component generic_sync_fifo
generic (
g_data_width : natural;
g_size : natural;
g_show_ahead : boolean := false;
g_with_empty : boolean := true;
g_with_full : boolean := true;
g_with_almost_empty : boolean := false;
g_with_almost_full : boolean := false;
g_with_count : boolean := false;
g_almost_empty_threshold : integer := 0;
g_almost_full_threshold : integer := 0);
port (
rst_n_i : in std_logic := '1';
clk_i : in std_logic;
d_i : in std_logic_vector(g_data_width-1 downto 0);
we_i : in std_logic;
q_o : out std_logic_vector(g_data_width-1 downto 0);
rd_i : in std_logic;
empty_o : out std_logic;
full_o : out std_logic;
almost_empty_o : out std_logic;
almost_full_o : out std_logic;
count_o : out std_logic_vector(f_log2_size(g_size)-1 downto 0));
end component;
end genram_pkg;
package body genram_pkg is
function f_log2_size (A : natural) return natural is
begin
for I in 1 to 64 loop -- Works for up to 64 bits
if (2**I >= A) then
return(I);
end if;
end loop;
return(63);
end function f_log2_size;
end genram_pkg;
\ No newline at end of file
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: Gn4124 core main block (gn4124_core_s6.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010///
--
-- version: 0.3
--
-- description: GN4124 core top level.
-- Version for spartan6 FPGAs.
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: see svn log
--------------------------------------------------------------------------------
-- TODO: - DMA wishbone bus address map
-- - reset and clock signals
-- - wishbone timeout generic ??
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
--==============================================================================
-- Entity declaration for GN4124 core (gn4124_core)
--==============================================================================
entity gn4124_core is
port
(
---------------------------------------------------------
-- Control and status
rst_n_a_i : in std_logic; -- Asynchronous reset from GN4124
status_o : out std_logic_vector(31 downto 0); -- Core status output
---------------------------------------------------------
-- P2L Direction
--
-- Source Sync DDR related signals
p2l_clk_p_i : in std_logic; -- Receiver Source Synchronous Clock+
p2l_clk_n_i : in std_logic; -- Receiver Source Synchronous Clock-
p2l_data_i : in std_logic_vector(15 downto 0); -- Parallel receive data
p2l_dframe_i : in std_logic; -- Receive Frame
p2l_valid_i : in std_logic; -- Receive Data Valid
-- P2L Control
p2l_rdy_o : out std_logic; -- Rx Buffer Full Flag
p_wr_req_i : in std_logic_vector(1 downto 0); -- PCIe Write Request
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- PCIe Write Ready
rx_error_o : out std_logic; -- Receive Error
vc_rdy_i : in std_logic_vector(1 downto 0); -- Virtual channel ready
---------------------------------------------------------
-- L2P Direction
--
-- Source Sync DDR related signals
l2p_clk_p_o : out std_logic; -- Transmitter Source Synchronous Clock+
l2p_clk_n_o : out std_logic; -- Transmitter Source Synchronous Clock-
l2p_data_o : out std_logic_vector(15 downto 0); -- Parallel transmit data
l2p_dframe_o : out std_logic; -- Transmit Data Frame
l2p_valid_o : out std_logic; -- Transmit Data Valid
-- L2P Control
l2p_edb_o : out std_logic; -- Packet termination and discard
l2p_rdy_i : in std_logic; -- Tx Buffer Full Flag
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Local-to-PCIe Write
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- PCIe-to-Local Read Response Data Ready
tx_error_i : in std_logic; -- Transmit Error
---------------------------------------------------------
-- Interrupt interface
dma_irq_o : out std_logic_vector(1 downto 0); -- Interrupts sources to IRQ manager
irq_p_i : in std_logic; -- Interrupt request pulse from IRQ manager
irq_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO
---------------------------------------------------------
-- DMA registers wishbone interface (slave classic)------------pipeline
dma_reg_clk_i : in std_logic;
dma_reg_adr_i : in std_logic_vector(31 downto 0);
dma_reg_dat_i : in std_logic_vector(31 downto 0);
dma_reg_sel_i : in std_logic_vector(3 downto 0);
dma_reg_stb_i : in std_logic;
dma_reg_we_i : in std_logic;
dma_reg_cyc_i : in std_logic;
dma_reg_dat_o : out std_logic_vector(31 downto 0);
dma_reg_ack_o : out std_logic;
dma_reg_stall_o : out std_logic;
---------------------------------------------------------
-- CSR wishbone interface (master pipelined)
csr_clk_i : in std_logic;
csr_adr_o : out std_logic_vector(31 downto 0);
csr_dat_o : out std_logic_vector(31 downto 0);
csr_sel_o : out std_logic_vector(3 downto 0);
csr_stb_o : out std_logic;
csr_we_o : out std_logic;
csr_cyc_o : out std_logic;
csr_dat_i : in std_logic_vector(31 downto 0);
csr_ack_i : in std_logic;
csr_stall_i : in std_logic;
---------------------------------------------------------
-- DMA wishbone interface (master pipelined)
dma_clk_i : in std_logic;
dma_adr_o : out std_logic_vector(31 downto 0);
dma_dat_o : out std_logic_vector(31 downto 0);
dma_sel_o : out std_logic_vector(3 downto 0);
dma_stb_o : out std_logic;
dma_we_o : out std_logic;
dma_cyc_o : out std_logic;
dma_dat_i : in std_logic_vector(31 downto 0);
dma_ack_i : in std_logic;
dma_stall_i : in std_logic
);
end gn4124_core;
--==============================================================================
-- Architecture declaration for GN4124 core (gn4124_core)
--==============================================================================
architecture rtl of gn4124_core is
-----------------------------------------------------------------------------
-- Components declaration
-----------------------------------------------------------------------------
component serdes_1_to_n_clk_pll_s2_diff
generic (
PLLD : integer := 1; -- Parameter to set division for PLL
PLLX : integer := 2; -- Parameter to set multiplier for PLL (2 for DDR)
CLKIN_PERIOD : real := 5.000; -- clock period (ns) of input clock on clkin_p
S : integer := 2; -- Parameter to set the serdes factor 1..8
BS : boolean := false; -- Parameter to enable bitslip TRUE or FALSE
DIFF_TERM : boolean := false) ; -- Enable or disable internal differential termination
port (
clkin_p : in std_logic; -- Input from LVDS receiver pin
clkin_n : in std_logic; -- Input from LVDS receiver pin
reset : in std_logic; -- Reset line
pattern1 : in std_logic_vector(S-1 downto 0); -- Pattern that bitslip should search for
pattern2 : in std_logic_vector(S-1 downto 0); -- Alternate pattern that bitslip should search for
rxioclk : out std_logic; -- IO Clock network
rx_serdesstrobe : out std_logic; -- Parallel data capture strobe
rx_bufg_pll_x1 : out std_logic; -- Global clock
rx_pll_lckd : out std_logic; -- PLL locked - only used if a 2nd BUFPLL is required
rx_pllout_xs : out std_logic; -- Multiplied PLL clock - only used if a 2nd BUFPLL is required
bitslip : out std_logic; -- Bitslip control line
datain : out std_logic_vector(S-1 downto 0); -- Output data
rx_bufpll_lckd : out std_logic); -- BUFPLL locked
end component serdes_1_to_n_clk_pll_s2_diff;
component pulse_synchronizer
port (
clk_in_i : in std_logic; --! Input pulse clock domain
clk_out_i : in std_logic; --! Output pulse clock domain
pulse_i : in std_logic; --! One clk_in_i tick input pulse
done_o : out std_logic; --! Input pulse is synchronized (1 clk_in_i tick)
pulse_o : out std_logic --! One clk_out_i tick output pulse
);
end component pulse_synchronizer;
------------------------------------------------------------------------------
-- Signals declaration
------------------------------------------------------------------------------
-- Clock
signal sys_clk : std_logic;
signal io_clk : std_logic;
signal serdes_strobe : std_logic;
signal p2l_pll_locked : std_logic;
-- Reset for all clk_p logic
signal rst_reg : std_logic;
signal rst_n : std_logic;
signal rst : std_logic;
-------------------------------------------------------------
-- P2L DataPath (from deserializer to packet decoder)
-------------------------------------------------------------
signal des_pd_valid : std_logic;
signal des_pd_dframe : std_logic;
signal des_pd_data : std_logic_vector(31 downto 0);
-- Local bus control
signal p_wr_rdy : std_logic;
signal p2l_rdy_wbm : std_logic;
signal p2l_rdy_pdm : std_logic;
-------------------------------------------------------------
-- P2L DataPath (from packet decoder to Wishbone master and P2L DMA master)
-------------------------------------------------------------
signal p2l_hdr_start : std_logic;
signal p2l_hdr_length : std_logic_vector(9 downto 0);
signal p2l_hdr_cid : std_logic_vector(1 downto 0);
signal p2l_hdr_last : std_logic;
signal p2l_hdr_stat : std_logic_vector(1 downto 0);
signal p2l_target_mrd : std_logic;
signal p2l_target_mwr : std_logic;
signal p2l_master_cpld : std_logic;
signal p2l_master_cpln : std_logic;
signal p2l_d_valid : std_logic;
signal p2l_d_last : std_logic;
signal p2l_d : std_logic_vector(31 downto 0);
signal p2l_be : std_logic_vector(3 downto 0);
signal p2l_addr : std_logic_vector(31 downto 0);
signal p2l_addr_start : std_logic;
-------------------------------------------------------------
-- L2P DataPath (from arbiter to serializer)
-------------------------------------------------------------
signal arb_ser_valid : std_logic;
signal arb_ser_dframe : std_logic;
signal arb_ser_data : std_logic_vector(31 downto 0);
-- Local bus control
signal l_wr_rdy_t : std_logic_vector(1 downto 0);
signal l_wr_rdy_t2 : std_logic_vector(1 downto 0);
signal l_wr_rdy : std_logic_vector(1 downto 0);
signal p_rd_d_rdy_t : std_logic_vector(1 downto 0);
signal p_rd_d_rdy_t2 : std_logic_vector(1 downto 0);
signal p_rd_d_rdy : std_logic_vector(1 downto 0);
signal l2p_rdy_t : std_logic;
signal l2p_rdy_t2 : std_logic;
signal l2p_rdy : std_logic;
signal l2p_edb : std_logic;
signal l2p_edb_t : std_logic;
signal l2p_edb_t2 : std_logic;
-------------------------------------------------------------
-- CSR wishbone master to arbiter
-------------------------------------------------------------
signal wbm_arb_valid : std_logic;
signal wbm_arb_dframe : std_logic;
signal wbm_arb_data : std_logic_vector(31 downto 0);
signal wbm_arb_req : std_logic;
signal arb_wbm_gnt : std_logic;
-------------------------------------------------------------
-- L2P DMA master to arbiter
-------------------------------------------------------------
signal ldm_arb_req : std_logic;
signal arb_ldm_gnt : std_logic;
signal ldm_arb_valid : std_logic;
signal ldm_arb_dframe : std_logic;
signal ldm_arb_data : std_logic_vector(31 downto 0);
-------------------------------------------------------------
-- P2L DMA master to arbiter
-------------------------------------------------------------
signal pdm_arb_valid : std_logic;
signal pdm_arb_dframe : std_logic;
signal pdm_arb_data : std_logic_vector(31 downto 0);
signal pdm_arb_req : std_logic;
signal arb_pdm_gnt : std_logic;
-------------------------------------------------------------
-- DMA controller
-------------------------------------------------------------
signal dma_ctrl_carrier_addr : std_logic_vector(31 downto 0);
signal dma_ctrl_host_addr_h : std_logic_vector(31 downto 0);
signal dma_ctrl_host_addr_l : std_logic_vector(31 downto 0);
signal dma_ctrl_len : std_logic_vector(31 downto 0);
signal dma_ctrl_start_l2p : std_logic;
signal dma_ctrl_start_p2l : std_logic;
signal dma_ctrl_start_next : std_logic;
signal dma_ctrl_done : std_logic;
signal dma_ctrl_error : std_logic;
signal dma_ctrl_l2p_done : std_logic;
signal dma_ctrl_l2p_error : std_logic;
signal dma_ctrl_p2l_done : std_logic;
signal dma_ctrl_p2l_error : std_logic;
signal dma_ctrl_byte_swap : std_logic_vector(1 downto 0);
signal dma_ctrl_abort : std_logic;
signal next_item_carrier_addr : std_logic_vector(31 downto 0);
signal next_item_host_addr_h : std_logic_vector(31 downto 0);
signal next_item_host_addr_l : std_logic_vector(31 downto 0);
signal next_item_len : std_logic_vector(31 downto 0);
signal next_item_next_l : std_logic_vector(31 downto 0);
signal next_item_next_h : std_logic_vector(31 downto 0);
signal next_item_attrib : std_logic_vector(31 downto 0);
signal next_item_valid : std_logic;
signal dma_irq : std_logic_vector(1 downto 0);
------------------------------------------------------------------------------
-- CSR wishbone bus
------------------------------------------------------------------------------
signal csr_adr : std_logic_vector(30 downto 0);
------------------------------------------------------------------------------
-- DMA wishbone bus
------------------------------------------------------------------------------
signal l2p_dma_adr : std_logic_vector(31 downto 0);
signal l2p_dma_dat_s2m : std_logic_vector(31 downto 0);
signal l2p_dma_dat_m2s : std_logic_vector(31 downto 0);
signal l2p_dma_sel : std_logic_vector(3 downto 0);
signal l2p_dma_cyc : std_logic;
signal l2p_dma_stb : std_logic;
signal l2p_dma_we : std_logic;
signal l2p_dma_ack : std_logic;
signal l2p_dma_stall : std_logic;
signal p2l_dma_adr : std_logic_vector(31 downto 0);
signal p2l_dma_dat_s2m : std_logic_vector(31 downto 0);
signal p2l_dma_dat_m2s : std_logic_vector(31 downto 0);
signal p2l_dma_sel : std_logic_vector(3 downto 0);
signal p2l_dma_cyc : std_logic;
signal p2l_dma_stb : std_logic;
signal p2l_dma_we : std_logic;
signal p2l_dma_ack : std_logic;
signal p2l_dma_stall : std_logic;
--==============================================================================
-- Architecture begin (gn4124_core)
--==============================================================================
begin
------------------------------------------------------------------------------
-- Status output assignment
------------------------------------------------------------------------------
status_o(0) <= p2l_pll_locked;
status_o(31 downto 1) <= (others => '0');
------------------------------------------------------------------------------
-- Clock Input. Generate ioclocks and system clock via BUFPLL
------------------------------------------------------------------------------
cmp_clk_in : serdes_1_to_n_clk_pll_s2_diff
generic map(
CLKIN_PERIOD => 5.000,
PLLD => 1,
PLLX => 2,
S => 2,
BS => false)
port map (
clkin_p => p2l_clk_p_i,
clkin_n => p2l_clk_n_i,
rxioclk => io_clk,
pattern1 => "10",
pattern2 => "10",
rx_serdesstrobe => serdes_strobe,
rx_bufg_pll_x1 => sys_clk,
bitslip => open,
reset => rst,
datain => open,
rx_bufpll_lckd => p2l_pll_locked) ;
------------------------------------------------------------------------------
-- Reset aligned to core clock
------------------------------------------------------------------------------
p_core_rst : process (sys_clk, rst_n_a_i)
begin
if rst_n_a_i = c_RST_ACTIVE then
rst_reg <= c_RST_ACTIVE;
elsif rising_edge(sys_clk) then
if p2l_pll_locked = '1' then
rst_reg <= not(c_RST_ACTIVE);
end if;
end if;
end process p_core_rst;
rst_n <= rst_reg;
-- Always active high reset for PLL
rst <= not(rst_n_a_i);
------------------------------------------------------------------------------
-- IRQ pulse forward to GN4124 GPIO
------------------------------------------------------------------------------
irq_p_o <= irq_p_i;
--============================================================================
-- P2L DataPath
--============================================================================
-----------------------------------------------------------------------------
-- p2l_des: Deserialize the P2L DDR inputs
-----------------------------------------------------------------------------
cmp_p2l_des : p2l_des
port map
(
---------------------------------------------------------
-- Clocks and reset
rst_n_i => rst_n,
sys_clk_i => sys_clk,
io_clk_i => io_clk,
serdes_strobe_i => serdes_strobe,
---------------------------------------------------------
-- P2L DDR inputs
p2l_valid_i => p2l_valid_i,
p2l_dframe_i => p2l_dframe_i,
p2l_data_i => p2l_data_i,
---------------------------------------------------------
-- P2L SDR outputs
p2l_valid_o => des_pd_valid,
p2l_dframe_o => des_pd_dframe,
p2l_data_o => des_pd_data
);
------------------------------------------------------------------------------
-- P2L local bus control signals
------------------------------------------------------------------------------
-- de-asserted to pause transfer from GN4124
p2l_rdy_o <= p2l_rdy_wbm and p2l_rdy_pdm;
-----------------------------------------------------------------------------
-- p2l_decode32: Decode the output of the p2l_des
-----------------------------------------------------------------------------
cmp_p2l_decode32 : p2l_decode32
port map
(
---------------------------------------------------------
-- Clock/Reset
clk_i => sys_clk,
rst_n_i => rst_n,
---------------------------------------------------------
-- Input from the Deserializer
--
des_p2l_valid_i => des_pd_valid,
des_p2l_dframe_i => des_pd_dframe,
des_p2l_data_i => des_pd_data,
---------------------------------------------------------
-- Decoder Outputs
--
-- Header
p2l_hdr_start_o => p2l_hdr_start,
p2l_hdr_length_o => p2l_hdr_length,
p2l_hdr_cid_o => p2l_hdr_cid,
p2l_hdr_last_o => p2l_hdr_last,
p2l_hdr_stat_o => p2l_hdr_stat,
p2l_target_mrd_o => p2l_target_mrd,
p2l_target_mwr_o => p2l_target_mwr,
p2l_master_cpld_o => p2l_master_cpld,
p2l_master_cpln_o => p2l_master_cpln,
--
-- Address
p2l_addr_start_o => p2l_addr_start,
p2l_addr_o => p2l_addr,
--
-- Data
p2l_d_valid_o => p2l_d_valid,
p2l_d_last_o => p2l_d_last,
p2l_d_o => p2l_d,
p2l_be_o => p2l_be
);
--===========================================================================
-- Core Logic Blocks
--===========================================================================
-----------------------------------------------------------------------------
-- Wishbone master
-----------------------------------------------------------------------------
cmp_wbmaster32 : wbmaster32
port map
(
---------------------------------------------------------
-- Clock/Reset
clk_i => sys_clk,
rst_n_i => rst_n,
---------------------------------------------------------
-- From P2L Decoder
--
-- Header
pd_wbm_hdr_start_i => p2l_hdr_start,
pd_wbm_hdr_length_i => p2l_hdr_length,
pd_wbm_hdr_cid_i => p2l_hdr_cid,
pd_wbm_target_mrd_i => p2l_target_mrd,
pd_wbm_target_mwr_i => p2l_target_mwr,
--
-- Address
pd_wbm_addr_start_i => p2l_addr_start,
pd_wbm_addr_i => p2l_addr,
--
-- Data
pd_wbm_data_valid_i => p2l_d_valid,
pd_wbm_data_last_i => p2l_d_last,
pd_wbm_data_i => p2l_d,
pd_wbm_be_i => p2l_be,
---------------------------------------------------------
-- P2L Control
p_wr_rdy_o => p_wr_rdy_o,
p2l_rdy_o => p2l_rdy_wbm,
p_rd_d_rdy_i => p_rd_d_rdy,
---------------------------------------------------------
-- To the L2P Interface
wbm_arb_valid_o => wbm_arb_valid,
wbm_arb_dframe_o => wbm_arb_dframe,
wbm_arb_data_o => wbm_arb_data,
wbm_arb_req_o => wbm_arb_req,
arb_wbm_gnt_i => arb_wbm_gnt,
---------------------------------------------------------
-- Wishbone Interface
wb_clk_i => csr_clk_i,
wb_adr_o => csr_adr,
wb_dat_i => csr_dat_i,
wb_dat_o => csr_dat_o,
wb_sel_o => csr_sel_o,
wb_cyc_o => csr_cyc_o,
wb_stb_o => csr_stb_o,
wb_we_o => csr_we_o,
wb_ack_i => csr_ack_i,
wb_stall_i => csr_stall_i
);
-- Adapt address bus width for top level
csr_adr_o <= '0' & csr_adr;
-----------------------------------------------------------------------------
-- DMA controller
-----------------------------------------------------------------------------
cmp_dma_controller : dma_controller
port map
(
clk_i => sys_clk,
rst_n_i => rst_n,
dma_ctrl_irq_o => dma_irq,
dma_ctrl_carrier_addr_o => dma_ctrl_carrier_addr,
dma_ctrl_host_addr_h_o => dma_ctrl_host_addr_h,
dma_ctrl_host_addr_l_o => dma_ctrl_host_addr_l,
dma_ctrl_len_o => dma_ctrl_len,
dma_ctrl_start_l2p_o => dma_ctrl_start_l2p,
dma_ctrl_start_p2l_o => dma_ctrl_start_p2l,
dma_ctrl_start_next_o => dma_ctrl_start_next,
dma_ctrl_done_i => dma_ctrl_done,
dma_ctrl_error_i => dma_ctrl_error,
dma_ctrl_byte_swap_o => dma_ctrl_byte_swap,
dma_ctrl_abort_o => dma_ctrl_abort,
next_item_carrier_addr_i => next_item_carrier_addr,
next_item_host_addr_h_i => next_item_host_addr_h,
next_item_host_addr_l_i => next_item_host_addr_l,
next_item_len_i => next_item_len,
next_item_next_l_i => next_item_next_l,
next_item_next_h_i => next_item_next_h,
next_item_attrib_i => next_item_attrib,
next_item_valid_i => next_item_valid,
wb_clk_i => dma_reg_clk_i,
wb_adr_i => dma_reg_adr_i(3 downto 0),
wb_dat_o => dma_reg_dat_o,
wb_dat_i => dma_reg_dat_i,
wb_sel_i => dma_reg_sel_i,
wb_cyc_i => dma_reg_cyc_i,
wb_stb_i => dma_reg_stb_i,
wb_we_i => dma_reg_we_i,
wb_ack_o => dma_reg_ack_o
);
-- DMA registers is a classic wishbone slave supporting single pipelined cycles
dma_reg_stall_o <= '0';
-- Status signals from DMA masters
dma_ctrl_done <= dma_ctrl_l2p_done or dma_ctrl_p2l_done;
dma_ctrl_error <= dma_ctrl_l2p_error or dma_ctrl_p2l_error;
-- Synchronise DMA IRQ pulse to csr_clk_i clock domain
l_dma_irq_sync : for I in 0 to dma_irq'length-1 generate
cmp_dma_irq_sync : pulse_synchronizer
port map(
clk_in_i => sys_clk,
clk_out_i => csr_clk_i,
pulse_i => dma_irq(I),
done_o => open,
pulse_o => dma_irq_o(I)
);
end generate l_dma_irq_sync;
-----------------------------------------------------------------------------
-- L2P DMA master
-----------------------------------------------------------------------------
cmp_l2p_dma_master : l2p_dma_master
port map
(
clk_i => sys_clk,
rst_n_i => rst_n,
dma_ctrl_target_addr_i => dma_ctrl_carrier_addr,
dma_ctrl_host_addr_h_i => dma_ctrl_host_addr_h,
dma_ctrl_host_addr_l_i => dma_ctrl_host_addr_l,
dma_ctrl_len_i => dma_ctrl_len,
dma_ctrl_start_l2p_i => dma_ctrl_start_l2p,
dma_ctrl_done_o => dma_ctrl_l2p_done,
dma_ctrl_error_o => dma_ctrl_l2p_error,
dma_ctrl_byte_swap_i => dma_ctrl_byte_swap,
dma_ctrl_abort_i => dma_ctrl_abort,
ldm_arb_valid_o => ldm_arb_valid,
ldm_arb_dframe_o => ldm_arb_dframe,
ldm_arb_data_o => ldm_arb_data,
ldm_arb_req_o => ldm_arb_req,
arb_ldm_gnt_i => arb_ldm_gnt,
l2p_edb_o => l2p_edb,
l_wr_rdy_i => l_wr_rdy,
l2p_rdy_i => l2p_rdy,
l2p_dma_clk_i => dma_clk_i,
l2p_dma_adr_o => l2p_dma_adr,
l2p_dma_dat_i => l2p_dma_dat_s2m,
l2p_dma_dat_o => l2p_dma_dat_m2s,
l2p_dma_sel_o => l2p_dma_sel,
l2p_dma_cyc_o => l2p_dma_cyc,
l2p_dma_stb_o => l2p_dma_stb,
l2p_dma_we_o => l2p_dma_we,
l2p_dma_ack_i => l2p_dma_ack,
l2p_dma_stall_i => l2p_dma_stall,
p2l_dma_cyc_i => p2l_dma_cyc
);
-----------------------------------------------------------------------------
-- P2L DMA master
-----------------------------------------------------------------------------
cmp_p2l_dma_master : p2l_dma_master
port map
(
clk_i => sys_clk,
rst_n_i => rst_n,
dma_ctrl_carrier_addr_i => dma_ctrl_carrier_addr,
dma_ctrl_host_addr_h_i => dma_ctrl_host_addr_h,
dma_ctrl_host_addr_l_i => dma_ctrl_host_addr_l,
dma_ctrl_len_i => dma_ctrl_len,
dma_ctrl_start_p2l_i => dma_ctrl_start_p2l,
dma_ctrl_start_next_i => dma_ctrl_start_next,
dma_ctrl_done_o => dma_ctrl_p2l_done,
dma_ctrl_error_o => dma_ctrl_p2l_error,
dma_ctrl_byte_swap_i => dma_ctrl_byte_swap,
dma_ctrl_abort_i => dma_ctrl_abort,
pd_pdm_hdr_start_i => p2l_hdr_start,
pd_pdm_hdr_length_i => p2l_hdr_length,
pd_pdm_hdr_cid_i => p2l_hdr_cid,
pd_pdm_master_cpld_i => p2l_master_cpld,
pd_pdm_master_cpln_i => p2l_master_cpln,
pd_pdm_data_valid_i => p2l_d_valid,
pd_pdm_data_last_i => p2l_d_last,
pd_pdm_data_i => p2l_d,
pd_pdm_be_i => p2l_be,
p2l_rdy_o => p2l_rdy_pdm,
rx_error_o => rx_error_o,
pdm_arb_valid_o => pdm_arb_valid,
pdm_arb_dframe_o => pdm_arb_dframe,
pdm_arb_data_o => pdm_arb_data,
pdm_arb_req_o => pdm_arb_req,
arb_pdm_gnt_i => arb_pdm_gnt,
p2l_dma_clk_i => dma_clk_i,
p2l_dma_adr_o => p2l_dma_adr,
p2l_dma_dat_i => p2l_dma_dat_s2m,
p2l_dma_dat_o => p2l_dma_dat_m2s,
p2l_dma_sel_o => p2l_dma_sel,
p2l_dma_cyc_o => p2l_dma_cyc,
p2l_dma_stb_o => p2l_dma_stb,
p2l_dma_we_o => p2l_dma_we,
p2l_dma_ack_i => p2l_dma_ack,
p2l_dma_stall_i => p2l_dma_stall,
l2p_dma_cyc_i => l2p_dma_cyc,
next_item_carrier_addr_o => next_item_carrier_addr,
next_item_host_addr_h_o => next_item_host_addr_h,
next_item_host_addr_l_o => next_item_host_addr_l,
next_item_len_o => next_item_len,
next_item_next_l_o => next_item_next_l,
next_item_next_h_o => next_item_next_h,
next_item_attrib_o => next_item_attrib,
next_item_valid_o => next_item_valid
);
p_dma_wb_mux : process (p2l_dma_cyc, l2p_dma_cyc, l2p_dma_we, p2l_dma_we,
l2p_dma_stb, p2l_dma_stb, l2p_dma_sel, p2l_dma_sel,
l2p_dma_dat_m2s, p2l_dma_dat_m2s, l2p_dma_adr, p2l_dma_adr)
begin
if (l2p_dma_cyc = '1') then
dma_adr_o <= l2p_dma_adr;
dma_dat_o <= l2p_dma_dat_m2s;
dma_sel_o <= l2p_dma_sel;
dma_cyc_o <= l2p_dma_cyc;
dma_stb_o <= l2p_dma_stb;
dma_we_o <= l2p_dma_we;
elsif (p2l_dma_cyc = '1') then
dma_adr_o <= p2l_dma_adr;
dma_dat_o <= p2l_dma_dat_m2s;
dma_sel_o <= p2l_dma_sel;
dma_cyc_o <= p2l_dma_cyc;
dma_stb_o <= p2l_dma_stb;
dma_we_o <= p2l_dma_we;
else
dma_adr_o <= (others => '0');
dma_dat_o <= (others => '0');
dma_sel_o <= (others => '0');
dma_cyc_o <= '0';
dma_stb_o <= '0';
dma_we_o <= '0';
end if;
end process p_dma_wb_mux;
l2p_dma_dat_s2m <= dma_dat_i;
p2l_dma_dat_s2m <= dma_dat_i;
l2p_dma_ack <= dma_ack_i;
p2l_dma_ack <= dma_ack_i;
l2p_dma_stall <= dma_stall_i;
p2l_dma_stall <= dma_stall_i;
--===========================================================================
-- L2P DataPath
--===========================================================================
-----------------------------------------------------------------------------
-- Resync GN412x L2P status signals
-----------------------------------------------------------------------------
p_l2p_status_sync : process (sys_clk, rst_n)
begin
if(rst_n = c_RST_ACTIVE) then
l_wr_rdy_t <= "00";
l_wr_rdy_t2 <= "00";
l_wr_rdy <= "00";
p_rd_d_rdy_t <= "00";
p_rd_d_rdy_t2 <= "00";
p_rd_d_rdy <= "00";
l2p_rdy_t <= '0';
l2p_rdy_t2 <= '0';
l2p_rdy <= '0';
l2p_edb_o <= '0';
l2p_edb_t <= '0';
l2p_edb_t2 <= '0';
elsif rising_edge(sys_clk) then
-- must be checked before l2p_dma_master issues a master write
l_wr_rdy_t <= l_wr_rdy_i;
l_wr_rdy_t2 <= l_wr_rdy_t;
l_wr_rdy <= l_wr_rdy_t2;
-- must be checked before wbmaster32 sends read completion with data
p_rd_d_rdy_t <= p_rd_d_rdy_i;
p_rd_d_rdy_t2 <= p_rd_d_rdy_t;
p_rd_d_rdy <= p_rd_d_rdy_t2;
-- when de-asserted, l2p_dma_master must stop sending data (de-assert l2p_valid) within 3 (or 7 ?) clock cycles
l2p_rdy_t <= l2p_rdy_i;
l2p_rdy_t2 <= l2p_rdy_t;
l2p_rdy <= l2p_rdy_t2;
--assert when packet badly ends (e.g. dma abort)
l2p_edb_t <= l2p_edb;
l2p_edb_t2 <= l2p_edb_t;
l2p_edb_o <= l2p_edb_t2;
end if;
end process p_l2p_status_sync;
-----------------------------------------------------------------------------
-- L2P arbiter, arbitrates access to GN4124
-----------------------------------------------------------------------------
cmp_l2p_arbiter : l2p_arbiter
port map
(
---------------------------------------------------------
-- Clock/Reset
clk_i => sys_clk,
rst_n_i => rst_n,
---------------------------------------------------------
-- From Wishbone master (wbm) to arbiter (arb)
wbm_arb_valid_i => wbm_arb_valid,
wbm_arb_dframe_i => wbm_arb_dframe,
wbm_arb_data_i => wbm_arb_data,
wbm_arb_req_i => wbm_arb_req,
arb_wbm_gnt_o => arb_wbm_gnt,
---------------------------------------------------------
-- From DMA controller (pdm) to arbiter (arb)
pdm_arb_valid_i => pdm_arb_valid,
pdm_arb_dframe_i => pdm_arb_dframe,
pdm_arb_data_i => pdm_arb_data,
pdm_arb_req_i => pdm_arb_req,
arb_pdm_gnt_o => arb_pdm_gnt,
---------------------------------------------------------
-- From P2L DMA master (pdm) to arbiter (arb)
ldm_arb_valid_i => ldm_arb_valid,
ldm_arb_dframe_i => ldm_arb_dframe,
ldm_arb_data_i => ldm_arb_data,
ldm_arb_req_i => ldm_arb_req,
arb_ldm_gnt_o => arb_ldm_gnt,
---------------------------------------------------------
-- From arbiter (arb) to serializer (ser)
arb_ser_valid_o => arb_ser_valid,
arb_ser_dframe_o => arb_ser_dframe,
arb_ser_data_o => arb_ser_data
);
-----------------------------------------------------------------------------
-- L2P_SER: Generate the L2P DDR Outputs
-----------------------------------------------------------------------------
cmp_l2p_ser : l2p_ser
port map
(
---------------------------------------------------------
-- Clocks and reset
rst_n_i => rst_n,
sys_clk_i => sys_clk,
io_clk_i => io_clk,
serdes_strobe_i => serdes_strobe,
---------------------------------------------------------
-- L2P SDR inputs
l2p_valid_i => arb_ser_valid,
l2p_dframe_i => arb_ser_dframe,
l2p_data_i => arb_ser_data,
---------------------------------------------------------
-- L2P DDR outputs
l2p_clk_p_o => l2p_clk_p_o,
l2p_clk_n_o => l2p_clk_n_o,
l2p_valid_o => l2p_valid_o,
l2p_dframe_o => l2p_dframe_o,
l2p_data_o => l2p_data_o
);
end rtl;
--==============================================================================
-- Architecture end (gn4124_core)
--==============================================================================
--==============================================================================
--! @file gn4124_core_pkg_s6.vhd
--==============================================================================
--! Standard library
library IEEE;
--! Standard packages
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Package for gn4124 core
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--! @brief
--! Package for components declaration and core wide constants.
--! Spartan6 FPGAs version.
--------------------------------------------------------------------------------
--! @version
--! 0.1 | mc | 01.09.2010 | File creation and Doxygen comments
--!
--! @author
--! mc : Matthieu Cattin, CERN (BE-CO-HT)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
--==============================================================================
--! Package declaration
--==============================================================================
package gn4124_core_pkg is
--==============================================================================
--! Constants declaration
--==============================================================================
constant c_RST_ACTIVE : std_logic := '0'; -- Active low reset
--==============================================================================
--! Functions declaration
--==============================================================================
function f_byte_swap (
constant enable : boolean;
signal din : std_logic_vector(31 downto 0);
signal byte_swap : std_logic_vector(1 downto 0))
return std_logic_vector;
function log2_ceil(N : natural) return positive;
--==============================================================================
--! Components declaration
--==============================================================================
-----------------------------------------------------------------------------
component gn4124_core
port
(
---------------------------------------------------------
-- Control and status
rst_n_a_i : in std_logic; -- Asynchronous reset from GN4124
status_o : out std_logic_vector(31 downto 0); -- Core status output
---------------------------------------------------------
-- P2L Direction
--
-- Source Sync DDR related signals
p2l_clk_p_i : in std_logic; -- Receiver Source Synchronous Clock+
p2l_clk_n_i : in std_logic; -- Receiver Source Synchronous Clock-
p2l_data_i : in std_logic_vector(15 downto 0); -- Parallel receive data
p2l_dframe_i : in std_logic; -- Receive Frame
p2l_valid_i : in std_logic; -- Receive Data Valid
-- P2L Control
p2l_rdy_o : out std_logic; -- Rx Buffer Full Flag
p_wr_req_i : in std_logic_vector(1 downto 0); -- PCIe Write Request
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- PCIe Write Ready
rx_error_o : out std_logic; -- Receive Error
vc_rdy_i : in std_logic_vector(1 downto 0); -- Virtual channel ready
---------------------------------------------------------
-- L2P Direction
--
-- Source Sync DDR related signals
l2p_clk_p_o : out std_logic; -- Transmitter Source Synchronous Clock+
l2p_clk_n_o : out std_logic; -- Transmitter Source Synchronous Clock-
l2p_data_o : out std_logic_vector(15 downto 0); -- Parallel transmit data
l2p_dframe_o : out std_logic; -- Transmit Data Frame
l2p_valid_o : out std_logic; -- Transmit Data Valid
-- L2P Control
l2p_edb_o : out std_logic; -- Packet termination and discard
l2p_rdy_i : in std_logic; -- Tx Buffer Full Flag
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Local-to-PCIe Write
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- PCIe-to-Local Read Response Data Ready
tx_error_i : in std_logic; -- Transmit Error
---------------------------------------------------------
-- Interrupt interface
dma_irq_o : out std_logic_vector(1 downto 0); -- Interrupts sources to IRQ manager
irq_p_i : in std_logic; -- Interrupt request pulse from IRQ manager
irq_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO
---------------------------------------------------------
-- DMA registers wishbone interface (slave classic)
dma_reg_clk_i : in std_logic;
dma_reg_adr_i : in std_logic_vector(31 downto 0);
dma_reg_dat_i : in std_logic_vector(31 downto 0);
dma_reg_sel_i : in std_logic_vector(3 downto 0);
dma_reg_stb_i : in std_logic;
dma_reg_we_i : in std_logic;
dma_reg_cyc_i : in std_logic;
dma_reg_dat_o : out std_logic_vector(31 downto 0);
dma_reg_ack_o : out std_logic;
dma_reg_stall_o : out std_logic;
---------------------------------------------------------
-- CSR wishbone interface (master pipelined)
csr_clk_i : in std_logic;
csr_adr_o : out std_logic_vector(31 downto 0);
csr_dat_o : out std_logic_vector(31 downto 0);
csr_sel_o : out std_logic_vector(3 downto 0);
csr_stb_o : out std_logic;
csr_we_o : out std_logic;
csr_cyc_o : out std_logic;
csr_dat_i : in std_logic_vector(31 downto 0);
csr_ack_i : in std_logic;
csr_stall_i : in std_logic;
---------------------------------------------------------
-- DMA wishbone interface (master pipelined)
dma_clk_i : in std_logic;
dma_adr_o : out std_logic_vector(31 downto 0);
dma_dat_o : out std_logic_vector(31 downto 0);
dma_sel_o : out std_logic_vector(3 downto 0);
dma_stb_o : out std_logic;
dma_we_o : out std_logic;
dma_cyc_o : out std_logic;
dma_dat_i : in std_logic_vector(31 downto 0);
dma_ack_i : in std_logic;
dma_stall_i : in std_logic
);
end component gn4124_core;
-----------------------------------------------------------------------------
component p2l_des
port
(
---------------------------------------------------------
-- Reset and clock
rst_n_i : in std_logic;
sys_clk_i : in std_logic;
io_clk_i : in std_logic;
serdes_strobe_i : in std_logic;
---------------------------------------------------------
-- P2L DDR inputs
p2l_valid_i : in std_logic;
p2l_dframe_i : in std_logic;
p2l_data_i : in std_logic_vector(15 downto 0);
---------------------------------------------------------
-- P2L SDR outputs
p2l_valid_o : out std_logic;
p2l_dframe_o : out std_logic;
p2l_data_o : out std_logic_vector(31 downto 0)
);
end component; -- p2l_des
-----------------------------------------------------------------------------
component p2l_decode32
port
(
---------------------------------------------------------
-- Clock/Reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- Input from the Deserializer
des_p2l_valid_i : in std_logic;
des_p2l_dframe_i : in std_logic;
des_p2l_data_i : in std_logic_vector(31 downto 0);
---------------------------------------------------------
-- Decoder Outputs
--
-- Header
p2l_hdr_start_o : out std_logic; -- Indicates Header start cycle
p2l_hdr_length_o : out std_logic_vector(9 downto 0); -- Latched LENGTH value from header
p2l_hdr_cid_o : out std_logic_vector(1 downto 0); -- Completion ID
p2l_hdr_last_o : out std_logic; -- Indicates Last packet in a completion
p2l_hdr_stat_o : out std_logic_vector(1 downto 0); -- Completion Status
p2l_target_mrd_o : out std_logic; -- Target memory read
p2l_target_mwr_o : out std_logic; -- Target memory write
p2l_master_cpld_o : out std_logic; -- Master completion with data
p2l_master_cpln_o : out std_logic; -- Master completion without data
--
-- Address
p2l_addr_start_o : out std_logic; -- Indicates Address Start
p2l_addr_o : out std_logic_vector(31 downto 0); -- Latched Address that will increment with data
--
-- Data
p2l_d_valid_o : out std_logic; -- Indicates Data is valid
p2l_d_last_o : out std_logic; -- Indicates end of the packet
p2l_d_o : out std_logic_vector(31 downto 0); -- Data
p2l_be_o : out std_logic_vector(3 downto 0) -- Byte Enable for data
);
end component; -- p2l_decode32
-----------------------------------------------------------------------------
component l2p_ser
port
(
---------------------------------------------------------
-- Reset and clock
rst_n_i : in std_logic;
sys_clk_i : in std_logic;
io_clk_i : in std_logic;
serdes_strobe_i : in std_logic;
---------------------------------------------------------
-- L2P SDR inputs
l2p_valid_i : in std_logic;
l2p_dframe_i : in std_logic;
l2p_data_i : in std_logic_vector(31 downto 0);
---------------------------------------------------------
-- L2P DDR outputs
l2p_clk_p_o : out std_logic;
l2p_clk_n_o : out std_logic;
l2p_valid_o : out std_logic;
l2p_dframe_o : out std_logic;
l2p_data_o : out std_logic_vector(15 downto 0)
);
end component; -- l2p_ser
-----------------------------------------------------------------------------
component wbmaster32
port
(
---------------------------------------------------------
-- Clock/Reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From P2L Decoder
--
-- Header
pd_wbm_hdr_start_i : in std_logic; -- Indicates Header start cycle
pd_wbm_hdr_length_i : in std_logic_vector(9 downto 0); -- Latched LENGTH value from header
pd_wbm_hdr_cid_i : in std_logic_vector(1 downto 0); -- Completion ID
pd_wbm_target_mrd_i : in std_logic; -- Target memory read
pd_wbm_target_mwr_i : in std_logic; -- Target memory write
--
-- Address
pd_wbm_addr_start_i : in std_logic; -- Indicates Address Start
pd_wbm_addr_i : in std_logic_vector(31 downto 0); -- Latched Address that will increment with data
--
-- Data
pd_wbm_data_valid_i : in std_logic; -- Indicates Data is valid
pd_wbm_data_last_i : in std_logic; -- Indicates end of the packet
pd_wbm_data_i : in std_logic_vector(31 downto 0); -- Data
pd_wbm_be_i : in std_logic_vector(3 downto 0); -- Byte Enable for data
---------------------------------------------------------
-- P2L Control
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- Ready to accept target write
p2l_rdy_o : out std_logic; -- De-asserted to pause transfer already in progress
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- Asserted when GN4124 ready to accept read completion with data
---------------------------------------------------------
-- To the L2P Interface
wbm_arb_valid_o : out std_logic; -- Read completion signals
wbm_arb_dframe_o : out std_logic; -- Toward the arbiter
wbm_arb_data_o : out std_logic_vector(31 downto 0);
wbm_arb_req_o : out std_logic;
arb_wbm_gnt_i : in std_logic;
---------------------------------------------------------
-- CSR wishbone interface
wb_clk_i : in std_logic; -- Wishbone bus clock
wb_adr_o : out std_logic_vector(30 downto 0); -- Address
wb_dat_o : out std_logic_vector(31 downto 0); -- Data out
wb_sel_o : out std_logic_vector(3 downto 0); -- Byte select
wb_stb_o : out std_logic; -- Strobe
wb_we_o : out std_logic; -- Write
wb_cyc_o : out std_logic; -- Cycle
wb_dat_i : in std_logic_vector(31 downto 0); -- Data in
wb_ack_i : in std_logic; -- Acknowledge
wb_stall_i : in std_logic -- Stall
);
end component; -- wbmaster32
-----------------------------------------------------------------------------
component dma_controller
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- Interrupt request
dma_ctrl_irq_o : out std_logic_vector(1 downto 0);
---------------------------------------------------------
-- To the L2P DMA master and P2L DMA master
dma_ctrl_carrier_addr_o : out std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_o : out std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_o : out std_logic_vector(31 downto 0);
dma_ctrl_len_o : out std_logic_vector(31 downto 0);
dma_ctrl_start_l2p_o : out std_logic; -- To the L2P DMA master
dma_ctrl_start_p2l_o : out std_logic; -- To the P2L DMA master
dma_ctrl_start_next_o : out std_logic; -- To the P2L DMA master
dma_ctrl_done_i : in std_logic;
dma_ctrl_error_i : in std_logic;
dma_ctrl_byte_swap_o : out std_logic_vector(1 downto 0);
dma_ctrl_abort_o : out std_logic;
---------------------------------------------------------
-- From P2L DMA MASTER
next_item_carrier_addr_i : in std_logic_vector(31 downto 0);
next_item_host_addr_h_i : in std_logic_vector(31 downto 0);
next_item_host_addr_l_i : in std_logic_vector(31 downto 0);
next_item_len_i : in std_logic_vector(31 downto 0);
next_item_next_l_i : in std_logic_vector(31 downto 0);
next_item_next_h_i : in std_logic_vector(31 downto 0);
next_item_attrib_i : in std_logic_vector(31 downto 0);
next_item_valid_i : in std_logic;
---------------------------------------------------------
-- Wishbone Slave Interface
wb_clk_i : in std_logic; -- Bus clock
wb_adr_i : in std_logic_vector(3 downto 0); -- Adress
wb_dat_o : out std_logic_vector(31 downto 0); -- Data in
wb_dat_i : in std_logic_vector(31 downto 0); -- Data out
wb_sel_i : in std_logic_vector(3 downto 0); -- Byte select
wb_cyc_i : in std_logic; -- Read or write cycle
wb_stb_i : in std_logic; -- Read or write strobe
wb_we_i : in std_logic; -- Write
wb_ack_o : out std_logic -- Acknowledge
);
end component; -- dma_controller
-----------------------------------------------------------------------------
component l2p_dma_master
generic (
-- Enable byte swap module (if false, no swap)
g_BYTE_SWAP : boolean := false
);
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From the DMA controller
dma_ctrl_target_addr_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_i : in std_logic_vector(31 downto 0);
dma_ctrl_len_i : in std_logic_vector(31 downto 0);
dma_ctrl_start_l2p_i : in std_logic;
dma_ctrl_done_o : out std_logic;
dma_ctrl_error_o : out std_logic;
dma_ctrl_byte_swap_i : in std_logic_vector(1 downto 0);
dma_ctrl_abort_i : in std_logic;
---------------------------------------------------------
-- To the L2P Interface (send the DMA data)
ldm_arb_valid_o : out std_logic; -- Read completion signals
ldm_arb_dframe_o : out std_logic; -- Toward the arbiter
ldm_arb_data_o : out std_logic_vector(31 downto 0);
ldm_arb_req_o : out std_logic;
arb_ldm_gnt_i : in std_logic;
---------------------------------------------------------
-- L2P channel control
l2p_edb_o : out std_logic; -- Asserted when transfer is aborted
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Asserted when GN4124 is ready to receive master write
l2p_rdy_i : in std_logic; -- De-asserted to pause transfer already in progress
---------------------------------------------------------
-- DMA Interface (Pipelined Wishbone)
l2p_dma_clk_i : in std_logic; -- Bus clock
l2p_dma_adr_o : out std_logic_vector(31 downto 0); -- Adress
l2p_dma_dat_i : in std_logic_vector(31 downto 0); -- Data in
l2p_dma_dat_o : out std_logic_vector(31 downto 0); -- Data out
l2p_dma_sel_o : out std_logic_vector(3 downto 0); -- Byte select
l2p_dma_cyc_o : out std_logic; -- Read or write cycle
l2p_dma_stb_o : out std_logic; -- Read or write strobe
l2p_dma_we_o : out std_logic; -- Write
l2p_dma_ack_i : in std_logic; -- Acknowledge
l2p_dma_stall_i : in std_logic; -- for pipelined Wishbone
p2l_dma_cyc_i : in std_logic -- P2L dma wb cycle (for bus arbitration)
);
end component; -- l2p_dma_master
-----------------------------------------------------------------------------
component p2l_dma_master
generic (
-- Enable byte swap module (if false, no swap)
g_BYTE_SWAP : boolean := false
);
port
(
---------------------------------------------------------
-- Clock/Reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From the DMA controller
dma_ctrl_carrier_addr_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_i : in std_logic_vector(31 downto 0);
dma_ctrl_len_i : in std_logic_vector(31 downto 0);
dma_ctrl_start_p2l_i : in std_logic;
dma_ctrl_start_next_i : in std_logic;
dma_ctrl_done_o : out std_logic;
dma_ctrl_error_o : out std_logic;
dma_ctrl_byte_swap_i : in std_logic_vector(1 downto 0);
dma_ctrl_abort_i : in std_logic;
---------------------------------------------------------
-- From P2L Decoder (receive the read completion)
--
-- Header
pd_pdm_hdr_start_i : in std_logic; -- Indicates Header start cycle
pd_pdm_hdr_length_i : in std_logic_vector(9 downto 0); -- Latched LENGTH value from header
pd_pdm_hdr_cid_i : in std_logic_vector(1 downto 0); -- Completion ID
pd_pdm_master_cpld_i : in std_logic; -- Master read completion with data
pd_pdm_master_cpln_i : in std_logic; -- Master read completion without data
--
-- Data
pd_pdm_data_valid_i : in std_logic; -- Indicates Data is valid
pd_pdm_data_last_i : in std_logic; -- Indicates end of the packet
pd_pdm_data_i : in std_logic_vector(31 downto 0); -- Data
pd_pdm_be_i : in std_logic_vector(3 downto 0); -- Byte Enable for data
---------------------------------------------------------
-- P2L control
p2l_rdy_o : out std_logic; -- De-asserted to pause transfer already in progress
rx_error_o : out std_logic; -- Asserted when transfer is aborted
---------------------------------------------------------
-- To the L2P Interface (send the DMA Master Read request)
pdm_arb_valid_o : out std_logic; -- Read completion signals
pdm_arb_dframe_o : out std_logic; -- Toward the arbiter
pdm_arb_data_o : out std_logic_vector(31 downto 0);
pdm_arb_req_o : out std_logic;
arb_pdm_gnt_i : in std_logic;
---------------------------------------------------------
-- DMA Interface (Pipelined Wishbone)
p2l_dma_clk_i : in std_logic; -- Bus clock
p2l_dma_adr_o : out std_logic_vector(31 downto 0); -- Adress
p2l_dma_dat_i : in std_logic_vector(31 downto 0); -- Data in
p2l_dma_dat_o : out std_logic_vector(31 downto 0); -- Data out
p2l_dma_sel_o : out std_logic_vector(3 downto 0); -- Byte select
p2l_dma_cyc_o : out std_logic; -- Read or write cycle
p2l_dma_stb_o : out std_logic; -- Read or write strobe
p2l_dma_we_o : out std_logic; -- Write
p2l_dma_ack_i : in std_logic; -- Acknowledge
p2l_dma_stall_i : in std_logic; -- for pipelined Wishbone
l2p_dma_cyc_i : in std_logic; -- L2P dma wb cycle (for bus arbitration)
---------------------------------------------------------
-- From P2L DMA MASTER
next_item_carrier_addr_o : out std_logic_vector(31 downto 0);
next_item_host_addr_h_o : out std_logic_vector(31 downto 0);
next_item_host_addr_l_o : out std_logic_vector(31 downto 0);
next_item_len_o : out std_logic_vector(31 downto 0);
next_item_next_l_o : out std_logic_vector(31 downto 0);
next_item_next_h_o : out std_logic_vector(31 downto 0);
next_item_attrib_o : out std_logic_vector(31 downto 0);
next_item_valid_o : out std_logic
);
end component; -- p2l_dma_master
-----------------------------------------------------------------------------
component l2p_arbiter
port (
---------------------------------------------------------
-- Clock/Reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From Wishbone master (wbm) to arbiter (arb)
wbm_arb_valid_i : in std_logic;
wbm_arb_dframe_i : in std_logic;
wbm_arb_data_i : in std_logic_vector(31 downto 0);
wbm_arb_req_i : in std_logic;
arb_wbm_gnt_o : out std_logic;
---------------------------------------------------------
-- From DMA controller (pdm) to arbiter (arb)
pdm_arb_valid_i : in std_logic;
pdm_arb_dframe_i : in std_logic;
pdm_arb_data_i : in std_logic_vector(31 downto 0);
pdm_arb_req_i : in std_logic;
arb_pdm_gnt_o : out std_logic;
---------------------------------------------------------
-- From P2L DMA master (ldm) to arbiter (arb)
ldm_arb_valid_i : in std_logic;
ldm_arb_dframe_i : in std_logic;
ldm_arb_data_i : in std_logic_vector(31 downto 0);
ldm_arb_req_i : in std_logic;
arb_ldm_gnt_o : out std_logic;
---------------------------------------------------------
-- From arbiter (arb) to serializer (ser)
arb_ser_valid_o : out std_logic;
arb_ser_dframe_o : out std_logic;
arb_ser_data_o : out std_logic_vector(31 downto 0)
);
end component; -- l2p_arbiter
-----------------------------------------------------------------------------
component fifo_32x512
port (
rst : in std_logic;
wr_clk : in std_logic;
rd_clk : in std_logic;
din : in std_logic_vector(31 downto 0);
wr_en : in std_logic;
rd_en : in std_logic;
prog_full_thresh_assert : in std_logic_vector(8 downto 0);
prog_full_thresh_negate : in std_logic_vector(8 downto 0);
dout : out std_logic_vector(31 downto 0);
full : out std_logic;
empty : out std_logic;
valid : out std_logic;
prog_full : out std_logic);
end component;
-----------------------------------------------------------------------------
component fifo_64x512
port (
rst : in std_logic;
wr_clk : in std_logic;
rd_clk : in std_logic;
din : in std_logic_vector(63 downto 0);
wr_en : in std_logic;
rd_en : in std_logic;
prog_full_thresh_assert : in std_logic_vector(8 downto 0);
prog_full_thresh_negate : in std_logic_vector(8 downto 0);
dout : out std_logic_vector(63 downto 0);
full : out std_logic;
empty : out std_logic;
valid : out std_logic;
prog_full : out std_logic);
end component;
end gn4124_core_pkg;
package body gn4124_core_pkg is
-----------------------------------------------------------------------------
-- Byte swap function
--
-- enable | byte_swap | din | dout
-- false | XX | ABCD | ABCD
-- true | 00 | ABCD | ABCD
-- true | 01 | ABCD | BADC
-- true | 10 | ABCD | CDAB
-- true | 11 | ABCD | DCBA
-----------------------------------------------------------------------------
function f_byte_swap (
constant enable : boolean;
signal din : std_logic_vector(31 downto 0);
signal byte_swap : std_logic_vector(1 downto 0))
return std_logic_vector is
variable dout : std_logic_vector(31 downto 0) := din;
begin
if (enable = true) then
case byte_swap is
when "00" =>
dout := din;
when "01" =>
dout := din(23 downto 16)
& din(31 downto 24)
& din(7 downto 0)
& din(15 downto 8);
when "10" =>
dout := din(15 downto 0)
& din(31 downto 16);
when "11" =>
dout := din(7 downto 0)
& din(15 downto 8)
& din(23 downto 16)
& din(31 downto 24);
when others =>
dout := din;
end case;
else
dout := din;
end if;
return dout;
end function f_byte_swap;
-----------------------------------------------------------------------------
-- Returns log of 2 of a natural number
-----------------------------------------------------------------------------
function log2_ceil(N : natural) return positive is
begin
if N <= 2 then
return 1;
elsif N mod 2 = 0 then
return 1 + log2_ceil(N/2);
else
return 1 + log2_ceil((N+1)/2);
end if;
end;
end gn4124_core_pkg;
-------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
-------------------------------------------------------------------------------
--
-- unit name: GN4124 core arbiter (arbiter.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 12-08-2010
--
-- version: 0.1
--
-- description: Arbitrates PCIe accesses between Wishbone master,
-- L2P DMA master and P2L DMA master
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
-------------------------------------------------------------------------------
-- last changes: 23-09-2010 (mcattin) Add FF on data path and
-- change valid request logic
-------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
entity l2p_arbiter is
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From Wishbone master (wbm) to arbiter (arb)
wbm_arb_valid_i : in std_logic;
wbm_arb_dframe_i : in std_logic;
wbm_arb_data_i : in std_logic_vector(31 downto 0);
wbm_arb_req_i : in std_logic;
arb_wbm_gnt_o : out std_logic;
---------------------------------------------------------
-- From P2L DMA master (pdm) to arbiter (arb)
pdm_arb_valid_i : in std_logic;
pdm_arb_dframe_i : in std_logic;
pdm_arb_data_i : in std_logic_vector(31 downto 0);
pdm_arb_req_i : in std_logic;
arb_pdm_gnt_o : out std_logic;
---------------------------------------------------------
-- From L2P DMA master (ldm) to arbiter (arb)
ldm_arb_valid_i : in std_logic;
ldm_arb_dframe_i : in std_logic;
ldm_arb_data_i : in std_logic_vector(31 downto 0);
ldm_arb_req_i : in std_logic;
arb_ldm_gnt_o : out std_logic;
---------------------------------------------------------
-- From arbiter (arb) to serializer (ser)
arb_ser_valid_o : out std_logic;
arb_ser_dframe_o : out std_logic;
arb_ser_data_o : out std_logic_vector(31 downto 0)
);
end l2p_arbiter;
architecture rtl of l2p_arbiter is
------------------------------------------------------------------------------
-- Signals declaration
------------------------------------------------------------------------------
signal wbm_arb_req_valid : std_logic;
signal pdm_arb_req_valid : std_logic;
signal ldm_arb_req_valid : std_logic;
signal arb_wbm_gnt : std_logic;
signal arb_pdm_gnt : std_logic;
signal arb_ldm_gnt : std_logic;
signal eop : std_logic; -- End of packet
signal arb_ser_valid_t : std_logic;
signal arb_ser_dframe_t : std_logic;
signal arb_ser_data_t : std_logic_vector(31 downto 0);
begin
-- A request is valid only if the access not already granted to another source
wbm_arb_req_valid <= wbm_arb_req_i and (not(arb_pdm_gnt) and not(arb_ldm_gnt));
pdm_arb_req_valid <= pdm_arb_req_i and (not(arb_wbm_gnt) and not(arb_ldm_gnt));
ldm_arb_req_valid <= ldm_arb_req_i and (not(arb_wbm_gnt) and not(arb_pdm_gnt));
-- Detect end of packet to delimit the arbitration phase
eop <= ((arb_wbm_gnt and not(wbm_arb_dframe_i) and wbm_arb_valid_i) or
(arb_pdm_gnt and not(pdm_arb_dframe_i) and pdm_arb_valid_i) or
(arb_ldm_gnt and not(ldm_arb_dframe_i) and ldm_arb_valid_i));
-----------------------------------------------------------------------------
-- Arbitration is started when a valid request is present and ends when the
-- EOP condition is detected
--
-- Strict priority arbitration scheme
-- Highest : WBM request
-- : LDM request
-- Lowest : PDM request
-----------------------------------------------------------------------------
process (clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
arb_wbm_gnt <= '0';
arb_pdm_gnt <= '0';
arb_ldm_gnt <= '0';
elsif rising_edge(clk_i) then
--if (arb_req_valid = '1') then
if (wbm_arb_req_valid = '1') then
arb_wbm_gnt <= '1';
arb_pdm_gnt <= '0';
arb_ldm_gnt <= '0';
elsif (ldm_arb_req_valid = '1') then
arb_wbm_gnt <= '0';
arb_pdm_gnt <= '0';
arb_ldm_gnt <= '1';
elsif (pdm_arb_req_valid = '1') then
arb_wbm_gnt <= '0';
arb_pdm_gnt <= '1';
arb_ldm_gnt <= '0';
elsif (eop = '1') then
arb_wbm_gnt <= '0';
arb_pdm_gnt <= '0';
arb_ldm_gnt <= '0';
end if;
end if;
end process;
process (clk_i, rst_n_i)
begin
if rst_n_i = '0' then
arb_ser_valid_t <= '0';
arb_ser_dframe_t <= '0';
arb_ser_data_t <= (others => '0');
elsif rising_edge(clk_i) then
if arb_wbm_gnt = '1' then
arb_ser_valid_t <= wbm_arb_valid_i;
arb_ser_dframe_t <= wbm_arb_dframe_i;
arb_ser_data_t <= wbm_arb_data_i;
elsif arb_pdm_gnt = '1' then
arb_ser_valid_t <= pdm_arb_valid_i;
arb_ser_dframe_t <= pdm_arb_dframe_i;
arb_ser_data_t <= pdm_arb_data_i;
elsif arb_ldm_gnt = '1' then
arb_ser_valid_t <= ldm_arb_valid_i;
arb_ser_dframe_t <= ldm_arb_dframe_i;
arb_ser_data_t <= ldm_arb_data_i;
else
arb_ser_valid_t <= '0';
arb_ser_dframe_t <= '0';
arb_ser_data_t <= (others => '0');
end if;
end if;
end process;
process (clk_i, rst_n_i)
begin
if rst_n_i = '0' then
arb_ser_valid_o <= '0';
arb_ser_dframe_o <= '0';
arb_ser_data_o <= (others => '0');
elsif rising_edge(clk_i) then
arb_ser_valid_o <= arb_ser_valid_t;
arb_ser_dframe_o <= arb_ser_dframe_t;
arb_ser_data_o <= arb_ser_data_t;
end if;
end process;
arb_wbm_gnt_o <= arb_wbm_gnt;
arb_pdm_gnt_o <= arb_pdm_gnt;
arb_ldm_gnt_o <= arb_ldm_gnt;
end rtl;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: 32-bit DMA master (l2p_dma_master.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 1.0
--
-- description: Provides a pipelined Wishbone interface to performs DMA
-- transfers from local application to PCI express host.
--
-- dependencies: general-cores library (genrams package)
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams
-- library cores from ohwr.org
--------------------------------------------------------------------------------
-- TODO: - byte enable support
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
use work.genram_pkg.all;
entity l2p_dma_master is
generic (
-- Enable byte swap module (if false, no swap)
g_BYTE_SWAP : boolean := false
);
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From the DMA controller
dma_ctrl_target_addr_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_i : in std_logic_vector(31 downto 0);
dma_ctrl_len_i : in std_logic_vector(31 downto 0);
dma_ctrl_start_l2p_i : in std_logic;
dma_ctrl_done_o : out std_logic;
dma_ctrl_error_o : out std_logic;
dma_ctrl_byte_swap_i : in std_logic_vector(1 downto 0);
dma_ctrl_abort_i : in std_logic;
---------------------------------------------------------
-- To the arbiter (L2P data)
ldm_arb_valid_o : out std_logic; -- Read completion signals
ldm_arb_dframe_o : out std_logic; -- Toward the arbiter
ldm_arb_data_o : out std_logic_vector(31 downto 0);
ldm_arb_req_o : out std_logic;
arb_ldm_gnt_i : in std_logic;
---------------------------------------------------------
-- L2P channel control
l2p_edb_o : out std_logic; -- Asserted when transfer is aborted
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Asserted when GN4124 is ready to receive master write
l2p_rdy_i : in std_logic; -- De-asserted to pause transfer already in progress
---------------------------------------------------------
-- DMA Interface (Pipelined Wishbone)
l2p_dma_clk_i : in std_logic; -- Bus clock
l2p_dma_adr_o : out std_logic_vector(31 downto 0); -- Adress
l2p_dma_dat_i : in std_logic_vector(31 downto 0); -- Data in
l2p_dma_dat_o : out std_logic_vector(31 downto 0); -- Data out
l2p_dma_sel_o : out std_logic_vector(3 downto 0); -- Byte select
l2p_dma_cyc_o : out std_logic; -- Read or write cycle
l2p_dma_stb_o : out std_logic; -- Read or write strobe
l2p_dma_we_o : out std_logic; -- Write
l2p_dma_ack_i : in std_logic; -- Acknowledge
l2p_dma_stall_i : in std_logic; -- for pipelined Wishbone
p2l_dma_cyc_i : in std_logic -- P2L dma wb cycle (for bus arbitration)
);
end l2p_dma_master;
architecture behaviour of l2p_dma_master is
-----------------------------------------------------------------------------
-- Constants declaration
-----------------------------------------------------------------------------
-- c_L2P_MAX_PAYLOAD is the maximum size (in 32-bit words) of the payload of a packet.
-- Allowed c_L2P_MAX_PAYLOAD values are: 32, 64, 128, 256, 512, 1024.
-- This constant must be set according to the GN4124 and motherboard chipset capabilities.
constant c_L2P_MAX_PAYLOAD : unsigned(10 downto 0) := to_unsigned(32, 11); -- in 32-bit words
constant c_ADDR_FIFO_FULL_THRES : integer := 500;
constant c_DATA_FIFO_FULL_THRES : integer := 500;
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
-- Target address counter
signal target_addr_cnt : unsigned(29 downto 0);
signal dma_length_cnt : unsigned(29 downto 0);
-- Sync FIFOs
signal fifo_rst_n : std_logic;
signal addr_fifo_rd : std_logic;
signal addr_fifo_valid : std_logic;
signal addr_fifo_empty : std_logic;
signal addr_fifo_dout : std_logic_vector(31 downto 0);
signal addr_fifo_din : std_logic_vector(31 downto 0);
signal addr_fifo_wr : std_logic;
signal addr_fifo_full : std_logic;
signal data_fifo_rd : std_logic;
signal data_fifo_valid : std_logic;
signal data_fifo_empty : std_logic;
signal data_fifo_dout : std_logic_vector(31 downto 0);
signal data_fifo_din : std_logic_vector(31 downto 0);
signal data_fifo_wr : std_logic;
signal data_fifo_full : std_logic;
-- Wishbone
signal wb_read_cnt : unsigned(31 downto 0);
signal wb_ack_cnt : unsigned(31 downto 0);
signal l2p_dma_cyc_t : std_logic;
signal l2p_dma_stb_t : std_logic;
-- L2P DMA Master FSM
type l2p_dma_state_type is (L2P_IDLE, L2P_WAIT_DATA, L2P_HEADER, L2P_ADDR_H,
L2P_ADDR_L, L2P_DATA, L2P_LAST_DATA, L2P_WAIT_RDY);
signal l2p_dma_current_state : l2p_dma_state_type;
-- L2P packet generator
signal s_l2p_header : std_logic_vector(31 downto 0);
signal l2p_len_cnt : unsigned(29 downto 0);
signal l2p_address_h : unsigned(31 downto 0);
signal l2p_address_l : unsigned(31 downto 0);
signal l2p_data_cnt : unsigned(10 downto 0);
signal l2p_64b_address : std_logic;
signal l2p_len_header : unsigned(9 downto 0);
signal l2p_byte_swap : std_logic_vector(1 downto 0);
signal l2p_last_packet : std_logic;
signal l2p_lbe_header : std_logic_vector(3 downto 0);
begin
------------------------------------------------------------------------------
-- Active high reset for fifo
------------------------------------------------------------------------------
-- Creates an active high reset for fifos regardless of c_RST_ACTIVE value
gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate
fifo_rst_n <= rst_n_i;
end generate;
gen_fifo_rst : if c_RST_ACTIVE = '1' generate
fifo_rst_n <= not(rst_n_i);
end generate;
------------------------------------------------------------------------------
-- Target address counter
------------------------------------------------------------------------------
p_target_cnt : process (clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
target_addr_cnt <= (others => '0');
dma_length_cnt <= (others => '0');
dma_ctrl_error_o <= '0';
addr_fifo_wr <= '0';
elsif rising_edge(clk_i) then
if (dma_ctrl_start_l2p_i = '1') then
if (l2p_dma_current_state = L2P_IDLE) then
-- dma_ctrl_target_addr_i is a byte address and target_addr_cnt is a
-- 32-bit word address
target_addr_cnt <= unsigned(dma_ctrl_target_addr_i(31 downto 2));
-- dma_ctrl_len_i is in byte and dma_length_cnt is in 32-bit word
dma_length_cnt <= unsigned(dma_ctrl_len_i(31 downto 2));
dma_ctrl_error_o <= '0';
else
-- trying to start a DMA transfert when another is still in progress
-- will gives an error
target_addr_cnt <= (others => '0');
dma_length_cnt <= (others => '0');
dma_ctrl_error_o <= '1';
end if;
elsif (dma_length_cnt /= 0 and addr_fifo_full = '0') then
-- increment the target address and write it to address fifo
addr_fifo_wr <= '1';
target_addr_cnt <= target_addr_cnt + 1;
dma_length_cnt <= dma_length_cnt - 1;
-- Adust data width, fifo width is 32 bits
addr_fifo_din <= "00" & std_logic_vector(target_addr_cnt);
else
addr_fifo_wr <= '0';
end if;
end if;
end process p_target_cnt;
------------------------------------------------------------------------------
-- Packet generator
------------------------------------------------------------------------------
-- Sends data to the host.
-- Split in several packets if amount of data exceeds max payload size.
p_pkt_gen : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
l2p_len_cnt <= (others => '0');
l2p_data_cnt <= (others => '0');
l2p_address_h <= (others => '0');
l2p_address_l <= (others => '0');
l2p_64b_address <= '0';
l2p_len_header <= (others => '0');
l2p_byte_swap <= (others => '0');
l2p_last_packet <= '0';
elsif rising_edge(clk_i) then
-- First packet
if (l2p_dma_current_state = L2P_IDLE) then
if (dma_ctrl_start_l2p_i = '1') then
-- store DMA info locally
l2p_len_cnt <= unsigned(dma_ctrl_len_i(31 downto 2));
l2p_address_h <= unsigned(dma_ctrl_host_addr_h_i);
l2p_address_l <= unsigned(dma_ctrl_host_addr_l_i);
l2p_byte_swap <= dma_ctrl_byte_swap_i;
end if;
elsif (l2p_dma_current_state = L2P_HEADER) then
-- if DMA length is bigger than the max PCIe payload size,
-- the data is split in several packets
if (l2p_len_cnt > c_L2P_MAX_PAYLOAD) then
l2p_data_cnt <= c_L2P_MAX_PAYLOAD;
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_L2P_MAX_PAYLOAD(9 downto 0);
l2p_last_packet <= '0';
elsif (l2p_len_cnt = c_L2P_MAX_PAYLOAD) then
l2p_data_cnt <= c_L2P_MAX_PAYLOAD;
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_L2P_MAX_PAYLOAD(9 downto 0);
l2p_last_packet <= '1';
else
l2p_data_cnt <= l2p_len_cnt(10 downto 0);
l2p_len_header <= l2p_len_cnt(9 downto 0);
l2p_last_packet <= '1';
end if;
-- if host address is 64-bit, generates a 64-bit address memory write
if (l2p_address_h = 0) then
l2p_64b_address <= '0';
else
l2p_64b_address <= '1';
end if;
-- Next packet (if any)
elsif (l2p_dma_current_state = L2P_ADDR_L) then
if (l2p_last_packet = '0') then
l2p_len_cnt <= l2p_len_cnt - c_L2P_MAX_PAYLOAD;
else
l2p_len_cnt <= (others => '0');
end if;
elsif (l2p_dma_current_state = L2P_DATA and data_fifo_valid = '1') then
l2p_data_cnt <= l2p_data_cnt - 1;
elsif (l2p_last_packet = '0' and l2p_dma_current_state = L2P_LAST_DATA) then
-- load the host address of the next packet
l2p_address_l <= l2p_address_l + (c_L2P_MAX_PAYLOAD * 4);
-- load the size of the next packet
if (l2p_len_cnt > c_L2P_MAX_PAYLOAD) then
l2p_data_cnt <= c_L2P_MAX_PAYLOAD;
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_L2P_MAX_PAYLOAD(9 downto 0);
l2p_last_packet <= '0';
elsif (l2p_len_cnt = c_L2P_MAX_PAYLOAD) then
l2p_data_cnt <= c_L2P_MAX_PAYLOAD;
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_L2P_MAX_PAYLOAD(9 downto 0);
l2p_last_packet <= '1';
else
l2p_data_cnt <= l2p_len_cnt(10 downto 0);
l2p_len_header <= l2p_len_cnt(9 downto 0);
l2p_last_packet <= '1';
end if;
end if;
end if;
end process p_pkt_gen;
-- Last Byte Enable must be "0000" when length = 1
l2p_lbe_header <= "0000" when l2p_len_header = 1 else "1111";
-- Packet header
s_l2p_header <= "000" --> Traffic Class
& '0' --> Snoop
& "001" & l2p_64b_address --> Header type,
-- memory write 32-bit or
-- memory write 64-bit
& l2p_lbe_header --> LBE (Last Byte Enable)
& "1111" --> FBE (First Byte Enable)
& "000" --> Reserved
& '0' --> VC (Virtual Channel)
& "00" --> Reserved
& std_logic_vector(l2p_len_header); --> Length (in 32-bit words)
-- 0x000 => 1024 words (4096 bytes)
-----------------------------------------------------------------------------
-- L2P packet write FSM
-----------------------------------------------------------------------------
process(clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
l2p_dma_current_state <= L2P_IDLE;
ldm_arb_req_o <= '0';
ldm_arb_data_o <= (others => '0');
ldm_arb_valid_o <= '0';
ldm_arb_dframe_o <= '0';
data_fifo_rd <= '0';
dma_ctrl_done_o <= '0';
l2p_edb_o <= '0';
elsif rising_edge(clk_i) then
case l2p_dma_current_state is
when L2P_IDLE =>
-- do nothing !
data_fifo_rd <= '0';
dma_ctrl_done_o <= '0';
ldm_arb_data_o <= (others => '0');
ldm_arb_valid_o <= '0';
ldm_arb_dframe_o <= '0';
l2p_edb_o <= '0';
if (data_fifo_empty = '0') then
-- We have data to send -> prepare a packet, first the header
l2p_dma_current_state <= L2P_HEADER;
-- request access to PCIe bus
ldm_arb_req_o <= '1';
end if;
when L2P_HEADER =>
if(arb_ldm_gnt_i = '1' and l_wr_rdy_i = "11") then
-- clear access request to the arbiter
-- access is granted until dframe is cleared
ldm_arb_req_o <= '0';
-- send header
ldm_arb_data_o <= s_l2p_header;
ldm_arb_valid_o <= '1';
ldm_arb_dframe_o <= '1';
if(l2p_64b_address = '1') then
-- if host address is 64-bit, we have to send an additionnal
-- 32-word containing highest bits of the host address
l2p_dma_current_state <= L2P_ADDR_H;
else
-- for 32-bit host address, we only have to send lowest bits
l2p_dma_current_state <= L2P_ADDR_L;
-- Starts reading data in the fifo now, because there is
-- 1 cycle delay until data are available
data_fifo_rd <= '1';
end if;
else
-- arbiter or GN4124 not ready to receive a new packet
ldm_arb_valid_o <= '0';
end if;
when L2P_ADDR_H =>
-- send host address 32 highest bits
ldm_arb_data_o <= std_logic_vector(l2p_address_h);
-- Now we still have to send lowest bits of the host address
l2p_dma_current_state <= L2P_ADDR_L;
-- Starts reading data in the fifo now, because there is
-- 1 cycle delay until data are available
data_fifo_rd <= '1';
when L2P_ADDR_L =>
-- send host address 32 lowest bits
ldm_arb_data_o <= std_logic_vector(l2p_address_l);
if(l2p_data_cnt <= 1) then
-- Only one 32-bit data word to send
l2p_dma_current_state <= L2P_LAST_DATA;
-- Stop reading from fifo
data_fifo_rd <= '0';
else
-- More than one data word to send
l2p_dma_current_state <= L2P_DATA;
end if;
when L2P_DATA =>
if (data_fifo_valid = '1') then
-- send data with byte swap if requested
ldm_arb_data_o <= f_byte_swap(g_BYTE_SWAP, data_fifo_dout, l2p_byte_swap);
ldm_arb_valid_o <= '1';
else
ldm_arb_valid_o <= '0';
end if;
if (dma_ctrl_abort_i = '1') then
l2p_edb_o <= '1';
l2p_dma_current_state <= L2P_IDLE;
elsif (l2p_rdy_i = '0') then
-- GN4124 not able to receive more data, have to wait
l2p_dma_current_state <= L2P_WAIT_RDY;
-- Stop reading from fifo
data_fifo_rd <= '0';
-- Invalidate data
ldm_arb_valid_o <= '0';
elsif(data_fifo_empty = '1') then
-- data not ready yet, wait for it
l2p_dma_current_state <= L2P_WAIT_DATA;
elsif(l2p_data_cnt <= 2) then
-- Only one 32-bit data word to send
l2p_dma_current_state <= L2P_LAST_DATA;
-- Stop reading from fifo
data_fifo_rd <= '0';
end if;
when L2P_WAIT_RDY =>
ldm_arb_valid_o <= '0';
if (l2p_rdy_i = '1') then
-- GN4124 is ready to receive more data
-- Validate last data read before de-assertion of l2p_rdy
ldm_arb_valid_o <= '1';
if (l2p_data_cnt <= 1) then
-- Last data word of the packet
l2p_dma_current_state <= L2P_LAST_DATA;
else
-- More data word to be sent
l2p_dma_current_state <= L2P_DATA;
-- Re-start fifo reading
data_fifo_rd <= '1';
end if;
end if;
when L2P_WAIT_DATA =>
ldm_arb_valid_o <= '0';
if(data_fifo_empty = '0') then
if(l2p_data_cnt <= 1) then
-- Only one 32-bit data word to send
l2p_dma_current_state <= L2P_LAST_DATA;
-- Stop reading from fifo
data_fifo_rd <= '0';
else
-- data ready to be send again
l2p_dma_current_state <= L2P_DATA;
end if;
end if;
when L2P_LAST_DATA =>
if (l2p_rdy_i = '0') then
-- GN4124 not able to receive more data, have to wait
-- Invalidate data
ldm_arb_valid_o <= '0';
else
-- send last data word with byte swap if requested
ldm_arb_data_o <= f_byte_swap(g_BYTE_SWAP, data_fifo_dout, l2p_byte_swap);
ldm_arb_valid_o <= '1';
-- clear dframe signal to indicate the end of packet
ldm_arb_dframe_o <= '0';
if(l2p_len_cnt > 0) then
-- There is still data to be send -> start a new packet
l2p_dma_current_state <= L2P_HEADER;
-- As the end of packet is used to delimit arbitration phases
-- we have to ask again for permission
ldm_arb_req_o <= '1';
else
-- Nomore data to send, go back to sleep
l2p_dma_current_state <= L2P_IDLE;
-- Indicate that the DMA transfer is finished
dma_ctrl_done_o <= '1';
end if;
end if;
when others =>
-- should no arrive here, but just in case...
l2p_dma_current_state <= L2P_IDLE;
ldm_arb_req_o <= '0';
ldm_arb_data_o <= (others => '0');
ldm_arb_valid_o <= '0';
ldm_arb_dframe_o <= '0';
data_fifo_rd <= '0';
dma_ctrl_done_o <= '0';
end case;
end if;
end process;
------------------------------------------------------------------------------
-- FIFOs for transition between GN4124 core and wishbone clock domain
------------------------------------------------------------------------------
cmp_addr_fifo : generic_async_fifo
generic map (
g_data_width => 32,
g_size => 512,
g_show_ahead => false,
g_with_rd_empty => true,
g_with_rd_full => false,
g_with_rd_almost_empty => false,
g_with_rd_almost_full => false,
g_with_rd_count => false,
g_with_wr_empty => false,
g_with_wr_full => false,
g_with_wr_almost_empty => false,
g_with_wr_almost_full => true,
g_with_wr_count => false,
g_almost_empty_threshold => 0,
g_almost_full_threshold => c_ADDR_FIFO_FULL_THRES)
port map (
rst_n_i => fifo_rst_n,
clk_wr_i => clk_i,
d_i => addr_fifo_din,
we_i => addr_fifo_wr,
wr_empty_o => open,
wr_full_o => open,
wr_almost_empty_o => open,
wr_almost_full_o => addr_fifo_full,
wr_count_o => open,
clk_rd_i => l2p_dma_clk_i,
q_o => addr_fifo_dout,
rd_i => addr_fifo_rd,
rd_empty_o => addr_fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open);
p_gen_addr_fifo_valid : process(l2p_dma_clk_i)
begin
if rising_edge(l2p_dma_clk_i) then
addr_fifo_valid <= addr_fifo_rd and (not addr_fifo_empty);
end if;
end process;
cmp_data_fifo : generic_async_fifo
generic map (
g_data_width => 32,
g_size => 512,
g_show_ahead => false,
g_with_rd_empty => true,
g_with_rd_full => false,
g_with_rd_almost_empty => false,
g_with_rd_almost_full => false,
g_with_rd_count => false,
g_with_wr_empty => false,
g_with_wr_full => false,
g_with_wr_almost_empty => false,
g_with_wr_almost_full => true,
g_with_wr_count => false,
g_almost_empty_threshold => 0,
g_almost_full_threshold => c_DATA_FIFO_FULL_THRES)
port map (
rst_n_i => fifo_rst_n,
clk_wr_i => l2p_dma_clk_i,
d_i => data_fifo_din,
we_i => data_fifo_wr,
wr_empty_o => open,
wr_full_o => open,
wr_almost_empty_o => open,
wr_almost_full_o => data_fifo_full,
wr_count_o => open,
clk_rd_i => clk_i,
q_o => data_fifo_dout,
rd_i => data_fifo_rd,
rd_empty_o => data_fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open);
p_gen_data_fifo_valid : process(clk_i)
begin
if rising_edge(clk_i) then
data_fifo_valid <= data_fifo_rd and (not data_fifo_empty);
end if;
end process;
data_fifo_din <= l2p_dma_dat_i;
-- latch data when receiving ack and the cycle has been initiated by this master
data_fifo_wr <= l2p_dma_ack_i and l2p_dma_cyc_t;
------------------------------------------------------------------------------
-- Pipelined wishbone master
------------------------------------------------------------------------------
-- Initatiates read transactions as long there is an address present
-- in the address fifo. Then fills the data fifo with the read data.
-- Wishbone master only make reads
l2p_dma_we_o <= '0';
l2p_dma_dat_o <= (others => '0');
-- Read address FIFO
addr_fifo_rd <= not(addr_fifo_empty)
and not(l2p_dma_stall_i)
and not(data_fifo_full)
and not(p2l_dma_cyc_i);
-- Wishbone master process
p_wb_master : process (l2p_dma_clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
l2p_dma_adr_o <= (others => '0');
l2p_dma_stb_t <= '0';
l2p_dma_cyc_t <= '0';
l2p_dma_sel_o <= (others => '0');
elsif rising_edge(l2p_dma_clk_i) then
-- adr signal management
if (addr_fifo_valid = '1') then
l2p_dma_adr_o <= addr_fifo_dout;
end if;
-- stb and sel signals management
if (addr_fifo_valid = '1') then --or (l2p_dma_stall_i = '1' and l2p_dma_stb_t = '1') then
l2p_dma_stb_t <= '1';
l2p_dma_sel_o <= (others => '1');
else
l2p_dma_stb_t <= '0';
l2p_dma_sel_o <= (others => '0');
end if;
-- cyc signal management
if (addr_fifo_valid = '1') then
l2p_dma_cyc_t <= '1';
elsif (wb_ack_cnt = wb_read_cnt-1 and l2p_dma_ack_i = '1') then
-- last ack received -> end of the transaction
l2p_dma_cyc_t <= '0';
end if;
end if;
end process p_wb_master;
-- for read back
l2p_dma_cyc_o <= l2p_dma_cyc_t;
l2p_dma_stb_o <= l2p_dma_stb_t;
-- Wishbone read cycle counter
p_wb_read_cnt : process (l2p_dma_clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
wb_read_cnt <= (others => '0');
elsif rising_edge(l2p_dma_clk_i) then
if (addr_fifo_valid = '1') then
wb_read_cnt <= wb_read_cnt + 1;
end if;
end if;
end process p_wb_read_cnt;
-- Wishbone ack counter
p_wb_ack_cnt : process (l2p_dma_clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
wb_ack_cnt <= (others => '0');
elsif rising_edge(l2p_dma_clk_i) then
if (l2p_dma_ack_i = '1' and l2p_dma_cyc_t = '1') then
wb_ack_cnt <= wb_ack_cnt + 1;
end if;
end if;
end process p_wb_ack_cnt;
end behaviour;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: L2P serializer (l2p_ser_s6.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 1.0
--
-- description: Generates the DDR L2P bus from SDR that is synchronous to the
-- core clock. Spartan6 FPGAs version.
--
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 23-09-2010 (mcattin) Always active high reset for FFs.
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
entity l2p_ser is
port
(
---------------------------------------------------------
-- Reset and clock
rst_n_i : in std_logic;
sys_clk_i : in std_logic;
io_clk_i : in std_logic;
serdes_strobe_i : in std_logic;
---------------------------------------------------------
-- L2P SDR inputs
l2p_valid_i : in std_logic;
l2p_dframe_i : in std_logic;
l2p_data_i : in std_logic_vector(31 downto 0);
---------------------------------------------------------
-- L2P DDR outputs
l2p_clk_p_o : out std_logic;
l2p_clk_n_o : out std_logic;
l2p_valid_o : out std_logic;
l2p_dframe_o : out std_logic;
l2p_data_o : out std_logic_vector(15 downto 0)
);
end l2p_ser;
architecture rtl of l2p_ser is
-----------------------------------------------------------------------------
-- Components declaration
-----------------------------------------------------------------------------
component serdes_n_to_1_s2_se
generic (
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 16) ; -- Set the number of inputs and outputs
port (
txioclk : in std_logic; -- IO Clock network
txserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset
gclk : in std_logic; -- Global clock
datain : in std_logic_vector((D*S)-1 downto 0); -- Data for output
dataout : out std_logic_vector(D-1 downto 0)) ; -- output
end component serdes_n_to_1_s2_se;
component serdes_n_to_1_s2_diff
generic (
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 1) ; -- Set the number of inputs and outputs
port (
txioclk : in std_logic; -- IO Clock network
txserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset
gclk : in std_logic; -- Global clock
datain : in std_logic_vector((D*S)-1 downto 0); -- Data for output
dataout_p : out std_logic_vector(D-1 downto 0); -- output
dataout_n : out std_logic_vector(D-1 downto 0)) ; -- output
end component serdes_n_to_1_s2_diff;
-----------------------------------------------------------------------------
-- Comnstants declaration
-----------------------------------------------------------------------------
constant S : integer := 2; -- Set the serdes factor to 2
constant D : integer := 16; -- Set the number of outputs
constant c_TX_CLK : std_logic_vector(1 downto 0) := "01";
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
-- Serdes reset
signal rst : std_logic;
-- SDR signals
signal l2p_dframe_t : std_logic_vector(1 downto 0);
signal l2p_valid_t : std_logic_vector(1 downto 0);
signal l2p_dframe_v : std_logic_vector(0 downto 0);
signal l2p_valid_v : std_logic_vector(0 downto 0);
signal l2p_clk_p_v : std_logic_vector(0 downto 0);
signal l2p_clk_n_v : std_logic_vector(0 downto 0);
begin
------------------------------------------------------------------------------
-- Active high reset for DDR FF
------------------------------------------------------------------------------
gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate
rst <= not(rst_n_i);
end generate;
gen_fifo_rst : if c_RST_ACTIVE = '1' generate
rst <= rst_n_i;
end generate;
------------------------------------------------------------------------------
-- Instantiate serialiser to generate forwarded clock
------------------------------------------------------------------------------
cmp_clk_out : serdes_n_to_1_s2_diff
generic map(
S => S,
D => 1)
port map (
txioclk => io_clk_i,
txserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
reset => rst,
datain => c_TX_CLK, -- Transmit a constant to make the clock
dataout_p => l2p_clk_p_v,
dataout_n => l2p_clk_n_v);
-- Type conversion, std_logic_vector to std_logic
l2p_clk_p_o <= l2p_clk_p_v(0);
l2p_clk_n_o <= l2p_clk_n_v(0);
------------------------------------------------------------------------------
-- Instantiate serialisers for output data lines
------------------------------------------------------------------------------
cmp_data_out : serdes_n_to_1_s2_se
generic map(
S => S,
D => D)
port map (
txioclk => io_clk_i,
txserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
reset => rst,
datain => l2p_data_i,
dataout => l2p_data_o);
------------------------------------------------------------------------------
-- Instantiate serialisers for dframe
------------------------------------------------------------------------------
cmp_dframe_out : serdes_n_to_1_s2_se
generic map(
S => S,
D => 1)
port map (
txioclk => io_clk_i,
txserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
reset => rst,
datain => l2p_dframe_t,
dataout => l2p_dframe_v);
-- Serialize two times the same value
l2p_dframe_t <= l2p_dframe_i & l2p_dframe_i;
-- Type conversion, std_logic_vector to std_logic
l2p_dframe_o <= l2p_dframe_v(0);
------------------------------------------------------------------------------
-- Instantiate serialisers for valid
------------------------------------------------------------------------------
cmp_valid_out : serdes_n_to_1_s2_se
generic map(
S => S,
D => 1)
port map (
txioclk => io_clk_i,
txserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
reset => rst,
datain => l2p_valid_t,
dataout => l2p_valid_v);
-- Serialize two times the same value
l2p_valid_t <= l2p_valid_i & l2p_valid_i;
-- Type conversion, std_logic_vector to std_logic
l2p_valid_o <= l2p_valid_v(0);
end rtl;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: P2L 32-bit datapath decoder (p2l_decode32.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 1.0
--
-- description: PCIe to local bus packet decoder - For 32-bit data path design.
--
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 27-09-2010 (mcattin) Rewrite a part of the decoder logic
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
entity p2l_decode32 is
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- Input from the deserializer
des_p2l_valid_i : in std_logic;
des_p2l_dframe_i : in std_logic;
des_p2l_data_i : in std_logic_vector(31 downto 0);
---------------------------------------------------------
-- Decoder outputs
--
-- Header
p2l_hdr_start_o : out std_logic; -- Header strobe
p2l_hdr_length_o : out std_logic_vector(9 downto 0); -- Packet length in 32-bit words multiples
p2l_hdr_cid_o : out std_logic_vector(1 downto 0); -- Completion ID
p2l_hdr_last_o : out std_logic; -- Indicates Last packet in a completion
p2l_hdr_stat_o : out std_logic_vector(1 downto 0); -- Completion Status
-- "00" = Successful completion
-- "01" = Unsupported request
-- "10" = Completer abort
-- "11" = Completion time-out
-- Packet type (for routing)
p2l_target_mrd_o : out std_logic; -- Target memory read (to wbmaster32)
p2l_target_mwr_o : out std_logic; -- Target memory write (to wbmaster32)
p2l_master_cpld_o : out std_logic; -- Master completion with data (to p2l_dma_master)
p2l_master_cpln_o : out std_logic; -- Master completion without data (to p2l_dma_master)
-- Address
p2l_addr_start_o : out std_logic; -- Address strobe
p2l_addr_o : out std_logic_vector(31 downto 0); -- Target address (in byte) that will increment with data
-- increment = 4 bytes
-- Data
p2l_d_valid_o : out std_logic; -- Indicates Data is valid
p2l_d_last_o : out std_logic; -- Indicates end of the packet
p2l_d_o : out std_logic_vector(31 downto 0); -- Data
p2l_be_o : out std_logic_vector(3 downto 0) -- Byte Enable for data
);
end p2l_decode32;
architecture rtl of p2l_decode32 is
-----------------------------------------------------------------------------
-- to_mvl Function
-----------------------------------------------------------------------------
function f_to_mvl (b : in boolean) return std_logic is
begin
if (b = true) then
return('1');
else
return('0');
end if;
end f_to_mvl;
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
signal des_p2l_valid_d : std_logic;
signal des_p2l_dframe_d : std_logic;
signal p2l_packet_start : std_logic;
signal p2l_packet_start_d : std_logic;
signal p2l_packet_end : std_logic;
signal p2l_addr_cycle : std_logic;
signal p2l_data_cycle : std_logic;
signal p2l_hdr_strobe : std_logic; -- Indicates Header start cycle
signal p2l_hdr_length : std_logic_vector(9 downto 0); -- Latched LENGTH value from header
signal p2l_hdr_cid : std_logic_vector(1 downto 0); -- Completion ID
signal p2l_hdr_last : std_logic; -- Indicates Last packet in a completion
signal p2l_hdr_stat : std_logic_vector(1 downto 0); -- Completion Status
signal p2l_addr_start : std_logic;
signal p2l_addr : unsigned(31 downto 0); -- Registered and counting Address
signal p2l_d_valid : std_logic; -- Indicates Address/Data is valid
signal p2l_d_first : std_logic;
signal p2l_d_last : std_logic; -- Indicates end of the packet
signal p2l_d : std_logic_vector(31 downto 0); -- Address/Data
signal p2l_be : std_logic_vector(3 downto 0); -- Byte Enable for data
signal p2l_hdr_fbe : std_logic_vector(3 downto 0); -- First Byte Enable
signal p2l_hdr_lbe : std_logic_vector(3 downto 0); -- Last Byte Enable
signal target_mrd : std_logic;
signal target_mwr : std_logic;
signal master_cpld : std_logic;
signal master_cpln : std_logic;
begin
-----------------------------------------------------------------------------
-- 1 tick delay version of des_p2l_valid_i and des_p2l_dframe_i,
-- for start and end frame detection
-----------------------------------------------------------------------------
process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
des_p2l_dframe_d <= '0';
des_p2l_valid_d <= '0';
elsif rising_edge(clk_i) then
des_p2l_dframe_d <= des_p2l_dframe_i;
des_p2l_valid_d <= des_p2l_valid_i;
end if;
end process;
------------------------------------------------------------------------------
-- Start and end packet detection
------------------------------------------------------------------------------
p2l_packet_start <= des_p2l_dframe_i and not(des_p2l_dframe_d) and des_p2l_valid_i;
p2l_packet_end <= des_p2l_valid_d and not(des_p2l_dframe_d);
-----------------------------------------------------------------------------
-- Decode packet type
-----------------------------------------------------------------------------
p_type_decode : process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
target_mrd <= '0';
target_mwr <= '0';
master_cpld <= '0';
master_cpln <= '0';
elsif rising_edge(clk_i) then
-- New packet starts, check type for routing
if (p2l_packet_start = '1') then
-- Target read request
target_mrd <= f_to_mvl(des_p2l_data_i(27 downto 24) = "0000");
-- Target write
target_mwr <= f_to_mvl(des_p2l_data_i(27 downto 24) = "0010");
-- Master read completion with data
master_cpld <= f_to_mvl(des_p2l_data_i(27 downto 24) = "0101");
-- Master read completion without data
master_cpln <= f_to_mvl(des_p2l_data_i(27 downto 24) = "0100");
elsif (p2l_packet_end = '1') then
target_mrd <= '0';
target_mwr <= '0';
master_cpld <= '0';
master_cpln <= '0';
end if;
end if;
end process p_type_decode;
-----------------------------------------------------------------------------
-- Packet header decoding
-----------------------------------------------------------------------------
p_header_decode : process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_hdr_strobe <= '0';
p2l_hdr_length <= (others => '0');
p2l_hdr_cid <= (others => '0');
p2l_hdr_last <= '0';
p2l_hdr_stat <= (others => '0');
p2l_hdr_fbe <= (others => '0');
p2l_hdr_lbe <= (others => '0');
elsif rising_edge(clk_i) then
if (p2l_packet_start = '1') then
p2l_hdr_strobe <= '1';
p2l_hdr_length <= des_p2l_data_i(9 downto 0);
p2l_hdr_cid <= des_p2l_data_i(11 downto 10);
p2l_hdr_last <= des_p2l_data_i(15);
if (des_p2l_data_i(26) = '1') then
-- packet type = read completion
p2l_hdr_stat <= des_p2l_data_i(17 downto 16); -- Completion status
else
-- Target read or write
p2l_hdr_fbe <= des_p2l_data_i(19 downto 16); -- First Byte Enable
p2l_hdr_lbe <= des_p2l_data_i(23 downto 20); -- Last Byte Enable
end if;
else
p2l_hdr_strobe <= '0';
end if;
end if;
end process p_header_decode;
-----------------------------------------------------------------------------
-- Packet address decoding
-----------------------------------------------------------------------------
p_addr_decode : process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_addr_cycle <= '0';
p2l_addr <= (others => '0');
p2l_addr_start <= '0';
elsif rising_edge(clk_i) then
-- Indicate address cycle(s)
-- Address cycle comes just after the header.
-- Read completion packet doesn't have an address field, then addr_cycle is not asserted.
if (p2l_packet_start = '1' and des_p2l_data_i(26) = '0') then
p2l_addr_cycle <= '1';
elsif (p2l_addr_cycle = '1' and des_p2l_valid_i = '1') then
p2l_addr_cycle <= '0';
end if;
-- Generates address strobe
-- No address strobe for read completion packets
if ((target_mwr or target_mrd) = '1') then
p2l_addr_start <= p2l_addr_cycle and des_p2l_valid_i;
else
p2l_addr_start <= '0';
end if;
-- Put address on a dedicated bus
-- Bits 1-0 are coding the BAR for target read/write
-- "00" = BAR 0
-- "01" = BAR 2
-- "10" = Expansion ROM
-- "11" = Reserved
if (p2l_addr_cycle = '1' and des_p2l_valid_i = '1' and (target_mwr or target_mrd) = '1') then
-- Latch target address
p2l_addr <= unsigned(des_p2l_data_i);
elsif (p2l_d_valid = '1' and (target_mwr or target_mrd) = '1') then
-- Increment address with data (32-bit data word => increment = +4 bytes)
p2l_addr(31 downto 2) <= p2l_addr(31 downto 2) + 1;
end if;
end if;
end process p_addr_decode;
-----------------------------------------------------------------------------
-- Packet data decoding (data strobe)
-----------------------------------------------------------------------------
p_data_decode : process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_data_cycle <= '0';
p2l_d_valid <= '0';
p2l_d_last <= '0';
p2l_d <= (others => '0');
elsif rising_edge(clk_i) then
-- Indicates data cycle(s)
-- Data cycle comes after an address cycle, exept for read completion packet
-- in this case it comes just after the header.
if ((p2l_addr_cycle = '1' or (p2l_packet_start = '1' and des_p2l_data_i(26) = '1'))
and des_p2l_valid_i = '1' and des_p2l_dframe_i = '1') then
p2l_data_cycle <= '1';
elsif (des_p2l_dframe_i = '0') then
p2l_data_cycle <= '0';
end if;
-- Generates data strobe
-- For read completion, data are valid just after the header (no address)
--if (master_cpld = '1') then
-- p2l_d_valid <= des_p2l_valid_i;
--else
p2l_d_valid <= p2l_data_cycle and des_p2l_valid_i;
--end if;
-- Generates last data signal
p2l_d_last <= p2l_data_cycle and not(des_p2l_dframe_i);
-- Latch data on the bus
if(des_p2l_valid_i = '1') then
p2l_d <= des_p2l_data_i;
end if;
end if;
end process p_data_decode;
-----------------------------------------------------------------------------
-- Byte enable
-----------------------------------------------------------------------------
p_be_decode : process (clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_be <= (others => '0');
elsif rising_edge(clk_i) then
if (p2l_addr_start = '1') then
p2l_be <= p2l_hdr_fbe; -- First Byte Enable
elsif ((p2l_data_cycle and not(des_p2l_dframe_i)) = '1') then
p2l_be <= p2l_hdr_lbe; -- Last Byte Enable
elsif(p2l_data_cycle = '1') then
p2l_be <= (others => '1'); -- Intermediate Byte Enables
end if;
end if;
end process p_be_decode;
-----------------------------------------------------------------------------
-- Assigns signals to output ports
-----------------------------------------------------------------------------
p2l_hdr_start_o <= p2l_hdr_strobe;
p2l_hdr_length_o <= p2l_hdr_length;
p2l_hdr_cid_o <= p2l_hdr_cid;
p2l_hdr_last_o <= p2l_hdr_last;
p2l_hdr_stat_o <= p2l_hdr_stat;
p2l_addr_start_o <= p2l_addr_start;
p2l_addr_o <= std_logic_vector(p2l_addr);
p2l_d_valid_o <= p2l_d_valid;
p2l_d_last_o <= p2l_d_last;
p2l_d_o <= p2l_d;
p2l_be_o <= p2l_be;
p2l_target_mrd_o <= target_mrd;
p2l_target_mwr_o <= target_mwr;
p2l_master_cpld_o <= master_cpld;
p2l_master_cpln_o <= master_cpln;
end rtl;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: P2L deserializer (p2l_des_s6.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 1.0
--
-- description: Takes the DDR P2L bus and converts to SDR that is synchronous
-- to the core clock. Spartan6 FPGAs version.
--
-- dependencies:
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 23-09-2010 (mcattin) Always active high reset for FFs.
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
entity p2l_des is
port
(
---------------------------------------------------------
-- Reset and clock
rst_n_i : in std_logic;
sys_clk_i : in std_logic;
io_clk_i : in std_logic;
serdes_strobe_i : in std_logic;
---------------------------------------------------------
-- P2L clock domain (DDR)
--
-- P2L inputs
p2l_valid_i : in std_logic;
p2l_dframe_i : in std_logic;
p2l_data_i : in std_logic_vector(15 downto 0);
---------------------------------------------------------
-- Core clock domain (SDR)
--
-- Deserialized output
p2l_valid_o : out std_logic;
p2l_dframe_o : out std_logic;
p2l_data_o : out std_logic_vector(31 downto 0)
);
end p2l_des;
architecture rtl of p2l_des is
-----------------------------------------------------------------------------
-- Components declaration
-----------------------------------------------------------------------------
component serdes_1_to_n_data_s2_se
generic (
USE_PD : boolean := false; -- Parameter to set generation of phase detector logic
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 16) ; -- Set the number of inputs and outputs
port (
use_phase_detector : in std_logic; -- Set generation of phase detector logic
datain : in std_logic_vector(D-1 downto 0); -- Input from se receiver pin
rxioclk : in std_logic; -- IO Clock network
rxserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset line
gclk : in std_logic; -- Global clock
bitslip : in std_logic; -- Bitslip control line
debug_in : in std_logic_vector(1 downto 0); -- input debug data
data_out : out std_logic_vector((D*S)-1 downto 0); -- Output data
-- Debug bus, 2D+6 = 2 lines per input (from mux and ce) + 7, leave nc if debug not required
debug : out std_logic_vector((2*D)+6 downto 0)) ;
end component serdes_1_to_n_data_s2_se;
-----------------------------------------------------------------------------
-- Comnstants declaration
-----------------------------------------------------------------------------
constant S : integer := 2; -- Set the serdes factor to 2
constant D : integer := 16; -- Set the number of inputs and outputs
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
-- Serdes reset
signal rst : std_logic;
-- SDR signals
signal p2l_valid_v : std_logic_vector(0 downto 0);
signal p2l_dframe_v : std_logic_vector(0 downto 0);
signal p2l_valid_t : std_logic_vector(1 downto 0);
signal p2l_dframe_t : std_logic_vector(1 downto 0);
signal p2l_data_t : std_logic_vector(p2l_data_o'range);
signal p2l_valid_t2 : std_logic;
signal p2l_dframe_t2 : std_logic;
signal p2l_data_t2 : std_logic_vector(p2l_data_o'range);
signal p2l_data_bitslip : std_logic_vector(1 downto 0);
signal p2l_data_bitslip_p : std_logic;
--signal p2l_ctrl_v : std_logic_vector(1 downto 0);
--signal p2l_ctrl_t : std_logic_vector(3 downto 0);
begin
------------------------------------------------------------------------------
-- Active high reset
------------------------------------------------------------------------------
gen_rst_n : if c_RST_ACTIVE = '0' generate
rst <= not(rst_n_i);
end generate;
gen_rst : if c_RST_ACTIVE = '1' generate
rst <= rst_n_i;
end generate;
------------------------------------------------------------------------------
-- data input bit slip
------------------------------------------------------------------------------
p_din_bitslip : process (sys_clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_data_bitslip <= (others => '0');
elsif rising_edge(sys_clk_i) then
p2l_data_bitslip <= p2l_data_bitslip(0) & '1';
end if;
end process p_din_bitslip;
p2l_data_bitslip_p <= p2l_data_bitslip(0) and not(p2l_data_bitslip(1));
------------------------------------------------------------------------------
-- data inputs
------------------------------------------------------------------------------
cmp_data_in : serdes_1_to_n_data_s2_se
generic map(
USE_PD => false,
S => S,
D => D)
port map (
use_phase_detector => '0', -- '1' enables the phase detector logic
datain => p2l_data_i,
rxioclk => io_clk_i,
rxserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
bitslip => '0', --p2l_data_bitslip_p,
reset => rst,
data_out => p2l_data_t,
debug_in => "00",
debug => open);
------------------------------------------------------------------------------
-- dframe input
------------------------------------------------------------------------------
cmp_dframe_in : serdes_1_to_n_data_s2_se
generic map(
USE_PD => false,
S => S,
D => 1)
port map (
use_phase_detector => '0', -- '1' enables the phase detector logic
datain => p2l_dframe_v,
rxioclk => io_clk_i,
rxserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
bitslip => '0',
reset => rst,
data_out => p2l_dframe_t,
debug_in => "00",
debug => open);
-- Type conversion, std_logic to std_logic_vector
p2l_dframe_v(0) <= p2l_dframe_i;
------------------------------------------------------------------------------
-- valid input
------------------------------------------------------------------------------
cmp_valid_in : serdes_1_to_n_data_s2_se
generic map(
USE_PD => false,
S => S,
D => 1)
port map (
use_phase_detector => '0', -- '1' enables the phase detector logic
datain => p2l_valid_v,
rxioclk => io_clk_i,
rxserdesstrobe => serdes_strobe_i,
gclk => sys_clk_i,
bitslip => '0',
reset => rst,
data_out => p2l_valid_t,
debug_in => "00",
debug => open);
-- Type conversion, std_logic to std_logic_vector
p2l_valid_v(0) <= p2l_valid_i;
p_in_sys_sync : process (sys_clk_i, rst_n_i)
begin
if rst_n_i = c_RST_ACTIVE then
p2l_data_o <= (others => '0');
p2l_dframe_o <= '0';
p2l_valid_o <= '0';
p2l_data_t2 <= (others => '0');
p2l_dframe_t2 <= '0';
p2l_valid_t2 <= '0';
elsif rising_edge(sys_clk_i) then
p2l_data_t2 <= p2l_data_t;
p2l_dframe_t2 <= p2l_dframe_t(0);
p2l_valid_t2 <= p2l_valid_t(0);
p2l_data_o <= p2l_data_t2;
p2l_dframe_o <= p2l_dframe_t2;
p2l_valid_o <= p2l_valid_t2;
end if;
end process p_in_sys_sync;
end rtl;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: 32 bit P2L DMA master (p2l_dma_master.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 31-08-2010
--
-- version: 0.1
--
-- description: Provides a pipelined Wishbone interface to performs DMA
-- transfers from PCI express host to local application.
-- This entity is also used to catch the next item in chained DMA.
--
-- dependencies: general-cores library (genrams package)
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams
-- library cores from ohwr.org
--------------------------------------------------------------------------------
-- TODO: - byte enable support.
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
use work.genram_pkg.all;
entity p2l_dma_master is
generic (
-- Enable byte swap module (if false, no swap)
g_BYTE_SWAP : boolean := false
);
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From the DMA controller
dma_ctrl_carrier_addr_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_h_i : in std_logic_vector(31 downto 0);
dma_ctrl_host_addr_l_i : in std_logic_vector(31 downto 0);
dma_ctrl_len_i : in std_logic_vector(31 downto 0);
dma_ctrl_start_p2l_i : in std_logic;
dma_ctrl_start_next_i : in std_logic;
dma_ctrl_done_o : out std_logic;
dma_ctrl_error_o : out std_logic;
dma_ctrl_byte_swap_i : in std_logic_vector(1 downto 0);
dma_ctrl_abort_i : in std_logic;
---------------------------------------------------------
-- From P2L Decoder (receive the read completion)
--
-- Header
pd_pdm_hdr_start_i : in std_logic; -- Header strobe
pd_pdm_hdr_length_i : in std_logic_vector(9 downto 0); -- Packet length in 32-bit words multiples
pd_pdm_hdr_cid_i : in std_logic_vector(1 downto 0); -- Completion ID
pd_pdm_master_cpld_i : in std_logic; -- Master read completion with data
pd_pdm_master_cpln_i : in std_logic; -- Master read completion without data
--
-- Data
pd_pdm_data_valid_i : in std_logic; -- Indicates Data is valid
pd_pdm_data_last_i : in std_logic; -- Indicates end of the packet
pd_pdm_data_i : in std_logic_vector(31 downto 0); -- Data
pd_pdm_be_i : in std_logic_vector(3 downto 0); -- Byte Enable for data
---------------------------------------------------------
-- P2L control
p2l_rdy_o : out std_logic; -- De-asserted to pause transfer already in progress
rx_error_o : out std_logic; -- Asserted when transfer is aborted
---------------------------------------------------------
-- To the P2L Interface (send the DMA Master Read request)
pdm_arb_valid_o : out std_logic; -- Read completion signals
pdm_arb_dframe_o : out std_logic; -- Toward the arbiter
pdm_arb_data_o : out std_logic_vector(31 downto 0);
pdm_arb_req_o : out std_logic;
arb_pdm_gnt_i : in std_logic;
---------------------------------------------------------
-- DMA Interface (Pipelined Wishbone)
p2l_dma_clk_i : in std_logic; -- Bus clock
p2l_dma_adr_o : out std_logic_vector(31 downto 0); -- Adress
p2l_dma_dat_i : in std_logic_vector(31 downto 0); -- Data in
p2l_dma_dat_o : out std_logic_vector(31 downto 0); -- Data out
p2l_dma_sel_o : out std_logic_vector(3 downto 0); -- Byte select
p2l_dma_cyc_o : out std_logic; -- Read or write cycle
p2l_dma_stb_o : out std_logic; -- Read or write strobe
p2l_dma_we_o : out std_logic; -- Write
p2l_dma_ack_i : in std_logic; -- Acknowledge
p2l_dma_stall_i : in std_logic; -- for pipelined Wishbone
l2p_dma_cyc_i : in std_logic; -- L2P dma wb cycle (for bus arbitration)
---------------------------------------------------------
-- To the DMA controller
next_item_carrier_addr_o : out std_logic_vector(31 downto 0);
next_item_host_addr_h_o : out std_logic_vector(31 downto 0);
next_item_host_addr_l_o : out std_logic_vector(31 downto 0);
next_item_len_o : out std_logic_vector(31 downto 0);
next_item_next_l_o : out std_logic_vector(31 downto 0);
next_item_next_h_o : out std_logic_vector(31 downto 0);
next_item_attrib_o : out std_logic_vector(31 downto 0);
next_item_valid_o : out std_logic
);
end p2l_dma_master;
architecture behaviour of p2l_dma_master is
-----------------------------------------------------------------------------
-- Constants declaration
-----------------------------------------------------------------------------
-- c_MAX_READ_REQ_SIZE is the maximum size (in 32-bit words) of the payload of a packet.
-- Allowed c_MAX_READ_REQ_SIZE values are: 32, 64, 128, 256, 512, 1024.
-- This constant must be set according to the GN4124 and motherboard chipset capabilities.
constant c_MAX_READ_REQ_SIZE : unsigned(10 downto 0) := to_unsigned(1024, 11);
constant c_TO_WB_FIFO_FULL_THRES : integer := 500;
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
-- control signals
signal is_next_item : std_logic;
signal completion_error : std_logic;
signal dma_busy_error : std_logic;
signal dma_length_error : std_logic;
signal dma_ctrl_done_t : std_logic;
signal rx_error_t : std_logic;
-- L2P packet generator
signal l2p_address_h : std_logic_vector(31 downto 0);
signal l2p_address_l : std_logic_vector(31 downto 0);
signal l2p_len_cnt : unsigned(29 downto 0);
signal l2p_len_header : unsigned(9 downto 0);
signal l2p_64b_address : std_logic;
signal s_l2p_header : std_logic_vector(31 downto 0);
signal l2p_last_packet : std_logic;
signal l2p_lbe_header : std_logic_vector(3 downto 0);
-- Target address counter
signal target_addr_cnt : unsigned(29 downto 0);
-- sync fifo
signal fifo_rst_n : std_logic;
signal to_wb_fifo_empty : std_logic;
signal to_wb_fifo_full : std_logic;
signal to_wb_fifo_rd : std_logic;
signal to_wb_fifo_wr : std_logic;
signal to_wb_fifo_din : std_logic_vector(63 downto 0);
signal to_wb_fifo_dout : std_logic_vector(63 downto 0);
signal to_wb_fifo_valid : std_logic;
signal to_wb_fifo_byte_swap : std_logic_vector(1 downto 0);
-- wishbone
signal wb_write_cnt : unsigned(31 downto 0);
signal wb_ack_cnt : unsigned(31 downto 0);
signal p2l_dma_cyc_t : std_logic;
signal p2l_dma_stb_t : std_logic;
-- P2L DMA read request FSM
type p2l_dma_state_type is (P2L_IDLE, P2L_HEADER, P2L_ADDR_H, P2L_ADDR_L, P2L_WAIT_READ_COMPLETION);
signal p2l_dma_current_state : p2l_dma_state_type;
signal p2l_data_cnt : unsigned(10 downto 0);
begin
------------------------------------------------------------------------------
-- Active high reset for fifo
------------------------------------------------------------------------------
-- Creates an active high reset for fifos regardless of c_RST_ACTIVE value
gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate
fifo_rst_n <= rst_n_i;
end generate;
gen_fifo_rst : if c_RST_ACTIVE = '1' generate
fifo_rst_n <= not(rst_n_i);
end generate;
-- Errors to DMA controller
dma_ctrl_error_o <= dma_busy_error or completion_error;
------------------------------------------------------------------------------
-- PCIe read request
------------------------------------------------------------------------------
-- Stores infofmation for read request packet
-- Can be a P2L DMA transfer or catching the next item of a chained DMA
p_read_req : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
l2p_address_h <= (others => '0');
l2p_address_l <= (others => '0');
l2p_len_cnt <= (others => '0');
l2p_len_header <= (others => '0');
l2p_64b_address <= '0';
is_next_item <= '0';
l2p_last_packet <= '0';
elsif rising_edge(clk_i) then
if (p2l_dma_current_state = P2L_IDLE) then
if (dma_ctrl_start_p2l_i = '1' or dma_ctrl_start_next_i = '1') then
-- Stores DMA info locally
l2p_address_h <= dma_ctrl_host_addr_h_i;
l2p_address_l <= dma_ctrl_host_addr_l_i;
l2p_len_cnt <= unsigned(dma_ctrl_len_i(31 downto 2)); -- dma_ctrl_len_i is in byte
if (dma_ctrl_start_next_i = '1') then
-- Catching next DMA item
is_next_item <= '1'; -- flag for data retrieve block
else
-- P2L DMA transfer
is_next_item <= '0';
end if;
if (dma_ctrl_host_addr_h_i = X"00000000") then
l2p_64b_address <= '0';
else
l2p_64b_address <= '1';
end if;
end if;
elsif (p2l_dma_current_state = P2L_HEADER) then
-- if DMA length is bigger than the max PCIe payload size,
-- we have to generate several read request
if (l2p_len_cnt > c_MAX_READ_REQ_SIZE) then
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_MAX_READ_REQ_SIZE(9 downto 0);
l2p_last_packet <= '0';
elsif (l2p_len_cnt = c_MAX_READ_REQ_SIZE) then
-- when max payload length is 1024, the header length field = 0
l2p_len_header <= c_MAX_READ_REQ_SIZE(9 downto 0);
l2p_last_packet <= '1';
else
l2p_len_header <= l2p_len_cnt(9 downto 0);
l2p_last_packet <= '1';
end if;
elsif (p2l_dma_current_state = P2L_ADDR_L) then
-- Subtract the number of word requested to generate a new read request if needed
if (l2p_last_packet = '0') then
l2p_len_cnt <= l2p_len_cnt - c_MAX_READ_REQ_SIZE;
else
l2p_len_cnt <= (others => '0');
end if;
end if;
end if;
end process p_read_req;
-- Last Byte Enable must be "0000" when length = 1
l2p_lbe_header <= "0000" when l2p_len_header = 1 else "1111";
s_l2p_header <= "000" --> Traffic Class
& '0' --> Snoop
& "000" & l2p_64b_address --> Packet type = read request (32 or 64 bits)
& l2p_lbe_header --> LBE (Last Byte Enable)
& "1111" --> FBE (First Byte Enable)
& "000" --> Reserved
& '0' --> VC (Virtual Channel)
& "01" --> CID
& std_logic_vector(l2p_len_header); --> Length (in 32-bit words)
-- 0x000 => 1024 words (4096 bytes)
-----------------------------------------------------------------------------
-- PCIe read request FSM
-----------------------------------------------------------------------------
p_read_req_fsm : process (clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
p2l_dma_current_state <= P2L_IDLE;
pdm_arb_req_o <= '0';
pdm_arb_data_o <= (others => '0');
pdm_arb_valid_o <= '0';
pdm_arb_dframe_o <= '0';
dma_ctrl_done_t <= '0';
next_item_valid_o <= '0';
completion_error <= '0';
rx_error_t <= '0';
elsif rising_edge(clk_i) then
case p2l_dma_current_state is
when P2L_IDLE =>
-- Clear status bits
dma_ctrl_done_t <= '0';
next_item_valid_o <= '0';
completion_error <= '0';
rx_error_t <= '0';
-- Start a read request when a P2L DMA is initated or when the DMA
-- controller asks for the next DMA info (in a chained DMA).
if (dma_ctrl_start_p2l_i = '1' or dma_ctrl_start_next_i = '1') then
-- request access to PCIe bus
pdm_arb_req_o <= '1';
-- prepare a packet, first the header
p2l_dma_current_state <= P2L_HEADER;
end if;
when P2L_HEADER =>
if(arb_pdm_gnt_i = '1') then
-- clear access request to the arbiter
-- access is granted until dframe is cleared
pdm_arb_req_o <= '0';
-- send header
pdm_arb_data_o <= s_l2p_header;
pdm_arb_valid_o <= '1';
pdm_arb_dframe_o <= '1';
if(l2p_64b_address = '1') then
-- if host address is 64-bit, we have to send an additionnal
-- 32-word containing highest bits of the host address
p2l_dma_current_state <= P2L_ADDR_H;
else
-- for 32-bit host address, we only have to send lowest bits
p2l_dma_current_state <= P2L_ADDR_L;
end if;
end if;
when P2L_ADDR_H =>
-- send host address 32 highest bits
pdm_arb_data_o <= l2p_address_h;
p2l_dma_current_state <= P2L_ADDR_L;
when P2L_ADDR_L =>
-- send host address 32 lowest bits
pdm_arb_data_o <= l2p_address_l;
-- clear dframe signal to indicate the end of packet
pdm_arb_dframe_o <= '0';
p2l_dma_current_state <= P2L_WAIT_READ_COMPLETION;
when P2L_WAIT_READ_COMPLETION =>
-- End of the read request packet
pdm_arb_valid_o <= '0';
if (dma_ctrl_abort_i = '1') then
rx_error_t <= '1';
p2l_dma_current_state <= P2L_IDLE;
elsif (pd_pdm_master_cpld_i = '1' and pd_pdm_data_last_i = '1'
and p2l_data_cnt <= 1) then
-- last word of read completion has been received
if (l2p_last_packet = '0') then
-- A new read request is needed, DMA size > max payload
p2l_dma_current_state <= P2L_HEADER;
-- As the end of packet is used to delimit arbitration phases
-- we have to ask again for permission
pdm_arb_req_o <= '1';
else
-- indicate end of DMA transfer
if (is_next_item = '1') then
next_item_valid_o <= '1';
else
dma_ctrl_done_t <= '1';
end if;
p2l_dma_current_state <= P2L_IDLE;
end if;
elsif (pd_pdm_master_cpln_i = '1') then
-- should not return a read completion without data
completion_error <= '1';
p2l_dma_current_state <= P2L_IDLE;
end if;
when others =>
p2l_dma_current_state <= P2L_IDLE;
pdm_arb_req_o <= '0';
pdm_arb_data_o <= (others => '0');
pdm_arb_valid_o <= '0';
pdm_arb_dframe_o <= '0';
dma_ctrl_done_t <= '0';
next_item_valid_o <= '0';
completion_error <= '0';
rx_error_t <= '0';
end case;
end if;
end process p_read_req_fsm;
------------------------------------------------------------------------------
-- Pipeline control signals
------------------------------------------------------------------------------
p_ctrl_pipe : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
rx_error_o <= '0';
dma_ctrl_done_o <= '0';
elsif rising_edge(clk_i) then
rx_error_o <= rx_error_t;
dma_ctrl_done_o <= dma_ctrl_done_t;
end if;
end process p_ctrl_pipe;
------------------------------------------------------------------------------
-- Received data counter
------------------------------------------------------------------------------
p_recv_data_cnt : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
p2l_data_cnt <= (others => '0');
elsif rising_edge(clk_i) then
if (p2l_dma_current_state = P2L_ADDR_L) then
-- Store number of 32-bit data words to be received for the current read request
if l2p_len_header = 0 then
p2l_data_cnt <= to_unsigned(1024, p2l_data_cnt'length);
else
p2l_data_cnt <= '0' & l2p_len_header;
end if;
elsif (p2l_dma_current_state = P2L_WAIT_READ_COMPLETION
and pd_pdm_data_valid_i = '1'
and pd_pdm_master_cpld_i = '1') then
-- decrement number of data to be received
p2l_data_cnt <= p2l_data_cnt - 1;
end if;
end if;
end process p_recv_data_cnt;
------------------------------------------------------------------------------
-- Next DMA item retrieve
------------------------------------------------------------------------------
p_next_item : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
next_item_carrier_addr_o <= (others => '0');
next_item_host_addr_h_o <= (others => '0');
next_item_host_addr_l_o <= (others => '0');
next_item_len_o <= (others => '0');
next_item_next_l_o <= (others => '0');
next_item_next_h_o <= (others => '0');
next_item_attrib_o <= (others => '0');
elsif rising_edge(clk_i) then
if (p2l_dma_current_state = P2L_WAIT_READ_COMPLETION
and is_next_item = '1' and pd_pdm_data_valid_i = '1') then
-- next item data are supposed to be received in the rigth order !!
case p2l_data_cnt(2 downto 0) is
when "111" =>
next_item_carrier_addr_o <= pd_pdm_data_i;
when "110" =>
next_item_host_addr_l_o <= pd_pdm_data_i;
when "101" =>
next_item_host_addr_h_o <= pd_pdm_data_i;
when "100" =>
next_item_len_o <= pd_pdm_data_i;
when "011" =>
next_item_next_l_o <= pd_pdm_data_i;
when "010" =>
next_item_next_h_o <= pd_pdm_data_i;
when "001" =>
next_item_attrib_o <= pd_pdm_data_i;
when others =>
null;
end case;
end if;
end if;
end process p_next_item;
------------------------------------------------------------------------------
-- Target address counter
------------------------------------------------------------------------------
p_addr_cnt : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
target_addr_cnt <= (others => '0');
dma_busy_error <= '0';
to_wb_fifo_din <= (others => '0');
to_wb_fifo_wr <= '0';
to_wb_fifo_byte_swap <= (others => '0');
elsif rising_edge(clk_i) then
if (dma_ctrl_start_p2l_i = '1') then
if (p2l_dma_current_state = P2L_IDLE) then
-- dma_ctrl_target_addr_i is a byte address and target_addr_cnt is a
-- 32-bit word address
target_addr_cnt <= unsigned(dma_ctrl_carrier_addr_i(31 downto 2));
-- stores byte swap info for the current DMA transfer
to_wb_fifo_byte_swap <= dma_ctrl_byte_swap_i;
else
dma_busy_error <= '1';
end if;
elsif (p2l_dma_current_state = P2L_WAIT_READ_COMPLETION
and is_next_item = '0' and pd_pdm_data_valid_i = '1') then
-- increment target address counter
target_addr_cnt <= target_addr_cnt + 1;
-- write target address and data to the sync fifo
to_wb_fifo_wr <= '1';
to_wb_fifo_din(31 downto 0) <= f_byte_swap(g_BYTE_SWAP, pd_pdm_data_i, to_wb_fifo_byte_swap);
to_wb_fifo_din(61 downto 32) <= std_logic_vector(target_addr_cnt);
else
dma_busy_error <= '0';
to_wb_fifo_wr <= '0';
end if;
end if;
end process p_addr_cnt;
------------------------------------------------------------------------------
-- FIFOs for transition between GN4124 core and wishbone clock domain
------------------------------------------------------------------------------
cmp_to_wb_fifo : generic_async_fifo
generic map (
g_data_width => 64,
g_size => 512,
g_show_ahead => false,
g_with_rd_empty => true,
g_with_rd_full => false,
g_with_rd_almost_empty => false,
g_with_rd_almost_full => false,
g_with_rd_count => false,
g_with_wr_empty => false,
g_with_wr_full => false,
g_with_wr_almost_empty => false,
g_with_wr_almost_full => true,
g_with_wr_count => false,
g_almost_empty_threshold => 0,
g_almost_full_threshold => c_TO_WB_FIFO_FULL_THRES)
port map (
rst_n_i => fifo_rst_n,
clk_wr_i => clk_i,
d_i => to_wb_fifo_din,
we_i => to_wb_fifo_wr,
wr_empty_o => open,
wr_full_o => open,
wr_almost_empty_o => open,
wr_almost_full_o => to_wb_fifo_full,
wr_count_o => open,
clk_rd_i => p2l_dma_clk_i,
q_o => to_wb_fifo_dout,
rd_i => to_wb_fifo_rd,
rd_empty_o => to_wb_fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open);
p_gen_fifo_valid : process(p2l_dma_clk_i)
begin
if rising_edge(p2l_dma_clk_i) then
to_wb_fifo_valid <= to_wb_fifo_rd and (not to_wb_fifo_empty);
end if;
end process;
-- pause transfer from GN4124 if fifo is (almost) full
p2l_rdy_o <= not(to_wb_fifo_full);
------------------------------------------------------------------------------
-- Wishbone master (write only)
------------------------------------------------------------------------------
-- fifo read
to_wb_fifo_rd <= not(to_wb_fifo_empty)
and not(p2l_dma_stall_i)
and not(l2p_dma_cyc_i);
-- write only
p2l_dma_we_o <= '1';
-- Wishbone master process
p_wb_master : process (rst_n_i, p2l_dma_clk_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
p2l_dma_cyc_t <= '0';
p2l_dma_stb_t <= '0';
p2l_dma_sel_o <= "0000";
p2l_dma_adr_o <= (others => '0');
p2l_dma_dat_o <= (others => '0');
elsif rising_edge(p2l_dma_clk_i) then
-- data and address
if (to_wb_fifo_valid = '1') then
p2l_dma_adr_o <= "00" & to_wb_fifo_dout(61 downto 32);
p2l_dma_dat_o <= to_wb_fifo_dout(31 downto 0);
end if;
-- stb and sel signals management
if (to_wb_fifo_valid = '1') then --or (p2l_dma_stall_i = '1' and p2l_dma_stb_t = '1') then
p2l_dma_stb_t <= '1';
p2l_dma_sel_o <= (others => '1');
else
p2l_dma_stb_t <= '0';
p2l_dma_sel_o <= (others => '0');
end if;
-- cyc signal management
if (to_wb_fifo_valid = '1') then
p2l_dma_cyc_t <= '1';
elsif (wb_ack_cnt = wb_write_cnt-1 and p2l_dma_ack_i = '1') then
-- last ack received -> end of the transaction
p2l_dma_cyc_t <= '0';
end if;
end if;
end process p_wb_master;
-- for read back
p2l_dma_cyc_o <= p2l_dma_cyc_t;
p2l_dma_stb_o <= p2l_dma_stb_t;
-- Wishbone write cycle counter
p_wb_write_cnt : process (p2l_dma_clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
wb_write_cnt <= (others => '0');
elsif rising_edge(p2l_dma_clk_i) then
if (to_wb_fifo_valid = '1') then
wb_write_cnt <= wb_write_cnt + 1;
end if;
end if;
end process p_wb_write_cnt;
-- Wishbone ack counter
p_wb_ack_cnt : process (p2l_dma_clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
wb_ack_cnt <= (others => '0');
elsif rising_edge(p2l_dma_clk_i) then
if (p2l_dma_ack_i = '1' and p2l_dma_cyc_t = '1') then
wb_ack_cnt <= wb_ack_cnt + 1;
end if;
end if;
end process p_wb_ack_cnt;
end behaviour;
--=============================================================================
-- @file pulse_sync_rtl.vhd
--=============================================================================
--! Standard library
library IEEE;
--! Standard packages
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--! Specific packages
-------------------------------------------------------------------------------
-- --
-- CERN, BE-CO-HT, Synchronize a pulse between two clock domains
-- --
-------------------------------------------------------------------------------
--
-- Unit name: Pulse synchronizer (pulse_sync_rtl)
--
--! @brief Synchronize a pulse between two clock domains
--!
--
--! @author Matthieu Cattin (matthieu dot cattin at cern dot ch)
--
--! @date 17\03\2009
--
--! @version v.0.1
--
--! @details
--!
--! <b>Dependencies:</b>\n
--! None
--!
--! <b>References:</b>\n
--!
--!
--! <b>Modified by:</b>\n
--! Author:
-------------------------------------------------------------------------------
--! \n\n<b>Last changes:</b>\n
--! 19.06.2009 mcattin add an extra FF in p_pulse_sync process
--! 23.10.2009 mcattin modify it to a well known pulse synchronizer
-------------------------------------------------------------------------------
--! @todo
--
-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
--=============================================================================
--! Entity declaration for Pulse synchronizer
--=============================================================================
entity pulse_synchronizer is
port (
clk_in_i : in std_logic; --! Input pulse clock domain
clk_out_i : in std_logic; --! Output pulse clock domain
pulse_i : in std_logic; --! One clk_in_i tick input pulse
done_o : out std_logic; --! Input pulse is synchronized (1 clk_in_i tick)
pulse_o : out std_logic --! One clk_out_i tick output pulse
);
end entity pulse_synchronizer;
--=============================================================================
--! Architecture declaration Pulse synchronizer
--=============================================================================
architecture rtl of pulse_synchronizer is
signal s_input_toggle : std_logic := '0';
signal s_input_sync : std_logic_vector(2 downto 0);
signal s_gotit_toggle : std_logic := '0';
signal s_gotit_sync : std_logic_vector(2 downto 0);
signal s_output_pulse : std_logic;
--=============================================================================
--! Architecture begin
--=============================================================================
begin
--*****************************************************************************
-- Begin of p_input_pulse_to_toggle
--! Process: Toggles FF output on every input pulse
--*****************************************************************************
p_input_pulse_to_toggle : process(clk_in_i)
begin
if rising_edge(clk_in_i) then
if pulse_i = '1' then
s_input_toggle <= not(s_input_toggle);
end if;
end if;
end process p_input_pulse_to_toggle;
--*****************************************************************************
-- Begin of p_input_sync
--! Process: Synchronizes input toggle to output clock domain
--*****************************************************************************
p_input_sync: process(clk_out_i)
begin
if rising_edge(clk_out_i) then
s_input_sync(0) <= s_input_toggle;
s_input_sync(1) <= s_input_sync(0);
s_input_sync(2) <= s_input_sync(1);
end if;
end process p_input_sync;
-- generates 1 tick pulse when s_input_toggle changes
s_output_pulse <= s_input_sync(1) xor s_input_sync(2);
-- assign pulse output port
pulse_o <= s_output_pulse;
--*****************************************************************************
-- Begin of p_output_pulse_to_toggle
--! Process: Toggles FF output on every output pulse
--*****************************************************************************
p_output_pulse_to_toggle : process(clk_out_i)
begin
if rising_edge(clk_out_i) then
if s_output_pulse = '1' then
s_gotit_toggle <= not(s_gotit_toggle);
end if;
end if;
end process p_output_pulse_to_toggle;
--*****************************************************************************
-- Begin of p_gotit_sync
--! Process: Synchronizes gotit toggle to input clock domain
--*****************************************************************************
p_gotit_sync: process(clk_in_i)
begin
if rising_edge(clk_in_i) then
s_gotit_sync(0) <= s_gotit_toggle;
s_gotit_sync(1) <= s_gotit_sync(0);
s_gotit_sync(2) <= s_gotit_sync(1);
end if;
end process p_gotit_sync;
-- generates 1 tick pulse when s_gotit_toggle changes
done_o <= s_gotit_sync(1) xor s_gotit_sync(2);
end architecture rtl;
--=============================================================================
--! Architecture end
--=============================================================================
------------------------------------------------------------------------------
-- Copyright (c) 2009 Xilinx, Inc.
-- This design is confidential and proprietary of Xilinx, All Rights Reserved.
------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: 1.0
-- \ \ Filename: serdes_1_to_n_clk_pll_s2_diff.vhd
-- / / Date Last Modified: November 5 2009
-- /___/ /\ Date Created: August 1 2008
-- \ \ / \
-- \___\/\___\
--
--Device: Spartan 6
--Purpose: 1-bit generic 1:n clock receiver modulefor serdes factors
-- from 2 to 8
-- Instantiates necessary clock buffers and PLL
-- Contains state machine to calibrate clock input delay line,
-- and perform bitslip if required.
-- Takes in 1 bit of differential data and deserialises this to
-- n bits for where this data is required
-- data is received LSB first
-- 0, 1, 2 ......
--
--Reference:
--
--Revision History:
-- Rev 1.0 - First created (nicks)
------------------------------------------------------------------------------
--
-- Disclaimer:
--
-- This disclaimer is not a license and does not grant any rights to the materials
-- distributed herewith. Except as otherwise provided in a valid license issued to you
-- by Xilinx, and to the maximum extent permitted by applicable law:
-- (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS,
-- AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
-- INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
-- FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract
-- or tort, including negligence, or under any other theory of liability) for any loss or damage
-- of any kind or nature related to, arising under or in connection with these materials,
-- including for any direct, or any indirect, special, incidental, or consequential loss
-- or damage (including loss of data, profits, goodwill, or any type of loss or damage suffered
-- as a result of any action brought by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the possibility of the same.
--
-- Critical Applications:
--
-- Xilinx products are not designed or intended to be fail-safe, or for use in any application
-- requiring fail-safe performance, such as life-support or safety devices or systems,
-- Class III medical devices, nuclear facilities, applications related to the deployment of airbags,
-- or any other applications that could lead to death, personal injury, or severe property or
-- environmental damage (individually and collectively, "Critical Applications"). Customer assumes
-- the sole risk and liability of any use of Xilinx products in Critical Applications, subject only
-- to applicable laws and regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.
--
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
library unisim;
use unisim.vcomponents.all;
entity serdes_1_to_n_clk_pll_s2_diff is
generic (
PLLD : integer := 1; -- Parameter to set division for PLL
PLLX : integer := 2; -- Parameter to set multiplier for PLL (7 for video links, 2 for DDR etc)
CLKIN_PERIOD : real := 5.000; -- clock period (ns) of input clock on clkin_p
S : integer := 2; -- Parameter to set the serdes factor 1..8
BS : boolean := false; -- Parameter to enable bitslip TRUE or FALSE
DIFF_TERM : boolean := false) ; -- Enable or disable internal differential termination
port (
clkin_p : in std_logic; -- Input from LVDS receiver pin
clkin_n : in std_logic; -- Input from LVDS receiver pin
reset : in std_logic; -- Reset line
pattern1 : in std_logic_vector(S-1 downto 0); -- Data to define pattern that bitslip should search for
pattern2 : in std_logic_vector(S-1 downto 0); -- Data to define alternate pattern that bitslip should search for
rxioclk : out std_logic; -- IO Clock network
rx_serdesstrobe : out std_logic; -- Parallel data capture strobe
rx_bufg_pll_x1 : out std_logic; -- Global clock
rx_pll_lckd : out std_logic; -- PLL locked - only used if a 2nd BUFPLL is required
rx_pllout_xs : out std_logic; -- Multiplied PLL clock - only used if a 2nd BUFPLL is required
bitslip : out std_logic; -- Bitslip control line
datain : out std_logic_vector(S-1 downto 0); -- Output data
rx_bufpll_lckd : out std_logic); -- BUFPLL locked
end serdes_1_to_n_clk_pll_s2_diff;
architecture arch_serdes_1_to_n_clk_pll_s2_diff of serdes_1_to_n_clk_pll_s2_diff is
signal P_clk : std_logic; -- P clock out to BUFIO2
signal buf_pll_fb_clk : std_logic; -- PLL feedback clock into BUFIOFB
signal ddly_m : std_logic; -- Master output from IODELAY1
signal ddly_s : std_logic; -- Slave output from IODELAY1
signal mdataout : std_logic_vector(7 downto 0); --
signal cascade : std_logic; --
signal pd_edge : std_logic; --
signal busys : std_logic; --
signal busym : std_logic; --
signal rx_clk_in : std_logic; --
signal feedback : std_logic; --
signal buf_P_clk : std_logic; --
signal iob_data_in : std_logic; --
signal rx_bufg_pll_x1_int : std_logic;
signal rxioclk_int : std_logic;
signal rx_serdesstrobe_int : std_logic;
signal rx_pllout_xs_int : std_logic;
signal rx_pllout_x1 : std_logic;
signal rx_pll_lckd_int : std_logic;
signal state : integer range 0 to 9;
signal bslip : std_logic;
signal count : std_logic_vector(2 downto 0);
signal busyd : std_logic;
signal counter : std_logic_vector(11 downto 0);
signal clk_iserdes_data : std_logic_vector(S-1 downto 0);
signal cal_clk : std_logic;
signal rst_clk : std_logic;
signal rx_bufplllckd : std_logic;
signal not_rx_bufpll_lckd : std_logic;
signal busy_clk : std_logic;
signal enable : std_logic;
constant RX_SWAP_CLK : std_logic := '0'; -- pinswap mask for input clock (0 = no swap (default), 1 = swap). Allows input to be connected the wrong way round to ease PCB routing.
begin
rx_bufg_pll_x1 <= rx_bufg_pll_x1_int;
rxioclk <= rxioclk_int;
rx_serdesstrobe <= rx_serdesstrobe_int;
rx_pllout_xs <= rx_pllout_xs_int;
rx_pll_lckd <= rx_pll_lckd_int;
bitslip <= bslip;
iob_clk_in : IBUFDS generic map(
DIFF_TERM => DIFF_TERM)
port map (
I => clkin_p,
IB => clkin_n,
O => rx_clk_in);
iob_data_in <= rx_clk_in xor RX_SWAP_CLK; -- Invert clock as required
busy_clk <= busym;
datain <= clk_iserdes_data;
-- Bitslip and CAL state machine
process (rx_bufg_pll_x1_int, not_rx_bufpll_lckd)
begin
if not_rx_bufpll_lckd = '1' then
state <= 0;
enable <= '0';
cal_clk <= '0';
rst_clk <= '0';
bslip <= '0';
busyd <= '1';
counter <= "000000000000";
elsif rx_bufg_pll_x1_int'event and rx_bufg_pll_x1_int = '1' then
busyd <= busy_clk;
if counter(5) = '1' then
enable <= '1';
end if;
if counter(11) = '1' then
state <= 0;
cal_clk <= '0';
rst_clk <= '0';
bslip <= '0';
busyd <= '1';
counter <= "000000000000";
else
counter <= counter + 1;
if state = 0 and enable = '1' and busyd = '0' then
state <= 1;
elsif state = 1 then -- cal high
cal_clk <= '1'; state <= 2;
elsif state = 2 and busyd = '1' then -- wait for busy high
cal_clk <= '0'; state <= 3; -- cal low
elsif state = 3 and busyd = '0' then -- wait for busy low
rst_clk <= '1'; state <= 4; -- rst high
elsif state = 4 then -- rst low
rst_clk <= '0'; state <= 5;
elsif state = 5 and busyd = '0' then -- wait for busy low
state <= 6;
count <= "000";
elsif state = 6 then -- hang around
count <= count + 1;
if count = "111" then
state <= 7;
end if;
elsif state = 7 then
if BS = true and clk_iserdes_data /= pattern1 and clk_iserdes_data /= pattern2 then
bslip <= '1'; -- bitslip needed
state <= 8;
count <= "000";
else
state <= 9;
end if;
elsif state = 8 then
bslip <= '0'; -- bitslip low
count <= count + 1;
if count = "111" then
state <= 7;
end if;
elsif state = 9 then -- repeat after a delay
state <= 9;
end if;
end if;
end if;
end process;
loop0 : for i in 0 to (S - 1) generate -- Limit the output data bus to the most significant 'S' number of bits
clk_iserdes_data(i) <= mdataout(8+i-S);
end generate;
iodelay_m : IODELAY2 generic map(
DATA_RATE => "SDR", -- <SDR>, DDR
SIM_TAPDELAY_VALUE => 50, -- nominal tap delay (sim parameter only)
IDELAY_VALUE => 0, -- {0 ... 255}
IDELAY2_VALUE => 0, -- {0 ... 255}
ODELAY_VALUE => 0, -- {0 ... 255}
IDELAY_MODE => "NORMAL", -- "NORMAL", "PCI"
SERDES_MODE => "MASTER", -- <NONE>, MASTER, SLAVE
IDELAY_TYPE => "VARIABLE_FROM_HALF_MAX", -- "DEFAULT", "DIFF_PHASE_DETECTOR", "FIXED", "VARIABLE_FROM_HALF_MAX", "VARIABLE_FROM_ZERO"
COUNTER_WRAPAROUND => "STAY_AT_LIMIT", -- <STAY_AT_LIMIT>, WRAPAROUND
DELAY_SRC => "IDATAIN") -- "IO", "IDATAIN", "ODATAIN"
port map (
IDATAIN => iob_data_in, -- data from master IOB
TOUT => open, -- tri-state signal to IOB
DOUT => open, -- output data to IOB
T => '1', -- tri-state control from OLOGIC/OSERDES2
ODATAIN => '0', -- data from OLOGIC/OSERDES2
DATAOUT => ddly_m, -- Output data 1 to ILOGIC/ISERDES2
DATAOUT2 => open, -- Output data 2 to ILOGIC/ISERDES2
IOCLK0 => rxioclk_int, -- High speed clock for calibration
IOCLK1 => '0', -- High speed clock for calibration
CLK => rx_bufg_pll_x1_int, -- Fabric clock (GCLK) for control signals
CAL => cal_clk, -- Calibrate enable signal
INC => '0', -- Increment counter
CE => '0', -- Clock Enable
RST => rst_clk, -- Reset delay line to 1/2 max in this case
BUSY => busym) ; -- output signal indicating sync circuit has finished / calibration has finished
iodelay_s : IODELAY2 generic map(
DATA_RATE => "SDR", -- <SDR>, DDR
SIM_TAPDELAY_VALUE => 50, -- nominal tap delay (sim parameter only)
IDELAY_VALUE => 0, -- {0 ... 255}
IDELAY2_VALUE => 0, -- {0 ... 255}
ODELAY_VALUE => 0, -- {0 ... 255}
IDELAY_MODE => "NORMAL", -- "NORMAL", "PCI"
SERDES_MODE => "SLAVE", -- <NONE>, MASTER, SLAVE
IDELAY_TYPE => "FIXED", -- <DEFAULT>, FIXED, VARIABLE
COUNTER_WRAPAROUND => "STAY_AT_LIMIT", -- <STAY_AT_LIMIT>, WRAPAROUND
DELAY_SRC => "IDATAIN") -- "IO", "IDATAIN", "ODATAIN"
port map (
IDATAIN => iob_data_in, -- data from slave IOB
TOUT => open, -- tri-state signal to IOB
DOUT => open, -- output data to IOB
T => '1', -- tri-state control from OLOGIC/OSERDES2
ODATAIN => '0', -- data from OLOGIC/OSERDES2
DATAOUT => ddly_s, -- Output data 1 to ILOGIC/ISERDES2
DATAOUT2 => open, -- Output data 2 to ILOGIC/ISERDES2
IOCLK0 => '0', -- High speed clock for calibration
IOCLK1 => '0', -- High speed clock for calibration
CLK => '0', -- Fabric clock (GCLK) for control signals
CAL => '0', -- Calibrate control signal, never needed as the slave supplies the clock input to the PLL
INC => '0', -- Increment counter
CE => '0', -- Clock Enable
RST => '0', -- Reset delay line
BUSY => open) ; -- output signal indicating sync circuit has finished / calibration has finished
P_clk_bufio2_inst : BUFIO2 generic map(
DIVIDE => 1, -- The DIVCLK divider divide-by value; default 1
DIVIDE_BYPASS => true) -- DIVCLK output sourced from Divider (FALSE) or from I input, by-passing Divider (TRUE); default TRUE
port map (
I => P_clk, -- P_clk input from IDELAY
IOCLK => open, -- Output Clock
DIVCLK => buf_P_clk, -- Output Divided Clock
SERDESSTROBE => open) ; -- Output SERDES strobe (Clock Enable)
P_clk_bufio2fb_inst : BUFIO2FB generic map(
DIVIDE_BYPASS => true) -- DIVCLK output sourced from Divider (FALSE) or from I input, by-passing Divider (TRUE); default TRUE
port map (
I => feedback, -- PLL generated Clock
O => buf_pll_fb_clk) ; -- PLL Output Feedback Clock
iserdes_m : ISERDES2 generic map(
DATA_WIDTH => S, -- SERDES word width. This should match the setting in BUFPLL
DATA_RATE => "SDR", -- <SDR>, DDR
BITSLIP_ENABLE => true, -- <FALSE>, TRUE
SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
INTERFACE_TYPE => "RETIMED") -- NETWORKING, NETWORKING_PIPELINED, <RETIMED>
port map (
D => ddly_m,
CE0 => '1',
CLK0 => rxioclk_int,
CLK1 => '0',
IOCE => rx_serdesstrobe_int,
RST => reset,
CLKDIV => rx_bufg_pll_x1_int,
SHIFTIN => pd_edge,
BITSLIP => bslip,
FABRICOUT => open,
DFB => open,
CFB0 => open,
CFB1 => open,
Q4 => mdataout(7),
Q3 => mdataout(6),
Q2 => mdataout(5),
Q1 => mdataout(4),
VALID => open,
INCDEC => open,
SHIFTOUT => cascade);
iserdes_s : ISERDES2 generic map(
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE => "SDR", -- <SDR>, DDR
BITSLIP_ENABLE => true, -- <FALSE>, TRUE
SERDES_MODE => "SLAVE", -- <DEFAULT>, MASTER, SLAVE
INTERFACE_TYPE => "RETIMED") -- NETWORKING, NETWORKING_PIPELINED, <RETIMED>
port map (
D => ddly_s,
CE0 => '1',
CLK0 => rxioclk_int,
CLK1 => '0',
IOCE => rx_serdesstrobe_int,
RST => reset,
CLKDIV => rx_bufg_pll_x1_int,
SHIFTIN => cascade,
BITSLIP => bslip,
FABRICOUT => open,
DFB => P_clk,
CFB0 => feedback,
CFB1 => open,
Q4 => mdataout(3),
Q3 => mdataout(2),
Q2 => mdataout(1),
Q1 => mdataout(0),
VALID => open,
INCDEC => open,
SHIFTOUT => pd_edge);
rx_pll_adv_inst : PLL_ADV generic map(
BANDWIDTH => "OPTIMIZED", -- "high", "low" or "optimized"
CLKFBOUT_MULT => PLLX, -- multiplication factor for all output clocks
CLKFBOUT_PHASE => 0.0, -- phase shift (degrees) of all output clocks
CLKIN1_PERIOD => CLKIN_PERIOD, -- clock period (ns) of input clock on clkin1
CLKIN2_PERIOD => CLKIN_PERIOD, -- clock period (ns) of input clock on clkin2
CLKOUT0_DIVIDE => 1, -- division factor for clkout0 (1 to 128)
CLKOUT0_DUTY_CYCLE => 0.5, -- duty cycle for clkout0 (0.01 to 0.99)
CLKOUT0_PHASE => 0.0, -- phase shift (degrees) for clkout0 (0.0 to 360.0)
CLKOUT1_DIVIDE => 1, -- division factor for clkout1 (1 to 128)
CLKOUT1_DUTY_CYCLE => 0.5, -- duty cycle for clkout1 (0.01 to 0.99)
CLKOUT1_PHASE => 0.0, -- phase shift (degrees) for clkout1 (0.0 to 360.0)
CLKOUT2_DIVIDE => S, -- division factor for clkout2 (1 to 128)
CLKOUT2_DUTY_CYCLE => 0.5, -- duty cycle for clkout2 (0.01 to 0.99)
CLKOUT2_PHASE => 90.0, -- phase shift (degrees) for clkout2 (0.0 to 360.0)
CLKOUT3_DIVIDE => 7, -- division factor for clkout3 (1 to 128)
CLKOUT3_DUTY_CYCLE => 0.5, -- duty cycle for clkout3 (0.01 to 0.99)
CLKOUT3_PHASE => 0.0, -- phase shift (degrees) for clkout3 (0.0 to 360.0)
CLKOUT4_DIVIDE => 7, -- division factor for clkout4 (1 to 128)
CLKOUT4_DUTY_CYCLE => 0.5, -- duty cycle for clkout4 (0.01 to 0.99)
CLKOUT4_PHASE => 0.0, -- phase shift (degrees) for clkout4 (0.0 to 360.0)
CLKOUT5_DIVIDE => 7, -- division factor for clkout5 (1 to 128)
CLKOUT5_DUTY_CYCLE => 0.5, -- duty cycle for clkout5 (0.01 to 0.99)
CLKOUT5_PHASE => 0.0, -- phase shift (degrees) for clkout5 (0.0 to 360.0)
-- COMPENSATION => "SOURCE_SYNCHRONOUS", -- "SYSTEM_SYNCHRONOUS", "SOURCE_SYNCHRONOUS", "INTERNAL", "EXTERNAL", "DCM2PLL", "PLL2DCM"
DIVCLK_DIVIDE => PLLD, -- division factor for all clocks (1 to 52)
CLK_FEEDBACK => "CLKOUT0",
REF_JITTER => 0.100) -- input reference jitter (0.000 to 0.999 ui%)
port map (
CLKFBDCM => open, -- output feedback signal used when pll feeds a dcm
CLKFBOUT => open, -- general output feedback signal
CLKOUT0 => rx_pllout_xs_int, -- x7 clock for transmitter
CLKOUT1 => open,
CLKOUT2 => rx_pllout_x1, -- x1 clock for BUFG
CLKOUT3 => open, -- one of six general clock output signals
CLKOUT4 => open, -- one of six general clock output signals
CLKOUT5 => open, -- one of six general clock output signals
CLKOUTDCM0 => open, -- one of six clock outputs to connect to the dcm
CLKOUTDCM1 => open, -- one of six clock outputs to connect to the dcm
CLKOUTDCM2 => open, -- one of six clock outputs to connect to the dcm
CLKOUTDCM3 => open, -- one of six clock outputs to connect to the dcm
CLKOUTDCM4 => open, -- one of six clock outputs to connect to the dcm
CLKOUTDCM5 => open, -- one of six clock outputs to connect to the dcm
DO => open, -- dynamic reconfig data output (16-bits)
DRDY => open, -- dynamic reconfig ready output
LOCKED => rx_pll_lckd_int, -- active high pll lock signal
CLKFBIN => buf_pll_fb_clk, -- clock feedback input
CLKIN1 => buf_P_clk, -- primary clock input
CLKIN2 => '0', -- secondary clock input
CLKINSEL => '1', -- selects '1' = clkin1, '0' = clkin2
DADDR => "00000", -- dynamic reconfig address input (5-bits)
DCLK => '0', -- dynamic reconfig clock input
DEN => '0', -- dynamic reconfig enable input
DI => "0000000000000000", -- dynamic reconfig data input (16-bits)
DWE => '0', -- dynamic reconfig write enable input
RST => reset, -- asynchronous pll reset
REL => '0') ; -- used to force the state of the PFD outputs (test only)
bufg_135 : BUFG port map (I => rx_pllout_x1, O => rx_bufg_pll_x1_int);
rx_bufpll_inst : BUFPLL generic map(
DIVIDE => S) -- PLLIN0 divide-by value to produce rx_serdesstrobe (1 to 8); default 1
port map (
PLLIN => rx_pllout_xs_int, -- PLL Clock input
GCLK => rx_bufg_pll_x1_int, -- Global Clock input
LOCKED => rx_pll_lckd_int, -- Clock0 locked input
IOCLK => rxioclk_int, -- Output PLL Clock
LOCK => rx_bufplllckd, -- BUFPLL Clock and strobe locked
serdesstrobe => rx_serdesstrobe_int) ; -- Output SERDES strobe
rx_bufpll_lckd <= rx_pll_lckd_int and rx_bufplllckd;
not_rx_bufpll_lckd <= not (rx_pll_lckd_int and rx_bufplllckd);
end arch_serdes_1_to_n_clk_pll_s2_diff;
------------------------------------------------------------------------------
-- Copyright (c) 2009 Xilinx, Inc.
-- This design is confidential and proprietary of Xilinx, All Rights Reserved.
------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: 1.0
-- \ \ Filename: serdes_1_to_n_data_s2_se.vhd
-- / / Date Last Modified: November 5 2009
-- /___/ /\ Date Created: August 1 2008
-- \ \ / \
-- \___\/\___\
--
--Device: Spartan 6
--Purpose: D-bit generic 1:n data receiver module with se inputs
-- Takes in 1 bit of se data and deserialises this to n bits
-- data is received LSB first
-- Serial input words
-- Line0 : 0, ...... DS-(S+1)
-- Line1 : 1, ...... DS-(S+2)
-- Line(D-1) : . .
-- Line0(D) : D-1, ...... DS
-- Parallel output word
-- DS, DS-1 ..... 1, 0
--
-- Includes state machine to control CAL and the phase detector
-- Data inversion can be accomplished via the RX_RX_SWAP_MASK
-- parameter if required
--
--Reference:
--
--Revision History:
-- Rev 1.0 - First created (nicks)
------------------------------------------------------------------------------
--
-- Disclaimer:
--
-- This disclaimer is not a license and does not grant any rights to the materials
-- distributed herewith. Except as otherwise provided in a valid license issued to you
-- by Xilinx, and to the maximum extent permitted by applicable law:
-- (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS,
-- AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
-- INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
-- FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract
-- or tort, including negligence, or under any other theory of liability) for any loss or damage
-- of any kind or nature related to, arising under or in connection with these materials,
-- including for any direct, or any indirect, special, incidental, or consequential loss
-- or damage (including loss of data, profits, goodwill, or any type of loss or damage suffered
-- as a result of any action brought by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the possibility of the same.
--
-- Critical Applications:
--
-- Xilinx products are not designed or intended to be fail-safe, or for use in any application
-- requiring fail-safe performance, such as life-support or safety devices or systems,
-- Class III medical devices, nuclear facilities, applications related to the deployment of airbags,
-- or any other applications that could lead to death, personal injury, or severe property or
-- environmental damage (individually and collectively, "Critical Applications"). Customer assumes
-- the sole risk and liability of any use of Xilinx products in Critical Applications, subject only
-- to applicable laws and regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.
--
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
library unisim;
use unisim.vcomponents.all;
entity serdes_1_to_n_data_s2_se is
generic (
USE_PD : boolean := false; -- Parameter to set generation of phase detector logic
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 16) ; -- Set the number of inputs and outputs
port (
use_phase_detector : in std_logic; -- Set generation of phase detector logic
datain : in std_logic_vector(D-1 downto 0); -- Input from se receiver pin
rxioclk : in std_logic; -- IO Clock network
rxserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset line
gclk : in std_logic; -- Global clock
bitslip : in std_logic; -- Bitslip control line
debug_in : in std_logic_vector(1 downto 0); -- input debug data
data_out : out std_logic_vector((D*S)-1 downto 0); -- Output data
debug : out std_logic_vector((2*D)+6 downto 0)) ; -- Debug bus, 2D+6 = 2 lines per input (from mux and ce) + 7, leave nc if debug not required
end serdes_1_to_n_data_s2_se;
architecture arch_serdes_1_to_n_data_s2_se of serdes_1_to_n_data_s2_se is
signal ddly_m : std_logic_vector(D-1 downto 0); -- Master output from IODELAY1
signal ddly_s : std_logic_vector(D-1 downto 0); -- Slave output from IODELAY1
signal cascade : std_logic_vector(D-1 downto 0);
signal busys : std_logic_vector(D-1 downto 0);
signal rx_data_in : std_logic_vector(D-1 downto 0);
signal rx_data_in_fix : std_logic_vector(D-1 downto 0);
signal state : integer range 0 to 8;
signal busyd : std_logic_vector(D-1 downto 0);
signal cal_data_sint : std_logic;
signal ce_data_inta : std_logic;
signal busy_data : std_logic_vector(D-1 downto 0);
signal busy_data_d : std_logic;
signal counter : std_logic_vector(8 downto 0);
signal enable : std_logic;
signal pd_edge : std_logic_vector(D-1 downto 0);
signal cal_data_slave : std_logic;
signal cal_data_master : std_logic;
signal valid_data : std_logic_vector(D-1 downto 0);
signal valid_data_d : std_logic;
signal rst_data : std_logic;
signal mdataout : std_logic_vector((8*D)-1 downto 0);
signal pdcounter : std_logic_vector(4 downto 0);
signal inc_data : std_logic;
signal ce_data : std_logic_vector(D-1 downto 0);
signal inc_data_int : std_logic;
signal incdec_data : std_logic_vector(D-1 downto 0);
signal incdec_data_d : std_logic;
signal flag : std_logic;
signal mux : std_logic_vector(D-1 downto 0);
signal incdec_data_or : std_logic_vector(D downto 0);
signal valid_data_or : std_logic_vector(D downto 0);
signal busy_data_or : std_logic_vector(D downto 0);
signal incdec_data_im : std_logic_vector(D-1 downto 0);
signal valid_data_im : std_logic_vector(D-1 downto 0);
signal all_ce : std_logic_vector(D-1 downto 0);
constant RX_SWAP_MASK : std_logic_vector(D-1 downto 0) := (others => '0'); -- pinswap mask for input bits (0 = no swap (default), 1 = swap). Allows inputs to be connected the wrong way round to ease PCB routing.
begin
busy_data <= busys;
debug <= mux & cal_data_master & rst_data & cal_data_slave & busy_data_d & inc_data & ce_data & valid_data_d & incdec_data_d;
cal_data_slave <= cal_data_sint;
process (gclk, reset)
begin
if reset = '1' then
state <= 0;
cal_data_master <= '0';
cal_data_sint <= '0';
counter <= (others => '0');
enable <= '0';
counter <= (others => '0');
mux <= (0 => '1', others => '0');
elsif gclk'event and gclk = '1' then
counter <= counter + 1;
if counter(8) = '1' then
counter <= "000000000";
end if;
if counter(5) = '1' then
enable <= '1';
end if;
if state = 0 and enable = '1' then -- Wait for all IODELAYs to be available
cal_data_master <= '0';
cal_data_sint <= '0';
rst_data <= '0';
if busy_data_d = '0' then
state <= 1;
end if;
elsif state = 1 then -- Issue calibrate command to both master and slave
cal_data_master <= '1';
cal_data_sint <= '1';
if busy_data_d = '1' then -- and wait for command to be accepted
state <= 2;
end if;
elsif state = 2 then -- Now RST all master and slave IODELAYs
cal_data_master <= '0';
cal_data_sint <= '0';
if busy_data_d = '0' then
rst_data <= '1';
state <= 3;
end if;
elsif state = 3 then -- Wait for all IODELAYs to be available
rst_data <= '0';
if busy_data_d = '0' then
state <= 4;
end if;
elsif state = 4 then -- Hang around
if counter(8) = '1' then
state <= 5;
end if;
elsif state = 5 then -- Calibrate slave only
if busy_data_d = '0' then
cal_data_sint <= '1';
state <= 6;
if D /= 1 then
mux <= mux(D-2 downto 0) & mux(D-1);
end if;
end if;
elsif state = 6 then -- Wait for command to be accepted
if busy_data_d = '1' then
cal_data_sint <= '0';
state <= 7;
end if;
elsif state = 7 then -- Wait for all IODELAYs to be available, ie CAL command finished
cal_data_sint <= '0';
if busy_data_d = '0' then
state <= 4;
end if;
end if;
end if;
end process;
process (gclk, reset)
begin
if reset = '1' then
pdcounter <= "10000";
ce_data_inta <= '0';
flag <= '0';
elsif gclk'event and gclk = '1' then
busy_data_d <= busy_data_or(D);
if use_phase_detector = '1' then -- decide whther pd is used
incdec_data_d <= incdec_data_or(D);
valid_data_d <= valid_data_or(D);
if ce_data_inta = '1' then
ce_data <= mux;
else
ce_data <= (others => '0');
end if;
if state = 7 then
flag <= '0';
elsif state /= 4 or busy_data_d = '1' then -- Reset filter if state machine issues a cal command or unit is busy
pdcounter <= "10000";
ce_data_inta <= '0';
elsif pdcounter = "11111" and flag = '0' then -- Filter has reached positive max - increment the tap count
ce_data_inta <= '1';
inc_data_int <= '1';
pdcounter <= "10000";
flag <= '0';
elsif pdcounter = "00000" and flag = '0' then -- Filter has reached negative max - decrement the tap count
ce_data_inta <= '1';
inc_data_int <= '0';
pdcounter <= "10000";
flag <= '0';
elsif valid_data_d = '1' then -- increment filter
ce_data_inta <= '0';
if incdec_data_d = '1' and pdcounter /= "11111" then
pdcounter <= pdcounter + 1;
elsif incdec_data_d = '0' and pdcounter /= "00000" then -- decrement filter
pdcounter <= pdcounter - 1;
end if;
else
ce_data_inta <= '0';
end if;
else
ce_data <= all_ce;
inc_data_int <= debug_in(1);
end if;
end if;
end process;
inc_data <= inc_data_int;
incdec_data_or(0) <= '0'; -- Input Mux - Initialise generate loop OR gates
valid_data_or(0) <= '0';
busy_data_or(0) <= '0';
loop0 : for i in 0 to (D - 1) generate
incdec_data_im(i) <= incdec_data(i) and mux(i); -- Input muxes
incdec_data_or(i+1) <= incdec_data_im(i) or incdec_data_or(i); -- AND gates to allow just one signal through at a tome
valid_data_im(i) <= valid_data(i) and mux(i); -- followed by an OR
valid_data_or(i+1) <= valid_data_im(i) or valid_data_or(i); -- for the three inputs from each PD
busy_data_or(i+1) <= busy_data(i) or busy_data_or(i); -- The busy signals just need an OR gate
all_ce(i) <= debug_in(0);
rx_data_in_fix(i) <= rx_data_in(i) xor RX_SWAP_MASK(i); -- Invert signals as required
iob_clk_in : IBUF port map (
I => datain(i),
O => rx_data_in(i));
loop2 : if (USE_PD = true) generate --Two oserdes are needed
iodelay_m : IODELAY2 generic map(
DATA_RATE => "SDR", -- <SDR>, DDR
IDELAY_VALUE => 0, -- {0 ... 255}
IDELAY2_VALUE => 0, -- {0 ... 255}
IDELAY_MODE => "NORMAL" , -- NORMAL, PCI
ODELAY_VALUE => 0, -- {0 ... 255}
IDELAY_TYPE => "DIFF_PHASE_DETECTOR", -- "DEFAULT", "DIFF_PHASE_DETECTOR", "FIXED", "VARIABLE_FROM_HALF_MAX", "VARIABLE_FROM_ZERO"
COUNTER_WRAPAROUND => "WRAPAROUND", -- <STAY_AT_LIMIT>, WRAPAROUND
DELAY_SRC => "IDATAIN", -- "IO", "IDATAIN", "ODATAIN"
SERDES_MODE => "MASTER", -- <NONE>, MASTER, SLAVE
SIM_TAPDELAY_VALUE => 49) --
port map (
IDATAIN => rx_data_in_fix(i), -- data from primary IOB
TOUT => open, -- tri-state signal to IOB
DOUT => open, -- output data to IOB
T => '1', -- tri-state control from OLOGIC/OSERDES2
ODATAIN => '0', -- data from OLOGIC/OSERDES2
DATAOUT => ddly_m(i), -- Output data 1 to ILOGIC/ISERDES2
DATAOUT2 => open, -- Output data 2 to ILOGIC/ISERDES2
IOCLK0 => rxioclk, -- High speed clock for calibration
IOCLK1 => '0', -- High speed clock for calibration
CLK => gclk, -- Fabric clock (GCLK) for control signals
CAL => cal_data_master, -- Calibrate control signal
INC => inc_data, -- Increment counter
CE => ce_data(i), -- Clock Enable
RST => rst_data, -- Reset delay line
BUSY => open) ; -- output signal indicating sync circuit has finished / calibration has finished
iodelay_s : IODELAY2 generic map(
DATA_RATE => "SDR", -- <SDR>, DDR
IDELAY_VALUE => 0, -- {0 ... 255}
IDELAY2_VALUE => 0, -- {0 ... 255}
IDELAY_MODE => "NORMAL", -- NORMAL, PCI
ODELAY_VALUE => 0, -- {0 ... 255}
IDELAY_TYPE => "DIFF_PHASE_DETECTOR", -- "DEFAULT", "DIFF_PHASE_DETECTOR", "FIXED", "VARIABLE_FROM_HALF_MAX", "VARIABLE_FROM_ZERO"
COUNTER_WRAPAROUND => "WRAPAROUND" , -- <STAY_AT_LIMIT>, WRAPAROUND
DELAY_SRC => "IDATAIN" , -- "IO", "IDATAIN", "ODATAIN"
SERDES_MODE => "SLAVE", -- <NONE>, MASTER, SLAVE
SIM_TAPDELAY_VALUE => 49) --
port map (
IDATAIN => rx_data_in_fix(i), -- data from primary IOB
TOUT => open, -- tri-state signal to IOB
DOUT => open, -- output data to IOB
T => '1', -- tri-state control from OLOGIC/OSERDES2
ODATAIN => '0', -- data from OLOGIC/OSERDES2
DATAOUT => ddly_s(i), -- Output data 1 to ILOGIC/ISERDES2
DATAOUT2 => open, -- Output data 2 to ILOGIC/ISERDES2
IOCLK0 => rxioclk, -- High speed clock for calibration
IOCLK1 => '0', -- High speed clock for calibration
CLK => gclk, -- Fabric clock (GCLK) for control signals
CAL => cal_data_slave, -- Calibrate control signal
INC => inc_data, -- Increment counter
CE => ce_data(i) , -- Clock Enable
RST => rst_data, -- Reset delay line
BUSY => busys(i)) ; -- output signal indicating sync circuit has finished / calibration has finished
iserdes_m : ISERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE => "SDR", -- <SDR>, DDR
BITSLIP_ENABLE => true, -- <FALSE>, TRUE
SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
INTERFACE_TYPE => "RETIMED") -- NETWORKING, NETWORKING_PIPELINED, <RETIMED>
port map (
D => ddly_m(i),
CE0 => '1',
CLK0 => rxioclk,
CLK1 => '0',
IOCE => rxserdesstrobe,
RST => reset,
CLKDIV => gclk,
SHIFTIN => pd_edge(i),
BITSLIP => bitslip,
FABRICOUT => open,
Q4 => mdataout((8*i)+7),
Q3 => mdataout((8*i)+6),
Q2 => mdataout((8*i)+5),
Q1 => mdataout((8*i)+4),
DFB => open,
CFB0 => open,
CFB1 => open,
VALID => valid_data(i),
INCDEC => incdec_data(i),
SHIFTOUT => cascade(i));
iserdes_s : ISERDES2 generic map(
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE => "SDR", -- <SDR>, DDR
BITSLIP_ENABLE => true, -- <FALSE>, TRUE
SERDES_MODE => "SLAVE", -- <DEFAULT>, MASTER, SLAVE
INTERFACE_TYPE => "RETIMED") -- NETWORKING, NETWORKING_PIPELINED, <RETIMED>
port map (
D => ddly_s(i),
CE0 => '1',
CLK0 => rxioclk,
CLK1 => '0',
IOCE => rxserdesstrobe,
RST => reset,
CLKDIV => gclk,
SHIFTIN => cascade(i),
BITSLIP => bitslip,
FABRICOUT => open,
Q4 => mdataout((8*i)+3),
Q3 => mdataout((8*i)+2),
Q2 => mdataout((8*i)+1),
Q1 => mdataout((8*i)+0),
DFB => open,
CFB0 => open,
CFB1 => open,
VALID => open,
INCDEC => open,
SHIFTOUT => pd_edge(i));
end generate;
loop3 : if (USE_PD /= true) generate -- Only one oserdes is needed
iodelay_m : IODELAY2 generic map(
DATA_RATE => "SDR", -- <SDR>, DDR
IDELAY_VALUE => 0, -- {0 ... 255}
IDELAY2_VALUE => 0, -- {0 ... 255}
IDELAY_MODE => "NORMAL" , -- NORMAL, PCI
ODELAY_VALUE => 0, -- {0 ... 255}
IDELAY_TYPE => "VARIABLE_FROM_HALF_MAX", -- "DEFAULT", "DIFF_PHASE_DETECTOR", "FIXED", "VARIABLE_FROM_HALF_MAX", "VARIABLE_FROM_ZERO"
COUNTER_WRAPAROUND => "WRAPAROUND", -- <STAY_AT_LIMIT>, WRAPAROUND
DELAY_SRC => "IDATAIN", -- "IO", "IDATAIN", "ODATAIN"
-- SERDES_MODE => "MASTER", -- <NONE>, MASTER, SLAVE
SIM_TAPDELAY_VALUE => 49) --
port map (
IDATAIN => rx_data_in_fix(i), -- data from primary IOB
TOUT => open, -- tri-state signal to IOB
DOUT => open, -- output data to IOB
T => '1', -- tri-state control from OLOGIC/OSERDES2
ODATAIN => '0', -- data from OLOGIC/OSERDES2
DATAOUT => ddly_m(i), -- Output data 1 to ILOGIC/ISERDES2
DATAOUT2 => open, -- Output data 2 to ILOGIC/ISERDES2
IOCLK0 => rxioclk, -- High speed clock for calibration
IOCLK1 => '0', -- High speed clock for calibration
CLK => gclk, -- Fabric clock (GCLK) for control signals
CAL => cal_data_master, -- Calibrate control signal
INC => inc_data, -- Increment counter
CE => ce_data(i), -- Clock Enable
RST => rst_data, -- Reset delay line
BUSY => open) ; -- output signal indicating sync circuit has finished / calibration has finished
iserdes_m : ISERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE => "SDR", -- <SDR>, DDR
BITSLIP_ENABLE => true, -- <FALSE>, TRUE
-- SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
INTERFACE_TYPE => "RETIMED") -- NETWORKING, NETWORKING_PIPELINED, <RETIMED>
port map (
D => rx_data_in_fix(i),--ddly_m(i),
CE0 => '1',
CLK0 => rxioclk,
CLK1 => '0',
IOCE => rxserdesstrobe,
RST => reset,
CLKDIV => gclk,
SHIFTIN => '0',
BITSLIP => bitslip,
FABRICOUT => open,
Q4 => mdataout((8*i)+7),
Q3 => mdataout((8*i)+6),
Q2 => mdataout((8*i)+5),
Q1 => mdataout((8*i)+4),
DFB => open,
CFB0 => open,
CFB1 => open,
VALID => open,
INCDEC => open,
SHIFTOUT => open);
end generate;
loop1 : for j in 7 downto (8-S) generate
data_out(((D*(j+S-8))+i)) <= mdataout((8*i)+j);
end generate;
end generate;
end arch_serdes_1_to_n_data_s2_se;
------------------------------------------------------------------------------
-- Copyright (c) 2009 Xilinx, Inc.
-- This design is confidential and proprietary of Xilinx, All Rights Reserved.
------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: 1.0
-- \ \ Filename: serdes_n_to_1_s2_diff.vhd
-- / / Date Last Modified: November 5 2009
-- /___/ /\ Date Created: August 1 2008
-- \ \ / \
-- \___\/\___\
--
--Device: Spartan 6
--Purpose: D-bit generic n:1 transmitter module
-- Takes in n bits of data and serialises this to 1 bit
-- data is transmitted LSB first
-- Parallel input word
-- DS, DS-1 ..... 1, 0
-- Serial output words
-- Line0 : 0, ...... DS-(S+1)
-- Line1 : 1, ...... DS-(S+2)
-- Line(D-1) : . .
-- Line0(D) : D-1, ...... DS
-- Data inversion can be accomplished via the TX_SWAP_MASK
-- parameter if required
--
--Reference:
--
--Revision History:
-- Rev 1.0 - First created (nicks)
------------------------------------------------------------------------------
--
-- Disclaimer:
--
-- This disclaimer is not a license and does not grant any rights to the materials
-- distributed herewith. Except as otherwise provided in a valid license issued to you
-- by Xilinx, and to the maximum extent permitted by applicable law:
-- (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS,
-- AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
-- INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
-- FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract
-- or tort, including negligence, or under any other theory of liability) for any loss or damage
-- of any kind or nature related to, arising under or in connection with these materials,
-- including for any direct, or any indirect, special, incidental, or consequential loss
-- or damage (including loss of data, profits, goodwill, or any type of loss or damage suffered
-- as a result of any action brought by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the possibility of the same.
--
-- Critical Applications:
--
-- Xilinx products are not designed or intended to be fail-safe, or for use in any application
-- requiring fail-safe performance, such as life-support or safety devices or systems,
-- Class III medical devices, nuclear facilities, applications related to the deployment of airbags,
-- or any other applications that could lead to death, personal injury, or severe property or
-- environmental damage (individually and collectively, "Critical Applications"). Customer assumes
-- the sole risk and liability of any use of Xilinx products in Critical Applications, subject only
-- to applicable laws and regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.
--
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
library unisim;
use unisim.vcomponents.all;
entity serdes_n_to_1_s2_diff is
generic (
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 16) ; -- Set the number of inputs and outputs
port (
txioclk : in std_logic; -- IO Clock network
txserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset
gclk : in std_logic; -- Global clock
datain : in std_logic_vector((D*S)-1 downto 0); -- Data for output
dataout_p : out std_logic_vector(D-1 downto 0); -- output
dataout_n : out std_logic_vector(D-1 downto 0)) ; -- output
end serdes_n_to_1_s2_diff;
architecture arch_serdes_n_to_1_s2_diff of serdes_n_to_1_s2_diff is
signal cascade_di : std_logic_vector(D-1 downto 0);
signal cascade_do : std_logic_vector(D-1 downto 0);
signal cascade_ti : std_logic_vector(D-1 downto 0);
signal cascade_to : std_logic_vector(D-1 downto 0);
signal mdataina : std_logic_vector(D*8 downto 0);
signal mdatainb : std_logic_vector(D*4 downto 0);
signal tx_data_out : std_logic_vector(D-1 downto 0);
constant TX_SWAP_MASK : std_logic_vector(D-1 downto 0) := (others => '0'); -- pinswap mask for input bits (0 = no swap (default), 1 = swap). Allows inputs to be connected the wrong way round to ease PCB routing.
begin
loop0 : for i in 0 to (D - 1) generate
io_clk_out : obufds port map (
O => dataout_p(i),
OB => dataout_n(i),
I => tx_data_out(i));
loop1 : if (S > 4) generate -- Two oserdes are needed
loop2 : for j in 0 to (S - 1) generate
-- re-arrange data bits for transmission and invert lines as given by the mask
-- NOTE If pin inversion is required (non-zero SWAP MASK) then inverters will occur in fabric, as there are no inverters in the ISERDES2
-- This can be avoided by doing the inversion (if necessary) in the user logic
mdataina((8*i)+j) <= datain((i)+(D*j)) xor TX_SWAP_MASK(i);
end generate;
oserdes_m : OSERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR", -- <SDR>, DDR
SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => tx_data_out(i),
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdataina((8*i)+7),
D3 => mdataina((8*i)+6),
D2 => mdataina((8*i)+5),
D1 => mdataina((8*i)+4),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => '1', -- Dummy input in Master
SHIFTIN2 => '1', -- Dummy input in Master
SHIFTIN3 => cascade_do(i), -- Cascade output D data from slave
SHIFTIN4 => cascade_to(i), -- Cascade output T data from slave
SHIFTOUT1 => cascade_di(i), -- Cascade input D data to slave
SHIFTOUT2 => cascade_ti(i), -- Cascade input T data to slave
SHIFTOUT3 => open, -- Dummy output in Master
SHIFTOUT4 => open) ; -- Dummy output in Master
oserdes_s : OSERDES2 generic map(
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR", -- <SDR>, DDR
SERDES_MODE => "SLAVE", -- <DEFAULT>, MASTER, SLAVE
OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => open,
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdataina((8*i)+3),
D3 => mdataina((8*i)+2),
D2 => mdataina((8*i)+1),
D1 => mdataina((8*i)+0),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => cascade_di(i), -- Cascade input D from Master
SHIFTIN2 => cascade_ti(i), -- Cascade input T from Master
SHIFTIN3 => '1', -- Dummy input in Slave
SHIFTIN4 => '1', -- Dummy input in Slave
SHIFTOUT1 => open, -- Dummy output in Slave
SHIFTOUT2 => open, -- Dummy output in Slave
SHIFTOUT3 => cascade_do(i), -- Cascade output D data to Master
SHIFTOUT4 => cascade_to(i)) ; -- Cascade output T data to Master
end generate;
loop3 : if (S < 5) generate -- Only one oserdes needed
loop4 : for j in 0 to (S - 1) generate
-- re-arrange data bits for transmission and invert lines as given by the mask
-- NOTE If pin inversion is required (non-zero SWAP MASK) then inverters will occur in fabric, as there are no inverters in the ISERDES2
-- This can be avoided by doing the inversion (if necessary) in the user logic
mdatainb((4*i)+j) <= datain((i)+(D*j)) xor TX_SWAP_MASK(i);
end generate;
oserdes_m : OSERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR") -- <SDR>, DDR
-- SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
-- OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => tx_data_out(i),
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdatainb((4*i)+3),
D3 => mdatainb((4*i)+2),
D2 => mdatainb((4*i)+1),
D1 => mdatainb((4*i)+0),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => '1', -- No cascades needed
SHIFTIN2 => '1', -- No cascades needed
SHIFTIN3 => '1', -- No cascades needed
SHIFTIN4 => '1', -- No cascades needed
SHIFTOUT1 => open, -- No cascades needed
SHIFTOUT2 => open, -- No cascades needed
SHIFTOUT3 => open, -- No cascades needed
SHIFTOUT4 => open) ; -- No cascades needed
end generate;
end generate;
end arch_serdes_n_to_1_s2_diff;
------------------------------------------------------------------------------
-- Copyright (c) 2009 Xilinx, Inc.
-- This design is confidential and proprietary of Xilinx, All Rights Reserved.
------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: 1.0
-- \ \ Filename: serdes_n_to_1_s2_se.vhd
-- / / Date Last Modified: November 5 2009
-- /___/ /\ Date Created: August 1 2008
-- \ \ / \
-- \___\/\___\
--
--Device: Spartan 6
--Purpose: D-bit generic n:1 transmitter module
-- Takes in n bits of data and serialises this to 1 bit
-- data is transmitted LSB first
-- Parallel input word
-- DS, DS-1 ..... 1, 0
-- Serial output words
-- Line0 : 0, ...... DS-(S+1)
-- Line1 : 1, ...... DS-(S+2)
-- Line(D-1) : . .
-- Line0(D) : D-1, ...... DS
-- Data inversion can be accomplished via the TX_SWAP_MASK
-- parameter if required
--
--Reference:
--
--Revision History:
-- Rev 1.0 - First created (nicks)
------------------------------------------------------------------------------
--
-- Disclaimer:
--
-- This disclaimer is not a license and does not grant any rights to the materials
-- distributed herewith. Except as otherwise provided in a valid license issued to you
-- by Xilinx, and to the maximum extent permitted by applicable law:
-- (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS,
-- AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
-- INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
-- FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract
-- or tort, including negligence, or under any other theory of liability) for any loss or damage
-- of any kind or nature related to, arising under or in connection with these materials,
-- including for any direct, or any indirect, special, incidental, or consequential loss
-- or damage (including loss of data, profits, goodwill, or any type of loss or damage suffered
-- as a result of any action brought by a third party) even if such damage or loss was
-- reasonably foreseeable or Xilinx had been advised of the possibility of the same.
--
-- Critical Applications:
--
-- Xilinx products are not designed or intended to be fail-safe, or for use in any application
-- requiring fail-safe performance, such as life-support or safety devices or systems,
-- Class III medical devices, nuclear facilities, applications related to the deployment of airbags,
-- or any other applications that could lead to death, personal injury, or severe property or
-- environmental damage (individually and collectively, "Critical Applications"). Customer assumes
-- the sole risk and liability of any use of Xilinx products in Critical Applications, subject only
-- to applicable laws and regulations governing limitations on product liability.
--
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.
--
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
library unisim;
use unisim.vcomponents.all;
entity serdes_n_to_1_s2_se is
generic (
S : integer := 2; -- Parameter to set the serdes factor 1..8
D : integer := 16) ; -- Set the number of inputs and outputs
port (
txioclk : in std_logic; -- IO Clock network
txserdesstrobe : in std_logic; -- Parallel data capture strobe
reset : in std_logic; -- Reset
gclk : in std_logic; -- Global clock
datain : in std_logic_vector((D*S)-1 downto 0); -- Data for output
dataout : out std_logic_vector(D-1 downto 0)) ; -- output
end serdes_n_to_1_s2_se;
architecture arch_serdes_n_to_1_s2_se of serdes_n_to_1_s2_se is
signal cascade_di : std_logic_vector(D-1 downto 0);
signal cascade_do : std_logic_vector(D-1 downto 0);
signal cascade_ti : std_logic_vector(D-1 downto 0);
signal cascade_to : std_logic_vector(D-1 downto 0);
signal mdataina : std_logic_vector(D*8 downto 0);
signal mdatainb : std_logic_vector(D*4 downto 0);
signal tx_data_out : std_logic_vector(D-1 downto 0);
constant TX_SWAP_MASK : std_logic_vector(D-1 downto 0) := (others => '0'); -- pinswap mask for input bits (0 = no swap (default), 1 = swap). Allows inputs to be connected the wrong way round to ease PCB routing.
begin
loop0 : for i in 0 to (D - 1) generate
io_clk_out : obuf port map (
O => dataout(i),
I => tx_data_out(i));
loop1 : if (S > 4) generate -- Two oserdes are needed
loop2 : for j in 0 to (S - 1) generate
-- re-arrange data bits for transmission and invert lines as given by the mask
-- NOTE If pin inversion is required (non-zero SWAP MASK) then inverters will occur in fabric, as there are no inverters in the ISERDES2
-- This can be avoided by doing the inversion (if necessary) in the user logic
mdataina((8*i)+j) <= datain((i)+(D*j)) xor TX_SWAP_MASK(i);
end generate;
oserdes_m : OSERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR", -- <SDR>, DDR
SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => tx_data_out(i),
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdataina((8*i)+7),
D3 => mdataina((8*i)+6),
D2 => mdataina((8*i)+5),
D1 => mdataina((8*i)+4),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => '1', -- Dummy input in Master
SHIFTIN2 => '1', -- Dummy input in Master
SHIFTIN3 => cascade_do(i), -- Cascade output D data from slave
SHIFTIN4 => cascade_to(i), -- Cascade output T data from slave
SHIFTOUT1 => cascade_di(i), -- Cascade input D data to slave
SHIFTOUT2 => cascade_ti(i), -- Cascade input T data to slave
SHIFTOUT3 => open, -- Dummy output in Master
SHIFTOUT4 => open) ; -- Dummy output in Master
oserdes_s : OSERDES2 generic map(
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR", -- <SDR>, DDR
SERDES_MODE => "SLAVE", -- <DEFAULT>, MASTER, SLAVE
OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => open,
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdataina((8*i)+3),
D3 => mdataina((8*i)+2),
D2 => mdataina((8*i)+1),
D1 => mdataina((8*i)+0),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => cascade_di(i), -- Cascade input D from Master
SHIFTIN2 => cascade_ti(i), -- Cascade input T from Master
SHIFTIN3 => '1', -- Dummy input in Slave
SHIFTIN4 => '1', -- Dummy input in Slave
SHIFTOUT1 => open, -- Dummy output in Slave
SHIFTOUT2 => open, -- Dummy output in Slave
SHIFTOUT3 => cascade_do(i), -- Cascade output D data to Master
SHIFTOUT4 => cascade_to(i)) ; -- Cascade output T data to Master
end generate;
loop3 : if (S < 5) generate -- Only one oserdes needed
loop4 : for j in 0 to (S - 1) generate
-- re-arrange data bits for transmission and invert lines as given by the mask
-- NOTE If pin inversion is required (non-zero SWAP MASK) then inverters will occur in fabric, as there are no inverters in the ISERDES2
-- This can be avoided by doing the inversion (if necessary) in the user logic
mdatainb((4*i)+j) <= datain((i)+(D*j)) xor TX_SWAP_MASK(i);
end generate;
oserdes_m : OSERDES2 generic map (
DATA_WIDTH => S, -- SERDES word width. This should match the setting is BUFPLL
DATA_RATE_OQ => "SDR", -- <SDR>, DDR
DATA_RATE_OT => "SDR") -- <SDR>, DDR
-- SERDES_MODE => "MASTER", -- <DEFAULT>, MASTER, SLAVE
-- OUTPUT_MODE => "DIFFERENTIAL")
port map (
OQ => tx_data_out(i),
OCE => '1',
CLK0 => txioclk,
CLK1 => '0',
IOCE => txserdesstrobe,
RST => reset,
CLKDIV => gclk,
D4 => mdatainb((4*i)+3),
D3 => mdatainb((4*i)+2),
D2 => mdatainb((4*i)+1),
D1 => mdatainb((4*i)+0),
TQ => open,
T1 => '0',
T2 => '0',
T3 => '0',
T4 => '0',
TRAIN => '0',
TCE => '1',
SHIFTIN1 => '1', -- No cascades needed
SHIFTIN2 => '1', -- No cascades needed
SHIFTIN3 => '1', -- No cascades needed
SHIFTIN4 => '1', -- No cascades needed
SHIFTOUT1 => open, -- No cascades needed
SHIFTOUT2 => open, -- No cascades needed
SHIFTOUT3 => open, -- No cascades needed
SHIFTOUT4 => open) ; -- No cascades needed
end generate;
end generate;
end arch_serdes_n_to_1_s2_se;
--------------------------------------------------------------------------------
-- --
-- CERN BE-CO-HT GN4124 core for PCIe FMC carrier --
-- http://www.ohwr.org/projects/gn4124-core --
--------------------------------------------------------------------------------
--
-- unit name: 32-bit Wishbone master (wbmaster32.vhd)
--
-- authors: Simon Deprez (simon.deprez@cern.ch)
-- Matthieu Cattin (matthieu.cattin@cern.ch)
--
-- date: 12-08-2010
--
-- version: 0.2
--
-- description: Provides a Wishbone interface for single read and write
-- control and status registers
--
-- dependencies: general-cores library (genrams package)
--
--------------------------------------------------------------------------------
-- GNU LESSER GENERAL PUBLIC LICENSE
--------------------------------------------------------------------------------
-- This source file is free software; you can redistribute it and/or modify it
-- under the terms of the GNU Lesser General Public License as published by the
-- Free Software Foundation; either version 2.1 of the License, or (at your
-- option) any later version. This source is distributed in the hope that it
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details. You should have
-- received a copy of the GNU Lesser General Public License along with this
-- source; if not, download it from http://www.gnu.org/licenses/lgpl-2.1.html
--------------------------------------------------------------------------------
-- last changes: 27-09-2010 (mcattin) Split wishbone and gn4124 clock domains
-- All signals crossing the clock domains are now going through fifos.
-- Dead times optimisation in packet generator.
-- 11-07-2011 (mcattin) Replaced Xilinx Coregen FIFOs with genrams
-- library cores from ohwr.org
--------------------------------------------------------------------------------
-- TODO: - byte enable support.
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
library work;
use work.gn4124_core_pkg.all;
use work.genram_pkg.all;
entity wbmaster32 is
port
(
---------------------------------------------------------
-- GN4124 core clock and reset
clk_i : in std_logic;
rst_n_i : in std_logic;
---------------------------------------------------------
-- From P2L packet decoder
--
-- Header
pd_wbm_hdr_start_i : in std_logic; -- Header strobe
pd_wbm_hdr_length_i : in std_logic_vector(9 downto 0); -- Packet length in 32-bit words multiples
pd_wbm_hdr_cid_i : in std_logic_vector(1 downto 0); -- Completion ID
pd_wbm_target_mrd_i : in std_logic; -- Target memory read
pd_wbm_target_mwr_i : in std_logic; -- Target memory write
--
-- Address
pd_wbm_addr_start_i : in std_logic; -- Address strobe
pd_wbm_addr_i : in std_logic_vector(31 downto 0); -- Target address (in byte) that will increment with data
-- increment = 4 bytes
--
-- Data
pd_wbm_data_valid_i : in std_logic; -- Indicates Data is valid
pd_wbm_data_last_i : in std_logic; -- Indicates end of the packet
pd_wbm_data_i : in std_logic_vector(31 downto 0); -- Data
pd_wbm_be_i : in std_logic_vector(3 downto 0); -- Byte Enable for data
---------------------------------------------------------
-- P2L channel control
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- Ready to accept target write
p2l_rdy_o : out std_logic; -- De-asserted to pause transfer already in progress
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- Asserted when GN4124 ready to accept read completion with data
---------------------------------------------------------
-- To the arbiter (L2P data)
wbm_arb_valid_o : out std_logic; -- Read completion signals
wbm_arb_dframe_o : out std_logic; -- Toward the arbiter
wbm_arb_data_o : out std_logic_vector(31 downto 0);
wbm_arb_req_o : out std_logic;
arb_wbm_gnt_i : in std_logic;
---------------------------------------------------------
-- CSR wishbone interface
wb_clk_i : in std_logic; -- Wishbone bus clock
wb_adr_o : out std_logic_vector(30 downto 0); -- Address
wb_dat_o : out std_logic_vector(31 downto 0); -- Data out
wb_sel_o : out std_logic_vector(3 downto 0); -- Byte select
wb_stb_o : out std_logic; -- Strobe
wb_we_o : out std_logic; -- Write
wb_cyc_o : out std_logic; -- Cycle
wb_dat_i : in std_logic_vector(31 downto 0); -- Data in
wb_ack_i : in std_logic; -- Acknowledge
wb_stall_i : in std_logic -- Stall
);
end wbmaster32;
architecture behaviour of wbmaster32 is
-----------------------------------------------------------------------------
-- Constants declaration
-----------------------------------------------------------------------------
constant c_TO_WB_FIFO_FULL_THRES : integer := 500;
constant c_FROM_WB_FIFO_FULL_THRES : integer := 500;
-----------------------------------------------------------------------------
-- Signals declaration
-----------------------------------------------------------------------------
-- Sync fifos
signal fifo_rst_n : std_logic;
signal to_wb_fifo_empty : std_logic;
signal to_wb_fifo_full : std_logic;
signal to_wb_fifo_rd : std_logic;
signal to_wb_fifo_wr : std_logic;
signal to_wb_fifo_din : std_logic_vector(63 downto 0);
signal to_wb_fifo_dout : std_logic_vector(63 downto 0);
signal to_wb_fifo_rw : std_logic;
signal to_wb_fifo_data : std_logic_vector(31 downto 0);
signal to_wb_fifo_addr : std_logic_vector(30 downto 0);
signal from_wb_fifo_empty : std_logic;
signal from_wb_fifo_full : std_logic;
signal from_wb_fifo_rd : std_logic;
signal from_wb_fifo_wr : std_logic;
signal from_wb_fifo_din : std_logic_vector(31 downto 0);
signal from_wb_fifo_dout : std_logic_vector(31 downto 0);
-- Wishbone
type wishbone_state_type is (WB_IDLE, WB_READ_FIFO, WB_CYCLE, WB_WAIT_ACK);
signal wishbone_current_state : wishbone_state_type;
signal wb_ack_t : std_logic;
signal wb_dat_i_t : std_logic_vector(31 downto 0);
signal wb_cyc_t : std_logic;
signal wb_dat_o_t : std_logic_vector(31 downto 0);
signal wb_stb_t : std_logic;
signal wb_adr_t : std_logic_vector(30 downto 0);
signal wb_we_t : std_logic;
signal wb_sel_t : std_logic_vector(3 downto 0);
signal wb_stall_t : std_logic;
-- L2P packet generator
type l2p_read_cpl_state_type is (L2P_IDLE, L2P_HEADER, L2P_DATA);
signal l2p_read_cpl_current_state : l2p_read_cpl_state_type;
signal p2l_cid : std_logic_vector(1 downto 0);
signal s_l2p_header : std_logic_vector(31 downto 0);
begin
------------------------------------------------------------------------------
-- Active high reset for fifo
------------------------------------------------------------------------------
-- Creates an active high reset for fifos regardless of c_RST_ACTIVE value
gen_fifo_rst_n : if c_RST_ACTIVE = '0' generate
fifo_rst_n <= rst_n_i;
end generate;
gen_fifo_rst : if c_RST_ACTIVE = '1' generate
fifo_rst_n <= not(rst_n_i);
end generate;
------------------------------------------------------------------------------
-- Write frame from P2L decoder to fifo
------------------------------------------------------------------------------
-- ready to receive new target write if fifo not full
p_wr_rdy_o <= "00" when to_wb_fifo_full = '1' else "11";
-- pause transfer from GN4124 when fifo is full
p2l_rdy_o <= not(to_wb_fifo_full);
p_from_decoder : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
to_wb_fifo_din <= (others => '0');
to_wb_fifo_wr <= '0';
elsif rising_edge(clk_i) then
if (pd_wbm_target_mwr_i = '1' and pd_wbm_data_valid_i = '1') then
-- Target write
-- wishbone address is in 32-bit words and address from PCIe in byte
-- pd_wbm_addr_i(0) represent the BAR (0 = BAR0, 1 = BAR 2)
to_wb_fifo_din(62 downto 32) <= pd_wbm_addr_i(0) & pd_wbm_addr_i(31 downto 2);
to_wb_fifo_din(31 downto 0) <= pd_wbm_data_i;
to_wb_fifo_din(63) <= '1';
to_wb_fifo_wr <= '1';
elsif (pd_wbm_target_mrd_i = '1' and pd_wbm_addr_start_i = '1') then
-- Target read request
-- wishbone address is in 32-bit words and address from PCIe in byte
-- pd_wbm_addr_i(0) represent the BAR (0 = BAR0, 1 = BAR 2)
to_wb_fifo_din(62 downto 32) <= pd_wbm_addr_i(0) & pd_wbm_addr_i(31 downto 2);
to_wb_fifo_din(63) <= '0';
to_wb_fifo_wr <= '1';
else
to_wb_fifo_wr <= '0';
end if;
end if;
end process p_from_decoder;
------------------------------------------------------------------------------
-- Packet generator
------------------------------------------------------------------------------
-- Generates read completion with requested data
-- Single 32-bit word read only
-- Store CID for read completion packet
p_pkt_gen : process (clk_i, rst_n_i)
begin
if (rst_n_i = c_RST_ACTIVE) then
p2l_cid <= (others => '0');
elsif rising_edge(clk_i) then
if (pd_wbm_hdr_start_i = '1') then
p2l_cid <= pd_wbm_hdr_cid_i;
end if;
end if;
end process p_pkt_gen;
--read completion header
s_l2p_header <= "000" --> Traffic Class
& '0' --> Reserved
& "0101" --> Read completion (Master read competition with data)
& "000000" --> Reserved
& "00" --> Completion Status
& '1' --> Last completion packet
& "00" --> Reserved
& '0' --> VC (Vitrual Channel)
& p2l_cid --> CID (Completion Identifer)
& "0000000001"; --> Length (Single 32-bit word read only)
------------------------------------------------------------------------------
-- L2P packet write FSM
------------------------------------------------------------------------------
process (clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
l2p_read_cpl_current_state <= L2P_IDLE;
wbm_arb_req_o <= '0';
wbm_arb_data_o <= (others => '0');
wbm_arb_valid_o <= '0';
wbm_arb_dframe_o <= '0';
from_wb_fifo_rd <= '0';
elsif rising_edge(clk_i) then
case l2p_read_cpl_current_state is
when L2P_IDLE =>
wbm_arb_req_o <= '0';
wbm_arb_data_o <= (others => '0');
wbm_arb_valid_o <= '0';
wbm_arb_dframe_o <= '0';
if(from_wb_fifo_empty = '0' and p_rd_d_rdy_i = "11") then
-- generate a packet when read data in fifo and GN4124 ready to receive the packet
wbm_arb_req_o <= '1';
from_wb_fifo_rd <= '1';
l2p_read_cpl_current_state <= L2P_HEADER;
end if;
when L2P_HEADER =>
from_wb_fifo_rd <= '0';
if(arb_wbm_gnt_i = '1') then
wbm_arb_req_o <= '0';
wbm_arb_data_o <= s_l2p_header;
wbm_arb_valid_o <= '1';
wbm_arb_dframe_o <= '1';
l2p_read_cpl_current_state <= L2P_DATA;
end if;
when L2P_DATA =>
l2p_read_cpl_current_state <= L2P_IDLE;
wbm_arb_data_o <= from_wb_fifo_dout;
wbm_arb_dframe_o <= '0';
when others =>
l2p_read_cpl_current_state <= L2P_IDLE;
wbm_arb_req_o <= '0';
wbm_arb_data_o <= (others => '0');
wbm_arb_valid_o <= '0';
wbm_arb_dframe_o <= '0';
from_wb_fifo_rd <= '0';
end case;
end if;
end process;
-----------------------------------------------------------------------------
-- FIFOs for transition between GN4124 core and wishbone clock domain
-----------------------------------------------------------------------------
-- fifo for PCIe to WB transfer
cmp_fifo_to_wb : generic_async_fifo
generic map (
g_data_width => 64,
g_size => 512,
g_show_ahead => false,
g_with_rd_empty => true,
g_with_rd_full => false,
g_with_rd_almost_empty => false,
g_with_rd_almost_full => false,
g_with_rd_count => false,
g_with_wr_empty => false,
g_with_wr_full => false,
g_with_wr_almost_empty => false,
g_with_wr_almost_full => true,
g_with_wr_count => false,
g_almost_empty_threshold => 0,
g_almost_full_threshold => c_TO_WB_FIFO_FULL_THRES)
port map (
rst_n_i => fifo_rst_n,
clk_wr_i => clk_i,
d_i => to_wb_fifo_din,
we_i => to_wb_fifo_wr,
wr_empty_o => open,
wr_full_o => open,
wr_almost_empty_o => open,
wr_almost_full_o => to_wb_fifo_full,
wr_count_o => open,
clk_rd_i => wb_clk_i,
q_o => to_wb_fifo_dout,
rd_i => to_wb_fifo_rd,
rd_empty_o => to_wb_fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open);
to_wb_fifo_rw <= to_wb_fifo_dout(63);
to_wb_fifo_addr <= to_wb_fifo_dout(62 downto 32); -- 31-bit
to_wb_fifo_data <= to_wb_fifo_dout(31 downto 0); -- 32-bit
-- fifo for WB to PCIe transfer
cmp_from_wb_fifo : generic_async_fifo
generic map (
g_data_width => 32,
g_size => 512,
g_show_ahead => false,
g_with_rd_empty => true,
g_with_rd_full => false,
g_with_rd_almost_empty => false,
g_with_rd_almost_full => false,
g_with_rd_count => false,
g_with_wr_empty => false,
g_with_wr_full => false,
g_with_wr_almost_empty => false,
g_with_wr_almost_full => true,
g_with_wr_count => false,
g_almost_empty_threshold => 0,
g_almost_full_threshold => c_FROM_WB_FIFO_FULL_THRES)
port map (
rst_n_i => fifo_rst_n,
clk_wr_i => wb_clk_i,
d_i => from_wb_fifo_din,
we_i => from_wb_fifo_wr,
wr_empty_o => open,
wr_full_o => open,
wr_almost_empty_o => open,
wr_almost_full_o => from_wb_fifo_full,
wr_count_o => open,
clk_rd_i => clk_i,
q_o => from_wb_fifo_dout,
rd_i => from_wb_fifo_rd,
rd_empty_o => from_wb_fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open);
-----------------------------------------------------------------------------
-- Wishbone master FSM
-----------------------------------------------------------------------------
p_wb_fsm : process (wb_clk_i, rst_n_i)
begin
if(rst_n_i = c_RST_ACTIVE) then
wishbone_current_state <= WB_IDLE;
to_wb_fifo_rd <= '0';
wb_cyc_t <= '0';
wb_stb_t <= '0';
wb_we_t <= '0';
wb_sel_t <= "0000";
wb_dat_o_t <= (others => '0');
wb_adr_t <= (others => '0');
from_wb_fifo_din <= (others => '0');
from_wb_fifo_wr <= '0';
elsif rising_edge(wb_clk_i) then
case wishbone_current_state is
when WB_IDLE =>
-- stop writing to fifo
from_wb_fifo_wr <= '0';
-- clear bus
wb_cyc_t <= '0';
wb_stb_t <= '0';
wb_sel_t <= "0000";
-- Wait for a Wishbone cycle
if (to_wb_fifo_empty = '0') then
-- read requset in fifo (address, data and transfer type)
to_wb_fifo_rd <= '1';
wishbone_current_state <= WB_READ_FIFO;
end if;
when WB_READ_FIFO =>
-- read only one request in fifo (no block transfer)
to_wb_fifo_rd <= '0';
wishbone_current_state <= WB_CYCLE;
when WB_CYCLE =>
-- initate a bus cycle
wb_cyc_t <= '1';
wb_stb_t <= '1';
wb_we_t <= to_wb_fifo_rw;
wb_sel_t <= "1111";
wb_adr_t <= to_wb_fifo_addr;
--if (to_wb_fifo_rw = '1') then
wb_dat_o_t <= to_wb_fifo_data;
--end if;
-- wait for slave to ack
wishbone_current_state <= WB_WAIT_ACK;
when WB_WAIT_ACK =>
if wb_stall_t = '0' then
wb_stb_t <= '0';
end if;
if (wb_ack_t = '1') then
-- for read cycles write read data to fifo
if (wb_we_t = '0') then
from_wb_fifo_din <= wb_dat_i_t;
from_wb_fifo_wr <= '1';
end if;
-- end of the bus cycle
wb_cyc_t <= '0';
wishbone_current_state <= WB_IDLE;
end if;
when others =>
-- should not get here!
wishbone_current_state <= WB_IDLE;
wb_cyc_t <= '0';
wb_stb_t <= '0';
wb_we_t <= '0';
wb_sel_t <= "0000";
wb_dat_o_t <= (others => '0');
wb_adr_t <= (others => '0');
to_wb_fifo_rd <= '0';
from_wb_fifo_din <= (others => '0');
from_wb_fifo_wr <= '0';
end case;
end if;
end process p_wb_fsm;
wb_adr_o <= wb_adr_t;
wb_cyc_o <= wb_cyc_t;
wb_stb_o <= wb_stb_t;
wb_we_o <= wb_we_t;
wb_sel_o <= wb_sel_t;
wb_dat_i_t <= wb_dat_i;
wb_dat_o <= wb_dat_o_t;
wb_ack_t <= wb_ack_i;
wb_stall_t <= wb_stall_i;
end behaviour;
<?xml version="1.0" encoding="UTF-8"?>
<spirit:design xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xilinx="http://www.xilinx.com" >
<spirit:vendor>xilinx.com</spirit:vendor>
<spirit:library>project</spirit:library>
<spirit:name>coregen</spirit:name>
<spirit:version>1.0</spirit:version>
<spirit:componentInstances>
<spirit:componentInstance>
<spirit:instanceName>fifo_32x512</spirit:instanceName>
<spirit:displayName></spirit:displayName>
<spirit:description></spirit:description>
<spirit:componentRef spirit:vendor="xilinx.com" spirit:library="ip" spirit:name="fifo_generator" spirit:version="6.2" />
<spirit:configurableElementValues>
<spirit:configurableElementValue spirit:referenceId="parameter_almost_empty_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_threshold_negate_value">508</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_empty_threshold_negate_value">3</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_data_width">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_input_depth">512</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_valid_flag">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_programmable_empty_type">No_Programmable_Empty_Threshold</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_acknowledge_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_int_clk">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_fifo_implementation">Independent_Clocks_Block_RAM</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_underflow_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_extra_logic">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_flags_reset_value">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_valid_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_inject_dbit_error">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_depth">512</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_dout_reset_value">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_reset_synchronization">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_pin">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_underflow_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_overflow_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_overflow_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_programmable_full_type">Multiple_Programmable_Full_Threshold_Input_Ports</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_inject_sbit_error">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_type">Asynchronous_Reset</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_performance_options">Standard_FIFO</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_threshold_assert_value">509</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_dout_reset">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_almost_full_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_embedded_registers">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_clock_frequency">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_acknowledge_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_disable_timing_violations">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_empty_threshold_assert_value">2</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_input_data_width">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_clock_frequency">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_ecc">false</spirit:configurableElementValue>
</spirit:configurableElementValues>
<spirit:vendorExtensions>
<xilinx:instanceProperties xmlns:xilinx="http://www.xilinx.com">
<xilinx:projectOptions>
<xilinx:projectName>coregen</xilinx:projectName>
<xilinx:outputDirectory>./</xilinx:outputDirectory>
<xilinx:workingDirectory>./tmp/</xilinx:workingDirectory>
<xilinx:subWorkingDirectory>./tmp/_cg</xilinx:subWorkingDirectory>
</xilinx:projectOptions>
<xilinx:part>
<xilinx:device>xc6slx45t</xilinx:device>
<xilinx:deviceFamily>spartan6</xilinx:deviceFamily>
<xilinx:package>fgg484</xilinx:package>
<xilinx:speedGrade>-3</xilinx:speedGrade>
</xilinx:part>
<xilinx:flowOptions>
<xilinx:busFormat>BusFormatAngleBracketNotRipped</xilinx:busFormat>
<xilinx:designEntry>VHDL</xilinx:designEntry>
<xilinx:asySymbol>true</xilinx:asySymbol>
<xilinx:flowVendor>Foundation_ISE</xilinx:flowVendor>
<xilinx:addPads>false</xilinx:addPads>
<xilinx:removeRPMs>false</xilinx:removeRPMs>
<xilinx:createNDF>false</xilinx:createNDF>
<xilinx:implementationFileType>Ngc</xilinx:implementationFileType>
<xilinx:formalVerification>false</xilinx:formalVerification>
</xilinx:flowOptions>
<xilinx:simulationOptions>
<xilinx:simulationModel>Behavioral</xilinx:simulationModel>
<xilinx:simulationLanguage>VHDL_and_Verilog</xilinx:simulationLanguage>
<xilinx:foundationSym>false</xilinx:foundationSym>
</xilinx:simulationOptions>
</xilinx:instanceProperties>
<xilinx:generationHistory>
<xilinx:fileSet>
<xilinx:name>apply_current_project_options_generator</xilinx:name>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>implementation_netlist_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_32x512.asy</xilinx:name>
<xilinx:userFileType>asy</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:37:33 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xEE57B6C8</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.ngc</xilinx:name>
<xilinx:userFileType>ngc</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:46 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xB16E16B9</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.sym</xilinx:name>
<xilinx:userFileType>asy</xilinx:userFileType>
<xilinx:userFileType>unknown</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:18 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xB0939C99</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.v</xilinx:name>
<xilinx:userFileType>verilog</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x9E41355E</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.veo</xilinx:name>
<xilinx:userFileType>veo</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x274E13E2</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.vhd</xilinx:name>
<xilinx:userFileType>vhdl</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x295D077A</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.vho</xilinx:name>
<xilinx:userFileType>vho</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x211E1DE5</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_generator_readme.txt</xilinx:name>
<xilinx:userFileType>txt</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x406DA7B6</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_generator_ug175.pdf</xilinx:name>
<xilinx:userFileType>pdf</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:17 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x6AAA9CA5</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>instantiation_template_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_32x512.veo</xilinx:name>
<xilinx:userFileType>veo</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:47 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x274E13E2</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.vho</xilinx:name>
<xilinx:userFileType>vho</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:47 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x211E1DE5</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>xco_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_32x512.xco</xilinx:name>
<xilinx:userFileType>xco</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:52 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x338BA4BC</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>xmdf_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_32x512_xmdf.tcl</xilinx:name>
<xilinx:userFileType>tclXmdf</xilinx:userFileType>
<xilinx:userFileType>tcl</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:40:52 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x2A9298BF</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>ise_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./_xmsgs/pn_parser.xmsgs</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>unknown</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:41:02 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x64005769</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.gise</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>gise</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:41:03 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x0DF5C008</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_32x512.xise</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>xise</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:41:03 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x075F1FB0</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>deliver_readme_generator</xilinx:name>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>flist_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_32x512_flist.txt</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>txtFlist</xilinx:userFileType>
<xilinx:userFileType>txt</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:41:03 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xA02B2158</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
</xilinx:generationHistory>
</spirit:vendorExtensions>
</spirit:componentInstance>
<spirit:componentInstance>
<spirit:instanceName>fifo_64x512</spirit:instanceName>
<spirit:displayName></spirit:displayName>
<spirit:description></spirit:description>
<spirit:componentRef spirit:vendor="xilinx.com" spirit:library="ip" spirit:name="fifo_generator" spirit:version="6.2" />
<spirit:configurableElementValues>
<spirit:configurableElementValue spirit:referenceId="parameter_almost_empty_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_threshold_negate_value">508</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_empty_threshold_negate_value">3</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_data_width">64</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_input_depth">512</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_valid_flag">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_programmable_empty_type">No_Programmable_Empty_Threshold</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_acknowledge_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_int_clk">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_fifo_implementation">Independent_Clocks_Block_RAM</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_underflow_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_extra_logic">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_flags_reset_value">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_valid_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_inject_dbit_error">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_depth">512</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_dout_reset_value">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_reset_synchronization">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_pin">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_underflow_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_overflow_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_overflow_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_data_count">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_programmable_full_type">Multiple_Programmable_Full_Threshold_Input_Ports</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_inject_sbit_error">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_data_count_width">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_type">Asynchronous_Reset</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_performance_options">Standard_FIFO</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_full_threshold_assert_value">509</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_dout_reset">true</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_almost_full_flag">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_embedded_registers">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_clock_frequency">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_acknowledge_sense">Active_High</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_disable_timing_violations">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_empty_threshold_assert_value">2</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_input_data_width">64</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_clock_frequency">1</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_ecc">false</spirit:configurableElementValue>
</spirit:configurableElementValues>
<spirit:vendorExtensions>
<xilinx:instanceProperties xmlns:xilinx="http://www.xilinx.com">
<xilinx:projectOptions>
<xilinx:projectName>coregen</xilinx:projectName>
<xilinx:outputDirectory>./</xilinx:outputDirectory>
<xilinx:workingDirectory>./tmp/</xilinx:workingDirectory>
<xilinx:subWorkingDirectory>./tmp/_cg</xilinx:subWorkingDirectory>
</xilinx:projectOptions>
<xilinx:part>
<xilinx:device>xc6slx45t</xilinx:device>
<xilinx:deviceFamily>spartan6</xilinx:deviceFamily>
<xilinx:package>fgg484</xilinx:package>
<xilinx:speedGrade>-3</xilinx:speedGrade>
</xilinx:part>
<xilinx:flowOptions>
<xilinx:busFormat>BusFormatAngleBracketNotRipped</xilinx:busFormat>
<xilinx:designEntry>VHDL</xilinx:designEntry>
<xilinx:asySymbol>true</xilinx:asySymbol>
<xilinx:flowVendor>Foundation_ISE</xilinx:flowVendor>
<xilinx:addPads>false</xilinx:addPads>
<xilinx:removeRPMs>false</xilinx:removeRPMs>
<xilinx:createNDF>false</xilinx:createNDF>
<xilinx:implementationFileType>Ngc</xilinx:implementationFileType>
<xilinx:formalVerification>false</xilinx:formalVerification>
</xilinx:flowOptions>
<xilinx:simulationOptions>
<xilinx:simulationModel>Behavioral</xilinx:simulationModel>
<xilinx:simulationLanguage>VHDL_and_Verilog</xilinx:simulationLanguage>
<xilinx:foundationSym>false</xilinx:foundationSym>
</xilinx:simulationOptions>
</xilinx:instanceProperties>
<xilinx:generationHistory>
<xilinx:fileSet>
<xilinx:name>apply_current_project_options_generator</xilinx:name>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>implementation_netlist_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_64x512.asy</xilinx:name>
<xilinx:userFileType>asy</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:42:37 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x2AFF721F</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.ngc</xilinx:name>
<xilinx:userFileType>ngc</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:50 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x1925435D</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.sym</xilinx:name>
<xilinx:userFileType>asy</xilinx:userFileType>
<xilinx:userFileType>unknown</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xA5BEA8F6</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.v</xilinx:name>
<xilinx:userFileType>verilog</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x07302BA3</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.veo</xilinx:name>
<xilinx:userFileType>veo</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x024134B7</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.vhd</xilinx:name>
<xilinx:userFileType>vhdl</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xBD161636</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.vho</xilinx:name>
<xilinx:userFileType>vho</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x5744196D</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_generator_readme.txt</xilinx:name>
<xilinx:userFileType>txt</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x406DA7B6</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_generator_ug175.pdf</xilinx:name>
<xilinx:userFileType>pdf</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:23 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x6AAA9CA5</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>instantiation_template_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_64x512.veo</xilinx:name>
<xilinx:userFileType>veo</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:51 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x024134B7</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.vho</xilinx:name>
<xilinx:userFileType>vho</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:51 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x5744196D</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>xco_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_64x512.xco</xilinx:name>
<xilinx:userFileType>xco</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:57 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x8DBCBACC</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>xmdf_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_64x512_xmdf.tcl</xilinx:name>
<xilinx:userFileType>tclXmdf</xilinx:userFileType>
<xilinx:userFileType>tcl</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:45:57 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x09A8CE84</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>ise_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./_xmsgs/pn_parser.xmsgs</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>unknown</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:46:04 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xAFB5DD26</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.gise</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>gise</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:46:05 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0xB9752D51</xilinx:checkSum>
</xilinx:file>
<xilinx:file>
<xilinx:name>./fifo_64x512.xise</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>xise</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:46:05 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x25237F50</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>deliver_readme_generator</xilinx:name>
</xilinx:fileSet>
<xilinx:fileSet>
<xilinx:name>flist_generator</xilinx:name>
<xilinx:file>
<xilinx:name>./fifo_64x512_flist.txt</xilinx:name>
<xilinx:userFileType>ignore</xilinx:userFileType>
<xilinx:userFileType>txtFlist</xilinx:userFileType>
<xilinx:userFileType>txt</xilinx:userFileType>
<xilinx:timeStamp>Thu Feb 03 16:46:06 GMT 2011</xilinx:timeStamp>
<xilinx:checkSum>0x129A6A93</xilinx:checkSum>
</xilinx:file>
</xilinx:fileSet>
</xilinx:generationHistory>
</spirit:vendorExtensions>
</spirit:componentInstance>
<spirit:componentInstance>
<spirit:instanceName>ram_2048x32</spirit:instanceName>
<spirit:displayName></spirit:displayName>
<spirit:description></spirit:description>
<spirit:componentRef spirit:vendor="xilinx.com" spirit:library="ip" spirit:name="blk_mem_gen" spirit:version="4.2" />
<spirit:configurableElementValues>
<spirit:configurableElementValue spirit:referenceId="parameter_port_b_write_rate">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_portb_output_of_memory_primitives">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_depth_a">2048</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_additional_inputs_for_power_estimation">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_operating_mode_a">WRITE_FIRST</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_operating_mode_b">WRITE_FIRST</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_softecc">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_porta_input_of_softecc">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_width_a">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_write_width_b">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_ecc">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_regcea_pin">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_primitive">8kx2</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_memory_type">Single_Port_RAM</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_rsta_pin">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_byte_size">9</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_disable_out_of_range_warnings">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_pipeline_stages">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_regceb_pin">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_remaining_memory_locations">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_memory_latch_a">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_memory_latch_b">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_byte_write_enable">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_a">Always_Enabled</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_enable_b">Always_Enabled</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_port_a_enable_rate">100</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_rstb_pin">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_porta_output_of_memory_core">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_assume_synchronous_clk">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_disable_collision_warnings">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_port_a_write_rate">50</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_algorithm">Minimum_Area</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_fill_remaining_memory_locations">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_ecctype">No_ECC</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_port_b_clock">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_use_error_injection_pins">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_port_a_clock">100</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_width_a">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_read_width_b">32</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_type">SYNC</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_porta_output_of_memory_primitives">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_portb_output_of_softecc">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_port_b_enable_rate">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_reset_value_a">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_output_reset_value_b">0</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_load_init_file">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_register_portb_output_of_memory_core">false</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_coe_file">no_coe_file_loaded</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_error_injection_type">Single_Bit_Error_Injection</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_collision_warnings">ALL</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_priority_a">CE</spirit:configurableElementValue>
<spirit:configurableElementValue spirit:referenceId="parameter_reset_priority_b">CE</spirit:configurableElementValue>
</spirit:configurableElementValues>
<spirit:vendorExtensions>
<xilinx:instanceProperties xmlns:xilinx="http://www.xilinx.com">
<xilinx:projectOptions>
<xilinx:projectName>coregen</xilinx:projectName>
<xilinx:outputDirectory>./</xilinx:outputDirectory>
<xilinx:workingDirectory>./tmp/</xilinx:workingDirectory>
<xilinx:subWorkingDirectory>./tmp/_cg</xilinx:subWorkingDirectory>
</xilinx:projectOptions>
<xilinx:part>
<xilinx:device>xc6slx150t</xilinx:device>
<xilinx:deviceFamily>spartan6</xilinx:deviceFamily>
<xilinx:package>fgg676</xilinx:package>
<xilinx:speedGrade>-2</xilinx:speedGrade>
</xilinx:part>
<xilinx:flowOptions>
<xilinx:busFormat>BusFormatAngleBracketNotRipped</xilinx:busFormat>
<xilinx:designEntry>VHDL</xilinx:designEntry>
<xilinx:asySymbol>true</xilinx:asySymbol>
<xilinx:flowVendor>Foundation_ISE</xilinx:flowVendor>
<xilinx:addPads>false</xilinx:addPads>
<xilinx:removeRPMs>false</xilinx:removeRPMs>
<xilinx:createNDF>false</xilinx:createNDF>
<xilinx:implementationFileType>Ngc</xilinx:implementationFileType>
<xilinx:formalVerification>false</xilinx:formalVerification>
</xilinx:flowOptions>
<xilinx:simulationOptions>
<xilinx:simulationModel>Behavioral</xilinx:simulationModel>
<xilinx:simulationLanguage>VHDL_and_Verilog</xilinx:simulationLanguage>
<xilinx:foundationSym>false</xilinx:foundationSym>
</xilinx:simulationOptions>
</xilinx:instanceProperties>
</spirit:vendorExtensions>
</spirit:componentInstance>
</spirit:componentInstances>
<spirit:description></spirit:description>
<spirit:vendorExtensions>
<xilinx:instanceProperties xmlns:xilinx="http://www.xilinx.com">
<xilinx:projectOptions>
<xilinx:projectName>coregen</xilinx:projectName>
<xilinx:outputDirectory>./</xilinx:outputDirectory>
<xilinx:workingDirectory>./tmp/</xilinx:workingDirectory>
<xilinx:subWorkingDirectory>./tmp/_cg</xilinx:subWorkingDirectory>
</xilinx:projectOptions>
<xilinx:part>
<xilinx:device>xc6slx45t</xilinx:device>
<xilinx:deviceFamily>spartan6</xilinx:deviceFamily>
<xilinx:package>fgg484</xilinx:package>
<xilinx:speedGrade>-3</xilinx:speedGrade>
</xilinx:part>
<xilinx:flowOptions>
<xilinx:busFormat>BusFormatAngleBracketNotRipped</xilinx:busFormat>
<xilinx:designEntry>VHDL</xilinx:designEntry>
<xilinx:asySymbol>true</xilinx:asySymbol>
<xilinx:flowVendor>Foundation_ISE</xilinx:flowVendor>
<xilinx:addPads>false</xilinx:addPads>
<xilinx:removeRPMs>false</xilinx:removeRPMs>
<xilinx:createNDF>false</xilinx:createNDF>
<xilinx:implementationFileType>Ngc</xilinx:implementationFileType>
<xilinx:formalVerification>false</xilinx:formalVerification>
</xilinx:flowOptions>
<xilinx:simulationOptions>
<xilinx:simulationModel>Behavioral</xilinx:simulationModel>
<xilinx:simulationLanguage>VHDL_and_Verilog</xilinx:simulationLanguage>
<xilinx:foundationSym>false</xilinx:foundationSym>
</xilinx:simulationOptions>
</xilinx:instanceProperties>
</spirit:vendorExtensions>
</spirit:design>
# Date: Thu Feb 3 16:41:04 2011
SET addpads = false
SET asysymbol = true
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = false
SET designentry = VHDL
SET device = xc6slx45t
SET devicefamily = spartan6
SET flowvendor = Foundation_ISE
SET formalverification = false
SET foundationsym = false
SET implementationfiletype = Ngc
SET package = fgg484
SET removerpms = false
SET simulationfiles = Behavioral
SET speedgrade = -3
SET verilogsim = true
SET vhdlsim = true
SET workingdirectory = ./tmp/
# CRC: f66dfaab
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
<!-- -->
<!-- For tool use only. Do not edit. -->
<!-- -->
<!-- ProjectNavigator created generated project file. -->
<!-- For use in tracking generated file and other information -->
<!-- allowing preservation of process status. -->
<!-- -->
<!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
<version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
<sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_32x512.xise"/>
<files xmlns="http://www.xilinx.com/XMLSchema">
<file xil_pn:fileType="FILE_ASY" xil_pn:name="fifo_32x512.asy" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_SYMBOL" xil_pn:name="fifo_32x512.sym" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_32x512.veo" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_VHO" xil_pn:name="fifo_32x512.vho" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_USERDOC" xil_pn:name="fifo_generator_readme.txt" xil_pn:origination="imported"/>
</files>
<transforms xmlns="http://www.xilinx.com/XMLSchema"/>
</generated_project>
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$44640<,[o}e~g`n;"2*726&;$9,)?40893456789:;8=5?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>;;1:BA4=6;2;%<<:4158JJUSS2HNO^L2>3;2=51=6<3CE\XZ5AEFQF974294:7?64220166479;18>7GAPTV9@LG;;80;2<<4338JJUSS2MCI0>?50?31?64=AGZ^X7jfn=12>586;2996B[[PTV9@JG;;80;2<=4338LQQVR\3NDN1=>:1<20>552F__\XZ5dnww867=8720?>=<03235>2692>1EC^ZT;FJTD:4294:=6:5IORVP?BNXK686=0>0:69MKVR\3]NM1=50?33?1<NFY__6ZKM<283:44<<3E^X][[:EMSE95=87;9794@UURVP?BHXK686=0>;7082<2<>03===59984:23?>>?3=548=;7C7?3GFI11=MLONA@C24>0FIHKJMLONA@CBED`<>zfs88zigf6;0(553>L:75:483620>>3:8;0595601;1?<0?30<=5;766028=30>>03=:479974:5`=>2@D[YY4rne\ahvsqV~c~h}g<983:73<13CE\XZ5psmd[`kw|pUdk|h^cpw`ts410;2?;49;KMTPR=x{elShctx]wlwct`Vdnklzj<983:4b<13CE\XZ5psmd[cskdV~c~h}g<983:72<13CE\XZ5psmd[cskdV~c~h}g_`qpawr;03:5>956:HLSQQ<wzfmTjxbc_ujqavnXflmjxh27:1<2<>?=G\^[YY4kauc\gjsi|521<3?m;88LQQVR\3xoSio{a^alqkr;03:5=o56:NWWTPR={UomyoPcnwmp9>=8720MLON6@CB55=FIHKJMLO9A@CBEDG?3HNO^L2?>89B@ATF48:556OKDSC?548>3HNO^L2>2?`8EABUI5;86=06;@FGVD:6;720MIJ]A=3=<>GCL[K7>364AEFQE95902KOH_O34?:8EABUI5?546OKDSC?2;><IMNYM1918:CG@WG;0720MIJ]A=;=<>GCL[H7<374AEFQF977601JHI\M<03==>GCL[H7=?0m;@FGVG:6;3:556OKDS@?568?3HNO^O2>>99B@ATE4;437LJKRC>0:==FLMXI0907;@FGVG:2611JHI\M<7<;?DBCZK6<255NDEPA8=8?3HNO^O26>29BHI?<IZSEOR\JG29AQ7><J\YTECH@1:A1?FC6:2ICINEPLHAFJVCX\PZN>6MF4:AOOD2<KEAI?6MCR89@KHKN\]OO=95LOSG\C@HBZH^BCCQFNGM4?FTBI]OO=6Jl;ECWEZQNL]BTMn5KAUC\SLBS@VH97IG9;EKB85803MCJ0<>17:FJE9766>1OEL2>2?58@LG;9:4<7IGN<06=3>BNI5;>2:5KI@>22;1<L@K7=:08;EKB84>9?2NBM1?6>79GMD:66>1OEL2=0?58@LG;:84<7IGN<30=3>BNI5882:5KI@>10;1<L@K7>808;EKB8709?2NBM1<8>69GMD:507=0HDO328<5?AOF4;4<7IGN<22==>BNI59:6=08;EKB8679>2NBM1=16:FJE929>2NBM1;16:FJE909>2NBM1916:FJE9>9>2NBM1716:FJF969?2NBN1??>69GMG:697=0HDL313<4?AOE4895;6JFB=37:2=CAK6:9394DH@?53803MCI0<917:FJF97?6>1OEO2>9?48@LD;97=0HDL321<4?AOE4;;5;6JFB=01:2=CAK69?394DH@?61803MCI0?;17:FJF9416>1OEO2=7?58@LD;:14<7IGM<3;=2>BNJ585;6JFB=13:<=CAK68=7>17:FJF9566?1OEO2<>79GMG:36?1OEO2:>79GMG:16?1OEO28>79GMG:?6?1OEO26>69GMUG;87=0HD^N<0<4?AOWI58556JFP@>0>5803MC[M1=17:FJTG:76>1OE]L31?58@LVE4;427IG_B=194;1<L@ZI0>09;EMB85803MEJ0<>17:FLE9766>1OCL2>2?58@JG;9:4<7IAN<06=3>BHI5;>2:5KO@>22;1<LFK7=:08;EMB84>9?2NDM1?6>79GKD:66>1OCL2=0?58@JG;:84<7IAN<30=3>BHI5882:5KO@>10;1<LFK7>808;EMB8709?2NDM1<8>69GKD:507=0HBO328<5?AIF4;4<7IAN<22==>BHI59:6=08;EMB8679>2NDM1=16:FLE929>2NDM1;16:FLE909>2NDM1916:FLE9>9>2NDM1717:FLEZTBO?1OCO2?>69GKG:687=0HBL310<4?AIE4885;6J@B=30:2=CGK6:8394DN@?50803MEI0<817:FLF9706>1OCO2>8?58@JD;904=7IAM<0<4?AIE4;:5;6J@B=02:2=CGK69>394DN@?66803MEI0?:17:FLF9426>1OCO2=6?58@JD;:>4<7IAM<3:=3>BHJ5822;5KOC>1:2=CGK68<374DN@?74<76>1OCO2<1?48@JD;;7<0HBL34?48@JD;=7<0HBL36?48@JD;?7<0HBL38?48@JD;17=0HBLPRDE4?AIWI5:5;6J@P@>2:2=CGYK7>374DNRB86<76>1OC]O33?58@JVE494<7IA_B=3=3>BHXK69245KOQ@?7?69?2ND\O2<>39F06=BFH90ICLm;DL\VVRUIDUJn6KA_SQWVDKXJ=1M>K>:;GCOW@4<NM90JIM;;GF@A6=ALY>0JI^J1:E0?BHC92C97D>=;H31?L453@997D:=;H7;?LHN\YU;<55FNHVS[57?3@DBX]Q?299JJLRWW9937D@FTQ]30==NF@^[S=;7;HLJPUY7>11BBDZ__15:?LHN\Z^JXH94IOKW[5603@DBXR>>7:KMMQY7:>1BBDZP0258MKOSW9><7D@FT^263>OIA]U;::5FNHV\421<AGC_S=68;HLJPZ6>?2CEEYQ?A69JJLRX8K=0ECG[_1A4?LHN\V:O;6GAIU]3A2=NF@^T<K94IOKW[4603@DBXR?>7:KMMQY6:>1BBDZP1258MKOSW8><7D@FT^363>OIA]U:::5FNHV\521<AGC_S<68;HLJPZ7>?2CEEYQ>A69JJLRX9K=0ECG[_0A4?LHN\V;O;6GAIU]2A2=NF@^T=K94IOKW[7603@DBXR<>7:KMMQY5:>1BBDZP2258MKOSW;><7D@FT^063>OIA]U9::5FNHV\621<AGC_S?68;HLJPZ4>?2CEEYQ=A69JJLRX:K=0ECG[_3A4?LHN\V8O;6GAIU]1A2=NF@^T>K94IOKW[6603@DBXR=>7:KMMQY4:>1BBDZP3258MKOSW:><7D@FT^163>OIA]U8::5FNHV\721<AGC_S>68;HLJPZ5>?2CEEYQ<A69JJLRX;K=0ECG[_2A4?LHN\V9O;6GAIU]0A2=NF@^T?K84IOKW[D0<AGC_SO74IOKW[COKM:1BB[<4LH48HJGCMM=0@BIFC@N7?ISS:=1GYY=;;MWW01=K]]??7A[[649NWBII=2G^TNWl;LcikwPbzzcdbn5BiomqR`ttafd97C?;;O3361=I999?7C??459M55333G;;:95A1157?K770=1E==7<;O320>H699>0B<?>4:L2572<F8;886@>1568J472<2D:=;:4N0340>H691>0B<?63:L261=I9;:?7C?=159M57433G;9?95A1367?K75==1E=?8;;O3131=I9;2?7C?=929M562<F89;86@>3068J455<2D:?>:4N0170>H6;190B<:;;O3746=I9<90B<8;;O35=6=I9>90B<6<;O3:6>H5;2D9<>5A2018J7443G88?6@=429M605<F;<87C<83:L1<6=I:090B>><;O127>H4::1E?>=4N260?K52;2D8:>5A3618J6>43G92>6@;3:L746=I<890B9<<;O607>H3<;1E9?5A729M<45<F1887C6<3:L;06=I0<90B58<;O:47>H?0:1E44<4N818J<643G3:?6@6229M=65<F0>87C7:3:L:26=I1>90B46i;O@\FPUWAGU[^B^\7:LFPRIUC=1ECCK>;N08KN7<X=1[M_Zn;QKM[GSTAMRi7]GA_CWPJDKB12Z@SEBZTOO0?UTB92[j7_OBB04AS@T13[OLOHO9;SGDG@D33[Y_M95]SU@4?WUS\PZNi6\\T^RQMJTN\PUJi6\\T^RQMJTN\PUI=6]>3:QJIZEHDECXEB@PCIG@Od=TADUOI[GLE79PKPTDM11X\L\[AO44?VTQIEUJ;6]]V@N\F1=TQGI?7Y\ZE59W]UC4l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR:VS_JPPOVQ_4[XPFXT9?Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR;VS_JPPOVQ_7[XPFXT9<Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR8VS_JPPOVQ_6[XPFXT9=Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR9VS_JPPOVQ_1[XPFXT84Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR>VS_JPPOVQ_0[XPFXT85Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR?VS_JPPOVQ_3[XPFXT8:Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR<VS_JPPOVQ_2[XPFXT8;Q`_ym?4;74l2_;#j|i.sd,cf~)keas#@v`r^PG[UHSZR=VS_JPPOVQ_=[XPFXT88Q`_ym?4;74k2_;#j|i.sd,cf~)keas#@v`r^UQ[UHSZR:VSZ\PPOVQ_4[XPFXT4RaPxn>3:45d3\:$kh!rg-dg}(ddbr$Aua}_VP\TKRUS8WT[_Q_NUPX6XY_G[U<SbQwo=2=56e<]9%l~k }f.e`|+ekcq%Ftb|PWS]SJQT\:TU\^R^ATSY0YZ^HZV<TcRv`<1<27f=R8&myj#|i/fa{*fjlp&GscQXR^RMPW]4UV]YS]@[RZ6^[]IUW<UdSua30?30g>S7'nxm"h gbz-gim'Drd~RY]_QLWV^2ZW^XT\CZ][4_\\JTX<VeTtb2?>01`?P6(o{l%~k!hcy,`hn~(EqeySZ\PPOVQ_0[X_[U[BY\T6\][KWY4WfUsc1>112a8Q5)`zo$yj"ilx/aoo})JpfxT[_Q_NUPX2XYPZVZEX_U8]^ZLVZ4XgVrd0=0>3b9V4*aun'xm#jmw.bnh|*Kg{U\^R^ATSY4YZQUWYD_^V6R_YMQ[4YhWqe7<3?<1:W3+bta&{l$knv!cmi{+WBXXG^YW=SPRE]SJQT\9TUSC_Q:2^m05>S7'nxm"h gbz-gim'[NT\CZ][0_\VAYWF]XP>PQWOS]65Zi492_;#j|i.sd,cf~)keas#_JPPOVQ_7[XZMU[BY\T3\][KWY28Ve8=6[?/fpe*w`(ojr%oaew/SF\TKRUS:WT^IQ_NUPX0XY_G[U?5Ra<1:W3+bta&{l$knv!cmi{+WBXXG^YW9SPRE]SJQT\=TUSC_Q;8^m05>S7'nxm"h gbz-gim'[NT\CZ][4_\VAYWF]XP:PQWOS]73Zi492_;#j|i.sd,cf~)keas#_JPPOVQ_3[XZMU[BY\T7\][KWY3>Ve8=6[?/fpe*w`(ojr%oaew/SF\TKRUS>WT^IQ_NUPX<XY_G[U?9Ra<0:W3+bta&{l$knv!cmi{+RTXXG^YW=SPWS]SJQT\9TUSC_Q7_n13?P6(o{l%~k!hcy,`hn~(_[U[BY\T1\]TVZVI\[Q9QRV@R^5\k66<]9%l~k }f.e`|+ekcq%\^R^ATSY1YZQUWYD_^V=R_YMQ[3Yh;91^<"i}f/pe+be&jf`t"Y]_QLWV^5ZW^XT\CZ][5_\\JTX=Ve8<6[?/fpe*w`(ojr%oaew/VP\TKRUS=WT[_Q_NUPX1XY_G[U?Sb=?;T2,cw`)zo%lou lljz,SWYWF]XP9PQXR^RMPW]1UVRD^R=Po228Q5)`zo$yj"ilx/aoo})PZVZEX_U9]^UQ[UHSZR=VSUA]_3]l75=R8&myj#|i/fa{*fjlp&]YS]@[RZ5^[RTXXG^YW5SPXNP\5Zi592_;#j|i.sd,cf~)keas#jPpovq[goi4949=6[?/fpe*w`(ojr%oaew/sf\tkruWkce0<0=1:W3+bta&{l$knv!cmi{+wbXxg~ySoga<3<15>S7'nxm"h gbz-gim'{nT|cz}_ckm868592_;#j|i.sd,cf~)keas#jPpovq[goi4=49=6[?/fpe*w`(ojr%oaew/sf\tkruWkce080=1:W3+bta&{l$knv!cmi{+wbXxg~ySoga<7<15>S7'nxm"h gbz-gim'{nT|cz}_ckm828592_;#j|i.sd,cf~)keas#jPpovq[goi4149<6[?/fpe*w`(ojr%oaew/sf\tkruWkceS=<?;T2,cw`)zo%lou lljz,vaYwf}xTnd`P1328Q5)`zo$yj"ilx/aoo})ulVzexQmio]165=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ5582_;#j|i.sd,cf~)keas#jPpovq[goiW=8;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT9?>4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ9219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^514>S7'nxm"h gbz-gim'{nT|cz}_ckm[=473\:$kh!rg-dg}(ddbr$~iQnup\cf:76;:0Y=!hrg,qb*adp'iggu!}d^rmpwY`k5;5>=5Z0.eqb+ta'nis"nbdx.pg[uhszVmh0?0=0:W3+bta&{l$knv!cmi{+wbXxg~ySjm33?03?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb>7:76<]9%l~k }f.e`|+ekcq%yhR~ats]dg939:91^<"i}f/pe+be&jf`t"|k_qlwvZad4?49<6[?/fpe*w`(ojr%oaew/sf\tkruWni7;3<?;T2,cw`)zo%lou lljz,vaYwf}xTkn27>0d8Q5)`zo$yj"ilx/aoo})ulVzexQhc^22b>S7'nxm"h gbz-gim'{nT|cz}_fa\54`<]9%l~k }f.e`|+ekcq%yhR~ats]dgZ46n2_;#j|i.sd,cf~)keas#jPpovq[beX;8l0Y=!hrg,qb*adp'iggu!}d^rmpwY`kV>:j6[?/fpe*w`(ojr%oaew/sf\tkruWniT9<h4U1-dvc(un&mht#mcky-q`Zvi|{UloR8>f:W3+bta&{l$knv!cmi{+wbXxg~ySjmP70d8Q5)`zo$yj"ilx/aoo})ulVzexQhc^:12>S7'nxm"h gbz-gim'{nT|cz}_fa\evtbo5:5>;5Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef>2:70<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlm7>3<9;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd8685>2_;#j|i.sd,cf~)keas#jPpovq[beXizxnk1:1279V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqab:26;<0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hi36?05?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`4>49:6[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg=:=60=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU;>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]260=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU9>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]060=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU?>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]660=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU=>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]460=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU3>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5969:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9595>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5929:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=7=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=181289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc95=5>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g59>9;01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1Z:^[wcc}joTtb|P17]l7d=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=V6R_sggqfcXpfxT=;Q`12;8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8Q3QR|jdtaf[}iuW8=Tc>o4U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4]?UVxnhxmj_ymq[41Xg89m7X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3X<XYummhiRv`r^3;5Z~h494:?45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5^>ZW{ooynkPxnp\5=Yh;o1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1Z:^[wcc}joTtb|P183\|j:768927X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3X<XYummhiRv`r^3:[j5a3\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{olSi?T8\]qaasdmVrd~R<?1^zl8586;01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1Z:^[wcc}joTtb|P21]l7`=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=V6R_sggqfcXpfxT><?Pxn>3:6?<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<U7]^pf`pebWqeyS??Po2g8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8Q3QR|jdtaf[}iuW;8:Sua30?61?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`Wm;P4PQ}eew`aZ~hzV89=Rv`<1<\WR6412_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj>[9_\v`brklUscQ=2^m0a>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:W5SPrdfvg`Yg{U9?<Qwo=2=7<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=V6R_sggqfcXpfxT>>Q`299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V:946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[44?3\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{olSi?P23:8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8U8>55Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5Z2502_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj>_40;?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`Wm;T:?64U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4Y0:11^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1^:15>S7'nxm"h gbz-gim'~xT|cz}_ckm858592_;#j|i.sd,cf~)keas#z|Ppovq[goi4849=6[?/fpe*w`(ojr%oaew/vp\tkruWkce0?0=1:W3+bta&{l$knv!cmi{+rtXxg~ySoga<2<15>S7'nxm"h gbz-gim'~xT|cz}_ckm818592_;#j|i.sd,cf~)keas#z|Ppovq[goi4<49=6[?/fpe*w`(ojr%oaew/vp\tkruWkce0;0=1:W3+bta&{l$knv!cmi{+rtXxg~ySoga<6<15>S7'nxm"h gbz-gim'~xT|cz}_ckm8=8582_;#j|i.sd,cf~)keas#z|Ppovq[goiW98;7X> gsd-vc)`kq$h`fv ws]sjqtXj`dT=?>4U1-dvc(un&mht#mcky-tvZvi|{UiecQ=219V4*aun'xm#jmw.bnh|*quWyd~Rlfn^114>S7'nxm"h gbz-gim'~xT|cz}_ckm[1473\:$kh!rg-dg}(ddbr${Qnup\flhX=;:0Y=!hrg,qb*adp'iggu!xr^rmpwYeagU=>=5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbR9=0:W3+bta&{l$knv!cmi{+rtXxg~ySoga_903?P6(o{l%~k!hcy,`hn~({U{by|Pgb>3:76<]9%l~k }f.e`|+ekcq%|~R~ats]dg979:91^<"i}f/pe+be&jf`t"y}_qlwvZad4;49<6[?/fpe*w`(ojr%oaew/vp\tkruWni7?3<?;T2,cw`)zo%lou lljz,swYwf}xTkn2;>328Q5)`zo$yj"ilx/aoo})pzVzexQhc=7=65=R8&myj#|i/fa{*fjlp&}yS}`{r^e`838582_;#j|i.sd,cf~)keas#z|Ppovq[be;?78;7X> gsd-vc)`kq$h`fv ws]sjqtXoj632<h4U1-dvc(un&mht#mcky-tvZvi|{UloR>>f:W3+bta&{l$knv!cmi{+rtXxg~ySjmP10d8Q5)`zo$yj"ilx/aoo})pzVzexQhc^02b>S7'nxm"h gbz-gim'~xT|cz}_fa\74`<]9%l~k }f.e`|+ekcq%|~R~ats]dgZ26n2_;#j|i.sd,cf~)keas#z|Ppovq[beX=8l0Y=!hrg,qb*adp'iggu!xr^rmpwY`kV<:j6[?/fpe*w`(ojr%oaew/vp\tkruWniT;<h4U1-dvc(un&mht#mcky-tvZvi|{UloR6=6:W3+bta&{l$knv!cmi{+rtXxg~ySjmParpfc969:?1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyij2>>348Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`a;:78=7X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh<2<12>S7'nxm"h gbz-gim'~xT|cz}_fa\evtbo5>5>;5Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef>6:70<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlm7:3<9;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd8285>2_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnk161249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY7:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ>249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY5:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ<249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY3:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ:249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY1:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ8249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY?:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=2=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=1?1289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9585>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5959:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=6=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=1;1289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc95<5>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5919:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=:=7`=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=V6R_sggqfcXpfxT==?Pxn>3:14<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<U7]^pf`pebWqeyS<>>_ym?4;YT_9927X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3X<XYummhiRv`r^33[j5b3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?T8\]qaasdmVrd~R?>1^zl858412_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnkRj>[9_\v`brklUscQ>1^m0<>S7'nxm"h gbz-gim'~xT|cz}_fa\evtboVn:W5SPrdfvg`Yg{U?Sb=6;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7\0TUyii{le^zlvZ2Xg8937X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3X<XYummhiRv`r^7\k6?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<U7]^pf`pebWqeyS8Q`12g8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8Q3QR|jdtaf[}iuW?;Ttb2?>01;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;P4PQ}eew`aZ~hzV<Tc>k4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4]?UVxnhxmj_ymq[27Xpf6;2<=7;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7\0TUyii{le^zlvZ1Xg:o0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0Y;YZtbl|inSua}_93\|j:768937X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3X<XYummhiRv`r^:\k6b<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<U7]^pf`pebWqeyS4?Pxn>3:6><]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<U7]^pf`pebWqeyS4Q`299V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9V:946[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg^f2[44?3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?P23:8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8U8>55Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5Z2502_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnkRj>_40;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;T:?64U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4Y0:11^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1^:1a>S7'nxm"h gm2-va)`zhy%~~z|/b2,chs&jky~t`jt=2=6`=R8&myj#|i/fn3*wb(o{kx"}{s.a3+bkrp'ij~waeu>2:7c<]9%l~k }f.eo4+tc'nxj#||tr-`4*aj}q$hm|vndv?6;4b3\:$kh!rg-dh5(ul&mym~ }suq,g5)`e|r%ol|}yogw8685n2_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(ods"jcT0\,di4(j9;l0Y=!hrg,qb*ak8'xo#j|ns/pppv)d8&mfyu hmZ3^*bkt&dy9j6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$k`{w.foX6X(`ez$f?h4U1-dvc(un&mg<#|k/fpbw+tt|z%h<"ibuy,di^5Z&ngx"`}=f:W3+bta&{l$ka>!re-dvdu)zz~x#n> glw{*bk\<T$la~ bs318Q5)`zo$yj"ic0/pg+btf{'xxx~!l0.t28585<2_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(~86;2<<<;T2,cw`)zo%l`= }d.eqev(u{}y$o=!y1=3=61=R8&myj#|i/fn3*wb(o{kx"}{s.a3+s7;97;9?6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$z<2=>368Q5)`zo$yj"ic0/pg+btf{'xxx~!l0.t28786::1^<"i}f/pe+bj7&{n$ko|.sqww*e7';7?3<;;T2,cw`)zo%l`= }d.eqev(u{}y$o=!y1=1=575<]9%l~k }f.eo4+tc'nxj#||tr-`4*p64=4986[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$z<2;>00f?P6(o{l%~k!hl1,q`*auiz$yy} c0-dip~)khxyuck{<1<1a>S7'nxm"h gm2-va)`zhy%~~z|/b3,chs&jky~t`jt=3=6`=R8&myj#|i/fn3*wb(o{kx"}{s.a2+bkrp'ij~waeu>1:7c<]9%l~k }f.eo4+tc'nxj#||tr-`5*aj}q$hm|vndv?7;4a3\:$kh!rg-dh5(ul&mym~ }suq,g4)`e|r%k`U?]/en5+k6:o1^<"i}f/pe+bj7&{n$ko|.sqww*e6'ng~t#ib[0_-chu)ez8m7X> gsd-vc)`d9$yh"i}ar,qwqu(k8%laxv!glY1Y+aj{'gx>k5Z0.eqb+ta'nf;"j gscp*wus{&i:#jczx/en_6[)ody%a~<i;T2,cw`)zo%l`= }d.eqev(u{}y$o<!hmtz-ch]3U'mf#c|229V4*aun'xm#jb?.sf,cwgt&{y"m>/w3?4;433\:$kh!rg-dh5(ul&mym~ }suq,g4)q95:5=?=4U1-dvc(un&mg<#|k/fpbw+tt|z%h="x><0<10>S7'nxm"h gm2-va)`zhy%~~z|/b3,r4:668887X> gsd-vc)`d9$yh"i}ar,qwqu(k8%}=1<1259V4*aun'xm#jb?.sf,cwgt&{y"m>/w3?6;75;2_;#j|i.sd,ci6)zm%l~l}!rrvp+f7(~8682?:4U1-dvc(un&mg<#|k/fpbw+tt|z%h="x><2<266=R8&myj#|i/fn3*wb(o{kx"}{s.a2+s7;<78?7X> gsd-vc)`d9$yh"i}ar,qwqu(k8%}=1:11328Q5)`zo$yj"ic0/pg+btf{'xxx~!lolr36a=R8&myj#|i/fn3*wb(o{kx"}{s.aliu6Xkfg{=RA]_4]l6`=R8&myj#|i/fn3*wb(o{kx"}{s.aliu6Xkfg{=RA]_4]l576<]9%l~k }f.eo4+tc'nxj#||tr-`khv6:01^<"i}f/pe+bj7&{n$ko|.sqww*tfeVof|ywPfc]j63=R8&myj#|i/fn3*wb(o{kx"}{s.pbiZcjx}sTe9>4U1-dvc(un&mg<#|k/fpkb+ton&GfyuQ}al]ueiocW`dSJ@K_6;\kZKRPV;9Sb?>279V4*aun'xm#jb?.sf,cwna&{bm#ob_wcomaYc9:30Y=!hrg,qb*ak8'xo#j|gf/pkb*tfeV|j`djPiov\CKBX?0UdS@[W_00\k4b<]9%l~k }f.eo4+tc'{kfSjPeo]j515<]9%l~k }f.eo4+tc'{zex!Bmtz\cf6)kfexV6R_FLG[3?XgVg~tR<POTV25ZOI^V:8h6[?/fpe*w`(oe:%~i!}povq+HkrpVmh<#m`uovX<XY@FMU=5RaPmtz\6ZIR\;;8h6[?/fpe*w`(oe:%~i!}povq+HkrpVmh<#m`uovX<XY@FMU=5RaPmtz\6ZIR\:;9?6[?/fpe*w`(oe:%~i!}povq+be7&je~by2?>318Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw8485;2_;#j|i.sd,ci6)zm%y|cz}/fa3*firf}692?=4U1-dvc(un&mg<#|k/srmpw)`k9$hcx`{<2<17>S7'nxm"h gm2-va)uxg~y#jm?.bmvjq:36;90Y=!hrg,qb*ak8'xo#~ats-dg5(dg|d080=3:W3+bta&{l$ka>!re-qtkru'ni;"naznu>5:75<]9%l~k }f.eo4+tc'{zex!hc1,`kphs4>49?6[?/fpe*w`(oe:%~i!}povq+be7&je~by27>2;8Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw_=[XOGNT:4Q`_lw{[7YH]]6;2>74U1-dvc(un&mg<#|k/srmpw)`k9$hcx`{[9_\CKBX>0UdS`{w_3]LQQ:66:30Y=!hrg,qb*ak8'xo#~ats-dg5(dg|dW5SPGOF\2<YhWdsS?Q@UU>1:6?<]9%l~k }f.eo4+tc'{zex!hc1,`kphsS1WTKCJP68]l[hsW;UDYY2<>2`8Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw_=[XOGNT:4Q`_lw{[7YH]]682<?<a:W3+bta&{l$ka>!re-qtkru'ni;"naznuY;YZAILV<2SbQbuy]1[JSS4:49?h5Z0.eqb+ta'nf;"j rqlwv*ad8'idyczT8\]DJAY11VeTaxvP2^MVP959Wkno<>74U1-dvc(un&mg<#|k/srmpw)`k9$hcx`{[9_\CKBX>0UdS`{w_3]LQQ:36:k0Y=!hrg,qb*ak8'xo#~ats-dg5(dg|dW5SPGOF\2<YhWdsS?Q@UU>7:45>3\:$kh!rg-dh5(ul&x{by| gb2-gjsi|R2VSJ@K_7;\kZkrpV8TCXZ35?1b?P6(o{l%~k!hl1,q`*twf}x$kn>!cnwmp^>ZWNDOS;7Po^ov|Z4XG\^793?<9:W3+bta&{l$ka>!re-qtkru'ni;"naznuY;YZAILV<2SbQbuy]1[JSS4?48m6[?/fpe*w`(oe:%~i!}povq+be7&je~byU7]^EM@Z0>WfUfyuQ=_NWW8386;01^<"i}f/pe+bj7&{n$~}`{r.e`4+eh}g~P4PQHNE]5=ZiXe|rT>RAZT=5=7d=R8&myj#|i/fn3*wb(zyd~"il0/alqkr\0TULBIQ99^m\ip~X:VE^X19112;8Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw_=[XOGNT:4Q`_lw{[7YH]]632>j4U1-dvc(un&mg<#|k/srmpw)`k9$hcx`{[9_\CKBX>0UdS`{w_3]LQQ:?6VY\<?<4U1-dvc(un&mg<#|k/srmpw)`k9$hcx`{_101?P6(o{l%~k!hl1,q`*twf}x$kn>!cnwmpZ75:2_;#j|i.sd,ci6)zm%y|cz}/fa3*firf}U9>?5Z0.eqb+ta'nf;"j rqlwv*ad8'idyczP3308Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw[1453\:$kh!rg-dh5(ul&x{by| gb2-gjsi|V?9>6[?/fpe*w`(oe:%~i!}povq+be7&je~byQ9239V4*aun'xm#jb?.sf,vuhsz&mh<#m`uov\374<]9%l~k }f.eo4+tc'{zex!hc1,`kphsW18=7X> gsd-vc)`d9$yh"|nup,cf6)kfexRj><1<12>S7'nxm"h gm2-va)uxg~y#jm?.bmvjqYc95;5>;5Z0.eqb+ta'nf;"j rqlwv*ad8'idyczPd0>1:70<]9%l~k }f.eo4+tc'{zex!hc1,`kphsWm;7?3<9;T2,cw`)zo%l`= }d.psjqt(oj:%ob{at^f28185>2_;#j|i.sd,ci6)zm%y|cz}/fa3*firf}Uo=1;1279V4*aun'xm#jb?.sf,vuhsz&mh<#m`uov\`4:16;<0Y=!hrg,qb*ak8'xo#~ats-dg5(dg|dSi?37?05?P6(o{l%~k!hl1,q`*twf}x$kn>!cnwmpZb6414996[?/fpe*w`(oe:%~i!}povq+be7&je~byQk1^211>S7'nxm"h gm2-va)uxg~y#jm?.bmvjqYc9V;996[?/fpe*w`(oe:%~i!}povq+be7&je~byQk1^011>S7'nxm"h gm2-va)uxg~y#jm?.bmvjqYc9V9996[?/fpe*w`(oe:%~i!}povq+be7&je~byQk1^611>S7'nxm"h gm2-va)uxg~y#jm?.bmvjqYc9V?996[?/fpe*w`(oe:%~i!}povq+be7&je~byQk1^411>S7'nxm"h gm2-va)uxg~y#jm?.bmvjqYc9V=996[?/fpe*w`(oe:%~i!}povq+be7&je~byQk1^:1b>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVd;<?;Pcx>3:7`<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnTb=>=5^az8485n2_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohR`?037\g|:56;l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPn1211Ze~4:49j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^l3473Xkp6?2?h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\j565=Vir080=f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`Zh78;?Tot29>3d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXf9:99Rmv<6<1b>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVd;<?;Pcx>;:66<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnTb=>=5^nvp979;91^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&GjhiQa0106[iss4;48<6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^l3473Xd|~7?3=?;T2,cw`)zo%l`= xr.etev(`xo$|~}h M`fg[k67:<Ugyy2;>228Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXf9:99Rbzt=7=75=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*KflmUe<=<:_mww838482_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohR`?037\hpr;?79;7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Aljk_o2360Yk}}632>>4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\j565=Vf~x171319V4*aun'xm#jb?.vp,crgt&nzm"z|f.Ob`aYi898>Sua}<0<04>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVd;<?;Pxnp?6;573\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(EhnoSc>?24]{kw:46::0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPn1211Z~hz5>5?=5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"Cnde]m4542Wqey080<0:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`Zh78;?Ttb|36?13?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,IdbcWg:;>8Qwos>4:66<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnTb=>=5^zlv9>9;91^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&GjhiQa0106[}iu4048?6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@m`mqcq[Zh78:8Tot2?>218Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-Ngjkwi{UTb=><2^az8484;2_;#j|i.sd,ci6){%l{l}!gqd-swva'Dida}o}_^l3464Xkp692>=4U1-dvc(un&mg<#y}/fubw+awn'}y|k!BcnosewYXf9:8>Rmv<2<07>S7'nxm"h gm2-sw)`hy%k}h!wsre+HeheykySR`?020\g|:36:>0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%Fobcas]\j564:Vf~x1>1359V4*aun'xm#jb?.vp,crgt&nzm"z|f.O`khvfzVUe<===_mww8484<2_;#j|i.sd,ci6){%l{l}!gqd-swva'Dida}o}_^l3464Xd|~7>3=;;T2,cw`)zo%l`= xr.etev(`xo$|~}h MbmntdtXWg:;??Qcuu>0:62<]9%l~k }f.eo4+qu'n}j#if/uqtc)Jkfg{mQPn1206Zjr|5>5?>5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"ClolrbvZYi8999Sa{{dh17?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,IfijxhxTSc>?33]oqqbn9:>0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%Fobcas]\j564:Vf~xig=359V4*aun'xm#jb?.vp,crgt&nzm"z|f.O`khvfzVUe<===_mww`l54<2_;#j|i.sd,ci6){%l{l}!gqd-swva'Dida}o}_^l3464Xd|~oe9==;T2,cw`)zo%l`= xr.etev(`xo$|~}h MbmntdtXf9:;9Rmv<1<06>S7'nxm"h gm2-sw)`hy%k}h!wsre+HeheykySc>?04]`}979;;1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&Ghc`~nr^l3453Xkp692><4U1-dvc(un&mg<#y}/fubw+awn'}y|k!BcnosewYi89:>Snw33?11?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,IfijxhxTb=>?5^az8184;2_;#j|i.sd,ci6){%l{l}!gqd-swva'Dida}o}_o2340Yk}}6;2>=4U1-dvc(un&mg<#y}/fubw+awn'}y|k!BcnosewYi89:>Sa{{<0<07>S7'nxm"h gm2-sw)`hy%k}h!wsre+HeheykySc>?04]oqq:56:90Y=!hrg,qb*ak8'}y#jyns/esb+quxo%Fobcas]m4562We0>0<3:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/LaliuguWg:;<8Qcuu>7:64<]9%l~k }f.eo4+qu'n}j#if/uqtc)Jkfg{mQa0126[issl`987X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Anabp`p\j567=Vf~xig>329V4*aun'xm#jb?.vp,crgt&nzm"z|f.O`khvfzVd;<=;Pltvgm7543\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(Ejef|l|Pn1231Zjr|mc8?>5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"ClolrbvZh789?T`xzki563?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,[ZY_DGGTSR>P_^O`khvfzVd;<=;Pltvgm17<]9%l~k }f.eo4+qu'n}j#if/uqtc)XWVRGB@QP_0]\[HeheykySc>?04]oqqbn9=;0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%TSRVCNL]\[7YXWDida}o}_o2340Yk}}nb>9?4U1-dvc(un&mg<#y}/fubw+awn'}y|k!P_^ZOJHYXW:UTS@m`mqcq[k678<Ugyyjf3538Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-\[Z^KFDUTS9QP_LaliuguWg:;<8Qcuufj017<]9%l~k }f.eo4+qu'n}j#if/uqtc)XWVRGB@QP_4]\[HeheykySR`?020\hprca=80Y=!hrg,qb*ak8'}y#jyns/esb+quxo%TSRVCNL]\[3YXWDida}o}_^l3464Xd|~oe<:=;T2,cw`)zo%l`= xr.etev(`xo$|~}h _^][HKKXWV=TSRClolrbvZYi8999Sa{{dh076>S7'nxm"h gm2-sw)`hy%k}h!wsre+ZYXPEDFSRQ7_^]Ngjkwi{UTb=><2^nvpao4<;1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&UTSUBAM^]\=ZYXEjef|l|P_o2377Yk}}nb8?;4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Pn12067`<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg8485n2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]sea:56;l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugc4:49j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwim6?2?h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!kigd\tkruWyko080=f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{mi29>3d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok<6<1b>S7'nxm"h gm2-sw)`hy%k}h!wsre+aoanVzexQae>;:7`<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg8<85m2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]seaY6:l1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&nbjkQnup\tdbX:;o0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugcW:8n7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$hdhi_qlwvZvflV>9i6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwimU>>h5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"jffg]sjqtXxhnT:?k4U1-dvc(un&mg<#y}/fubw+awn'}y|k!kigd\tkruWykoS:<j;T2,cw`)zo%l`= xr.etev(`xo$|~}h dhde[uhszVzjhR6=e:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{miQ6269V4*aun'xm#jb?.vp,crgt&nzm"z|f.l3473;978<7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$b=>=5=0=62=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*h78;?7?3<8;T2,cw`)zo%l`= xr.etev(`xo$|~}h n1211929:>1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&d;<?;35?04?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,j565=5<5>:5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"`?037?3;403\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(f9:99161269V4*aun'xm#jb?.vp,crgt&nzm"z|f.l3473;178j7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$|ah_gwohZo492_;#j|i.sd,ci6){%l{l}!gqd-swva'yxdkRhzlm]j[wusxf~856[?/fpe*w`(oe:%{!hw`q-svrt'Dg~tRm`mq3\CKBX0:UdS@[W_06\k475m2_;#j|i.sd,ci6){%l{l}!wrvp+f7(ods"no}rxlfp969:l1^<"i}f/pe+bj7&~x$kzo|.vqww*e6'ng~t#mnrs{maq:66;o0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&mfyu laspzj`r;:78n7X> gsd-vc)`d9$|~"ixar,twqu(k8%laxv!c`pq}kcs4:49j6[?/fpe*w`(oe:%{!hw`q-svrt'j;$k`{w.foX4X(`e8$f=?h4U1-dvc(un&mg<#y}/fubw+qt|z%h="ibuy,di^7Z&ngx"`}=f:W3+bta&{l$ka>!ws-dsdu)z~x#n? glw{*bk\:T$la~ bs3d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.enq}(`eR9V"jc|.lq1b>S7'nxm"h gm2-sw)`hy%{~z|/b3,chs&ngP8P hmr,nw75<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p6494986[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<2?>000?P6(o{l%~k!hl1,tv*apiz$|y} c0-u5979:=1^<"i}f/pe+bj7&~x$kzo|.vqww*e6';7=3?=3:W3+bta&{l$ka>!ws-dsdu)z~x#n? v0>1:72<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p64;4:>>5Z0.eqb+ta'nf;"z| gvcp*rus{&i:#{?33?07?P6(o{l%~k!hl1,tv*apiz$|y} c0-u59599;90Y=!hrg,qb*ak8'}y#jyns/uppv)d9&|:090=4:W3+bta&{l$ka>!ws-dsdu)z~x#n? v0>7:44b3\:$kh!rg-dh5(pz&m|m~ xsuq,g7)`e|r%ol|}yogw8585m2_;#j|i.sd,ci6){%l{l}!wrvp+f4(ods"no}rxlfp979:l1^<"i}f/pe+bj7&~x$kzo|.vqww*e5'ng~t#mnrs{maq:56;o0Y=!hrg,qb*ak8'}y#jyns/uppv)d:&mfyu laspzj`r;;78m7X> gsd-vc)`d9$|~"ixar,twqu(k;%laxv!glY3Y+aj9'g:>k5Z0.eqb+ta'nf;"z| gvcp*rus{&i9#jczx/en_4[)ody%a~<i;T2,cw`)zo%l`= xr.etev(p{}y$o?!hmtz-ch]5U'mf#c|2g9V4*aun'xm#jb?.vp,crgt&~y"m=/fov|+ajS:W%k`}!mr0e?P6(o{l%~k!hl1,tv*apiz$|y} c3-dip~)odQ?Q#ibs/op66=R8&myj#|i/fn3*rt(o~kx"z}{s.a1+s7;878?7X> gsd-vc)`d9$|~"ixar,twqu(k;%}=1>11318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t28485<2_;#j|i.sd,ci6){%l{l}!wrvp+f4(~86:2<<<;T2,cw`)zo%l`= xr.etev(p{}y$o?!y1=0=61=R8&myj#|i/fn3*rt(o~kx"z}{s.a1+s7;:7;9?6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<2<>368Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t28686::1^<"i}f/pe+bj7&~x$kzo|.vqww*e5';783<;;T2,cw`)zo%l`= xr.etev(p{}y$o?!y1=6=576<]9%l~k }f.eo4+qu'n}j#y|tr-`khv6;;1^<"i}f/pe+bj7&~x$kzo|.vqww*ehey;TKCJP82]l[HS_W8>Tc?>4U1-dvc(un&mg<#y}/fubw+qt|z%hc`~=299V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYajVc996[?/fpe*w`(oe:%{!hw`q-svrt'{kfSk{cl^k2`>S7'nxm"h gm2-sw)uidU|~Rka_h32b>S7'nxm"h gm2-sw)uidU|~Rka_h3\575<]9%l~k }f.eo4+qu'{kfSz|Peo]j5Zebxf~956[?/fpe*w`(oe:%{!}al]tvZciW`;Toh~`t^KMRZ6502_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idycz30?0;?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}6:2?64U1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmp949:11^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{<2<1<>S7'nxm"h gm2-sw)pxg~y#jgl0/e`5+eh}g~783<7;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjq:26;20Y=!hrg,qb*ak8'}y#z~ats-dmf6)oj;%ob{at=4=6==R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|d0:0=8:W3+bta&{l$ka>!ws-ttkru'nch<#il1/alqkr;07>;7X> gsd-vc)`d9$|~"ynup,cle7&ni:"naznuY;YZAILV2:SbQbuy]1[JSS4:4:=9=4U1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmp^>ZWNDOS5?Po^ov|Z4XG\^7?3Qmde20a>S7'nxm"h gm2-sw)pxg~y#jgl0/e`5+eh}g~P4PQHNE];5ZiXe|rT>RAZT=7=7c=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dW5SPGOF\<4YhWdsS?Q@UU>6:45b3\:$kh!rg-dh5(pz&}{by| gha3*be6&je~byU7]^EM@Z>6WfUfyuQ=_NWW8384n2_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idyczT8\]DJAY?9VeTaxvP2^MVP9099:o0Y=!hrg,qb*ak8'}y#z~ats-dmf6)oj;%ob{atZ:^[BHCW1;TcRczx^0\KPR;?79m7X> gsd-vc)`d9$|~"ynup,cle7&ni:"naznuY;YZAILV2:SbQbuy]1[JSS4>4:?h5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw_=[XOGNT4<Q`_lw{[7YH]]6329<4U1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmp^>ZWNDOS5?Po^ov|Z4XG\^743Q\W104?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}U;>n5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[5Ycxf~9;6[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\57e<]9%l~k }f.eo4+qu'~zex!hib2-cf7)kfexR?Pdqmw62=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dS?<l;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqY5Wmzdx?94U1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmpZ55k2_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idyczP3^fskq403\:$kh!rg-dh5(pz&}{by| gha3*be6&je~byQ;2b9V4*aun'xm#jb?.vp,suhsz&mbo= hc0,`kphsW=Uo|bz=7:W3+bta&{l$ka>!ws-ttkru'nch<#il1/alqkrX=;i0Y=!hrg,qb*ak8'}y#z~ats-dmf6)oj;%ob{at^7\`uis:>1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_704?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}U<>:5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[=4e3\:$kh!rg-dh5(pz&}{by| gha3*be6&je~byQk1=2=6g=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dSi?31?0a?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}Uo=1<12c9V4*aun'xm#jb?.vp,suhsz&mbo= hc0,`kphsWm;7?3<m;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqYc95>5>o5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[a7;=78i7X> gsd-vc)`d9$|~"ynup,cle7&ni:"naznu]g5909:k1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_e3?3;4e3\:$kh!rg-dh5(pz&}{by| gha3*be6&je~byQk1=:=6d=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dSi?P03c8Q5)`zo$yj"ic0/uq+rvi|{%len>!gb3-gjsi|Vn:S<<n;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqYc9V89m6[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\`4Y4:h1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_e3\07g<]9%l~k }f.eo4+qu'~zex!hib2-cf7)kfexRj>_40b?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}Uo=R8=a:W3+bta&{l$ka>!ws-ttkru'nch<#il1/alqkrXl8U<>l5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[a7X0;h0Y=!hrg,qb*ak8'}y#z~ats-dmf6)oj;%ob{at^f18585j2_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idyczPd3>2:7d<]9%l~k }f.eo4+qu'~zex!hib2-cf7)kfexRj=<3<1f>S7'nxm"h gm2-sw)pxg~y#jgl0/e`5+eh}g~Th?2<>3`8Q5)`zo$yj"ic0/uq+rvi|{%len>!gb3-gjsi|Vn9090=b:W3+bta&{l$ka>!ws-ttkru'nch<#il1/alqkrXl;6>2?l4U1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmpZb54?49n6[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\`7:06;h0Y=!hrg,qb*ak8'}y#z~ats-dmf6)oj;%ob{at^f18=85i2_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idyczPd3]36d=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dSi<P13c8Q5)`zo$yj"ic0/uq+rvi|{%len>!gb3-gjsi|Vn9S?<n;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqYc:V99m6[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\`7Y3:h1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_e0\17g<]9%l~k }f.eo4+qu'~zex!hib2-cf7)kfexRj=_70b?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}Uo>R9=a:W3+bta&{l$ka>!ws-ttkru'nch<#il1/alqkrXl;U3>o5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[a5;878i7X> gsd-vc)`d9$|~"ynup,cle7&ni:"naznu]g7979:k1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_e1?6;4e3\:$kh!rg-dh5(pz&}{by| gha3*be6&je~byQk3=1=6g=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dSi=34?0a?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}Uo?1;12c9V4*aun'xm#jb?.vp,suhsz&mbo= hc0,`kphsWm97:3<m;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqYc;5=5>o5Z0.eqb+ta'nf;"z| wqlwv*ank9$lo< lotlw[a5;078j7X> gsd-vc)`d9$|~"ynup,cle7&ni:"naznu]g7Z65i2_;#j|i.sd,ci6){%||cz}/fk`4+ad9'idyczPd2]26d=R8&myj#|i/fn3*rt(yd~"ifc1,dg4(dg|dSi=P23c8Q5)`zo$yj"ic0/uq+rvi|{%len>!gb3-gjsi|Vn8S><n;T2,cw`)zo%l`= xr.usjqt(o`i;"jm>.bmvjqYc;V>9m6[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\`6Y2:h1^<"i}f/pe+bj7&~x${}`{r.ejg5(`k8$hcx`{_e1\27g<]9%l~k }f.eo4+qu'~zex!hib2-cf7)kfexRj<_60b?P6(o{l%~k!hl1,tv*qwf}x$kdm?.fa2*firf}Uo?R688:W3+bta&{l$ahc gco-cgk`&nhfkl agda`*gk`'kf`S`kb_fgmawgsg{%}magk.bqwv*tfeeed|V>R.scn*w)t>Vddecg{.scn+VBW&ZCF\AKPPSKN5=(uid;m7X> gsd-vc)jmd%ln` {mq]qehYulVoe>=5Z0.eqb+ta'dof#jlb.uos[wgjW{nTic?>3:W3+bta&{l$~lcPre]fj45<]9%l~k }f.pbiZquWld:h6[?/fpe*w`(zz~i`f!]SU]EQIJXOLD946[?/fpe*w`(zz~i`f!hrrvg5+au{}Umyab!rrv\`44?3\:$kh!rg-qwqdkc&myyj>.fpppZ`rde$yyQk23:8Q5)`zo$yj"||tcnh+btt|m;%k}{_gwoh+tt|Vn8>n5Z0.eqb+ta'{ynae nfuq`wus&nxxx#|k_sqw[wc`4949o6[?/fpe*w`(zz~i`f!agvpgvvr)o{y"jPrrv\v`a;978h7X> gsd-vc)u{}hgg"`hwsfqwq(`zz~%~iQ}su]qab:56;h0Y=!hrg,qb*tt|kf`#cixreppp+au{}$yhR||t^pfcZ65j2_;#j|i.sd,vvredb%ekz|krrv-cwus&{nT~~zPrde\57d<]9%l~k }f.pppgjl'gm|~i||t/eqwq(ulVxxxR|jg^01g>S7'nxm"h rrvahn)io~xo~~z!gsqw*rtXzz~T~hi30?0`?P6(o{l%~k!}su`oo*h`{nyy hrrv-swYu{}Uyij2>>3`8Q5)`zo$yj"||tcnh+kapzmxxx#i}su,tvZtt|VxnkR>=b:W3+bta&{l$~~zmlj-mcrtczz~%k}{.vp\vvrXzlmT=<j4U1-dvc(un&xxxobd/sf\vvrXizxnk?>4U1-dvc(un&xxxobd/sf\vvrXizxnkRj>219V4*aun'xm#}{bmi,vaYu{}Ujkh_e02g>S7'nxm"h rrvahn)ulVxxxRm`mc3g?P6(o{l%~k!}su`oo*tcW{ySnabb03g?P6(o{l%~k!}su`oo*quW{ySl}}ef03?P6(o{l%~k!}su`oo*quW{ySl}}ef]g576<]9%l~k }f.pppgjl'~xT~~zParpfcZb5:=1^<"i}f/pe+wusjea${Q}su]bwwc`W{y|bz>c:W3+bta&{l$~~zmlj-tvZtt|Vidao?k;T2,cw`)zo%yylck.uq[wusWjefn<o4URGQ[DJNIZi0Y^K]_WKPMGJB;2\HO45YIDU\P\VB>2]NM1>16:UFE979>2]NM1<18:UFE95=87<0[HO33?48S@D;87<0[HL31?48S@D;:720[HL33;2=2>QBJ595n6Y]IUG\BLTT\j1\^DZJ_LMGAZGd3^XBXHQBOEG\F4b<P@FBBU#WDC"3*4&T\\H+<#?/ARAJM0=_G[IR:6V\TMKA3>^T\VMEH:5WSU]UGFd<PVID^HQFNGM5?]beW@nm7Ujg_QpjiScu{`ee==5Wdl]Neoiu^lxxeb`>0:ZgiZKnffx]i}foo6:?ZYXPEDFSRQ>0^]\Q5)`zo$yj"ic0/pg+wvi|{%lo= lotlw_=[XOGNT:4Q`_lw{[7YH]]6?2<=m;^]\\IHJWVU:=RQPU1-dvc(un&mg<#y}/vrmpw)`aj:%kn?!cnwmpZ5Xlye8i5P_^ZOJHYXW88TSR[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg^f2_=[Xzln~ohQwos]45Z~h494:8h5P_^ZOJHYXW89TSR[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2_=[Xzln~ohQwos]2=4Yg5:5=9m4_^][HKKXWV;?SRQZ0.eqb+ta'nf;"j rqlwv*Kj}qUlo= lotlw_=[XOGNT:4Q`_lw{[7YH]]9:?o5P_^ZOJHYXW8?TSR[?/fpe*w`(oe:%{!xpovq+bod8'mh=#m`uov\5Zbwg}8m7RQPXMLN[ZY6>VUTY=!hrg,qb*kbe&mia#zbp^pbiZtcWld:8n5P_^ZOJHYXW8=TSR[?/fpe*w`(ojr%oaew/LzlvZTCWYD_^V>R_SF\TKRUS8WTTB\P53]l[}i;87;?o6QP_YNMIZYX91UTSX> gsd-vc)`kq$h`fv Mymq[WBXXG^YW;SPRE]SJQT\?TUSC_Q;6^m\|j:768>i7RQPXMLN[ZY61VUTY=!hrg,qb*adp'iggu!Bxnp\SWYWF]XP<PQXR^RMPW]6UVRD^R6Po^zl8586<k1TSRVCNL]\[76XWV_;#j|i.sd,cf~)keas#@v`r^UQ[UHSZR<VSZ\PPOVQ_2[XPFXT>RaPxn>3:42d3VUTTA@B_^]15ZYX]9%l~k }f.e`|+ekcq%Ftb|PRE]SJQT\:TUYHR^ATSY0YZ^HZV?;SbQwo=2=51e<WVUS@CCP_^01[ZYR8&myj#|i/fa{*fjlp&GscQ]D^RMPW]3UVXOS]@[RZ7^[]IUW=2TcRv`<1<20g=XWVRGB@QP_31\[ZS7'nxm"h gbz-gim'Drd~RY]_QLWV^4ZW^XT\CZ][2_\\JTX>VeTtb2?>06a?ZYXPEDFSRQ=4^]\Q5)`zo$yj"ilx/aoo})JpfxT[_Q_NUPX0XYPZVZEX_U:]^ZLVZ2XgVrd0=0>c:coijusWlg{xtl4amolwqYa}ef=7oolktrg?ggdc|zTal|des18gimc3mkmRm`uov+4,b<lh~jSnaznu*2-a=ci}kTob{at)0*`>bf|hUhcx`{(2+g?agsiVidycz'4(f8`drfWje~by&:)e9geqgXkfex%8&d:fbpdYdg|d$:'k;ecweZeh}g~#4$h4d`vb[firf}636=08;e`jp`tu>2nbb%>&6:fjj-7.?2nbb%??)69gmk.69 =0hd`'13+4?aoi 89";6jfn)37-2=cag":9$94dhl+53/03mce$<9&7:fjj-7?!>1oec&>9(48`lh/: =0hd`'21+4?aoi ;;";6jfn)01-2=cag"9?$94dhl+61/03mce$?;&7:fjj-41!>1oec&=7(58`lh/:1#<7iga(3;*2>bnf!9";6jfn)13-2=cag"8=$84dhl+0,0<l`d#9$84dhl+2,0<l`d#;$84dhl+<,0<l`d#5$84dhl?4;1<l`d7==08;ekm8479?2nbb1?=>69gmk:6;7=0hd`315<4?aoi48?5;6jfn=35:2=cag6:;394dhl?5=803mce0<716:fjj979?2nbb1<?>69gmk:597=0hd`323<4?aoi4;95;6jfn=07:2=cag699394dhl?63803mce0?917:fjj94?6>1oec2=9?48`lh;:7=0hd`331<:?aoi4:;1<394dhl?74813mce0>09;ekm81813mce0809;ekm83813mce0:09;ekm8=813mce0408;emvp-6.?2ndyy&>)99gkpr/99#37iazt)32-==cg|~#=?'7;emvp-74!11ocxz'15+;?air|!;>%55kotv+53/?3me~x%?8)99gkpr/91#37iazt)3:-2=cg|~#>$64dnww,76.02ndyy&=1(:8`jss ;8"46j`uu*17,><lf$?:&8:flqq.5= 20hb{{(34*<>bh}}"9;$64dnww,7>.02ndyy&=9(58`jss :#37iazt)13-==cg|~#?<'8;emvp-2.?2ndyy&:)69gkpr/> =0hb{{(6+4?air|!2";6j`uu*:-2=cg|~7<364dnww846902ndyy2>1?:8`jss488546j`uu>27;><lf0<:18:flqq:6=720hb{{<04=<>bh}}6:;364dnww84>902ndyy2>9?58`jss48437iazt=03:==cg|~7><07;emvp945611ocxz322<;?air|58?255kotv?608?3me~x1<9>99gkpr;:>437iazt=0;:==cg|~7>408;emvp94902ndyy2<0?c8`jss4:;1<364dnww8679?2ndyy2<>69gkpr;<7=0hb{{<4<4?air|5<5;6j`uu>4:2=cg|~74394dnww8<8?3lnbj?`hd49fiur~j2lbjbQ<2y7267?<n`ldS><w500/bl`hWnoeio{os]u2Z4+FFDN CAAE2f`?coagV99t8?=,gkekZabflxjxb|Pv7]1(~eX`hyTeczPcmi>4)eX`hyT}{=1.`[wbXn{oz1<"l_dlbficXzz~Tt`l=0.`[mgtW{nThlzn_bmvjq;7$jUoecQxievk964+kVbjRy}_ecweZeh}g~6<!mPftno[cjfozUyyQyam?2(fYneyfnah`{aukljZr~xl79 nQzsd]figccllnT~hi20-a\swYazl{6=!mPurg\`jssW{y1<"l_tlgaw`kg~Ugcz3?,b]kevYh~lxm`by20-a\twckghnT`lzjnb{>5)eXlfSzgkti?06)eXezmdbRxnl<3/gZtcWmo{xe3:13.`[`tug{Ubbgklthmm[qwm4:'oRfns^wm``tadf}6<!mPh`q\eikh{}Umyab20-a\lduXzz~6=!mPd`vb[firf}U|eizg=8.`[mgtW~xTmne20-a\qvcXmji6<!mPcnonkkYddfi`1="l_vp\efmXdf}6<!mPre]sjqtX`nd07#c^wpaZ`pn}UomyoPcnwmp86+kVbjRocmnqw[`kw|p7; nQ}d^fbpdYdg|dSzgkti?:(fYh~lxm`byPlnu>4)eX{U{by|Pwhfwl8?+kVzycjQjmqvz[qwm4:'oRy}_ecweZeh}g~T{dj{h<;/gZvumeejhR|jgr?3(fYcg|~T~~zPv`n>4)eX`hyThlzn_bmvjq;7$jU{~biPftno[qnumzbTbhintd]uei;281&hSz|Pddrwl836:%iT|ah_dosp|Ys`{oxdR`jg`vf[sgk5:&hS}|`g^gntqX|axneQnsrgqpZpfd48'oRfns^tbhlb:9%iT|ah_gwohZrozlycSl}|esv\rdj:=93'obcoogmpZhfel7mekaP33z657*dWkgeiQcov?3(fYwz`gTjdh`_u{sa836:q9= nQrne\bpjkW}s{i0:#c^ofijt~W}s{i0?#}378bl`hW:8s9<<Pfhdl[bcim{kcQy6^0\|vrX9;l0jdh`_fgmawgsg{U}:R<# Ykomk~'KFXN,Jkaescwkw&6:'8?7k{cle9jjocd|mhbxh|}d:kmn`es{kci|8;hlw[fjl02dloo{fle:8kscunee|m6~}of]fiur~9=1{~biPelrw}Zrozlyc$='>4:rqkbYbey~rSyf}erj+5,733yxdkRkbpu{\pmtb{a"9%<:4psmd[`kw|pUdk|h)1*51=wzfmTi`~{y^vkv`uo =#:86~}of]fiur~W}byi~f'5(37?uthoVof|ywPtipfwm.1!8>0|ah_dosp|Ys`{oxd%9&159svjaXmdzuRzgrdqk,=/6>2zycjQjmqvz[qnumzb747>11c9svjaXmdzuRzgrdqk[dutm{~#<$?m;qplcZcjx}sTxe|jsi]bwvcu|!;"=o5rne\ahvsqV~c~h}g_`qpawr/: ;i7}|`g^gntqX|axneQnsrgqp-5.9k1{~biPelrw}ZrozlycSl}|esv+0,7e3yxdkRkbpu{\pmtb{aUj~k}t)7*5g=wzfmTi`~{y^vkv`uoWhyxiz'6(3a?uthoVof|ywPtipfwmYf{zoyx%9&1c9svjaXmdzuRzgrdqk[dutm{~#4$?k;qplcZcjx}sTxe|jsi]bwvcu|521<3?m;qplcZcjx}sTxe|jsi]mabgsm!:"=o5rne\ahvsqV~c~h}g_ogdeqc/9 ;i7}|`g^gntqX|axneQaefcwa-4.9k1{~biPelrw}ZrozlycSckhaug+7,7e3yxdkRkbpu{\pmtb{aUeijo{e)6*5g=wzfmTi`~{y^vkv`uoWgolmyk'5(3a?uthoVof|ywPtipfwmYimnki%8&1c9svjaXmdzuRzgrdqk[kc`i}o#;$?m;qplcZcjx}sTxe|jsi]mabgsm!2"=i5rne\ahvsqV~c~h}g_ogdeqc;03:556~}of]eqij6;2zycjQiumn\pmtb{a";%<=4psmd[cskdV~c~h}g(0+27>vugnUmyabPtipfwm.5!890|ah_gwohZrozlyc$>'>3:rqkbYa}efTxe|jsi*7-45<x{elSk{cl^vkv`uo <#:?6~}of]eqijX|axne&9)018twi`Wog`Rzgrdqk,2/6;2zycjQiumn\pmtb{a"3%<;4psmd[cskdV~c~h}g<983:4g<x{elSk{cl^vkv`uoWhyxiz'0(3b?uthoVl~`aQ{hsgplZgt{lx$<'>a:rqkbYa}efTxe|jsi]bwvcu|!8"=l5rne\bpjkW}byi~fParqfvq.4!8k0|ah_gwohZrozlycSl}|esv+0,7f3yxdkRhzlm]wlwct`Vkxh|{(4+2e>vugnUmyabPtipfwmYf{zoyx%8&1`9svjaXn|fgSyf}erj\evubz}"<%<o4psmd[cskdV~c~h}g_`qpawr/0 ;j7}|`g^dvhiYs`{oxdRo|sdpw8586i2zycjQiumn\pmtb{aUj~k}t=3=5d=wzfmTjxbc_ujqavnXizyn~y2=>0c8twi`Wog`Rzgrdqk[dutm{~7?3?n;qplcZ`rdeUdk|h^cpw`ts4=4:m6~}of]eqijX|axneQnsrgqp9399h1{~biPftno[qnumzbTm~}jru>5:4g<x{elSk{cl^vkv`uoWhyxiz37?3`?uthoVl~`aQ{hsgplZgt{lx054?>0c8twi`Wog`Rzgrdqk[dutm{~743?n;qplcZ`rdeUdk|h^lfcdrb 9#:m6~}of]eqijX|axneQaefcwa-7.9h1{~biPftno[qnumzbTbhintd*1-4g<x{elSk{cl^vkv`uoWgolmyk'3(3b?uthoVl~`aQ{hsgplZhboh~n$9'>a:rqkbYa}efTxe|jsi]mabgsm!?"=l5rne\bpjkW}byi~fPndebp`.1!8k0|ah_gwohZrozlycSckhaug+3,7f3yxdkRhzlm]wlwct`Vdnklzj(9+2e>vugnUmyabPtipfwmYimnki1>11`9svjaXn|fgSyf}erj\j`af|l6:2<o4psmd[cskdV~c~h}g_ogdeqc;:7;j7}|`g^dvhiYs`{oxdR`jg`vf8686i2zycjQiumn\pmtb{aUeijo{e=6=5d=wzfmTjxbc_ujqavnXflmjxh2:>0c8twi`Wog`Rzgrdqk[kc`i}o7:3?n;qplcZ`rdeUdk|h^lfcdrb4>4:o6~}of]eqijX|axneQaefcwa9>=87;j7}|`g^dvhiYs`{oxdR`jg`vf8=813{nToae>0:pg[agsiVidycz'0(33?wbXlh~jSnaznu*2-46<zmUomyoPcnwmp-4.991yhRjnt`]`kphs :#:<6|k_ecweZeh}g~#8$??;sf\`drfWje~by&:)028vaYci}kTob{at)4*55=ulVnjxlQlotlw,2/682xoSio{a^alqkr/0 ;97jPd`vb[firf}636=0:;sf\ak0<zmUyy=4rrv4?vdn|lxy86}}su34?qkw'Vil#kgio^11|075&gmd56{addpehjq23kgei84ws]bgn0<{Uh`f??;vp\`drfWje~by&?)028swYci}kTob{at)3*55=pzVnjxlQlotlw,7/682}ySio{a^alqkr/; ;;7z|Pd`vb[firf}"?%<>4ws]geqgXkfex%;&119tvZbf|hUhcx`{(7+24>quWmkmRm`uov+3,773~xThlzn_bmvjq.?!880{Qkauc\gjsi|521<3;4ws]fj3=pzVxxxpNOpb2g?EF=<>1J7:51zQ55?2b?3<1=><kb6`96=6djrd?894>;o671?0<,=>969=l;|Q6b?2b?3<1=><kb6`96=6dj2Y::>4;f383>455lk=i6?6?cb9P1c<3n;0;6<==dc5a>7>7kl1o8h750;395~U193>n;785120gf2d=:1:hn6x[1d194?7=93;2nv]91;6f3?0=9:8on:l5292`f>"3:l0::95Y45196~s6>j0:7x?9d;28y!7c:38:7o:j9;291g<42<hpD9<l;[74>1}5n39;6<>5d;'5`?=<l30(9:>:5gg?j32>3:17d;;f;29?j36;3:17d;93;29?j2bm3:17b:j8;29?l3203:17d;=6;29 4b32<8m7c?k3;28?l35=3:1(<j;:40e?k7c;3;07d;=4;29 4b32<8m7c?k3;08?l35;3:1(<j;:40e?k7c;3907d;=2;29 4b32<8m7c?k3;68?l3593:1(<j;:40e?k7c;3?07d;=0;29 4b32<8m7c?k3;48?l36n3:1(<j;:40e?k7c;3=07d;>e;29 4b32<8m7c?k3;:8?l3413:1(<j;:461?k7c;3:07d;<8;29 4b32<>97c?k3;38?l34?3:1(<j;:461?k7c;3807d;<6;29 4b32<>97c?k3;18?l34=3:1(<j;:461?k7c;3>07d;<4;29 4b32<>97c?k3;78?l34;3:1(<j;:461?k7c;3<07d;<2;29 4b32<>97c?k3;58?l3493:1(<j;:461?k7c;3207d;:1;29?j2en3:1(<j;:5ff?k7c;3:07b:me;29 4b32=nn7c?k3;38?j2ek3:1(<j;:5ff?k7c;3807b:mb;29 4b32=nn7c?k3;18?j2ei3:1(<j;:5ff?k7c;3>07b:m9;29 4b32=nn7c?k3;78?j2e03:1(<j;:5ff?k7c;3<07b:m7;29 4b32=nn7c?k3;58?j2e>3:1(<j;:5ff?k7c;3207b:m5;29 4b32=nn7c?k3;;8?j2e<3:1(<j;:5ff?k7c;3k07b:m3;29 4b32=nn7c?k3;`8?j2e93:1(<j;:5ff?k7c;3i07b:m0;29 4b32=nn7c?k3;f8?j2fn3:1(<j;:5ff?k7c;3o07b:ne;29 4b32=nn7c?k3;d8?j2fl3:1(<j;:5ff?k7c;3;;76a;ab83>!7c<3>oi6`>d2825>=h<hh1<7*>d587``=i9m91=?54o5cb>5<#9m>18ik4n0f0>45<3f>j57>5$0f7>1bb3g;o?7?;;:m7e=<72-;o87:ke:l2`6<6=21d8n;50;&2`1<3ll1e=i=51798k1e3290/=i:54eg8j4b428=07b:l3;29 4b32=nn7c?k3;3;?>i3k;0;6)?k4;6ga>h6l:0:565`4b394?"6l=0?hh5a1e195d=<g=i;6=4+1e690ac<f8n86<l4;n6a`?6=,8n?69jj;o3g7?7d32e?n?4?:%3g0?2cm2d:h>4>d:9l0d1=83.:h94;dd9m5a5=9l10c9o9:18'5a2=<mo0b<j<:0d8?l20m3:1(<j;:5;g?k7c;3:07d:8d;29 4b32=3o7c?k3;38?l20j3:1(<j;:5;g?k7c;3807d:8a;29 4b32=3o7c?k3;18?l2013:1(<j;:5;g?k7c;3>07d:88;29 4b32=3o7c?k3;78?l20?3:1(<j;:5;g?k7c;3<07d:86;29 4b32=3o7c?k3;58?l20=3:1(<j;:5;g?k7c;3207d:84;29 4b32=3o7c?k3;;8?l20;3:1(<j;:5;g?k7c;3k07d:82;29 4b32=3o7c?k3;`8?l2083:1(<j;:5;g?k7c;3i07d:9f;29 4b32=3o7c?k3;f8?l21m3:1(<j;:5;g?k7c;3o07d:9d;29 4b32=3o7c?k3;d8?l21k3:1(<j;:5;g?k7c;3;;76g;6c83>!7c<3>2h6`>d2825>=n<?k1<7*>d587=a=i9m91=?54i54:>5<#9m>184j4n0f0>45<3`>=47>5$0f7>1?c3g;o?7?;;:k722<72-;o87:6d:l2`6<6=21b85:50;&2`1<31m1e=i=51798m1>4290/=i:548f8j4b428=07d:72;29 4b32=3o7c?k3;3;?>o3080;6)?k4;6:`>h6l:0:565f49294?"6l=0?5i5a1e195d=<a==m6=4+1e690<b<f8n86<l4;h64g?6=,8n?697k;o3g7?7d32c?;<4?:%3g0?2>l2d:h>4>d:9j030=83.:h94;9e9m5a5=9l10e98::18'5a2=<0n0b<j<:0d8?l33<3:17o:=d;295?6=8rB?>n5+1d;907b<g8n:6=44}c33`?6=93:1<vF;2b9'5`?=99n0c<>l:188yg31290jn7?;5;3:f~N3:j1Q9:4>6z0`>7d=:m08=7<j:3d975<683n1??4<3;f96g<5k38o6?k52g804?5628:1??4<3;'5`?=<li0(8o54dc8 36=<lh0(<ml:0f3?l37?3:1(<j;:42;?k7c;3:07d;?6;29 4b32<:37c?k3;38?l37=3:1(<j;:42;?k7c;3807d;?4;29 4b32<:37c?k3;18?l37;3:1(<j;:42;?k7c;3>07d;?2;29 4b32<:37c?k3;78?l3793:1(<j;:42;?k7c;3<07d;?0;29 4b32<:37c?k3;58?l2an3:1(<j;:42;?k7c;3207d:i0;29?l3283:17d;:3;29?j32>3:17d:id;29 4b32=ln7c?k3;28?l2ak3:1(<j;:5df?k7c;3;07d:ib;29 4b32=ln7c?k3;08?l2ai3:1(<j;:5df?k7c;3907d:i9;29 4b32=ln7c?k3;68?l2a03:1(<j;:5df?k7c;3?07d:i7;29 4b32=ln7c?k3;48?l2a>3:1(<j;:5df?k7c;3=07d:i5;29 4b32=ln7c?k3;:8?l33n3:17b:i3;29?l3693:1(<j;:431?k7c;3:07d;>0;29 4b32<;97c?k3;38?l37n3:1(<j;:431?k7c;3807d;?e;29 4b32<;97c?k3;18?l37l3:1(<j;:431?k7c;3>07d;?c;29 4b32<;97c?k3;78?l37j3:1(<j;:431?k7c;3<07d;?a;29 4b32<;97c?k3;58?l3713:1(<j;:431?k7c;3207b::6;29?j21:3:1(<j;:540?k7c;3:07b:91;29 4b32=<87c?k3;38?j2183:1(<j;:540?k7c;3807b::f;29 4b32=<87c?k3;18?j22m3:1(<j;:540?k7c;3>07b::d;29 4b32=<87c?k3;78?j22k3:1(<j;:540?k7c;3<07b::b;29 4b32=<87c?k3;58?j22i3:1(<j;:540?k7c;3207b;>3;29?l31;3:17d;>c;29 4b32<;o7c?k3;28?l36j3:1(<j;:43g?k7c;3;07d;>a;29 4b32<;o7c?k3;08?l3613:1(<j;:43g?k7c;3907d;>8;29 4b32<;o7c?k3;68?l36?3:1(<j;:43g?k7c;3?07d;>6;29 4b32<;o7c?k3;48?l36=3:1(<j;:43g?k7c;3=07d;>4;29 4b32<;o7c?k3;:8?j2bm3:17b:j8;29?l3203:17d::8;29?l35>3:1(<j;:40e?k7c;3:07d;=5;29 4b32<8m7c?k3;38?l35<3:1(<j;:40e?k7c;3807d;=3;29 4b32<8m7c?k3;18?l35:3:1(<j;:40e?k7c;3>07d;=1;29 4b32<8m7c?k3;78?l3583:1(<j;:40e?k7c;3<07d;>f;29 4b32<8m7c?k3;58?l36m3:1(<j;:40e?k7c;3207d;<9;29 4b32<>97c?k3;28?l3403:1(<j;:461?k7c;3;07d;<7;29 4b32<>97c?k3;08?l34>3:1(<j;:461?k7c;3907d;<5;29 4b32<>97c?k3;68?l34<3:1(<j;:461?k7c;3?07d;<3;29 4b32<>97c?k3;48?l34:3:1(<j;:461?k7c;3=07d;<1;29 4b32<>97c?k3;:8?j22=3:17d:i1;29?l2213:17d;94;29?j32:3:17b;:7;29?l3293:17b:mf;29 4b32=nn7c?k3;28?j2em3:1(<j;:5ff?k7c;3;07b:mc;29 4b32=nn7c?k3;08?j2ej3:1(<j;:5ff?k7c;3907b:ma;29 4b32=nn7c?k3;68?j2e13:1(<j;:5ff?k7c;3?07b:m8;29 4b32=nn7c?k3;48?j2e?3:1(<j;:5ff?k7c;3=07b:m6;29 4b32=nn7c?k3;:8?j2e=3:1(<j;:5ff?k7c;3307b:m4;29 4b32=nn7c?k3;c8?j2e;3:1(<j;:5ff?k7c;3h07b:m1;29 4b32=nn7c?k3;a8?j2e83:1(<j;:5ff?k7c;3n07b:nf;29 4b32=nn7c?k3;g8?j2fm3:1(<j;:5ff?k7c;3l07b:nd;29 4b32=nn7c?k3;33?>i3ij0;6)?k4;6ga>h6l:0:=65`4``94?"6l=0?hh5a1e1957=<g=kj6=4+1e690ac<f8n86<=4;n6b=?6=,8n?69jj;o3g7?7332e?m54?:%3g0?2cm2d:h>4>5:9l0f3=83.:h94;dd9m5a5=9?10c9m;:18'5a2=<mo0b<j<:058?j2d;3:1(<j;:5ff?k7c;3;376a;c383>!7c<3>oi6`>d282=>=h<j;1<7*>d587``=i9m91=l54o5a3>5<#9m>18ik4n0f0>4d<3f>ih7>5$0f7>1bb3g;o?7?l;:m7f7<72-;o87:ke:l2`6<6l21d8l950;&2`1<3ll1e=i=51d98k1g1290/=i:54eg8j4b428l07d:8e;29 4b32=3o7c?k3;28?l20l3:1(<j;:5;g?k7c;3;07d:8b;29 4b32=3o7c?k3;08?l20i3:1(<j;:5;g?k7c;3907d:89;29 4b32=3o7c?k3;68?l2003:1(<j;:5;g?k7c;3?07d:87;29 4b32=3o7c?k3;48?l20>3:1(<j;:5;g?k7c;3=07d:85;29 4b32=3o7c?k3;:8?l20<3:1(<j;:5;g?k7c;3307d:83;29 4b32=3o7c?k3;c8?l20:3:1(<j;:5;g?k7c;3h07d:80;29 4b32=3o7c?k3;a8?l21n3:1(<j;:5;g?k7c;3n07d:9e;29 4b32=3o7c?k3;g8?l21l3:1(<j;:5;g?k7c;3l07d:9c;29 4b32=3o7c?k3;33?>o3>k0;6)?k4;6:`>h6l:0:=65f47c94?"6l=0?5i5a1e1957=<a=<26=4+1e690<b<f8n86<=4;h65<?6=,8n?697k;o3g7?7332c?::4?:%3g0?2>l2d:h>4>5:9j0=2=83.:h94;9e9m5a5=9?10e96<:18'5a2=<0n0b<j<:058?l2?:3:1(<j;:5;g?k7c;3;376g;8083>!7c<3>2h6`>d282=>=n<1:1<7*>d587=a=i9m91=l54i55e>5<#9m>184j4n0f0>4d<3`><o7>5$0f7>1?c3g;o?7?l;:k734<72-;o87:6d:l2`6<6l21b8;850;&2`1<31m1e=i=51d98m102290/=i:548f8j4b428l07d::7;29?j33l3:1(<j;:46f?k7c;3:07b;;c;29 4b32<>n7c?k3;38?j33j3:1(<j;:46f?k7c;3807b;;a;29 4b32<>n7c?k3;18?j3313:1(<j;:46f?k7c;3>07b;;8;29 4b32<>n7c?k3;78?j33?3:1(<j;:46f?k7c;3<07b;;6;29 4b32<>n7c?k3;58?j33=3:1(<j;:46f?k7c;3207b;91;29 4b32<<97c?k3;28?j3183:1(<j;:441?k7c;3;07b;:f;29 4b32<<97c?k3;08?j32m3:1(<j;:441?k7c;3907b;:d;29 4b32<<97c?k3;68?j32k3:1(<j;:441?k7c;3?07b;:b;29 4b32<<97c?k3;48?j32i3:1(<j;:441?k7c;3=07b;:9;29 4b32<<97c?k3;:8?j2a<3:17d:jf;29?j21<3:17d;;4;29?j32=3:17o:<f;295?6=8r.:i44>0e9K06c<@=8h7b??c;29?xd3<90;6<4?:1y'5`?=<;n0D9=j;I61g>i6l80;66sm2d594?2=83:p(<k6:02b?M24m2B?>n5+10f91>o203:17d8=:188m4b12900c<j8:188yg4b>3:187>50z&2a<<68h1C8>k4H50`?!76l3?0e8650;9j27<722c:h;4?::m2`2<722wi>h750;694?6|,8o26<>7;I60a>N3:j1/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb2`3>5<3290;w)?j9;33e>N3;l1C8?m4$03g>0=n=10;66g92;29?l7c>3:17b?k7;29?xd4io0;694?:1y'5`?=99k0D9=j;I61g>"69m0>7d;7:188m34=831b=i850;9l5a1=831vn9?=:187>5<7s-;n57??8:J77`=O<;i0(<?k:09j1=<722c>i7>5;h41>5<<g8n<6=44}c616?6=;3:1<v*>e88242=O<:o0D9<l;I76?!71i3;n46*>1e82?l3?2900e;<50;9l5a1=831vn9<8:180>5<7s-;n57??7:J77`=O<;i0D8;4$04b>4c?3-;:h7?4i4:94?=n>;0;66a>d683>>{e<8?1<7:50;2x 4c>28:j7E:<e:J76f=O=<1/=;o51d:8 47c2<1b954?::k56?6=3`;o:7>5;n3g3?6=3th?><4?:283>5}#9l31==94H51f?M25k2B>96*>6`82a==#98n1=6g:8;29?l052900c<j8:188yg25>3:1?7>50z&2a<<68>1C8>k4H50`?M323-;=m7?j8:&25a<63`?36=44i7094?=h9m=1<75rb537>5<3290;w)?j9;33e>N3;l1C8?m4$04b>4c?3A?>7)?>d;78m0>=831b:?4?::k2`3<722e:h:4?::a04d=83>1<7>t$0g:>46f3A>8i6F;2b9'54b==2c>47>5;h41>5<<a8n=6=44o0f4>5<<uk>:m7>54;294~"6m00:<l5G42g8L14d3-;:h7;4i4:94?=n>;0;66g>d783>>i6l>0;66sm40;94?2=83:p(<k6:02b?M24m2B?>n5+10f91>o203:17d8=:188m4b12900c<j8:188yg2583:197>50z&2a<<68k1C8>k4H50`?M323-;=m7?j8:k6<?6=3`?26=44i7094?=n9m<1<75`1e594?=zj=;m6=4;:183!7b13;;m6F;3d9K07e<,8;o685f5983>>o1:3:17d?k6;29?j7c?3:17pl;1d83>1<729q/=h7511c8L15b3A>9o6*>1e86?l3?2900e;<50;9j5a0=831d=i950;9~f174290?6=4?{%3f=?77i2B??h5G43a8L03<,8<j6<k7;%32`?3<a<21<75f6383>>o6l?0;66a>d683>>{e;1n1<7:50;2x 4c>28<i7E:<e:J76f=n=k0;66g95;29?l7b83:17b?lf;29?xd40j0;694?:1y'5`?=9?h0D9=j;I61g>o2j3:17d8::188m4c72900c<mi:188yg5?j3:187>50z&2a<<6>k1C8>k4H50`?l3e2900e;;50;9j5`6=831d=nh50;9~f6>f290?6=4?{%3f=?71j2B??h5G43a8m0d=831b:84?::k2a5<722e:ok4?::a7=c=83>1<7>t$0g:>40e3A>8i6F;2b9j1g<722c=97>5;h3f4?6=3f;hj7>5;|`0e5<72=0;6=u+1d;953d<@=9n7E:=c:k6f?6=3`<>6=44i0g3>5<<g8im6=44}c1:b?6=<3:1<v*>e8822g=O<:o0D9<l;h7a>5<<a??1<75f1d294?=h9jl1<75rb2;f>5<3290;w)?j9;35f>N3;l1C8?m4i4`94?=n><0;66g>e183>>i6ko0;66sm38f94?2=83:p(<k6:04a?M24m2B?>n5f5c83>>o1=3:17d?j0;29?j7dn3:17pl<a083>1<729q/=h7517`8L15b3A>9o6g:b;29?l022900e<k?:188k4ea2900qo<l3;290?6=8r.:i44>6c9K06c<@=8h7d;m:188m33=831b=h>50;9l5f`=831vn?m=:187>5<7s-;n57?9b:J77`=O<;i0e8l50;9j20<722c:i=4?::m2gc<722wi>n?50;694?6|,8o26<8m;I60a>N3:j1b9o4?::k51?6=3`;n<7>5;n3`b?6=3th9o=4?:583>5}#9l31=;l4H51f?M25k2c>n7>5;h46>5<<a8o;6=44o0ae>5<<uk8h87>54;294~"6m00::o5G42g8L14d3`?i6=44i7794?=n9l:1<75`1bd94?=zj;n=6=4;:183!7b13;=n6F;3d9K07e<a<h1<75f6483>>o6m90;66a>cg83>>{e:m?1<7:50;2x 4c>28<i7E:<e:J76f=n=k0;66g95;29?l7b83:17b?lf;29?xd5l=0;694?:1y'5`?=9?h0D9=j;I61g>o2j3:17d8::188m4c72900c<mi:188yg4c;3:187>50z&2a<<6>k1C8>k4H50`?l3e2900e;;50;9j5`6=831d=nh50;9~f7b0290?6=4?{%3f=?71j2B??h5G43a8m0d=831b:84?::k2a5<722e:ok4?::a775=83?1<7>t$0g:>46>3A>8i6F;2b9'54b=92c>47>5;h7:>5<<a<o1<75f6383>>i6l>0;66sm33094?3=83:p(<k6:02:?M24m2B?>n5+10f95>o203:17d;6:188m0c=831b:?4?::m2`2<722wi???50;794?6|,8o26<>6;I60a>N3:j1/=<j51:k6<?6=3`?26=44i4g94?=n>;0;66a>d683>>{e;;:1<7;50;2x 4c>28:27E:<e:J76f=#98n1=6g:8;29?l3>2900e8k50;9j27<722e:h:4?::a74`=83?1<7>t$0g:>46>3A>8i6F;2b9'54b=92c>47>5;h7:>5<<a<o1<75f6383>>i6l>0;66sm30g94?3=83:p(<k6:02:?M24m2B?>n5+10f95>o203:17d;6:188m0c=831b:?4?::m2`2<722wi?<j50;794?6|,8o26<>6;I60a>N3:j1/=<j51:k6<?6=3`?26=44i4g94?=n>;0;66a>d683>>{e;8i1<7;50;2x 4c>28:27E:<e:J76f=#98n1=6g:8;29?l3>2900e8k50;9j27<722e:h:4?::a74d=83?1<7>t$0g:>46>3A>8i6F;2b9'54b=92c>47>5;h7:>5<<a<o1<75f6383>>i6l>0;66sm30394?3=83:p(<k6:02:?M24m2B?>n5+10f95>o203:17d;6:188m0c=831b:?4?::m2`2<722wi?<>50;794?6|,8o26<>6;I60a>N3:j1/=<j51:k6<?6=3`?26=44i4g94?=n>;0;66a>d683>>{e;9l1<7;50;2x 4c>28:27E:<e:J76f=#98n1=6g:8;29?l3>2900e8k50;9j27<722e:h:4?::a75c=83?1<7>t$0g:>46>3A>8i6F;2b9'54b=92c>47>5;h7:>5<<a<o1<75f6383>>i6l>0;66sm31f94?3=83:p(<k6:02:?M24m2B?>n5+10f95>o203:17d;6:188m0c=831b:?4?::m2`2<722wi?=m50;794?6|,8o26<>6;I60a>N3:j1/=<j51:k6<?6=3`?26=44i4g94?=n>;0;66a>d683>>{e;9h1<7;50;2x 4c>28:27E:<e:J76f=#98n1=6g:8;29?l3>2900e8k50;9j27<722e:h:4?::a75g=83?1<7>t$0g:>46>3A>8i6F;2b9'54b=92c>47>5;h7:>5<<a<o1<75f6383>>i6l>0;66sm31;94?3=83:p(<k6:02a?M24m2B?>n5+10f91>o203:17d;6:188m34=831b=i850;9l5a1=831vn>:<:187>5<7s-;n57?9b:J77`=O<;i0e8l50;9j20<722c:i=4?::m2gc<722wi?9650;194?6|,8o26<8:;I60a>N3:j1/=<j5279'5a3=;?<0e<>i:188m4772900c<mi:188yg53l3:1?7>50z&2a<<6><1C8>k4H50`?!76l330(<j::245?l77n3:17d?>0;29?j7dn3:17pl<4383>1<729q/=h7517`8L15b3A>9o6g:b;29?l022900e<k?:188k4ea2900qo=;7;291?6=8r.:i44>669K06c<@=8h7)?>d;04?!7c=39=96g>0g83>>o6990;66g>1083>>o69;0;66a>cg83>>{e;=i1<7;50;2x 4c>28<<7E:<e:J76f=#98n186*>d48020=n99l1<75f10294?=n98;1<75f10094?=h9jl1<75rb262>5<3290;w)?j9;35f>N3;l1C8?m4i4`94?=n><0;66g>e183>>i6ko0;66sm35494?3=83:p(<k6:044?M24m2B?>n5+10f962=#9m?1?;:4i02e>5<<a8;;6=44i032>5<<a8;96=44o0ae>5<<uk9?n7>55;294~"6m00:::5G42g8L14d3-;:h7:4$0f6>6033`;;j7>5;h324?6=3`;:=7>5;h326?6=3f;hj7>5;|`005<72=0;6=u+1d;953d<@=9n7E:=c:k6f?6=3`<>6=44i0g3>5<<g8im6=44}c171?6==3:1<v*>e88222=O<:o0D9<l;%32`?403-;o97=93:k24c<722c:==4?::k254<722c:=?4?::m2gc<722wi?9o50;794?6|,8o26<88;I60a>N3:j1/=<j54:&2`0<4>:1b==h50;9j546=831b=<?50;9j544=831d=nh50;9~f65a290?6=4?{%3f=?71j2B??h5G43a8m0d=831b:84?::k2a5<722e:ok4?::a712=83?1<7>t$0g:>4003A>8i6F;2b9'54b=:>1/=i;53708m46a2900e<??:188m4762900e<?=:188k4ea2900qo=;9;291?6=8r.:i44>669K06c<@=8h7)?>d;68 4b22:<97d??f;29?l7683:17d?>1;29?l76:3:17b?lf;29?xd4=;0;694?:1y'5`?=9?h0D9=j;I61g>o2j3:17d8::188m4c72900c<mi:188yg52?3:1?7>50z&2a<<6><1C8>k4H50`?!76l38=7)?k5;155>o68o0;66g>1183>>i6ko0;66sm34a94?5=83:p(<k6:046?M24m2B?>n5+10f9=>"6l<08:<5f11d94?=n98:1<75`1bd94?=zj:?:6=4;:183!7b13;=n6F;3d9K07e<a<h1<75f6483>>o6m90;66a>cg83>>{e;<<1<7;50;2x 4c>28<<7E:<e:J76f=#98n1>:5+1e79736<a8:m6=44i033>5<<a8;:6=44i031>5<<g8im6=44}c16f?6==3:1<v*>e88222=O<:o0D9<l;%32`?2<,8n>6>8?;h33b?6=3`;:<7>5;h325?6=3`;:>7>5;n3`b?6=3th89=4?:583>5}#9l31=;l4H51f?M25k2c>n7>5;h46>5<<a8o;6=44o0ae>5<<uk9>97>55;294~"6m00:::5G42g8L14d3-;:h7<8;%3g1?52n2c:<k4?::k255<722c:=<4?::k257<722e:ok4?::a70g=83?1<7>t$0g:>4003A>8i6F;2b9'54b=<2.:h84<5g9j55`=831b=<>50;9j547=831b=<<50;9l5f`=831vn>:i:187>5<7s-;n57?9b:J77`=O<;i0e8l50;9j20<722c:i=4?::m2gc<722wi?8:50;794?6|,8o26<88;I60a>N3:j1/=<j5269'5a3=;<o0e<>i:188m4772900e<?>:188m4752900c<mi:188yg5213:197>50z&2a<<6>>1C8>k4H50`?!76l3>0(<j::27f?l77n3:17d?>0;29?l7693:17d?>2;29?j7dn3:17pl<4d83>1<729q/=h7517`8L15b3A>9o6g:b;29?l022900e<k?:188k4ea2900qo=:3;291?6=8r.:i44>669K06c<@=8h7)?>d;04?!7c=39>h6g>0g83>>o6990;66g>1083>>o69;0;66a>cg83>>{e;<21<7;50;2x 4c>28<<7E:<e:J76f=#98n186*>d4801a=n99l1<75f10294?=n98;1<75f10094?=h9jl1<75rb21f>5<4290;w)?j9;60`>N3;l1C8?m4i4`94?=n9?81<75`1bd94?=zj:9o6=4<:183!7b13>8h6F;3d9K07e<a<h1<75f17094?=h9jl1<75rb20`>5<3290;w)?j9;35f>N3;l1C8?m4i4`94?=n><0;66g>e183>>i6ko0;66sm32a94?5=83:p(<k6:51g?M24m2B?>n5f5c83>>o6>;0;66a>cg83>>{e;;h1<7:50;2x 4c>28<i7E:<e:J76f=n=k0;66g95;29?l7b83:17b?lf;29?xd4;k0;6>4?:1y'5`?=<:n0D9=j;I61g>o2j3:17d?92;29?j7dn3:17pl<2`83>1<729q/=h7517`8L15b3A>9o6g:b;29?l022900e<k?:188k4ea2900qo=<a;297?6=8r.:i44;3e9K06c<@=8h7d;m:188m4052900c<mi:188yg5513:187>50z&2a<<6>k1C8>k4H50`?l3e2900e;;50;9j5`6=831d=nh50;9~f65>29086=4?{%3f=?24l2B??h5G43a8m0d=831b=;<50;9l5f`=831vn><7:187>5<7s-;n57?9b:J77`=O<;i0e8l50;9j20<722c:i=4?::m2gc<722wi?>650;194?6|,8o269=k;I60a>N3:j1b9o4?::k227<722e:ok4?::a771=83>1<7>t$0g:>40e3A>8i6F;2b9j1g<722c=97>5;h3f4?6=3f;hj7>5;|`072<72:0;6=u+1d;906b<@=9n7E:=c:k6f?6=3`;=>7>5;n3`b?6=3th8>;4?:583>5}#9l31=;l4H51f?M25k2c>n7>5;h46>5<<a8o;6=44o0ae>5<<uk98:7>53;294~"6m00??i5G42g8L14d3`?i6=44i041>5<<g8im6=44}c111?6=<3:1<v*>e8822g=O<:o0D9<l;h7a>5<<a??1<75f1d294?=h9jl1<75rb207>5<3290;w)?j9;35f>N3;l1C8?m4i4`94?=n><0;66g>e183>>i6ko0;66sm36;94?2=83:p(<k6:02;?M24m2B?>n5+10f95>o203:17d;j:188m34=831d=i950;9~f61?290?6=4?{%3f=?7702B??h5G43a8 47c281b954?::k6a?6=3`<96=44o0f4>5<<uk9<;7>54;294~"6m00:<55G42g8L14d3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl<7783>1<729q/=h7511:8L15b3A>9o6*>1e82?l3?2900e8k50;9j27<722e:h:4?::a723=83>1<7>t$0g:>46?3A>8i6F;2b9'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj:=?6=4;:183!7b13;;46F;3d9K07e<,8;o6<5f5983>>o2m3:17d8=:188k4b02900qo=83;290?6=8r.:i44>099K06c<@=8h7)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`037<72=0;6=u+1d;955><@=9n7E:=c:&25a<63`?36=44i4g94?=n>;0;66a>d683>>{e;>;1<7:50;2x 4c>28:37E:<e:J76f=#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn9>l:186>5<7s-;n57??9:J77`=O<;i0(<?k:09j1=<722c>57>5;h7f>5<<a?81<75`1e594?=zj=:i6=4::183!7b13;;56F;3d9K07e<,8;o6<5f5983>>o213:17d;j:188m34=831d=i950;9~f16f290>6=4?{%3f=?7712B??h5G43a8 47c281b954?::k6=?6=3`?n6=44i7094?=h9m=1<75rb52:>5<2290;w)?j9;33=>N3;l1C8?m4$03g>4=n=10;66g:9;29?l3b2900e;<50;9l5a1=831vn9>7:186>5<7s-;n57??9:J77`=O<;i0(<?k:09j1=<722c>57>5;h7f>5<<a?81<75`1e594?=zj=:<6=4::183!7b13;;56F;3d9K07e<,8;o6<5f5983>>o213:17d;j:188m34=831d=i950;9~f161290>6=4?{%3f=?7712B??h5G43a8 47c281b954?::k6=?6=3`?n6=44i7094?=h9m=1<75rb526>5<2290;w)?j9;33=>N3;l1C8?m4$03g>4=n=10;66g:9;29?l3b2900e;<50;9l5a1=831vn9>;:186>5<7s-;n57??9:J77`=O<;i0(<?k:09j1=<722c>57>5;h7f>5<<a?81<75`1e594?=zj:lj6=4::183!7b13;;56F;3d9K07e<,8;o6<5f5983>>o213:17d;j:188m34=831d=i950;9~f6`>290>6=4?{%3f=?7712B??h5G43a8 47c281b954?::k6=?6=3`?n6=44i7094?=h9m=1<75rb2d;>5<2290;w)?j9;33=>N3;l1C8?m4$03g>4=n=10;66g:9;29?l3b2900e;<50;9l5a1=831vn>h8:186>5<7s-;n57??9:J77`=O<;i0(<?k:09j1=<722c>57>5;h7f>5<<a?81<75`1e594?=zj:l=6=4::183!7b13;;56F;3d9K07e<,8;o6<5f5983>>o213:17d;j:188m34=831d=i950;9~f6`2290>6=4?{%3f=?7712B??h5G43a8 47c281b954?::k6=?6=3`?n6=44i7094?=h9m=1<75rb2d7>5<2290;w)?j9;33=>N3;l1C8?m4$03g>4=n=10;66g:9;29?l3b2900e;<50;9l5a1=831vn>h<:186>5<7s-;n57??9:J77`=O<;i0(<?k:09j1=<722c>57>5;h7f>5<<a?81<75`1e594?=zj:l96=4::183!7b13;;n6F;3d9K07e<,8;o685f5983>>o213:17d8=:188m4b12900c<j8:188yg5b03:197>50z&2a<<6801C8>k4H50`?!76l3;0e8650;9j1<<722c>i7>5;h41>5<<g8n<6=44}c1f3?6==3:1<v*>e8824<=O<:o0D9<l;%32`?7<a<21<75f5883>>o2m3:17d8=:188k4b02900qo=j6;291?6=8r.:i44>089K06c<@=8h7)?>d;38m0>=831b944?::k6a?6=3`<96=44o0f4>5<<uk9n97>55;294~"6m00:<45G42g8L14d3-;:h7?4i4:94?=n=00;66g:e;29?l052900c<j8:188yg5b<3:197>50z&2a<<6801C8>k4H50`?!76l3;0e8650;9j1<<722c>i7>5;h41>5<<g8n<6=44}c1f7?6==3:1<v*>e8824<=O<:o0D9<l;%32`?7<a<21<75f5883>>o2m3:17d8=:188k4b02900qo=j2;291?6=8r.:i44>089K06c<@=8h7)?>d;38m0>=831b944?::k6a?6=3`<96=44o0f4>5<<uk9n=7>55;294~"6m00:<o5G42g8L14d3-;:h7;4i4:94?=n=00;66g92;29?l7c>3:17b?k7;29?xd4m90;684?:1y'5`?=9930D9=j;I61g>"69m0:7d;7:188m0?=831b9h4?::k56?6=3f;o;7>5;|`0`3<72<0;6=u+1d;955?<@=9n7E:=c:&25a<63`?36=44i4;94?=n=l0;66g92;29?j7c?3:17pl<d483>0<729q/=h7511;8L15b3A>9o6*>1e82?l3?2900e8750;9j1`<722c=>7>5;n3g3?6=3th8h94?:483>5}#9l31==74H51f?M25k2.:=i4>;h7;>5<<a<31<75f5d83>>o1:3:17b?k7;29?xd4l;0;684?:1y'5`?=9930D9=j;I61g>"69m0:7d;7:188m0?=831b9h4?::k56?6=3f;o;7>5;|`0`5<72<0;6=u+1d;955?<@=9n7E:=c:&25a<63`?36=44i4;94?=n=l0;66g92;29?j7c?3:17pl<cd83>0<729q/=h7511;8L15b3A>9o6*>1e82?l3?2900e8750;9j1`<722c=>7>5;n3g3?6=3th8on4?:483>5}#9l31==74H51f?M25k2.:=i4>;h7;>5<<a<31<75f5d83>>o1:3:17b?k7;29?xd4kh0;684?:1y'5`?=99h0D9=j;I61g>"69m0>7d;7:188m0?=831b:?4?::k2`3<722e:h:4?::a7f>=83?1<7>t$0g:>46e3A>8i6F;2b9'54b==2c>47>5;h7:>5<<a?81<75f1e494?=h9m=1<75rb357>5<3290;w)?j9;33<>N3;l1C8?m4$03g>4=n=10;66g:e;29?l052900c<j8:188yg40;3:187>50z&2a<<6811C8>k4H50`?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th9;?4?:583>5}#9l31==64H51f?M25k2.:=i4>;h7;>5<<a<o1<75f6383>>i6l>0;66sm26394?2=83:p(<k6:02;?M24m2B?>n5+10f95>o203:17d;j:188m34=831d=i950;9~f717290?6=4?{%3f=?7702B??h5G43a8 47c281b954?::k6a?6=3`<96=44o0f4>5<<uk8=j7>54;294~"6m00:<55G42g8L14d3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl=6d83>1<729q/=h7511:8L15b3A>9o6*>1e82?l3?2900e8k50;9j27<722e:h:4?::a63b=83>1<7>t$0g:>46?3A>8i6F;2b9'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;<h6=4;:183!7b13;;46F;3d9K07e<,8;o6<5f5983>>o2m3:17d8=:188k4b02900qo<>b;290?6=8r.:i44>099K06c<@=8h7)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`15d<72=0;6=u+1d;955><@=9n7E:=c:&25a<63`?36=44i4g94?=n>;0;66a>d683>>{e:831<7:50;2x 4c>28:37E:<e:J76f=#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn??7:187>5<7s-;n57??8:J77`=O<;i0(<?k:09j1=<722c>i7>5;h41>5<<g8n<6=44}c023?6=<3:1<v*>e8824==O<:o0D9<l;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd59?0;694?:1y'5`?=9920D9=j;I61g>"69m0:7d;7:188m0c=831b:?4?::m2`2<722wi><;50;694?6|,8o26<>7;I60a>N3:j1/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb337>5<3290;w)?j9;33<>N3;l1C8?m4$03g>4=n=10;66g:e;29?l052900c<j8:188yg46;3:187>50z&2a<<6811C8>k4H50`?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th9no4?:583>5}#9l31==64H51f?M25k2.:=i4>;h7;>5<<a<o1<75f6383>>i6l>0;66sm2cc94?2=83:p(<k6:02;?M24m2B?>n5+10f95>o203:17d;j:188m34=831d=i950;9~f7d>290?6=4?{%3f=?7702B??h5G43a8 47c281b954?::k6a?6=3`<96=44o0f4>5<<uk8i47>54;294~"6m00:<55G42g8L14d3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl=b683>1<729q/=h7511:8L15b3A>9o6*>1e82?l3?2900e8k50;9j27<722e:h:4?::a6g0=83>1<7>t$0g:>46?3A>8i6F;2b9'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;h>6=4;:183!7b13;;46F;3d9K07e<,8;o6<5f5983>>o2m3:17d8=:188k4b02900qo<m4;290?6=8r.:i44>099K06c<@=8h7)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`1f6<72=0;6=u+1d;955><@=9n7E:=c:&25a<63`?36=44i4g94?=n>;0;66a>d683>>{e:?81<7:50;2x 4c>28:37E:<e:J76f=#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn?8>:187>5<7s-;n57??8:J77`=O<;i0(<?k:09j1=<722c>i7>5;h41>5<<g8n<6=44}c054?6=<3:1<v*>e8824==O<:o0D9<l;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd5=o0;694?:1y'5`?=9920D9=j;I61g>"69m0:7d;7:188m0c=831b:?4?::m2`2<722wi>8k50;694?6|,8o26<>7;I60a>N3:j1/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb37g>5<3290;w)?j9;33<>N3;l1C8?m4$03g>4=n=10;66g:e;29?l052900c<j8:188yg42k3:187>50z&2a<<6811C8>k4H50`?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th99o4?:583>5}#9l31==64H51f?M25k2.:=i4>;h7;>5<<a<o1<75f6383>>i6l>0;66sm24c94?2=83:p(<k6:02;?M24m2B?>n5+10f95>o203:17d;j:188m34=831d=i950;9~f7??290?6=4?{%3f=?7702B??h5G43a8L03<,8<j6<k7;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd51>0;694?:1y'5`?=9920D9=j;I61g>N2=2.::l4>e99'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;3=6=4;:183!7b13;;46F;3d9K07e<@<?0(<8n:0g;?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th9584?:583>5}#9l31==64H51f?M25k2B>96*>6`82a==#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn?7;:187>5<7s-;n57??8:J77`=O<;i0D8;4$04b>4c?3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl=9283>1<729q/=h7511:8L15b3A>9o6F:5:&22d<6m11/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb3;1>5<3290;w)?j9;33<>N3;l1C8?m4H478 40f28o37)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`1=4<72=0;6=u+1d;955><@=9n7E:=c:J61>"6>h0:i55+10f95>o203:17d;j:188m34=831d=i950;9~f7?7290?6=4?{%3f=?7702B??h5G43a8L03<,8<j6<k7;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd5;o0;694?:1y'5`?=9920D9=j;I61g>N2=2.::l4>e99'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;9n6=4;:183!7b13;;46F;3d9K07e<@<?0(<8n:0g;?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th9?i4?:583>5}#9l31==64H51f?M25k2B>96*>6`82a==#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn?=l:187>5<7s-;n57??8:J77`=O<;i0D8;4$04b>4c?3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl=3c83>1<729q/=h7511:8L15b3A>9o6F:5:&22d<6m11/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb31b>5<3290;w)?j9;33<>N3;l1C8?m4H478 40f28o37)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`17<<72=0;6=u+1d;955><@=9n7E:=c:J61>"6>h0:i55+10f95>o203:17d;j:188m34=831d=i950;9~f75?290?6=4?{%3f=?7702B??h5G43a8L03<,8<j6<k7;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd5;>0;694?:1y'5`?=9920D9=j;I61g>N2=2.::l4>e99'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;8o6=4;:183!7b13;;46F;3d9K07e<,8;o6<5f5983>>o2m3:17d8=:188k4b02900qo<=c;290?6=8r.:i44>099K06c<@=8h7)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`16g<72=0;6=u+1d;955><@=9n7E:=c:&25a<63`?36=44i4g94?=n>;0;66a>d683>>{e:;k1<7:50;2x 4c>28:37E:<e:J76f=#98n1=6g:8;29?l3b2900e;<50;9l5a1=831vn?<6:187>5<7s-;n57??8:J77`=O<;i0(<?k:09j1=<722c>i7>5;h41>5<<g8n<6=44}c01<?6=<3:1<v*>e8824==O<:o0D9<l;%32`?7<a<21<75f5d83>>o1:3:17b?k7;29?xd5:>0;694?:1y'5`?=9920D9=j;I61g>"69m0:7d;7:188m0c=831b:?4?::m2`2<722wi>?850;694?6|,8o26<>7;I60a>N3:j1/=<j51:k6<?6=3`?n6=44i7094?=h9m=1<75rb306>5<3290;w)?j9;33<>N3;l1C8?m4$03g>4=n=10;66g:e;29?l052900c<j8:188yg4?>3:187>50z&2a<<6811C8>k4H50`?!76l3;0e8650;9j1`<722c=>7>5;n3g3?6=3th9484?:583>5}#9l31==64H51f?M25k2.:=i4>;h7;>5<<a<o1<75f6383>>i6l>0;66sm29694?2=83:p(<k6:02;?M24m2B?>n5+10f95>o203:17d;j:188m34=831d=i950;9~f7>4290?6=4?{%3f=?7702B??h5G43a8 47c281b954?::k6a?6=3`<96=44o0f4>5<<uk83>7>54;294~"6m00:<55G42g8L14d3-;:h7?4i4:94?=n=l0;66g92;29?j7c?3:17pl=8083>1<729q/=h7511:8L15b3A>9o6*>1e82?l3?2900e8k50;9j27<722e:h:4?::a6=6=83>1<7>t$0g:>46?3A>8i6F;2b9'54b=92c>47>5;h7f>5<<a?81<75`1e594?=zj;=m6=4;:183!7b13;;46F;3d9K07e<,8;o6<5f5983>>o2m3:17d8=:188k4b02900qo<8e;290?6=8r.:i44>099K06c<@=8h7)?>d;38m0>=831b9h4?::k56?6=3f;o;7>5;|`1ag<72:0;6=u+1d;9533<@=9n7E:=c:&25a<>3`;;j7>5;h324?6=3f;hj7>5;|`1a=<72:0;6=u+1d;9533<@=9n7E:=c:&25a<>3-;o97:;c:k24c<722c:==4?::m2gc<722wi?o?50;194?6|,8o26<8:;I60a>N3:j1/=<j59:k24c<722c:==4?::m2gc<722wi8=h50;694?6|,8o26<89;I60a>N3:j1/=<j5589'5a3=<=i0e<>i:188m4772900e<?>:188k4ea2900qo<j4;291?6=8r.:i44>669K06c<@=8h7)?>d;331>o68o0;66g>1183>>o6980;66g>1383>>i6ko0;66sm39794?0=83:p(<k6:04;?M24m2B?>n5+10f954=n99l1<75f10294?=n98;1<75f10094?=n9891<75`1bd94?=zj=8?6=4<:183!7b13;=96F;3d9K07e<,8;o6<<4i02e>5<<a8;;6=44o0ae>5<<uk>9m7>53;294~"6m00::85G42g8L14d3-;:h7?=;h33b?6=3`;:<7>5;n3`b?6=3th85;4?:483>5}#9l31=;94H51f?M25k2.:=i4=7:k24c<722c:==4?::k254<722c:=?4?::m2gc<722wi?4:50;794?6|,8o26<88;I60a>N3:j1/=<j5269j55`=831b=<>50;9j547=831b=<<50;9l5f`=831vn>7=:186>5<7s-;n57?97:J77`=O<;i0(<?k:358m46a2900e<??:188m4762900e<?=:188k4ea2900qo=60;291?6=8r.:i44>669K06c<@=8h7)?>d;04?l77n3:17d?>0;29?l7693:17d?>2;29?j7dn3:17pl<9983>6<729q/=h751778L15b3A>9o6*>1e812>o68o0;66g>1183>>i6ko0;66sm3`;94?3=83:p(<k6:044?M24m2B?>n5+10f960=n99l1<75f10294?=n98;1<75f10094?=h9jl1<75rb2c4>5<2290;w)?j9;353>N3;l1C8?m4$03g>73<a8:m6=44i033>5<<a8;:6=44i031>5<<g8im6=44}c1b1?6==3:1<v*>e88222=O<:o0D9<l;%32`?423`;;j7>5;h324?6=3`;:=7>5;h326?6=3f;hj7>5;|`0e6<72<0;6=u+1d;9531<@=9n7E:=c:&25a<5=2c:<k4?::k255<722c:=<4?::k257<722e:ok4?::a7dd=8391<7>t$0g:>4023A>8i6F;2b9'54b=:?1b==h50;9j546=831d=nh50;9~f7ed290>6=4?{%3f=?71?2B??h5G43a8 47c2;?0e<>i:188m4772900e<?>:188m4752900c<mi:188yg4di3:197>50z&2a<<6>>1C8>k4H50`?!76l38>7d??f;29?l7683:17d?>1;29?l76:3:17b?lf;29?xd5k10;684?:1y'5`?=9?=0D9=j;I61g>"69m0996g>0g83>>o6990;66g>1083>>o69;0;66a>cg83>>{e:j<1<7;50;2x 4c>28<<7E:<e:J76f=#98n1>85f11d94?=n98:1<75f10394?=n9881<75`1bd94?=zj;in6=4<:183!7b13;=96F;3d9K07e<,8;o6?84i02e>5<<a8;;6=44o0ae>5<<uk8oj7>55;294~"6m00:::5G42g8L14d3-;:h7<;;h33b?6=3`;:<7>5;h325?6=3`;:>7>5;n3`b?6=3th9hi4?:483>5}#9l31=;94H51f?M25k2.:=i4=4:k24c<722c:==4?::k254<722c:=?4?::m2gc<722wi>il50;794?6|,8o26<88;I60a>N3:j1/=<j5249j55`=831b=<>50;9j547=831b=<<50;9l5f`=831vn?j6:186>5<7s-;n57?97:J77`=O<;i0(<?k:368m46a2900e<??:188m4762900e<?=:188k4ea2900qo<j1;297?6=8r.:i44>649K06c<@=8h7)?>d;05?l77n3:17d?>0;29?j7dn3:17pl=fb83>1<729q/=h751748L15b3A>9o6*>1e816>o68o0;66g>1183>>o6980;66a>cg83>>{e;9<1<7950;2x 4c>28<27E:<e:J76f=#98n1?85f11d94?=n98:1<75f10394?=n9881<75f10194?=n98>1<75`1bd94?=zj::?6=49:183!7b13;=46F;3d9K07e<,8;o6>:4i02e>5<<a8;;6=44i032>5<<a8;96=44i030>5<<g8im6=44}c0f`?6=;3:1<v*>e88220=O<:o0D9<l;%32`?7>3-;o97:;a:k24c<722c:==4?::m2gc<722wi>hk50;694?6|,8o26<89;I60a>N3:j1/=<j51e9'5a3=<=k0e<>i:188m4772900e<?>:188k4ea2900qo=me;290?6=8r.:i44>679K06c<@=8h7)?>d;01?l77n3:17d?>0;29?l7693:17b?lf;29?xd4k<0;6:4?:1y'5`?=9?30D9=j;I61g>"69m0896g>0g83>>o6990;66g>1083>>o69;0;66g>1283>>o69=0;66a>cg83>>{e;j91<7850;2x 4c>28<37E:<e:J76f=#98n1?95f11d94?=n98:1<75f10394?=n9881<75f10194?=h9jl1<75rb36b>5<4290;w)?j9;351>N3;l1C8?m4$03g>4?<a8:m6=44i033>5<<g8im6=44}c07g?6=<3:1<v*>e88223=O<:o0D9<l;%32`?4?3-;o97:;9:k24c<722c:==4?::k254<722e:ok4?::a6d>=8391<7>t$0g:>4023A>8i6F;2b9'54b=901b==h50;9j546=831d=nh50;9~f7gf290?6=4?{%3f=?71>2B??h5G43a8 47c2;20(<j::56;?l77n3:17d?>0;29?l7693:17b?lf;29?xd6n00;6>4?:1y'5`?=9??0D9=j;I61g>"69m0:56*>d48715=n99l1<75f10294?=h9jl1<75rb0d;>5<4290;w)?j9;351>N3;l1C8?m4$03g>4?<,8n>69;?;h33b?6=3`;:<7>5;n3`b?6=3th:j:4?:283>5}#9l31=;;4H51f?M25k2.:=i4>9:&2`0<3==1b==h50;9j546=831d=nh50;9~f4`129086=4?{%3f=?71=2B??h5G43a8 47c2830(<j::577?l77n3:17d?>0;29?j7dn3:17pl>f483>6<729q/=h751778L15b3A>9o6*>1e82=>"6l<0?9>5f11d94?=n98:1<75`1bd94?=zj8l?6=4<:183!7b13;=96F;3d9K07e<,8;o6<74$0f6>1343`;;j7>5;h324?6=3f;hj7>5;|`2b6<72:0;6=u+1d;9533<@=9n7E:=c:&25a<612.:h84;4g9j55`=831b=<>50;9l5f`=831vn<h=:180>5<7s-;n57?95:J77`=O<;i0(<?k:0;8 4b22=>m7d??f;29?l7683:17b?lf;29?xd6n80;6>4?:1y'5`?=9??0D9=j;I61g>"69m0:56*>d4870`=n99l1<75f10294?=h9jl1<75rb0d3>5<4290;w)?j9;351>N3;l1C8?m4$03g>4?<,8n>69:j;h33b?6=3`;:<7>5;n3`b?6=3th:ik4?:283>5}#9l31=;;4H51f?M25k2.:=i4>9:&2`0<3=;1b==h50;9j546=831d=nh50;9~f4cb29086=4?{%3f=?71=2B??h5G43a8 47c2830(<j::571?l77n3:17d?>0;29?j7dn3:17pl>ee83>6<729q/=h751778L15b3A>9o6*>1e82=>"6l<0?9<5f11d94?=n98:1<75`1bd94?=zj8oh6=4<:183!7b13;=96F;3d9K07e<,8;o6<74$0f6>1363`;;j7>5;h324?6=3f;hj7>5;|`2ag<72:0;6=u+1d;9533<@=9n7E:=c:&25a<612.:h84;4e9j55`=831b=<>50;9l5f`=831vn<kn:180>5<7s-;n57?95:J77`=O<;i0(<?k:0;8 4b22=>o7d??f;29?l7683:17b?lf;29?xd5<m0;684?:1y'5`?=9?=0D9=j;I61g>"69m0:n6g>0g83>>o6990;66g>1083>>o69;0;66a>cg83>>{e:=l1<7850;2x 4c>28<37E:<e:J76f=#98n1>45+1e7901?<a8:m6=44i033>5<<a8;:6=44i031>5<<a8;86=44o0ae>5<<uk8>=7>57;294~"6m00::45G42g8L14d3-;:h7?l;h33b?6=3`;:<7>5;h325?6=3`;:>7>5;h327?6=3`;:87>5;n3`b?6=3th9mo4?:483>5}#9l31=;94H51f?M25k2.:=i4>b:k24c<722c:==4?::k254<722c:=?4?::m2gc<722wi>lj50;494?6|,8o26<87;I60a>N3:j1/=<j5289'5a3=<=20e<>i:188m4772900e<?>:188m4752900e<?<:188k4ea2900qo<nf;293?6=8r.:i44>689K06c<@=8h7)?>d;3`?l77n3:17d?>0;29?l7693:17d?>2;29?l76;3:17d?>4;29?j7dn3:17pl<0983>6<729q/=h751778L15b3A>9o6*>1e817>o68o0;66g>1183>>i6ko0;66sm31594?1=83:p(<k6:04:?M24m2B?>n5+10f970=n99l1<75f10294?=n98;1<75f10094?=n9891<75f10694?=h9jl1<75rb2a4>5<4290;w)?j9;351>N3;l1C8?m4$03g>75<a8:m6=44i033>5<<g8im6=44}c1`2?6=?3:1<v*>e8822<=O<:o0D9<l;%32`?523`;;j7>5;h324?6=3`;:=7>5;h326?6=3`;:?7>5;h320?6=3f;hj7>5;|`11=<72>0;6=u+1d;953?<@=9n7E:=c:&25a<6k2c:<k4?::k255<722c:=<4?::k257<722c:=>4?::k251<722e:ok4?::a6d3=83=1<7>t$0g:>40>3A>8i6F;2b9'54b=9j1b==h50;9j546=831b=<?50;9j544=831b=<=50;9j542=831d=nh50;9~f734290<6=4?{%3f=?7112B??h5G43a8 47c28i0e<>i:188m4772900e<?>:188m4752900e<?<:188m4732900c<mi:188yg42>3:187>50z&2a<<6>?1C8>k4H50`?!76l3;j7d??f;29?l7683:17d?>1;29?j7dn3:17pl=5483>2<729q/=h7517;8L15b3A>9o6*>1e81e>o68o0;66g>1183>>o6980;66g>1383>>o69:0;66g>1583>>i6ko0;66sm2c394?1=83:p(<k6:04:?M24m2B?>n5+10f95f=n99l1<75f10294?=n98;1<75f10094?=n9891<75f10694?=h9jl1<75rb3c0>5<3290;w)?j9;352>N3;l1C8?m4$03g>4g<a8:m6=44i033>5<<a8;:6=44o0ae>5<<uk8j>7>57;294~"6m00::45G42g8L14d3-;:h7<n;h33b?6=3`;:<7>5;h325?6=3`;:>7>5;h327?6=3`;:87>5;n3`b?6=3th?>54?:583>5}#9l31=;84H51f?M25k2.:=i4>019j55`=831b=<>50;9j547=831d=nh50;9~f142290?6=4?{%3f=?77i2B??h5G43a8L03<,8<j6<k7;h7;>5<<a?81<75f1e494?=h9m=1<75rb2:0>5<3290;w)?j9;33e>N3;l1C8?m4$03g>0=n=10;66g92;29?l7c>3:17b?k7;29?xd40=0;6;4?:1y'5`?=9?20D9=j;I61g>"69m0j7d??f;29?l7683:17d?>1;29?l76:3:17d?>3;29?j7dn3:17pl<2e83>6<729q/=h751778L15b3A>9o6*>1e812>o68o0;66g>1183>>i6ko0;66sm33g94?5=83:p(<k6:046?M24m2B?>n5+10f963=n99l1<75f10294?=h9jl1<75rb20e>5<4290;w)?j9;351>N3;l1C8?m4$03g>70<a8:m6=44i033>5<<g8im6=44}c104?6=;3:1<v*>e88220=O<:o0D9<l;%32`?413`;;j7>5;h324?6=3f;hj7>5;|`074<72:0;6=u+1d;9533<@=9n7E:=c:&25a<5>2c:<k4?::k255<722e:ok4?::a764=8391<7>t$0g:>4023A>8i6F;2b9'54b=:?1b==h50;9j546=831d=nh50;9~f65429086=4?{%3f=?71=2B??h5G43a8 47c2;<0e<>i:188m4772900c<mi:188yg54<3:1?7>50z&2a<<6><1C8>k4H50`?!76l38=7d??f;29?l7683:17b?lf;29?xd4;<0;6>4?:1y'5`?=9??0D9=j;I61g>"69m09:6g>0g83>>o6990;66a>cg83>>{e:on1<7;50;2x 4c>28<<7E:<e:J76f=#98n1=h5+1e79010<a8:m6=44i033>5<<a8;:6=44i031>5<<g8im6=44}c134?6=>3:1<v*>e8822==O<:o0D9<l;%32`?7a3-;o97:;6:k24c<722c:==4?::k254<722c:=?4?::k256<722e:ok4?::a754=83=1<7>t$0g:>40>3A>8i6F;2b9'54b=:91b==h50;9j546=831b=<?50;9j544=831b=<=50;9j542=831d=nh50;9~f6e6290<6=4?{%3f=?7112B??h5G43a8 47c2;:0e<>i:188m4772900e<?>:188m4752900e<?<:188m4732900c<mi:188yg5e:3:1?7>50z&2a<<6><1C8>k4H50`?!76l330e<>i:188m4772900c<mi:188yg5c;3:187>50z&2a<<6>?1C8>k4H50`?!76l3;;<6g>0g83>>o6990;66g>1083>>i6ko0;66sm3b;94?5=83:p(<k6:046?M24m2B?>n5+10f95<=#9m?189l4i02e>5<<a8;;6=44o0ae>5<<uk9o=7>57;294~"6m00::45G42g8L14d3-;:h7<?;h33b?6=3`;:<7>5;h325?6=3`;:>7>5;h327?6=3`;:87>5;n3`b?6=3th8oi4?:483>5}#9l31=;94H51f?M25k2.:=i4>e:&2`0<3<>1b==h50;9j546=831b=<?50;9j544=831d=nh50;9~f6ee290?6=4?{%3f=?71>2B??h5G43a8 47c28n0(<j::56a?l77n3:17d?>0;29?l7693:17b?lf;29?xd4ko0;6;4?:1y'5`?=9?20D9=j;I61g>"69m0:j6*>d48702=n99l1<75f10294?=n98;1<75f10094?=n9891<75`1bd94?=zj;oh6=4=:183!7b13;==6F;3d9K07e<a8:n6=44o0ae>5<<uk9i87>52;294~"6m00::<5G42g8L14d3`;;i7>5;n3`b?6=3th?<i4?:ca94?6|,8o26<j7;I60a>N3:j1Q9:4l{01950<b2>036n4>7;37>4>=n3;=6o4rn71961=i>=0986`k3;28jc3=82.:<>4>079'552=9l20(<k::39'543=;2.:=;4<;%323?5<,8;36>5+10;97>"69h087)?>b;18 47d2:1/=<k53:&25c<43-;9<7=4$002>6=#9;81?6*>2280?!75<390(<<::29'570=;2.:>:4<;%31<?5<,8826>5+13c97>"6:k087)?=c;18 44c2:1/=?k53:&26c<43-;8<7=4$012>6=#9:81?6*>3280?!74<390(<=::29'560=;2.:?:4<;%30<?5<,8926>5+12c97>"6;k087)?<c;18 45c2:1/=>k53:&27c<43-;?<7=4$062>6=#9=81?6*>4280?!73<390(<:::29'510=;2.:8:4<;%37<?5<,8>26>5+15c97>"6<k087)?;c;18 42c2:1/=9k53:&20c<43-;><7=4$072>6=#9<81?6*>5280?!72<390(<;::29'500=;2.:9:4<;%36<?5<,8?26>5+14c97>"6=k087)?:c;18 43c2:1/=;>51bg8 4bc28o<7)?ke;7:?!7cn3?27)?j1;77?!7b:3;n86*>5d81?!72n380(9=n:51:?!24j3>856*>e781?l7c13:17d;l:188m4652900e<jl:188m0b=831b=io50;9j5ad=831b==?50;9jef<72-;o87om;o3g7?6<3`kj6=4+1e69eg=i9m91=65fa883>!7c<3ki7c?k3;08?lg?290/=i:5ac9m5a5=;21b8>=50;&2`1<3;;1e=i=50:9j067=83.:h94;339m5a5=921b8>>50;&2`1<3;;1e=i=52:9j07`=83.:h94;339m5a5=;21doo4?:%3g0?ef3g;o?7>4;na:>5<#9m>1ol5a1e195>=hk>0;6)?k4;ab?k7c;3807bm9:18'5a2=kh1e=i=53:9lg0<72-;o87mn;o3g7?2<3fi?6=4+1e69gd=i9m91965`c283>!7c<3ij7c?k3;48?je5290/=i:5c`9m5a5=?21do<4?:%3g0?ef3g;o?764;na3>5<#9m>1ol5a1e19=>=hjo0;6)?k4;ab?k7c;3k07blj:18'5a2=kh1e=i=5b:9lff<72-;o87mn;o3g7?e<3fhi6=4+1e69gd=i9m91h65`b`83>!7c<3ij7c?k3;g8?jd>290/=i:5c`9m5a5=n21dn54?:%3g0?ef3g;o?7??;:ma3?6=,8n?6no4n0f0>47<3fh=6=4+1e69gd=i9m91=?54oc794?"6l=0hm6`>d2827>=hj=0;6)?k4;ab?k7c;3;?76am3;29 4b32jk0b<j<:078?jb5290/=i:5c`9m5a5=9?10ci?50;&2`1<di2d:h>4>7:9l`5<72-;o87mn;o3g7?7?32ehj7>5$0f7>fg<f8n86<74;naf>5<#9m>1ol5a1e195d=<gjn1<7*>d58`e>h6l:0:n65`cb83>!7c<3ij7c?k3;3`?>id03:1(<j;:bc8j4b428n07blk:18'5a2=kh1e=i=51d98kg4=83.:h94la:l2`6<6n21b?o4?:%3g0?5f3g;o?7>4;h1:>5<#9m>1?l5a1e195>=n;10;6)?k4;1b?k7c;3807d=8:18'5a2=;h1e=i=53:9j01<72-;o87=n;o3g7?2<3`>86=4+1e697d=i9m91965f4383>!7c<39j7c?k3;48?l26290/=i:53`9m5a5=?21b8=4?:%3g0?5f3g;o?764;h1e>5<#9m>1?l5a1e19=>=n;l0;6)?k4;1b?k7c;3k07d=k:18'5a2=;h1e=i=5b:9j7f<72-;o87=n;o3g7?e<3`9=6=4+1e697d=i9m91h65f4`83>!7c<3>27c?k3;28?l2?290/=i:5489m5a5=921b8:4?:%3g0?2>3g;o?7<4;h65>5<#9m>1845a1e197>=n=:0;6)?k4;6:?k7c;3>07d;=:18'5a2=<01e=i=55:9j14<72-;o87:6;o3g7?0<3`?;6=4+1e690<=i9m91;65f4g83>!7c<3>27c?k3;:8?l2b290/=i:5489m5a5=121b8i4?:%3g0?2>3g;o?7o4;h6`>5<#9m>1845a1e19f>=n<k0;6)?k4;6:?k7c;3i07d:::18'5a2=<01e=i=5d:9je5<72-;o877i;o3g7?6<3`3n6=4+1e69=c=i9m91=65f9b83>!7c<33m7c?k3;08?l?e290/=i:59g9m5a5=;21b5l4?:%3g0??a3g;o?7:4;h;:>5<#9m>15k5a1e191>=n110;6)?k4;;e?k7c;3<07d78:18'5a2=1o1e=i=57:9j=3<72-;o877i;o3g7?><3`3>6=4+1e69=c=i9m91565f9583>!7c<33m7c?k3;c8?l?4290/=i:59g9m5a5=j21b5<4?:%3g0??a3g;o?7m4;h;3>5<#9m>15k5a1e19`>=n0o0;6)?k4;;e?k7c;3o07d6j:18'5a2=1o1e=i=5f:9j<a<72-;o877i;o3g7?7732c3o7>5$0f7><`<f8n86<?4;h:a>5<#9m>15k5a1e1957=<a1k1<7*>d58:b>h6l:0:?65f8883>!7c<33m7c?k3;37?>o?03:1(<j;:8d8j4b428?07do8:18'5a2=1o1e=i=51798md0=83.:h946f:l2`6<6?21bm84?:%3g0??a3g;o?7?7;:kb0?6=,8n?64h4n0f0>4?<3`k86=4+1e69=c=i9m91=l54i`094?"6l=02j6`>d282f>=ni80;6)?k4;;e?k7c;3;h76g6d;29 4b320l0b<j<:0f8?l?5290/=i:59g9m5a5=9l10e5950;&2`1<>n2d:h>4>f:9lbd<72-;o87h6;o3g7?6<3fl36=4+1e69b<=i9m91=65`f683>!7c<3l27c?k3;08?j`1290/=i:5f89m5a5=;21bn<4?:%3g0?d73g;o?7>4;hce>5<#9m>1n=5a1e195>=nil0;6)?k4;`3?k7c;3807dok:18'5a2=j91e=i=53:9lbc<72-;o87hj;o3g7?6<3flo6=4+1e69b`=i9m91=65`fb83>!7c<3ln7c?k3;08?j`e290/=i:5fd9m5a5=;21dii4?:%3g0?cd3g;o?7>4;nga>5<#9m>1in5a1e195>=hm00;6)?k4;g`?k7c;3807bk7:18'5a2=mj1e=i=53:9la2<72-;o87kl;o3g7?2<3fo=6=4+1e69af=i9m91965`e483>!7c<3oh7c?k3;48?jc3290/=i:5eb9m5a5=?21di>4?:%3g0?cd3g;o?764;ng1>5<#9m>1in5a1e19=>=hm80;6)?k4;g`?k7c;3k07bk?:18'5a2=mj1e=i=5b:9l``<72-;o87kl;o3g7?e<3fno6=4+1e69af=i9m91h65`db83>!7c<3oh7c?k3;g8?jbe290/=i:5eb9m5a5=n21dhl4?:%3g0?cd3g;o?7??;:mg=?6=,8n?6hm4n0f0>47<3fn36=4+1e69af=i9m91=?54oe594?"6l=0no6`>d2827>=hl?0;6)?k4;g`?k7c;3;?76ak5;29 4b32li0b<j<:078?j`3290/=i:5eb9m5a5=9?10ck=50;&2`1<bk2d:h>4>7:9lb7<72-;o87kl;o3g7?7?32em=7>5$0f7>`e<f8n86<74;nd3>5<#9m>1in5a1e195d=<gll1<7*>d58fg>h6l:0:n65`ed83>!7c<3oh7c?k3;3`?>ibi3:1(<j;:da8j4b428n07bji:18'5a2=mj1e=i=51d98ka2=83.:h94jc:l2`6<6n21b8>650;&2`1<3;>1e=i=50:9j060=83.:h94;369m5a5=921b8>;50;&2`1<3;>1e=i=52:9j062=83.:h94;369m5a5=;21b;k4?:%3g0?1b3g;o?7>4;h5g>5<#9m>1;h5a1e195>=n?k0;6)?k4;5f?k7c;3807d9n:18'5a2=?l1e=i=53:9j3<<72-;o879j;o3g7?2<3`=36=4+1e693`=i9m91965f7683>!7c<3=n7c?k3;48?l11290/=i:57d9m5a5=?21b;84?:%3g0?1b3g;o?764;h57>5<#9m>1;h5a1e19=>=n?:0;6)?k4;5f?k7c;3k07d9=:18'5a2=?l1e=i=5b:9j35<72-;o879j;o3g7?e<3`<m6=4+1e693`=i9m91h65f6d83>!7c<3=n7c?k3;g8?l0c290/=i:57d9m5a5=n21b:n4?:%3g0?1b3g;o?7??;:k5f?6=,8n?6:k4n0f0>47<3`<j6=4+1e693`=i9m91=?54i7;94?"6l=0<i6`>d2827>=n>10;6)?k4;5f?k7c;3;?76g97;29 4b32>o0b<j<:078?l>1290/=i:57d9m5a5=9?10e5;50;&2`1<0m2d:h>4>7:9j<1<72-;o879j;o3g7?7?32c3?7>5$0f7>2c<f8n86<74;h:1>5<#9m>1;h5a1e195d=<a1;1<7*>d584a>h6l:0:n65f8183>!7c<3=n7c?k3;3`?>o0k3:1(<j;:6g8j4b428n07d9>:18'5a2=?l1e=i=51d98m30=83.:h948e:l2`6<6n21v97j:181[20m27?<i48f:p0<e=838pR99k;<63`?1c3ty?5l4?:3y]02d<5=:o6:l4}r6:=?6=:rT?;l5241f93d=z{=336=4={_64=>;38m0<56s|48594?4|V==370:?d;5;?xu31?0;6?uQ4658916c2>=0q~:65;296~X3??168=j5779~w1?32909wS:85:?74a<0=2wx84=50;0xZ11334>;h79;;|q7=7<72;qU8:=4=52g>25<uz>2=7>52z\737=:<9n1;?5rs5:e>5<5sW><<63;0e844>{t<1o1<7<t^54e?827l3<m7p};8e83>7}Y<?o019>k:7g8yv2?k3:1>vP;6e9>05b=>m1v96m:181[21k27?<i49c:p0=g=838pR98m;<63`?0e3ty?444?:3y]03g<5=:o6;o4}r6;<?6=:rT?:45241f92<=z{=2<6=4={_65<>;38m0=46s|49494?4|V=<<70:?d;44?xu3i<0;6?uQ4968916c21<0q~:n4;296~X30:168=j5849~w1g42909wS:72:?74a<?<2wx8l<50;0xZ1>634>;h76<;|q7e4<72;qU85>4=52g>=4<uz>j<7>52z\73c=:<9n14<5rs5;e>5<5sW><o63;0e8;4>{t<0h1<7<t^552?827l3=h7p};9183>7}Y<?<019>k:638yv2?=3:1>vP;649>05b=>?1v8=?:180[35>2789:4>0g9>70e=98:0q~;=e;297~X2:<16?8851038963e28;97p}:2e83>6}Y=;>01>;9:02e?852j3;:=6s|53a94?5|V<8870=:5;325>;4=h0:=?5rs40a>5<4sW?9>63<54824c=:;<k1=<?4}r71e?6=;rT>><523469547<5:?26<?=;|q66<<72:qU9?>4=277>46a349>57?>1:p17>=839pR8?i;<167?769278954>139~w0402908wS;>e:?016<68o16?8651038yv33;3:1?vP:389>71>=99l01>:k:033?xu2<80;6>uQ52:8962028;:70=;c;326>{t==:1<7=t^414?853?3;;j63<4b8254=z{<9m6=4<{_702>;4<?0:=<5235`9544<uz?8i7>53z\670=:;=<1==h4=26a>4763ty>?i4?:2y]162<5:>>6<?>;<17e?76:2wx9>m50;1xZ054349?97??f:?00d<6981v8=m:180[34:278894>109>71?=9880q~;<a;297~X2;816?9:511d8962>28;:7p}:4583>17|V<>?70<j7;7;?84b>3?370<j9;7;?825:3?370:=1;7;?826j3?370:>a;7;?82613?370:=0;7;?855;3?370==2;7;?85593?370==0;7;?856n3?370=>e;7;?856l3?370=>c;7;?856j3?370=>1;7;?85683?370=?f;7;?857m3?370=?d;7;?857k3?370=?b;7;?857i3?370=?9;7;?840<3?370<83;7;?840:3?370<81;7;?84083?370<9f;7;?841m3?370<9d;7;?841k3?370<mb;7;?84ei3?370<m9;7;?84e03?370<m7;7;?84e>3?370<m5;7;?84e<3?370<m3;7;?84>03?370<67;7;?84>>3?370<65;7;?84><3?370<63;7;?84>:3?370<61;7;?84>83?370<=d;7;?845k3?370<=b;7;?845i3?370<=9;7;?84503?370<=7;7;?845>3?370<=5;7;?827l3?o7p}:4g83>0}Y==l01?km:02e?84b03;;j63;0g824c=::l>1==h4}r765?6=?rT>9<5240091`=:<8?1=i84=537>4b134>9<7?k6:?756<6l?168?;51e48yv3203:19kuQ54:896d72<201>oi:4:891752<2019<8:4:891722<2019<9:4:891732<2019?i:4:8917b2<2019?<:4:8961>2<201>97:4:896102<201>99:4:896122<201>9;:4:896142<201>9=:4:896162<2019>l:4:8916e2<2019>n:4:8916>2<2019>7:4:891602<2019>9:4:891622<2019>;:4:896`f2<201>h6:4:896`?2<201>h8:4:896`12<201>h::4:896`32<201>h<:4:896`52<201>k7:4:896c02<201>k9:4:896c22<201>k;:4:896c42<201>k=:4:896c62<201>k?:4:896b12<201>j::4:896b32<201>j=:4:896b72<201>mj:4:896ed2<201>mn:4:896e?2<201??m:4:8977f2<201??6:4:8977?2<201??8:4:897712<201??::4:897732<201??<:4:897052<201?8>:4:897072<201?;i:4:8973b2<201?;k:4:8973d2<201?;m:4:8973f2<201?=i:4:8975b2<201?=k:4:8975d2<201?=m:4:8975f2<201?=6:4:8975?2<201?=8:4:897>12<201?6::4:897>32<201?6<:4:897>52<201?6>:4:897>72<201?9i:4:8971b2<2019<::4:896>42<2019>k:4a8yv31;3:1mvP:629>7g7=99l01>6::02e?85e:3;;j63<d2824c=:;j31==h4=2f2>477349hh7?>0:?0gg<69916?nh51028yv21<3:1;ouQ4708Z1063W>=<6P;5g9]00c<V=?o7S::c:\71g=Y<<k0R8:k;_77g>X2<k1U99o4^46:?[3302T>8:5Q5548Z0223W?==6P:619]10`<V<?n7S;:d:\61f=Y=<h0R8;n;_76=>X3=<1U8884^5d0?[2a<2T>985Q5458Z0353W>=863;3g824f=:<8h1:?5240c927=:<831:?52432927=:<8l1:?5240g927=:<891:?5239f920=:;1i1:85239`920=:;1k1:85239g920=:;h:1:85238d920=:;0o1:85238f920=:;h;1:8522b1920=::j81:8522b3920=::j:1:8522b6920=::m<1:8522e7920=::m>1:8522e1920=::m=1:85233691g=:;;>1=h>4=50;>47634>;h7?k9:?74a<6lh168=j51e`8916c2hi019>k:`c8916c2h3019>k:`:8916c2:l019>k:2g8916c2:n019>k:2a8916c2:<019>k:5g8916c2=n019>k:5a8916c2=h019>k:578916c2h:019>k:8g8916c20i019>k:8`8916c20k019>k:8;8916c202019>k:858916c20<019>k:878916c20>019>k:818916c20;019>k:828916c21l019>k:9g8916c21n019>k:9a8916c21h019>k:9c8916c213019>k:9:8916c2h=019>k:`48916c2h?019>k:`68916c2h9019>k:`08916c2h;019>k:8f8916c208019>k:958916c2k;019>k:`d8916c2ho019>k:`f8916c2=9370:?d;602>;38m0??85241f9062<uz>oj7>52z\7fc=:<9n1ii5rs5fg>5<5sW>ii63;0e8ff>{t<mh1<7<t^5``?827l3o27p};d`83>7}Y<kh019>k:d:8yv2c13:1>vP;b`9>05b=m>1v9j7:181[2e127?<i4j6:p0a1=838pR9l7;<63`?c23ty?h;4?:3y]0g1<5=:o6h:4}r6g1?6=:rT?n;5241f9a6=z{=n?6=4={_6a1>;38m0n>6s|4e194?4|V=h?70:?d;g2?xu3l;0;6?uQ4c18916c2l:0q~:k0;296~X3j8168=j5dd9~w1ea2909wS:m0:?74a<cl2wx8nk50;0xZ1ga34>;h7jl;|q7ga<72;qU8lk4=52g>ad<uz>ho7>52z\7ea=:<9n1hl5rs5aa>5<5sW>jo63;0e8g=>{t<jk1<7<t^5ca?827l3n37p};c883>7}Y<hk019>k:e58yv2d03:1>vP;a89>05b=l?1v9m8:181[2f027?<i4k5:p0`0=838pR9m:;<63`?`33ty?i84?:3y]0f2<5=:o6k=4}r6f0?6=:rT?o>5241f9b7=z{=o86=4={_6`6>;38m0m=6s|4d094?4|V=i:70:?d;d3?xu3m80;6?uQ4b28916c2ll0q~:j0;296~X3jm168=j5ed9~w1bd2909wS:m2:?74a<bi2wx8i?50;0xZ1g034>;h7ji;|q7g3<72;qU8l84=52g>a2<uz8n;7>53z\7a==::l=1=i94=3g;>4773ty8n=4?:3y]0`c<5:h;6<j8;|q0<6<72:qU9<=4=2:0>4b0349387??f:p6`?=838pR8;9;<0f=?7c?2wx=;k50;5x912728n:70=7a;7a?85>l3?i70<l0;7a?84c;3?i70=<f;7a?853m3?i7p}=e283>6}::l=1:?522d4927=::l>1=nh4}r62<?6=9?q6>h951e4897c128n=70<j9;7f?826j3;o;63<2286a>;4:;0>i63<2086a>;4:90>i63<1g86a>;49l0>i63<1e86a>;49j0>i63<1c86a>;4980>i63<1186a>;48o0>i63<0d86a>;48m0>i63<0b86a>;48k0>i63<0`86a>;4800:h;5rs3g5>5<3s48n:7?k7:?1ag<699168=h5103897c328;;7p}=e`83>7}::l31:?522d:95f`<uz9jh7>53z?0f5<1:278mk492:?0<0<6ko1v9?;:18685e83;o:63<ag82`3=:<8?1:?5240695a1<5:286<j9;|q0ec<72?q6?lh51e5896d628;;70=75;325>;40=0:=<523c09546<5:h?6<>j;|q750<72;q68<<5639>043=9m=0q~:>2;297~;39;0:h:523979546<5:2?6<??;|q764<72:q68?<5639>077=9m=019<?:4;8yv25:3:1>v3;2382`2=:<;>1==h4}r612?6=;r7?>:492:?763<6l>168?6511d8yv25?3:1>v3;2682`2=:<;k1==h4}r614?6=;r7?><492:?765<6l>168?:51028yv25=3:18v3;27856>;3:h0:==5243:9546<5=8>6<j8;|q756<72;q68<:5639>045=9m=0q~:=3;290~;39k0:h;5240c95a0<5=;26<j9;<610?7dn2wx8<950;06826i3;o;63=7586a>;5?:0>i63=7386a>;5?80>i63=7186a>;5>o0>i63=6d86a>;5>m0>i63=6b86a>;5jk0>i63=b`86a>;5j00>i63=b986a>;5j>0>i63=b786a>;5j<0>i63=b586a>;5j:0>i63=9986a>;51>0>i63=9786a>;51<0>i63=9586a>;51:0>i63=9386a>;5180>i63=9186a>;5:m0>i63=2b86a>;5:k0>i63=2`86a>;5:00>i63=2986a>;5:>0>i63=2786a>;5:<0>i6s|40494?5|5=;26<j8;<63b?76827?<i4>db9~w14>2908w0:>f;3g2>;39l0:h;5243c95f`<uz>:h7>52dy>04`=9m=01>96:4g8961?2<o01>98:4g896112<o01>9::4g896132<o01>9<:4g896152<o01>9>:4g8916d2<o019>m:4g8916f2<o019>6:4g8916?2<o019>8:4g891612<o019>::4g891632<o01>hn:4g896`>2<o01>h7:4g896`02<o01>h9:4g896`22<o01>h;:4g896`42<o01>h=:0f5?85b03?n70=j7;7f?85b>3?n70=j5;7f?85b<3?n70=j3;7f?85b:3?n70=j1;3g2>;4m90>i63<d786a>;4l<0>i63<d586a>;4l;0>i63<d186a>;4kl0>i63<cb86a>;4kh0:h;523b:95a0<uz>:o7>524y>04c=9m=01??m:4g8977f2<o01??6:4g8977?2<o01??8:4g897712<o01??::4g897732<o01??<:4g897052<o01?8>:4g897072<o01?;i:4g8973b2<o01?;k:4g8973d2<o01?;m:4g8973f2<o01?=i:4g8975b2<o01?=k:4g8975d2<o01?=m:4g8975f2<o01?=6:4g8975?2<o01?=8:4g897>12<o01?6::4g897>32<o01?6<:4g897>52<o01?6>:4g897>72<o01?9i:4g8971b2<o0q~=78;296~;40m0>n63<8b82gc=z{:3>6=4={<1;`?7b82785;4>cg9~w6>>2909w0=7d;3`b>;40l0>n6s|39594?4|5:2h68l4=2:a>4ea3ty85>4?:3y>7=e=9l:01>7;:0ae?xu40?0;6?u239`91g=:;1k1=nh4}r1:5?6=:r784o4>e19>7<4=9jl0q~=7f;296~;40h0:i=5238295f`<uz92;7>52z?0<`<6m916?4651bd8yv5fk3:1>v3<8d82gc=:;1?1=<=4}r1:f?6=:r78m=4:b:?0=c<6ko1v>o7:18185f83;n<63<a882gc=z{:3h6=4={<1b4?7dn278m<4:b:p7<g=838p1>7i:4`896?b28im7p}<a783>7}:;0l1=h>4=2c4>4ea3ty8544?:3y>7<c==k16?4j51bd8yv5f<3:1>v3<9d82a5=:;h?1=nh4}r1b6?6=:r785i4>e19>7d5=9jl0q~=na;296~;4i80:i=523``95f`<uz9ji7>52z?0e4<6ko16?5;51008yv4em3:1>v3=c286f>;5k;0:ok5rs3aa>5<5s48h?7?j0:?1gf<6ko1v?li:18184d;3;hj63=c586f>{t:kn1<7<t=3a1>0d<5;i:6<mi;|q1g<<72;q6>n<51d2897ef28im7p}=bb83>7}::j;19o522b295f`<uz8h;7>52z?1g4<6m916>n651bd8yv4d=3:1>v3=c182a5=::j<1=nh4}r0``?6=:r79o94>e19>6fc=9jl0q~<j2;296~;5k=0:ok522d69547<uz8o=7>52z?1`3<2j279h84>cg9~w7bb2909w0<k6;3f4>;5lo0:ok5rs3f1>5<5s48o:7?lf:?1`2<2j2wx>i>50;0x97b22<h01?j;:0ae?xu5lj0;6?u22e795`6<5;no6<mi;|q1gc<72;q6>i:55c9>6a5=9jl0q~<ka;296~;5l=0:i=522e`95f`<uz8o47>52z?1`6<6m916>i751bd8yv4b83:1>v3=d682a5=::l;1=nh4}r0f1?6=:r79h:4>cg9>6`2=9880q~:>0;2956}:;;91945233091<=:;;;1945233291<=:;8l1945230g91<=:;8n1945230a91<=:;8h1945230391<=:;8:1945231d91<=:;9o1945231f91<=:;9i1945231`91<=:;9k1945231;91<=::lh1=nh4}r0e3?6=<r78>>492:?054<6l>16>h?51028966028:m7p}<1`83>0}:;;91=i94=30g>34<5;in6<??;<3e5?76827?<i4;a:p6c0=83?p1><=:708967728n<70<kf;325>;48?0:<k523159546<uz9:57>55z?067<6l>16>nm5100894`628:m70?i0;324>;38m0?46s|2g794?0|5:8:6;<4=22e>4b0348oj7?>2:?043<69916?=:511d8966?28:m7p}<1983>0}:;;;1=i94=3a`>47634;m<7??f:?2ac<699168=j5469~w7`3290<w0==0;41?857m3;o;63=de8254=:;9<1=<?4=227>477349;47?>0:?047<68o1v>?8:18685583;o;63=c`8257=:9ll1==h4=0gf>47734>;h7:9;|q1b6<721q6?<h5639>75b=9m=01?jk:031?857>3;:>63<058254=:;9=1=<?4=223>46a349;>7?>0:p740=83?p1>?i:0f4?84di3;:=63>ed824c=:9ln1=<>4=52g>05<uz8m>7>59z?05`<1:278<n4>d69>6ad=98801>>9:030?857<3;:>63<068257=::on1==h4=223>477349;>7?>1:p743=83?p1>?j:0f4?84d03;:>63>ee824c=:9li1=<>4=52g>04<uz8m=7>58z?05a<1:278<o4>d69>6ad=98;01?hl:02e?84bm3;;j63=fe8257=:;9:1=<=4=221>4733ty8=94?:4y>74b=9m=01?m7:032?87bk3;;j63>ec8255=:<9n19<5rs3d3>5<>s49:o78=;<13e?7c?279h44>109>6ce=98:01?kk:033?84bm3;:=63=fe8254=:;9:1=<<4=221>4743ty8=>4?:4y>74e=9m=01?m9:031?87bj3;;j63>e`8255=:<9n19=5rs3ge>5<fs49:n78=;<13=?7c?279h44>139>6ce=98;01?kk:02e?84bm3;:<63=fe8255=:;9:1=<?4=221>475348no7??e:p744=83>p1>?m:0f4?84d>3;:=63>e`824c=:<9n18k5rs224>5<5s49:=78=;<133?7dn2wx?=;50;0x96772?801>>9:0ae?xu48:0;6?u231d927=:;9>1=nh4}r135?6=:r78<h492:?047<6ko1v?hi:181857l3<970=?0;3`b>{t:oh1<7<t=22`>34<5;lo6<mi;|q1bd<72;q6?=l5639>6`c=9jl0q~<i9;296~;48h0=>63=ee82gc=z{;l36=4={<13=?05348no7?lf:p714=838p1>:<:4`8962528im7p}<4e83>7}:;=91:85235f95f`<uz9?47>52z?006<6m916?9651bd8yv51?3:1>v3<4282gc=:;1>1=<=4}r144?6==r78854>119>71b=99l01>;8:033?852k3;;j63<7882`2=z{:>:6=4={<176?3e349?=7?lf:p71e=838p1>:=:778962d28im7p}<4683>7}:;=81=h>4=264>4ea3ty8:h4?:4y>711=98:01>:l:033?852>3;:<63<5c8255=:;>=1=i94}r15b?6==r788:4>139>71e=99l01>;9:031?852j3;;j63<7982`2=z{:>;6=4={<175?3e349?<7?lf:p71d=838p1>:>:778962e28im7p}<4783>7}:;=;1=h>4=265>4ea3ty8:n4?:4y>710=98:01>:m:033?852=3;:<63<5`8255=:;>?1=i94}r15`?6==r788;4>139>71d=99l01>;::031?852i3;;j63<7782`2=z{:9m6=4={<174?3e3498j7?lf:p71g=838p1>:?:778962f28im7p}<4483>7}:;=:1=h>4=266>4ea3ty8:l4?:4y>713=98:01>:n:033?852<3;:<63<588255=:;>91=i94}r15f?6==r78884>139>71g=99l01>;;:031?85213;;j63<7582`2=z{:>26=4={<10b?02349?57?lf:p712=838p1>=i:0g3?853<3;hj6s|37:94?3|5:>?6<??;<17=?7682789>4>119>70>=98:01>9>:0f4?xu4>00;68u23569544<5:>26<>i;<167?76:278954>0g9>724=9m=0q~=:1;296~;4=;0>n63<5082gc=z{:?h6=4={<166?02349>o7?lf:p701=838p1>;=:0g3?852?3;hj6s|34094?4|5:?96<mi;<1;0?76:2wx?8>50;0x96362<h01>;?:0ae?xu4=k0;6?u2343920=:;<h1=nh4}r162?6=:r789<4>e19>700=9jl0q~=;f;296~;4=90>n63<4g82gc=z{:?j6=4={<164?02349>m7?lf:p703=838p1>;?:0g3?852=3;hj6s|35g94?4|5:>m68l4=26f>4ea3ty8944?:3y>71`=><16?8751bd8yv52<3:1>v3<4g82a5=:;<>1=nh4}r16<?6=:r788h495:?01=<6ko1v>;<:181853m3;n<63<5282gc=z{:8h6=4={<10a?3e3499o7?lf:p763=838p1>=j:041?854=3;hj6s|39094?4|5:9n6<mi;<14=?053ty8>o4?:2y>76b==k16??m55c9>77d=9jl0q~=<4;297~;4;m0::?5233a95`6<5:9?6<mi;|q0<4<72;q6?>j51bd8961?2?80q~=i0;291~;4:j0=963;0c856>;4n00:h:523849546<5:9?6<>i;|q06d<72:q6?>m55c9>77d==k16??o51bd8yv54;3:1?v3<3b8227=:;;h1=h>4=210>4ea3ty84=4?:3y>76e=9jl01>98:708yv5bn3:19v3<2c851>;38h0=>63<f982`2=:;0<1=<<4=210>46a3ty8>44?:2y>76d==k16??o55c9>77?=9jl0q~=<2;297~;4;k0::?5233c95`6<5:996<mi;|q03c<72;q6?>l51bd896112?80q~=je;291~;4:h0=963;08856>;4n>0:h:523869546<5:996<>i;|q06=<72:q6?>o55c9>77?==k16??651bd8yv5493:1?v3<3`8227=:;;31=h>4=212>4ea3ty8;h4?:3y>76g=9jl01>9::708yv5bl3:19v3<28851>;3810=>63<f782`2=:;0>1=<<4=212>46a3ty8>:4?:2y>76?==k16??655c9>771=9jl0q~=<0;297~;4;00::?5233:95`6<5:9;6<mi;|q03a<72;q6?>751bd896132?80q~=jc;291~;4:10=963;06856>;4n<0:h:523809546<5:9;6<>i;|q063<72:q6?>655c9>771==k16??851bd8yv55n3:1?v3<398227=:;;=1=h>4=20e>4ea3ty8;n4?:3y>76>=9jl01>9<:708yv5bj3:19v3<26851>;38?0=>63<f582`2=:;081=<<4=20e>46a3ty8>84?:2y>761==k16??855c9>773=9jl0q~==e;297~;4;>0::?5233495`6<5:8n6<mi;|q03g<72;q6?>951bd896152?80q~=ja;291~;4:?0=963;04856>;4n:0:h:523829546<5:8n6<>i;|q061<72:q6?>855c9>773==k16??:51bd8yv55l3:1?v3<378227=:;;?1=h>4=20g>4ea3ty8;l4?:3y>760=9jl01>9>:708yv5b13:19v3<24851>;38=0=>63<f382`2=:;0:1=<<4=20g>46a3ty8n<4?:02x96432??01>k7:4;896c02<301>k9:4;896c22<301>k;:4;896c42<301>k=:4;896c62<301>k?:4;896d528im70:?d;335>;38m0??>5241f9067<5=:o69=?;<63`?25n2wx8<?50;35827k3?270:?b;7:?827i3?270:?9;7:?82703?270:?7;7:?827>3?270:?5;7:?827<3?270=ia;7:?85a13?270=i8;7:?85a?3?270=i6;7:?85a=3?270=i4;7:?85a;3?270=i2;7:?85c>3?270=k5;7:?85c<3?270=m1;3`b>{t;o;1<7:t=52`>34<5:lj6<j8;<1:<?768278?84>0g9~w164290?w0:?c;3g3>;50?0=>63>f88255=:<9n1?o5rs521>5<3s4>;n7?k7:?2b<<68o16=k651028916c2:30q~:?1;290~;38h0:h:521g:955`<58l<6<??;<63`?5?3ty?<=4?:5y>05?=9m=01<h8:02e?87a>3;:<63;0e803>{t;ol1<7:t=52;>4b034;m:7??f:?2b0<699168=j5459~w6`b290?w0:?7;3g3>;6n<0:<k521g69546<5=:o69=4}r1e`?6=<r7?<;4>d69>5c2=99l01<h<:033?827l3>97p}<fb83>1}:<9?1=i94=0d0>46a34;m>7?>0:?74a<392wx?kl50;1x916328n<70?i2;33b>;38m0?<6s|3ed94?5|5:lj6;<4=2g;>4b0349jn7??f:p7ac=839p1>h6:70896c028n<70=n9;324>{t;mn1<7=t=2d;>34<5:o=6<j8;<1b=?77n2wx?im50;1x96`02?801>k::0f4?85f?3;:<6s|3e`94?5|5:l=6;<4=2g7>4b0349j;7??f:p7ag=839p1>h::70896c428n<70=n5;324>{t;m31<7=t=2d7>34<5:o96<j8;<1b1?77n2wx?i650;1x96`42?801>k>:0f4?85f;3;:<6s|3e594?5|5:l96;<4=2g3>4b0349j?7??f:p7gb=839p1>k7:70896b128n<70=l6;33b>{t;ki1<7:t=2g4>34<5:n>6<j8;<1`1?77n278o;4>119~w6de290>w0=j6;41?85c<3;o;63<c48255=:;j91==h4=2a4>46a3ty8nl4?:6y>7`3=>;16?i<51e5896e228;:70=l3;324>;4k>0:==523b3955`<5:n86<??;|q0f<<72>q6?h:5639>7a6=9m=01>m::031?85d;3;:=63<c78254=:;j;1=<>4=2f2>46a3ty8n54?:9y>7`5=>;16?nk51e5896e228;870=l3;326>;4k?0:=?523b39547<5:n:6<?>;<1`b?77n2wx?o950;5x96c52?801>ml:0f4?85em3;;j63<c08251=:;m;1=<:4=2ag>46a349hj7?>3:p7g0=832p1>k>:70896ef28n<70=me;324>;4k80:=>523e39545<5:io6<?=;<1`f?77n278ok4>139~w6d22902w0=j0;41?85d03;o;63<bd8254=:;j;1=<<4=2a:>477349o=7?>2:?0ga<69816?nl5103896ea28;:7p}<c783>7}:;m<1:?523b495f`<uz9h87>52z?0`0<1:278o84>cg9~w6e52909w0=k4;41?85d;3;hj6s|3c194?1|5:n96874=2f3>0?<5:in6874=2a`>0?<5:ij6874=2a;>0?<5:h?6<mi;|q0`6<72;q6?i<5639>7a5=9jl0q~=k1;296~;4l90=>63<d082gc=z{:im6=4={<1`a?05349hj7?lf:p7fb=838p1>ml:70896ec28im7p}<cc83>7}:;jk1:?523b`95f`<uz9h57>52z?0g=<1:278o44>cg9~w7g62903w0<84;41?84ej3;o;63=a98255=::hk1=<>4=3ca>475348jh7?>3:?1ec<69=16>l=51028yv41j3:1?v3=7582`2=::jo1==h4=3g2>46a3ty9m:4?:2y>625=>;16>l651bd897d628;?7p}=6`83>6}::>91=i94=3a`>477348oj7?>0:p6d?=838p1?9=:70897gf28im7p}=6883>6}::>81=i94=3a`>46a348oj7??f:p6de=839p1?9>:70897ge28im70<n5;320>{t:?21<7=t=352>4b0348hm7?>0:?1`a<6991v?oj:18184083<970<nd;3`b>{t:?=1<7=t=353>4b0348hm7??f:?1`a<68o1v?l?:181841n3<970<nf;3`b>{t:?<1<7=t=34e>4b0348h47?>0:?1`g<6991v?l=:181841m3<970<m1;3`b>{t:??1<7=t=34f>4b0348h47??f:?1`g<68o1v?o;:181841l3<970<n2;3`b>{t:?>1<7=t=34g>4b0348h:7?>0:?1`<<6991v?o9:181841k3<970<n5;3`b>{t:?91<7=t=34`>4b0348h:7??f:?1`<<68o1v?:7:18;846j3<970<92;3g3>;5<h0:==5225a9546<5;>o6<?=;<07b?76;2799<4>159>600=98:0q~<>2;290~;59k0:h:5238:955`<5:ki6<??;<101?7682wx>9750;1x977f2?801?:n:0ae?842;3;:86s|20394?2|5;;j6<j8;<1:2?77n278m44>139>762=98:0q~<;b;296~;5900=>63=4b82gc=z{;;;6=4;{<02=?7c?2785;4>109>7d?=98;01>=<:033?xu5<l0;6>u220:927=::=n1=nh4=37;>4733ty9<k4?:5y>64>=9m=01>7;:02e?85f?3;:>63<338255=z{;?;6=4={<023?05348?j7?lf:p65c=83>p1??8:0f4?85><3;:=63<a68254=:;:;1=<>4}r066?6=:r79=;492:?114<6ko1v?>k:187846>3;o;63<93824c=:;h?1=<<4=213>4773ty9994?:3y>643=>;16>8=51bd8yv47k3:18v3=1482`2=:;081=<?4=2c6>4763499j7?>0:p601=838p1??;:708973228im7p}=0c83>1}::8>1=i94=2;3>46a349j?7?>2:?06`<6991v?;6:181846;3<970<:8;3`b>{t:9k1<7:t=330>4b03492<7?>1:?0e6<69816??j51028yv4?n3:1>v3=bc856>;5110:h:5rs3:f>5<5s48im78=;<0:3?7c?2wx>l>50;5x97df28n<70<n8;33b>;5ih0:<k522``9547<5;ko6<?=;<0bb?76;279m>4>109~w7>c2909w0<m9;41?84>>3;o;6s|28d94?1|5;h26<j8;<0be?769279mo4>119>6db=98;01?oi:031?84e93;:>63=a38256=z{;2h6=4={<0a<?05348297?k7:p6<c=83<p1?l7:0f4?84fj3;;j63=ae8255=::hl1=<?4=3`2>474348j?7??f:p6=d=838p1?l8:70897?328n<7p}=9e83>3}::k=1=i94=3cg>46a348jj7?>0:?1e0<69816>o?5102897g528;:7p}=8`83>7}::k<1:?5228195a1<uz82o7>55z?1f3<6l>16>lh511d897g228;970<m1;325>;5i;0:=?5rs3::>5<5s48i978=;<0:6?7c?2wx>4l50;6x97d228n<70<n5;33b>;5j80:<k522`0955`<uz8347>52z?1f1<1:2795<4>d69~w7?f2908w0<m4;3g3>;5i<0:==522`09546<uz83;7>52z?1f6<1:2795=4>d69~w7?>2909w0<m3;3g3>;5i<0:=>5rs315>5<5s48=>78=;<00b?7c?2wx>>;50;0x97062?801?=j:0f4?xu5<>0;6:u227395a1<5;>j6<>i;<07g?77n2798i4>109>61`=98801?;>:030?842>3;:=6s|22694?4|5;<;6;<4=31g>4b03ty98;4?:6y>636=9m=01?:l:032?843l3;:<63=4g8254=::<;1=<<4=370>475348>97?>3:p665=838p1?;i:708975d28n<7p}=4483>3}::<l1=i94=36g>46a348?j7?>0:?114<69816>8=51018973128:m7p}=3383>7}::<o1:?5222`95a1<uz8?87>56z?11`<6l>16>9h511d8973628;;70<:8;325>;5=:0:==522479547<uz88=7>52z?11a<1:279?l4>d69~w724290>w0<:d;3g3>;5=80:<k5224:9544<5;?86<?>;<061?76:2wx>>>50;0x973d2?801?=6:0f4?xu5<;0;69u224a95a1<5;?36<>i;<067?77n279984>0g9~w74a2909w0<:b;41?84403;o;6s|25394?5|5;?i6<j8;<06<?768279984>119~w74b2909w0<:a;41?844?3;o;6s|25294?4|5;?j6<j8;<06<?76;2wx>:j50;0x97??2?801?69:0f4?xu5?j0;6?u2285927=::1?1=i94}r04f?6=:r795;492:?1<1<6l>1v?9n:18184>=3<970<73;3g3>{t:>31<7<t=3;7>34<5;296<j8;|q13=<72;q6>4=5639>6=7=9m=0q~<87;296~;51;0=>63=8182`2=z{;==6=4={<0:5?05348<j7?k7:p623=838p1?7?:708971b28n<7p}=2583>7}:::l1:?5223f95a1<uz89?7>52z?17`<1:279>n4>d69~w7452909w0<<d;41?845j3;o;6s|23394?4|5;9h6;<4=30b>4b03ty9>=4?:3y>66d=>;16>?751e58yv46n3:1>v3=3`856>;5:10:h:5rs33f>5<5s488578=;<013?7c?2wx><j50;0x975?2?801?<9:0f4?xu59j0;6?u2225927=::;?1=i94}r035?6=:r79>n492:?2b4<6ko1v?>?:181845j3<970?i0;3`b>{t9ol1<7<t=30b>34<58om6<mi;|q2b`<72;q6>?75639>5`c=9jl0q~?id;296~;5:10=>63>ee82gc=z{8lh6=4={<013?0534;no7?lf:p5cd=838p1?<9:70894ce28im7p}>f`83>7}::;?1:?521dc95f`<uz8;57>52z?1<0<1:27:j44>cg9~w76?2909w0<74;41?87a03;hj6s|21594?4|5;286;<4=0d4>4ea3ty9<;4?:3y>6=4=>;16=k851bd8yv47=3:1>v3=80856>;6n<0:ok5rs327>5<5s483<78=;<3e0?7dn2wx>==50;0x971a2?801<h<:0ae?xu58;0;6?u226g927=:9o81=nh4}r63a?6=:r7?<k4>cg9>05b=9980q~<ie;290~;5nj0:ok523149542<5::?6<?<;<133?76<2wx?oh50;6x96db28im70=l5;320>;4k:0:=>523b49542<uz;2o7>52z?04=<6ko16?=951018yv7e93:1>v3<c682gc=:;j<1=<=4}r3;6?6=:r799;4>cg9>603=98>0q~?67;296~;5i:0:ok522`09542<uz>947>52z?76=<6ko168?;5639~w6>32909w0=73;41?85?<3;hj6s|3b294?4|5:i:6<mi;<1g7?7692wv8;>:181[32927>:7;:1:&76g<6j>1v8;7:181[32027>:7;:8:&76g<6j11v8:;:181[33<27>:7;;4:&76g<6k;1v97j:181[20m27>:7:8e:&76g<6?>1v97l:181[20l27>:7:8d:&76g<60;1v97n:181[20j27>:7:8b:&76g<60m1v976:181[20i27>:7:8a:&76g<61=1v977:181[20127>:7:89:&76g<61?1v978:181[20027>:7:88:&76g<61>1v979:181[20?27>:7:87:&76g<6101v97::181[20>27>:7:86:&76g<61h1v97;:181[20=27>:7:85:&76g<61k1v97<:181[20<27>:7:84:&76g<61m1v97=:181[20;27>:7:83:&76g<61l1v97>:181[20:27>:7:82:&76g<61o1v96i:181[20827>:7:80:&76g<6i91v96j:181[21n27>:7:9f:&76g<6i81v96k:181[21m27>:7:9e:&76g<6i;1v96l:181[21l27>:7:9d:&76g<6i:1v96m:181[21k27>:7:9c:&76g<6i=1v96n:181[21j27>:7:9b:&76g<6i<1v966:181[21i27>:7:9a:&76g<6i?1v967:181[21127>:7:99:&76g<6i>1v968:181[21027>:7:98:&76g<6i11v969:181[21?27>:7:97:&76g<6i01v9o::181[2?<27>:7:74:&76g<6ih1v9o;:181[2?;27>:7:73:&76g<6ik1v9o<:181[2?:27>:7:72:&76g<6ij1v9o=:181[2?927>:7:71:&76g<6im1v9o>:181[2?827>:7:70:&76g<6il1v9o?:181[20n27>:7:8f:&76g<6io1v97i:181[20k27>:7:8c:&76g<6j91v97m:181[20927>:7:81:&76g<6j;1v97?:181[21>27>:7:96:&76g<6j:1v96::181[21=27>:7:95:&76g<6j=1v88<:181[31;27>:7;93:&76g<6j<1v8:i:181[33n27>:7;;f:&76g<6j?1v8=?:181[35>27>:7;=6:&76g<6j01v8<j:181[35=27>:7;=5:&76g<6jh1v8<k:181[35<27>:7;=4:&76g<6jk1v8<l:181[35;27>:7;=3:&76g<6jj1v8<m:181[35:27>:7;=2:&76g<6jm1v8<n:181[35927>:7;=1:&76g<6jl1v8<6:181[35827>:7;=0:&76g<6jo1v8<7:181[36n27>:7;>f:&76g<6k91v8<8:181[36m27>:7;>e:&76g<6k81v8:<:181[34127>:7;<9:&76g<6k:1v8:>:181[34027>:7;<8:&76g<6k=1v8:?:181[34?27>:7;<7:&76g<6k<1v8=i:181[34>27>:7;<6:&76g<6k?1v8=j:181[34=27>:7;<5:&76g<6k>1v8=k:181[34<27>:7;<4:&76g<6k11v8=l:181[34;27>:7;<3:&76g<6k01v8=m:181[34:27>:7;<2:&76g<6kh1v8=n:181[34927>:7;<1:&76g<6kk1v9ji:181[2en27>:7:mf:&76g<6>o1v9jk:181[2em27>:7:me:&76g<6?91v9jm:181[2ek27>:7:mc:&76g<6?81v9jn:181[2ej27>:7:mb:&76g<6?;1v9j6:181[2ei27>:7:ma:&76g<6?:1v9j7:181[2e127>:7:m9:&76g<6?=1v9j8:181[2e027>:7:m8:&76g<6?<1v9j9:181[2e?27>:7:m7:&76g<6??1v9j::181[2e>27>:7:m6:&76g<6?11v9j;:181[2e=27>:7:m5:&76g<6?01v9j<:181[2e<27>:7:m4:&76g<6?h1v9j=:181[2e;27>:7:m3:&76g<6?k1v9j?:181[2e927>:7:m1:&76g<6?j1v9mi:181[2e827>:7:m0:&76g<6?m1v9mj:181[2fn27>:7:nf:&76g<6?l1v9mk:181[2fm27>:7:ne:&76g<6?o1v9ml:181[2fl27>:7:nd:&76g<6091v9mm:181[2fk27>:7:nc:&76g<6081v9mn:181[2fj27>:7:nb:&76g<60:1v9m6:181[2fi27>:7:na:&76g<60=1v9m7:181[2f127>:7:n9:&76g<60<1v9m8:181[2f027>:7:n8:&76g<60?1v9k9:181[2d=27>:7:l5:&76g<60>1v9k::181[2d<27>:7:l4:&76g<6011v9k;:181[2d;27>:7:l3:&76g<6001v9k<:181[2d:27>:7:l2:&76g<60h1v9k=:181[2d927>:7:l1:&76g<60k1v9k>:181[2d827>:7:l0:&76g<60j1v9k?:181[2el27>:7:md:&76g<60l1v9jl:181[2e:27>:7:m2:&76g<60o1v9j>:181[2f?27>:7:n7:&76g<6191v9m9:181[2f>27>:7:n6:&76g<6181v9kj:181[2bm27>:7:je:&76g<61;1v9k7:181[2b027>:7:j8:&76g<61:1v8;9:181[32>27>:7;:6:&76g<61<1v8?<:181[36;27>:7;>3:&76g<6111vqco>7;296~N3:j1vbl?7:181M25k2wem<750;0xL14d3tdj=l4?:3yK07e<ugk:n7>52zJ76f=zfh;h6=4={I61g>{ii8n1<7<tH50`?xhf9l0;6?uG43a8ykg6n3:1>vF;2b9~jd472909wE:=c:me77=838pD9<l;|lb67<72;qC8?m4}oc17?6=:rB?>n5rn`07>5<5sA>9o6saa3794?4|@=8h7p`n2783>7}O<;i0qco=7;296~N3:j1vbl<7:181M25k2wem?750;0xL14d3tdj>l4?:3yK07e<ugk9n7>52zJ76f=zfh8h6=4={I61g>{ii;n1<7<tH50`?xhf:l0;6?uG43a8ykg5n3:1>vF;2b9~jd572909wE:=c:me67=838pD9<l;|lb77<72;qC8?m4}oc07?6=:rB?>n5rn`17>5<5sA>9o6saa2794?4|@=8h7p`n3783>7}O<;i0qco<7;296~N3:j1vbl=7:181M25k2wem>750;0xL14d3tdj?l4?:3yK07e<ugk8n7>52zJ76f=zfh9h6=4={I61g>{ii:n1<7<tH50`?xhf;l0;6?uG43a8ykg4n3:1>vF;2b9~jd272909wE:=c:me17=838pD9<l;|lb07<72;qC8?m4}oc77?6=:rB?>n5rn`67>5<5sA>9o6saa5794?4|@=8h7p`n4783>7}O<;i0qco;7;296~N3:j1vbl:7:181M25k2wem9750;0xL14d3tdj8l4?:3yK07e<ugk?n7>52zJ76f=zfh>h6=4={I61g>{ii=n1<7<tH50`?xhf<l0;6?uG43a8ykg3n3:1>vF;2b9~jd372909wE:=c:me07=838pD9<l;|lb17<72;qC8?m4}oc67?6=:rB?>n5rn`77>5<5sA>9o6saa4794?4|@=8h7p`n5783>7}O<;i0qco:7;296~N3:j1vbl;7:181M25k2wem8750;0xL14d3tdj9l4?:3yK07e<ugk>n7>52zJ76f=zfh?h6=4={I61g>{ii<n1<7<tH50`?xhf=l0;6?uG43a8ykg2n3:1>vF;2b9~jd072909wE:=c:me37=838pD9<l;|lb27<72;qC8?m4}oc57?6=:rB?>n5rn`47>5<5sA>9o6saa7794?4|@=8h7p`n6783>7}O<;i0qco97;296~N3:j1vbl87:181M25k2wem;750;0xL14d3tdj:l4?:3yK07e<ugk=n7>52zJ76f=zfh<h6=4={I61g>{ii?n1<7<tH50`?xhf>l0;6?uG43a8ykg1n3:1>vF;2b9~jd172909wE:=c:me27=838pD9<l;|l;f6<728qC8?m4}o:g<?6=9rB?>n5rn9f:>5<6sA>9o6sa8ec94?7|@=8h7p`7dc83>4}O<;i0qc6kc;295~N3:j1vb5jk:182M25k2we4ik50;3xL14d3td3hk4?:0yK07e<ug2n<7>51zJ76f=zf1o:6=4>{I61g>{i0l81<7?tH50`?xh?m:0;6<uG43a8yk>b<3:1=vF;2b9~j=c2290:wE:=c:m<`0=83;pD9<l;|l;a2<728qC8?m4}o:f<?6=9rB?>n5rn9g:>5<6sA>9o6sa8dc94?7|@=8h7p`7ec83>4}O<;i0qc6jc;295~N3:j1vb5kk:182M25k2we4hk50;3xL14d3td3ik4?:0yK07e<ug2m<7>51zJ76f=zf1l:6=4>{I61g>{i0o81<7?tH50`?xh?n:0;6<uG43a8yk>a<3:1=vF;2b9~j=`2290:wE:=c:m<c0=83;pD9<l;|l;b2<728qC8?m4}o:e<?6=9rB?>n5rn9d:>5<6sA>9o6sa8gc94?7|@=8h7p`7fc83>4}O<;i0qc6ic;295~N3:j1vb5hk:182M25k2we4kk50;3xL14d3td3jk4?:0yK07e<ug3;<7>51zJ76f=zf0::6=4>{I61g>{i1981<7?tH50`?xh>8:0;6<uG43a8yk?7<3:1=vF;2b9~j<62290:wE:=c:m=50=83;pD9<l;|l:42<728qC8?m4}o;3<?6=9rB?>n5rn82:>5<6sA>9o6sa91c94?7|@=8h7p`60c83>4}O<;i0qc7?c;295~N3:j1vb4>k:182M25k2we5=k50;3xL14d3td2<k4?:0yK07e<ug3:<7>51zJ76f=zf0;:6=4>{I61g>{i1881<7?tH50`?xh>9:0;6<uG43a8yk?6<3:1=vF;2b9~j<72290:wE:=c:m=40=83;pD9<l;|l:52<728qC8?m4}o;2<?6=9rB?>n5rn83:>5<6sA>9o6sa90c94?7|@=8h7p`61c83>4}O<;i0qc7>c;295~N3:j1vb4?k:182M25k2we5<k50;3xL14d3td2=k4?:0yK07e<ug39<7>51zJ76f=zf08:6=4>{I61g>{i1;81<7?tH50`?xh>::0;6<uG43a8yk?5<3:1=vF;2b9~j<42290:wE:=c:m=70=83;pD9<l;|l:62<728qC8?m4}o;1<?6=9rB?>n5rn80:>5<6sA>9o6sa93c94?7|@=8h7p`62c83>4}O<;i0qc7=c;295~N3:j1vb4<k:182M25k2we5?k50;3xL14d3td2>k4?:0yK07e<ug38<7>51zJ76f=zf09:6=4>{I61g>{i1:81<7?tH50`?xh>;:0;6<uG43a8yk?4<3:1=vF;2b9~j<52290:wE:=c:m=60=83;pD9<l;|l:72<728qC8?m4}o;0<?6=9rB?>n5rn81:>5<6sA>9o6sa92c94?7|@=8h7p`63c83>4}O<;i0qc7<c;295~N3:j1vb4=k:182M25k2we5>k50;3xL14d3td2?k4?:0yK07e<ug3?<7>51zJ76f=zf0>:6=4>{I61g>{i1=81<7?tH50`?xh><:0;6<uG43a8yk?3<3:1=vF;2b9~j<22290:wE:=c:m=10=83;pD9<l;|l:02<728qC8?m4}o;7<?6=9rB?>n5rn86:>5<6sA>9o6sa95c94?7|@=8h7p`64c83>4}O<;i0qc7;c;295~N3:j1vb4:k:182M25k2we59k50;3xL14d3td28k4?:0yK07e<ug3><7>51zJ76f=zf0?:6=4>{I61g>{i1<81<7?tH50`?xh>=:0;6<uG43a8yk?2<3:1=vF;2b9~j<32290:wE:=c:m=00=83;pD9<l;|l:12<728qC8?m4}o;6<?6=9rB?>n5rn87:>5<6sA>9o6sa94c94?7|@=8h7p`65c83>4}O<;i0qc7:c;295~N3:j1vb4;k:182M25k2we58k50;3xL14d3td29k4?:0yK07e<ug3=<7>51zJ76f=zf0<:6=4>{I61g>{i1?81<7?tH50`?xh>>:0;6<uG43a8yk?1<3:1=vF;2b9~j<02290:wE:=c:m=30=83;pD9<l;|l:22<728qC8?m4}o;5<?6=9rB?>n5rn84:>5<6sA>9o6sa97c94?7|@=8h7p`66c83>4}O<;i0qc79c;295~N3:j1vb48k:182M25k2we5;k50;3xL14d3td2:k4?:0yK07e<ug3<<7>51zJ76f=zf0=:6=4>{I61g>{i1>81<7?tH50`?xh>?:0;6<uG43a8yk?0<3:1=vF;2b9~j<12290:wE:=c:m=20=83;pD9<l;|l:32<728qC8?m4}o;4<?6=9rB?>n5rn85:>5<6sA>9o6sa96c94?7|@=8h7p`67c83>4}O<;i0qc78c;295~N3:j1vb49k:182M25k2we5:k50;3xL14d3td2;k4?:0yK07e<ug33<7>51zJ76f=zf02:6=4>{I61g>{i1181<7?tH50`?xh>0:0;6<uG43a8yk??<3:1=vF;2b9~j<>2290:wE:=c:m==0=83;pD9<l;|l:<2<728qC8?m4}o;;<?6=9rB?>n5rn8::>5<6sA>9o6sa99c94?7|@=8h7p`68c83>4}O<;i0qc77c;295~N3:j1vb46k:182M25k2we55k50;3xL14d3td24k4?:0yK07e<ug32<7>51zJ76f=zf03:6=4>{I61g>{i1081<7?tH50`?xh>1:0;6<uG43a8yk?><3:1=vF;2b9~j<?2290:wE:=c:m=<0=83;pD9<l;|l:=2<728qC8?m4}o;:<?6=9rB?>n5rn8;:>5<6sA>9o6sa98c94?7|@=8h7p`69c83>4}O<;i0qc76c;295~N3:j1vb47k:182M25k2we54k50;3xL14d3td25k4?:0yK07e<ug3j<7>51zJ76f=zf0k:6=4>{I61g>{i1h81<7?tH50`?xh>i:0;6<uG43a8yk?f<3:1=vF;2b9~j<g2290:wE:=c:m=d0=83;pD9<l;|l:e2<728qC8?m4}o;b<?6=9rB?>n5rn8c:>5<6sA>9o6sa9`c94?7|@=8h7p`6ac83>4}O<;i0qc7nc;295~N3:j1vb4ok:182M25k2we5lk50;3xL14d3td2mk4?:0yK07e<ug3i<7>51zJ76f=zf0h:6=4>{I61g>{i1k81<7?tH50`?xh>j:0;6<uG43a8yk?e<3:1=vF;2b9~j<d2290:wE:=c:m=g0=83;pD9<l;|l:f2<728qC8?m4}o;a<?6=9rB?>n5rn8`:>5<6sA>9o6sa9cc94?7|@=8h7p`6bc83>4}O<;i0qc7mc;295~N3:j1vb4lk:182M25k2we5ok50;3xL14d3td2nk4?:0yK07e<ug3h<7>51zJ76f=zf0i:6=4>{I61g>{i1j81<7?tH50`?xh>k:0;6<uG43a8yk?d<3:1=vF;2b9~j<e2290:wE:=c:m=f0=83;pD9<l;|l:g2<728qC8?m4}o;`<?6=9rB?>n5rn8a:>5<6sA>9o6sa9bc94?7|@=8h7p`6cc83>4}O<;i0qc7lc;295~N3:j1vb4mk:182M25k2we5nk50;3xL14d3td2ok4?:0yK07e<ug3o<7>51zJ76f=zf0n:6=4>{I61g>{i1m81<7?tH50`?xh>l:0;6<uG43a8yk?c<3:1=vF;2b9~j<b2290:wE:=c:m=a0=83;pD9<l;|l:`2<728qC8?m4}o;g<?6=9rB?>n5rn8f:>5<6sA>9o6sa9ec94?7|@=8h7p`6dc83>4}O<;i0qc7kc;295~N3:j1vb4jk:182M25k2we5ik50;3xL14d3td2hk4?:0yK07e<ug3n<7>51zJ76f=zf0o:6=4>{I61g>{i1l81<7?tH50`?xh>m:0;6<uG43a8yk?b<3:1=vF;2b9~j<c2290:wE:=c:m=`0=83;pD9<l;|l:a2<728qC8?m4}o;f<?6=9rB?>n5rn8g:>5<6sA>9o6sa9dc94?7|@=8h7p`6ec83>4}O<;i0qc7jc;295~N3:j1vb4kk:182M25k2we5hk50;3xL14d3td2ik4?:0yK07e<ug3m<7>51zJ76f=zf0l:6=4>{I61g>{i1o81<7?tH50`?xh>n:0;6<uG43a8yk?a<3:1=vF;2b9~j<`2290:wE:=c:m=c0=83;pD9<l;|l:b2<728qC8?m4}o;e<?6=9rB?>n5rn8d:>5<6sA>9o6sa9gc94?7|@=8h7p`6fc83>4}O<;i0qc7ic;295~N3:j1vb4hk:182M25k2we5kk50;3xL14d3td2jk4?:0yK07e<ugk;<7>51zJ76f=zfh::6=4>{I61g>{ii981<7?tH50`?xhf8:0;6<uG43a8ykg7<3:1=vF;2b9~jd62290:wE:=c:me50=83;pD9<l;|lb42<728qC8?m4}oc3<?6=9rB?>n5rn`2:>5<6sA>9o6saa1c94?7|@=8h7p`n0c83>4}O<;i0qco?c;295~N3:j1vbl>k:182M25k2wem=k50;3xL14d3tdj<k4?:0yK07e<ugk:<7>51zJ76f=zfh;:6=4>{I61g>{ii881<7?tH50`?xhf9:0;6<uG43a8ykg6<3:1=vF;2b9~jd72290:wE:=c:me40=83;pD9<l;|~yEFDsj:o6nl;bg::7xFGJr:vLM^t}AB
\ No newline at end of file
--------------------------------------------------------------------------------
-- This file is owned and controlled by Xilinx and must be used --
-- solely for design, simulation, implementation and creation of --
-- design files limited to Xilinx devices or technologies. Use --
-- with non-Xilinx devices or technologies is expressly prohibited --
-- and immediately terminates your license. --
-- --
-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" --
-- SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR --
-- XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION --
-- AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION --
-- OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS --
-- IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, --
-- AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE --
-- FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY --
-- WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE --
-- IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR --
-- REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF --
-- INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS --
-- FOR A PARTICULAR PURPOSE. --
-- --
-- Xilinx products are not intended for use in life support --
-- appliances, devices, or systems. Use in such applications are --
-- expressly prohibited. --
-- --
-- (c) Copyright 1995-2009 Xilinx, Inc. --
-- All rights reserved. --
--------------------------------------------------------------------------------
-- You must compile the wrapper file fifo_32x512.vhd when simulating
-- the core, fifo_32x512. When compiling the wrapper file, be sure to
-- reference the XilinxCoreLib VHDL simulation library. For detailed
-- instructions, please refer to the "CORE Generator Help".
-- The synthesis directives "translate_off/translate_on" specified
-- below are supported by Xilinx, Mentor Graphics and Synplicity
-- synthesis tools. Ensure they are correct for your synthesis tool(s).
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
Library XilinxCoreLib;
-- synthesis translate_on
ENTITY fifo_32x512 IS
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(31 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(31 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
END fifo_32x512;
ARCHITECTURE fifo_32x512_a OF fifo_32x512 IS
-- synthesis translate_off
component wrapped_fifo_32x512
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(31 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(31 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
end component;
-- Configuration specification
for all : wrapped_fifo_32x512 use entity XilinxCoreLib.fifo_generator_v6_2(behavioral)
generic map(
c_has_int_clk => 0,
c_wr_response_latency => 1,
c_rd_freq => 1,
c_has_srst => 0,
c_enable_rst_sync => 1,
c_has_rd_data_count => 0,
c_din_width => 32,
c_has_wr_data_count => 0,
c_full_flags_rst_val => 1,
c_implementation_type => 2,
c_family => "spartan6",
c_use_embedded_reg => 0,
c_has_wr_rst => 0,
c_wr_freq => 1,
c_use_dout_rst => 1,
c_underflow_low => 0,
c_has_meminit_file => 0,
c_has_overflow => 0,
c_preload_latency => 1,
c_dout_width => 32,
c_msgon_val => 1,
c_rd_depth => 512,
c_default_value => "BlankString",
c_mif_file_name => "BlankString",
c_error_injection_type => 0,
c_has_underflow => 0,
c_has_rd_rst => 0,
c_has_almost_full => 0,
c_has_rst => 1,
c_data_count_width => 9,
c_has_wr_ack => 0,
c_use_ecc => 0,
c_wr_ack_low => 0,
c_common_clock => 0,
c_rd_pntr_width => 9,
c_use_fwft_data_count => 0,
c_has_almost_empty => 0,
c_rd_data_count_width => 9,
c_enable_rlocs => 0,
c_wr_pntr_width => 9,
c_overflow_low => 0,
c_prog_empty_type => 0,
c_optimization_mode => 0,
c_wr_data_count_width => 9,
c_preload_regs => 0,
c_dout_rst_val => "0",
c_has_data_count => 0,
c_prog_full_thresh_negate_val => 508,
c_wr_depth => 512,
c_prog_empty_thresh_negate_val => 3,
c_prog_empty_thresh_assert_val => 2,
c_has_valid => 1,
c_init_wr_pntr_val => 0,
c_prog_full_thresh_assert_val => 509,
c_use_fifo16_flags => 0,
c_has_backup => 0,
c_valid_low => 0,
c_prim_fifo_type => "512x36",
c_count_type => 0,
c_prog_full_type => 4,
c_memory_type => 1);
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_fifo_32x512
port map (
rst => rst,
wr_clk => wr_clk,
rd_clk => rd_clk,
din => din,
wr_en => wr_en,
rd_en => rd_en,
prog_full_thresh_assert => prog_full_thresh_assert,
prog_full_thresh_negate => prog_full_thresh_negate,
dout => dout,
full => full,
empty => empty,
valid => valid,
prog_full => prog_full);
-- synthesis translate_on
END fifo_32x512_a;
--------------------------------------------------------------------------------
-- This file is owned and controlled by Xilinx and must be used --
-- solely for design, simulation, implementation and creation of --
-- design files limited to Xilinx devices or technologies. Use --
-- with non-Xilinx devices or technologies is expressly prohibited --
-- and immediately terminates your license. --
-- --
-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" --
-- SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR --
-- XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION --
-- AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION --
-- OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS --
-- IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, --
-- AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE --
-- FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY --
-- WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE --
-- IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR --
-- REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF --
-- INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS --
-- FOR A PARTICULAR PURPOSE. --
-- --
-- Xilinx products are not intended for use in life support --
-- appliances, devices, or systems. Use in such applications are --
-- expressly prohibited. --
-- --
-- (c) Copyright 1995-2009 Xilinx, Inc. --
-- All rights reserved. --
--------------------------------------------------------------------------------
-- The following code must appear in the VHDL architecture header:
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
component fifo_32x512
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(31 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(31 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
end component;
-- Synplicity black box declaration
attribute syn_black_box : boolean;
attribute syn_black_box of fifo_32x512: component is true;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : fifo_32x512
port map (
rst => rst,
wr_clk => wr_clk,
rd_clk => rd_clk,
din => din,
wr_en => wr_en,
rd_en => rd_en,
prog_full_thresh_assert => prog_full_thresh_assert,
prog_full_thresh_negate => prog_full_thresh_negate,
dout => dout,
full => full,
empty => empty,
valid => valid,
prog_full => prog_full);
-- INST_TAG_END ------ End INSTANTIATION Template ------------
-- You must compile the wrapper file fifo_32x512.vhd when simulating
-- the core, fifo_32x512. When compiling the wrapper file, be sure to
-- reference the XilinxCoreLib VHDL simulation library. For detailed
-- instructions, please refer to the "CORE Generator Help".
##############################################################
#
# Xilinx Core Generator version 12.2
# Date: Thu Feb 3 16:40:52 2011
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = false
SET asysymbol = true
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = false
SET designentry = VHDL
SET device = xc6slx45t
SET devicefamily = spartan6
SET flowvendor = Foundation_ISE
SET formalverification = false
SET foundationsym = false
SET implementationfiletype = Ngc
SET package = fgg484
SET removerpms = false
SET simulationfiles = Behavioral
SET speedgrade = -3
SET verilogsim = true
SET vhdlsim = true
# END Project Options
# BEGIN Select
SELECT Fifo_Generator family Xilinx,_Inc. 6.2
# END Select
# BEGIN Parameters
CSET almost_empty_flag=false
CSET almost_full_flag=false
CSET component_name=fifo_32x512
CSET data_count=false
CSET data_count_width=9
CSET disable_timing_violations=false
CSET dout_reset_value=0
CSET empty_threshold_assert_value=2
CSET empty_threshold_negate_value=3
CSET enable_ecc=false
CSET enable_int_clk=false
CSET enable_reset_synchronization=true
CSET fifo_implementation=Independent_Clocks_Block_RAM
CSET full_flags_reset_value=1
CSET full_threshold_assert_value=509
CSET full_threshold_negate_value=508
CSET inject_dbit_error=false
CSET inject_sbit_error=false
CSET input_data_width=32
CSET input_depth=512
CSET output_data_width=32
CSET output_depth=512
CSET overflow_flag=false
CSET overflow_sense=Active_High
CSET performance_options=Standard_FIFO
CSET programmable_empty_type=No_Programmable_Empty_Threshold
CSET programmable_full_type=Multiple_Programmable_Full_Threshold_Input_Ports
CSET read_clock_frequency=1
CSET read_data_count=false
CSET read_data_count_width=9
CSET reset_pin=true
CSET reset_type=Asynchronous_Reset
CSET underflow_flag=false
CSET underflow_sense=Active_High
CSET use_dout_reset=true
CSET use_embedded_registers=false
CSET use_extra_logic=false
CSET valid_flag=true
CSET valid_sense=Active_High
CSET write_acknowledge_flag=false
CSET write_acknowledge_sense=Active_High
CSET write_clock_frequency=1
CSET write_data_count=false
CSET write_data_count_width=9
# END Parameters
GENERATE
# CRC: adce0ad2
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
<header>
<!-- ISE source project file created by Project Navigator. -->
<!-- -->
<!-- This file contains project source information including a list of -->
<!-- project source files, project and process properties. This file, -->
<!-- along with the project source files, is sufficient to open and -->
<!-- implement in ISE Project Navigator. -->
<!-- -->
<!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
</header>
<version xil_pn:ise_version="12.2" xil_pn:schema_version="2"/>
<files>
<file xil_pn:name="fifo_32x512.ngc" xil_pn:type="FILE_NGC">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
</file>
<file xil_pn:name="fifo_32x512.v" xil_pn:type="FILE_VERILOG">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
<association xil_pn:name="PostMapSimulation"/>
<association xil_pn:name="PostRouteSimulation"/>
<association xil_pn:name="PostTranslateSimulation"/>
</file>
<file xil_pn:name="fifo_32x512.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
<association xil_pn:name="PostMapSimulation"/>
<association xil_pn:name="PostRouteSimulation"/>
<association xil_pn:name="PostTranslateSimulation"/>
</file>
</files>
<properties>
<property xil_pn:name="AES Initial Vector spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="AES Key (Hex String) spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Add I/O Buffers" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Logic Optimization Across Hierarchy" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow SelectMAP Pins to Persist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unexpanded Blocks" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unmatched LOC Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unmatched Timing Group Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Asynchronous To Synchronous" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Auto Implementation Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
<property xil_pn:name="Automatic BRAM Packing" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Automatically Insert glbl Module in the Netlist" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Automatically Run Generate Target PROM/ACE File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Autosignature Generation" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="BRAM Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Bring Out Global Set/Reset Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Bring Out Global Tristate Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Bus Delimiter" xil_pn:value="&lt;>" xil_pn:valueState="default"/>
<property xil_pn:name="Case" xil_pn:value="Maintain" xil_pn:valueState="default"/>
<property xil_pn:name="Case Implementation Style" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Change Device Speed To" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Change Device Speed To Post Trace" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Clock Enable" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Collapsing Input Limit (4-40)" xil_pn:value="32" xil_pn:valueState="default"/>
<property xil_pn:name="Collapsing Pterm Limit (3-56)" xil_pn:value="28" xil_pn:valueState="default"/>
<property xil_pn:name="Combinatorial Logic Optimization" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Compile CPLD Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile EDK Simulation Library" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Compile SIMPRIM (Timing) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile UNISIM (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile XilinxCoreLib (CORE Generator) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile for HDL Debugging" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile uni9000 (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Pin Done" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Pin Program" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Rate spartan6" xil_pn:value="2" xil_pn:valueState="default"/>
<property xil_pn:name="Correlate Output to Input Design" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create ASCII Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Binary Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Bit File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Create I/O Pads from Ports" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create IEEE 1532 Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create IEEE 1532 Configuration File spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Logic Allocation File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Mask File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create ReadBack Data Files" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Cross Clock Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="DSP Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Default Powerup Value of Registers" xil_pn:value="Low" xil_pn:valueState="default"/>
<property xil_pn:name="Delay Values To Be Read from SDF" xil_pn:value="Setup Time" xil_pn:valueState="default"/>
<property xil_pn:name="Device" xil_pn:value="xc6slx45t" xil_pn:valueState="non-default"/>
<property xil_pn:name="Device Family" xil_pn:value="Spartan6" xil_pn:valueState="non-default"/>
<property xil_pn:name="Device Speed Grade/Select ABS Minimum" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Do Not Escape Signal and Instance Names in Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Done (Output Events)" xil_pn:value="Default (4)" xil_pn:valueState="default"/>
<property xil_pn:name="Drive Awake Pin During Suspend/Wake Sequence spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Drive Done Pin High" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable BitStream Compression" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Cyclic Redundancy Checking (CRC) spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Debugging of Serial Mode BitStream" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable External Master Clock spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Internal Done Pipe" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Message Filtering" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Threading" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Threading par spartan6" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Outputs (Output Events)" xil_pn:value="Default (5)" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Suspend/Wake Global Set/Reset spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Encrypt Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Encrypt Key Select spartan6" xil_pn:value="BBRAM" xil_pn:valueState="default"/>
<property xil_pn:name="Equivalent Register Removal Map" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Equivalent Register Removal XST" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Exclude Compilation of Deprecated EDK Cores" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Exclude Compilation of EDK Sub-Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Exhaustive Fit Mode" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Extra Cost Tables Map" xil_pn:value="0" xil_pn:valueState="default"/>
<property xil_pn:name="Extra Effort (Highest PAR level only)" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="FPGA Start-Up Clock" xil_pn:value="CCLK" xil_pn:valueState="default"/>
<property xil_pn:name="FSM Encoding Algorithm" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="FSM Style" xil_pn:value="LUT" xil_pn:valueState="default"/>
<property xil_pn:name="Filter Files From Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Flatten Output Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Function Block Input Limit (4-40)" xil_pn:value="38" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language ArchWiz" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language Coregen" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language Schematic" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="GTS Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="4" xil_pn:valueState="default"/>
<property xil_pn:name="GWE Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="5" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Architecture Only (No Entity Declaration)" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Asynchronous Delay Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Clock Region Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Constraints Interaction Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Constraints Interaction Report Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Datasheet Section" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Datasheet Section Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Detailed MAP Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Detailed Package Parasitics" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Multiple Hierarchical Netlist Files" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Fit Power Data" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Fit Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Place &amp; Route Power Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Place &amp; Route Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate RTL Schematic" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Generate SAIF File for Power Optimization/Estimation Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Testbench File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Timegroups Section" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Timegroups Section Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generics, Parameters" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Global Optimization Goal" xil_pn:value="AllClockNets" xil_pn:valueState="default"/>
<property xil_pn:name="Global Optimization map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Global Set/Reset Port Name" xil_pn:value="GSR_PORT" xil_pn:valueState="default"/>
<property xil_pn:name="Global Tristate Port Name" xil_pn:value="GTS_PORT" xil_pn:valueState="default"/>
<property xil_pn:name="HDL Equations Style" xil_pn:value="Source" xil_pn:valueState="default"/>
<property xil_pn:name="Hierarchy Separator" xil_pn:value="/" xil_pn:valueState="default"/>
<property xil_pn:name="I/O Voltage Standard" xil_pn:value="LVCMOS18" xil_pn:valueState="default"/>
<property xil_pn:name="ISim UUT Instance Name" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Ignore User Timing Constraints Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Ignore User Timing Constraints Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Implementation Stop View" xil_pn:value="Structural" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Template" xil_pn:value="Optimize Density" xil_pn:valueState="default"/>
<property xil_pn:name="Implementation Top" xil_pn:value="Architecture|fifo_32x512|fifo_32x512_a" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Top File" xil_pn:value="fifo_32x512.vhd" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_32x512" xil_pn:valueState="non-default"/>
<property xil_pn:name="Include 'uselib Directive in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include SIMPRIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include UNISIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include sdf_annotate task in Verilog File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Incremental Compilation" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Input and tristate I/O Termination Mode" xil_pn:value="Keeper" xil_pn:valueState="default"/>
<property xil_pn:name="Insert Buffers to Prevent Pulse Swallowing" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Instantiation Template Target Language Xps" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TCK" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TDI" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TDO" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TMS" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Keep Hierarchy" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Keep Hierarchy CPLD" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="LUT Combining Map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="LUT Combining Xst" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Language" xil_pn:value="VHDL" xil_pn:valueState="default"/>
<property xil_pn:name="Logic Optimization" xil_pn:value="Density" xil_pn:valueState="default"/>
<property xil_pn:name="Macro Preserve" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Manual Implementation Compile Order" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Map Slice Logic into Unused Block RAMs" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Mask Pins for Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="0x00" xil_pn:valueState="default"/>
<property xil_pn:name="Max Fanout" xil_pn:value="100000" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Compression" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Number of Lines in Report" xil_pn:value="1000" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Signal Name Length" xil_pn:value="20" xil_pn:valueState="default"/>
<property xil_pn:name="Move First Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Move Last Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Next Configuration Mode spartan6" xil_pn:value="001" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Starting Address for Golden Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Starting Address for Next Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Use New Mode for Next Configuration spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: User-Defined Register for Failsafe Scheme spartan6" xil_pn:value="0x0000" xil_pn:valueState="default"/>
<property xil_pn:name="Mux Extraction" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Netlist Hierarchy" xil_pn:value="As Optimized" xil_pn:valueState="default"/>
<property xil_pn:name="Netlist Translation Type" xil_pn:value="Timestamp" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Clock Buffers" xil_pn:value="16" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Paths in Error/Verbose Report" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Paths in Error/Verbose Report Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Optimization Effort" xil_pn:value="Normal" xil_pn:valueState="default"/>
<property xil_pn:name="Optimization Goal" xil_pn:value="Speed" xil_pn:valueState="default"/>
<property xil_pn:name="Optimize Instantiated Primitives" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Other Bitgen Command Line Options spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other CPLD Fitter Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Fit" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Par" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compxlib Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Map Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other NETGEN Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Ngdbuild Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Place &amp; Route Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Programming Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Fit" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Timing Report Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other XPWR Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other XST Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Output Extended Identifiers" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Output File Name" xil_pn:value="fifo_32x512" xil_pn:valueState="default"/>
<property xil_pn:name="Output Slew Rate" xil_pn:value="Fast" xil_pn:valueState="default"/>
<property xil_pn:name="Overwrite Compiled Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Pack I/O Registers into IOBs" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Pack I/O Registers/Latches into IOBs" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Package" xil_pn:value="fgg484" xil_pn:valueState="default"/>
<property xil_pn:name="Perform Advanced Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Perform Advanced Analysis Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Place &amp; Route Effort Level (Overall)" xil_pn:value="High" xil_pn:valueState="default"/>
<property xil_pn:name="Place And Route Mode" xil_pn:value="Normal Place and Route" xil_pn:valueState="default"/>
<property xil_pn:name="Place MultiBoot Settings into Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Placer Effort Level Map" xil_pn:value="High" xil_pn:valueState="default"/>
<property xil_pn:name="Placer Extra Effort Map" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Port to be used" xil_pn:value="Auto - default" xil_pn:valueState="default"/>
<property xil_pn:name="Post Map Simulation Model Name" xil_pn:value="fifo_32x512_map.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Place &amp; Route Simulation Model Name" xil_pn:value="fifo_32x512_timesim.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Synthesis Simulation Model Name" xil_pn:value="fifo_32x512_synthesis.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Translate Simulation Model Name" xil_pn:value="fifo_32x512_translate.v" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Xst" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Preserve Unused Inputs" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Produce Advanced Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Produce Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
<property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
<property xil_pn:name="RAM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="RAM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="ROM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="ROM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Read Cores" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Reduce Control Sets" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Regenerate Core" xil_pn:value="Under Current Project Setting" xil_pn:valueState="default"/>
<property xil_pn:name="Register Balancing" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Register Duplication Map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Register Duplication Xst" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Release Write Enable (Output Events)" xil_pn:value="Default (6)" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Design Instance in Testbench File to" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Architecture To" xil_pn:value="Structure" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Entity to" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Module To" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Report Fastest Path(s) in Each Constraint" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Report Fastest Path(s) in Each Constraint Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Report Paths by Endpoint" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Report Paths by Endpoint Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Report Type" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
<property xil_pn:name="Report Type Post Trace" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
<property xil_pn:name="Report Unconstrained Paths" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Report Unconstrained Paths Post Trace" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Reset On Configuration Pulse Width" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Resource Sharing" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Retain Hierarchy" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Retiming Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Retry Configuration if CRC Error Occurs spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Run Design Rules Checker (DRC)" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Map" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Par" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Translate" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Safe Implementation" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Security" xil_pn:value="Enable Readback and Reconfiguration" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Source Node" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Set SPI Configuration Bus Width spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Setup External Master Clock Division spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Shift Register Minimum Size spartan6" xil_pn:value="2" xil_pn:valueState="default"/>
<property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Model Target" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time ISim" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Par" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Translate" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
<property xil_pn:name="Slice Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Specify 'define Macro Name and Value" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Behavioral" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Fit" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Map" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Route" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Translate" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Speed Grade" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Starting Placer Cost Table (1-100) Map" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
<property xil_pn:name="Target Simulator" xil_pn:value="Please Specify" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Mode Map" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Mode Par" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Report Format" xil_pn:value="Summary" xil_pn:valueState="default"/>
<property xil_pn:name="Top-Level Module Name in Output Netlist" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
<property xil_pn:name="Trim Unconnected Signals" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Tristate On Configuration Pulse Width" xil_pn:value="0" xil_pn:valueState="default"/>
<property xil_pn:name="Unused I/O Pad Termination Mode" xil_pn:value="Keeper" xil_pn:valueState="default"/>
<property xil_pn:name="Unused IOB Pins" xil_pn:value="Pull Down" xil_pn:valueState="default"/>
<property xil_pn:name="Use Clock Enable" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Fit" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Route" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Behav" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Fit" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use DSP Block spartan6" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Data Gate" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Direct Input for Input Registers" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Clocks" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Output Enables" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Set/Reset" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use LOC Constraints" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Location Constraints" xil_pn:value="Always" xil_pn:valueState="default"/>
<property xil_pn:name="Use Multi-level Logic Optimization" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use RLOC Constraints" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Use Smart Guide" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synchronous Reset" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synchronous Set" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synthesis Constraints File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Timing Constraints" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="UserID Code (8 Digit Hexadecimal)" xil_pn:value="0xFFFFFFFF" xil_pn:valueState="default"/>
<property xil_pn:name="VCCAUX Voltage Level spartan6" xil_pn:value="2.5V" xil_pn:valueState="default"/>
<property xil_pn:name="VHDL Source Analysis Standard" xil_pn:value="VHDL-93" xil_pn:valueState="default"/>
<property xil_pn:name="Value Range Check" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Verilog 2001 Xst" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Verilog Macros" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="WYSIWYG" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Wait for DCM and PLL Lock (Output Events) spartan6" xil_pn:value="Default (NoWait)" xil_pn:valueState="default"/>
<property xil_pn:name="Wakeup Clock spartan6" xil_pn:value="Startup Clock" xil_pn:valueState="default"/>
<property xil_pn:name="Watchdog Timer Value spartan6" xil_pn:value="0xFFFF" xil_pn:valueState="default"/>
<property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="default"/>
<property xil_pn:name="Write Timing Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="XOR Preserve" xil_pn:value="true" xil_pn:valueState="default"/>
<!-- -->
<!-- The following properties are for internal use only. These should not be modified.-->
<!-- -->
<property xil_pn:name="PROP_BehavioralSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_32x512" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan6" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_FPGAConfiguration" xil_pn:value="FPGAConfiguration" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostFitSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostMapSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostParSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostSynthSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostXlateSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2011-02-03T17:40:59" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="7848BC49ECBEC697042292BDA767D393" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
</properties>
<bindings/>
<libraries/>
<autoManagedFiles>
<!-- The following files are identified by `include statements in verilog -->
<!-- source files and are automatically managed by Project Navigator. -->
<!-- -->
<!-- Do not hand-edit this section, as it will be overwritten when the -->
<!-- project is analyzed based on files automatically identified as -->
<!-- include files. -->
</autoManagedFiles>
</project>
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
<!-- -->
<!-- For tool use only. Do not edit. -->
<!-- -->
<!-- ProjectNavigator created generated project file. -->
<!-- For use in tracking generated file and other information -->
<!-- allowing preservation of process status. -->
<!-- -->
<!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
<version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
<sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_64x512.xise"/>
<files xmlns="http://www.xilinx.com/XMLSchema">
<file xil_pn:fileType="FILE_ASY" xil_pn:name="fifo_64x512.asy" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_SYMBOL" xil_pn:name="fifo_64x512.sym" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_64x512.veo" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_VHO" xil_pn:name="fifo_64x512.vho" xil_pn:origination="imported"/>
<file xil_pn:fileType="FILE_USERDOC" xil_pn:name="fifo_generator_readme.txt" xil_pn:origination="imported"/>
</files>
<transforms xmlns="http://www.xilinx.com/XMLSchema"/>
</generated_project>
This source diff could not be displayed because it is too large. You can view the blob instead.
--------------------------------------------------------------------------------
-- This file is owned and controlled by Xilinx and must be used --
-- solely for design, simulation, implementation and creation of --
-- design files limited to Xilinx devices or technologies. Use --
-- with non-Xilinx devices or technologies is expressly prohibited --
-- and immediately terminates your license. --
-- --
-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" --
-- SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR --
-- XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION --
-- AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION --
-- OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS --
-- IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, --
-- AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE --
-- FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY --
-- WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE --
-- IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR --
-- REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF --
-- INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS --
-- FOR A PARTICULAR PURPOSE. --
-- --
-- Xilinx products are not intended for use in life support --
-- appliances, devices, or systems. Use in such applications are --
-- expressly prohibited. --
-- --
-- (c) Copyright 1995-2009 Xilinx, Inc. --
-- All rights reserved. --
--------------------------------------------------------------------------------
-- You must compile the wrapper file fifo_64x512.vhd when simulating
-- the core, fifo_64x512. When compiling the wrapper file, be sure to
-- reference the XilinxCoreLib VHDL simulation library. For detailed
-- instructions, please refer to the "CORE Generator Help".
-- The synthesis directives "translate_off/translate_on" specified
-- below are supported by Xilinx, Mentor Graphics and Synplicity
-- synthesis tools. Ensure they are correct for your synthesis tool(s).
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
Library XilinxCoreLib;
-- synthesis translate_on
ENTITY fifo_64x512 IS
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(63 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(63 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
END fifo_64x512;
ARCHITECTURE fifo_64x512_a OF fifo_64x512 IS
-- synthesis translate_off
component wrapped_fifo_64x512
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(63 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(63 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
end component;
-- Configuration specification
for all : wrapped_fifo_64x512 use entity XilinxCoreLib.fifo_generator_v6_2(behavioral)
generic map(
c_has_int_clk => 0,
c_wr_response_latency => 1,
c_rd_freq => 1,
c_has_srst => 0,
c_enable_rst_sync => 1,
c_has_rd_data_count => 0,
c_din_width => 64,
c_has_wr_data_count => 0,
c_full_flags_rst_val => 1,
c_implementation_type => 2,
c_family => "spartan6",
c_use_embedded_reg => 0,
c_has_wr_rst => 0,
c_wr_freq => 1,
c_use_dout_rst => 1,
c_underflow_low => 0,
c_has_meminit_file => 0,
c_has_overflow => 0,
c_preload_latency => 1,
c_dout_width => 64,
c_msgon_val => 1,
c_rd_depth => 512,
c_default_value => "BlankString",
c_mif_file_name => "BlankString",
c_error_injection_type => 0,
c_has_underflow => 0,
c_has_rd_rst => 0,
c_has_almost_full => 0,
c_has_rst => 1,
c_data_count_width => 9,
c_has_wr_ack => 0,
c_use_ecc => 0,
c_wr_ack_low => 0,
c_common_clock => 0,
c_rd_pntr_width => 9,
c_use_fwft_data_count => 0,
c_has_almost_empty => 0,
c_rd_data_count_width => 9,
c_enable_rlocs => 0,
c_wr_pntr_width => 9,
c_overflow_low => 0,
c_prog_empty_type => 0,
c_optimization_mode => 0,
c_wr_data_count_width => 9,
c_preload_regs => 0,
c_dout_rst_val => "0",
c_has_data_count => 0,
c_prog_full_thresh_negate_val => 508,
c_wr_depth => 512,
c_prog_empty_thresh_negate_val => 3,
c_prog_empty_thresh_assert_val => 2,
c_has_valid => 1,
c_init_wr_pntr_val => 0,
c_prog_full_thresh_assert_val => 509,
c_use_fifo16_flags => 0,
c_has_backup => 0,
c_valid_low => 0,
c_prim_fifo_type => "512x72",
c_count_type => 0,
c_prog_full_type => 4,
c_memory_type => 1);
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_fifo_64x512
port map (
rst => rst,
wr_clk => wr_clk,
rd_clk => rd_clk,
din => din,
wr_en => wr_en,
rd_en => rd_en,
prog_full_thresh_assert => prog_full_thresh_assert,
prog_full_thresh_negate => prog_full_thresh_negate,
dout => dout,
full => full,
empty => empty,
valid => valid,
prog_full => prog_full);
-- synthesis translate_on
END fifo_64x512_a;
--------------------------------------------------------------------------------
-- This file is owned and controlled by Xilinx and must be used --
-- solely for design, simulation, implementation and creation of --
-- design files limited to Xilinx devices or technologies. Use --
-- with non-Xilinx devices or technologies is expressly prohibited --
-- and immediately terminates your license. --
-- --
-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" --
-- SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR --
-- XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION --
-- AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION --
-- OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS --
-- IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, --
-- AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE --
-- FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY --
-- WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE --
-- IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR --
-- REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF --
-- INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS --
-- FOR A PARTICULAR PURPOSE. --
-- --
-- Xilinx products are not intended for use in life support --
-- appliances, devices, or systems. Use in such applications are --
-- expressly prohibited. --
-- --
-- (c) Copyright 1995-2009 Xilinx, Inc. --
-- All rights reserved. --
--------------------------------------------------------------------------------
-- The following code must appear in the VHDL architecture header:
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
component fifo_64x512
port (
rst: IN std_logic;
wr_clk: IN std_logic;
rd_clk: IN std_logic;
din: IN std_logic_VECTOR(63 downto 0);
wr_en: IN std_logic;
rd_en: IN std_logic;
prog_full_thresh_assert: IN std_logic_VECTOR(8 downto 0);
prog_full_thresh_negate: IN std_logic_VECTOR(8 downto 0);
dout: OUT std_logic_VECTOR(63 downto 0);
full: OUT std_logic;
empty: OUT std_logic;
valid: OUT std_logic;
prog_full: OUT std_logic);
end component;
-- Synplicity black box declaration
attribute syn_black_box : boolean;
attribute syn_black_box of fifo_64x512: component is true;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : fifo_64x512
port map (
rst => rst,
wr_clk => wr_clk,
rd_clk => rd_clk,
din => din,
wr_en => wr_en,
rd_en => rd_en,
prog_full_thresh_assert => prog_full_thresh_assert,
prog_full_thresh_negate => prog_full_thresh_negate,
dout => dout,
full => full,
empty => empty,
valid => valid,
prog_full => prog_full);
-- INST_TAG_END ------ End INSTANTIATION Template ------------
-- You must compile the wrapper file fifo_64x512.vhd when simulating
-- the core, fifo_64x512. When compiling the wrapper file, be sure to
-- reference the XilinxCoreLib VHDL simulation library. For detailed
-- instructions, please refer to the "CORE Generator Help".
##############################################################
#
# Xilinx Core Generator version 12.2
# Date: Thu Feb 3 16:45:57 2011
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = false
SET asysymbol = true
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = false
SET designentry = VHDL
SET device = xc6slx45t
SET devicefamily = spartan6
SET flowvendor = Foundation_ISE
SET formalverification = false
SET foundationsym = false
SET implementationfiletype = Ngc
SET package = fgg484
SET removerpms = false
SET simulationfiles = Behavioral
SET speedgrade = -3
SET verilogsim = true
SET vhdlsim = true
# END Project Options
# BEGIN Select
SELECT Fifo_Generator family Xilinx,_Inc. 6.2
# END Select
# BEGIN Parameters
CSET almost_empty_flag=false
CSET almost_full_flag=false
CSET component_name=fifo_64x512
CSET data_count=false
CSET data_count_width=9
CSET disable_timing_violations=false
CSET dout_reset_value=0
CSET empty_threshold_assert_value=2
CSET empty_threshold_negate_value=3
CSET enable_ecc=false
CSET enable_int_clk=false
CSET enable_reset_synchronization=true
CSET fifo_implementation=Independent_Clocks_Block_RAM
CSET full_flags_reset_value=1
CSET full_threshold_assert_value=509
CSET full_threshold_negate_value=508
CSET inject_dbit_error=false
CSET inject_sbit_error=false
CSET input_data_width=64
CSET input_depth=512
CSET output_data_width=64
CSET output_depth=512
CSET overflow_flag=false
CSET overflow_sense=Active_High
CSET performance_options=Standard_FIFO
CSET programmable_empty_type=No_Programmable_Empty_Threshold
CSET programmable_full_type=Multiple_Programmable_Full_Threshold_Input_Ports
CSET read_clock_frequency=1
CSET read_data_count=false
CSET read_data_count_width=9
CSET reset_pin=true
CSET reset_type=Asynchronous_Reset
CSET underflow_flag=false
CSET underflow_sense=Active_High
CSET use_dout_reset=true
CSET use_embedded_registers=false
CSET use_extra_logic=false
CSET valid_flag=true
CSET valid_sense=Active_High
CSET write_acknowledge_flag=false
CSET write_acknowledge_sense=Active_High
CSET write_clock_frequency=1
CSET write_data_count=false
CSET write_data_count_width=9
# END Parameters
GENERATE
# CRC: d8162d61
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
<header>
<!-- ISE source project file created by Project Navigator. -->
<!-- -->
<!-- This file contains project source information including a list of -->
<!-- project source files, project and process properties. This file, -->
<!-- along with the project source files, is sufficient to open and -->
<!-- implement in ISE Project Navigator. -->
<!-- -->
<!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
</header>
<version xil_pn:ise_version="12.2" xil_pn:schema_version="2"/>
<files>
<file xil_pn:name="fifo_64x512.ngc" xil_pn:type="FILE_NGC">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
</file>
<file xil_pn:name="fifo_64x512.v" xil_pn:type="FILE_VERILOG">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
<association xil_pn:name="PostMapSimulation"/>
<association xil_pn:name="PostRouteSimulation"/>
<association xil_pn:name="PostTranslateSimulation"/>
</file>
<file xil_pn:name="fifo_64x512.vhd" xil_pn:type="FILE_VHDL">
<association xil_pn:name="BehavioralSimulation"/>
<association xil_pn:name="Implementation"/>
<association xil_pn:name="PostMapSimulation"/>
<association xil_pn:name="PostRouteSimulation"/>
<association xil_pn:name="PostTranslateSimulation"/>
</file>
</files>
<properties>
<property xil_pn:name="AES Initial Vector spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="AES Key (Hex String) spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Add I/O Buffers" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Logic Optimization Across Hierarchy" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow SelectMAP Pins to Persist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unexpanded Blocks" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unmatched LOC Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Allow Unmatched Timing Group Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Asynchronous To Synchronous" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Auto Implementation Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
<property xil_pn:name="Automatic BRAM Packing" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Automatically Insert glbl Module in the Netlist" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Automatically Run Generate Target PROM/ACE File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Autosignature Generation" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="BRAM Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Bring Out Global Set/Reset Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Bring Out Global Tristate Net as a Port" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Bus Delimiter" xil_pn:value="&lt;>" xil_pn:valueState="default"/>
<property xil_pn:name="Case" xil_pn:value="Maintain" xil_pn:valueState="default"/>
<property xil_pn:name="Case Implementation Style" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Change Device Speed To" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Change Device Speed To Post Trace" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Clock Enable" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Collapsing Input Limit (4-40)" xil_pn:value="32" xil_pn:valueState="default"/>
<property xil_pn:name="Collapsing Pterm Limit (3-56)" xil_pn:value="28" xil_pn:valueState="default"/>
<property xil_pn:name="Combinatorial Logic Optimization" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Compile CPLD Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile EDK Simulation Library" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Compile SIMPRIM (Timing) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile UNISIM (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile XilinxCoreLib (CORE Generator) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile for HDL Debugging" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Compile uni9000 (Functional) Simulation Library" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Pin Done" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Pin Program" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Configuration Rate spartan6" xil_pn:value="2" xil_pn:valueState="default"/>
<property xil_pn:name="Correlate Output to Input Design" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create ASCII Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Binary Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Bit File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Create I/O Pads from Ports" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create IEEE 1532 Configuration File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create IEEE 1532 Configuration File spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Logic Allocation File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create Mask File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Create ReadBack Data Files" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Cross Clock Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="DSP Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Default Powerup Value of Registers" xil_pn:value="Low" xil_pn:valueState="default"/>
<property xil_pn:name="Delay Values To Be Read from SDF" xil_pn:value="Setup Time" xil_pn:valueState="default"/>
<property xil_pn:name="Device" xil_pn:value="xc6slx45t" xil_pn:valueState="non-default"/>
<property xil_pn:name="Device Family" xil_pn:value="Spartan6" xil_pn:valueState="non-default"/>
<property xil_pn:name="Device Speed Grade/Select ABS Minimum" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Do Not Escape Signal and Instance Names in Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Done (Output Events)" xil_pn:value="Default (4)" xil_pn:valueState="default"/>
<property xil_pn:name="Drive Awake Pin During Suspend/Wake Sequence spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Drive Done Pin High" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable BitStream Compression" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Cyclic Redundancy Checking (CRC) spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Debugging of Serial Mode BitStream" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable External Master Clock spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Internal Done Pipe" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Message Filtering" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Threading" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Multi-Threading par spartan6" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Outputs (Output Events)" xil_pn:value="Default (5)" xil_pn:valueState="default"/>
<property xil_pn:name="Enable Suspend/Wake Global Set/Reset spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Encrypt Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Encrypt Key Select spartan6" xil_pn:value="BBRAM" xil_pn:valueState="default"/>
<property xil_pn:name="Equivalent Register Removal Map" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Equivalent Register Removal XST" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Exclude Compilation of Deprecated EDK Cores" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Exclude Compilation of EDK Sub-Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Exhaustive Fit Mode" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Extra Cost Tables Map" xil_pn:value="0" xil_pn:valueState="default"/>
<property xil_pn:name="Extra Effort (Highest PAR level only)" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="FPGA Start-Up Clock" xil_pn:value="CCLK" xil_pn:valueState="default"/>
<property xil_pn:name="FSM Encoding Algorithm" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="FSM Style" xil_pn:value="LUT" xil_pn:valueState="default"/>
<property xil_pn:name="Filter Files From Compile Order" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Flatten Output Netlist" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Function Block Input Limit (4-40)" xil_pn:value="38" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language ArchWiz" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language Coregen" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Functional Model Target Language Schematic" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="GTS Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="4" xil_pn:valueState="default"/>
<property xil_pn:name="GWE Cycle During Suspend/Wakeup Sequence spartan6" xil_pn:value="5" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Architecture Only (No Entity Declaration)" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Asynchronous Delay Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Clock Region Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Constraints Interaction Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Constraints Interaction Report Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Datasheet Section" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Datasheet Section Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Detailed MAP Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Detailed Package Parasitics" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Multiple Hierarchical Netlist Files" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Fit Power Data" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Fit Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Place &amp; Route Power Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Post-Place &amp; Route Simulation Model" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate RTL Schematic" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Generate SAIF File for Power Optimization/Estimation Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Testbench File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Timegroups Section" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generate Timegroups Section Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Generics, Parameters" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Global Optimization Goal" xil_pn:value="AllClockNets" xil_pn:valueState="default"/>
<property xil_pn:name="Global Optimization map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Global Set/Reset Port Name" xil_pn:value="GSR_PORT" xil_pn:valueState="default"/>
<property xil_pn:name="Global Tristate Port Name" xil_pn:value="GTS_PORT" xil_pn:valueState="default"/>
<property xil_pn:name="HDL Equations Style" xil_pn:value="Source" xil_pn:valueState="default"/>
<property xil_pn:name="Hierarchy Separator" xil_pn:value="/" xil_pn:valueState="default"/>
<property xil_pn:name="I/O Voltage Standard" xil_pn:value="LVCMOS18" xil_pn:valueState="default"/>
<property xil_pn:name="ISim UUT Instance Name" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Ignore User Timing Constraints Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Ignore User Timing Constraints Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Implementation Stop View" xil_pn:value="Structural" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Template" xil_pn:value="Optimize Density" xil_pn:valueState="default"/>
<property xil_pn:name="Implementation Top" xil_pn:value="Architecture|fifo_64x512|fifo_64x512_a" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Top File" xil_pn:value="fifo_64x512.vhd" xil_pn:valueState="non-default"/>
<property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_64x512" xil_pn:valueState="non-default"/>
<property xil_pn:name="Include 'uselib Directive in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include SIMPRIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include UNISIM Models in Verilog File" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Include sdf_annotate task in Verilog File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Incremental Compilation" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Input and tristate I/O Termination Mode" xil_pn:value="Keeper" xil_pn:valueState="default"/>
<property xil_pn:name="Insert Buffers to Prevent Pulse Swallowing" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Instantiation Template Target Language Xps" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TCK" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TDI" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TDO" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="JTAG Pin TMS" xil_pn:value="Pull Up" xil_pn:valueState="default"/>
<property xil_pn:name="Keep Hierarchy" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Keep Hierarchy CPLD" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="LUT Combining Map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="LUT Combining Xst" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Language" xil_pn:value="VHDL" xil_pn:valueState="default"/>
<property xil_pn:name="Logic Optimization" xil_pn:value="Density" xil_pn:valueState="default"/>
<property xil_pn:name="Macro Preserve" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Manual Implementation Compile Order" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Map Slice Logic into Unused Block RAMs" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Mask Pins for Multi-Pin Wake-Up Suspend Mode spartan6" xil_pn:value="0x00" xil_pn:valueState="default"/>
<property xil_pn:name="Max Fanout" xil_pn:value="100000" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Compression" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Number of Lines in Report" xil_pn:value="1000" xil_pn:valueState="default"/>
<property xil_pn:name="Maximum Signal Name Length" xil_pn:value="20" xil_pn:valueState="default"/>
<property xil_pn:name="Move First Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Move Last Flip-Flop Stage" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Next Configuration Mode spartan6" xil_pn:value="001" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Starting Address for Golden Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Starting Address for Next Configuration spartan6" xil_pn:value="0x00000000" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: Use New Mode for Next Configuration spartan6" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="MultiBoot: User-Defined Register for Failsafe Scheme spartan6" xil_pn:value="0x0000" xil_pn:valueState="default"/>
<property xil_pn:name="Mux Extraction" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Netlist Hierarchy" xil_pn:value="As Optimized" xil_pn:valueState="default"/>
<property xil_pn:name="Netlist Translation Type" xil_pn:value="Timestamp" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Clock Buffers" xil_pn:value="16" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Paths in Error/Verbose Report" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Number of Paths in Error/Verbose Report Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Optimization Effort" xil_pn:value="Normal" xil_pn:valueState="default"/>
<property xil_pn:name="Optimization Goal" xil_pn:value="Speed" xil_pn:valueState="default"/>
<property xil_pn:name="Optimize Instantiated Primitives" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Other Bitgen Command Line Options spartan6" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other CPLD Fitter Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Fit" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Par" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compiler Options Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Compxlib Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Map Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other NETGEN Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Ngdbuild Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Place &amp; Route Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Programming Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Fit" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Simulator Commands Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other Timing Report Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other XPWR Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Other XST Command Line Options" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Output Extended Identifiers" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Output File Name" xil_pn:value="fifo_64x512" xil_pn:valueState="default"/>
<property xil_pn:name="Output Slew Rate" xil_pn:value="Fast" xil_pn:valueState="default"/>
<property xil_pn:name="Overwrite Compiled Libraries" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Pack I/O Registers into IOBs" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Pack I/O Registers/Latches into IOBs" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Package" xil_pn:value="fgg484" xil_pn:valueState="default"/>
<property xil_pn:name="Perform Advanced Analysis" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Perform Advanced Analysis Post Trace" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Place &amp; Route Effort Level (Overall)" xil_pn:value="High" xil_pn:valueState="default"/>
<property xil_pn:name="Place And Route Mode" xil_pn:value="Normal Place and Route" xil_pn:valueState="default"/>
<property xil_pn:name="Place MultiBoot Settings into Bitstream spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Placer Effort Level Map" xil_pn:value="High" xil_pn:valueState="default"/>
<property xil_pn:name="Placer Extra Effort Map" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Port to be used" xil_pn:value="Auto - default" xil_pn:valueState="default"/>
<property xil_pn:name="Post Map Simulation Model Name" xil_pn:value="fifo_64x512_map.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Place &amp; Route Simulation Model Name" xil_pn:value="fifo_64x512_timesim.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Synthesis Simulation Model Name" xil_pn:value="fifo_64x512_synthesis.v" xil_pn:valueState="default"/>
<property xil_pn:name="Post Translate Simulation Model Name" xil_pn:value="fifo_64x512_translate.v" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Power Reduction Xst" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Preserve Unused Inputs" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Produce Advanced Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Produce Verbose Report" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
<property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
<property xil_pn:name="RAM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="RAM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="ROM Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="ROM Style" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Read Cores" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Reduce Control Sets" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Regenerate Core" xil_pn:value="Under Current Project Setting" xil_pn:valueState="default"/>
<property xil_pn:name="Register Balancing" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Register Duplication Map" xil_pn:value="Off" xil_pn:valueState="default"/>
<property xil_pn:name="Register Duplication Xst" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Release Write Enable (Output Events)" xil_pn:value="Default (6)" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Design Instance in Testbench File to" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Architecture To" xil_pn:value="Structure" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Entity to" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Rename Top Level Module To" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Report Fastest Path(s) in Each Constraint" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Report Fastest Path(s) in Each Constraint Post Trace" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Report Paths by Endpoint" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Report Paths by Endpoint Post Trace" xil_pn:value="3" xil_pn:valueState="default"/>
<property xil_pn:name="Report Type" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
<property xil_pn:name="Report Type Post Trace" xil_pn:value="Verbose Report" xil_pn:valueState="default"/>
<property xil_pn:name="Report Unconstrained Paths" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Report Unconstrained Paths Post Trace" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Reset On Configuration Pulse Width" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Resource Sharing" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Retain Hierarchy" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Retiming Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Retry Configuration if CRC Error Occurs spartan6" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Run Design Rules Checker (DRC)" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Map" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Par" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Run for Specified Time Translate" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Safe Implementation" xil_pn:value="No" xil_pn:valueState="default"/>
<property xil_pn:name="Security" xil_pn:value="Enable Readback and Reconfiguration" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Behavioral" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Map" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Route" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Root Source Node Post-Translate" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Selected Simulation Source Node" xil_pn:value="UUT" xil_pn:valueState="default"/>
<property xil_pn:name="Set SPI Configuration Bus Width spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Setup External Master Clock Division spartan6" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Shift Register Minimum Size spartan6" xil_pn:value="2" xil_pn:valueState="default"/>
<property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Model Target" xil_pn:value="Verilog" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time ISim" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Par" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulation Run Time Translate" xil_pn:value="1000 ns" xil_pn:valueState="default"/>
<property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
<property xil_pn:name="Slice Utilization Ratio" xil_pn:value="100" xil_pn:valueState="default"/>
<property xil_pn:name="Specify 'define Macro Name and Value" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Behavioral" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Fit" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Map" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Route" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Specify Top Level Instance Names Post-Translate" xil_pn:value="Default" xil_pn:valueState="default"/>
<property xil_pn:name="Speed Grade" xil_pn:value="-3" xil_pn:valueState="default"/>
<property xil_pn:name="Starting Placer Cost Table (1-100) Map" xil_pn:value="1" xil_pn:valueState="default"/>
<property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
<property xil_pn:name="Target Simulator" xil_pn:value="Please Specify" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Mode Map" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Mode Par" xil_pn:value="Performance Evaluation" xil_pn:valueState="default"/>
<property xil_pn:name="Timing Report Format" xil_pn:value="Summary" xil_pn:valueState="default"/>
<property xil_pn:name="Top-Level Module Name in Output Netlist" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
<property xil_pn:name="Trim Unconnected Signals" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Tristate On Configuration Pulse Width" xil_pn:value="0" xil_pn:valueState="default"/>
<property xil_pn:name="Unused I/O Pad Termination Mode" xil_pn:value="Keeper" xil_pn:valueState="default"/>
<property xil_pn:name="Unused IOB Pins" xil_pn:value="Pull Down" xil_pn:valueState="default"/>
<property xil_pn:name="Use Clock Enable" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Fit" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Route" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Project File Post-Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Behavioral" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Simulation Command File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Behav" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Fit" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Map" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Par" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Custom Waveform Configuration File Translate" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use DSP Block spartan6" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Data Gate" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Direct Input for Input Registers" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Clocks" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Output Enables" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Global Set/Reset" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use LOC Constraints" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Location Constraints" xil_pn:value="Always" xil_pn:valueState="default"/>
<property xil_pn:name="Use Multi-level Logic Optimization" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use RLOC Constraints" xil_pn:value="Yes" xil_pn:valueState="default"/>
<property xil_pn:name="Use Smart Guide" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synchronous Reset" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synchronous Set" xil_pn:value="Auto" xil_pn:valueState="default"/>
<property xil_pn:name="Use Synthesis Constraints File" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Use Timing Constraints" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="UserID Code (8 Digit Hexadecimal)" xil_pn:value="0xFFFFFFFF" xil_pn:valueState="default"/>
<property xil_pn:name="VCCAUX Voltage Level spartan6" xil_pn:value="2.5V" xil_pn:valueState="default"/>
<property xil_pn:name="VHDL Source Analysis Standard" xil_pn:value="VHDL-93" xil_pn:valueState="default"/>
<property xil_pn:name="Value Range Check" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="Verilog 2001 Xst" xil_pn:value="true" xil_pn:valueState="default"/>
<property xil_pn:name="Verilog Macros" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="WYSIWYG" xil_pn:value="None" xil_pn:valueState="default"/>
<property xil_pn:name="Wait for DCM and PLL Lock (Output Events) spartan6" xil_pn:value="Default (NoWait)" xil_pn:valueState="default"/>
<property xil_pn:name="Wakeup Clock spartan6" xil_pn:value="Startup Clock" xil_pn:valueState="default"/>
<property xil_pn:name="Watchdog Timer Value spartan6" xil_pn:value="0xFFFF" xil_pn:valueState="default"/>
<property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="default"/>
<property xil_pn:name="Write Timing Constraints" xil_pn:value="false" xil_pn:valueState="default"/>
<property xil_pn:name="XOR Preserve" xil_pn:value="true" xil_pn:valueState="default"/>
<!-- -->
<!-- The following properties are for internal use only. These should not be modified.-->
<!-- -->
<property xil_pn:name="PROP_BehavioralSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_64x512" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan6" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_FPGAConfiguration" xil_pn:value="FPGAConfiguration" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostFitSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostMapSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostParSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostSynthSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_PostXlateSimTop" xil_pn:value="" xil_pn:valueState="default"/>
<property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2011-02-03T17:46:02" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="854009E4CFB5E321F7E82E7B56A5D782" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
<property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
</properties>
<bindings/>
<libraries/>
<autoManagedFiles>
<!-- The following files are identified by `include statements in verilog -->
<!-- source files and are automatically managed by Project Navigator. -->
<!-- -->
<!-- Do not hand-edit this section, as it will be overwritten when the -->
<!-- project is analyzed based on files automatically identified as -->
<!-- include files. -->
</autoManagedFiles>
</project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment