1 ---------------------------------------
12 use IEEE.STD_LOGIC_1164.
ALL;
29 --there are so that we can parametrize the
30 --width of the mem_select_address port
35 ncs : in ;
--vme ports
44 --running; modes can be
45 --CONST_DPR_CONTROL_SPY,
46 --CONST_DPR_CONTROL_PLAYBACK,
47 --CONST_DPR_CONTROL_VERIFY
50 --will be interpreted by
53 --determine the data flow
55 --memory steering ports
66 --this should be used to inhibit enb web when memory is being written to or
67 --read from vme on port a, high->inhibit, low->mode_control operation
70 end CMX_generic_spy_mem_control_FSM;
74 --width of the memory port
78 --we need to take the ceiling of the division so that a whole extra word is
79 --allocated to the VME space if the memory port width does not divide neatly
83 --the number of reminder bits
86 --this is the width of the memory select address which is uncorrected
87 --it is 0 if we have just one external RAM
90 --as above maxed out at 5 (to use in the status word as width of the portion
91 --of the global address repoted on the VME)
94 --the maximum value of the global counter plus one.
95 --Note that we need that extra bit for the FSM opperation
100 --released, no reads or writes from vme
101 s_inhibit_init, --after r/w request we
103 --inhibit for 2 cycles
104 --so it can be propagated to
106 s_wait_for_vme_write, -- write has been
107 -- requested, FSM waits
108 -- for data writes from VME
109 s_writing_ram, --all data words have been
110 --written to VME, uploading to RAM
111 s_reading_ram, --read has been requested,
113 s_wait_for_vme_read --data has been read from
114 --RAM and presented to VME,
115 --waiting for SW to read it
203 --six sets of signals for the data registers
209 --control register signals
216 --signal read_detect_REG_RO_GENERIC_SPY_MEM_STATUS : std_logic;
219 --the status register
222 --counter specifying the memory that will be written to (upper bits) and the address
224 --all spy memories store 256 events (so address width is 8)
225 -- +bits needed to address the external memories
226 -- +extra bit needed for the FSM logic
240 --component chipscope_icon_u2_c1
242 -- CONTROL0 : inout std_logic_vector(35 downto 0));
245 --signal CONTROL0 : std_logic_vector(35 downto 0);
247 --component chipscope_ila_CMX_generic_spy_mem_control_FSM
249 -- CONTROL : inout std_logic_vector(35 downto 0);
250 -- CLK : in std_logic;
251 -- DATA : in std_logic_vector(260 downto 0);
252 -- TRIG0 : in std_logic_vector(15 downto 0));
256 --signal DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM : std_logic_vector(260 downto 0);
257 --signal TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM : std_logic_vector(15 downto 0);
261 --XST should give an error if we supplied vectors of different lengths
262 assert (dina'length = douta'length ) report "memory port lengths not equal" severity failure;
266 --instantiate VME registers
282 vme_data_word_reg_gen: for word_i in 0 to num_words-1 generate
286 ia_vme => ADDR_REG_RW_GENERIC_SPY_MEM_WORD+
(2*word_i
),
302 --connect the output from RAM to VME for reading by SW
303 full_register: if num_rem_bits = 0 generate --the width of the data breaks
304 --cleanly into 16 bit words
305 -- simply assign memory output to VME
308 end generate full_register;
309 partial_register: if num_rem_bits /= 0 generate --the memory width does not
311 lower_words: if word_i < (num_words-1) generate
312 --lower words - just assign a range of data to register as above
315 end generate lower_words;
316 upper_words: if word_i = (num_words-1) generate
317 --last word fill lower bits with whatsever is left from the data port
319 --for input just ignore the upper bits
323 end generate upper_words;
324 end generate partial_register;
326 end generate vme_data_word_reg_gen;
359 --read_detect => read_detect_REG_RO_GENERIC_SPY_MEM_STATUS);
362 --interpretation of portions of VME registers and connection to output ports
363 --status register: top 3 bits is the status
365 --remaining bits is the global address counter. If we are controlling more
366 --than 32 RAMS (unlikely) only the lower 5 bits will be presented on the
372 end generate gen_vme_status_word_padding;
377 --the value of the port should be ignored
378 end generate gen_mem_select_addr_dummy;
381 --more RAMs to control; note that the 'extra' -1 is there since the width
382 --of the global address is extended by one bit for the FSM control so we
383 --need to subtract this here
385 end generate gen_mem_select_addr_proper;
392 --for the control register data to read is simply the data written
395 -- -- --data to/from vme is connected to data from/to RAM
396 -- -- dina_sig<=data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(5) & data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(4) &
397 -- -- data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(3) & data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(2) &
398 -- -- data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(1) & data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD(0);
399 -- -- --data_to_vme... was constructed in the generate loop above
401 --update state on clock edge
404 if rising_edge(clk) then
405 --if state_next=s_writing_ram or (state_next=s_wait_for_vme_read and state_reg=s_reading_ram) then
406 -- if global_addr_counter=to_unsigned(256*numactchan,13) then
407 -- global_addr_counter<=to_unsigned(0,13);
409 -- global_addr_counter<=global_addr_counter_next;
412 -- global_addr_counter<=global_addr_counter;--to_unsigned(0,13);
429 --addra<=(others=>'0');
430 --global_addr_counter<=(others=>'0');
443 when s_inhibit_init =>
451 when s_wait_for_vme_write =>
463 when s_writing_ram =>
473 when s_reading_ram =>
479 when s_wait_for_vme_read =>
500 -- process (state_reg)
502 -- counter_enable<='0';
504 -- when s_counter_running =>
505 -- counter_enable<='1';
506 -- when s_counter_stopped =>
507 -- counter_enable<='0';
508 -- when others => null;
514 --chipscope_ila_CMX_generic_spy_mem_control_FSM_inst: chipscope_ila_CMX_generic_spy_mem_control_FSM
516 -- CONTROL => CONTROL0,
518 -- DATA => DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM,
519 -- TRIG0 => TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM);
522 --chipscope_icon_u2_c1_inst: chipscope_icon_u2_c1
524 -- CONTROL0 => CONTROL0);
526 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(0)<=op_request;
527 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(1)<=rw_request;
528 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(2)<=write_detect_REG_RW_GENERIC_SPY_MEM_CONTROL;
529 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(8 downto 3)<=read_detect_REG_RW_GENERIC_SPY_MEM_WORD;
530 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(14 downto 9)<=write_detect_REG_RW_GENERIC_SPY_MEM_WORD;
531 --TRIG0_chipscope_ila_CMX_generic_spy_mem_control_FSM(15)<=ds;
534 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(0)<=op_request;
535 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(1)<=rw_request;
536 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(2)<=write_detect_REG_RW_GENERIC_SPY_MEM_CONTROL;
537 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(8 downto 3)<=read_detect_REG_RW_GENERIC_SPY_MEM_WORD;
538 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(14 downto 9)<=write_detect_REG_RW_GENERIC_SPY_MEM_WORD;
539 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(27 downto 15)<=std_logic_vector(global_addr_counter);
540 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(31 downto 28)<=status_summary;
541 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(32)<=ena_sig;
542 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(33)<=wea_sig;
543 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(129 downto 34)<=douta;
544 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(225 downto 130)<=dina_sig;
545 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(226)<=ds;
546 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(227)<=rd_nwr;
547 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(243 downto 228)<=addr_vme;
548 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(259 downto 244)<=data_vme;
549 --DATA_chipscope_ila_CMX_generic_spy_mem_control_FSM(260)<=port_b_master_inhibit_sig;
vme_inreg_notri vme_inreg_reg_rw_generic_spy_mem_wordvme_inreg_reg_rw_generic_spy_mem_word
std_logic_vector (num_words - 1 downto 0) write_detect_REG_RW_GENERIC_SPY_MEM_WORD
std_logic_vector (15 downto 0) data_to_vme_REG_RW_GENERIC_SPY_MEM_CONTROL
ADDR_REG_RW_GENERIC_SPY_MEM_WORDinteger :=0
std_logic port_b_master_inhibit_sig
in addr_vmestd_logic_vector (15 downto 0)
out data_vmestd_logic_vector (15 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
ADDR_REG_RW_GENERIC_SPY_MEM_CONTROLinteger :=0
std_logic_vector (2 downto 0) status_summary
arr_16 (num_words - 1 downto 0) data_to_vme_REG_RW_GENERIC_SPY_MEM_WORD
std_logic_vector (15 downto 0) data_to_vme_REG_RO_GENERIC_SPY_MEM_STATUS
out data_from_vmestd_logic_vector (width - 1 downto 0)
natural :=imin (5 ,mem_select_width_uncorr) mem_select_width_uncorr_trunc
ADDR_REG_RO_GENERIC_SPY_MEM_STATUSinteger :=0
in data_vme_from_belowarr_16
--! inputs from local registers and from
out data_from_vmestd_logic_vector (width - 1 downto 0)
unsigned (8 + mem_select_width_uncorr downto 0) global_addr_counter
out data_vme_outstd_logic_vector (15 downto 0)
out data_vmestd_logic_vector (15 downto 0)
in data_vme_instd_logic_vector (15 downto 0)
out port_b_master_inhibitstd_logic
out addrastd_logic_vector (7 downto 0)
out write_detectstd_logic
std_logic read_detect_REG_RW_GENERIC_SPY_MEM_CONTROL
unsigned (8 + mem_select_width_uncorr downto 0) global_addr_counter_next
num_external_RAMSpositive :=1
natural :=ceil_log_2 (num_external_RAMS) mem_select_width_uncorr
in addr_vmestd_logic_vector (15 downto 0)
( s_standby ,s_inhibit_init ,s_wait_for_vme_write ,s_writing_ram ,s_reading_ram ,s_wait_for_vme_read ) state_spy_mem_control_type
std_logic_vector (data_length - 1 downto 0) dina_sig
in data_to_vmestd_logic_vector (width - 1 downto 0)
state_spy_mem_control_type state_reg
integer :=dina' length data_length
out data_vme_upstd_logic_vector (15 downto 0)
--! connect this to
vme_inreg_notri vme_inreg_reg_rw_generic_spy_mem_controlvme_inreg_reg_rw_generic_spy_mem_control
in addr_vmestd_logic_vector (15 downto 0)
arr_16 (num_words + 1 downto 0) data_vme_from_below
in data_to_vmestd_logic_vector (width - 1 downto 0)
out bus_drive_upstd_logic
or of all bus drive requests from below
out mem_select_addressstd_logic_vector (addr_port_width (num_external_RAMS) - 1 downto 0)
unsigned :=to_unsigned (256 * num_external_RAMS ,mem_select_width_uncorr + 1 + 8 global_addr_counter_limit)
state_spy_mem_control_type state_next
in addr_vmestd_logic_vector (15 downto 0)
vme_outreg_notri_async vme_outreg_reg_ro_generic_spy_mem_statusvme_outreg_reg_ro_generic_spy_mem_status
unsigned (0 downto 0) inhibit_init_counter
in data_to_vmestd_logic_vector (width - 1 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
integer :=data_length rem 16 num_rem_bits
in addr_vmestd_logic_vector (15 downto 0)
in data_vme_instd_logic_vector (15 downto 0)
arr_16 (num_words - 1 downto 0) data_from_vme_REG_RW_GENERIC_SPY_MEM_WORD
std_logic write_detect_REG_RW_GENERIC_SPY_MEM_CONTROL
in data_vme_instd_logic_vector (15 downto 0)
integer :=integer (ceil (real (data_length) / real (16))) num_words
in data_to_vmestd_logic_vector (width - 1 downto 0)
std_logic_vector (num_words - 1 downto 0) read_detect_REG_RW_GENERIC_SPY_MEM_WORD
out mode_controlstd_logic_vector (3 downto 0)
std_logic_vector (num_words + 1 downto 0) bus_drive_from_below
in bus_drive_from_belowstd_logic_vector
std_logic_vector (15 downto 0) data_from_vme_REG_RW_GENERIC_SPY_MEM_CONTROL