CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
CMX_CTP_output_module.vhd
Go to the documentation of this file.
1 ----------------------------------------------------------------------------------
13 ----------------------------------------------------------------------------------
14 library IEEE;
15 use IEEE.STD_LOGIC_1164.ALL;
16 use IEEE.NUMERIC_STD.ALL;
17 
18 library UNISIM;
19 use UNISIM.VComponents.all;
20 
21 library work;
22 use work.CMXpackage.all;
24 
25 
26 
28  port (
29  --data to be sent to CTP as received from the adder
30  --numbits_in_CTP_connector does not include clock
31  data : in std_logic_vector( (numbits_in_CTP_connector*2)-1 downto 0);
32 
33  --registered data or playback data from the RAM
34  sdr_data_out : out arr_CTP;
35  --includes clock
36  buf_clk40 : in std_logic; -- global 40 MHz clock
37  buf_clk40_center : in std_logic; -- global 40 MHz clock pushed by 90^o
38  buf_clk200 : in std_logic; -- global 200 MHz clock for iodelay calibration
39  pll_locked : in std_logic; -- is the main MMCM locked?
40  start_playback : in std_logic;
41  spy_write_inhibit : in std_logic;
42  --VME control:
43  ncs : in std_logic;
44  rd_nwr : in std_logic;
45  ds : in std_logic;
46  addr_vme : in std_logic_vector (15 downto 0);
47  data_vme_in : in std_logic_vector (15 downto 0);
48  data_vme_out : out std_logic_vector (15 downto 0);
49  bus_drive : out std_logic
50  );
51 
52 end CMX_CTP_output_module;
53 
54 architecture Behavioral of CMX_CTP_output_module is
55 
56  attribute IOB : string;
57 
58  signal data_r : std_logic_vector( (numbits_in_CTP_connector*2)-1 downto 0);
59 
60  attribute IOB of data_r : signal is "TRUE";
61 
63  generic (
67  num_external_RAMS : positive);
68  port (
69  clk : in std_logic;
70  ncs : in std_logic;
71  rd_nwr : in std_logic;
72  ds : in std_logic;
73  addr_vme : in std_logic_vector (15 downto 0);
74  data_vme_in : in std_logic_vector (15 downto 0);
75  data_vme_out : out std_logic_vector (15 downto 0);
76  bus_drive : out std_logic;
77  mode_control : out std_logic_vector(3 downto 0);
78  ena : out std_logic;
79  wea : out std_logic;
80  addra : out std_logic_vector(7 DOWNTO 0);
81  mem_select_address : out std_logic_vector(addr_port_width(num_external_RAMS)-1 downto 0);
82  dina : out std_logic_vector;
83  douta : in std_logic_vector;
84  port_b_master_inhibit : out std_logic);
85  end component CMX_generic_spy_mem_control_FSM;
86 
87 
88  signal mode_control_CTP_SPY : std_logic_vector(3 downto 0);
89  signal ena_CTP_SPY : std_logic;
90  signal wea_CTP_SPY : std_logic_vector(0 downto 0);
91  signal addra_CTP_SPY : std_logic_vector(7 DOWNTO 0);
92  signal dina_CTP_SPY : std_logic_vector( ( numbits_in_CTP_connector *2)-1 downto 0);
93  signal douta_CTP_SPY : std_logic_vector( ( numbits_in_CTP_connector *2)-1 downto 0);
94  signal port_b_master_inhibit_CTP_SPY : std_logic;
95  signal port_b_master_inhibit_CTP_SPY_r : std_logic;
96 
97 
98  signal spy_write_inhibit_r : std_logic;
99  signal spy_write_inhibit_rr : std_logic;
100 
101  component blk_mem_A8x62_B8x62 is
102  port (
103  clka : IN STD_LOGIC;
104  ena : IN STD_LOGIC;
105  wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
106  addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
107  dina : IN STD_LOGIC_VECTOR(61 DOWNTO 0);
108  douta : OUT STD_LOGIC_VECTOR(61 DOWNTO 0);
109  clkb : IN STD_LOGIC;
110  enb : IN STD_LOGIC;
111  web : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
112  addrb : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
113  dinb : IN STD_LOGIC_VECTOR(61 DOWNTO 0);
114  doutb : OUT STD_LOGIC_VECTOR(61 DOWNTO 0));
115  end component blk_mem_A8x62_B8x62;
116 
117  signal enb_CTP_SPY : std_logic;
118  signal web_CTP_SPY : std_logic;
119  signal enb_CTP_SPY_r : std_logic;
120  signal web_CTP_SPY_r : std_logic;
121  signal enb_CTP_SPY_inhibited : std_logic;
122  signal web_CTP_SPY_inhibited : std_logic_vector(0 downto 0);
123 
124  signal addrb_CTP_SPY_counter : unsigned(7 downto 0);
125  signal addrb_CTP_SPY : std_logic_vector(7 downto 0);
126 
127  signal dinb_CTP_SPY: std_logic_vector(61 downto 0);
128  signal doutb_CTP_SPY: std_logic_vector(61 downto 0);
129 
130  signal start_playback_r, start_playback_rr : std_logic;
131 
132 
133 
134  component Stretch_10 is
135  port (
136  unstretched_IN : in std_logic;
137  stretched_OUT : out std_logic;
138  clk : in std_logic);
139  end component Stretch_10;
140 
141 
142  component vme_local_switch is
143  port (
144  data_vme_up : out std_logic_vector (15 downto 0);
145  data_vme_from_below : in arr_16;
146  bus_drive_up : out std_logic;
147  bus_drive_from_below : in std_logic_vector);
148  end component vme_local_switch;
149 
150 
151  signal data_vme_from_below : arr_16(8 downto 0);
152  signal bus_drive_from_below : std_logic_vector(8 downto 0);
153 
154 
155 
156  component vme_outreg_notri is
157  generic (
158  ia_vme : integer;
159  width : integer);
160  port (
161  clk : in std_logic;
162  ncs : in std_logic;
163  rd_nwr : in std_logic;
164  ds : in std_logic;
165  addr_vme : in std_logic_vector (15 downto 0);
166  data_vme : out std_logic_vector (15 downto 0);
167  bus_drive : out std_logic;
168  data_to_vme : in std_logic_vector (width-1 downto 0);
169  read_detect : out std_logic);
170  end component vme_outreg_notri;
171 
173  generic (
174  ia_vme : integer;
175  width : integer);
176  port (
177  ncs : in std_logic;
178  rd_nwr : in std_logic;
179  ds : in std_logic;
180  addr_vme : in std_logic_vector (15 downto 0);
181  data_vme : out std_logic_vector (15 downto 0);
182  bus_drive : out std_logic;
183  data_to_vme : in std_logic_vector (width-1 downto 0));
184  end component vme_outreg_notri_async;
185 
186  component vme_inreg_notri is
187  generic (
188  ia_vme : integer;
189  width : integer);
190  port (
191  clk : in std_logic;
192  ncs : in std_logic;
193  rd_nwr : in std_logic;
194  ds : in std_logic;
195  addr_vme : in std_logic_vector (15 downto 0);
196  data_vme_in : in std_logic_vector (15 downto 0);
197  data_vme_out : out std_logic_vector (15 downto 0);
198  bus_drive : out std_logic;
199  data_from_vme : out std_logic_vector (width-1 downto 0);
200  data_to_vme : in std_logic_vector (width-1 downto 0);
201  read_detect : out std_logic;
202  write_detect : out std_logic);
203  end component vme_inreg_notri;
204 
206  generic (
207  ia_vme : integer;
208  width : integer);
209  port (
210  ncs : in std_logic;
211  rd_nwr : in std_logic;
212  ds : in std_logic;
213  addr_vme : in std_logic_vector (15 downto 0);
214  data_vme_in : in std_logic_vector (15 downto 0);
215  data_vme_out : out std_logic_vector (15 downto 0);
216  bus_drive : out std_logic;
217  data_from_vme : out std_logic_vector (width-1 downto 0);
218  data_to_vme : in std_logic_vector (width-1 downto 0));
219  end component vme_inreg_notri_async;
220 
221 
222 
223  --first "-1" because the clock line is skipped...
224  signal bit_error_detect: std_logic_vector(numbits_in_CTP_connector*2 - 1 downto 0);
225  signal bit_error_latch: std_logic_vector(numbits_in_CTP_connector*2 - 1 downto 0);
226  signal all_null : std_logic_vector(numbits_in_CTP_connector*2 - 1 downto 0);
227 
228  signal bit_error_counter: unsigned(31 downto 0);
229  signal bit_error_counter_next: unsigned(31 downto 0);
230 
231  signal data_to_vme_REG_RW_CTP_OUTPUT_COUNTER_RESET : std_logic_vector(15 downto 0);
232  signal data_from_vme_REG_RW_CTP_OUTPUT_COUNTER_RESET : std_logic_vector(15 downto 0);
233  signal counter_reset : std_logic;
234  signal counter_reset_unstretched : std_logic;
235  signal counter_reset_r : std_logic;
236  signal counter_reset_rr : std_logic;
237 
238 
239  signal data_to_vme_REG_RW_CTP_SPY_MEM_START_ADDRESS : std_logic_vector(15 downto 0);
240  signal data_from_vme_REG_RW_CTP_SPY_MEM_START_ADDRESS : std_logic_vector(15 downto 0);
241 
242  signal data_to_vme_reg_ro_ctp_spy_mem_check_error_0 : std_logic_vector(15 downto 0);
243  signal data_to_vme_reg_ro_ctp_spy_mem_check_error_1 : std_logic_vector(15 downto 0);
244  signal data_to_vme_reg_ro_ctp_spy_mem_check_error_2 : std_logic_vector(15 downto 0);
245  signal data_to_vme_reg_ro_ctp_spy_mem_check_error_3 : std_logic_vector(15 downto 0);
246 
247 
248 begin
249 
250 
251  all_null<= (others=>'0');
252 
253 
254  vme_local_switch_inst: entity work.vme_local_switch
255  port map (
260 
261 
263  generic map (
264  ia_vme => ADDR_REG_RW_CTP_OUTPUT_COUNTER_RESET ,
265  width => 16)
266  port map (
267  clk => buf_clk40 ,
268  ncs => ncs,
269  rd_nwr => rd_nwr,
270  ds => ds,
273  addr_vme => addr_vme,
274  read_detect => open,
279 
281 
283  port map (
286  clk => buf_clk40 );
287 
288 
289  CMX_generic_spy_mem_control_FSM_inst: entity work.CMX_generic_spy_mem_control_FSM
290  generic map (
291  ADDR_REG_RW_GENERIC_SPY_MEM_WORD => ADDR_REG_RW_CTP_SPY_MEM_WORD ,
292  ADDR_REG_RW_GENERIC_SPY_MEM_CONTROL => ADDR_REG_RW_CTP_SPY_MEM_CONTROL,
293  ADDR_REG_RO_GENERIC_SPY_MEM_STATUS => ADDR_REG_RO_CTP_SPY_MEM_STATUS,
294  num_external_RAMS => 1)
295  port map (
296  clk => buf_clk40,
297  ncs => ncs,
298  rd_nwr => rd_nwr,
299  ds => ds,
300  addr_vme => addr_vme,
305  ena => ena_CTP_SPY,
306  wea => wea_CTP_SPY(0),
307  addra => addra_CTP_SPY,
308  mem_select_address => open,
309  dina => dina_CTP_SPY,
310  douta => douta_CTP_SPY,
312 
313 
314 
316  generic map (
317  ia_vme => ADDR_REG_RW_CTP_SPY_MEM_START_ADDRESS,
318  width =>16)
319  port map (
320  ncs => ncs,
321  rd_nwr => rd_nwr,
322  ds => ds,
323  addr_vme => addr_vme,
329  );
331 
332 
333 
334 
335  --process to locally register the inhibit signal;
337  begin
338  if pll_locked/='1' then
339  spy_write_inhibit_r<='0';
340  elsif rising_edge(buf_clk40) then
342  end if;
343  end process;
344  process(buf_clk40)
345  begin
346  if rising_edge(buf_clk40) then
348  end if;
349  end process;
350 
351 
352 
353  blk_mem_A8x62_B8x62_CTP_SPY: blk_mem_A8x62_B8x62
354  port map (
355  clka => buf_clk40,
356  ena => ena_CTP_SPY,
357  wea => wea_CTP_SPY,
358  addra => addra_CTP_SPY,
359  dina => dina_CTP_SPY,
360  douta => douta_CTP_SPY,
361  clkb => buf_clk40,
362  enb => enb_CTP_SPY_inhibited,
363  web => web_CTP_SPY_inhibited,
364  addrb => addrb_CTP_SPY,
365  dinb => dinb_CTP_SPY,
366  doutb => doutb_CTP_SPY);
367 
368 
369  --data coming in from the adder module
370  dinb_CTP_SPY<= data;
371 
372 
373  addrb_CTP_SPY<=std_logic_vector(addrb_CTP_SPY_counter);
374 
375 
377  begin
378  if pll_locked/='1' then
379  start_playback_r<='0';
380  elsif rising_edge(buf_clk40) then
382  end if;
383  end process;
385  begin
386  if rising_edge(buf_clk40) then
387  --a local register (one copy for each of the memories)to ease timing
389  if start_playback_rr='0' then
391  else
392  addrb_CTP_SPY_counter<=unsigned(
394  end if;
395  end if;
396  end process;
397 
398  --create local registers for the master inhibit to aid timing closure
400  begin
401  if pll_locked='0' then
403  web_CTP_SPY_r<='0';
404  enb_CTP_SPY_r<='0';
405  elsif rising_edge(buf_clk40) then
409  end if;
411 
414 
415 
416 
417 
418  --this will make an error detection register that in turn will be used to
419  --generate a latch; also an no-error run length counter is made in this process
421  begin
422  if rising_edge(buf_clk40) then
423  if counter_reset_rr/='1' then
424  if bit_error_latch/=all_null or std_logic_vector(bit_error_counter)=x"ffffffff" then --bit_error_detect(i_mem_source)/=x"000000000000" or bit_error_counter(i_mem_source)/=to_unsigned(0,32) or std_logic_vector(bit_error_counter(i_mem_source))=x"ffffffff" then
426  else
428  end if;
429  else
430  bit_error_counter_next<=to_unsigned(0,32);
431  end if;
432 
433 
436  end if;
437  end process error_detect_process;
439  begin
440  if pll_locked/='1' then
441  data_r<=(others=>'0');
442  elsif rising_edge(buf_clk40) then
443  if mode_control_CTP_SPY /= CONST_DPR_CONTROL_PLAYBACK then
444  data_r<= not data;
445  else
446  data_r<=not doutb_CTP_SPY;
447  end if;
448  end if;
449  end process;
450 
451 
452  --connect the output data
453  --stupendous numbering scheme...
454  sdr_data_out(0)(30 downto 0)<=data_r(30 downto 0);
456  sdr_data_out(1)(30 downto 0)<=data_r(61 downto 31);
458 
459 
460 
461  --double register to close timing
462  process(buf_clk40)
463  begin
464  if rising_edge(buf_clk40) then
466  end if;
467  end process;
469  begin
470  if pll_locked/='1' then
471  counter_reset_r<='0';
472  elsif rising_edge(buf_clk40) then
474  end if;
475  end process;
476 
477 
478  gen_err_latch_bit: for i_bit in 0 to (numbits_in_CTP_connector*2 - 1) generate
479 
480 
481  --resettable 'latch' (so not really a latch) that is set if there is an error
482  --on a given bit
483  process(buf_clk40)
484  begin
485  if rising_edge(buf_clk40) then
486 
487  if counter_reset_rr/='1' then
488  if bit_error_detect(i_bit)='1' then
489  bit_error_latch(i_bit)<='1';
490  end if;
491  else
492  bit_error_latch(i_bit)<='0';
493  end if;
494 
495  end if;
496  end process;
497 
498  end generate gen_err_latch_bit;
499 
500  --assign latches as data to the registers
505  data_to_vme_REG_RO_CTP_SPY_MEM_CHECK_ERROR_3(15 downto 14)<=(others=>'0');
506 
507 
508 
510  generic map (
511  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_CHECK_ERROR+0,
512  width => 16)
513  port map (
514  addr_vme => addr_vme,
515  ncs => ncs,
516  rd_nwr => rd_nwr,
517  ds => ds,
521 
522 
524  generic map (
525  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_CHECK_ERROR+2,
526  width => 16)
527  port map (
528  addr_vme => addr_vme,
529  ncs => ncs,
530  rd_nwr => rd_nwr,
531  ds => ds,
535 
536 
538  generic map (
539  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_CHECK_ERROR+4,
540  width => 16)
541  port map (
542  addr_vme => addr_vme,
543  ncs => ncs,
544  rd_nwr => rd_nwr,
545  ds => ds,
549 
551  generic map (
552  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_CHECK_ERROR+6,
553  width => 16)
554  port map (
555  addr_vme => addr_vme,
556  ncs => ncs,
557  rd_nwr => rd_nwr,
558  ds => ds,
562 
563 
564 
566  generic map (
567  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_NOERROR_COUNTER,
568  width => 16)
569  port map (
570  addr_vme => addr_vme,
571  ncs => ncs,
572  rd_nwr => rd_nwr,
573  ds => ds,
574  data_to_vme => std_logic_vector(bit_error_counter(15 downto 0)),
577 
579  generic map (
580  ia_vme => ADDR_REG_RO_CTP_SPY_MEM_NOERROR_COUNTER+2,
581  width => 16)
582  port map (
583  addr_vme => addr_vme,
584  ncs => ncs,
585  rd_nwr => rd_nwr,
586  ds => ds,
587  data_to_vme => std_logic_vector(bit_error_counter(31 downto 16)),
590 
591 
592 
593 
594  --port enables - we enable B port when verifying, spying and playing back. Write
595  --is enabled only when spying
596  enb_CTP_SPY<='1' when mode_control_CTP_SPY=CONST_DPR_CONTROL_SPY
597  or mode_control_CTP_SPY=CONST_DPR_CONTROL_VERIFY
598  or mode_control_CTP_SPY=CONST_DPR_CONTROL_PLAYBACK
599  else '0';
600  web_CTP_SPY<='1' when mode_control_CTP_SPY=CONST_DPR_CONTROL_SPY else '0';
601 
602 
603 
604 
605 
606 end Behavioral;
607 
std_logic_vector (15 downto 0) data_to_vme_reg_ro_ctp_spy_mem_check_error_3
out read_detectstd_logic
local_buf_master_inhibit_systembuf_clk40,pll_locked
vme_inreg_notri vme_inreg_reg_rw_ctp_output_counter_resetvme_inreg_reg_rw_ctp_output_counter_reset
in addr_vmestd_logic_vector (15 downto 0)
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_check_error_1vme_outreg_reg_ro_ctp_spy_mem_check_error_1
out data_vmestd_logic_vector (15 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
out stretched_OUTstd_logic
Definition: Stretch_10.vhd:23
std_logic_vector (15 downto 0) data_from_vme_REG_RW_CTP_SPY_MEM_START_ADDRESS
std_logic_vector ((numbits_in_CTP_connector * 2) - 1 downto 0) dina_CTP_SPY)
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_check_error_3vme_outreg_reg_ro_ctp_spy_mem_check_error_3
std_logic_vector (15 downto 0) data_from_vme_REG_RW_CTP_OUTPUT_COUNTER_RESET
in addr_vmestd_logic_vector (15 downto 0)
out data_from_vmestd_logic_vector (width - 1 downto 0)
std_logic_vector (numbits_in_CTP_connector * 2 - 1 downto 0) all_null)
std_logic_vector (numbits_in_CTP_connector * 2 - 1 downto 0) bit_error_latch)
std_logic_vector ((numbits_in_CTP_connector * 2) - 1 downto 0) douta_CTP_SPY)
in data_vme_from_belowarr_16
--! inputs from local registers and from
out data_from_vmestd_logic_vector (width - 1 downto 0)
out data_vmestd_logic_vector (15 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
in data_vme_instd_logic_vector (15 downto 0)
out write_detectstd_logic
blk_mem_a8x62_b8x62 blk_mem_a8x62_b8x62_ctp_spyblk_mem_a8x62_b8x62_ctp_spy
in clkstd_logic
Definition: Stretch_10.vhd:24
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_noerror_counter_0vme_outreg_reg_ro_ctp_spy_mem_noerror_counter_0
std_logic_vector (0 downto 0) web_CTP_SPY_inhibited
std_logic_vector ((numbits_in_CTP_connector * 2) - 1 downto 0) data_r)
Stretch_10 stretch_10_counter_resetstretch_10_counter_reset
vme_inreg_notri_async vme_inreg_reg_rw_ctp_spy_mem_start_addressvme_inreg_reg_rw_ctp_spy_mem_start_address
in data_to_vmestd_logic_vector (width - 1 downto 0)
std_logic_vector (7 downto 0) addra_CTP_SPY
out data_vme_upstd_logic_vector (15 downto 0)
--! connect this to
in datastd_logic_vector ((numbits_in_CTP_connector * 2) - 1 downto 0)
std_logic_vector (7 downto 0) addrb_CTP_SPY
in addr_vmestd_logic_vector (15 downto 0)
std_logic_vector (15 downto 0) data_to_vme_REG_RW_CTP_OUTPUT_COUNTER_RESET
in data_to_vmestd_logic_vector (width - 1 downto 0)
out bus_drive_upstd_logic
or of all bus drive requests from below
std_logic_vector (15 downto 0) data_to_vme_REG_RW_CTP_SPY_MEM_START_ADDRESS
out mem_select_addressstd_logic_vector (addr_port_width (num_external_RAMS) - 1 downto 0)
std_logic_vector (3 downto 0) mode_control_CTP_SPY
std_logic_vector (15 downto 0) data_to_vme_reg_ro_ctp_spy_mem_check_error_2
in addr_vmestd_logic_vector (15 downto 0)
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_check_error_2vme_outreg_reg_ro_ctp_spy_mem_check_error_2
in data_to_vmestd_logic_vector (width - 1 downto 0)
unsigned (31 downto 0) bit_error_counter_next
out data_vme_outstd_logic_vector (15 downto 0)
std_logic_vector (8 downto 0) bus_drive_from_below
in data_vme_instd_logic_vector (15 downto 0)
std_logic_vector (15 downto 0) data_to_vme_reg_ro_ctp_spy_mem_check_error_1
std_logic_vector (61 downto 0) dinb_CTP_SPY
std_logic_vector (numbits_in_CTP_connector * 2 - 1 downto 0) bit_error_detect)
std_logic_vector (61 downto 0) doutb_CTP_SPY
out bus_drivestd_logic
in addr_vmestd_logic_vector (15 downto 0)
test registers
std_logic_vector (15 downto 0) data_to_vme_reg_ro_ctp_spy_mem_check_error_0
std_logic_vector (0 downto 0) wea_CTP_SPY
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_noerror_counter_1vme_outreg_reg_ro_ctp_spy_mem_noerror_counter_1
in data_vme_instd_logic_vector (15 downto 0)
out read_detectstd_logic
in data_to_vmestd_logic_vector (width - 1 downto 0)
in unstretched_INstd_logic
Definition: Stretch_10.vhd:22
vme_outreg_notri_async vme_outreg_reg_ro_ctp_spy_mem_check_error_0vme_outreg_reg_ro_ctp_spy_mem_check_error_0
in bus_drive_from_belowstd_logic_vector