source: firmware/FTM/Lightpulser_interface/Basic_Version/Lightpulser_interface_Basic.vhd @ 10855

Last change on this file since 10855 was 10855, checked in by vogler, 9 years ago
Lightpulser Basic version with 50MHz clock only added
File size: 8.6 KB
Line 
1----------------------------------------------------------------------------------
2-- Company:        ETH Zurich, Institute for Particle Physics
3-- Engineer:       Patrick Vogler
4--
5-- Create Date:    24 February 2010
6-- Design Name:   
7-- Module Name:    FTM Lightpulser interface 
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description:    Interface to the lightpulsers LP1 (in the mirror dish)
12--                 and LP2 (inside the shutter)
13--
14-- Dependencies:
15--
16-- Revision:
17-- Revision 0.01 - File Created
18-- Additional Comments:
19--
20--
21-- modifications:  May 13 2011
22--
23-- Version 2
24--
25--       
26-- modified:     May 26 2011
27--               by Patrick Vogler
28--               "Lightpulser Basic Version"
29--
30----------------------------------------------------------------------------------
31
32library IEEE;
33use IEEE.STD_LOGIC_1164.ALL;
34use IEEE.STD_LOGIC_ARITH.ALL;
35use IEEE.STD_LOGIC_UNSIGNED.ALL;
36
37---- Uncomment the following library declaration if instantiating
38---- any Xilinx primitives in this code.
39library UNISIM;
40use UNISIM.VComponents.all;
41
42library ftm_definitions;
43USE ftm_definitions.ftm_array_types.all;
44USE ftm_definitions.ftm_constants.all;
45
46
47
48entity Lightpulser_interface is
49  port(
50   
51-- Clock
52-------------------------------------------------------------------------------
53   clk_50    : IN  STD_LOGIC;              --  50 MHz system clock
54--   clk_250   : IN  STD_LOGIC;              -- 250 MHz system clock
55   
56-- Lightpulser
57-- RJ-45 connectors J13 or J12 on the FTM board
58-- LVDS calibration outputs
59-- on IO-Bank 0
60-------------------------------------------------------------------------------
61-- connector J13   => Light Pulser 1 in the mirror dish
62   Cal_0_p    : out STD_LOGIC := '0';   -- Feedback / pulse width modulation
63   Cal_0_n    : out STD_LOGIC := '1';
64   Cal_1_p    : out STD_LOGIC := '0';   -- Pulse
65   Cal_1_n    : out STD_LOGIC := '1';
66   Cal_2_p    : out STD_LOGIC := '0';   -- Gate_1_4_7
67   Cal_2_n    : out STD_LOGIC := '1';
68   Cal_3_p    : out STD_LOGIC := '0';   -- Gate_3_5_8
69   Cal_3_n    : out STD_LOGIC := '1';
70
71-- connector J12   => Light Pulser 2 in the shutter
72   Cal_4_p    : out STD_LOGIC := '0';   -- Feedback / pulse width modulation
73   Cal_4_n    : out STD_LOGIC := '1';
74   Cal_5_p    : out STD_LOGIC := '0';   -- Pulse
75   Cal_5_n    : out STD_LOGIC := '1';
76   Cal_6_p    : out STD_LOGIC := '0';   -- Gate_1_4_7
77   Cal_6_n    : out STD_LOGIC := '1'; 
78   Cal_7_p    : out STD_LOGIC := '0';   -- Gate_3_5_8
79   Cal_7_n    : out STD_LOGIC := '1'; 
80   
81     
82-- FPGA intern signals: Lightpulser brightness
83-------------------------------------------------------------------------------
84 
85   LP1_ampl            : in std_logic_vector (15 downto 0);
86   LP2_ampl            : in std_logic_vector (15 downto 0);
87
88--   LP1_delay           : in std_logic_vector (15 downto 0);
89--   LP2_delay           : in std_logic_vector (15 downto 0);
90   
91   
92   LP1_pulse           : in std_logic;  -- trigger lightpulse in the mirror dish
93   LP2_pulse           : in std_logic;  -- trigger lightpulse in the shutter
94
95
96   start_config        : in std_logic;  -- handshaking
97   config_started      : out std_logic := '0';
98   config_done         : out std_logic := '0'
99   
100  );
101end Lightpulser_interface;
102
103
104architecture Behavioral of Lightpulser_interface is
105
106
107
108component FM_pulse_generator_Basic is
109   port( 
110      clk            : in  std_logic;    -- 50 MHz
111      pulse_freq     : in  std_logic_vector (5 downto 0);
112      FM_out         : out std_logic  := '0'
113         );
114end component;
115
116
117  component single_LP_Basic is
118  port( 
119   clk_50         : in  STD_LOGIC;       
120   LP_Pulse_out    : out STD_LOGIC;                                                 
121   LP_pulse_in     : in std_logic 
122   );
123end component;
124
125
126
127
128  -- LP1: mirror dish
129  signal Cal_0_1 : STD_LOGIC := '0'; 
130--  signal Cal_1_1 : STD_LOGIC;
131
132  -- LP2: shutter
133  signal Cal_0_2 : STD_LOGIC := '0';
134--  signal Cal_1_2 : STD_LOGIC;
135
136 -- PWM for amplitude stabilization
137  signal PWM_sig_1 : std_logic := '0';  -- LP1: mirror dish
138  signal PWM_sig_2 : std_logic := '0';  -- LP2: shutter
139
140  -- control data latch
141  signal LP1_ampl_sig   :  std_logic_vector (15 downto 0) := (others => '0');
142  signal LP2_ampl_sig   :  std_logic_vector (15 downto 0) := (others => '0'); 
143 
144
145  type type_latch_state is (IDLE, COPY, CONFIGURED);   
146  signal latch_state       : type_latch_state  := IDLE;   
147 
148
149
150
151
152begin
153 
154
155-- input latch
156input_latch : process (clk_50)
157  begin
158    if rising_edge(clk_50) then
159       case latch_state is
160
161         when IDLE =>
162              if start_config = '1' then 
163                 config_done <= '0';
164                 config_started <= '1'; 
165                 latch_state <= COPY;
166              end if;
167                       
168         when COPY =>
169              LP1_ampl_sig   <= LP1_ampl;
170              LP2_ampl_sig   <= LP2_ampl;
171      --        LP1_delay_sig  <= LP1_delay;
172      --        LP2_delay_sig  <= LP2_delay;         
173              latch_state    <= CONFIGURED;
174
175         when CONFIGURED =>
176              config_started <= '0'; 
177              config_done <= '1';
178              latch_state <= IDLE; 
179               
180       end case;           
181    end if; 
182end process input_latch; 
183                 
184
185 
186  Inst_LP1_mirror_dish:single_LP_Basic
187    port map (
188        clk_50        => clk_50,   
189        LP_Pulse_out  => Cal_0_1,                                     
190        LP_pulse_in   => LP1_pulse               
191              );
192
193 
194    Inst_LP2_shutter:single_LP_Basic
195    port map (
196        clk_50        => clk_50,   
197        LP_Pulse_out  => Cal_0_2,                                     
198        LP_pulse_in   => LP2_pulse               
199          );
200
201Inst_LP1_FM_pulse_generator:FM_pulse_generator_Basic    -- LP1: mirror dish
202   port map( 
203      clk            => clk_50, 
204      pulse_freq     => LP1_ampl_sig(5 downto 0),
205      FM_out         => PWM_sig_1   
206         );
207
208
209Inst_LP2_FM_pulse_generator:FM_pulse_generator_Basic    -- LP2: shutter
210   port map( 
211      clk            => clk_50, 
212      pulse_freq     => LP2_ampl_sig(5 downto 0),
213      FM_out         => PWM_sig_2   
214         );
215
216
217-- Light Pulser 1 (in the mirror dish): differential output buffers
218
219  OBUFDS_inst_Cal_0 : OBUFDS
220   generic map (
221      IOSTANDARD => "DEFAULT")
222   port map  (  O  => Cal_0_p ,     -- Diff_p output (connect directly to top-level port)
223      OB =>  Cal_0_n ,   -- Diff_n output (connect directly to top-level port)
224      I  =>  Cal_0_1     -- Buffer input
225   ); 
226
227     OBUFDS_inst_Cal_1 : OBUFDS
228   generic map (
229      IOSTANDARD => "DEFAULT")
230   port map  (  O  => Cal_1_p ,     -- Diff_p output (connect directly to top-level port)
231      OB =>  Cal_1_n ,   -- Diff_n output (connect directly to top-level port)
232      I  =>  PWM_sig_1   -- Buffer input
233   ); 
234
235     OBUFDS_inst_Cal_2 : OBUFDS
236   generic map (
237      IOSTANDARD => "DEFAULT")
238   port map  (  O  => Cal_2_p ,     -- Diff_p output (connect directly to top-level port)
239      OB =>  Cal_2_n ,   -- Diff_n output (connect directly to top-level port)
240      I  =>  LP1_ampl_sig(14)       -- Buffer input
241   ); 
242
243     OBUFDS_inst_Cal_3 : OBUFDS
244   generic map (
245      IOSTANDARD => "DEFAULT")
246   port map (   O  => Cal_3_p ,     -- Diff_p output (connect directly to top-level port)
247      OB =>  Cal_3_n ,   -- Diff_n output (connect directly to top-level port)
248      I  =>  LP1_ampl_sig(15)      -- Buffer input
249   );     
250
251
252     
253--  Light Pulser 2 (in the shutter): differential output buffers
254     
255 OBUFDS_inst_Cal_4 : OBUFDS
256   generic map (
257      IOSTANDARD => "DEFAULT")
258   port map (   O  => Cal_4_p ,     -- Diff_p output (connect directly to top-level port)
259      OB =>  Cal_4_n ,   -- Diff_n output (connect directly to top-level port)
260      I  =>  Cal_0_2      -- Buffer input
261   ); 
262
263     OBUFDS_inst_Cal_5 : OBUFDS
264   generic map (
265      IOSTANDARD => "DEFAULT")
266   port map  (  O  => Cal_5_p ,     -- Diff_p output (connect directly to top-level port)
267      OB =>  Cal_5_n ,   -- Diff_n output (connect directly to top-level port)
268      I  =>  PWM_sig_2        -- Buffer input
269   ); 
270
271     OBUFDS_inst_Cal_6 : OBUFDS
272   generic map (
273      IOSTANDARD => "DEFAULT")
274   port map  (  O  => Cal_6_p ,     -- Diff_p output (connect directly to top-level port)
275      OB =>  Cal_6_n ,   -- Diff_n output (connect directly to top-level port)
276      I  =>  LP2_ampl_sig(14)
277    );             
278
279     OBUFDS_inst_Cal_7 : OBUFDS
280   generic map (
281      IOSTANDARD => "DEFAULT")
282   port map  (  O  => Cal_7_p ,     -- Diff_p output (connect directly to top-level port)
283      OB =>  Cal_7_n ,   -- Diff_n output (connect directly to top-level port)
284      I  =>  LP2_ampl_sig(15)   -- Buffer input
285   );     
286   
287
288end Behavioral;
289
290
Note: See TracBrowser for help on using the repository browser.