eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
AlgoParameterRAM_wrapper.vhd
Go to the documentation of this file.
1 
35 
36 library IEEE;
37 use IEEE.STD_LOGIC_1164.all;
38 use ieee.numeric_std.all;
39 library ipbus_lib;
40 
41 use ipbus_lib.ipbus.all;
42 use work.DataTypes.all;
43 
46  port(
47  clk_ipb : in std_logic;
48  rst : in std_logic;
49  ipb_in : in ipb_wbus;
50  ipb_out : out ipb_rbus;
51  rclk : in std_logic;
52  we : in std_logic := '0';
53  q : out std_logic_vector(PARAMETER_RAM_DATA_WIDTH-1 downto 0);
54  addr : in std_logic_vector(2 downto 0)
55  );
57 
59 architecture rtl of AlgoParameterRAM_wrapper is
60 
61  component AlgoParameterRAM
62  port (
63  clka : in std_logic;
64  ena : in std_logic;
65  wea : in std_logic_vector(0 downto 0);
66  addra : in std_logic_vector(PARAMETER_RAM_ADDR_WIDTH-1 downto 0);
67  dina : in std_logic_vector(31 downto 0);
68  douta : out std_logic_vector(31 downto 0);
69  clkb : in std_logic;
70  enb : in std_logic;
71  web : in std_logic_vector(0 downto 0);
72  addrb : in std_logic_vector(2 downto 0);
73  dinb : in std_logic_vector(PARAMETER_RAM_DATA_WIDTH-1 downto 0);
74  doutb : out std_logic_vector(PARAMETER_RAM_DATA_WIDTH-1 downto 0)
75  );
76  end component;
77 
78 
79 --RAM signals
80  signal ram_ena : std_logic;
81  signal ram_wea : std_logic_vector(0 downto 0);
82  signal ram_addra : std_logic_vector(PARAMETER_RAM_ADDR_WIDTH-1 downto 0);
83  signal ram_dina : std_logic_vector(31 downto 0);
84  signal ram_douta : std_logic_vector(31 downto 0);
85 
86  signal ram_clkb : std_logic;
87  signal ram_enb : std_logic;
88  signal ram_web : std_logic_vector(0 downto 0);
89  signal ram_addrb : std_logic_vector(2 downto 0);
90  signal ram_dinb : std_logic_vector(PARAMETER_RAM_DATA_WIDTH-1 downto 0);
91  signal ram_doutb : std_logic_vector(PARAMETER_RAM_DATA_WIDTH-1 downto 0);
92 
93  --ipbus signals
94  signal ack : std_logic;
95  signal ack2 : std_logic;
96 -- signal ack3 : std_logic;
97  signal ipbus_write : std_logic_vector(0 downto 0);
98  signal write_enable : std_logic_vector(0 downto 0);
99 
100 begin
101  ram_dinb <= (others => '0');
102 
103  IPBUS_RAM : process(clk_ipb)
104  begin
105  if rising_edge(clk_ipb) then
106  if ipb_in.ipb_strobe = '1' and ipb_in.ipb_write = '1' then
107  ipbus_write(0) <= '1';
108  else
109  ipbus_write(0) <= '0';
110  end if;
111  ack2 <= ipb_in.ipb_strobe and (not ack2) and (not ack);
112 -- ack2 <= ack3;
113  ack <= ack2;
114 
115  end if;
116  end process;
117 
118  ipb_out.ipb_ack <= ack;
119  ipb_out.ipb_err <= '0';
120 
121 
122  write_enable(0) <= we;
123  ALGO_PARAMETER_RAM : AlgoParameterRAM
124  port map (
125  clka => clk_ipb,
126  ena => ipb_in.ipb_strobe,
127  wea => ipbus_write,
128  addra => ipb_in.ipb_addr(PARAMETER_RAM_ADDR_WIDTH-1 downto 0),
129  dina => ipb_in.ipb_wdata,
130  douta => ipb_out.ipb_rdata,
131  clkb => rclk,
132  enb => '1',
133  web => write_enable,
134  addrb => addr,
135  dinb => ram_dinb,
136  doutb => q);
137 end rtl;