| 1 | --=======================================================================================
|
|---|
| 2 | -- TITLE : Input synchronization block
|
|---|
| 3 | -- DESCRIPTION : Synchronization of FTUs signals using FPGA DDR input registers
|
|---|
| 4 | -- FILE : input_synch.vhd
|
|---|
| 5 | -- COMPANY : Micro-Cameras & Space Exploration SA
|
|---|
| 6 | --=======================================================================================
|
|---|
| 7 | -- CREATION
|
|---|
| 8 | -- DATE AUTHOR PROJECT REVISION
|
|---|
| 9 | -- 02/03/2011 JGi FTM 110302a
|
|---|
| 10 | --=======================================================================================
|
|---|
| 11 | -- MODIFICATION HISTORY
|
|---|
| 12 | -- DATE AUTHOR PROJECT REVISION COMMENTS
|
|---|
| 13 | -- 02/03/2011 JGi FTM 110302a Description
|
|---|
| 14 | --=======================================================================================
|
|---|
| 15 | -- Library Definition
|
|---|
| 16 | library ieee;
|
|---|
| 17 | use ieee.std_logic_1164.all;
|
|---|
| 18 | use ieee.std_logic_arith.all;
|
|---|
| 19 | use ieee.std_logic_unsigned.all;
|
|---|
| 20 |
|
|---|
| 21 | library unisim;
|
|---|
| 22 | use unisim.vcomponents.all;
|
|---|
| 23 |
|
|---|
| 24 | -- Entity Definition
|
|---|
| 25 | entity input_synch is
|
|---|
| 26 | port( --clock
|
|---|
| 27 | clk_250MHz : in std_logic;
|
|---|
| 28 | clk_250MHz_180 : in std_logic;
|
|---|
| 29 | --trigger primitives from FTUs
|
|---|
| 30 | trig_prim_0 : in std_logic_vector(9 downto 0); --crate 0
|
|---|
| 31 | trig_prim_1 : in std_logic_vector(9 downto 0); --crate 1
|
|---|
| 32 | trig_prim_2 : in std_logic_vector(9 downto 0); --crate 2
|
|---|
| 33 | trig_prim_3 : in std_logic_vector(9 downto 0); --crate 3
|
|---|
| 34 | --synchronized trigger primitives
|
|---|
| 35 | trig_synch_0_rise : out std_logic_vector(9 downto 0); --crate 0
|
|---|
| 36 | trig_synch_1_rise : out std_logic_vector(9 downto 0); --crate 1
|
|---|
| 37 | trig_synch_2_rise : out std_logic_vector(9 downto 0); --crate 2
|
|---|
| 38 | trig_synch_3_rise : out std_logic_vector(9 downto 0); --crate 3
|
|---|
| 39 | trig_synch_0_fall : out std_logic_vector(9 downto 0); --crate 0
|
|---|
| 40 | trig_synch_1_fall : out std_logic_vector(9 downto 0); --crate 1
|
|---|
| 41 | trig_synch_2_fall : out std_logic_vector(9 downto 0); --crate 2
|
|---|
| 42 | trig_synch_3_fall : out std_logic_vector(9 downto 0)); --crate 3
|
|---|
| 43 | end input_synch;
|
|---|
| 44 |
|
|---|
| 45 | -- Architecture Definition
|
|---|
| 46 | architecture RTL of input_synch is
|
|---|
| 47 |
|
|---|
| 48 | type t_reg is record
|
|---|
| 49 | -- Internal register declaration
|
|---|
| 50 | -- Ouput register declaration
|
|---|
| 51 | trig_synch_0_rise : std_logic_vector(9 downto 0);
|
|---|
| 52 | trig_synch_1_rise : std_logic_vector(9 downto 0);
|
|---|
| 53 | trig_synch_2_rise : std_logic_vector(9 downto 0);
|
|---|
| 54 | trig_synch_3_rise : std_logic_vector(9 downto 0);
|
|---|
| 55 | trig_synch_0_fall : std_logic_vector(9 downto 0);
|
|---|
| 56 | trig_synch_1_fall : std_logic_vector(9 downto 0);
|
|---|
| 57 | trig_synch_2_fall : std_logic_vector(9 downto 0);
|
|---|
| 58 | trig_synch_3_fall : std_logic_vector(9 downto 0);
|
|---|
| 59 | end record;
|
|---|
| 60 |
|
|---|
| 61 | signal i_trig_synch_0_rise : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 62 | signal i_trig_synch_1_rise : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 63 | signal i_trig_synch_2_rise : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 64 | signal i_trig_synch_3_rise : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 65 | signal i_trig_synch_0_fall : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 66 | signal i_trig_synch_1_fall : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 67 | signal i_trig_synch_2_fall : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 68 | signal i_trig_synch_3_fall : std_logic_vector(9 downto 0) := (others => '0');
|
|---|
| 69 |
|
|---|
| 70 | signal i_next_reg : t_reg := (trig_synch_0_rise => (others => '0'),
|
|---|
| 71 | trig_synch_1_rise => (others => '0'),
|
|---|
| 72 | trig_synch_2_rise => (others => '0'),
|
|---|
| 73 | trig_synch_3_rise => (others => '0'),
|
|---|
| 74 | trig_synch_0_fall => (others => '0'),
|
|---|
| 75 | trig_synch_1_fall => (others => '0'),
|
|---|
| 76 | trig_synch_2_fall => (others => '0'),
|
|---|
| 77 | trig_synch_3_fall => (others => '0'));
|
|---|
| 78 | signal i_reg : t_reg := (trig_synch_0_rise => (others => '0'),
|
|---|
| 79 | trig_synch_1_rise => (others => '0'),
|
|---|
| 80 | trig_synch_2_rise => (others => '0'),
|
|---|
| 81 | trig_synch_3_rise => (others => '0'),
|
|---|
| 82 | trig_synch_0_fall => (others => '0'),
|
|---|
| 83 | trig_synch_1_fall => (others => '0'),
|
|---|
| 84 | trig_synch_2_fall => (others => '0'),
|
|---|
| 85 | trig_synch_3_fall => (others => '0'));
|
|---|
| 86 |
|
|---|
| 87 | begin
|
|---|
| 88 |
|
|---|
| 89 | -- Input DDR flip-flops instantiation for crate 0
|
|---|
| 90 | input_ddr_0: for i in 0 to 9 generate
|
|---|
| 91 | iddr2_inst_trig_synch_0 : IDDR2
|
|---|
| 92 | generic map(DDR_ALIGNMENT => "NONE", -- sets output alignment to "none", "c0", "c1"
|
|---|
| 93 | INIT_Q0 => '0', -- sets initial state of the q0 output to '0' or '1'
|
|---|
| 94 | INIT_Q1 => '0', -- sets initial state of the q1 output to '0' or '1'
|
|---|
| 95 | SRTYPE => "SYNC") -- specifies "sync" or "async" set/reset
|
|---|
| 96 | port map( Q0 => i_trig_synch_0_rise(i), -- 1-bit output captured with c0 clock
|
|---|
| 97 | Q1 => i_trig_synch_0_fall(i), -- 1-bit output captured with c1 clock
|
|---|
| 98 | C0 => clk_250mhz, -- 1-bit clock input
|
|---|
| 99 | C1 => clk_250mhz_180, -- 1-bit clock input
|
|---|
| 100 | CE => '1', -- 1-bit clock enable input
|
|---|
| 101 | D => trig_prim_0(i), -- 1-bit data input
|
|---|
| 102 | R => '0', -- 1-bit reset input
|
|---|
| 103 | S => '0'); -- 1-bit set input
|
|---|
| 104 | end generate input_ddr_0;
|
|---|
| 105 |
|
|---|
| 106 | -- Input DDR flip-flops instantiation for crate 1
|
|---|
| 107 | input_ddr_1: for i in 0 to 9 generate
|
|---|
| 108 | iddr2_inst_trig_synch_1 : IDDR2
|
|---|
| 109 | generic map(DDR_ALIGNMENT => "NONE",
|
|---|
| 110 | INIT_Q0 => '0',
|
|---|
| 111 | INIT_Q1 => '0',
|
|---|
| 112 | SRTYPE => "SYNC")
|
|---|
| 113 | port map( Q0 => i_trig_synch_1_rise(i),
|
|---|
| 114 | Q1 => i_trig_synch_1_fall(i),
|
|---|
| 115 | C0 => clk_250mhz,
|
|---|
| 116 | C1 => clk_250mhz_180,
|
|---|
| 117 | CE => '1',
|
|---|
| 118 | D => trig_prim_1(i),
|
|---|
| 119 | R => '0',
|
|---|
| 120 | S => '0');
|
|---|
| 121 | end generate input_ddr_1;
|
|---|
| 122 |
|
|---|
| 123 | -- Input DDR flip-flops instantiation for crate 2
|
|---|
| 124 | input_ddr_2: for i in 0 to 9 generate
|
|---|
| 125 | iddr2_inst_trig_synch_2 : IDDR2
|
|---|
| 126 | generic map(DDR_ALIGNMENT => "NONE",
|
|---|
| 127 | INIT_Q0 => '0',
|
|---|
| 128 | INIT_Q1 => '0',
|
|---|
| 129 | SRTYPE => "SYNC")
|
|---|
| 130 | port map( Q0 => i_trig_synch_2_rise(i),
|
|---|
| 131 | Q1 => i_trig_synch_2_fall(i),
|
|---|
| 132 | C0 => clk_250mhz,
|
|---|
| 133 | C1 => clk_250mhz_180,
|
|---|
| 134 | CE => '1',
|
|---|
| 135 | D => trig_prim_2(i),
|
|---|
| 136 | R => '0',
|
|---|
| 137 | S => '0');
|
|---|
| 138 | end generate input_ddr_2;
|
|---|
| 139 |
|
|---|
| 140 | -- Input DDR flip-flops instantiation for crate 3
|
|---|
| 141 | input_ddr_3: for i in 0 to 9 generate
|
|---|
| 142 | iddr2_inst_trig_synch_3 : IDDR2
|
|---|
| 143 | generic map(DDR_ALIGNMENT => "NONE",
|
|---|
| 144 | INIT_Q0 => '0',
|
|---|
| 145 | INIT_Q1 => '0',
|
|---|
| 146 | SRTYPE => "SYNC")
|
|---|
| 147 | port map( Q0 => i_trig_synch_3_rise(i),
|
|---|
| 148 | Q1 => i_trig_synch_3_fall(i),
|
|---|
| 149 | C0 => clk_250mhz,
|
|---|
| 150 | C1 => clk_250mhz_180,
|
|---|
| 151 | CE => '1',
|
|---|
| 152 | D => trig_prim_3(i),
|
|---|
| 153 | R => '0',
|
|---|
| 154 | S => '0');
|
|---|
| 155 | end generate input_ddr_3;
|
|---|
| 156 |
|
|---|
| 157 | -- Combinatorial logic
|
|---|
| 158 | process(i_trig_synch_0_rise, i_trig_synch_1_rise, i_trig_synch_2_rise,
|
|---|
| 159 | i_trig_synch_3_rise, i_trig_synch_0_fall, i_trig_synch_1_fall,
|
|---|
| 160 | i_trig_synch_2_fall, i_trig_synch_3_fall, i_reg)
|
|---|
| 161 | variable v_reg : t_reg := (trig_synch_0_rise => (others => '0'),
|
|---|
| 162 | trig_synch_1_rise => (others => '0'),
|
|---|
| 163 | trig_synch_2_rise => (others => '0'),
|
|---|
| 164 | trig_synch_3_rise => (others => '0'),
|
|---|
| 165 | trig_synch_0_fall => (others => '0'),
|
|---|
| 166 | trig_synch_1_fall => (others => '0'),
|
|---|
| 167 | trig_synch_2_fall => (others => '0'),
|
|---|
| 168 | trig_synch_3_fall => (others => '0'));
|
|---|
| 169 | begin
|
|---|
| 170 | v_reg := i_reg;
|
|---|
| 171 | --===================================================================================
|
|---|
| 172 |
|
|---|
| 173 | --===================================================================================
|
|---|
| 174 | -- Delay management for rising edge data
|
|---|
| 175 | --===================================================================================
|
|---|
| 176 | v_reg.trig_synch_0_rise := i_trig_synch_0_rise;
|
|---|
| 177 | v_reg.trig_synch_1_rise := i_trig_synch_1_rise;
|
|---|
| 178 | v_reg.trig_synch_2_rise := i_trig_synch_2_rise;
|
|---|
| 179 | v_reg.trig_synch_3_rise := i_trig_synch_3_rise;
|
|---|
| 180 | --===================================================================================
|
|---|
| 181 |
|
|---|
| 182 | --===================================================================================
|
|---|
| 183 | -- Delay management for falling edge data
|
|---|
| 184 | --===================================================================================
|
|---|
| 185 | v_reg.trig_synch_0_fall := i_trig_synch_0_fall;
|
|---|
| 186 | v_reg.trig_synch_1_fall := i_trig_synch_1_fall;
|
|---|
| 187 | v_reg.trig_synch_2_fall := i_trig_synch_2_fall;
|
|---|
| 188 | v_reg.trig_synch_3_fall := i_trig_synch_3_fall;
|
|---|
| 189 | --===================================================================================
|
|---|
| 190 |
|
|---|
| 191 | --===================================================================================
|
|---|
| 192 | -- Drive register input
|
|---|
| 193 | i_next_reg <= v_reg;
|
|---|
| 194 |
|
|---|
| 195 | --===================================================================================
|
|---|
| 196 | -- Output assignation
|
|---|
| 197 | trig_synch_0_rise <= i_reg.trig_synch_0_rise;
|
|---|
| 198 | trig_synch_1_rise <= i_reg.trig_synch_1_rise;
|
|---|
| 199 | trig_synch_2_rise <= i_reg.trig_synch_2_rise;
|
|---|
| 200 | trig_synch_3_rise <= i_reg.trig_synch_3_rise;
|
|---|
| 201 | trig_synch_0_fall <= i_reg.trig_synch_0_fall;
|
|---|
| 202 | trig_synch_1_fall <= i_reg.trig_synch_1_fall;
|
|---|
| 203 | trig_synch_2_fall <= i_reg.trig_synch_2_fall;
|
|---|
| 204 | trig_synch_3_fall <= i_reg.trig_synch_3_fall;
|
|---|
| 205 | --===================================================================================
|
|---|
| 206 | end process;
|
|---|
| 207 |
|
|---|
| 208 | -- Sequential logic
|
|---|
| 209 | process(clk_250MHz)
|
|---|
| 210 | begin
|
|---|
| 211 | if rising_edge(clk_250MHz) then
|
|---|
| 212 | i_reg <= i_next_reg;
|
|---|
| 213 | end if;
|
|---|
| 214 | end process;
|
|---|
| 215 |
|
|---|
| 216 | end RTL; |
|---|