library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity ni2dpm is port ( reset_n : in std_logic; -- asynchronous reset clk_pci : in std_logic; -- read clock strobe : in std_logic; -- incoming DDR strobe signal lvds_data_in : in std_logic_vector( 9 downto 0); -- incoming DDR data sync. to strobe sel_s : in std_logic_vector( 3 downto 0); sel_p : in std_logic_vector( 3 downto 0); naddr : out std_logic_vector(11 downto 0); irq : out std_logic; raddr : in std_logic_vector(11 downto 0); rdata : out std_logic_vector( 7 downto 0) -- data output, sync. to internal clk ); end ni2dpm; architecture a of ni2dpm is --component ni_exclude_in is -- generic ( -- width : integer := 10; -- word width incl. spare & parity bit -- depth : integer := 4); -- position selection word width -- port ( -- din : in std_logic_vector(width-1 downto 0); -- data in -- sel_s : in std_logic_vector(depth-1 downto 0); -- the spare bit position, -- -- will be selected out first ("1001") -- sel_p : in std_logic_vector(depth-1 downto 0); -- the parity bit position, -- -- will be selected out next ("1000") -- dout : out std_logic_vector(width-3 downto 0); -- data out -- prty_bit : out std_logic); -- parity bit output --end component; -- --component reg_clr is --generic(Ndata : Integer := 32); --port ( clk : in std_logic; -- ce : in std_logic; -- rst_n : in std_logic; -- d : in std_logic_vector(Ndata-1 downto 0); -- q : out std_logic_vector(Ndata-1 downto 0) -- ); --end component; -- COMPONENT lpm_counter GENERIC (LPM_WIDTH: POSITIVE; LPM_MODULUS: NATURAL := 0; LPM_DIRECTION: STRING := "UNUSED"; LPM_AVALUE: STRING := "UNUSED"; LPM_SVALUE: STRING := "UNUSED"; LPM_PVALUE: STRING := "UNUSED"; LPM_TYPE: STRING := "LPM_COUNTER"; LPM_HINT : STRING := "UNUSED"); PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0) := (OTHERS => '0'); clock: IN STD_LOGIC; clk_en, cnt_en, updown: IN STD_LOGIC := '1'; sload, sset, sclr, aload, aset, aclr, cin: IN STD_LOGIC := '0'; cout: OUT STD_LOGIC; --eq: OUT STD_LOGIC_VECTOR (15 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)); END COMPONENT; COMPONENT lpm_ram_dp GENERIC ( LPM_WIDTH: POSITIVE; LPM_WIDTHAD: POSITIVE; LPM_NUMWORDS: NATURAL; LPM_TYPE: STRING := "LPM_RAM_DP"; LPM_INDATA: STRING := "REGISTERED"; LPM_OUTDATA: STRING := "REGISTERED"; LPM_RDADDRESS_CONTROL: STRING := "REGISTERED"; LPM_WRADDRESS_CONTROL: STRING := "REGISTERED" ); PORT ( rdaddress, wraddress: IN STD_LOGIC_VECTOR(LPM_WIDTHAD-1 DOWNTO 0); rdclock, wrclock: IN STD_LOGIC := '0'; rden, rdclken, wrclken: IN STD_LOGIC := '1'; wren: IN STD_LOGIC; data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)); END COMPONENT; signal we_p : std_logic; --signal LogH : std_logic; signal reset : std_logic; --signal data_1p : std_logic_vector(lvds_data_in'range); signal rdata_int : std_logic_vector(7 downto 0); signal data_in_sel : std_logic_vector(7 downto 0); signal waddr_p : std_logic_vector(naddr'range); signal waddr_f : std_logic_vector(naddr'range); begin data_in_sel <= lvds_data_in(8) & lvds_data_in(6 downto 0); -- LogH <= '1'; reset <= not reset_n; waddr_f <= (0 => '0', others => '1'); process(strobe, reset_n) begin if reset_n = '0' then we_p <= '1'; irq <= '0'; -- waddr_p <= (others => '0'); elsif strobe'event and strobe = '1' then if (waddr_p = waddr_f) then we_p <= '0'; end if; irq <= not we_p; end if; end process; --rg1p: reg_clr -- generic map(Ndata => lvds_data_in'length) -- port map(clk => strobe, -- ce => LogH, -- rst_n => reset_n, -- d => lvds_data_in, -- q => data_1p -- ); --ex_p: ni_exclude_in -- generic map( -- width => 10, -- depth => 4) -- port map( -- din => data_1p, -- sel_s => sel_s, -- sel_p => sel_p, -- dout => data_2p, -- prty_bit => open); wa_p: lpm_counter GENERIC map(LPM_WIDTH => waddr_p'length, LPM_DIRECTION => "UP") PORT map( clock => strobe, cnt_en => we_p, aclr => reset, q => waddr_p); naddr <= waddr_p; dpram: lpm_ram_dp GENERIC map( LPM_WIDTH => 8, LPM_WIDTHAD => 11, LPM_NUMWORDS => 2048, LPM_INDATA => "REGISTERED", LPM_OUTDATA => "UNREGISTERED", LPM_RDADDRESS_CONTROL => "REGISTERED", LPM_WRADDRESS_CONTROL => "REGISTERED" ) PORT map( rdaddress => raddr(10 downto 0), wraddress => waddr_p(10 downto 0), rdclock => clk_pci, wrclock => strobe, wren => we_p, -- data => data_2p, data => data_in_sel, q => rdata_int); rdata <= rdata_int xor "00101010"; end;