]> jspc29.x-matter.uni-frankfurt.de Git - adcm.git/commitdiff
*** empty log message ***
authorhadaq <hadaq>
Thu, 28 Jan 2010 10:26:09 +0000 (10:26 +0000)
committerhadaq <hadaq>
Thu, 28 Jan 2010 10:26:09 +0000 (10:26 +0000)
226 files changed:
ADCM_slave_bus.txt [new file with mode: 0755]
lookup_adc.txt [new file with mode: 0755]
src/adc_apv_map_mem.lpc [new file with mode: 0644]
src/adc_apv_map_mem.srp [new file with mode: 0644]
src/adc_apv_map_mem.vhd [new file with mode: 0644]
src/adc_apv_map_mem_generate.log [new file with mode: 0644]
src/adc_apv_map_mem_tmpl.vhd [new file with mode: 0644]
src/adc_apv_mapping.mem [new file with mode: 0644]
src/adc_ch_in.lpc [new file with mode: 0644]
src/adc_ch_in.srp [new file with mode: 0644]
src/adc_ch_in.vhd [new file with mode: 0644]
src/adc_ch_in_tmpl.vhd [new file with mode: 0644]
src/adc_channel_select.vhd [new file with mode: 0644]
src/adc_crossover.vhd [new file with mode: 0644]
src/adc_data_handler_new.vhd [new file with mode: 0644]
src/adc_onewire_map_mem.lpc [new file with mode: 0644]
src/adc_onewire_map_mem.srp [new file with mode: 0644]
src/adc_onewire_map_mem.vhd [new file with mode: 0644]
src/adc_onewire_map_mem_generate.log [new file with mode: 0644]
src/adc_onewire_map_mem_tmpl.vhd [new file with mode: 0644]
src/adc_onewire_mapping.mem [new file with mode: 0644]
src/adc_pll.lpc [new file with mode: 0644]
src/adc_pll.vhd [new file with mode: 0644]
src/adc_pll_tmpl.vhd [new file with mode: 0644]
src/adc_snoop_mem.lpc [new file with mode: 0644]
src/adc_snoop_mem.srp [new file with mode: 0644]
src/adc_snoop_mem.vhd [new file with mode: 0644]
src/adc_snoop_mem_generate.log [new file with mode: 0644]
src/adc_snoop_mem_tmpl.vhd [new file with mode: 0644]
src/adc_twochannels.vhd [new file with mode: 0644]
src/adcmv3.vhd [new file with mode: 0755]
src/adcmv3_components.vhd [new file with mode: 0755]
src/adder_16bit.lpc [new file with mode: 0644]
src/adder_16bit.vhd [new file with mode: 0644]
src/adder_16bit_tmpl.vhd [new file with mode: 0644]
src/adder_5bit.lpc [new file with mode: 0644]
src/adder_5bit.vhd [new file with mode: 0644]
src/adder_5bit_tmpl.vhd [new file with mode: 0644]
src/adder_6bit.lpc [new file with mode: 0644]
src/adder_6bit.vhd [new file with mode: 0644]
src/adder_6bit_tmpl.vhd [new file with mode: 0644]
src/apv_adc_map_mem.lpc [new file with mode: 0644]
src/apv_adc_map_mem.srp [new file with mode: 0644]
src/apv_adc_map_mem.vhd [new file with mode: 0644]
src/apv_adc_map_mem_generate.log [new file with mode: 0644]
src/apv_adc_map_mem_tmpl.vhd [new file with mode: 0644]
src/apv_adc_mapping.mem [new file with mode: 0644]
src/apv_digital.vhd [new file with mode: 0755]
src/apv_lock_sm.vhd [new file with mode: 0755]
src/apv_locker.vhd [new file with mode: 0755]
src/apv_map_mem.lpc [new file with mode: 0644]
src/apv_map_mem.srp [new file with mode: 0644]
src/apv_map_mem.vhd [new file with mode: 0644]
src/apv_map_mem_generate.log [new file with mode: 0644]
src/apv_map_mem_tmpl.vhd [new file with mode: 0644]
src/apv_mapping.mem [new file with mode: 0644]
src/apv_pc_nc_alu.vhd [new file with mode: 0644]
src/apv_raw_buffer.vhd [new file with mode: 0755]
src/apv_sync_handler.vhd [new file with mode: 0644]
src/apv_trg_handler.vhd [new file with mode: 0644]
src/apv_trgctrl.vhd [new file with mode: 0644]
src/buf_toc.vhd [new file with mode: 0644]
src/comp14bit.lpc [new file with mode: 0644]
src/comp14bit.vhd [new file with mode: 0644]
src/comp14bit_tmpl.vhd [new file with mode: 0644]
src/comp4bit.lpc [new file with mode: 0644]
src/comp4bit.srp [new file with mode: 0644]
src/comp4bit.vhd [new file with mode: 0644]
src/comp4bit_generate.log [new file with mode: 0644]
src/comp4bit_tmpl.vhd [new file with mode: 0644]
src/crossover.lpc [new file with mode: 0644]
src/crossover.srp [new file with mode: 0644]
src/crossover.vhd [new file with mode: 0644]
src/crossover_generate.log [new file with mode: 0644]
src/crossover_tmpl.vhd [new file with mode: 0644]
src/decoder_8bit.lpc [new file with mode: 0644]
src/decoder_8bit.mem [new file with mode: 0644]
src/decoder_8bit.vhd [new file with mode: 0644]
src/decoder_8bit_tmpl.vhd [new file with mode: 0644]
src/dhdr_buf.vhd [new file with mode: 0644]
src/dhdr_buffer_dpram.lpc [new file with mode: 0644]
src/dhdr_buffer_dpram.vhd [new file with mode: 0644]
src/dhdr_buffer_dpram_tmpl.vhd [new file with mode: 0644]
src/dll_100m.lpc [new file with mode: 0644]
src/dll_100m.vhd [new file with mode: 0644]
src/dll_100m_tmpl.vhd [new file with mode: 0644]
src/dpram_8x19.lpc [new file with mode: 0644]
src/dpram_8x19.srp [new file with mode: 0644]
src/dpram_8x19.vhd [new file with mode: 0644]
src/dpram_8x19_generate.log [new file with mode: 0644]
src/dpram_8x19_tmpl.vhd [new file with mode: 0644]
src/eds_buf.vhd [new file with mode: 0644]
src/eds_buffer_dpram.lpc [new file with mode: 0644]
src/eds_buffer_dpram.vhd [new file with mode: 0644]
src/eds_buffer_dpram_tmpl.vhd [new file with mode: 0644]
src/fifo_16x11.lpc [new file with mode: 0644]
src/fifo_16x11.vhd [new file with mode: 0644]
src/fifo_16x11_tmpl.vhd [new file with mode: 0644]
src/fifo_2kx27.lpc [new file with mode: 0644]
src/fifo_2kx27.vhd [new file with mode: 0644]
src/fifo_2kx27_tmpl.vhd [new file with mode: 0644]
src/frame_status_mem.lpc [new file with mode: 0644]
src/frame_status_mem.srp [new file with mode: 0644]
src/frame_status_mem.vhd [new file with mode: 0644]
src/frame_status_mem_generate.log [new file with mode: 0644]
src/frame_status_mem_tmpl.vhd [new file with mode: 0644]
src/frmctr_check.vhd [new file with mode: 0755]
src/i2c_gstart.vhd [new file with mode: 0644]
src/i2c_master.vhd [new file with mode: 0644]
src/i2c_sendb.vhd [new file with mode: 0644]
src/i2c_slim.vhd [new file with mode: 0644]
src/input_bram.lpc [new file with mode: 0644]
src/input_bram.srp [new file with mode: 0644]
src/input_bram.vhd [new file with mode: 0644]
src/input_bram_generate.log [new file with mode: 0644]
src/input_bram_tmpl.vhd [new file with mode: 0644]
src/ipu_fifo_stage.vhd [new file with mode: 0644]
src/logic_analyzer.vhd [new file with mode: 0644]
src/max_data.vhd [new file with mode: 0644]
src/msg_file.log [new file with mode: 0644]
src/mult_3x8.lpc [new file with mode: 0644]
src/mult_3x8.srp [new file with mode: 0644]
src/mult_3x8.vhd [new file with mode: 0644]
src/mult_3x8_generate.log [new file with mode: 0644]
src/mult_3x8_tmpl.vhd [new file with mode: 0644]
src/my_sbuf.vhd [new file with mode: 0644]
src/onewire_master.vhd [new file with mode: 0644]
src/onewire_spare_one.lpc [new file with mode: 0644]
src/onewire_spare_one.srp [new file with mode: 0644]
src/onewire_spare_one.vhd [new file with mode: 0644]
src/onewire_spare_one_generate.log [new file with mode: 0644]
src/onewire_spare_one_tmpl.vhd [new file with mode: 0644]
src/ped_corr_ctrl.vhd [new file with mode: 0755]
src/ped_thr_mem.mem [new file with mode: 0644]
src/ped_thr_true.lpc [new file with mode: 0644]
src/ped_thr_true.srp [new file with mode: 0644]
src/ped_thr_true.vhd [new file with mode: 0644]
src/ped_thr_true_tmpl.vhd [new file with mode: 0644]
src/pll_40m.lpc [new file with mode: 0644]
src/pll_40m.vhd [new file with mode: 0644]
src/pll_40m_tmpl.vhd [new file with mode: 0644]
src/pulse_stretch.vhd [new file with mode: 0644]
src/pulse_sync.vhd [new file with mode: 0644]
src/raw_buf_stage_new.vhd [new file with mode: 0755]
src/real_trg_handler.vhd [new file with mode: 0755]
src/reboot_handler.vhd [new file with mode: 0644]
src/ref_row_sel.vhd [new file with mode: 0755]
src/replacement.vhd [new file with mode: 0755]
src/reset_handler.vhd [new file with mode: 0644]
src/rich_trb.vhd [new file with mode: 0755]
src/slave_bus.vhd [new file with mode: 0644]
src/slv_adc_la.vhd [new file with mode: 0644]
src/slv_adc_snoop.vhd [new file with mode: 0644]
src/slv_half_register.vhd [new file with mode: 0644]
src/slv_memory_true.vhd [new file with mode: 0644]
src/slv_onewire_dpram.lpc [new file with mode: 0644]
src/slv_onewire_dpram.srp [new file with mode: 0644]
src/slv_onewire_dpram.vhd [new file with mode: 0644]
src/slv_onewire_dpram_generate.log [new file with mode: 0644]
src/slv_onewire_dpram_tmpl.vhd [new file with mode: 0644]
src/slv_onewire_memory.vhd [new file with mode: 0644]
src/slv_ped_thr_mem.vhd [new file with mode: 0644]
src/slv_register.vhd [new file with mode: 0644]
src/slv_register_bank.vhd [new file with mode: 0644]
src/spare_onewire_mapping.mem [new file with mode: 0644]
src/spi_adc_master.vhd [new file with mode: 0644]
src/spi_real_slim.vhd [new file with mode: 0644]
src/state_sync.vhd [new file with mode: 0644]
src/suber_12bit.lpc [new file with mode: 0644]
src/suber_12bit.srp [new file with mode: 0644]
src/suber_12bit.vhd [new file with mode: 0644]
src/suber_12bit_generate.log [new file with mode: 0644]
src/suber_12bit_tmpl.vhd [new file with mode: 0644]
src/tb_adc_apv_map_mem_tmpl.vhd [new file with mode: 0644]
src/tb_adc_cross.vhd [new file with mode: 0644]
src/tb_adc_crossover.vhd [new file with mode: 0644]
src/tb_adc_handler.vhd [new file with mode: 0644]
src/tb_adc_handler_OLD.vhd [new file with mode: 0644]
src/tb_adc_handler_new.vhd [new file with mode: 0644]
src/tb_adc_onewire_map_mem_tmpl.vhd [new file with mode: 0644]
src/tb_apv_adc_map_mem_tmpl.vhd [new file with mode: 0644]
src/tb_apv_locker.vhd [new file with mode: 0755]
src/tb_apv_map_mem_tmpl.vhd [new file with mode: 0644]
src/tb_apv_trgctrl.vhd [new file with mode: 0755]
src/tb_comp4bit_tmpl.vhd [new file with mode: 0644]
src/tb_crossfifo.vhd [new file with mode: 0644]
src/tb_crossfifo_tmpl.vhd [new file with mode: 0644]
src/tb_crossover.vhd [new file with mode: 0644]
src/tb_crossover_tmpl.vhd [new file with mode: 0644]
src/tb_dpram_8x19_tmpl.vhd [new file with mode: 0644]
src/tb_ipu_fifo_stage.vhd [new file with mode: 0644]
src/tb_ipu_fifo_stage_OLD.vhd [new file with mode: 0644]
src/tb_logic_analyzer.vhd [new file with mode: 0644]
src/tb_max_data.vhd [new file with mode: 0644]
src/tb_mult_3x8.vhd [new file with mode: 0644]
src/tb_mult_3x8_tmpl.vhd [new file with mode: 0644]
src/tb_my_sbuf.vhd [new file with mode: 0644]
src/tb_onewire_master.vhd [new file with mode: 0644]
src/tb_onewire_spare_one_tmpl.vhd [new file with mode: 0644]
src/tb_ped_corr_ctrl.vhd [new file with mode: 0644]
src/tb_pulse_stretch.vhd [new file with mode: 0644]
src/tb_raw_buf_stage.vhd [new file with mode: 0644]
src/tb_raw_buf_stage_new.vhd [new file with mode: 0755]
src/tb_real_trg_handler.vhd [new file with mode: 0644]
src/tb_reboot_handler.vhd [new file with mode: 0644]
src/tb_reset_handler.vhd [new file with mode: 0644]
src/tb_slv_adc_la.vhd [new file with mode: 0644]
src/tb_slv_adc_snoop.vhd [new file with mode: 0644]
src/tb_slv_onewire_memory.vhd [new file with mode: 0644]
src/tb_slv_ped_thr_mem.vhd [new file with mode: 0644]
src/tb_slv_register_bank.vhd [new file with mode: 0644]
src/tb_spi_master.vhd [new file with mode: 0644]
src/tb_spi_real_slim.vhd [new file with mode: 0644]
src/tb_suber_12bit_tmpl.vhd [new file with mode: 0644]
src/tb_trb_net16_ibuf2.vhd [new file with mode: 0755]
src/tb_trb_net_sbuf2.vhd [new file with mode: 0644]
src/tb_trb_net_sbuf3.vhd [new file with mode: 0755]
src/test_fifo.lpc [new file with mode: 0755]
src/test_fifo.vhd [new file with mode: 0755]
src/test_fifo_tmpl.vhd [new file with mode: 0755]
src/testfifo.lpc [new file with mode: 0644]
src/testfifo.vhd [new file with mode: 0644]
src/testfifo_tmpl.vhd [new file with mode: 0644]
src/trb_net_sbuf2.vhd [new file with mode: 0644]
src/trb_net_sbuf3.vhd [new file with mode: 0755]
src/version.vhd [new file with mode: 0644]

diff --git a/ADCM_slave_bus.txt b/ADCM_slave_bus.txt
new file mode 100755 (executable)
index 0000000..5b7d5b7
--- /dev/null
@@ -0,0 +1,355 @@
+Slave bus usage\r
+===============\r
+\r
+0x8000 - 0x8001  : test register\r
+\r
+0x8040 - 0x8040 X: I2C master for APV slow control\r
+\r
+0xa000 - 0xa07f  : pedestal memory APV0\r
+0xa080 - 0xa0ff  : pedestal memory APV1\r
+0xa100 - 0xa17f  : pedestal memory APV2\r
+0xa180 - 0xa1ff  : pedestal memory APV3\r
+0xa200 - 0xa27f  : pedestal memory APV4\r
+0xa280 - 0xa2ff  : pedestal memory APV5\r
+0xa300 - 0xa37f  : pedestal memory APV6\r
+0xa380 - 0xa3ff  : pedestal memory APV7\r
+0xa400 - 0xa47f  : pedestal memory APV8\r
+0xa480 - 0xa4ff  : pedestal memory APV9\r
+0xa500 - 0xa57f  : pedestal memory APV10\r
+0xa580 - 0xa5ff  : pedestal memory APV11\r
+0xa600 - 0xa67f  : pedestal memory APV12\r
+0xa680 - 0xa6ff  : pedestal memory APV13\r
+0xa700 - 0xa77f  : pedestal memory APV14\r
+0xa780 - 0xa7ff  : pedestal memory APV15\r
+\r
+0xa800 - 0xa87f  : threshold memory APV0\r
+0xa880 - 0xa8ff  : threshold memory APV1\r
+0xa900 - 0xa97f  : threshold memory APV2\r
+0xa980 - 0xa9ff  : threshold memory APV3\r
+0xaa00 - 0xaa7f  : threshold memory APV4\r
+0xaa80 - 0xaaff  : threshold memory APV5\r
+0xab00 - 0xab7f  : threshold memory APV6\r
+0xab80 - 0xabff  : threshold memory APV7\r
+0xac00 - 0xac7f  : threshold memory APV8\r
+0xac80 - 0xacff  : threshold memory APV9\r
+0xad00 - 0xad7f  : threshold memory APV10\r
+0xad80 - 0xadff  : threshold memory APV11\r
+0xae00 - 0xae7f  : threshold memory APV12\r
+0xae80 - 0xaeff  : threshold memory APV13\r
+0xaf00 - 0xaf7f  : threshold memory APV14\r
+0xaf80 - 0xafff  : threshold memory APV15\r
+\r
+0xb000 - 0xb00f X: APV control and status\r
+\r
+0xb010 - 0xb010 X: ADC level settings\r
+\r
+0xb020 - 0xb020 X: trigger settings\r
+\r
+0xb030 - 0xb030 X: PLL settings\r
+\r
+0xc000 - 0xc03f X: 1Wire master for APV and backplane\r
+\r
+0xd000 - 0xd001 X: SPI master for FlashROM\r
+\r
+0xd010 - 0xd010 X: ADC0 control and SPI\r
+\r
+0xd020 - 0xd020 X: ADC1 control and SPI\r
+\r
+0xd100 - 0xd03f X: SPI data memory (FlashROM)\r
+\r
+0xf000 - 0xf3ff  : ADC 0 snooper\r
+\r
+0xf400 - 0xf7ff  : ADC 1 snooper\r
+\r
+\r
+==========================================================================\r
+== Detailed description\r
+==========================================================================\r
+\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# SPI master for ADC slow control, ADC configuration bits, APV reset            #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xd010 - 0xd010  : ADC0 control and SPI\r
+0xd020 - 0xd020  : ADC0 control and SPI\r
+---------------------------------------\r
+\r
+D[31:24]  SPI command\r
+D[23:12]  ADC channel 4 current data for testing\r
+D[11:9]   reserved\r
+D[8]      ADC PLL status   0 -> bad, 1 -> locked\r
+D[7:4]    ADC input delay (0x6 is standard)\r
+D[3]      SPI start        0 -> wait, 1 -> start\r
+D[2]      APV reset        0 -> normal, 1 -> reset\r
+D[1]      ADC power down   0 -> normal, 1 -> powerdown\r
+D[0]      ADC reset        0 -> normal, 1 -> reset\r
+\r
+This register is 32bit wide with full read/write access. \r
+It controls a simple (one byte only) SPI master for configuring the ADC via SPI.\r
+Besides it allows to reset the ADC, power it down and also reset the connected \r
+APVs (eight modules).\r
+\r
+Take care not to change bits unintentionally when working with this register.\r
+A read-modify-write sequence is mandatory.\r
+\r
+\r
+SPI access to ADC is handled as following:\r
+\r
+(1) be sure that SPI start bit D[16] is zero\r
+(2) read register and set D[31:24] to the command to be sent\r
+(3) write back new value with SPI start bit set\r
+(4) clear the SPI start bit\r
+\r
+The SPI hardware access is 25MHz based and will be over before next TRBnet access\r
+to this register is possible. This SPI master can only transfer command to the ADC, \r
+and not read back (due to ADC constraints).\r
+\r
+\r
+Reset value of register is 0x00000060. \r
+\r
+#################################################################################\r
+#                                                                               #\r
+# APV control and status register                                               #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xb000 - 0xb00f  : APV control and status\r
+-----------------------------------------\r
+\r
+D[31]     buffer good      1 -> APV switched on and sync'ed\r
+D[30]     buffer broken    1 -> APV switched on and off sync\r
+D[29]     buffer ignore    1 -> APV not used\r
+D[28:24]  number of events in buffer\r
+D[23:20]  reserved\r
+D[19:16]  hardware APV number before mapping([15:8] -> ADC1, [7:0] -> ADC0)\r
+D[15:1]   reserved\r
+D[0]      APV on           0 -> off, 1 -> on\r
+\r
+This register is divided into read only bits (D[31:16]) and read/write bits (D[15:0]).\r
+\r
+APV on bit (D[0]) is on by default.\r
+D[31] (buffer good) will only be set if the APV is switched on and a SYNC trigger has\r
+been sent.\r
+To activate an APV it is mandatory to set APV on bit (D[0]) and send a SYNC trigger.\r
+\r
+\r
+Reset value of register is 0xZZZZ0001 (Z depends on APV connections).\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# configuration register for ADC levels (bit recognition)                       #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xb010 - 0xb010  : ADC level settings\r
+-------------------------------------\r
+\r
+D[31:24]  bit high  D[11:4] setting, D[3:0] is fixed to 0x0\r
+D[23:16]  bit low   D[11:4] setting, D[3:0] is fixed to 0x0\r
+D[15:8]   flat high D[11:4] setting, D[3:0] is fixed to 0x0\r
+D[7:0]    flat low  D[11:4] setting, D[3:0] is fixed to 0x0\r
+\r
+This register is 32bit wide with full read/write access. \r
+It is used to configure the APV digital header reconstruction. The ADCs use 12bit,\r
+with 0x000 as lowest value and 0xfff as highest value. There is no OutOfRange, UnderFlow \r
+or OverFlow bit in the ADC.\r
+"Flat low" and "Flat high" set the recognition limits for a missing ADC module: in this case\r
+the ADC will deliver a flat line around 0x800.\r
+"Bit low" is the upper limit for recognizing an ADC value as digital low bit.\r
+"Bit high" is the lower limit for recognizing an ADC value as digital high bit.\r
+\r
+This register must be initialized correctly before sending any triggers to the APVs.\r
+\r
+Recommended setting is 0xd0208878 at time of this writing, giving\r
+Flat Low  = 0x780\r
+Flat High = 0x880\r
+Bit Low   = 0x200\r
+Bit High  = 0xd00\r
+\r
+\r
+Reset value of register is 0x00000000.\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# configuration register for triggers                                           #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xb020 - 0xb020  : trigger settings\r
+-----------------------------------\r
+\r
+D[31:28]  TRG3 number of triggers\r
+D[27:24]  TRG3 delay\r
+D[23:20]  TRG2 number of triggers\r
+D[19:16]  TRG2 delay\r
+D[15:12]  TRG1 number of triggers\r
+D[11:8]   TRG1 delay\r
+D[7:4]    TRG0 number of triggers\r
+D[3:0]    TRG0 delay\r
+\r
+This register is 32bit wide with full read/write access. \r
+It sets up the APV readout functionality (per external trigger input)\r
+\r
+For all four trigger inputs (external and slow control) the number of APV readout \r
+triggers to be sent as well as the number of clock cycles between APV readout \r
+triggers can be set up.\r
+\r
+It is not recommended to take more than 8 APV readout triggers per external trigger.\r
+\r
+Take care: the data format may change with setting up more than one APV readout trigger.\r
+\r
+\r
+Reset value of register is 0x10101010.\r
+\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# configuration register for PLLs                                               #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xb030 - 0xb030  : PLL settings\r
+-------------------------------\r
+\r
+D[31]     100MHZ DLL locked    0 -> bad, 1 -> locked\r
+D[30]     40MHZ PLL locked     0 -> bad, 1 -> locked\r
+D[29]     ADC1 PLL locked      0 -> bad, 1 -> locked\r
+D[28]     ADC0 PLL locked      0 -> bad, 1 -> locked\r
+D[27:24]  reserved\r
+D[23]     reserved\r
+D[22:20]  sector ID as given by backplane switch\r
+D[19]     reserved\r
+D[18:16]  module ID as given by backplane switch\r
+D[15:8]   external trigger setup\r
+-> D[15]  EXT_IN[3] active\r
+-> D[14]  EXT_IN[2] active\r
+-> D[13]  EXT_IN[1] active\r
+-> D[12]  EXT_IN[0] active\r
+-> D[11]  invert external trigger 3\r
+-> D[10]  invert external trigger 2\r
+-> D[9]   invert external trigger 1\r
+-> D[8]   invert external trigger 0\r
+D[7]      40MHz PLL reset\r
+D[6]      ADC1 PLL reset\r
+D[5]      ADC0 PLL reset\r
+D[4]      reserved\r
+D[3:0]    40MHz clock phase setting\r
+\r
+This register is divided into read only bits (D[31:16]) and read/write bits (D[15:0]).\r
+It configures the ADCM hardware resource: setup of FPGA internal PLLs, clock phase between\r
+ADC and APV 40MHz clock and external trigger inputs.\r
+\r
+PLLs must not be in reset during normal operation.\r
+Please note that after reset the PLLs may take some 100ms to be stable again.\r
+\r
+The clock phase shift between ADC and APV clock must be adjusted to accommodate \r
+for delays on PCB and cables. It is mandatory to set this correctly to have the\r
+ADCs sampling the analog signal returning from APVs at the right point in time.\r
+\r
+To activate external trigger inputs set the corresponding bit to 1.\r
+If connected correctly to the CTS no signal inversion is needed.\r
+\r
+Reset value of register is 0x00000000.\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# 1Wire master for APVs and backplane                                           #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xc000 - 0xc03f  : 1Wire master for APV and backplane\r
+-----------------------------------------------------\r
+\r
+Writing the offset 0xc000 with any value starts one full 1Wire action.\r
+This takes about 1.0s - there is no busy locking for reading the memory.\r
+\r
+offset 0: lower 32bit of serial number \r
+offset 1: upper 32bit of serial number\r
+offset 2: D[15]   0 -> no 1Wire found, 1 -> 1Wire found\r
+          D[11:0] temperature of 1Wire IC\r
+offset 3: reserved\r
+\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# SPI master for FlashROM access                                                #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0xd000 - 0xd001  : SPI master for FlashROM\r
+------------------------------------------\r
+\r
+0xd000: SPI control register \r
\r
+D[31:24]  SPI command\r
+D[23:16]  address byte high (A[23:16])\r
+D[15:8]   address byte mid  (A[15:8])\r
+D[7:0]    address byte low  (A[7:0])\r
+\r
+Full read/write access; writing this register starts the SPI hardware access.\r
+This register is busy locked.\r
+\r
+Reset value of register is 0x00000000.\r
+\r
+\r
+0xd001: SPI status register\r
+\r
+D[31:24]  number of data words to be transfered (0x00 -> 1, 0xff -> 256)\r
+D[23:8]   reserved\r
+D[7:0]    debug information (state machine bits)\r
+\r
+This register is divided into read only bits (D[7:0]) and read/write bits (D[31:24]).\r
+\r
+Reset value of register is 0x00000000.\r
+\r
+\r
+0xd100 - 0xd03f  : SPI data memory (FlashROM)\r
+---------------------------------------------\r
+\r
+Memory bank for read / write data in SPI transfer. This memory block is not busy locked.\r
+\r
+D[7:0]   first byte\r
+D[15:8]  second byte\r
+D[23:16] third byte\r
+D[31:24] fourth byte\r
+....\r
+\r
+\r
+#################################################################################\r
+#                                                                               #\r
+# I2C master for APV slowcontrol access                                         #\r
+#                                                                               #\r
+#################################################################################\r
+\r
+0x8040 - 0x8040  : I2C master for APV slow control\r
+--------------------------------------------------\r
+\r
+This I2C master is tailor made for APV25S1 ASICs. \r
+\r
+           write access      \r
+D[31]      I2C start bit    \r
+D[30]      I2C ???\r
+D[29:24]   I2C speed\r
+D[23:16]   I2C address\r
+D[15:8]    I2C command\r
+D[7:0]     I2C write data\r
+\r
+           read access\r
+D[31:24]   status bits \r
+-> D[31]   "running" or "busy" bit\r
+-> D[30]   "access done" bit\r
+-> D[29]   "e_ranak" -> I2C repeated address NAK\r
+-> D[28]   "e_rsf"  -> error generating repeated start condition\r
+-> D[27]   "e_dnak" -> I2C data NAK\r
+-> D[26]   "e_cnak" -> I2C command NAK\r
+-> D[25]   "e_anak" -> I2C address NAK\r
+-> D[24]   "e_sf" -> error generating start condition \r
+D[23:21]   reserved\r
+D[20:16]   debug\r
+D[15:8]    reserved\r
+D[7:0]     I2C read data\r
+\r
+\r
diff --git a/lookup_adc.txt b/lookup_adc.txt
new file mode 100755 (executable)
index 0000000..b07211d
--- /dev/null
@@ -0,0 +1,119 @@
+Backplane 0\r
+===========\r
+\r
+ADC0/0   0  0/6     3        0xb000  0x20030001\r
+ADC0/1   1  0/7     5        0xb001  0x20050001\r
+ADC0/2   2  0/0    10        0xb002  0x200a0001\r
+ADC0/3   3  0/2    12        0xb003  0x200c0001\r
+ADC0/4   4  0/1     9        0xb004  0x20090001\r
+ADC0/5   5  0/3     7        0xb005  0x20070001\r
+ADC0/6   6  0/5     0        0xb006  0x20000001\r
+ADC0/7   7  -/-    --        0xb007  0x200f0001\r
+                             \r
+ADC1/0   8  1/6     4        0xb008  0x20040001\r
+ADC1/1   9  1/7     6        0xb009  0x20060001\r
+ADC1/2  10  1/1    11        0xb00a  0x200b0001\r
+ADC1/3  11  1/0     8        0xb00b  0x20080001\r
+ADC1/4  12  1/3    14        0xb00c  0x200e0001\r
+ADC1/5  13  1/2    13        0xb00d  0x200d0001\r
+ADC1/6  14  1/5     2        0xb00e  0x20020001\r
+ADC1/7  15  1/4     1        0xb00f  0x20010001\r
+\r
+realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+mapAPV    3   5  10  12   9   7   0   -   4   6  11   8  14  13   2   1\r
+\r
+Backplane 1\r
+==========\r
+\r
+ADC0/0   0  0/6    12        0xb000  0x200c0001\r
+ADC0/1   1  0/7    11        0xb001  0x200b0001\r
+ADC0/2   2  0/0    10        0xb002  0x200a0001\r
+ADC0/3   3  0/2     9        0xb003  0x20090001\r
+ADC0/4   4  0/1     8        0xb004  0x20080001\r
+ADC0/5   5  0/3     7        0xb005  0x20070001\r
+ADC0/6   6  0/5    13        0xb006  0x200d0001\r
+ADC0/7   7  0/4    14        0xb007  0x200e0001\r
+                             \r
+ADC1/0   8  1/6     3        0xb008  0x20030001\r
+ADC1/1   9  1/7     2        0xb009  0x20020001\r
+ADC1/2  10  1/1     1        0xb00a  0x20010001\r
+ADC1/3  11  1/0     0        0xb00b  0x20000001\r
+ADC1/4  12  1/3     6        0xb00c  0x20060001\r
+ADC1/5  13  1/2     5        0xb00d  0x20050001\r
+ADC1/6  14  1/5     4        0xb00e  0x20040001\r
+ADC1/7  15  -/-    --        0xb00f  0x200f0001\r
+\r
+realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+mapAPV   12  11  10   9   8   7  13  14   3   2   1   0   6   5   4   -\r
+\r
+Backplane 2\r
+===========\r
+\r
+ADC0/0   0  -/-    --        0xb000  0x200f0001  \r
+ADC0/1   1  0/7     4        0xb001  0x20040001\r
+ADC0/2   2  0/0     5        0xb002  0x20050001\r
+ADC0/3   3  0/2     6        0xb003  0x20060001\r
+ADC0/4   4  0/1     0        0xb004  0x20000001\r
+ADC0/5   5  0/3     1        0xb005  0x20010001\r
+ADC0/6   6  0/5     2        0xb006  0x20020001\r
+ADC0/7   7  0/4     3        0xb007  0x20030001\r
+                             \r
+ADC1/0   8  1/6    14        0xb008  0x200e0001\r
+ADC1/1   9  1/7    13        0xb009  0x200d0001\r
+ADC1/2  10  1/1     7        0xb00a  0x20070001\r
+ADC1/3  11  1/0     8        0xb00b  0x20080001\r
+ADC1/4  12  1/3     9        0xb00c  0x20090001\r
+ADC1/5  13  1/2    10        0xb00d  0x200a0001\r
+ADC1/6  14  1/5    11        0xb00e  0x200b0001\r
+ADC1/7  15  1/4    12        0xb00f  0x200c0001\r
+\r
+realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+mapAPV    -   4   5   6   0   1   2   3  14  13   7   8   9  10  11  12\r
+\r
+Backplane 3\r
+===========\r
+\r
+ADC0/0   0  0/6    10        0xb000  0x200a0001\r
+ADC0/1   1  0/7     9        0xb001  0x20090001\r
+ADC0/2   2  0/0     8        0xb002  0x20080001\r
+ADC0/3   3  0/2     7        0xb003  0x20070001\r
+ADC0/4   4  0/1     6        0xb004  0x20060001\r
+ADC0/5   5  0/3     5        0xb005  0x20050001\r
+ADC0/6   6  0/5    12        0xb006  0x200c0001\r
+ADC0/7   7  0/4    11        0xb007  0x200b0001\r
+                             \r
+ADC1/0   8  1/6     4        0xb008  0x20040001\r
+ADC1/1   9  1/7     3        0xb009  0x20030001\r
+ADC1/2  10  1/1     0        0xb00a  0x20000001\r
+ADC1/3  11  1/0     2        0xb00b  0x20020001\r
+ADC1/4  12  1/3     1        0xb00c  0x20010001\r
+ADC1/5  13  -/-    --        0xb00d  0x200f0001\r
+ADC1/6  14  1/5    13        0xb00e  0x200d0001\r
+ADC1/7  15  1/4    14        0xb00f  0x200e0001\r
+\r
+realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+mapAPV   10   9   8   7   6   5  12  11   4   3   0   2   1   -  13  14\r
+\r
+Backplane 4\r
+===========\r
+\r
+ADC0/0   0  0/6    14        0xb000  0x200e0001\r
+ADC0/1   1  0/7    13        0xb001  0x200d0001\r
+ADC0/2   2  -/-    --        0xb002  0x200f0001\r
+ADC0/3   3  0/2     1        0xb003  0x20010001\r
+ADC0/4   4  0/1     2        0xb004  0x20020001\r
+ADC0/5   5  0/3     0        0xb005  0x20000001\r
+ADC0/6   6  0/5     3        0xb006  0x20030001\r
+ADC0/7   7  0/4     4        0xb007  0x20040001\r
+                             \r
+ADC1/0   8  1/6    11        0xb008  0x200b0001\r
+ADC1/1   9  1/7    12        0xb009  0x200c0001\r
+ADC1/2  10  1/1     5        0xb00a  0x20050001\r
+ADC1/3  11  1/0     6        0xb00b  0x20060001\r
+ADC1/4  12  1/3     7        0xb00c  0x20070001\r
+ADC1/5  13  1/2     8        0xb00d  0x20080001\r
+ADC1/6  14  1/5     9        0xb00e  0x20090001\r
+ADC1/7  15  1/4    10        0xb00f  0x200a0001\r
+\r
+realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+mapAPV   14  13   -   1   2   0   3   4  11  12   5   6   7   8   9  10\r
diff --git a/src/adc_apv_map_mem.lpc b/src/adc_apv_map_mem.lpc
new file mode 100644 (file)
index 0000000..b5c3e13
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=adc_apv_map_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/04/2009\r
+Time=16:11:12\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=128\r
+Data=4\r
+LUT=0\r
+MemFile=i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem\r
+MemFormat=orca\r
diff --git a/src/adc_apv_map_mem.srp b/src/adc_apv_map_mem.srp
new file mode 100644 (file)
index 0000000..c4a1fc4
--- /dev/null
@@ -0,0 +1,30 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Wed Nov 04 16:11:12 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_apv_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem -memformat orca -e 
+    Circuit name     : adc_apv_map_mem
+    Module type      : rom
+    Module Version   : 2.4
+    Address width    : 7
+    Ports            : 
+       Inputs       : Address[6:0]
+       Outputs      : Q[3:0]
+    I/O buffer       : not inserted
+    Memory file      : i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem
+    EDIF output      : suppressed
+    VHDL output      : adc_apv_map_mem.vhd
+    VHDL template    : adc_apv_map_mem_tmpl.vhd
+    VHDL testbench    : tb_adc_apv_map_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : adc_apv_map_mem.srp
+    Element Usage    :
+       ROM128X1 : 4
+    Estimated Resource Usage:
+            LUT : 16
diff --git a/src/adc_apv_map_mem.vhd b/src/adc_apv_map_mem.vhd
new file mode 100644 (file)
index 0000000..b301f1b
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 7 -num_rows 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem -memformat orca -e 
+
+-- Wed Nov 04 16:11:12 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adc_apv_map_mem is
+    port (
+        Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end adc_apv_map_mem;
+
+architecture Structure of adc_apv_map_mem is
+
+    -- local component declarations
+    component ROM128X1
+    -- synopsys translate_off
+        generic (INITVAL : in String);
+    -- synopsys translate_on
+        port (AD6: in  std_logic; AD5: in  std_logic; AD4: in  std_logic; 
+            AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0xFF00FF00FF00E307E0C7FB0180DF3C9C";
+    attribute initval of mem_0_2 : label is "0xF0F0F0F0F0F01E87E178870FF0E133AA";
+    attribute initval of mem_0_1 : label is "0xCCCCCCCCCCCC9955AA9965C993A656A5";
+    attribute initval of mem_0_0 : label is "0xAAAAAAAAAAAA554E72AA56A5A56AA4B3";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xFF00FF00FF00E307E0C7FB0180DF3C9C")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xF0F0F0F0F0F01E87E178870FF0E133AA")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xCCCCCCCCCCCC9955AA9965C993A656A5")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(1));
+
+    mem_0_0: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xAAAAAAAAAAAA554E72AA56A5A56AA4B3")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adc_apv_map_mem is
+    for Structure
+        for all:ROM128X1 use entity ecp2m.ROM128X1(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adc_apv_map_mem_generate.log b/src/adc_apv_map_mem_generate.log
new file mode 100644 (file)
index 0000000..e7ce86b
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Wed Nov 04 16:11:12 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_apv_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem -memformat orca -e \r
+    Circuit name     : adc_apv_map_mem\r
+    Module type      : rom\r
+    Module Version   : 2.4\r
+    Address width    : 7\r
+    Data width       : 4\r
+    Ports            : \r
+       Inputs       : Address[6:0]\r
+       Outputs      : Q[3:0]\r
+    I/O buffer       : not inserted\r
+    Memory file      : i:/vhdl_pro/adcmv3/src/adc_apv_mapping.mem\r
+    EDIF output      : suppressed\r
+    VHDL output      : adc_apv_map_mem.vhd\r
+    VHDL template    : adc_apv_map_mem_tmpl.vhd\r
+    VHDL testbench   : tb_adc_apv_map_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : adc_apv_map_mem.srp\r
+    Estimated Resource Usage:\r
+            LUT : 16\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\adc_apv_map_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/adc_apv_map_mem_tmpl.vhd b/src/adc_apv_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..0386612
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+-- Wed Nov 04 16:11:12 2009
+
+-- parameterized module component declaration
+component adc_apv_map_mem
+    port (Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adc_apv_map_mem
+    port map (Address(6 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/adc_apv_mapping.mem b/src/adc_apv_mapping.mem
new file mode 100644 (file)
index 0000000..af89bc5
--- /dev/null
@@ -0,0 +1,152 @@
+#Format=Address-Hex\r
+#Depth=128\r
+#DataWidth=4\r
+#AddrRadix=3\r
+#DataRadix=3\r
+\r
+# Backplane 0\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    3   5  10  12   9   7   0   -   4   6  11   8  14  13   2   1\r
+00: 3\r
+01: 5\r
+02: a\r
+03: c\r
+04: 9\r
+05: 7\r
+06: 0\r
+07: f\r
+08: 4\r
+09: 6\r
+0a: b\r
+0b: 8\r
+0c: e\r
+0d: d\r
+0e: 2\r
+0f: 1\r
+# Backplane 1\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   12  11  10   9   8   7  13  14   3   2   1   0   6   5   4   -\r
+10: c\r
+11: b\r
+12: a\r
+13: 9\r
+14: 8\r
+15: 7\r
+16: d\r
+17: e\r
+18: 3\r
+19: 2\r
+1a: 1\r
+1b: 0\r
+1c: 6\r
+1d: 5\r
+1e: 4\r
+1f: f\r
+# Backplane 2\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    -   4   5   6   0   1   2   3  14  13   7   8   9  10  11  12\r
+20: f \r
+21: 4\r
+22: 5\r
+23: 6\r
+24: 0\r
+25: 1\r
+26: 2\r
+27: 3\r
+28: e\r
+29: d\r
+2a: 7\r
+2b: 8\r
+2c: 9\r
+2d: a\r
+2e: b\r
+2f: c\r
+# Backplane 3\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   10   9   8   7   6   5  12  11   4   3   0   2   1   -  13  14\r
+30: a\r
+31: 9\r
+32: 8\r
+33: 7\r
+34: 6\r
+35: 5\r
+36: c\r
+37: b\r
+38: 4\r
+39: 3\r
+3a: 0\r
+3b: 2\r
+3c: 1\r
+3d: f\r
+3e: d\r
+3f: e\r
+# Backplane 4\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   14  13   -   1   2   0   3   4  11  12   5   6   7   8   9  10\r
+40: e\r
+41: d\r
+42: f\r
+43: 1\r
+44: 2\r
+45: 0\r
+46: 3\r
+47: 4\r
+48: b\r
+49: c\r
+4a: 5\r
+4b: 6\r
+4c: 7\r
+4d: 8\r
+4e: 9\r
+4f: a\r
+# unused (5) => 1:1\r
+50: 0\r
+51: 1\r
+52: 2\r
+53: 3\r
+54: 4\r
+55: 5\r
+56: 6\r
+57: 7\r
+58: 8\r
+59: 9\r
+5a: a\r
+5b: b\r
+5c: c\r
+5d: d\r
+5e: e\r
+5f: f\r
+# unused (6) => 1:1\r
+60: 0\r
+61: 1\r
+62: 2\r
+63: 3\r
+64: 4\r
+65: 5\r
+66: 6\r
+67: 7\r
+68: 8\r
+69: 9\r
+6a: a\r
+6b: b\r
+6c: c\r
+6d: d\r
+6e: e\r
+6f: f\r
+# unused (7) => 1:1\r
+70: 0\r
+71: 1\r
+72: 2\r
+73: 3\r
+74: 4\r
+75: 5\r
+76: 6\r
+77: 7\r
+78: 8\r
+79: 9\r
+7a: a\r
+7b: b\r
+7c: c\r
+7d: d\r
+7e: e\r
+7f: f\r
diff --git a/src/adc_ch_in.lpc b/src/adc_ch_in.lpc
new file mode 100644 (file)
index 0000000..b256dd4
--- /dev/null
@@ -0,0 +1,47 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=DDR_GENERIC\r
+CoreRevision=3.6\r
+ModuleName=adc_ch_in\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=04/24/2009\r
+Time=11:41:10\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+mode=Input\r
+width=1\r
+reg=DDR\r
+gear=1x\r
+rst=Edge\r
+del=Dynamic\r
+cdel=0\r
+fdel=0\r
+cdiv=1\r
+clk1x=0\r
+clk2x=0\r
+ail=0\r
+step=2\r
+ckedge=1\r
+swap=Off\r
+bf=Off\r
+AilAW=400\r
+val=0\r
diff --git a/src/adc_ch_in.srp b/src/adc_ch_in.srp
new file mode 100644 (file)
index 0000000..e3fea71
--- /dev/null
@@ -0,0 +1,28 @@
+SCUBA, Version ispLever_v72_PROD_Build (44)
+Fri Apr 24 11:41:10 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_ch_in -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type iol -mode in -width 1 -gear 1 -del 16 -e 
+    Circuit name     : adc_ch_in
+    Module type      : iol
+    Module Version   : 3.6
+    Ports            : 
+       Inputs       : Del[3:0], ECLK, SCLK, Rst, Data[0:0]
+       Outputs      : Q[1:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : adc_ch_in.vhd
+    VHDL template    : adc_ch_in_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : adc_ch_in.srp
+    Element Usage    :
+             IB : 1
+        IDDRFXA : 1
+         DELAYB : 1
+    Estimated Resource Usage:
diff --git a/src/adc_ch_in.vhd b/src/adc_ch_in.vhd
new file mode 100644 (file)
index 0000000..a041076
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.6
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_ch_in -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type iol -mode in -width 1 -gear 1 -del 16 -e 
+
+-- Fri Apr 24 11:41:10 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adc_ch_in is
+    port (
+        Del: in  std_logic_vector(3 downto 0); 
+        ECLK: in  std_logic; 
+        SCLK: in  std_logic; 
+        Rst: in  std_logic; 
+        Data: in  std_logic_vector(0 downto 0); 
+        Q: out  std_logic_vector(1 downto 0));
+ attribute dont_touch : string;
+ attribute dont_touch of adc_ch_in : entity is "true";
+end adc_ch_in;
+
+architecture Structure of adc_ch_in is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal Data_t0: std_logic;
+    signal buf_Data0: std_logic;
+
+    -- local component declarations
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component IB
+        port (I: in  std_logic; O: out  std_logic);
+    end component;
+    component IDDRFXA
+        port (D: in  std_logic; CLK1: in  std_logic; CLK2: in  std_logic; 
+            CE: in  std_logic; RST: in  std_logic; QA: out  std_logic; 
+            QB: out  std_logic);
+    end component;
+    component DELAYB
+        port (A: in  std_logic; DEL0: in  std_logic; DEL1: in  std_logic; 
+            DEL2: in  std_logic; DEL3: in  std_logic; Z: out  std_logic);
+    end component;
+    attribute syn_noprune : boolean;
+    attribute syn_noprune of Structure : architecture is true;
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    ud_0: IDDRFXA
+        port map (D=>Data_t0, CLK1=>ECLK, CLK2=>SCLK, CE=>scuba_vhi, 
+            RST=>Rst, QA=>Q(0), QB=>Q(1));
+
+    udel_0: DELAYB
+        port map (A=>buf_Data0, DEL0=>Del(0), DEL1=>Del(1), DEL2=>Del(2), 
+            DEL3=>Del(3), Z=>Data_t0);
+
+    buf_Data0_in_inst: IB
+        port map (I=>Data(0), O=>buf_Data0);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adc_ch_in is
+    for Structure
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:IB use entity ecp2m.IB(V); end for;
+        for all:IDDRFXA use entity ecp2m.IDDRFXA(V); end for;
+        for all:DELAYB use entity ecp2m.DELAYB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adc_ch_in_tmpl.vhd b/src/adc_ch_in_tmpl.vhd
new file mode 100644 (file)
index 0000000..fc15c1b
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.6
+-- Fri Apr 24 11:41:10 2009
+
+-- parameterized module component declaration
+component adc_ch_in
+    port (Del: in  std_logic_vector(3 downto 0); ECLK: in  std_logic; 
+        SCLK: in  std_logic; Rst: in  std_logic; 
+        Data: in  std_logic_vector(0 downto 0); 
+        Q: out  std_logic_vector(1 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adc_ch_in
+    port map (Del(3 downto 0)=>__, ECLK=>__, SCLK=>__, Rst=>__, Data(0 downto 0)=>__, 
+        Q(1 downto 0)=>__);
diff --git a/src/adc_channel_select.vhd b/src/adc_channel_select.vhd
new file mode 100644 (file)
index 0000000..20e653b
--- /dev/null
@@ -0,0 +1,98 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity adc_channel_select is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 ADC_CLK_IN            : in    std_logic;\r
+                 ADC_SEL_IN            : in    std_logic_vector(2 downto 0);\r
+                 ADC_7_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_6_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_5_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_4_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_3_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_2_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_1_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_0_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_CH_OUT            : out   std_logic_vector(11 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of adc_channel_select is\r
+\r
+       -- Placer Directives\r
+\r
+       -- normal signals              \r
+       signal adc_ch                   : std_logic_vector(11 downto 0);\r
+       signal adc_sel                  : std_logic_vector(2 downto 0);\r
+       signal reset                    : std_logic;\r
+\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+\r
+\r
+begin                                          \r
+\r
+-- Reset synchronizer\r
+THE_RESET_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset\r
+               );\r
+\r
+-- select signals are from 100MHz clock domain!\r
+THE_SEL2_SYNC: state_sync\r
+port map( STATE_A_IN           => adc_sel_in(2),\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset,\r
+                 STATE_B_OUT           => adc_sel(2)\r
+               );\r
+THE_SEL1_SYNC: state_sync\r
+port map( STATE_A_IN           => adc_sel_in(1),\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset,\r
+                 STATE_B_OUT           => adc_sel(1)\r
+               );\r
+THE_SEL0_SYNC: state_sync\r
+port map( STATE_A_IN           => adc_sel_in(0),\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset,\r
+                 STATE_B_OUT           => adc_sel(0)\r
+               );\r
+\r
+               \r
+-- registered multiplexer\r
+THE_SEL_PROC: process( adc_clk_in )\r
+begin\r
+       if( rising_edge(adc_clk_in) ) then\r
+               if( reset = '1' ) then\r
+                       adc_ch <= (others => '0');\r
+               else\r
+                       case adc_sel is\r
+                               when b"000"     =>      adc_ch <= adc_0_in;\r
+                               when b"001"     =>      adc_ch <= adc_1_in;\r
+                               when b"010"     =>      adc_ch <= adc_2_in;\r
+                               when b"011"     =>      adc_ch <= adc_3_in;\r
+                               when b"100"     =>      adc_ch <= adc_4_in;\r
+                               when b"101"     =>      adc_ch <= adc_5_in;\r
+                               when b"110"     =>      adc_ch <= adc_6_in;\r
+                               when b"111"     =>      adc_ch <= adc_7_in;\r
+                               when others     =>      adc_ch <= x"000"; -- never\r
+                       end case;\r
+               end if;\r
+       end if; \r
+end process THE_SEL_PROC;\r
+\r
+-- debug signals\r
+debug(15 downto 0)  <= (others => '0');\r
+\r
+-- output signals\r
+adc_ch_out    <= adc_ch;\r
+debug_out     <= debug;  \r
+\r
+end behavioral;                                \r
diff --git a/src/adc_crossover.vhd b/src/adc_crossover.vhd
new file mode 100644 (file)
index 0000000..870c990
--- /dev/null
@@ -0,0 +1,141 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity adc_crossover is\r
+       port( CLK_APV_IN                        : in    std_logic; -- APV 40MHz local clock\r
+                 RESET_IN                              : in    std_logic; -- general reset (100MHz)\r
+                 -- ADC clock domain signals\r
+                 ADC_CLK_IN                    : in    std_logic;\r
+                 ADC_CE_IN                     : in    std_logic; -- in case we use 240MHz + write pulse...\r
+                 ADC_DATA_VALID_IN             : in    std_logic;\r
+                 ADC_DATA_7_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_6_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_5_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_4_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_3_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_2_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_1_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_0_IN                 : in    std_logic_vector(11 downto 0);\r
+                 LEVEL_WR_OUT                  : out   std_logic_vector(4 downto 0);\r
+                 -- APV clock domain signals\r
+                 APV_DATA_7_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_6_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_5_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_4_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_3_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_2_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_1_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_0_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_VALID_OUT    : out   std_logic;\r
+                 LEVEL_RD_OUT                  : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(31 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of adc_crossover is\r
+\r
+       signal debug                            : std_logic_vector(31 downto 0);\r
+\r
+       signal fifo_rd_level            : std_logic_vector(4 downto 0);\r
+       signal fifo_wr_level            : std_logic_vector(4 downto 0);\r
+       signal next_fifo_rd_ena         : std_logic;\r
+       signal fifo_rd_ena                      : std_logic;\r
+       signal next_fifo_wr_ena         : std_logic;\r
+       signal fifo_wr_ena                      : std_logic;\r
+       signal next_reset                       : std_logic;\r
+       signal reset                            : std_logic;\r
+       signal apv_data_valid           : std_logic_vector(2 downto 0);\r
+       \r
+begin\r
+\r
+---------------------------------------------------------------------------\r
+-- Debugging signals\r
+---------------------------------------------------------------------------\r
+debug(31 downto 0) <= (others => '0');\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Reset: we keep the FIFO in reset as long as the PLL is not locked\r
+---------------------------------------------------------------------------\r
+next_reset <= reset_in or not adc_data_valid_in;\r
+\r
+THE_RESET_STATE_SYNC: state_sync\r
+port map( STATE_A_IN           => next_reset,\r
+                 CLK_B_IN                      => clk_apv_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset\r
+               );\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Crossover fifo for ADC \r
+---------------------------------------------------------------------------\r
+next_fifo_wr_ena <= adc_ce_in and adc_data_valid_in;\r
+next_fifo_rd_ena <= '1' when ( fifo_rd_level > b"0_0101" ) else '0';\r
+\r
+SYNC_WRCLK_PROC: process( adc_clk_in ) \r
+begin\r
+       if( rising_edge(adc_clk_in) ) then\r
+               fifo_wr_ena <= next_fifo_wr_ena;\r
+       end if;\r
+end process SYNC_WRCLK_PROC;\r
+\r
+SYNC_RDCLK_PROC: process( clk_apv_in ) \r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               fifo_rd_ena    <= next_fifo_rd_ena;\r
+               apv_data_valid <= apv_data_valid(1 downto 0) & fifo_rd_ena;\r
+       end if;\r
+end process SYNC_RDCLK_PROC;\r
+\r
+THE_CROSSOVER: crossover\r
+port map( DATA(95 downto 84)   => adc_data_7_in,\r
+                 DATA(83 downto 72)    => adc_data_6_in,\r
+                 DATA(71 downto 60)    => adc_data_5_in,\r
+                 DATA(59 downto 48)    => adc_data_4_in,\r
+                 DATA(47 downto 36)    => adc_data_3_in,\r
+                 DATA(35 downto 24)    => adc_data_2_in,\r
+                 DATA(23 downto 12)    => adc_data_1_in,\r
+                 DATA(11 downto 0)             => adc_data_0_in,\r
+                 WRCLOCK                               => adc_clk_in,\r
+                 RDCLOCK                               => clk_apv_in,\r
+                 WREN                                  => fifo_wr_ena,\r
+                 RDEN                                  => fifo_rd_ena,\r
+                 RESET                                 => reset, -- this is an async clear input!\r
+                 RPRESET                               => '0', -- not needed, as OR'ed with RESET\r
+                 Q(95 downto 84)               => apv_data_7_out,\r
+                 Q(83 downto 72)               => apv_data_6_out,\r
+                 Q(71 downto 60)               => apv_data_5_out,\r
+                 Q(59 downto 48)               => apv_data_4_out,\r
+                 Q(47 downto 36)               => apv_data_3_out,\r
+                 Q(35 downto 24)               => apv_data_2_out,\r
+                 Q(23 downto 12)               => apv_data_1_out,\r
+                 Q(11 downto 0)                => apv_data_0_out,\r
+                 WCNT                                  => fifo_wr_level,\r
+                 RCNT                                  => fifo_rd_level,\r
+                 EMPTY                                 => open,\r
+                 FULL                                  => open\r
+               );\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Output signals\r
+---------------------------------------------------------------------------\r
+level_rd_out       <= fifo_rd_level;\r
+level_wr_out       <= fifo_wr_level;\r
+apv_data_valid_out <= apv_data_valid(2);\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- DEBUG signals\r
+---------------------------------------------------------------------------\r
+debug_out        <= debug;\r
+\r
+\r
+end behavioral;\r
diff --git a/src/adc_data_handler_new.vhd b/src/adc_data_handler_new.vhd
new file mode 100644 (file)
index 0000000..d4b7a17
--- /dev/null
@@ -0,0 +1,325 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity adc_data_handler_new is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 ADC_LCLK_IN           : in    std_logic; -- LCLK from ADC\r
+                 ADC_ADCLK_IN          : in    std_logic; -- ADCLK from ADC\r
+                 ADC_CHNL_IN           : in    std_logic_vector(7 downto 0);\r
+                 PLL_CTRL_IN           : in    std_logic_vector(3 downto 0);\r
+                 ADC_DATA7_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA6_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA5_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA4_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA3_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA2_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA1_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA0_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_CE_OUT            : out   std_logic;\r
+                 ADC_VALID_OUT         : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of adc_data_handler_new is\r
+\r
+       -- Placer Directives\r
+       attribute HGROUP : string;\r
+       -- for whole architecture\r
+       attribute HGROUP of behavioral : architecture  is "ADC_DATA_HANDLER_group";\r
+\r
+       -- normal signals                          \r
+       signal adc_adclk_vec    : std_logic_vector(0 downto 0);\r
+       signal adc_adclk                : std_logic_vector(1 downto 0);\r
+       \r
+       signal adc_ch_7_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_6_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_5_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_4_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_3_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_2_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_1_mux             : std_logic_vector(1 downto 0);\r
+       signal adc_ch_0_mux             : std_logic_vector(1 downto 0);\r
+       \r
+       signal last_adc_7_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_6_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_5_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_4_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_3_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_2_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_1_ch    : std_logic_vector(11 downto 0);\r
+       signal last_adc_0_ch    : std_logic_vector(11 downto 0);\r
+\r
+       signal buf_adc_7_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_6_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_5_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_4_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_3_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_2_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_1_ch             : std_logic_vector(11 downto 0);\r
+       signal buf_adc_0_ch             : std_logic_vector(11 downto 0);\r
+\r
+       signal realstore                : std_logic_vector(3 downto 0);\r
+       signal next_recstore    : std_logic;\r
+       signal recstore                 : std_logic_vector(3 downto 0);\r
+\r
+       signal reset                    : std_logic; -- synchronized to 240MHz local clock\r
+\r
+       signal input_delay              : std_logic_vector(3 downto 0);\r
+\r
+       signal bitcounter               : std_logic_vector(2 downto 0);\r
+       signal synccounter              : std_logic_vector(2 downto 0);\r
+       signal next_ce_inc              : std_logic;\r
+       signal ce_inc                   : std_logic;\r
+       signal next_ce_dec              : std_logic;\r
+       signal ce_dec                   : std_logic;\r
+       signal next_sync_low    : std_logic;\r
+       signal sync_low                 : std_logic;\r
+       signal next_sync_high   : std_logic;\r
+       signal sync_high                : std_logic;\r
+\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+       \r
+begin                                          \r
+\r
+-- input delay for IDDR, 50ps / unit\r
+input_delay <= pll_ctrl_in;\r
+\r
+-- Reset synchronizer                                               \r
+THE_RESET_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => adc_lclk_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset\r
+               );\r
+\r
+-- We have to reconstruct the ADC word clock (ADCLK).\r
+-- Mind the vector!                            \r
+adc_adclk_vec(0) <= adc_adclk_in;              \r
+  \r
+THE_ADC_ADCLK_IN: adc_ch_in                    \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',      \r
+                 DATA  => adc_adclk_vec,              \r
+                 Q             => adc_adclk                   \r
+               );                                     \r
+\r
+-- First group of channels (0 and 1)\r
+THE_DIN_0: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',   \r
+                 DATA  => adc_chnl_in(0 downto 0),    \r
+                 Q             => adc_ch_0_mux                 \r
+               );                                     \r
+THE_DIN_1: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',   \r
+                 DATA  => adc_chnl_in(1 downto 1),    \r
+                 Q             => adc_ch_1_mux                 \r
+               );                                     \r
+THE_ADC_0_1_CH: adc_twochannels\r
+port map( CLK_IN               => adc_lclk_in,\r
+                 RESET_IN              => reset,\r
+                 CLOCK_IN              => adc_adclk,\r
+                 DATA_0_IN     => adc_ch_0_mux,\r
+                 DATA_1_IN     => adc_ch_1_mux,\r
+                 DATA_0_OUT    => last_adc_0_ch,\r
+                 DATA_1_OUT    => last_adc_1_ch,\r
+                 STORE_OUT             => realstore(0),\r
+                 SWAP_OUT              => open,\r
+                 CLOCK_OUT             => open,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+-- Second group of channels (2 and 3)\r
+THE_DIN_2: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',   \r
+                 DATA  => adc_chnl_in(2 downto 2),    \r
+                 Q             => adc_ch_2_mux                 \r
+               );                                     \r
+THE_DIN_3: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',   \r
+                 DATA  => adc_chnl_in(3 downto 3),    \r
+                 Q             => adc_ch_3_mux                 \r
+               );                                     \r
+THE_ADC_2_3_CH: adc_twochannels\r
+port map( CLK_IN               => adc_lclk_in,\r
+                 RESET_IN              => reset,\r
+                 CLOCK_IN              => adc_adclk,\r
+                 DATA_0_IN     => adc_ch_2_mux,\r
+                 DATA_1_IN     => adc_ch_3_mux,\r
+                 DATA_0_OUT    => last_adc_2_ch,\r
+                 DATA_1_OUT    => last_adc_3_ch,\r
+                 STORE_OUT             => realstore(1),\r
+                 SWAP_OUT              => open,\r
+                 CLOCK_OUT             => open,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+-- Third group of channels (4 and 5)\r
+THE_DIN_4: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',  \r
+                 DATA  => adc_chnl_in(4 downto 4),    \r
+                 Q             => adc_ch_4_mux                 \r
+               );                                     \r
+THE_DIN_5: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',  \r
+                 DATA  => adc_chnl_in(5 downto 5),    \r
+                 Q             => adc_ch_5_mux                 \r
+               );                                     \r
+THE_ADC_4_5_CH: adc_twochannels\r
+port map( CLK_IN               => adc_lclk_in,\r
+                 RESET_IN              => reset,\r
+                 CLOCK_IN              => adc_adclk,\r
+                 DATA_0_IN     => adc_ch_4_mux,\r
+                 DATA_1_IN     => adc_ch_5_mux,\r
+                 DATA_0_OUT    => last_adc_4_ch,\r
+                 DATA_1_OUT    => last_adc_5_ch,\r
+                 STORE_OUT             => realstore(2),\r
+                 SWAP_OUT              => open,\r
+                 CLOCK_OUT             => open,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+-- Fourth group of channels (6 and 7)\r
+THE_DIN_6: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0', \r
+                 DATA  => adc_chnl_in(6 downto 6),    \r
+                 Q             => adc_ch_6_mux                 \r
+               );                                     \r
+THE_DIN_7: adc_ch_in                   \r
+port map( DEL  => input_delay,\r
+                 ECLK  => adc_lclk_in,                \r
+                 SCLK  => adc_lclk_in,                \r
+                 RST   => '0',  \r
+                 DATA  => adc_chnl_in(7 downto 7),    \r
+                 Q             => adc_ch_7_mux                 \r
+               );                                     \r
+THE_ADC_6_7_CH: adc_twochannels\r
+port map( CLK_IN               => adc_lclk_in,\r
+                 RESET_IN              => reset,\r
+                 CLOCK_IN              => adc_adclk,\r
+                 DATA_0_IN     => adc_ch_6_mux,\r
+                 DATA_1_IN     => adc_ch_7_mux,\r
+                 DATA_0_OUT    => last_adc_6_ch,\r
+                 DATA_1_OUT    => last_adc_7_ch,\r
+                 STORE_OUT             => realstore(3),\r
+                 SWAP_OUT              => open,\r
+                 CLOCK_OUT             => open,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+-- Clock reconstruction (will only work if all four units work in perfect alignment)\r
+next_recstore <= '1' when ( realstore = b"1111" ) else '0';\r
+\r
+-- Synchronising stage\r
+THE_SYNC_PROC: process( adc_lclk_in )\r
+begin\r
+       if( rising_edge(adc_lclk_in) ) then\r
+               recstore(3 downto 0) <= recstore(2 downto 0) & next_recstore;\r
+               sync_low             <= next_sync_low;\r
+               sync_high            <= next_sync_high;\r
+               ce_inc               <= next_ce_inc;\r
+               ce_dec               <= next_ce_dec;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+THE_BIT_COUNTER: process( adc_lclk_in )\r
+begin\r
+       if( rising_edge(adc_lclk_in) ) then\r
+               if( recstore(0) = '1' ) then\r
+                       bitcounter <= (others => '0');\r
+               else\r
+                       bitcounter <= bitcounter + 1;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_COUNTER;\r
+\r
+next_sync_low  <= '1' when (synccounter = b"000") else '0';\r
+next_sync_high <= '1' when (synccounter = b"111") else '0';\r
+\r
+next_ce_inc <= '1' when ( (bitcounter = b"101") and (recstore(0) = '1') and (sync_high = '0') ) else '0';\r
+next_ce_dec <= '1' when ( (bitcounter = b"101") and (recstore(0) = '0') and (sync_low = '0') )  else '0';\r
+\r
+THE_SYNC_COUNTER: process( adc_lclk_in )\r
+begin\r
+       if( rising_edge(adc_lclk_in) ) then\r
+               if( reset = '1' ) then\r
+                       synccounter <= (others => '0');\r
+               elsif( (ce_inc = '1') and (ce_dec = '0') ) then\r
+                       synccounter <= synccounter + 1;\r
+               elsif( (ce_inc = '0') and (ce_dec = '1') ) then\r
+                       synccounter <= synccounter - 1;\r
+               end if;\r
+       end if;\r
+end process THE_SYNC_COUNTER;\r
+\r
+debug(15 downto 11) <= (others => '0');\r
+debug(10 downto 8)  <= synccounter;\r
+debug(7)            <= sync_low;\r
+debug(6)            <= sync_high;\r
+debug(5)            <= ce_dec;\r
+debug(4)            <= ce_inc;\r
+debug(3)            <= '0';\r
+debug(2 downto 0)   <= bitcounter;\r
+\r
+-----------------------------------------------------------------------\r
+-- generate 8 ADC channel inputs and clock transfer registers\r
+-----------------------------------------------------------------------\r
+THE_DATA_DELAY_PROC: process( adc_lclk_in )\r
+begin\r
+       if( rising_edge(adc_lclk_in) ) then\r
+               buf_adc_7_ch <= last_adc_7_ch;\r
+               buf_adc_6_ch <= last_adc_6_ch;\r
+               buf_adc_5_ch <= last_adc_5_ch;\r
+               buf_adc_4_ch <= last_adc_4_ch;\r
+               buf_adc_3_ch <= last_adc_3_ch;\r
+               buf_adc_2_ch <= last_adc_2_ch;\r
+               buf_adc_1_ch <= last_adc_1_ch;\r
+               buf_adc_0_ch <= last_adc_0_ch;\r
+       end if;\r
+end process THE_DATA_DELAY_PROC;\r
+\r
+\r
+-- output signals\r
+adc_data7_out    <= buf_adc_7_ch;               \r
+adc_data6_out    <= buf_adc_6_ch;               \r
+adc_data5_out    <= buf_adc_5_ch;               \r
+adc_data4_out    <= buf_adc_4_ch;               \r
+adc_data3_out    <= buf_adc_3_ch;               \r
+adc_data2_out    <= buf_adc_2_ch;               \r
+adc_data1_out    <= buf_adc_1_ch;               \r
+adc_data0_out    <= buf_adc_0_ch;               \r
+adc_ce_out       <= recstore(3);\r
+adc_valid_out    <= sync_high;\r
+                                               \r
+debug_out(15 downto 0)  <= debug;  \r
+                                               \r
+end behavioral;                                \r
+                                              
\ No newline at end of file
diff --git a/src/adc_onewire_map_mem.lpc b/src/adc_onewire_map_mem.lpc
new file mode 100644 (file)
index 0000000..19bef2d
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=adc_onewire_map_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/05/2009\r
+Time=10:27:05\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=128\r
+Data=4\r
+LUT=0\r
+MemFile=\\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem\r
+MemFormat=orca\r
diff --git a/src/adc_onewire_map_mem.srp b/src/adc_onewire_map_mem.srp
new file mode 100644 (file)
index 0000000..a45415a
--- /dev/null
@@ -0,0 +1,30 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Thu Nov 05 10:27:05 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_onewire_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem -memformat orca -e 
+    Circuit name     : adc_onewire_map_mem
+    Module type      : rom
+    Module Version   : 2.4
+    Address width    : 7
+    Ports            : 
+       Inputs       : Address[6:0]
+       Outputs      : Q[3:0]
+    I/O buffer       : not inserted
+    Memory file      : \\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem
+    EDIF output      : suppressed
+    VHDL output      : adc_onewire_map_mem.vhd
+    VHDL template    : adc_onewire_map_mem_tmpl.vhd
+    VHDL testbench    : tb_adc_onewire_map_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : adc_onewire_map_mem.srp
+    Element Usage    :
+       ROM128X1 : 4
+    Estimated Resource Usage:
+            LUT : 16
diff --git a/src/adc_onewire_map_mem.vhd b/src/adc_onewire_map_mem.vhd
new file mode 100644 (file)
index 0000000..7aba8b5
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 7 -num_rows 128 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem -memformat orca -e 
+
+-- Thu Nov 05 10:27:05 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adc_onewire_map_mem is
+    port (
+        Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end adc_onewire_map_mem;
+
+architecture Structure of adc_onewire_map_mem is
+
+    -- local component declarations
+    component ROM128X1
+    -- synopsys translate_off
+        generic (INITVAL : in String);
+    -- synopsys translate_on
+        port (AD6: in  std_logic; AD5: in  std_logic; AD4: in  std_logic; 
+            AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0xFF00FF00FF001FE0E01F7F80807F6956";
+    attribute initval of mem_0_2 : label is "0xF0F0F0F0F0F07E187E18F81CF81C807F";
+    attribute initval of mem_0_1 : label is "0xCCCCCCCCCCCC798386BAE6521AEC70F8";
+    attribute initval of mem_0_0 : label is "0xAAAAAAAAAAAA32AD326B2A9729D64AE5";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xFF00FF00FF001FE0E01F7F80807F6956")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xF0F0F0F0F0F07E187E18F81CF81C807F")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xCCCCCCCCCCCC798386BAE6521AEC70F8")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(1));
+
+    mem_0_0: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xAAAAAAAAAAAA32AD326B2A9729D64AE5")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adc_onewire_map_mem is
+    for Structure
+        for all:ROM128X1 use entity ecp2m.ROM128X1(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adc_onewire_map_mem_generate.log b/src/adc_onewire_map_mem_generate.log
new file mode 100644 (file)
index 0000000..ed0c0f5
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Thu Nov 05 10:27:05 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_onewire_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem -memformat orca -e \r
+    Circuit name     : adc_onewire_map_mem\r
+    Module type      : rom\r
+    Module Version   : 2.4\r
+    Address width    : 7\r
+    Data width       : 4\r
+    Ports            : \r
+       Inputs       : Address[6:0]\r
+       Outputs      : Q[3:0]\r
+    I/O buffer       : not inserted\r
+    Memory file      : \\home\mboehmer\vhdl_pro\adcmv3\src\adc_onewire_mapping.mem\r
+    EDIF output      : suppressed\r
+    VHDL output      : adc_onewire_map_mem.vhd\r
+    VHDL template    : adc_onewire_map_mem_tmpl.vhd\r
+    VHDL testbench   : tb_adc_onewire_map_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : adc_onewire_map_mem.srp\r
+    Estimated Resource Usage:\r
+            LUT : 16\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: adc_onewire_map_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/adc_onewire_map_mem_tmpl.vhd b/src/adc_onewire_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..8659f3d
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+-- Thu Nov 05 10:27:05 2009
+
+-- parameterized module component declaration
+component adc_onewire_map_mem
+    port (Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adc_onewire_map_mem
+    port map (Address(6 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/adc_onewire_mapping.mem b/src/adc_onewire_mapping.mem
new file mode 100644 (file)
index 0000000..32b44fd
--- /dev/null
@@ -0,0 +1,152 @@
+#Format=Address-Hex\r
+#Depth=128\r
+#DataWidth=4\r
+#AddrRadix=3\r
+#DataRadix=3\r
+\r
+# Backplane 0\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# 1Wire     5  12  13   6  14   7  15   3   8   1   0   9   2  10  11  (4)   \r
+00: 5\r
+01: c\r
+02: d\r
+03: 6\r
+04: e\r
+05: 7\r
+06: f\r
+07: 3\r
+08: 8\r
+09: 1\r
+0a: 0\r
+0b: 9\r
+0c: 2\r
+0d: a\r
+0e: b\r
+0f: 4\r
+# Backplane 1\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# 1Wire     8   9  15  14  13  10  11   3   1   2   0   7   6   5   4 (12)   \r
+10: 8\r
+11: 9\r
+12: f\r
+13: e\r
+14: d\r
+15: a\r
+16: b\r
+17: 3\r
+18: 1\r
+19: 2\r
+1a: 0\r
+1b: 7\r
+1c: 6\r
+1d: 5\r
+1e: 4\r
+1f: c\r
+# Backplane 2\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# 1Wire     1   3   5   4   7   0   2   9   8  11  10  13  12  15  14  (6)   \r
+20: 1 \r
+21: 3\r
+22: 5\r
+23: 4\r
+24: 7\r
+25: 0\r
+26: 2\r
+27: 9\r
+28: 8\r
+29: b\r
+2a: a\r
+2b: d\r
+2c: c\r
+2d: f\r
+2e: e\r
+2f: 6\r
+# Backplane 3\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# 1Wire     9  11   8  15  14   3   1   2   0   7   6   4   5  13  12 (10)   \r
+30: 9\r
+31: b\r
+32: 8\r
+33: f\r
+34: e\r
+35: 3\r
+36: 1\r
+37: 2\r
+38: 0\r
+39: 7\r
+3a: 6\r
+3b: 4\r
+3c: 5\r
+3d: d\r
+3e: c\r
+3f: a\r
+# Backplane 4\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# 1Wire     3   2   1   5   4   9   8  11  10  13  12  14  15   7   6  (0)   \r
+40: 3\r
+41: 2\r
+42: 1\r
+43: 5\r
+44: 4\r
+45: 9\r
+46: 8\r
+47: b\r
+48: a\r
+49: d\r
+4a: c\r
+4b: e\r
+4c: f\r
+4d: 7\r
+4e: 6\r
+4f: 0\r
+# unused (5) => 1:1\r
+50: 0\r
+51: 1\r
+52: 2\r
+53: 3\r
+54: 4\r
+55: 5\r
+56: 6\r
+57: 7\r
+58: 8\r
+59: 9\r
+5a: a\r
+5b: b\r
+5c: c\r
+5d: d\r
+5e: e\r
+5f: f\r
+# unused (6) => 1:1\r
+60: 0\r
+61: 1\r
+62: 2\r
+63: 3\r
+64: 4\r
+65: 5\r
+66: 6\r
+67: 7\r
+68: 8\r
+69: 9\r
+6a: a\r
+6b: b\r
+6c: c\r
+6d: d\r
+6e: e\r
+6f: f\r
+# unused (7) => 1:1\r
+70: 0\r
+71: 1\r
+72: 2\r
+73: 3\r
+74: 4\r
+75: 5\r
+76: 6\r
+77: 7\r
+78: 8\r
+79: 9\r
+7a: a\r
+7b: b\r
+7c: c\r
+7d: d\r
+7e: e\r
+7f: f\r
diff --git a/src/adc_pll.lpc b/src/adc_pll.lpc
new file mode 100644 (file)
index 0000000..a11a5e3
--- /dev/null
@@ -0,0 +1,56 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=PLL\r
+CoreRevision=4.2\r
+ModuleName=adc_pll\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=04/16/2009\r
+Time=11:20:59\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=None\r
+Order=None\r
+IO=0\r
+Type=ehxpllb\r
+mode=normal\r
+IFrq=40\r
+OFrq=40.000000\r
+KFrq=\r
+U_OFrq=40\r
+U_KFrq=50\r
+OP_Tol=0.0\r
+OK_Tol=0.0\r
+Div=1\r
+Mult=1\r
+Post=32\r
+SecD=2\r
+fb_mode=CLKOP\r
+PhaseDuty=Static\r
+DelayControl=SPLL_NO_DELAY\r
+External=DISABLED\r
+PCDR=1\r
+ClkOPBp=0\r
+EnCLKOS=0\r
+ClkOSBp=0\r
+Phase=0.0\r
+Duty=8\r
+DPD=50% Duty\r
+EnCLKOK=0\r
+ClkOKBp=0\r
+ClkRst=0\r
diff --git a/src/adc_pll.vhd b/src/adc_pll.vhd
new file mode 100644 (file)
index 0000000..b09a7f5
--- /dev/null
@@ -0,0 +1,121 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.2
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_pll -lang vhdl -synth synplify -arch ep5m00 -type pll -fin 40 -phase_cntl STATIC -fclkop 40 -fclkop_tol 0.0 -delay_cntl SPLL_NO_DELAY -fb_mode CLOCKTREE -extcap DISABLED -noclkos -noclkok -use_rst -e 
+
+-- Thu Apr 16 11:20:59 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adc_pll is
+    port (
+        CLK: in std_logic; 
+        RESET: in std_logic; 
+        CLKOP: out std_logic; 
+        LOCK: out std_logic);
+ attribute dont_touch : string;
+ attribute dont_touch of adc_pll : entity is "true";
+end adc_pll;
+
+architecture Structure of adc_pll is
+
+    -- internal signal declarations
+    signal CLKOP_t: std_logic;
+    signal scuba_vlo: std_logic;
+    signal CLK_t: std_logic;
+
+    -- local component declarations
+    component VLO
+        port (Z: out std_logic);
+    end component;
+    component EPLLD
+    -- synopsys translate_off
+        generic (PLLCAP : in String; CLKOK_BYPASS : in String; 
+                CLKOS_BYPASS : in String; CLKOP_BYPASS : in String; 
+                DUTY : in Integer; PHASEADJ : in String; 
+                PHASE_CNTL : in String; CLKOK_DIV : in Integer; 
+                CLKFB_DIV : in Integer; CLKOP_DIV : in Integer; 
+                CLKI_DIV : in Integer);
+    -- synopsys translate_on
+        port (CLKI: in std_logic; CLKFB: in std_logic; RST: in std_logic; 
+            RSTK: in std_logic; DPAMODE: in std_logic; DRPAI3: in std_logic; 
+            DRPAI2: in std_logic; DRPAI1: in std_logic; DRPAI0: in std_logic; 
+            DFPAI3: in std_logic; DFPAI2: in std_logic; DFPAI1: in std_logic; 
+            DFPAI0: in std_logic; CLKOP: out std_logic; CLKOS: out std_logic; 
+            CLKOK: out std_logic; LOCK: out std_logic; CLKINTFB: out std_logic);
+    end component;
+    attribute PLLCAP : string; 
+    attribute PLLTYPE : string; 
+    attribute CLKOK_BYPASS : string; 
+    attribute FREQUENCY_PIN_CLKOK : string; 
+    attribute CLKOK_DIV : string; 
+    attribute CLKOS_BYPASS : string; 
+    attribute FREQUENCY_PIN_CLKOP : string; 
+    attribute CLKOP_BYPASS : string; 
+    attribute PHASE_CNTL : string; 
+    attribute FDEL : string; 
+    attribute DUTY : string; 
+    attribute PHASEADJ : string; 
+    attribute FREQUENCY_PIN_CLKI : string; 
+    attribute CLKOP_DIV : string; 
+    attribute CLKFB_DIV : string; 
+    attribute CLKI_DIV : string; 
+    attribute FIN : string; 
+    attribute PLLCAP of PLLDInst_0 : label is "DISABLED";
+    attribute PLLTYPE of PLLDInst_0 : label is "SPLL";
+    attribute CLKOK_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute FREQUENCY_PIN_CLKOK of PLLDInst_0 : label is "50.000000";
+    attribute CLKOK_DIV of PLLDInst_0 : label is "2";
+    attribute CLKOS_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute FREQUENCY_PIN_CLKOP of PLLDInst_0 : label is "40.000000";
+    attribute CLKOP_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute PHASE_CNTL of PLLDInst_0 : label is "STATIC";
+    attribute FDEL of PLLDInst_0 : label is "0";
+    attribute DUTY of PLLDInst_0 : label is "8";
+    attribute PHASEADJ of PLLDInst_0 : label is "0.0";
+    attribute FREQUENCY_PIN_CLKI of PLLDInst_0 : label is "40.000000";
+    attribute CLKOP_DIV of PLLDInst_0 : label is "32";
+    attribute CLKFB_DIV of PLLDInst_0 : label is "1";
+    attribute CLKI_DIV of PLLDInst_0 : label is "1";
+    attribute FIN of PLLDInst_0 : label is "40.000000";
+    attribute syn_keep : boolean;
+    attribute syn_noprune : boolean;
+    attribute syn_noprune of Structure : architecture is true;
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    PLLDInst_0: EPLLD
+        -- synopsys translate_off
+        generic map (PLLCAP=> "DISABLED", CLKOK_BYPASS=> "DISABLED", 
+        CLKOK_DIV=>  2, CLKOS_BYPASS=> "DISABLED", CLKOP_BYPASS=> "DISABLED", 
+        PHASE_CNTL=> "STATIC", DUTY=>  8, PHASEADJ=> "0.0", CLKOP_DIV=>  32, 
+        CLKFB_DIV=>  1, CLKI_DIV=>  1)
+        -- synopsys translate_on
+        port map (CLKI=>CLK_t, CLKFB=>CLKOP_t, RST=>RESET, 
+            RSTK=>scuba_vlo, DPAMODE=>scuba_vlo, DRPAI3=>scuba_vlo, 
+            DRPAI2=>scuba_vlo, DRPAI1=>scuba_vlo, DRPAI0=>scuba_vlo, 
+            DFPAI3=>scuba_vlo, DFPAI2=>scuba_vlo, DFPAI1=>scuba_vlo, 
+            DFPAI0=>scuba_vlo, CLKOP=>CLKOP_t, CLKOS=>open, CLKOK=>open, 
+            LOCK=>LOCK, CLKINTFB=>open);
+
+    CLKOP <= CLKOP_t;
+    CLK_t <= CLK;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adc_pll is
+    for Structure
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:EPLLD use entity ecp2m.EPLLD(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adc_pll_tmpl.vhd b/src/adc_pll_tmpl.vhd
new file mode 100644 (file)
index 0000000..221ccc4
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.2
+-- Thu Apr 16 11:20:59 2009
+
+-- parameterized module component declaration
+component adc_pll
+    port (CLK: in std_logic; RESET: in std_logic; CLKOP: out std_logic; 
+        LOCK: out std_logic);
+end component;
+
+-- parameterized module component instance
+__ : adc_pll
+    port map (CLK=>__, RESET=>__, CLKOP=>__, LOCK=>__);
diff --git a/src/adc_snoop_mem.lpc b/src/adc_snoop_mem.lpc
new file mode 100644 (file)
index 0000000..0153bba
--- /dev/null
@@ -0,0 +1,50 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=RAM_DP\r
+CoreRevision=6.1\r
+ModuleName=adc_snoop_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=10/13/2009\r
+Time=16:03:30\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+RAddress=1024\r
+RData=16\r
+WAddress=1024\r
+WData=16\r
+enByte=0\r
+ByteSize=9\r
+adPipeline=0\r
+inPipeline=0\r
+outPipeline=1\r
+MOR=0\r
+InData=Registered\r
+AdControl=Registered\r
+MemFile=\r
+MemFormat=bin\r
+Reset=Sync\r
+GSR=Enabled\r
+Pad=0\r
+EnECC=0\r
+Optimization=Speed\r
+EnSleep=ENABLED\r
+Pipeline=0\r
diff --git a/src/adc_snoop_mem.srp b/src/adc_snoop_mem.srp
new file mode 100644 (file)
index 0000000..8f43024
--- /dev/null
@@ -0,0 +1,28 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Tue Oct 13 16:03:30 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_snoop_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 10 -rwidth 16 -waddr_width 10 -wwidth 16 -rnum_words 1024 -wnum_words 1024 -outdata REGISTERED -resetmode SYNC -cascade -1 -e 
+    Circuit name     : adc_snoop_mem
+    Module type      : RAM_DP
+    Module Version   : 6.1
+    Ports            : 
+       Inputs       : WrAddress[9:0], RdAddress[9:0], Data[15:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn
+       Outputs      : Q[15:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : adc_snoop_mem.vhd
+    VHDL template    : adc_snoop_mem_tmpl.vhd
+    VHDL testbench    : tb_adc_snoop_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : adc_snoop_mem.srp
+    Element Usage    :
+         DP16KB : 1
+    Estimated Resource Usage:
+            EBR : 1
diff --git a/src/adc_snoop_mem.vhd b/src/adc_snoop_mem.vhd
new file mode 100644 (file)
index 0000000..501b487
--- /dev/null
@@ -0,0 +1,194 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type bram -wp 10 -rp 0011 -rdata_width 16 -data_width 16 -num_rows 1024 -outdata REGISTERED -resetmode SYNC -cascade -1 -e 
+
+-- Tue Oct 13 16:03:30 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adc_snoop_mem is
+    port (
+        WrAddress: in  std_logic_vector(9 downto 0); 
+        RdAddress: in  std_logic_vector(9 downto 0); 
+        Data: in  std_logic_vector(15 downto 0); 
+        WE: in  std_logic; 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        Q: out  std_logic_vector(15 downto 0));
+end adc_snoop_mem;
+
+architecture Structure of adc_snoop_mem is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute GSR : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute MEM_LPC_FILE of adc_snoop_mem_0_0_0 : label is "adc_snoop_mem.lpc";
+    attribute MEM_INIT_FILE of adc_snoop_mem_0_0_0 : label is "";
+    attribute CSDECODE_B of adc_snoop_mem_0_0_0 : label is "0b000";
+    attribute CSDECODE_A of adc_snoop_mem_0_0_0 : label is "0b000";
+    attribute WRITEMODE_B of adc_snoop_mem_0_0_0 : label is "NORMAL";
+    attribute WRITEMODE_A of adc_snoop_mem_0_0_0 : label is "NORMAL";
+    attribute GSR of adc_snoop_mem_0_0_0 : label is "DISABLED";
+    attribute RESETMODE of adc_snoop_mem_0_0_0 : label is "SYNC";
+    attribute REGMODE_B of adc_snoop_mem_0_0_0 : label is "OUTREG";
+    attribute REGMODE_A of adc_snoop_mem_0_0_0 : label is "OUTREG";
+    attribute DATA_WIDTH_B of adc_snoop_mem_0_0_0 : label is "18";
+    attribute DATA_WIDTH_A of adc_snoop_mem_0_0_0 : label is "18";
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    adc_snoop_mem_0_0_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "SYNC", 
+        REGMODE_B=> "OUTREG", REGMODE_A=> "OUTREG", DATA_WIDTH_B=>  18, 
+        DATA_WIDTH_A=>  18)
+        -- synopsys translate_on
+        port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), 
+            DIA3=>Data(3), DIA4=>Data(4), DIA5=>Data(5), DIA6=>Data(6), 
+            DIA7=>Data(7), DIA8=>Data(8), DIA9=>Data(9), DIA10=>Data(10), 
+            DIA11=>Data(11), DIA12=>Data(12), DIA13=>Data(13), 
+            DIA14=>Data(14), DIA15=>Data(15), DIA16=>scuba_vlo, 
+            DIA17=>scuba_vlo, ADA0=>scuba_vhi, ADA1=>scuba_vhi, 
+            ADA2=>scuba_vlo, ADA3=>scuba_vlo, ADA4=>WrAddress(0), 
+            ADA5=>WrAddress(1), ADA6=>WrAddress(2), ADA7=>WrAddress(3), 
+            ADA8=>WrAddress(4), ADA9=>WrAddress(5), ADA10=>WrAddress(6), 
+            ADA11=>WrAddress(7), ADA12=>WrAddress(8), 
+            ADA13=>WrAddress(9), CEA=>WrClockEn, CLKA=>WrClock, WEA=>WE, 
+            CSA0=>scuba_vlo, CSA1=>scuba_vlo, CSA2=>scuba_vlo, 
+            RSTA=>Reset, DIB0=>scuba_vlo, DIB1=>scuba_vlo, 
+            DIB2=>scuba_vlo, DIB3=>scuba_vlo, DIB4=>scuba_vlo, 
+            DIB5=>scuba_vlo, DIB6=>scuba_vlo, DIB7=>scuba_vlo, 
+            DIB8=>scuba_vlo, DIB9=>scuba_vlo, DIB10=>scuba_vlo, 
+            DIB11=>scuba_vlo, DIB12=>scuba_vlo, DIB13=>scuba_vlo, 
+            DIB14=>scuba_vlo, DIB15=>scuba_vlo, DIB16=>scuba_vlo, 
+            DIB17=>scuba_vlo, ADB0=>scuba_vlo, ADB1=>scuba_vlo, 
+            ADB2=>scuba_vlo, ADB3=>scuba_vlo, ADB4=>RdAddress(0), 
+            ADB5=>RdAddress(1), ADB6=>RdAddress(2), ADB7=>RdAddress(3), 
+            ADB8=>RdAddress(4), ADB9=>RdAddress(5), ADB10=>RdAddress(6), 
+            ADB11=>RdAddress(7), ADB12=>RdAddress(8), 
+            ADB13=>RdAddress(9), CEB=>RdClockEn, CLKB=>RdClock, 
+            WEB=>scuba_vlo, CSB0=>scuba_vlo, CSB1=>scuba_vlo, 
+            CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>open, DOA1=>open, 
+            DOA2=>open, DOA3=>open, DOA4=>open, DOA5=>open, DOA6=>open, 
+            DOA7=>open, DOA8=>open, DOA9=>open, DOA10=>open, DOA11=>open, 
+            DOA12=>open, DOA13=>open, DOA14=>open, DOA15=>open, 
+            DOA16=>open, DOA17=>open, DOB0=>Q(0), DOB1=>Q(1), DOB2=>Q(2), 
+            DOB3=>Q(3), DOB4=>Q(4), DOB5=>Q(5), DOB6=>Q(6), DOB7=>Q(7), 
+            DOB8=>Q(8), DOB9=>Q(9), DOB10=>Q(10), DOB11=>Q(11), 
+            DOB12=>Q(12), DOB13=>Q(13), DOB14=>Q(14), DOB15=>Q(15), 
+            DOB16=>open, DOB17=>open);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adc_snoop_mem is
+    for Structure
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adc_snoop_mem_generate.log b/src/adc_snoop_mem_generate.log
new file mode 100644 (file)
index 0000000..6e9dac6
--- /dev/null
@@ -0,0 +1,44 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Tue Oct 13 16:03:30 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n adc_snoop_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 10 -rwidth 16 -waddr_width 10 -wwidth 16 -rnum_words 1024 -wnum_words 1024 -outdata REGISTERED -resetmode SYNC -cascade -1 -e \r
+    Circuit name     : adc_snoop_mem\r
+    Module type      : RAM_DP\r
+    Module Version   : 6.1\r
+    Ports            : \r
+       Inputs       : WrAddress[9:0], RdAddress[9:0], Data[15:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn\r
+       Outputs      : Q[15:0]\r
+    I/O buffer       : not inserted\r
+    EDIF output      : suppressed\r
+    VHDL output      : adc_snoop_mem.vhd\r
+    VHDL template    : adc_snoop_mem_tmpl.vhd\r
+    VHDL testbench   : tb_adc_snoop_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : adc_snoop_mem.srp\r
+    Estimated Resource Usage:\r
+            EBR : 1\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: adc_snoop_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/adc_snoop_mem_tmpl.vhd b/src/adc_snoop_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..899a664
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+-- Tue Oct 13 16:03:30 2009
+
+-- parameterized module component declaration
+component adc_snoop_mem
+    port (WrAddress: in  std_logic_vector(9 downto 0); 
+        RdAddress: in  std_logic_vector(9 downto 0); 
+        Data: in  std_logic_vector(15 downto 0); WE: in  std_logic; 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; Q: out  std_logic_vector(15 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adc_snoop_mem
+    port map (WrAddress(9 downto 0)=>__, RdAddress(9 downto 0)=>__, Data(15 downto 0)=>__, 
+        WE=>__, RdClock=>__, RdClockEn=>__, Reset=>__, WrClock=>__, 
+        WrClockEn=>__, Q(15 downto 0)=>__);
diff --git a/src/adc_twochannels.vhd b/src/adc_twochannels.vhd
new file mode 100644 (file)
index 0000000..f48f729
--- /dev/null
@@ -0,0 +1,211 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity adc_twochannels is\r
+       port( CLK_IN            : in    std_logic;                                         -- DDR bit clock\r
+                 RESET_IN              : in    std_logic;\r
+                 CLOCK_IN              : in    std_logic_vector(1 downto 0);  -- word clock\r
+                 DATA_0_IN     : in    std_logic_vector(1 downto 0);  -- ADC channel one\r
+                 DATA_1_IN     : in    std_logic_vector(1 downto 0);  -- ADC channel two\r
+                 DATA_0_OUT    : out   std_logic_vector(11 downto 0); -- demultiplexed ADC channel one\r
+                 DATA_1_OUT    : out   std_logic_vector(11 downto 0); -- demultiplexed ADC channel two\r
+                 STORE_OUT             : out   std_logic;\r
+                 SWAP_OUT              : out   std_logic;\r
+                 CLOCK_OUT             : out   std_logic;\r
+                 DEBUG_OUT             : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behaviour of adc_twochannels is\r
+\r
+       -- Placer Directives\r
+       attribute HGROUP : string;\r
+       -- for whole architecture\r
+       attribute HGROUP of behaviour : architecture  is "TWOCHANNELS_group";\r
+\r
+       type half_data_t is array (0 to 1) of std_logic_vector(5 downto 0);\r
+       signal qda                      : half_data_t; -- serial input data, raising edge\r
+       signal qdb                      : half_data_t; -- serial input data, falling edge\r
+       signal parda            : half_data_t; -- parallel input data, raising edge\r
+       signal pardb            : half_data_t; -- parallel input data, falling edge\r
+       signal qc                       : half_data_t; -- serial ADCLK signal, (0) raising edge, (1) falling edge\r
+       type full_data_t is array (0 to 1) of std_logic_vector(11 downto 0);\r
+       signal muxed            : full_data_t;\r
+       signal data                     : full_data_t;\r
+\r
+       signal next_store_a     : std_logic;\r
+       signal store_a          : std_logic; -- store serial data A to parallel temp register\r
+       signal next_store_b     : std_logic;\r
+       signal store_b          : std_logic; -- store serial data B to parallel temp register\r
+       signal check            : std_logic; -- auxiliary signal for swapping\r
+       signal next_swap        : std_logic;\r
+       signal swap                     : std_logic; -- swap half words before assembling\r
+       signal store            : std_logic; -- assemble full word\r
+\r
+begin\r
+\r
+-------------------------------------------------------------------------\r
+-- Data reconstruction\r
+-------------------------------------------------------------------------\r
+-- Shift registers for both data streams from DDR input block\r
+THE_INSHIFT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       qda(0) <= (others => '0');\r
+                       qdb(0) <= (others => '0');\r
+                       qda(1) <= (others => '0');\r
+                       qdb(1) <= (others => '0');\r
+                       qc(0)  <= (others => '0');\r
+                       qc(1)  <= (others => '0');\r
+               else\r
+                       -- first channel\r
+                       qda(0) <= qda(0)(4 downto 0) & data_0_in(0);\r
+                       qdb(0) <= qdb(0)(4 downto 0) & data_0_in(1);\r
+                       -- second channel\r
+                       qda(1) <= qda(1)(4 downto 0) & data_1_in(0);\r
+                       qdb(1) <= qdb(1)(4 downto 0) & data_1_in(1);\r
+                       -- clock channel\r
+                       qc(0)  <= qc(0)(4 downto 0)  & clock_in(0);\r
+                       qc(1)  <= qc(1)(4 downto 0)  & clock_in(1);\r
+               end if;\r
+       end if;\r
+end process THE_INSHIFT_PROC;\r
+\r
+-- parallel temp registers to store raw serial data for multiplexing\r
+THE_PARALLEL_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( store_a = '1' ) then\r
+                       parda(0) <= qda(0);\r
+                       parda(1) <= qda(1);\r
+               end if;\r
+               if( store_b = '1' ) then\r
+                       pardb(0) <= qdb(0);\r
+                       pardb(1) <= qdb(1);\r
+               end if;\r
+       end if;\r
+end process THE_PARALLEL_STORE_PROC;\r
+\r
+-- synchronize combinatorial signals\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               store_a <= next_store_a;\r
+               store_b <= next_store_b;\r
+               check   <= store_b;\r
+               swap    <= next_swap;\r
+               store   <= store_a;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- store signals for half words\r
+next_store_a <= '1' when (qc(0)(5 downto 2) = b"0111") else '0';\r
+next_store_b <= '1' when (qc(1)(5 downto 2) = b"0111") else '0';\r
+\r
+-- swap half words indicator (can be improved: 10 -> preswap, preswap 01 -> swap)\r
+next_swap <= '1' when ( (store_a = '1') and (store_b = '0') and (check = '1') ) else '0';\r
+\r
+-- halfword swapping\r
+THE_SWAP_PROC: process( parda, pardb, swap )\r
+begin\r
+       case swap is\r
+               when '1'        =>      -- first channel\r
+                                               muxed(0)(0)  <= pardb(0)(5);\r
+                                               muxed(0)(1)  <= parda(0)(5);\r
+                                               muxed(0)(2)  <= pardb(0)(4);\r
+                                               muxed(0)(3)  <= parda(0)(4);\r
+                                               muxed(0)(4)  <= pardb(0)(3);\r
+                                               muxed(0)(5)  <= parda(0)(3);\r
+                                               muxed(0)(6)  <= pardb(0)(2);\r
+                                               muxed(0)(7)  <= parda(0)(2);\r
+                                               muxed(0)(8)  <= pardb(0)(1);\r
+                                               muxed(0)(9)  <= parda(0)(1);\r
+                                               muxed(0)(10) <= pardb(0)(0);\r
+                                               muxed(0)(11) <= parda(0)(0);\r
+                                               -- second channel\r
+                                               muxed(1)(0)  <= pardb(1)(5);\r
+                                               muxed(1)(1)  <= parda(1)(5);\r
+                                               muxed(1)(2)  <= pardb(1)(4);\r
+                                               muxed(1)(3)  <= parda(1)(4);\r
+                                               muxed(1)(4)  <= pardb(1)(3);\r
+                                               muxed(1)(5)  <= parda(1)(3);\r
+                                               muxed(1)(6)  <= pardb(1)(2);\r
+                                               muxed(1)(7)  <= parda(1)(2);\r
+                                               muxed(1)(8)  <= pardb(1)(1);\r
+                                               muxed(1)(9)  <= parda(1)(1);\r
+                                               muxed(1)(10) <= pardb(1)(0);\r
+                                               muxed(1)(11) <= parda(1)(0);\r
+               when '0'        =>      -- first channel\r
+                                               muxed(0)(0)  <= parda(0)(5);\r
+                                               muxed(0)(1)  <= pardb(0)(5);\r
+                                               muxed(0)(2)  <= parda(0)(4);\r
+                                               muxed(0)(3)  <= pardb(0)(4);\r
+                                               muxed(0)(4)  <= parda(0)(3);\r
+                                               muxed(0)(5)  <= pardb(0)(3);\r
+                                               muxed(0)(6)  <= parda(0)(2);\r
+                                               muxed(0)(7)  <= pardb(0)(2);\r
+                                               muxed(0)(8)  <= parda(0)(1);\r
+                                               muxed(0)(9)  <= pardb(0)(1);\r
+                                               muxed(0)(10) <= parda(0)(0);\r
+                                               muxed(0)(11) <= pardb(0)(0);\r
+                                               -- second channel\r
+                                               muxed(1)(0)  <= parda(1)(5);\r
+                                               muxed(1)(1)  <= pardb(1)(5);\r
+                                               muxed(1)(2)  <= parda(1)(4);\r
+                                               muxed(1)(3)  <= pardb(1)(4);\r
+                                               muxed(1)(4)  <= parda(1)(3);\r
+                                               muxed(1)(5)  <= pardb(1)(3);\r
+                                               muxed(1)(6)  <= parda(1)(2);\r
+                                               muxed(1)(7)  <= pardb(1)(2);\r
+                                               muxed(1)(8)  <= parda(1)(1);\r
+                                               muxed(1)(9)  <= pardb(1)(1);\r
+                                               muxed(1)(10) <= parda(1)(0);\r
+                                               muxed(1)(11) <= pardb(1)(0);\r
+               when others =>\r
+       end case;\r
+end process THE_SWAP_PROC;\r
+\r
+-- store parallel data\r
+THE_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( store = '1' ) then\r
+                       data(0) <= muxed(0);\r
+                       data(1) <= muxed(1);\r
+               end if;\r
+       end if;\r
+end process THE_STORE_PROC;\r
+\r
+---- output signals\r
+data_0_out <= data(0);\r
+data_1_out <= data(1);\r
+\r
+store_out <= store;\r
+\r
+swap_out  <= swap;\r
+\r
+clock_out <= qc(0)(3); -- timing adjustment\r
+\r
+-- debug signals\r
+debug_out(15)          <= store;\r
+debug_out(14)          <= swap;\r
+debug_out(13)          <= store_b;\r
+debug_out(12)          <= store_a;\r
+debug_out(11 downto 0) <= data(0);\r
+\r
+--debug_out(15 downto 15) <= (others => '0');\r
+--debug_out(14)           <= swap;\r
+--debug_out(13)           <= store_b;\r
+--debug_out(12)           <= store_a;\r
+--debug_out(11 downto 6)  <= parda(0);\r
+--debug_out(5 downto 0)   <= pardb(0);\r
+\r
+\r
+end behaviour;\r
+\r
diff --git a/src/adcmv3.vhd b/src/adcmv3.vhd
new file mode 100755 (executable)
index 0000000..83a52c4
--- /dev/null
@@ -0,0 +1,1271 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.trb_net_std.all;\r
+use work.adcmv3_components.all;\r
+\r
+entity adcmv3 is\r
+       port( CLK100M           : in    std_logic; -- OK -- 100MHz LVDS clock \r
+                 -- trigger inputs\r
+                 EXT_IN        : in    std_logic_vector(3 downto 0); -- OK -- external triggers\r
+                 -- APV stuff\r
+                 APV0A_CLK             : out   std_logic; -- OK -- APV bank 0: 40MHz phase adjustable clock \r
+                 APV0B_CLK             : out   std_logic; -- OK -- APV bank 0: 40MHz phase adjustable clock \r
+                 APV0A_TRG             : out   std_logic; -- OK -- APV bank 0: trigger pulse out\r
+                 APV0B_TRG             : out   std_logic; -- OK -- APV bank 0: trigger pulse out\r
+                 APV0_RST              : out   std_logic; -- OK -- APV bank 0: reset signal, low active\r
+                 APV0_SDA              : inout std_logic; -- OK -- APV bank 0: I2C bus SDA\r
+                 APV0_SCL              : inout std_logic; -- OK -- APV bank 0: I2C bus SCL\r
+                 ENA_LVDS              : out   std_logic_vector(7 downto 0); -- OK -- enable LVDS drivers\r
+                 APV1A_CLK             : out   std_logic; -- OK -- APV bank 1: 40MHz phase adjustable clock\r
+                 APV1B_CLK             : out   std_logic; -- OK -- APV bank 1: 40MHz phase adjustable clock\r
+                 APV1A_TRG             : out   std_logic; -- OK -- APV bank 1: trigger pulse out\r
+                 APV1B_TRG             : out   std_logic; -- OK -- APV bank 1: trigger pulse out\r
+                 APV1_RST              : out   std_logic; -- OK -- APV bank 1: reset signal, low active\r
+                 APV1_SDA              : inout std_logic; -- OK -- APV bank 1: I2C bus SDA\r
+                 APV1_SCL              : inout std_logic; -- OK -- APV bank 1: I2C bus SCL\r
+                 ENB_LVDS              : out   std_logic_vector(7 downto 0); -- OK -- enable LVDS drivers\r
+                 -- ADC0 stuff\r
+                 ADC0_CLK              : out   std_logic; -- OK -- ADC clock, 40MHz LVTTL\r
+                 ADC0_RST              : out   std_logic; -- OK -- ADC reset signal\r
+                 ADC0_PD               : out   std_logic; -- OK -- ADC powerdown signal\r
+                 ADC0_CS               : out   std_logic; -- OK -- ADC /CS signal\r
+                 ADC0_SDI              : out   std_logic; -- OK -- ADC serial data in\r
+                 ADC0_SCK              : out   std_logic; -- OK -- ADC serial clock\r
+                 ADC0_LCLK             : in    std_logic; -- OK -- ADC 240MHz DDR clock\r
+                 ADC0_ADCLK    : in    std_logic; -- OK -- ADC 40MHz frame clock\r
+                 ADC0_OUT              : in    std_logic_vector(7 downto 0); -- OK -- serial LVDS data streams\r
+                 -- ADC1 stuff\r
+                 ADC1_CLK              : out   std_logic; -- OK -- ADC clock, 40MHz LVTTL\r
+                 ADC1_RST              : out   std_logic; -- OK -- ADC reset signal\r
+                 ADC1_PD               : out   std_logic; -- OK -- ADC powerdown signal\r
+                 ADC1_CS               : out   std_logic; -- OK -- ADC /CS signal\r
+                 ADC1_SDI              : out   std_logic; -- OK -- ADC serial data in\r
+                 ADC1_SCK              : out   std_logic; -- OK -- ADC serial clock\r
+                 ADC1_LCLK             : in    std_logic; -- OK -- ADC 240MHz DDR clock\r
+                 ADC1_ADCLK    : in    std_logic; -- OK -- ADC 40MHz frame clock\r
+                 ADC1_OUT              : in    std_logic_vector(7 downto 0); -- OK -- serial LVDS data streams\r
+                 -- uC connections\r
+                 UC_RESET              : in    std_logic; -- OK -- uC reset, high active\r
+                 UC_REBOOT             : out   std_logic; -- OK -- was UC_FPGA(3), requests FPGA reboot\r
+                 -- SerDes pins        \r
+                 HDINN2                : in    std_logic; -- highspeed INPUT\r
+                 HDINP2                : in    std_logic; --\r
+                 HDOUTN2               : out   std_logic; -- highspeed OUTPUT\r
+                 HDOUTP2               : out   std_logic; -- \r
+                 SD_PRESENT    : in    std_logic; -- OK -- Present signal from SFP\r
+                 SD_LOS                : in    std_logic; -- OK -- Loss Of Signal from SFP\r
+                 SD_TXDIS              : out   std_logic; -- OK -- SFP transmitter disable\r
+                 ADCM_ONEWIRE  : inout std_logic; -- OK -- OneWire ID chip on ADCM\r
+                 -- Backplane sense wires\r
+                 BP_MODULE             : in    std_logic_vector(3 downto 0); -- OK -- module number input from backplane\r
+                 BP_SECTOR             : in    std_logic_vector(3 downto 0); -- OK -- sector number input from backplane\r
+                 BP_ONEWIRE    : inout std_logic; -- OK -- OneWire ID chip on backplane \r
+                 BP_LED                : out   std_logic; -- OK -- backplane LED \r
+                 -- LEDs\r
+                 FPGA_LED              : out   std_logic_vector(6 downto 3);  -- OK -- general purpose LEDS\r
+                 FPGA_LED_RXD  : out   std_logic; -- OK -- FPGA_LED(2)\r
+                 FPGA_LED_TXD  : out   std_logic; -- OK -- FPGA_LED(1)\r
+                 FPGA_LED_LINK : out   std_logic; -- OK -- FPGA_LED(0)\r
+                 FPGA_LED_PLL  : out   std_logic; -- OK -- PLL locked \r
+                 FPGA_LED_ADC  : out   std_logic_vector(1 downto 0);  -- OK -- ADCx OK LED \r
+                 -- 1Wire chips on APV FEs\r
+                 APV0_1W               : inout std_logic_vector(7 downto 0);\r
+                 APV1_1W               : inout std_logic_vector(7 downto 0);\r
+                 -- SPI FlashROM connections\r
+                 U_SPI_CS              : out   std_logic; -- OK -- chip select for SPI boot FlashROM\r
+                 U_SPI_SCK             : out   std_logic; -- OK -- clock\r
+                 U_SPI_SDI             : out   std_logic; -- OK -- connects to SI on the FlashROM\r
+                 U_SPI_SDO             : in    std_logic; -- OK -- connects to SO on the FlashROM\r
+                 -- Debug connections\r
+                 DBG_EXP               : out   std_logic_vector(43 downto 0)  -- OK -- SMC50 debug header\r
+               );\r
+end;\r
+\r
+architecture adcmv3 of adcmv3 is\r
+\r
+--     Signals\r
+       -- Clock related signals\r
+       signal clk100m_locked                   : std_logic; -- not needed at the moment\r
+       signal sysclk                                   : std_logic; -- clean 100MHz for distribution\r
+\r
+       signal adc0_ce                                  : std_logic;\r
+       signal adc0_valid                               : std_logic;\r
+       signal adc0_reset                               : std_logic;\r
+       signal adc0_powerdown                   : std_logic;\r
+       signal adc1_ce                                  : std_logic;\r
+       signal adc1_valid                               : std_logic;\r
+       signal adc1_reset                               : std_logic;\r
+       signal adc1_powerdown                   : std_logic;\r
+\r
+       signal clk_adc                                  : std_logic; -- 40MHz for ADC operation\r
+       signal clk_apv                                  : std_logic; -- 40MHz for APV operation (phase shiftable!)\r
+       signal clk40m_locked                    : std_logic;\r
+       signal clk40m_reset                             : std_logic;\r
+\r
+       signal async_reset                              : std_logic;\r
+\r
+       -- APV related signals\r
+       signal apv_sda_out                              : std_logic; -- APV SDA\r
+       signal apv_sda_in                               : std_logic;\r
+       signal apv_scl_out                              : std_logic; -- APV SCL\r
+       signal apv_scl_in                               : std_logic;\r
+       signal apv_trg                                  : std_logic; -- real APV trigger signal\r
+       signal apv_sync                                 : std_logic; -- artificial signal\r
+       signal apv_frame_reqd                   : std_logic; -- one 100MHz pulse per requested frame\r
+       signal apv0_reset                               : std_logic;\r
+       signal apv1_reset                               : std_logic;\r
+       signal apv_reset                                : std_logic;\r
+       signal adc_on                                   : std_logic_vector(15 downto 0); -- ordered after ADC0[7:0] and ADC1[15:8]\r
+       signal lvds_on                                  : std_logic_vector(15 downto 0); -- ordered after ADC0[7:0] and ADC1[15:8]\r
+\r
+       -- Control signals\r
+       signal ctrl_pll                                 : std_logic_vector(15 downto 0); -- PLL control register\r
+       signal status_pll                               : std_logic_vector(15 downto 0); -- PLL status register\r
+       signal ctrl_trg                                 : std_logic_vector(31 downto 0); -- TRG control register\r
+       signal ctrl_lvl                                 : std_logic_vector(31 downto 0); -- LVL control register\r
+                                       \r
+       signal ctrl_bitlow                              : std_logic_vector(11 downto 0); -- BIT_LOW setting for APV digital header\r
+       signal ctrl_bithigh                             : std_logic_vector(11 downto 0); -- BIT_HIGH setting for APV digital header\r
+       signal ctrl_flatlow                             : std_logic_vector(11 downto 0); -- FLAT_LOW setting\r
+       signal ctrl_flathigh                    : std_logic_vector(11 downto 0); -- FLAT_HIGH setting\r
+\r
+       signal maximum_trg                              : std_logic_vector(3 downto 0);\r
+\r
+       signal raw_buf_full                             : std_logic;\r
+       signal eds_buf_full                             : std_logic;\r
+       signal eds_buf_level                    : std_logic_vector(4 downto 0);\r
+\r
+       -- regIO data bus\r
+       signal regio_addr                               : std_logic_vector(c_REGIO_ADDRESS_WIDTH-1 downto 0);\r
+       signal regio_read_enable                : std_logic;\r
+       signal regio_write_enable               : std_logic;\r
+       signal regio_data_wr                    : std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);\r
+       signal regio_data_rd                    : std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);\r
+       signal regio_dataready                  : std_logic;\r
+       signal regio_no_more_data               : std_logic;\r
+       signal regio_write_ack                  : std_logic;\r
+       signal regio_unknown_addr               : std_logic;\r
+       signal regio_timeout                    : std_logic;\r
+\r
+       -- common status / control registers from RegIO\r
+       signal common_stat_reg                  : std_logic_vector(63 downto 0);\r
+       signal common_ctrl_reg                  : std_logic_vector(63 downto 0);\r
+\r
+       -- user defined "quick'n'dirty" registers\r
+       signal simple_status                    : std_logic_vector(127 downto 0);\r
+       signal simple_control                   : std_logic_vector(63 downto 0);\r
+\r
+       -- debug signals\r
+       signal test_reg                                 : std_logic_vector(31 downto 0);\r
+       signal trbrich_debug                    : std_logic_vector(63 downto 0);\r
+       signal trgctrl_debug                    : std_logic_vector(63 downto 0);\r
+       signal slave_debug                              : std_logic_vector(63 downto 0);\r
+       signal fifo_debug                               : std_logic_vector(63 downto 0);\r
+       signal raw_buf_debug                    : std_logic_vector(63 downto 0);\r
+\r
+       -- EDS / BUFFER signals (raw buf -> ped corr)\r
+       signal eds_data                                 : std_logic_vector(39 downto 0);\r
+       signal eds_avail                                : std_logic;\r
+       signal eds_done                                 : std_logic;\r
+       signal buf_addr                                 : std_logic_vector(6 downto 0);\r
+       signal buf_done                                 : std_logic;\r
+       signal buf_tick                                 : std_logic_vector(15 downto 0);\r
+       signal buf_start                                : std_logic_vector(15 downto 0);\r
+       signal buf_ready                                : std_logic_vector(15 downto 0); -- just for debugging!\r
+\r
+       type reg_38bit_t is array (0 to 15) of std_logic_vector(37 downto 0);\r
+       signal buf_data                                 : reg_38bit_t;\r
+\r
+       signal thr_addr                                 : std_logic_vector(6 downto 0);\r
+       type reg_18bit_t is array (0 to 15) of std_logic_vector(17 downto 0);\r
+       signal thr_data                                 : reg_18bit_t;\r
+       signal ped_data                                 : reg_18bit_t;\r
+\r
+       -- FIFO / DHDR signals (ped corr -> ipu stage)\r
+       signal dhdr_data                                : std_logic_vector(31 downto 0);\r
+       signal dhdr_length                              : std_logic_vector(15 downto 0);\r
+       signal dhdr_store                               : std_logic;\r
+       signal dhdr_buf_full                    : std_logic;\r
+\r
+       signal fifo_start                               : std_logic;\r
+       signal fifo_done                                : std_logic;\r
+       signal fifo_we                                  : std_logic_vector(15 downto 0);\r
+       type reg_40bit_t is array (0 to 15) of std_logic_vector(39 downto 0);\r
+       signal fifo_data                                : reg_40bit_t;\r
+\r
+       -- APV control / status signals\r
+       type reg_16bit_t is array (0 to 15) of std_logic_vector(15 downto 0);\r
+       signal adc_ctrl_reg                             : reg_16bit_t;\r
+       signal adc_stat_reg                             : reg_16bit_t;\r
+\r
+       signal debug                                    : std_logic_vector(42 downto 0);\r
+       signal debug_q                                  : std_logic_vector(42 downto 0);\r
+       signal debug_qq                                 : std_logic_vector(42 downto 0);\r
+       signal debug_clk                                : std_logic;\r
+       \r
+       -- LVL1 application interface\r
+       signal lvl1_trg_type                    : std_logic_vector(3 downto 0);\r
+       signal lvl1_trg_received                : std_logic;\r
+       signal lvl1_trg_number                  : std_logic_vector(15 downto 0);\r
+       signal lvl1_trg_code                    : std_logic_vector(7 downto 0);\r
+       signal lvl1_trg_information             : std_logic_vector(23 downto 0);\r
+       signal lvl1_error_pattern               : std_logic_vector(31 downto 0);\r
+       signal lvl1_trg_release                 : std_logic;\r
+       signal lvl1_trg_missing                 : std_logic;\r
+       signal timing_trg_found                 : std_logic;\r
+\r
+       -- IPU application interface\r
+       signal ipu_number                               : std_logic_vector(15 downto 0);\r
+       signal ipu_information                  : std_logic_vector(7 downto 0);\r
+       signal ipu_start_readout                : std_logic;\r
+       signal ipu_data                                 : std_logic_vector(31 downto 0);\r
+       signal ipu_dataready                    : std_logic;\r
+       signal ipu_readout_finished             : std_logic;\r
+       signal ipu_read                                 : std_logic;\r
+       signal ipu_length                               : std_logic_vector(15 downto 0);\r
+       signal ipu_error_pattern                : std_logic_vector(31 downto 0);\r
+\r
+       signal local_lvl1_counter               : std_logic_vector(15 downto 0);\r
+       signal local_lvl2_counter               : std_logic_vector(15 downto 0);\r
+\r
+       -- ADC signals\r
+       type reg_12bit_t is array (0 to 15) of std_logic_vector(11 downto 0);\r
+       signal adc_raw_data                             : reg_12bit_t; -- ADC specific clock domain\r
+       signal adc_data                                 : reg_12bit_t; -- common APV clock domain\r
+\r
+       signal adc1_testdata                    : std_logic_vector(11 downto 0);\r
+       signal adc0_testdata                    : std_logic_vector(11 downto 0);\r
+       signal adc1_select                              : std_logic_vector(2 downto 0);\r
+       signal adc0_select                              : std_logic_vector(2 downto 0);\r
+\r
+       -- input synchronizing\r
+       signal bp_sector_q                              : std_logic_vector(3 downto 0);\r
+       signal bp_sector_qq                             : std_logic_vector(3 downto 0);\r
+       signal bp_module_q                              : std_logic_vector(3 downto 0);\r
+       signal bp_module_qq                             : std_logic_vector(3 downto 0);\r
+\r
+       signal lsm_state_bits                   : std_logic_vector(3 downto 0);\r
+       signal reset_by_trb                             : std_logic;\r
+       signal global_sync_reset                : std_logic;\r
+\r
+       signal adc0_iodelay                             : std_logic_vector(3 downto 0);\r
+       signal adc1_iodelay                             : std_logic_vector(3 downto 0);\r
+\r
+\r
+\r
+-- Components\r
+       -- are now in adcmv2_components.vhd\r
+       \r
+begin\r
+\r
+----------------------------------------\r
+-- Async reset assignment             --\r
+----------------------------------------\r
+--async_reset <= '0'; -- no async reset\r
+async_reset <= uc_reset; -- uC reset pin\r
+\r
+\r
+----------------------------------------\r
+-- Reset handler / spike surpression  --\r
+----------------------------------------\r
+THE_RESET_HANDLER: reset_handler\r
+port map( CLEAR_IN                     => async_reset,\r
+                 RESET_IN                      => '0',\r
+                 CLK_IN                        => sysclk,\r
+                 TRB_RESET_IN          => reset_by_trb,\r
+                 RESET_OUT                     => global_sync_reset,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- 100MHz PLL -> 40MHz / 100MHz       --\r
+----------------------------------------\r
+-- 100MHz PLL, generating 40MHz and phase shifted 40MHz\r
+THE_40M_PLL: PLL_40M\r
+port map( CLK          => clk100m,\r
+                 RESET         => clk40m_reset,\r
+                 DPAMODE       => '1', -- dynamic control \r
+                 DPHASE0       => ctrl_pll(0),\r
+                 DPHASE1       => ctrl_pll(1),\r
+                 DPHASE2       => ctrl_pll(2),\r
+                 DPHASE3       => ctrl_pll(3),\r
+                 CLKOP         => clk_apv, -- fixed phase, used for logic \r
+                 CLKOS         => clk_adc, -- phase adjustable, for ODDRXC only\r
+                 LOCK          => clk40m_locked\r
+               );\r
+clk40m_reset <= ctrl_pll(7);\r
+\r
+-- 100MHz DLL, used for clock injection delay removal\r
+THE_100M_DLL: dll_100m\r
+port map( CLK          => clk100m,\r
+                 RESETN        => '1',\r
+                 ALUHOLD       => '0',\r
+                 CLKOP         => sysclk,\r
+                 CLKOS         => open,\r
+                 LOCK          => clk100m_locked\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- TRB endpoint                       --\r
+----------------------------------------\r
+THE_RICH_TRB: rich_trb\r
+port map( CLK100M_IN                           => clk100m, -- SerDes exclusive clock\r
+                 SYSCLK_IN                                     => sysclk, -- fabric clock\r
+                 RESET_IN                                      => global_sync_reset,\r
+                 SD_RXD_P_IN                           => hdinp2,\r
+                 SD_RXD_N_IN                           => hdinn2,\r
+                 SD_TXD_P_OUT                          => hdoutp2,     \r
+                 SD_TXD_N_OUT                          => hdoutn2,\r
+                 SD_PRESENT_IN                         => sd_present,\r
+                 SD_TXDIS_OUT                          => sd_txdis,\r
+                 SD_LOS_IN                                     => sd_los,\r
+                 ONEWIRE_INOUT                         => adcm_onewire,\r
+                 -- common regIO status / control registers\r
+             COMMON_STAT_REG_IN                => common_stat_reg,\r
+             COMMON_CTRL_REG_OUT               => common_ctrl_reg,\r
+             -- status register input to regIO / control register output from regIO\r
+             CONTROL_OUT                               => simple_control,\r
+                 STATUS_IN                                     => simple_status,\r
+                 -- LVL1 signals\r
+                 LVL1_TRG_TYPE_OUT                     => lvl1_trg_type,\r
+                 LVL1_TRG_RECEIVED_OUT         => lvl1_trg_received,\r
+                 LVL1_TRG_NUMBER_OUT           => lvl1_trg_number,\r
+                 LVL1_TRG_CODE_OUT                     => lvl1_trg_code,\r
+                 LVL1_TRG_INFORMATION_OUT      => lvl1_trg_information,\r
+                 LVL1_ERROR_PATTERN_IN         => lvl1_error_pattern,\r
+                 LVL1_TRG_RELEASE_IN           => lvl1_trg_release,\r
+             TIMING_TRG_FOUND_IN               => timing_trg_found,\r
+                 -- IPU data channel signals (yes, we will use ComputeNodes (tm) (R) (C) one day... :-)\r
+                 IPU_NUMBER_OUT                        => ipu_number,\r
+                 IPU_INFORMATION_OUT           => ipu_information,\r
+                 IPU_START_READOUT_OUT         => ipu_start_readout,\r
+                 IPU_DATA_IN                           => ipu_data,\r
+                 IPU_DATAREADY_IN                      => ipu_dataready,\r
+                 IPU_READOUT_FINISHED_IN       => ipu_readout_finished,\r
+                 IPU_READ_OUT                          => ipu_read,\r
+                 IPU_LENGTH_IN                         => ipu_length,\r
+                 IPU_ERROR_PATTERN_IN          => ipu_error_pattern,\r
+                 -- regIO bus\r
+             REGIO_ADDR_OUT                    => regio_addr,\r
+             REGIO_READ_ENABLE_OUT             => regio_read_enable,\r
+             REGIO_WRITE_ENABLE_OUT    => regio_write_enable,\r
+             REGIO_DATA_OUT                    => regio_data_wr,\r
+             REGIO_DATA_IN                             => regio_data_rd,\r
+             REGIO_DATAREADY_IN                => regio_dataready,\r
+             REGIO_NO_MORE_DATA_IN             => regio_no_more_data,\r
+             REGIO_WRITE_ACK_IN                => regio_write_ack,\r
+             REGIO_UNKNOWN_ADDR_IN             => regio_unknown_addr,\r
+             REGIO_TIMEOUT_OUT                 => regio_timeout,\r
+             -- status LEDs\r
+                 LED_LINK_STAT                         => fpga_led_link,\r
+                 LED_LINK_TXD                          => fpga_led_txd,\r
+                 LED_LINK_RXD                          => fpga_led_rxd,\r
+                 LINK_BSM_OUT                          => lsm_state_bits, -- LinkStateMachine bits\r
+                 RESET_OUT                                     => reset_by_trb,\r
+                 DEBUG                                         => trbrich_debug --open \r
+               );\r
+\r
+-- LVL1 error pattern, to be sent back to CTS with each trigger\r
+lvl1_error_pattern(31 downto 22) <= (others => '0');\r
+lvl1_error_pattern(21)           <= '0'; -- buffers almost full\r
+lvl1_error_pattern(20)           <= '0'; -- buffers half full\r
+lvl1_error_pattern(19 downto 18) <= (others => '0');\r
+lvl1_error_pattern(17)           <= '0'; -- lvl1_trg_missing; -- missing timing trigger\r
+lvl1_error_pattern(16)           <= '0'; -- LVL1 tag mismatch with local counters (done by Jan)\r
+lvl1_error_pattern(15 downto 0)  <= (others => '0'); \r
+\r
+\r
+------------------------------------------------------------------\r
+-- DEBUG DEBUG DEBUG\r
+------------------------------------------------------------------\r
+debug_clk           <= sysclk;\r
+\r
+--debug(42 downto 0)  <= (others => '0');\r
+\r
+debug(42 downto 39) <= (others => '0'); \r
+-- IPU signals\r
+debug(38 downto 35) <= ipu_number(3 downto 0);\r
+debug(34)           <= ipu_start_readout;\r
+debug(33)           <= ipu_dataready;\r
+debug(32)           <= ipu_read;\r
+debug(31)           <= ipu_readout_finished;\r
+-- FIFO signals\r
+debug(30)           <= fifo_start;        -- ped_corr_ctrl -> ipu_stage      => data procession starts (unused in ipu_stage)\r
+debug(29)           <= fifo_we(0);        -- ped_corr_ctrl -> ipu_stage      => transfer processed data into data FIFO (0)\r
+debug(28)           <= fifo_done;         -- ped_corr_ctrl -> ipu_stage      => store length count data in small FIFOs\r
+debug(27)           <= dhdr_store;        -- ped_corr_ctrl -> ipu_stage      => store DHDR information for IPU\r
+debug(26)           <= dhdr_buf_full;     -- ipu_stage     ->\r
+-- EventDataSheet / buffer signals\r
+debug(25)           <= buf_done;          -- ped_corr_ctrl -> raw_buf_stage  => raw data has been processed\r
+debug(24)           <= buf_tick(0);       -- raw_buf_stage -> ped_corr_ctrl  => synced tickmarks\r
+debug(23)           <= buf_ready(0);      -- raw_buf_stage                   => adc_last\r
+debug(22)           <= buf_start(0);      -- raw_buf_stage -> ped_corr_ctrl  => adc_start\r
+debug(21 downto 17) <= buf_data(0)(34 downto 30);\r
+debug(16)           <= raw_buf_full;      -- raw_buf_stage -> apv_trgctrl    => at least one raw buffer is full\r
+debug(15)           <= eds_done;          -- ped_corr_ctrl -> apv_trgctrl    => EDS data has been transfered, release buffer entry\r
+debug(14)           <= eds_avail;         -- apv_trgctrl   -> ped_corr_ctrl  => at least one EDS is available\r
+debug(13)           <= eds_buf_full;      -- apv_trgctrl                     => EDS buffer is full\r
+debug(12 downto 8)  <= eds_buf_level; \r
+-- timing trigger signals\r
+debug(7)            <= timing_trg_found;  -- apv_trgctrl   -> endpoint       => timing trigger has arrived\r
+debug(6)            <= lvl1_trg_received; -- endpoint      -> apv_trgctrl    => LVL1 trigger packet has arrived\r
+debug(5)            <= lvl1_trg_missing;  -- apv_trgctrl   -> endpoint       => two consecutive timing triggers found\r
+debug(4)            <= lvl1_trg_release;  -- apv_trgctrl   -> endpoint       => release LVL1 busy \r
+debug(3 downto 0)   <= lvl1_trg_number(3 downto 0);\r
+\r
+\r
+----------------------------------------------\r
+-- mixed status and control bit definitions --\r
+----------------------------------------------\r
+\r
+-- Common status register\r
+common_stat_reg(63 downto 48) <= (others => '0');    -- LVL2 counter\r
+common_stat_reg(47 downto 32) <= (others => '0');    -- LVL1 counter (doen by Jan)\r
+common_stat_reg(31 downto 20) <= x"000";             -- reserved for temp sensor\r
+common_stat_reg(19 downto 6)  <= (others => '0');\r
+common_stat_reg(5)            <= '0';                -- LVL2 counter mismatch\r
+common_stat_reg(4)            <= '0';                -- LVL1 counter mismatch (done by Jan)\r
+common_stat_reg(3 downto 0)   <= (others => '0');\r
+\r
+-- Control register bit padding\r
+ctrl_bithigh  <= ctrl_lvl(31 downto 24) & x"0";\r
+ctrl_bitlow   <= ctrl_lvl(23 downto 16) & x"0";\r
+ctrl_flathigh <= ctrl_lvl(15 downto 8)  & x"0";\r
+ctrl_flatlow  <= ctrl_lvl(7 downto 0)   & x"0";\r
+\r
+-- LVDS driver enable\r
+ena_lvds(0) <= adc_on(4)  or lvds_on(4); \r
+ena_lvds(1) <= adc_on(3)  or lvds_on(3);\r
+ena_lvds(2) <= adc_on(5)  or lvds_on(5);\r
+ena_lvds(3) <= adc_on(2)  or lvds_on(2);\r
+ena_lvds(4) <= adc_on(6)  or lvds_on(6);\r
+ena_lvds(5) <= adc_on(1)  or lvds_on(1);\r
+ena_lvds(6) <= adc_on(7)  or lvds_on(7);\r
+ena_lvds(7) <= adc_on(0)  or lvds_on(0);\r
+                                    \r
+enb_lvds(0) <= adc_on(13) or lvds_on(13);\r
+enb_lvds(1) <= adc_on(10) or lvds_on(10);\r
+enb_lvds(2) <= adc_on(12) or lvds_on(12);\r
+enb_lvds(3) <= adc_on(11) or lvds_on(11);\r
+enb_lvds(4) <= adc_on(15) or lvds_on(15);\r
+enb_lvds(5) <= adc_on(8)  or lvds_on(8);\r
+enb_lvds(6) <= adc_on(14) or lvds_on(14);\r
+enb_lvds(7) <= adc_on(9)  or lvds_on(9);\r
+\r
+bp_led <= '1'; -- LED is against GND!\r
+\r
+\r
+----------------------------------------\r
+-- internal slave bus -> slow control --\r
+----------------------------------------\r
+THE_SLAVE_BUS: slave_bus\r
+port map( CLK_IN                                               => sysclk,\r
+                 RESET_IN                                              => global_sync_reset,\r
+                 -- RegIO signals\r
+                 REGIO_ADDR_IN                                 => regio_addr,\r
+                 REGIO_DATA_IN                                 => regio_data_wr,\r
+                 REGIO_DATA_OUT                                => regio_data_rd,\r
+                 REGIO_READ_ENABLE_IN                  => regio_read_enable,\r
+                 REGIO_WRITE_ENABLE_IN                 => regio_write_enable,\r
+                 REGIO_TIMEOUT_IN                              => regio_timeout,\r
+                 REGIO_DATAREADY_OUT                   => regio_dataready,\r
+                 REGIO_WRITE_ACK_OUT                   => regio_write_ack,\r
+                 REGIO_NO_MORE_DATA_OUT                => regio_no_more_data,\r
+                 REGIO_UNKNOWN_ADDR_OUT                => regio_unknown_addr,\r
+                 -- I2C connections\r
+                 SDA_IN                                                => apv_sda_in,\r
+                 SDA_OUT                                               => apv_sda_out,\r
+                 SCL_IN                                                => apv_scl_in,\r
+                 SCL_OUT                                               => apv_scl_out,\r
+                 -- 1Wire connections\r
+                 ONEWIRE_START_IN                              => '0', -- not used yet\r
+                 ONEWIRE_INOUT(15 downto 8)    => apv1_1w(7 downto 0),\r
+                 ONEWIRE_INOUT(7 downto 0)             => apv0_1w(7 downto 0),\r
+                 BP_ONEWIRE_INOUT                              => bp_onewire,\r
+                 -- SPI connections\r
+                 SPI_CS_OUT                                    => u_spi_cs,\r
+                 SPI_SCK_OUT                                   => u_spi_sck,\r
+                 SPI_SDI_IN                                    => u_spi_sdo,\r
+                 SPI_SDO_OUT                                   => u_spi_sdi,\r
+                 -- ADC 0 SPI connections\r
+                 SPI_ADC0_CS_OUT                               => adc0_cs,\r
+                 SPI_ADC0_SCK_OUT                              => adc0_sck,\r
+                 SPI_ADC0_SDO_OUT                              => adc0_sdi,\r
+                 ADC0_PLL_LOCKED_IN                    => adc0_valid,\r
+                 ADC0_PD_OUT                                   => adc0_powerdown,\r
+                 ADC0_RST_OUT                                  => adc0_reset,\r
+                 ADC0_DEL_OUT                                  => adc0_iodelay,\r
+                 ADC0_CLK_IN                                   => clk_apv,\r
+                 ADC0_DATA_IN                                  => adc0_testdata,\r
+                 ADC0_SEL_OUT                                  => adc0_select,\r
+                 APV0_RST_OUT                                  => apv0_reset,\r
+                 -- ADC 0 SPI connections\r
+                 SPI_ADC1_CS_OUT                               => adc1_cs,\r
+                 SPI_ADC1_SCK_OUT                              => adc1_sck,\r
+                 SPI_ADC1_SDO_OUT                              => adc1_sdi,\r
+                 ADC1_PLL_LOCKED_IN                    => adc1_valid,\r
+                 ADC1_PD_OUT                                   => adc1_powerdown,\r
+                 ADC1_RST_OUT                                  => adc1_reset,\r
+                 ADC1_DEL_OUT                                  => adc1_iodelay,\r
+                 ADC1_CLK_IN                                   => clk_apv,\r
+                 ADC1_DATA_IN                                  => adc1_testdata,\r
+                 ADC1_SEL_OUT                                  => adc1_select,\r
+                 APV1_RST_OUT                                  => apv1_reset,\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN                                  => bp_module_qq(2 downto 0),\r
+                 -- pedestal interface\r
+                 PED_ADDR_IN                                   => buf_addr,\r
+                 PED_DATA_0_OUT                                => ped_data(0),\r
+                 PED_DATA_1_OUT                                => ped_data(1),\r
+                 PED_DATA_2_OUT                                => ped_data(2),\r
+                 PED_DATA_3_OUT                                => ped_data(3),\r
+                 PED_DATA_4_OUT                                => ped_data(4),\r
+                 PED_DATA_5_OUT                                => ped_data(5),\r
+                 PED_DATA_6_OUT                                => ped_data(6),\r
+                 PED_DATA_7_OUT                                => ped_data(7),\r
+                 PED_DATA_8_OUT                                => ped_data(8),\r
+                 PED_DATA_9_OUT                                => ped_data(9),\r
+                 PED_DATA_10_OUT                               => ped_data(10),\r
+                 PED_DATA_11_OUT                               => ped_data(11),\r
+                 PED_DATA_12_OUT                               => ped_data(12),\r
+                 PED_DATA_13_OUT                               => ped_data(13),\r
+                 PED_DATA_14_OUT                               => ped_data(14),\r
+                 PED_DATA_15_OUT                               => ped_data(15),\r
+                 -- threshold interface\r
+                 THR_ADDR_IN                                   => thr_addr,\r
+                 THR_DATA_0_OUT                                => thr_data(0),\r
+                 THR_DATA_1_OUT                                => thr_data(1),\r
+                 THR_DATA_2_OUT                                => thr_data(2),\r
+                 THR_DATA_3_OUT                                => thr_data(3),\r
+                 THR_DATA_4_OUT                                => thr_data(4),\r
+                 THR_DATA_5_OUT                                => thr_data(5),\r
+                 THR_DATA_6_OUT                                => thr_data(6),\r
+                 THR_DATA_7_OUT                                => thr_data(7),\r
+                 THR_DATA_8_OUT                                => thr_data(8),\r
+                 THR_DATA_9_OUT                                => thr_data(9),\r
+                 THR_DATA_10_OUT                               => thr_data(10),\r
+                 THR_DATA_11_OUT                               => thr_data(11),\r
+                 THR_DATA_12_OUT                               => thr_data(12),\r
+                 THR_DATA_13_OUT                               => thr_data(13),\r
+                 THR_DATA_14_OUT                               => thr_data(14),\r
+                 THR_DATA_15_OUT                               => thr_data(15),\r
+                 -- APV control / status\r
+                 CTRL_0_OUT                                    => adc_ctrl_reg(0),\r
+                 CTRL_1_OUT                                    => adc_ctrl_reg(1),\r
+                 CTRL_2_OUT                                    => adc_ctrl_reg(2),\r
+                 CTRL_3_OUT                                    => adc_ctrl_reg(3),\r
+                 CTRL_4_OUT                                    => adc_ctrl_reg(4),\r
+                 CTRL_5_OUT                                    => adc_ctrl_reg(5),\r
+                 CTRL_6_OUT                                    => adc_ctrl_reg(6),\r
+                 CTRL_7_OUT                                    => adc_ctrl_reg(7),\r
+                 CTRL_8_OUT                                    => adc_ctrl_reg(8),\r
+                 CTRL_9_OUT                                    => adc_ctrl_reg(9),\r
+                 CTRL_10_OUT                                   => adc_ctrl_reg(10),\r
+                 CTRL_11_OUT                                   => adc_ctrl_reg(11),\r
+                 CTRL_12_OUT                                   => adc_ctrl_reg(12),\r
+                 CTRL_13_OUT                                   => adc_ctrl_reg(13),\r
+                 CTRL_14_OUT                                   => adc_ctrl_reg(14),\r
+                 CTRL_15_OUT                                   => adc_ctrl_reg(15),\r
+                 STAT_0_IN                                             => adc_stat_reg(0),\r
+                 STAT_1_IN                                             => adc_stat_reg(1),\r
+                 STAT_2_IN                                             => adc_stat_reg(2),\r
+                 STAT_3_IN                                             => adc_stat_reg(3),\r
+                 STAT_4_IN                                             => adc_stat_reg(4),\r
+                 STAT_5_IN                                             => adc_stat_reg(5),\r
+                 STAT_6_IN                                             => adc_stat_reg(6),\r
+                 STAT_7_IN                                             => adc_stat_reg(7),\r
+                 STAT_8_IN                                             => adc_stat_reg(8),\r
+                 STAT_9_IN                                             => adc_stat_reg(9),\r
+                 STAT_10_IN                                    => adc_stat_reg(10),\r
+                 STAT_11_IN                                    => adc_stat_reg(11),\r
+                 STAT_12_IN                                    => adc_stat_reg(12),\r
+                 STAT_13_IN                                    => adc_stat_reg(13),\r
+                 STAT_14_IN                                    => adc_stat_reg(14),\r
+                 STAT_15_IN                                    => adc_stat_reg(15),\r
+                 -- some control signals\r
+                 CTRL_LVL_OUT                                  => ctrl_lvl,\r
+                 CTRL_TRG_OUT                                  => ctrl_trg,\r
+                 CTRL_PLL_OUT                                  => ctrl_pll,\r
+                 STATUS_PLL_IN                                 => status_pll,\r
+                 -- temporary stuff \r
+                 TEST_REG_IN                                   => test_reg, -- short cut \r
+                 TEST_REG_OUT                                  => test_reg,\r
+                 -- Debug \r
+                 DEBUG_OUT                                             => slave_debug, --open\r
+                 STAT                                                  => open\r
+               ); \r
+\r
+-- PLL status register \r
+status_pll(15)          <= clk100m_locked;\r
+status_pll(14)          <= clk40m_locked;\r
+status_pll(13)          <= adc1_valid;\r
+status_pll(12)          <= adc0_valid;\r
+status_pll(11 downto 8) <= (others => '0');\r
+status_pll(7)           <= '0';          -- make it human readable\r
+status_pll(6 downto 4)  <= bp_sector_qq(2 downto 0); -- given by backplane DIP switch, for readback only\r
+status_pll(3)           <= '0';          -- make it human readable\r
+status_pll(2 downto 0)  <= bp_module_qq(2 downto 0); -- given by backplane DIP switch, for readback only\r
+\r
+-- Common status register, do not use.\r
+simple_status(127 downto 104) <= (others => '0');\r
+simple_status(103 downto 96)  <= trgctrl_debug(39 downto 32);\r
+simple_status(95 downto 64)   <= trgctrl_debug(31 downto 0);\r
+simple_status(63 downto 32)   <= (others => '0');\r
+simple_status(31 downto 16)   <= local_lvl2_counter;\r
+simple_status(15 downto 0)    <= local_lvl1_counter;\r
+\r
+-- all APVs are reset together\r
+apv_reset <= apv0_reset or apv1_reset;\r
+\r
+-- APV status registers\r
+adc_stat_reg(15) <= buf_data(15)(37 downto 30) & raw_buf_debug(63 downto 60) & x"f";\r
+adc_stat_reg(14) <= buf_data(14)(37 downto 30) & raw_buf_debug(59 downto 56) & x"e";\r
+adc_stat_reg(13) <= buf_data(13)(37 downto 30) & raw_buf_debug(55 downto 52) & x"d";\r
+adc_stat_reg(12) <= buf_data(12)(37 downto 30) & raw_buf_debug(51 downto 48) & x"c";\r
+adc_stat_reg(11) <= buf_data(11)(37 downto 30) & raw_buf_debug(47 downto 44) & x"b";\r
+adc_stat_reg(10) <= buf_data(10)(37 downto 30) & raw_buf_debug(43 downto 40) & x"a";\r
+adc_stat_reg(9)  <= buf_data(9)(37 downto 30)  & raw_buf_debug(39 downto 36) & x"9";\r
+adc_stat_reg(8)  <= buf_data(8)(37 downto 30)  & raw_buf_debug(35 downto 32) & x"8";\r
+adc_stat_reg(7)  <= buf_data(7)(37 downto 30)  & raw_buf_debug(31 downto 28) & x"7";\r
+adc_stat_reg(6)  <= buf_data(6)(37 downto 30)  & raw_buf_debug(27 downto 24) & x"6";\r
+adc_stat_reg(5)  <= buf_data(5)(37 downto 30)  & raw_buf_debug(23 downto 20) & x"5";\r
+adc_stat_reg(4)  <= buf_data(4)(37 downto 30)  & raw_buf_debug(19 downto 16) & x"4";\r
+adc_stat_reg(3)  <= buf_data(3)(37 downto 30)  & raw_buf_debug(15 downto 12) & x"3";\r
+adc_stat_reg(2)  <= buf_data(2)(37 downto 30)  & raw_buf_debug(11 downto 8)  & x"2";\r
+adc_stat_reg(1)  <= buf_data(1)(37 downto 30)  & raw_buf_debug(7 downto 4)   & x"1";\r
+adc_stat_reg(0)  <= buf_data(0)(37 downto 30)  & raw_buf_debug(3 downto 0)   & x"0";\r
+\r
+adc_on(15)       <= adc_ctrl_reg(15)(0);\r
+adc_on(14)       <= adc_ctrl_reg(14)(0);\r
+adc_on(13)       <= adc_ctrl_reg(13)(0);\r
+adc_on(12)       <= adc_ctrl_reg(12)(0);\r
+adc_on(11)       <= adc_ctrl_reg(11)(0);\r
+adc_on(10)       <= adc_ctrl_reg(10)(0);\r
+adc_on(9)        <= adc_ctrl_reg(9)(0);\r
+adc_on(8)        <= adc_ctrl_reg(8)(0);\r
+adc_on(7)        <= adc_ctrl_reg(7)(0);\r
+adc_on(6)        <= adc_ctrl_reg(6)(0);\r
+adc_on(5)        <= adc_ctrl_reg(5)(0);\r
+adc_on(4)        <= adc_ctrl_reg(4)(0);\r
+adc_on(3)        <= adc_ctrl_reg(3)(0);\r
+adc_on(2)        <= adc_ctrl_reg(2)(0);\r
+adc_on(1)        <= adc_ctrl_reg(1)(0);\r
+adc_on(0)        <= adc_ctrl_reg(0)(0);\r
+\r
+lvds_on(15)      <= adc_ctrl_reg(15)(1);\r
+lvds_on(14)      <= adc_ctrl_reg(14)(1);\r
+lvds_on(13)      <= adc_ctrl_reg(13)(1);\r
+lvds_on(12)      <= adc_ctrl_reg(12)(1);\r
+lvds_on(11)      <= adc_ctrl_reg(11)(1);\r
+lvds_on(10)      <= adc_ctrl_reg(10)(1);\r
+lvds_on(9)       <= adc_ctrl_reg(9)(1);\r
+lvds_on(8)       <= adc_ctrl_reg(8)(1);\r
+lvds_on(7)       <= adc_ctrl_reg(7)(1);\r
+lvds_on(6)       <= adc_ctrl_reg(6)(1);\r
+lvds_on(5)       <= adc_ctrl_reg(5)(1);\r
+lvds_on(4)       <= adc_ctrl_reg(4)(1);\r
+lvds_on(3)       <= adc_ctrl_reg(3)(1);\r
+lvds_on(2)       <= adc_ctrl_reg(2)(1);\r
+lvds_on(1)       <= adc_ctrl_reg(1)(1);\r
+lvds_on(0)       <= adc_ctrl_reg(0)(1);\r
+\r
+\r
+----------------------------------------\r
+-- IPU endpoint for data transport    --\r
+----------------------------------------\r
+THE_IPU_STAGE: ipu_fifo_stage \r
+port map( CLK_IN                                       => sysclk,\r
+                 RESET_IN                                      => global_sync_reset,\r
+                 -- Slow control signals        \r
+                 SECTOR_IN                                     => bp_sector_qq(2 downto 0), \r
+                 MODULE_IN                                     => bp_module_qq(2 downto 0), \r
+                 -- IPU channel connections \r
+                 IPU_NUMBER_IN                         => ipu_number,\r
+                 IPU_INFORMATION_IN            => ipu_information,\r
+                 IPU_START_READOUT_IN          => ipu_start_readout,\r
+                 IPU_DATA_OUT                          => ipu_data,\r
+                 IPU_DATAREADY_OUT                     => ipu_dataready,\r
+                 IPU_READOUT_FINISHED_OUT      => ipu_readout_finished,\r
+                 IPU_READ_IN                           => ipu_read,\r
+                 IPU_LENGTH_OUT                        => ipu_length,\r
+                 IPU_ERROR_PATTERN_OUT         => ipu_error_pattern,\r
+                 LVL2_COUNTER_OUT                      => local_lvl2_counter,\r
+                 -- DHDR buffer input \r
+                 DHDR_DATA_IN                          => dhdr_data,\r
+                 DHDR_LENGTH_IN                        => dhdr_length,\r
+                 DHDR_STORE_IN                         => dhdr_store,\r
+                 DHDR_BUF_FULL_OUT                     => dhdr_buf_full,\r
+                 -- processed data input\r
+                 FIFO_START_IN                         => fifo_start,\r
+                 FIFO_0_DATA_IN                        => fifo_data(0),\r
+                 FIFO_1_DATA_IN                        => fifo_data(1),\r
+                 FIFO_2_DATA_IN                        => fifo_data(2),\r
+                 FIFO_3_DATA_IN                        => fifo_data(3),\r
+                 FIFO_4_DATA_IN                        => fifo_data(4),\r
+                 FIFO_5_DATA_IN                        => fifo_data(5),\r
+                 FIFO_6_DATA_IN                        => fifo_data(6),\r
+                 FIFO_7_DATA_IN                        => fifo_data(7),\r
+                 FIFO_8_DATA_IN                        => fifo_data(8),\r
+                 FIFO_9_DATA_IN                        => fifo_data(9),\r
+                 FIFO_10_DATA_IN                       => fifo_data(10),\r
+                 FIFO_11_DATA_IN                       => fifo_data(11),\r
+                 FIFO_12_DATA_IN                       => fifo_data(12),\r
+                 FIFO_13_DATA_IN                       => fifo_data(13),\r
+                 FIFO_14_DATA_IN                       => fifo_data(14),\r
+                 FIFO_15_DATA_IN                       => fifo_data(15),\r
+                 FIFO_WE_IN                            => fifo_we,\r
+                 FIFO_DONE_IN                          => fifo_done,\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT                           => open,\r
+                 DBG_OUT                                       => fifo_debug --open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- Data processing unit               --\r
+----------------------------------------\r
+THE_PED_CORR_STAGE: ped_corr_ctrl\r
+port map( CLK_IN                       => sysclk,\r
+                 RESET_IN                      => global_sync_reset,\r
+                 EDS_DATA_IN           => eds_data,\r
+                 EDS_AVAIL_IN          => eds_avail,\r
+                 EDS_DONE_OUT          => eds_done,\r
+                 EVT_TYPE_IN           => b"000", -- BUG\r
+                 -- DHDR information -- to next stage\r
+                 DHDR_DATA_OUT         => dhdr_data,\r
+                 DHDR_LENGTH_OUT       => dhdr_length,\r
+                 DHDR_STORE_OUT        => dhdr_store,\r
+                 DHDR_BUF_FULL_IN      => dhdr_buf_full,\r
+                 -- data buffers -- from raw_buf_stage\r
+                 BUF_ADDR_OUT          => buf_addr,\r
+                 BUF_DONE_OUT          => buf_done,\r
+                 BUF_TICK_IN           => buf_tick,\r
+                 BUF_START_IN          => buf_start,\r
+                 -- raw data\r
+                 BUF_0_DATA_IN         => buf_data(0),\r
+                 BUF_1_DATA_IN         => buf_data(1),\r
+                 BUF_2_DATA_IN         => buf_data(2),\r
+                 BUF_3_DATA_IN         => buf_data(3),\r
+                 BUF_4_DATA_IN         => buf_data(4),\r
+                 BUF_5_DATA_IN         => buf_data(5),\r
+                 BUF_6_DATA_IN         => buf_data(6),\r
+                 BUF_7_DATA_IN         => buf_data(7),\r
+                 BUF_8_DATA_IN         => buf_data(8),\r
+                 BUF_9_DATA_IN         => buf_data(9),\r
+                 BUF_10_DATA_IN        => buf_data(10),\r
+                 BUF_11_DATA_IN        => buf_data(11),\r
+                 BUF_12_DATA_IN        => buf_data(12),\r
+                 BUF_13_DATA_IN        => buf_data(13),\r
+                 BUF_14_DATA_IN        => buf_data(14),\r
+                 BUF_15_DATA_IN        => buf_data(15),\r
+                 -- Pedestal data \r
+                 PED_ADDR_OUT          => open, -- BUGBUGBUG\r
+                 PED_0_DATA_IN         => ped_data(0),\r
+                 PED_1_DATA_IN         => ped_data(1),\r
+                 PED_2_DATA_IN         => ped_data(2),\r
+                 PED_3_DATA_IN         => ped_data(3),\r
+                 PED_4_DATA_IN         => ped_data(4),\r
+                 PED_5_DATA_IN         => ped_data(5),\r
+                 PED_6_DATA_IN         => ped_data(6),\r
+                 PED_7_DATA_IN         => ped_data(7),\r
+                 PED_8_DATA_IN         => ped_data(8),\r
+                 PED_9_DATA_IN         => ped_data(9),\r
+                 PED_10_DATA_IN        => ped_data(10),\r
+                 PED_11_DATA_IN        => ped_data(11),\r
+                 PED_12_DATA_IN        => ped_data(12),\r
+                 PED_13_DATA_IN        => ped_data(13),\r
+                 PED_14_DATA_IN        => ped_data(14),\r
+                 PED_15_DATA_IN        => ped_data(15),\r
+                 -- Threshold data\r
+                 THR_ADDR_OUT          => thr_addr,\r
+                 THR_0_DATA_IN         => thr_data(0),\r
+                 THR_1_DATA_IN         => thr_data(1),\r
+                 THR_2_DATA_IN         => thr_data(2),\r
+                 THR_3_DATA_IN         => thr_data(3),\r
+                 THR_4_DATA_IN         => thr_data(4),\r
+                 THR_5_DATA_IN         => thr_data(5),\r
+                 THR_6_DATA_IN         => thr_data(6),\r
+                 THR_7_DATA_IN         => thr_data(7),\r
+                 THR_8_DATA_IN         => thr_data(8),\r
+                 THR_9_DATA_IN         => thr_data(9),\r
+                 THR_10_DATA_IN        => thr_data(10),\r
+                 THR_11_DATA_IN        => thr_data(11),\r
+                 THR_12_DATA_IN        => thr_data(12),\r
+                 THR_13_DATA_IN        => thr_data(13),\r
+                 THR_14_DATA_IN        => thr_data(14),\r
+                 THR_15_DATA_IN        => thr_data(15),\r
+                 -- processed data\r
+                 FIFO_START_OUT        => fifo_start,\r
+                 FIFO_0_DATA_OUT       => fifo_data(0),\r
+                 FIFO_1_DATA_OUT       => fifo_data(1),\r
+                 FIFO_2_DATA_OUT       => fifo_data(2),\r
+                 FIFO_3_DATA_OUT       => fifo_data(3),\r
+                 FIFO_4_DATA_OUT       => fifo_data(4),\r
+                 FIFO_5_DATA_OUT       => fifo_data(5),\r
+                 FIFO_6_DATA_OUT       => fifo_data(6),\r
+                 FIFO_7_DATA_OUT       => fifo_data(7),\r
+                 FIFO_8_DATA_OUT       => fifo_data(8),\r
+                 FIFO_9_DATA_OUT       => fifo_data(9),\r
+                 FIFO_10_DATA_OUT      => fifo_data(10),\r
+                 FIFO_11_DATA_OUT      => fifo_data(11),\r
+                 FIFO_12_DATA_OUT      => fifo_data(12),\r
+                 FIFO_13_DATA_OUT      => fifo_data(13),\r
+                 FIFO_14_DATA_OUT      => fifo_data(14),\r
+                 FIFO_15_DATA_OUT      => fifo_data(15),\r
+                 FIFO_WE_OUT           => fifo_we,\r
+                 FIFO_DONE_OUT         => fifo_done,\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT           => open,\r
+                 DBG_OUT                       => open\r
+               );\r
+\r
+\r
+------------------------------------------\r
+-- Raw data processing and storage unit --\r
+------------------------------------------\r
+THE_RAW_BUF_STAGE: raw_buf_stage_new\r
+port map( CLK_IN                       => sysclk,\r
+                 CLK_APV_IN            => clk_apv,\r
+                 RESET_IN                      => reset_by_trb,\r
+                 -- trigger related signals\r
+                 APV_RESET_IN          => apv_reset,           -- (100MHz clock)\r
+                 APV_SYNC_IN           => apv_sync,            -- (40MHz APV clock)\r
+                 APV_FRAME_REQD_IN     => apv_frame_reqd,      -- (100MHz clock)\r
+                 -- ADC0 signals\r
+                 ADC0_VALID_IN         => adc0_valid,\r
+                 ADC0_0_DATA_IN        => adc_data(0),\r
+                 ADC0_1_DATA_IN        => adc_data(1),\r
+                 ADC0_2_DATA_IN        => adc_data(2),\r
+                 ADC0_3_DATA_IN        => adc_data(3),\r
+                 ADC0_4_DATA_IN        => adc_data(4),\r
+                 ADC0_5_DATA_IN        => adc_data(5),\r
+                 ADC0_6_DATA_IN        => adc_data(6),\r
+                 ADC0_7_DATA_IN        => adc_data(7),\r
+                 -- ADC1 signals\r
+                 ADC1_VALID_IN         => adc1_valid,\r
+                 ADC1_0_DATA_IN        => adc_data(8),\r
+                 ADC1_1_DATA_IN        => adc_data(9),\r
+                 ADC1_2_DATA_IN        => adc_data(10),\r
+                 ADC1_3_DATA_IN        => adc_data(11),\r
+                 ADC1_4_DATA_IN        => adc_data(12),\r
+                 ADC1_5_DATA_IN        => adc_data(13),\r
+                 ADC1_6_DATA_IN        => adc_data(14),\r
+                 ADC1_7_DATA_IN        => adc_data(15),\r
+                 -- Slow control registers\r
+                 MAX_TRG_NUM_IN        => maximum_trg,         -- automatically determined\r
+                 BIT_LOW_IN            => ctrl_bitlow,         -- from slow control\r
+                 BIT_HIGH_IN           => ctrl_bithigh,        -- from slow control\r
+                 FL_LOW_IN                     => ctrl_flatlow,        -- from slow control\r
+                 FL_HIGH_IN            => ctrl_flathigh,       -- from slow control\r
+                 APV_ON_IN                     => adc_on,\r
+                 -- 100MHZ synchronous interface\r
+                 -- APV raw buffers\r
+                 BUF_FULL_OUT          => raw_buf_full, -- NEW NEW NEW\r
+                 BUF_ADDR_IN           => buf_addr, -- from ped_corr_ctrl\r
+                 BUF_DONE_IN           => buf_done, -- from ped_corr_ctrl\r
+                 BUF_TICK_OUT          => buf_tick,\r
+                 BUF_START_OUT         => buf_start,\r
+                 BUF_READY_OUT         => buf_ready,\r
+                 BUF_0_DATA_OUT        => buf_data(0),         -- to ped_corr_ctrl \r
+                 BUF_1_DATA_OUT        => buf_data(1),         -- to ped_corr_ctrl\r
+                 BUF_2_DATA_OUT        => buf_data(2),         -- to ped_corr_ctrl\r
+                 BUF_3_DATA_OUT        => buf_data(3),         -- to ped_corr_ctrl\r
+                 BUF_4_DATA_OUT        => buf_data(4),         -- to ped_corr_ctrl\r
+                 BUF_5_DATA_OUT        => buf_data(5),         -- to ped_corr_ctrl\r
+                 BUF_6_DATA_OUT        => buf_data(6),         -- to ped_corr_ctrl\r
+                 BUF_7_DATA_OUT        => buf_data(7),         -- to ped_corr_ctrl\r
+                 BUF_8_DATA_OUT        => buf_data(8),         -- to ped_corr_ctrl\r
+                 BUF_9_DATA_OUT        => buf_data(9),         -- to ped_corr_ctrl\r
+                 BUF_10_DATA_OUT       => buf_data(10),        -- to ped_corr_ctrl\r
+                 BUF_11_DATA_OUT       => buf_data(11),        -- to ped_corr_ctrl\r
+                 BUF_12_DATA_OUT       => buf_data(12),        -- to ped_corr_ctrl\r
+                 BUF_13_DATA_OUT       => buf_data(13),        -- to ped_corr_ctrl\r
+                 BUF_14_DATA_OUT       => buf_data(14),        -- to ped_corr_ctrl\r
+                 BUF_15_DATA_OUT       => buf_data(15),        -- to ped_corr_ctrl\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     => raw_buf_debug --open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC1 data handler                  --\r
+----------------------------------------\r
+THE_ADC1_HANDLER: adc_data_handler_new \r
+port map( RESET_IN                     => reset_by_trb,\r
+                 ADC_LCLK_IN           => adc1_lclk,\r
+                 ADC_ADCLK_IN          => adc1_adclk,\r
+                 ADC_CHNL_IN           => adc1_out,\r
+                 PLL_CTRL_IN           => adc1_iodelay,\r
+                 ADC_DATA7_OUT         => adc_raw_data(15),\r
+                 ADC_DATA6_OUT         => adc_raw_data(14),\r
+                 ADC_DATA5_OUT         => adc_raw_data(13),\r
+                 ADC_DATA4_OUT         => adc_raw_data(12),\r
+                 ADC_DATA3_OUT         => adc_raw_data(11),\r
+                 ADC_DATA2_OUT         => adc_raw_data(10),\r
+                 ADC_DATA1_OUT         => adc_raw_data(9),\r
+                 ADC_DATA0_OUT         => adc_raw_data(8),\r
+                 ADC_CE_OUT            => adc1_ce,\r
+                 ADC_VALID_OUT         => adc1_valid,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC1 clock domain crossover        --\r
+----------------------------------------\r
+THE_ADC1_CROSSOVER:    adc_crossover\r
+port map( CLK_APV_IN                   => clk_apv,\r
+                 RESET_IN                              => global_sync_reset,\r
+                 -- ADC clock domain signals\r
+                 ADC_CLK_IN                    => adc1_lclk,\r
+                 ADC_CE_IN                     => adc1_ce,\r
+                 ADC_DATA_VALID_IN             => adc1_valid,\r
+                 ADC_DATA_7_IN                 => adc_raw_data(15),\r
+                 ADC_DATA_6_IN                 => adc_raw_data(14),\r
+                 ADC_DATA_5_IN                 => adc_raw_data(13),\r
+                 ADC_DATA_4_IN                 => adc_raw_data(12),\r
+                 ADC_DATA_3_IN                 => adc_raw_data(11),\r
+                 ADC_DATA_2_IN                 => adc_raw_data(10),\r
+                 ADC_DATA_1_IN                 => adc_raw_data(9),\r
+                 ADC_DATA_0_IN                 => adc_raw_data(8),\r
+                 LEVEL_WR_OUT                  => open,\r
+                 -- APV clock domain signals\r
+                 APV_DATA_7_OUT                => adc_data(15),\r
+                 APV_DATA_6_OUT                => adc_data(14),\r
+                 APV_DATA_5_OUT                => adc_data(13),\r
+                 APV_DATA_4_OUT                => adc_data(12),\r
+                 APV_DATA_3_OUT                => adc_data(11),\r
+                 APV_DATA_2_OUT                => adc_data(10),\r
+                 APV_DATA_1_OUT                => adc_data(9),\r
+                 APV_DATA_0_OUT                => adc_data(8),\r
+                 APV_DATA_VALID_OUT    => open,\r
+                 LEVEL_RD_OUT                  => open,\r
+                 -- Debug signals\r
+                 DEBUG_OUT                             => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC1 test data multiplexer         --\r
+----------------------------------------\r
+THE_ADC_1_SELECT: adc_channel_select\r
+port map( RESET_IN                     => reset_by_trb,\r
+                 ADC_CLK_IN            => clk_apv,\r
+                 ADC_SEL_IN            => adc1_select,\r
+                 ADC_7_IN                      => adc_data(15),\r
+                 ADC_6_IN                      => adc_data(14),\r
+                 ADC_5_IN                      => adc_data(13),\r
+                 ADC_4_IN                      => adc_data(12),\r
+                 ADC_3_IN                      => adc_data(11),\r
+                 ADC_2_IN                      => adc_data(10),\r
+                 ADC_1_IN                      => adc_data(9),\r
+                 ADC_0_IN                      => adc_data(8),\r
+                 ADC_CH_OUT            => adc1_testdata,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC0 data handler                  --\r
+----------------------------------------\r
+THE_ADC0_HANDLER: adc_data_handler_new \r
+port map( RESET_IN                     => reset_by_trb,\r
+                 ADC_LCLK_IN           => adc0_lclk,\r
+                 ADC_ADCLK_IN          => adc0_adclk,\r
+                 ADC_CHNL_IN           => adc0_out,\r
+                 PLL_CTRL_IN           => adc0_iodelay,\r
+                 ADC_DATA7_OUT         => adc_raw_data(7),\r
+                 ADC_DATA6_OUT         => adc_raw_data(6),\r
+                 ADC_DATA5_OUT         => adc_raw_data(5),\r
+                 ADC_DATA4_OUT         => adc_raw_data(4),\r
+                 ADC_DATA3_OUT         => adc_raw_data(3),\r
+                 ADC_DATA2_OUT         => adc_raw_data(2),\r
+                 ADC_DATA1_OUT         => adc_raw_data(1),\r
+                 ADC_DATA0_OUT         => adc_raw_data(0),\r
+                 ADC_CE_OUT            => adc0_ce,\r
+                 ADC_VALID_OUT         => adc0_valid,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC0 clock domain crossover        --\r
+----------------------------------------\r
+THE_ADC0_CROSSOVER:    adc_crossover\r
+port map( CLK_APV_IN                   => clk_apv,\r
+                 RESET_IN                              => global_sync_reset,\r
+                 -- ADC clock domain signals\r
+                 ADC_CLK_IN                    => adc0_lclk,\r
+                 ADC_CE_IN                     => adc0_ce,\r
+                 ADC_DATA_VALID_IN             => adc0_valid,\r
+                 ADC_DATA_7_IN                 => adc_raw_data(7),\r
+                 ADC_DATA_6_IN                 => adc_raw_data(6),\r
+                 ADC_DATA_5_IN                 => adc_raw_data(5),\r
+                 ADC_DATA_4_IN                 => adc_raw_data(4),\r
+                 ADC_DATA_3_IN                 => adc_raw_data(3),\r
+                 ADC_DATA_2_IN                 => adc_raw_data(2),\r
+                 ADC_DATA_1_IN                 => adc_raw_data(1),\r
+                 ADC_DATA_0_IN                 => adc_raw_data(0),\r
+                 LEVEL_WR_OUT                  => open,\r
+                 -- APV clock domain signals\r
+                 APV_DATA_7_OUT                => adc_data(7),\r
+                 APV_DATA_6_OUT                => adc_data(6),\r
+                 APV_DATA_5_OUT                => adc_data(5),\r
+                 APV_DATA_4_OUT                => adc_data(4),\r
+                 APV_DATA_3_OUT                => adc_data(3),\r
+                 APV_DATA_2_OUT                => adc_data(2),\r
+                 APV_DATA_1_OUT                => adc_data(1),\r
+                 APV_DATA_0_OUT                => adc_data(0),\r
+                 APV_DATA_VALID_OUT    => open,\r
+                 LEVEL_RD_OUT                  => open,\r
+                 -- Debug signals\r
+                 DEBUG_OUT                             => open\r
+               );\r
+\r
+               \r
+----------------------------------------\r
+-- ADC0 test data multiplexer         --\r
+----------------------------------------\r
+THE_ADC_0_SELECT: adc_channel_select\r
+port map( RESET_IN                     => reset_by_trb,\r
+                 ADC_CLK_IN            => clk_apv,\r
+                 ADC_SEL_IN            => adc0_select,\r
+                 ADC_7_IN                      => adc_data(7),\r
+                 ADC_6_IN                      => adc_data(6),\r
+                 ADC_5_IN                      => adc_data(5),\r
+                 ADC_4_IN                      => adc_data(4),\r
+                 ADC_3_IN                      => adc_data(3),\r
+                 ADC_2_IN                      => adc_data(2),\r
+                 ADC_1_IN                      => adc_data(1),\r
+                 ADC_0_IN                      => adc_data(0),\r
+                 ADC_CH_OUT            => adc0_testdata,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- Trigger handler (APV specific)     --\r
+----------------------------------------\r
+THE_APV_TRGCTRL: apv_trgctrl\r
+port map( CLK_IN                               => sysclk,\r
+                 RESET_IN                              => global_sync_reset,\r
+                 CLK_APV_IN                    => clk_apv,\r
+                 -- Triggers\r
+                 SYNC_TRG_IN                   => common_ctrl_reg(31),         -- slow control pulse\r
+                 TIME_TRG_IN                   => ext_in,                                      -- external trigger inputs\r
+                 TRB_TRG_IN                    => common_ctrl_reg(19 downto 16), -- slow control triggers\r
+                 STILL_BUSY_IN                 => raw_buf_full,                        -- if no more frames are free in first stage buffer we must cease triggers.\r
+                 TRG_FOUND_OUT                 => timing_trg_found,            -- to TRB LVL1 endpoint\r
+                 -- slow control settings\r
+                 TRG_MAX_OUT                   => maximum_trg,\r
+                 TRG_3_TODO_IN                 => ctrl_trg(31 downto 28),      -- from slow control\r
+                 TRG_3_DELAY_IN                => ctrl_trg(27 downto 24),      -- from slow control\r
+                 TRG_2_TODO_IN                 => ctrl_trg(23 downto 20),      -- from slow control\r
+                 TRG_2_DELAY_IN                => ctrl_trg(19 downto 16),      -- from slow control\r
+                 TRG_1_TODO_IN                 => ctrl_trg(15 downto 12),      -- from slow control\r
+                 TRG_1_DELAY_IN                => ctrl_trg(11 downto 8),       -- from slow control\r
+                 TRG_0_TODO_IN                 => ctrl_trg(7 downto 4),        -- from slow control\r
+                 TRG_0_DELAY_IN                => ctrl_trg(3 downto 0),        -- from slow control\r
+                 TRG_SETUP_IN                  => ctrl_pll(15 downto 8),       -- from slow control\r
+                 -- TRB LVL1 signals\r
+                 TRB_TTAG_IN                   => lvl1_trg_number,                     -- from TRB LVL1 endpoint\r
+                 TRB_TRND_IN                   => lvl1_trg_code,                       -- from TRB LVL1 endpoint\r
+                 TRB_TTYPE_IN                  => lvl1_trg_type,                       -- from TRB LVL1 endpoint\r
+                 TRB_TRGRCVD_IN                => lvl1_trg_received,           -- from TRB LVL1 endpoint\r
+                 TRB_MISSING_OUT               => lvl1_trg_missing,\r
+                 TRB_RELEASE_OUT               => lvl1_trg_release,            -- to TRB LVL1 endpoint\r
+                 TRB_RST_COUNTER_IN    => common_ctrl_reg(30),         -- depreciated!\r
+                 TRB_COUNTER_OUT               => local_lvl1_counter,\r
+                 -- EDS signals\r
+                 EDS_DATA_OUT                  => eds_data,                            -- to ped_corr_stage\r
+                 EDS_AVAIL_OUT                 => eds_avail,                           -- to ped_corr_stage\r
+                 EDS_DONE_IN                   => eds_done,                            -- from ped_corr_stage\r
+                 EDS_FULL_OUT                  => eds_buf_full,\r
+                 EDS_LEVEL_OUT                 => eds_buf_level,\r
+                 FRM_REQD_OUT                  => apv_frame_reqd,                      -- to raw_buf_stage (100MHz clock)\r
+                 -- APV signals        \r
+                 APV_TRG_OUT                   => apv_trg,                                     -- to APV frontends (40MHz APV clock)\r
+                 APV_SYNC_OUT                  => apv_sync,                            -- to raw_buf_stage (40MHz APV clock)\r
+                 DEBUG_OUT                             => trgctrl_debug\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- ADC signals                        --\r
+----------------------------------------\r
+adc1_rst <= adc1_reset;\r
+adc1_pd  <= adc1_powerdown;\r
+\r
+THE_ADC1CLK_OUT: ODDRXC\r
+port map( DA => '1',\r
+                 DB => '0',\r
+                 CLK => clk_adc,\r
+                 RST => '0',\r
+                 Q => adc1_clk\r
+               );\r
+\r
+adc0_rst <= adc0_reset;\r
+adc0_pd  <= adc0_powerdown;\r
+\r
+THE_ADC0CLK_OUT: ODDRXC\r
+port map( DA => '1',\r
+                 DB => '0',\r
+                 CLK => clk_adc,\r
+                 RST => '0',\r
+                 Q => adc0_clk\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- APV signals                        --\r
+----------------------------------------\r
+-- SDA line output\r
+apv0_sda <= '0' when (apv_sda_out = '0') else 'Z';\r
+apv1_sda <= '0' when (apv_sda_out = '0') else 'Z';\r
+-- SDA line input (wired OR negative logic)\r
+apv_sda_in <= apv0_sda and apv1_sda;\r
+\r
+-- SCL line output\r
+apv0_scl <= '0' when (apv_scl_out = '0') else 'Z';\r
+apv1_scl <= '0' when (apv_scl_out = '0') else 'Z';\r
+-- SCL line input (wired OR negative logic)\r
+apv_scl_in <= apv0_scl and apv1_scl;\r
+\r
+-- Reset signal with correct polarity\r
+apv0_rst    <= not apv_reset;\r
+apv1_rst    <= not apv_reset;\r
+\r
+-- CLK and TRG signal\r
+-- CLK is shifted to meet timing constraints of APV\r
+THE_APV0ACLK_OUT: ODDRXC\r
+port map( DA => '0', \r
+                 DB => '1', \r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv0a_clk\r
+               );\r
+\r
+THE_APV0BCLK_OUT: ODDRXC\r
+port map( DA => '0',\r
+                 DB => '1',\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv0b_clk\r
+               );\r
+\r
+THE_APV1ACLK_OUT: ODDRXC\r
+port map( DA => '0',\r
+                 DB => '1',\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv1a_clk\r
+               );\r
+\r
+THE_APV1BCLK_OUT: ODDRXC\r
+port map( DA => '0',\r
+                 DB => '1',\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv1b_clk\r
+               );\r
+\r
+THE_APV0ATRG_OUT: ODDRXC\r
+port map( DA => apv_trg,\r
+                 DB => apv_trg,\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv0a_trg\r
+               );\r
+THE_APV0BTRG_OUT: ODDRXC\r
+port map( DA => apv_trg,\r
+                 DB => apv_trg,\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv0b_trg\r
+               );\r
+THE_APV1ATRG_OUT: ODDRXC\r
+port map( DA => apv_trg,\r
+                 DB => apv_trg,\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv1a_trg\r
+               );\r
+THE_APV1BTRG_OUT: ODDRXC\r
+port map( DA => apv_trg,\r
+                 DB => apv_trg,\r
+                 CLK => clk_apv,\r
+                 RST => '0',\r
+                 Q => apv1b_trg\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- DIP switch input registers         --\r
+----------------------------------------\r
+-- switch "OFF" => '1', switch "ON" => '0'; so invert it\r
+THE_BP_SYNC_PROC: process( sysclk )\r
+begin\r
+       if( rising_edge(sysclk) ) then\r
+               bp_module_qq <= bp_module_q;\r
+               bp_module_q  <= not bp_module;\r
+               bp_sector_qq <= bp_sector_q;\r
+               bp_sector_q  <= not bp_sector;\r
+       end if;\r
+end process THE_BP_SYNC_PROC;\r
+\r
+\r
+----------------------------------------\r
+-- Reboot handler (pulse triggered)   --\r
+----------------------------------------\r
+THE_REBOOT_HANDLER: reboot_handler\r
+port map( RESET_IN                     => reset_by_trb,\r
+                 CLK_IN                        => sysclk,\r
+                 START_IN                      => common_ctrl_reg(15),\r
+                 REBOOT_OUT            => uc_reboot,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+\r
+----------------------------------------\r
+-- FPGA debug header driver           --\r
+----------------------------------------\r
+THE_DBG_CLK_OUT: ODDRXC\r
+port map( DA => '1',\r
+                 DB => '0',\r
+                 CLK => debug_clk,\r
+                 RST => '0',\r
+                 Q => dbg_exp(43)\r
+               );\r
+               \r
+THE_DEBUG_REG_PROC: process( debug_clk )\r
+begin\r
+       if( rising_edge(debug_clk) ) then\r
+               dbg_exp(42 downto 0)  <= debug_qq(42 downto 0);\r
+               debug_qq(42 downto 0) <= debug_q(42 downto 0);\r
+               debug_q(42 downto 0)  <= debug(42 downto 0);\r
+       end if;\r
+end process THE_DEBUG_REG_PROC;\r
+\r
+\r
+----------------------------------------\r
+-- LED drivers                        --\r
+----------------------------------------\r
+fpga_led_adc(1) <= not adc1_valid; \r
+fpga_led_adc(0) <= not adc0_valid;\r
+fpga_led(6)     <= not lsm_state_bits(0); -- LED "0"\r
+fpga_led(5)     <= not lsm_state_bits(1); -- LED "1"\r
+fpga_led(4)     <= not lsm_state_bits(2); -- LED "2"\r
+fpga_led(3)     <= not lsm_state_bits(3); -- LED "3"\r
+fpga_led_pll    <= not clk40m_locked;\r
+\r
+\r
+----------------------------------------\r
+-- "unused" pins                      --\r
+----------------------------------------\r
+\r
+end adcmv3;\r
diff --git a/src/adcmv3_components.vhd b/src/adcmv3_components.vhd
new file mode 100755 (executable)
index 0000000..f09bf78
--- /dev/null
@@ -0,0 +1,1587 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use IEEE.numeric_std.ALL;\r
+use IEEE.std_logic_UNSIGNED.ALL;\r
+\r
+--library work;\r
+--use work.trb_net_std.all;\r
+\r
+package adcmv3_components is\r
+\r
+       component raw_buf_stage_new is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz local clock\r
+                 CLK_APV_IN            : in    std_logic; -- 40MHz APV clock\r
+                 RESET_IN                      : in    std_logic; -- general reset (100MHz)\r
+                 -- trigger related signals\r
+                 APV_RESET_IN          : in    std_logic; -- APV reset signal (100MHz)\r
+                 APV_SYNC_IN           : in    std_logic; -- APV sync trigger has been sent (40MHz)\r
+                 APV_FRAME_REQD_IN     : in    std_logic; -- one APV frame has been requested (100MHz)\r
+                 -- ADC0 signals\r
+                 ADC0_VALID_IN         : in    std_logic; -- 40M reconstructed clock is valid\r
+                 ADC0_0_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 0\r
+                 ADC0_1_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 1\r
+                 ADC0_2_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 2\r
+                 ADC0_3_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 3\r
+                 ADC0_4_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 4\r
+                 ADC0_5_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 5\r
+                 ADC0_6_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 6\r
+                 ADC0_7_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 7\r
+                 -- ADC1 signals\r
+                 ADC1_VALID_IN         : in    std_logic; -- 40M reconstructed clock is valid\r
+                 ADC1_0_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 0\r
+                 ADC1_1_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 1\r
+                 ADC1_2_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 2\r
+                 ADC1_3_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 3\r
+                 ADC1_4_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 4\r
+                 ADC1_5_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 5\r
+                 ADC1_6_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 6\r
+                 ADC1_7_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 7\r
+                 -- Slow control registers\r
+                 MAX_TRG_NUM_IN        : in    std_logic_vector(3 downto 0); -- maximum number of triggers / event\r
+                 BIT_LOW_IN            : in    std_logic_vector(11 downto 0); -- "bit low" threshold\r
+                 BIT_HIGH_IN           : in    std_logic_vector(11 downto 0); -- "bit high" threshold\r
+                 FL_LOW_IN                     : in    std_logic_vector(11 downto 0); -- "flatline low" threshold\r
+                 FL_HIGH_IN            : in    std_logic_vector(11 downto 0); -- "flatline high" threshold\r
+                 APV_ON_IN                     : in    std_logic_vector(15 downto 0); -- APV on/off bits from slow control\r
+                 -- 100MHZ synchronous interface\r
+                 -- APV raw buffers\r
+                 BUF_FULL_OUT          : out   std_logic;\r
+                 BUF_ADDR_IN           : in    std_logic_vector(6 downto 0);\r
+                 BUF_DONE_IN           : in    std_logic;\r
+                 BUF_TICK_OUT          : out   std_logic_vector(15 downto 0);\r
+                 BUF_START_OUT         : out   std_logic_vector(15 downto 0);\r
+                 BUF_READY_OUT         : out   std_logic_vector(15 downto 0);\r
+                 BUF_0_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_1_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_2_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_3_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_4_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_5_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_6_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_7_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_8_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_9_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_10_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_11_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_12_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_13_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_14_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_15_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component raw_buf_stage_new;\r
+       \r
+       component adc_data_handler_new is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 ADC_LCLK_IN           : in    std_logic; -- LCLK from ADC\r
+                 ADC_ADCLK_IN          : in    std_logic; -- ADCLK from ADC\r
+                 ADC_CHNL_IN           : in    std_logic_vector(7 downto 0);\r
+                 PLL_CTRL_IN           : in    std_logic_vector(3 downto 0);\r
+                 ADC_DATA7_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA6_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA5_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA4_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA3_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA2_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA1_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_DATA0_OUT         : out   std_logic_vector(11 downto 0);\r
+                 ADC_CE_OUT            : out   std_logic;\r
+                 ADC_VALID_OUT         : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component adc_data_handler_new;\r
+\r
+       component adc_crossover is\r
+       port( CLK_APV_IN                        : in    std_logic; -- APV 40MHz local clock\r
+                 RESET_IN                              : in    std_logic; -- general reset (100MHz)\r
+                 -- ADC clock domain signals\r
+                 ADC_CLK_IN                    : in    std_logic;\r
+                 ADC_CE_IN                     : in    std_logic; -- in case we use 240MHz + write pulse...\r
+                 ADC_DATA_VALID_IN             : in    std_logic;\r
+                 ADC_DATA_7_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_6_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_5_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_4_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_3_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_2_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_1_IN                 : in    std_logic_vector(11 downto 0);\r
+                 ADC_DATA_0_IN                 : in    std_logic_vector(11 downto 0);\r
+                 LEVEL_WR_OUT                  : out   std_logic_vector(4 downto 0);\r
+                 -- APV clock domain signals\r
+                 APV_DATA_7_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_6_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_5_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_4_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_3_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_2_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_1_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_0_OUT                : out   std_logic_vector(11 downto 0);\r
+                 APV_DATA_VALID_OUT    : out   std_logic;\r
+                 LEVEL_RD_OUT                  : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                             : out   std_logic_vector(31 downto 0)\r
+               );\r
+       end component adc_crossover;\r
+               \r
+       component crossover is\r
+       port( DATA                      : in    std_logic_vector(95 downto 0);\r
+                 WRCLOCK               : in    std_logic;\r
+                 RDCLOCK               : in    std_logic;\r
+                 WREN                  : in    std_logic;\r
+                 RDEN                  : in    std_logic;\r
+                 RESET                 : in    std_logic; -- asynchronous reset! \r
+                 RPRESET               : in    std_logic;\r
+                 Q                             : out   std_logic_vector(95 downto 0);\r
+                 WCNT                  : out   std_logic_vector(4 downto 0);\r
+                 RCNT                  : out   std_logic_vector(4 downto 0);\r
+                 EMPTY                 : out   std_logic;\r
+                 FULL                  : out   std_logic\r
+               );\r
+       end component crossover;\r
+\r
+       component slv_adc_la is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   : in    std_logic_vector(9 downto 0);\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I/O to the backend\r
+                 ADC_SEL_OUT   : out   std_logic_vector(2 downto 0);   -- selects the ADC channel to snoop from\r
+                 ADC_CLK_IN    : in    std_logic;                                              -- ADC reconstructed clock\r
+                 ADC_DATA_IN   : in    std_logic_vector(11 downto 0);  -- ADC selected channel data\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component slv_adc_la;\r
+\r
+-- NOT USED YET\r
+       component logic_analyzer is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- control signals\r
+                 ARM_IN                : in    std_logic; -- arm the machine\r
+                 TRG_IN                : in    std_logic; -- trigger the data acquisition\r
+                 MAX_SAMPLE_IN : in    std_logic_vector(9 downto 0); \r
+                 -- status signals\r
+                 SM_ADDR_OUT   : out   std_logic_vector(9 downto 0); -- sample RAM addresses\r
+                 SM_CE_OUT             : out   std_logic;\r
+                 SM_WE_OUT             : out   std_logic; -- write enable for sample RAM\r
+                 CLEAR_OUT             : out   std_logic; -- sample memory is being cleared\r
+                 RUN_OUT               : out   std_logic; -- ready for trigger\r
+                 SAMPLE_OUT    : out   std_logic; -- data acquisition running\r
+                 READY_OUT             : out   std_logic; -- data acquisition is finished\r
+                 LAST_OUT              : out   std_logic; -- last data word of sampling\r
+                 -- Status lines\r
+                 BSM_OUT               : out   std_logic_vector(3 downto 0);\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component logic_analyzer;\r
+\r
+       component onewire_spare_one is\r
+       port( ADDRESS   : in    std_logic_vector(2 downto 0); \r
+                 Q                     : out   std_logic_vector(3 downto 0)\r
+               );\r
+       end component onewire_spare_one;\r
+\r
+       component adc_onewire_map_mem is\r
+       port( ADDRESS   : in    std_logic_vector(6 downto 0); \r
+                 Q                     : out   std_logic_vector(3 downto 0)\r
+               );\r
+       end component adc_onewire_map_mem;\r
+\r
+       component adc_channel_select is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 ADC_CLK_IN            : in    std_logic;\r
+                 ADC_SEL_IN            : in    std_logic_vector(2 downto 0);\r
+                 ADC_7_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_6_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_5_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_4_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_3_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_2_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_1_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_0_IN                      : in    std_logic_vector(11 downto 0);\r
+                 ADC_CH_OUT            : out   std_logic_vector(11 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component slv_adc_snoop is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   : in    std_logic_vector(9 downto 0);\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I/O to the backend\r
+                 ADC_SEL_OUT   : out   std_logic_vector(2 downto 0);   -- selects the ADC channel to snoop from\r
+                 ADC_CLK_IN    : in    std_logic;                                              -- ADC reconstructed clock\r
+                 ADC_DATA_IN   : in    std_logic_vector(11 downto 0);  -- ADC selected channel data\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component adc_snoop_mem is\r
+       port( WRADDRESS : in    std_logic_vector(9 downto 0); \r
+                 RDADDRESS     : in    std_logic_vector(9 downto 0); \r
+                 DATA          : in    std_logic_vector(15 downto 0); \r
+                 WE            : in    std_logic; \r
+                 RDCLOCK       : in    std_logic; \r
+                 RDCLOCKEN     : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 WRCLOCK       : in    std_logic; \r
+                 WRCLOCKEN     : in    std_logic; \r
+                 Q                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+\r
+       component max_data is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 TODO_3_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_2_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_1_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_0_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_MAX_OUT          : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component comp4bit is\r
+       port( DATAA             : in    std_logic_vector(3 downto 0); \r
+                 DATAB         : in    std_logic_vector(3 downto 0); \r
+                 AGTB          : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component slv_register_bank is\r
+       generic( RESET_VALUE    : std_logic_vector(15 downto 0) := x"0001" );\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   : in    std_logic_vector(3 downto 0);\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I/O to the backend\r
+                 BACKPLANE_IN  : in    std_logic_vector(2 downto 0);\r
+                 CTRL_0_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_1_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_2_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_3_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_4_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_5_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_6_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_7_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_8_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_9_OUT    : out   std_logic_vector(15 downto 0);\r
+                 CTRL_10_OUT   : out   std_logic_vector(15 downto 0);\r
+                 CTRL_11_OUT   : out   std_logic_vector(15 downto 0);\r
+                 CTRL_12_OUT   : out   std_logic_vector(15 downto 0);\r
+                 CTRL_13_OUT   : out   std_logic_vector(15 downto 0);\r
+                 CTRL_14_OUT   : out   std_logic_vector(15 downto 0);\r
+                 CTRL_15_OUT   : out   std_logic_vector(15 downto 0);\r
+                 STAT_0_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_1_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_2_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_3_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_4_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_5_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_6_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_7_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_8_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_9_IN             : in    std_logic_vector(15 downto 0);\r
+                 STAT_10_IN    : in    std_logic_vector(15 downto 0);\r
+                 STAT_11_IN    : in    std_logic_vector(15 downto 0);\r
+                 STAT_12_IN    : in    std_logic_vector(15 downto 0);\r
+                 STAT_13_IN    : in    std_logic_vector(15 downto 0);\r
+                 STAT_14_IN    : in    std_logic_vector(15 downto 0);\r
+                 STAT_15_IN    : in    std_logic_vector(15 downto 0);\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component pulse_stretch is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 START_IN                      : in    std_logic;\r
+                 PULSE_OUT                     : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_adc_map_mem is\r
+       port( ADDRESS   : in    std_logic_vector(6 downto 0); \r
+                 Q                     : out   std_logic_vector(3 downto 0)\r
+                );\r
+       end component;\r
+\r
+       component adc_apv_map_mem is\r
+       port( ADDRESS   : in    std_logic_vector(6 downto 0); \r
+                 Q                     : out   std_logic_vector(3 downto 0)\r
+                );\r
+       end component;\r
+\r
+\r
+       component ped_thr_true is\r
+       port( DATAINA   : in    std_logic_vector(17 downto 0); \r
+                 DATAINB       : in    std_logic_vector(17 downto 0); \r
+                 ADDRESSA      : in    std_logic_vector(6 downto 0); \r
+                 ADDRESSB      : in    std_logic_vector(6 downto 0); \r
+                 CLOCKA        : in    std_logic; \r
+                 CLOCKB        : in    std_logic; \r
+                 CLOCKENA      : in    std_logic; \r
+                 CLOCKENB      : in    std_logic; \r
+                 WRA           : in    std_logic; \r
+                 WRB           : in    std_logic; \r
+                 RESETA        : in    std_logic; \r
+                 RESETB        : in    std_logic; \r
+                 QA            : out   std_logic_vector(17 downto 0); \r
+                 QB            : out   std_logic_vector(17 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component slv_ped_thr_mem is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   : in    std_logic_vector(10 downto 0);\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN  : in    std_logic_vector(2 downto 0);\r
+                 -- I/O to the backend\r
+                 MEM_CLK_IN    : in    std_logic;\r
+                 MEM_ADDR_IN   : in    std_logic_vector(6 downto 0);\r
+                 MEM_0_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_1_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_2_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_3_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_4_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_5_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_6_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_7_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_8_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_9_D_OUT   : out   std_logic_vector(17 downto 0);\r
+                 MEM_10_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 MEM_11_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 MEM_12_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 MEM_13_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 MEM_14_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 MEM_15_D_OUT  : out   std_logic_vector(17 downto 0);\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component reset_handler is\r
+       port( CLEAR_IN                  : in    std_logic; -- async reset from outside, if available (otherwise '0')\r
+                 RESET_IN                      : in    std_logic; -- for testing, if not needed, set to '0'\r
+                 CLK_IN                        : in    std_logic;\r
+                 TRB_RESET_IN          : in    std_logic;\r
+                 RESET_OUT                     : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component pll_40m is\r
+       port( CLK               : in    std_logic;\r
+                 RESET         : in    std_logic; \r
+                 DPAMODE       : in    std_logic;\r
+                 DPHASE0       : in    std_logic;\r
+                 DPHASE1       : in    std_logic;\r
+                 DPHASE2       : in    std_logic;\r
+                 DPHASE3       : in    std_logic;\r
+                 CLKOP         : out   std_logic;\r
+                 CLKOS         : out   std_logic;\r
+                 LOCK          : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component dll_100m is\r
+       port( CLK               : in    std_logic; \r
+                 RESETN        : in    std_logic; \r
+                 ALUHOLD       : in    std_logic; \r
+                 CLKOP         : out   std_logic; \r
+                 CLKOS         : out   std_logic; \r
+                 LOCK          : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component state_sync is\r
+       port( STATE_A_IN                : in    std_logic;\r
+                 CLK_B_IN                      : in    std_logic;\r
+                 RESET_B_IN            : in    std_logic;\r
+                 STATE_B_OUT           : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component pulse_sync is\r
+       port( CLK_A_IN                  : in    std_logic;\r
+                 RESET_A_IN            : in    std_logic;\r
+                 PULSE_A_IN            : in    std_logic;\r
+                 CLK_B_IN                      : in    std_logic;\r
+                 RESET_B_IN            : in    std_logic;\r
+                 PULSE_B_OUT           : out   std_logic\r
+               );\r
+       end component;  \r
+\r
+       component rich_trb is\r
+       port( CLK100M_IN                                : in    std_logic;\r
+                 SYSCLK_IN                                     : in    std_logic;\r
+                 RESET_IN                                      : in    std_logic;\r
+                 SD_RXD_P_IN                           : in    std_logic;\r
+                 SD_RXD_N_IN                           : in    std_logic;\r
+                 SD_TXD_P_OUT                          : out   std_logic;      \r
+                 SD_TXD_N_OUT                          : out   std_logic;\r
+                 SD_PRESENT_IN                         : in    std_logic;\r
+                 SD_TXDIS_OUT                          : out   std_logic;\r
+                 SD_LOS_IN                                     : in    std_logic;\r
+                 ONEWIRE_INOUT                         : inout std_logic;\r
+                 -- common regIO status / control registers\r
+--               COMMON_STAT_REG_IN            : in    std_logic_vector(std_COMSTATREG*c_REGIO_REGISTER_WIDTH-1 downto 0); -- common status register, bit definitions like in WIKI\r
+                 COMMON_STAT_REG_IN            : in    std_logic_vector(2*32-1 downto 0); -- common status register, bit definitions like in WIKI\r
+--               COMMON_CTRL_REG_OUT           : out   std_logic_vector(std_COMCTRLREG*c_REGIO_REGISTER_WIDTH-1 downto 0); -- common control register, bit definitions like in WIKI\r
+                 COMMON_CTRL_REG_OUT           : out   std_logic_vector(2*32-1 downto 0); -- common control register, bit definitions like in WIKI\r
+             -- status register input to regIO / control register output from regIO\r
+             CONTROL_OUT                               : out   std_logic_vector(63 downto 0);\r
+                 STATUS_IN                                     : in    std_logic_vector(127 downto 0); \r
+                 -- LVL1 signals\r
+                 LVL1_TRG_TYPE_OUT                     : out   std_logic_vector(3 downto 0);\r
+                 LVL1_TRG_RECEIVED_OUT         : out   std_logic;\r
+                 LVL1_TRG_NUMBER_OUT           : out   std_logic_vector(15 downto 0);\r
+                 LVL1_TRG_CODE_OUT                     : out   std_logic_vector(7 downto 0);\r
+                 LVL1_TRG_INFORMATION_OUT      : out   std_logic_vector(23 downto 0);\r
+                 LVL1_ERROR_PATTERN_IN         : in    std_logic_vector(31 downto 0);\r
+                 LVL1_TRG_RELEASE_IN           : in    std_logic;\r
+             TIMING_TRG_FOUND_IN               : in    std_logic;\r
+                 -- IPU data channel signals (yes, we will use ComputeNodes (tm) (R) (C) one day... :-)\r
+                 IPU_NUMBER_OUT                        : out   std_logic_vector(15 downto 0); -- trigger tag\r
+                 IPU_INFORMATION_OUT           : out   std_logic_vector(7 downto 0); -- trigger information\r
+                 IPU_START_READOUT_OUT         : out   std_logic; -- gimme data!\r
+                 IPU_DATA_IN                           : in    std_logic_vector(31 downto 0); -- detector data, equipped with DHDR\r
+                 IPU_DATAREADY_IN                      : in    std_logic; -- data is valid\r
+                 IPU_READOUT_FINISHED_IN       : in    std_logic; -- no more data, end transfer, send TRM\r
+                 IPU_READ_OUT                          : out   std_logic; -- read strobe, low every second cycle \r
+                 IPU_LENGTH_IN                         : in    std_logic_vector(15 downto 0); -- length of data packet (32bit words) (?)\r
+                 IPU_ERROR_PATTERN_IN          : in    std_logic_vector(31 downto 0); -- error pattern\r
+                 -- regIO bus\r
+--           REGIO_ADDR_OUT                    : out   std_logic_vector(c_REGIO_ADDRESS_WIDTH-1 downto 0);\r
+             REGIO_ADDR_OUT                    : out   std_logic_vector(16-1 downto 0);\r
+             REGIO_READ_ENABLE_OUT             : out   std_logic;\r
+             REGIO_WRITE_ENABLE_OUT    : out   std_logic;\r
+--           REGIO_DATA_OUT                    : out   std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);\r
+             REGIO_DATA_OUT                    : out   std_logic_vector(32-1 downto 0);\r
+--           REGIO_DATA_IN                             : in    std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);\r
+             REGIO_DATA_IN                             : in    std_logic_vector(32-1 downto 0);\r
+             REGIO_DATAREADY_IN                : in    std_logic;\r
+             REGIO_NO_MORE_DATA_IN             : in    std_logic;\r
+             REGIO_WRITE_ACK_IN                : in    std_logic;\r
+             REGIO_UNKNOWN_ADDR_IN             : in    std_logic;\r
+             REGIO_TIMEOUT_OUT                 : out   std_logic;\r
+             -- status LEDs\r
+                 LED_LINK_STAT                         : out   std_logic;\r
+                 LED_LINK_TXD                          : out   std_logic;\r
+                 LED_LINK_RXD                          : out   std_logic;\r
+             LINK_BSM_OUT                              : out   std_logic_vector(3 downto 0);\r
+             RESET_OUT                                 : out   std_logic;\r
+                 -- Debug\r
+                 DEBUG                                         : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component slave_bus is\r
+       port( CLK_IN                                    : in    std_logic;\r
+                 RESET_IN                                      : in    std_logic;\r
+                 -- RegIO signals\r
+                 REGIO_ADDR_IN                         : in    std_logic_vector(15 downto 0); -- address bus \r
+                 REGIO_DATA_IN                         : in    std_logic_vector(31 downto 0); -- data from TRB endpoint\r
+                 REGIO_DATA_OUT                        : out   std_logic_vector(31 downto 0); -- data to TRB endpoint\r
+                 REGIO_READ_ENABLE_IN          : in    std_logic; -- read pulse\r
+                 REGIO_WRITE_ENABLE_IN         : in    std_logic; -- write pulse\r
+                 REGIO_TIMEOUT_IN                      : in    std_logic; -- access timed out\r
+                 REGIO_DATAREADY_OUT           : out   std_logic; -- your data, master, as requested\r
+                 REGIO_WRITE_ACK_OUT           : out   std_logic; -- data accepted\r
+                 REGIO_NO_MORE_DATA_OUT        : out   std_logic; -- don't disturb me now\r
+                 REGIO_UNKNOWN_ADDR_OUT        : out   std_logic; -- noone here to answer your request\r
+                 -- I2C connections\r
+                 SDA_IN                                        : in    std_logic;\r
+                 SDA_OUT                                       : out   std_logic;\r
+                 SCL_IN                                        : in    std_logic;\r
+                 SCL_OUT                                       : out   std_logic;\r
+                 -- 1Wire connections\r
+                 ONEWIRE_START_IN                      : in    std_logic; -- start 1Wire scan (pulse)\r
+                 ONEWIRE_INOUT                         : inout std_logic_vector(15 downto 0); -- 1Wire ID on APV FEs\r
+                 BP_ONEWIRE_INOUT                      : inout std_logic; -- 1Wire ID on backplane\r
+                 -- SPI connections\r
+                 SPI_CS_OUT                            : out   std_logic;\r
+                 SPI_SCK_OUT                           : out   std_logic;\r
+                 SPI_SDI_IN                            : in    std_logic;\r
+                 SPI_SDO_OUT                           : out   std_logic;\r
+                 -- ADC 0 SPI connections\r
+                 SPI_ADC0_CS_OUT                       : out   std_logic;\r
+                 SPI_ADC0_SCK_OUT                      : out   std_logic;\r
+                 SPI_ADC0_SDO_OUT                      : out   std_logic;\r
+                 ADC0_PLL_LOCKED_IN            : in    std_logic;\r
+                 ADC0_PD_OUT                           : out   std_logic;\r
+                 ADC0_RST_OUT                          : out   std_logic;\r
+                 ADC0_DEL_OUT                          : out   std_logic_vector(3 downto 0);\r
+                 ADC0_CLK_IN                           : in    std_logic;\r
+                 ADC0_DATA_IN                          : in    std_logic_vector(11 downto 0);\r
+                 ADC0_SEL_OUT                          : out   std_logic_vector(2 downto 0);\r
+                 APV0_RST_OUT                          : out   std_logic;\r
+                 -- ADC 0 SPI connections\r
+                 SPI_ADC1_CS_OUT                       : out   std_logic;\r
+                 SPI_ADC1_SCK_OUT                      : out   std_logic;\r
+                 SPI_ADC1_SDO_OUT                      : out   std_logic;\r
+                 ADC1_PLL_LOCKED_IN            : in    std_logic;\r
+                 ADC1_PD_OUT                           : out   std_logic;\r
+                 ADC1_RST_OUT                          : out   std_logic;\r
+                 ADC1_DEL_OUT                          : out   std_logic_vector(3 downto 0);\r
+                 ADC1_CLK_IN                           : in    std_logic;\r
+                 ADC1_DATA_IN                          : in    std_logic_vector(11 downto 0);\r
+                 ADC1_SEL_OUT                          : out   std_logic_vector(2 downto 0);\r
+                 APV1_RST_OUT                          : out   std_logic;\r
+                 -- User specific inputs / outputs\r
+                 BACKPLANE_IN                          : in    std_logic_vector(2 downto 0);\r
+                 -- pedestal interface\r
+                 PED_ADDR_IN                           : in    std_logic_vector(6 downto 0); -- pedestal addressing from data handlers\r
+                 PED_DATA_0_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_1_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_2_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_3_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_4_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_5_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_6_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_7_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_8_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_9_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_10_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_11_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_12_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_13_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_14_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 PED_DATA_15_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 -- threshold interface\r
+                 THR_ADDR_IN                           : in    std_logic_vector(6 downto 0); -- threshold addressing from data handlers\r
+                 THR_DATA_0_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_1_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_2_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_3_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_4_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_5_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_6_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_7_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_8_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_9_OUT                        : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_10_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_11_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_12_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_13_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_14_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 THR_DATA_15_OUT                       : out   std_logic_vector(17 downto 0);\r
+                 -- APV control / status\r
+                 CTRL_0_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_1_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_2_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_3_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_4_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_5_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_6_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_7_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_8_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_9_OUT                            : out   std_logic_vector(15 downto 0);\r
+                 CTRL_10_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 CTRL_11_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 CTRL_12_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 CTRL_13_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 CTRL_14_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 CTRL_15_OUT                           : out   std_logic_vector(15 downto 0);\r
+                 STAT_0_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_1_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_2_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_3_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_4_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_5_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_6_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_7_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_8_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_9_IN                                     : in    std_logic_vector(15 downto 0);\r
+                 STAT_10_IN                            : in    std_logic_vector(15 downto 0);\r
+                 STAT_11_IN                            : in    std_logic_vector(15 downto 0);\r
+                 STAT_12_IN                            : in    std_logic_vector(15 downto 0);\r
+                 STAT_13_IN                            : in    std_logic_vector(15 downto 0);\r
+                 STAT_14_IN                            : in    std_logic_vector(15 downto 0);\r
+                 STAT_15_IN                            : in    std_logic_vector(15 downto 0);\r
+                 -- some control signals\r
+                 CTRL_LVL_OUT                          : out   std_logic_vector(31 downto 0);\r
+                 CTRL_TRG_OUT                          : out   std_logic_vector(31 downto 0);\r
+                 CTRL_PLL_OUT                          : out   std_logic_vector(15 downto 0);\r
+                 STATUS_PLL_IN                         : in    std_logic_vector(15 downto 0);\r
+                 -- temporary stuff\r
+                 TEST_REG_IN                           : in    std_logic_vector(31 downto 0); -- just for testing!\r
+                 TEST_REG_OUT                          : out   std_logic_vector(31 downto 0); -- just for testing!\r
+                 -- Debug\r
+                 DEBUG_OUT                                     : out   std_logic_vector(63 downto 0);\r
+                 STAT                                          : out   std_logic_vector(31 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component oddrxc is\r
+       port( DA   : in    std_logic;\r
+                 DB   : in    std_logic;\r
+                 CLK  : in    std_logic;\r
+                 RST  : in    std_logic;\r
+                 Q    : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component apv_trgctrl is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; \r
+                 CLK_APV_IN                    : in    std_logic; -- 40MHz phase shifted clock\r
+                 -- Triggers\r
+                 SYNC_TRG_IN                   : in    std_logic; -- 100MHz signal to SYNC APVs\r
+                 TIME_TRG_IN                   : in    std_logic_vector(3 downto 0); -- timing trigger inputs\r
+                 TRB_TRG_IN                    : in    std_logic_vector(3 downto 0); -- TRB trigger inputs\r
+                 STILL_BUSY_IN                 : in    std_logic; -- set to '1' if any buffer is in danger of overflow\r
+                 TRG_FOUND_OUT                 : out   std_logic; -- trigger found\r
+                 -- slow control settings\r
+                 TRG_MAX_OUT                   : out   std_logic_vector(3 downto 0); -- maximum number of triggers/event\r
+                 TRG_3_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 3\r
+                 TRG_3_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_2_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 2\r
+                 TRG_2_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_1_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 1\r
+                 TRG_1_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_0_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 0\r
+                 TRG_0_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_SETUP_IN                  : in    std_logic_vector(7 downto 0); -- setup of external triggers\r
+                 -- TRB LVL1 signals\r
+                 TRB_TTAG_IN                   : in    std_logic_vector(15 downto 0); -- TRB LVL1 trigger tag\r
+                 TRB_TRND_IN                   : in    std_logic_vector(7 downto 0); -- TRB LVL1 random tag\r
+                 TRB_TTYPE_IN                  : in    std_logic_vector(3 downto 0); -- TRB LVL1 trigger type\r
+                 TRB_TRGRCVD_IN                : in    std_logic; -- TRB LVL1 trigger received\r
+                 TRB_MISSING_OUT               : out   std_logic; -- TRB LVL1 trigger arrived, but has no corresponding timing trigger\r
+                 TRB_RELEASE_OUT               : out   std_logic; -- release TRB LVL1 channel\r
+                 TRB_RST_COUNTER_IN    : in    std_logic; -- reset timing trigger counter\r
+                 TRB_COUNTER_OUT               : out   std_logic_vector(15 downto 0);\r
+                 -- EDS signals\r
+                 EDS_DATA_OUT                  : out   std_logic_vector(39 downto 0); -- EventDataSheet (tm) data word\r
+                 EDS_AVAIL_OUT                 : out   std_logic; -- EDS valid, APV trigger done\r
+                 EDS_DONE_IN                   : in    std_logic; -- release current EDS buffer\r
+                 EDS_FULL_OUT                  : out   std_logic; -- EDS buffer is full\r
+                 EDS_LEVEL_OUT                 : out   std_logic_vector(4 downto 0);\r
+                 FRM_REQD_OUT                  : out   std_logic; -- frame requested, (level counter decrement)\r
+                 -- APV signals        \r
+                 APV_TRG_OUT                   : out   std_logic;\r
+                 APV_SYNC_OUT                  : out   std_logic;\r
+                 DEBUG_OUT                             : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component ped_corr_ctrl is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz local clock\r
+                 RESET_IN                      : in    std_logic; -- synchronous reset\r
+                 -- Slow control registers\r
+                 -- EDS buffer -- back to previous source stage\r
+                 EDS_DATA_IN           : in    std_logic_vector(39 downto 0);\r
+                 EDS_AVAIL_IN          : in    std_logic;\r
+                 EDS_DONE_OUT          : out   std_logic;\r
+                 EVT_TYPE_IN           : in    std_logic_vector(2 downto 0);\r
+                 -- DHDR information -- to next stage\r
+                 DHDR_DATA_OUT         : out   std_logic_vector(31 downto 0);\r
+                 DHDR_LENGTH_OUT       : out   std_logic_vector(15 downto 0);\r
+                 DHDR_STORE_OUT        : out   std_logic;\r
+                 DHDR_BUF_FULL_IN      : in    std_logic;\r
+                 -- data buffers -- from raw_buf_stage\r
+                 BUF_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 BUF_DONE_OUT          : out   std_logic;\r
+                 BUF_TICK_IN           : in    std_logic_vector(15 downto 0);\r
+                 BUF_START_IN          : in    std_logic_vector(15 downto 0);\r
+                 -- raw data\r
+                 BUF_0_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_1_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_2_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_3_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_4_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_5_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_6_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_7_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_8_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_9_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_10_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_11_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_12_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_13_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_14_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_15_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 -- Pedestal data \r
+                 PED_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 PED_0_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_1_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_2_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_3_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_4_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_5_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_6_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_7_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_8_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_9_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_10_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_11_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_12_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_13_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_14_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_15_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 -- Threshold data\r
+                 THR_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 THR_0_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_1_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_2_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_3_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_4_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_5_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_6_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_7_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_8_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_9_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_10_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_11_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_12_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_13_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_14_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_15_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 -- processed data\r
+                 FIFO_START_OUT        : out   std_logic;\r
+                 FIFO_0_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_1_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_2_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_3_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_4_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_5_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_6_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_7_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_8_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_9_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_10_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_11_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_12_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_13_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_14_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_15_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_WE_OUT           : out   std_logic_vector(15 downto 0);\r
+                 FIFO_DONE_OUT         : out   std_logic; -- write level information into small FIFOs\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT           : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component ipu_fifo_stage is\r
+       port( CLK_IN                                    : in    std_logic; -- 100MHz local clock\r
+                 RESET_IN                                      : in    std_logic; -- synchronous reset\r
+                 -- Slow control signals       \r
+                 SECTOR_IN                                     : in    std_logic_vector(2 downto 0);\r
+                 MODULE_IN                                     : in    std_logic_vector(2 downto 0);\r
+                 -- IPU channel connections\r
+                 IPU_NUMBER_IN                         : in    std_logic_vector(15 downto 0); -- trigger tag\r
+                 IPU_INFORMATION_IN            : in    std_logic_vector(7 downto 0); -- trigger information\r
+                 IPU_START_READOUT_IN          : in    std_logic; -- gimme data!\r
+                 IPU_DATA_OUT                          : out   std_logic_vector(31 downto 0); -- detector data, equipped with DHDR\r
+                 IPU_DATAREADY_OUT                     : out   std_logic; -- data is valid\r
+                 IPU_READOUT_FINISHED_OUT      : out   std_logic; -- no more data, end transfer, send TRM\r
+                 IPU_READ_IN                           : in    std_logic; -- read strobe, low every second cycle \r
+                 IPU_LENGTH_OUT                        : out   std_logic_vector(15 downto 0); -- length of data packet (32bit words) (?)\r
+                 IPU_ERROR_PATTERN_OUT         : out   std_logic_vector(31 downto 0); -- error pattern\r
+                 LVL2_COUNTER_OUT                      : out   std_logic_vector(15 downto 0); -- local IPU cycle counter\r
+                 -- DHDR buffer input\r
+                 DHDR_DATA_IN                          : in    std_logic_vector(31 downto 0);\r
+                 DHDR_LENGTH_IN                        : in    std_logic_vector(15 downto 0);\r
+                 DHDR_STORE_IN                         : in    std_logic;\r
+                 DHDR_BUF_FULL_OUT                     : out   std_logic;\r
+                 -- processed data input\r
+                 FIFO_START_IN                         : in    std_logic;\r
+                 FIFO_0_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_1_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_2_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_3_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_4_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_5_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_6_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_7_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_8_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_9_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_10_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_11_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_12_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_13_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_14_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_15_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_WE_IN                            : in    std_logic_vector(15 downto 0);\r
+                 FIFO_DONE_IN                          : in    std_logic; -- write level information into small FIFOs\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT                           : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                                       : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component ipu_dummy is\r
+       port( CLK_IN                                    : in    std_logic; -- 100MHz local clock\r
+                 RESET_IN                                      : in    std_logic; -- synchronous reset\r
+                 -- Slow control signals       \r
+                 MIN_COUNT_IN                          : in    std_logic_vector(15 downto 0); -- minimum counter value\r
+                 MAX_COUNT_IN                          : in    std_logic_vector(15 downto 0); -- maximum counter value\r
+                 CTRL_IN                                       : in    std_logic_vector(7 downto 0); -- control bits from slow control\r
+                 -- IPU channel connections\r
+                 IPU_NUMBER_IN                         : in    std_logic_vector(15 downto 0); -- trigger tag\r
+                 IPU_INFORMATION_IN            : in    std_logic_vector(7 downto 0); -- trigger information\r
+                 IPU_START_READOUT_IN          : in    std_logic; -- gimme data!\r
+                 IPU_DATA_OUT                          : out   std_logic_vector(31 downto 0); -- detector data, equipped with DHDR\r
+                 IPU_DATAREADY_OUT                     : out   std_logic; -- data is valid\r
+                 IPU_READOUT_FINISHED_OUT      : out   std_logic; -- no more data, end transfer, send TRM\r
+                 IPU_READ_IN                           : in    std_logic; -- read strobe, low every second cycle \r
+                 IPU_LENGTH_OUT                        : out   std_logic_vector(15 downto 0); -- length of data packet (32bit words) (?)\r
+                 IPU_ERROR_PATTERN_OUT         : out   std_logic_vector(31 downto 0); -- error pattern\r
+                 -- DHDR buffer\r
+                 LVL1_FIFO_RD_OUT                      : out   std_logic;\r
+                 LVL1_FIFO_EMPTY_IN            : in    std_logic;\r
+                 LVL1_FIFO_NUMBER_IN           : in    std_logic_vector(15 downto 0);\r
+                 LVL1_FIFO_CODE_IN                     : in    std_logic_vector(7 downto 0);\r
+                 LVL1_FIFO_INFORMATION_IN      : in    std_logic_vector(7 downto 0);\r
+                 LVL1_FIFO_TYPE_IN                     : in    std_logic_vector(3 downto 0);\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT                           : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                                       : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component reboot_handler is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 CLK_IN                        : in    std_logic;\r
+                 START_IN                      : in    std_logic;\r
+                 REBOOT_OUT            : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component real_trg_handler is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; \r
+                 TIME_TRG_IN                   : in    std_logic_vector(3 downto 0); -- timing trigger inputs\r
+                 TRB_TRG_IN                    : in    std_logic_vector(3 downto 0); -- TRB trigger inputs\r
+                 APV_TRGDONE_IN                : in    std_logic; -- APV trigger statemachine finished (one pulse)\r
+                 TRG_3_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 3\r
+                 TRG_2_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 2\r
+                 TRG_1_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 1\r
+                 TRG_0_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 0\r
+                 TRG_SETUP_IN                  : in    std_logic_vector(7 downto 0); -- setup of external triggers\r
+                 TRG_FOUND_OUT                 : out   std_logic; -- single pulse for endpoint\r
+                 TRB_TTAG_IN                   : in    std_logic_vector(15 downto 0); -- LVL1 16bit trigger tag \r
+                 TRB_TRND_IN                   : in    std_logic_vector(7 downto 0); -- LVL1 8bit random number \r
+                 TRB_TTYPE_IN                  : in    std_logic_vector(3 downto 0); -- LVL1 trigger type\r
+                 TRB_TRGRCVD_IN                : in    std_logic; -- LVL1 trigger has been received on TRB\r
+                 TRB_MISSING_OUT               : out   std_logic; -- LVL1 trigger without timing trigger\r
+                 RST_LVL1_COUNTER_IN   : in    std_logic; -- reset LVL1 counter\r
+                 LVL1_COUNTER_OUT              : out   std_logic_vector(15 downto 0); -- LVL1 counter\r
+                 BUSY_RELEASE_IN               : in    std_logic; -- common signal from busy calculator\r
+                 APV_TRGSEL_OUT                : out   std_logic_vector(3 downto 0); -- select one APV trigger state machine\r
+                 APV_TRGSTART_OUT              : out   std_logic; -- start one APV trigger state machine\r
+                 EDS_DATA_OUT                  : out   std_logic_vector(39 downto 0); -- EDS data\r
+                 EDS_WE_OUT                    : out   std_logic; -- EDS write enable (general interface)\r
+                 EDS_START_OUT                 : out   std_logic; -- separate increment signal for EDS buffer level\r
+                 EDS_READY_OUT                 : out   std_logic; -- APV trigger sequence done, TERMinate the TRB LVL1 trigger\r
+                 DBG_FRMCTR_OUT                : out   std_logic_vector(3 downto 0); -- framecounter itself\r
+                 BSM_OUT                               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT                             : out   std_logic_vector(63 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_trg_handler is\r
+       port( CLK_APV_IN                : in    std_logic; -- 40MHz phase shifted clock\r
+                 RESET_APV_IN          : in    std_logic; -- synced reset signal (40MHz APV)\r
+                 CLK_IN                        : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; -- synced reset signal (100MHz)\r
+                 APV_TRGSTART_IN       : in    std_logic; -- start signal for one sequence\r
+                 APV_TRGSEL_IN         : in    std_logic; -- select signal for one sequence\r
+                 APV_TRG_TODO_IN       : in    std_logic_vector(3 downto 0); -- number of APV triggers\r
+                 APV_TRG_DELAY_IN      : in    std_logic_vector(3 downto 0); -- delay between APV triggers\r
+                 APV_TRGDONE_OUT       : out   std_logic; -- APV trigger statemachine finished\r
+                 APV_TRG_OUT           : out   std_logic;\r
+                 APV_TRGSENT_OUT       : out   std_logic;\r
+                 BSM_OUT                       : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_sync_handler is\r
+       port( CLK_APV_IN                : in    std_logic; -- 40MHz phase shifted clock\r
+                 RESET_APV_IN          : in    std_logic; -- synced reset signal (40MHz APV)\r
+                 CLK_IN                        : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; -- synced reset signal (100MHz)\r
+                 APV_TRGSTART_IN       : in    std_logic; -- start signal for one sequence\r
+                 APV_TRGSEL_IN         : in    std_logic; -- select signal for one sequence\r
+                 APV_TRGDONE_OUT       : out   std_logic; -- APV trigger statemachine finished\r
+                 APV_TRG_OUT           : out   std_logic;\r
+                 APV_SYNC_OUT          : out   std_logic; -- signal for statemachines\r
+                 BSM_OUT                       : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component eds_buf is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; \r
+                 -- EDS input, all synced to CLK_IN\r
+                 EDS_DATA_IN           : in    std_logic_vector(39 downto 0); -- EDS data input\r
+                 EDS_WE_IN                     : in    std_logic; -- EDS write enable\r
+                 EDS_DONE_IN           : in    std_logic; -- release EDS \r
+                 EDS_DATA_OUT          : out   std_logic_vector(39 downto 0);\r
+                 EDS_AVAILABLE_OUT     : out   std_logic;\r
+                 -- trigger busy information\r
+                 BUF_FULL_OUT          : out   std_logic;\r
+                 BUF_LEVEL_OUT         : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component adc_pll is\r
+    port( CLK  : in    std_logic;\r
+         RESET : in    std_logic;\r
+         CLKOP : out   std_logic;      \r
+         LOCK  : out   std_logic\r
+        );\r
+       end component;\r
+                                               \r
+       component adc_ch_in is                     \r
+    port( DEL  : in    std_logic_vector(3 downto 0);\r
+         ECLK  : in    std_logic; \r
+         SCLK  : in    std_logic; \r
+                 RST   : in    std_logic;             \r
+                 DATA  : in    std_logic_vector(0 downto 0); \r
+                 Q             : out   std_logic_vector(1 downto 0)\r
+               );                                     \r
+       end component;                             \r
+\r
+       component adc_twochannels is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 CLOCK_IN              : in    std_logic_vector(1 downto 0);  -- DDR bit clock\r
+                 DATA_0_IN     : in    std_logic_vector(1 downto 0);  -- ADC channel one\r
+                 DATA_1_IN     : in    std_logic_vector(1 downto 0);  -- ADC channel two\r
+                 DATA_0_OUT    : out   std_logic_vector(11 downto 0); -- demultiplexed ADC channel one\r
+                 DATA_1_OUT    : out   std_logic_vector(11 downto 0); -- demultiplexed ADC channel two\r
+                 STORE_OUT             : out   std_logic;\r
+                 SWAP_OUT              : out   std_logic;\r
+                 CLOCK_OUT             : out   std_logic;\r
+                 DEBUG_OUT             : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_locker is\r
+       port( CLK_APV_IN                        : in    std_logic;\r
+                 RESET_IN                              : in    std_logic;\r
+                 ADC_RAW_IN                    : in    std_logic_vector(11 downto 0);  -- ADC: raw data, synchronous to ADC_CLK_IN\r
+                 ADC_VALID_IN                  : in    std_logic;                                              -- ADC: ser2par data is valid\r
+                 SYNC_IN                               : in    std_logic;                                              -- sync trigger input \r
+                 APV_ON_IN                             : in    std_logic;                                              -- this APV channel is switched on\r
+                 BIT_LOW_IN                    : in    std_logic_vector(11 downto 0);  -- slow control: threshold for digital '0'\r
+                 BIT_HIGH_IN                   : in    std_logic_vector(11 downto 0);  -- slow control: threshold for digital '1'\r
+                 FL_LOW_IN                             : in    std_logic_vector(11 downto 0);  -- lower threshold for ADC flatline\r
+                 FL_HIGH_IN                    : in    std_logic_vector(11 downto 0);  -- upper threshold for ADC flatline\r
+                 STATUS_IGNORE_OUT             : out   std_logic;                                              -- APV is to be ignored (effectively => switched off)\r
+                 STATUS_UNKNOWN_OUT    : out   std_logic;                                              -- APV is not initialized yet\r
+                 STATUS_BADADC_OUT             : out   std_logic;                                              -- ADC ser2par data is invalid\r
+                 STATUS_LOCKED_OUT             : out   std_logic;                                              -- APV locked successfully\r
+                 STATUS_LOST_OUT               : out   std_logic;                                              -- APV tickmark missing or wrong\r
+                 STATUS_NOSYNC_OUT             : out   std_logic;                                              -- APV did not lock successfully\r
+                 STATUS_MISSING_OUT    : out   std_logic;                                              -- APV is missing, ADC flatline detected\r
+                 STATUS_TICKMARK_OUT   : out   std_logic;\r
+                 FRAME_ROW_OUT                 : out   std_logic_vector(7 downto 0);   -- decoded row from APV header\r
+                 FRAME_ERROR_OUT               : out   std_logic;                                              -- decoded error bit from APV header\r
+                 FRAME_FLAT_OUT                : out   std_logic;                                              -- APV sends a flat line (analog dead?)\r
+                 FRAME_OVF_OUT                 : out   std_logic;                                              -- at least one channel in frame was overflow\r
+                 FRAME_UDF_OUT                 : out   std_logic;                                              -- at least one channel in frame was underflow\r
+                 FRAME_CTR_OUT                 : out   std_logic_vector(3 downto 0);   -- frame counter for incoming data frames\r
+                 APV_CHANNEL_OUT               : out   std_logic_vector(6 downto 0);   -- physical channel ID\r
+                 APV_OVERFLOW_OUT              : out   std_logic;                                              -- channel is truncated high\r
+                 APV_UNDERFLOW_OUT             : out   std_logic;                                              -- channel is truncated low\r
+                 APV_RAW_OUT                   : out   std_logic_vector(11 downto 0);  -- APV raw data\r
+                 APV_ANALOG_OUT                : out   std_logic;                                              -- APV analog data is valid\r
+                 APV_START_OUT                 : out   std_logic;                                              -- valid data frame found, reserve one buffer \r
+                 APV_LAST_OUT                  : out   std_logic;                                              -- last APV channel of dataframe\r
+                 DEBUG_OUT                             : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_raw_buffer is\r
+       port( CLK_APV_IN                : in    std_logic; -- write clock from APV handling stage\r
+                 RESET_IN                      : in    std_logic;\r
+                 FRM_REQD_IN           : in    std_logic; -- one data frame has been requested from APV\r
+                 MAX_TRG_NUM_IN        : in    std_logic_vector(3 downto 0); -- maximum number of triggers per event\r
+                 ADC_ANALOG_IN         : in    std_logic; -- write enable for ADC data\r
+                 ADC_START_IN          : in    std_logic; -- data frame detected, block the buffer page\r
+                 ADC_LAST_IN           : in    std_logic; -- last channel signal\r
+                 ADC_CHANNEL_IN        : in    std_logic_vector(6 downto 0); -- physical channel ID\r
+                 ADC_RAW_IN            : in    std_logic_vector(17 downto 0); -- raw ADC data, UDF, OVF, ERROR\r
+                 ADC_STATUS_IN         : in    std_logic_vector(7 downto 0); -- status information for APV\r
+                 ADC_FRAME_IN          : in    std_logic_vector(11 downto 0); -- status information for frame\r
+                 BUF_CLK_IN            : in    std_logic; -- read clock\r
+                 BUF_RESET_IN          : in    std_logic; -- 100MHz reset\r
+                 BUF_START_OUT         : out   std_logic; -- one block starts writing\r
+                 BUF_READY_OUT         : out   std_logic; -- one block has been written\r
+                 BUF_ADDR_IN           : in    std_logic_vector(6 downto 0); -- address inside current buffer\r
+                 BUF_DONE_IN           : in    std_logic; -- buffer has been read (discard buffer)\r
+                 BUF_DATA_OUT          : out   std_logic_vector(17 downto 0); -- data from buffer\r
+                 BUF_STATUS_OUT        : out   std_logic_vector(7 downto 0); -- generic APV status output\r
+                 BUF_FRAME_OUT         : out   std_logic_vector(11 downto 0); -- current frame status output\r
+                 BUF_GOOD_OUT          : out   std_logic; -- APV is active and synced -> GOOD situation\r
+                 BUF_BROKEN_OUT        : out   std_logic; -- APV is active, but not synced -> BAD situation\r
+                 BUF_IGNORE_OUT        : out   std_logic; -- APV is switched off -> switched off\r
+                 BUF_LEVEL_OUT         : out   std_logic_vector(4 downto 0); -- number of stored frames inside buffer\r
+                 BUF_TICKMARK_OUT      : out   std_logic; -- tickmark signal for timeouts in the EDS handler\r
+                 BUF_FULL_OUT          : out   std_logic; -- inhibit any next trigger if set!\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component slv_register is\r
+       generic( RESET_VALUE    : std_logic_vector(31 downto 0) := x"0000_0000" );\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 BUSY_IN               : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_BUSY_OUT  : out   std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I/O to the backend\r
+                 REG_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 REG_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component slv_half_register is\r
+       generic( RESET_VALUE    : std_logic_vector(15 downto 0) := x"0000" );\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I/O to the backend\r
+                 STATUS_REG_IN : in    std_logic_vector(15 downto 0);\r
+                 CTRL_REG_OUT  : out   std_logic_vector(15 downto 0);\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component i2c_master is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_BUSY_OUT  : out   std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- I2C connections\r
+                 SDA_IN                : in    std_logic;\r
+                 SDA_OUT               : out   std_logic;\r
+                 SCL_IN                : in    std_logic;\r
+                 SCL_OUT               : out   std_logic;\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component slv_onewire_memory is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN           : in    std_logic_vector(5 downto 0);\r
+                 SLV_READ_IN           : in    std_logic;\r
+                 SLV_WRITE_IN          : in    std_logic;\r
+                 SLV_ACK_OUT           : out   std_logic;\r
+                 SLV_BUSY_OUT          : out   std_logic;\r
+                 SLV_DATA_OUT          : out   std_logic_vector(31 downto 0);\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN          : in    std_logic_vector(2 downto 0);\r
+                 -- 1Wire lines\r
+                 ONEWIRE_START_IN      : in    std_logic;\r
+                 ONEWIRE_INOUT         : inout std_logic_vector(15 downto 0);\r
+                 BP_ONEWIRE_INOUT      : inout std_logic;\r
+                 -- Status lines\r
+                 STAT                          : out   std_logic_vector(63 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component spi_real_slim is\r
+       port( SYSCLK            : in    std_logic; -- 100MHz sysclock\r
+                 RESET                 : in    std_logic; -- synchronous reset\r
+                 -- Command interface\r
+                 START_IN              : in    std_logic; -- one start pulse\r
+                 BUSY_OUT              : out   std_logic; -- SPI transactions are ongoing\r
+                 CMD_IN                : in    std_logic_vector(7 downto 0); -- SPI command byte\r
+                 -- SPI interface\r
+                 SPI_SCK_OUT   : out   std_logic;\r
+                 SPI_CS_OUT    : out   std_logic;\r
+                 SPI_SDO_OUT   : out   std_logic;\r
+                 -- DEBUG\r
+                 CLK_EN_OUT    : out   std_logic;\r
+                 BSM_OUT               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT             : out   std_logic_vector(31 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component spi_adc_master is\r
+       generic( RESET_VALUE_CTRL       : std_logic_vector(7 downto 0) := x"60" );\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 -- Slave bus\r
+                 SLV_READ_IN   : in    std_logic;\r
+                 SLV_WRITE_IN  : in    std_logic;\r
+                 SLV_BUSY_OUT  : out   std_logic;\r
+                 SLV_ACK_OUT   : out   std_logic;\r
+                 SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+                 SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+                 -- SPI connections\r
+                 SPI_CS_OUT    : out   std_logic;\r
+                 SPI_SDO_OUT   : out   std_logic;\r
+                 SPI_SCK_OUT   : out   std_logic;\r
+                 -- ADC connections\r
+                 ADC_LOCKED_IN : in    std_logic;\r
+                 ADC_PD_OUT    : out   std_logic;\r
+                 ADC_RST_OUT   : out   std_logic;\r
+                 ADC_DEL_OUT   : out   std_logic_vector(3 downto 0);\r
+                 -- APV connections\r
+                 APV_RST_OUT   : out   std_logic;\r
+                 -- Status lines\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+\r
+       component i2c_slim is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;      \r
+                 -- I2C command / setup\r
+                 I2C_GO_IN             : in    std_logic; -- startbit to trigger I2C actions\r
+                 ACTION_IN             : in    std_logic; -- '0' -> write, '1' -> read\r
+                 I2C_SPEED_IN  : in    std_logic_vector( 5 downto 0 ); -- speed adjustment (to be defined)\r
+                 I2C_ADR_IN    : in    std_logic_vector( 7 downto 0 ); -- I2C address byte (R/W bit is ignored)\r
+                 I2C_CMD_IN    : in    std_logic_vector( 7 downto 0 ); -- I2C command byte (sent after address byte)\r
+                 I2C_DW_IN             : in    std_logic_vector( 7 downto 0 ); -- data word for write command\r
+                 I2C_DR_OUT    : out   std_logic_vector( 7 downto 0 ); -- data word from read command\r
+                 STATUS_OUT    : out   std_logic_vector( 7 downto 0 ); -- status and error bits\r
+                 I2C_BUSY_OUT  : out   std_logic;\r
+                 -- I2C connections\r
+                 SDA_IN                : in    std_logic;\r
+                 SDA_OUT               : out   std_logic;\r
+                 SCL_IN                : in    std_logic;\r
+                 SCL_OUT               : out   std_logic;\r
+                 -- Debug\r
+                 STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+               );\r
+       end component;\r
+       \r
+       component i2c_gstart is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 START_IN              : in    std_logic;      \r
+             DOSTART_IN        : in    std_logic;      \r
+                 I2C_SPEED_IN  : in    std_logic_vector(7 downto 0);\r
+                 SDONE_OUT             : out   std_logic;\r
+                 SOK_OUT               : out   std_logic;\r
+             SDA_IN            : in    std_logic;\r
+                 SCL_IN                : in    std_logic;\r
+                 R_SCL_OUT             : out   std_logic;\r
+                 S_SCL_OUT             : out   std_logic;\r
+             R_SDA_OUT         : out   std_logic;\r
+             S_SDA_OUT         : out   std_logic;\r
+                 BSM_OUT               : out   std_logic_vector(3 downto 0)\r
+         );\r
+       end component;\r
+\r
+       component i2c_sendb is\r
+       port( CLK_IN            : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 DOBYTE_IN             : in    std_logic; \r
+                 I2C_SPEED_IN  : in    std_logic_vector(7 downto 0);\r
+                 I2C_BYTE_IN   : in    std_logic_vector(8 downto 0); \r
+                 I2C_BACK_OUT  : out   std_logic_vector(8 downto 0);\r
+                 SDA_IN                : in    std_logic;\r
+                 R_SDA_OUT             : out   std_logic;\r
+                 S_SDA_OUT             : out   std_logic;\r
+--               SCL_IN                : in    std_logic;\r
+                 R_SCL_OUT             : out   std_logic;\r
+                 S_SCL_OUT             : out   std_logic;\r
+                 BDONE_OUT             : out   std_logic;\r
+                 BOK_OUT               : out   std_logic;\r
+                 BSM_OUT               : out   std_logic_vector(3 downto 0)\r
+           );\r
+       end component;\r
+\r
+       component onewire_master is\r
+       generic( CLK_PERIOD             : integer := 10 ); -- clock perion in nanoseconds\r
+       port( CLK                               : in    std_logic;\r
+                 RESET                         : in    std_logic;\r
+                 READOUT_ENABLE_IN     : in    std_logic;\r
+                 -- connection to 1-wire interface (16 APV FEs)\r
+                 ONEWIRE                       : inout std_logic_vector(15 downto 0);\r
+                 BP_ONEWIRE            : inout std_logic;\r
+                 -- connection to external DPRAM for slow control readout\r
+                 BP_DATA_OUT           : out   std_logic_vector(15 downto 0);\r
+                 DATA_OUT                      : out   std_logic_vector(15 downto 0);\r
+                 ADDR_OUT                      : out   std_logic_vector(6 downto 0);\r
+                 WRITE_OUT                     : out   std_logic;\r
+                 BUSY_OUT                      : out   std_logic;\r
+                 -- debug\r
+                 BSM_OUT                       : out   std_logic_vector(7 downto 0);\r
+                 STAT                          : out   std_logic_vector(15 downto 0)\r
+                );\r
+       end component;\r
+\r
+       component slv_onewire_dpram\r
+       port( WRADDRESS : in    std_logic_vector(6 downto 0); \r
+                 RDADDRESS     : in    std_logic_vector(5 downto 0); \r
+                 DATA          : in    std_logic_vector(15 downto 0);\r
+                 WE            : in    std_logic; \r
+                 RDCLOCK       : in    std_logic;\r
+                 RDCLOCKEN     : in    std_logic; \r
+                 RESET         : in    std_logic;\r
+                 WRCLOCK       : in    std_logic; \r
+                 WRCLOCKEN     : in    std_logic;\r
+                 Q                     : out   std_logic_vector(31 downto 0)\r
+                );\r
+       end component;\r
+\r
+       component dhdr_buf is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; \r
+                 -- DHDR information block\r
+                 DHDR_DATA_IN                  : in    std_logic_vector(47 downto 0); -- EDS data input\r
+                 DHDR_WE_IN                    : in    std_logic; -- EDS write enable\r
+                 DHDR_DONE_IN                  : in    std_logic; -- release EDS \r
+                 DHDR_DATA_OUT                 : out   std_logic_vector(47 downto 0);\r
+                 DHDR_AVAILABLE_OUT    : out   std_logic;\r
+                 -- trigger busy information\r
+                 BUF_FULL_OUT                  : out   std_logic;\r
+                 BUF_LEVEL_OUT                 : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                             : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component fifo_2kx27 is\r
+       port( DATA              : in    std_logic_vector(26 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 WREN          : in    std_logic; \r
+                 RDEN          : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 Q                     : out   std_logic_vector(26 downto 0); \r
+                 WCNT          : out   std_logic_vector(11 downto 0); \r
+                 EMPTY         : out   std_logic; \r
+                 FULL          : out   std_logic\r
+               );\r
+       end component fifo_2kx27;\r
+\r
+       component fifo_16x11 is\r
+       port( DATA              : in    std_logic_vector(10 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 WREN          : in    std_logic; \r
+                 RDEN          : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 Q                     : out   std_logic_vector(10 downto 0); \r
+                 WCNT          : out   std_logic_vector(4 downto 0); \r
+                 EMPTY         : out   std_logic; \r
+                 FULL          : out   std_logic\r
+               );\r
+       end component fifo_16x11;\r
+\r
+       component dhdr_buffer_dpram is\r
+       port( WRADDRESS         : in    std_logic_vector(3 downto 0); \r
+                 DATA                  : in    std_logic_vector(47 downto 0); \r
+                 WRCLOCK               : in    std_logic; \r
+                 WE                    : in    std_logic; \r
+                 WRCLOCKEN             : in    std_logic; \r
+                 RDADDRESS             : in    std_logic_vector(3 downto 0); \r
+                 RDCLOCK               : in    std_logic; \r
+                 RDCLOCKEN             : in    std_logic; \r
+                 RESET                 : in    std_logic; \r
+                 Q                             : out   std_logic_vector(47 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component decoder_8bit is\r
+       port( ADDRESS   : in    std_logic_vector(7 downto 0); \r
+                 Q                     : out   std_logic_vector(3 downto 0)\r
+               );\r
+       end component decoder_8bit;\r
+\r
+       component adder_5bit is\r
+       port( DATAA             : in    std_logic_vector(4 downto 0); \r
+                 DATAB         : in    std_logic_vector(4 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 CLOCKEN       : in    std_logic; \r
+                 RESULT        : out   std_logic_vector(4 downto 0)\r
+               );\r
+       end component adder_5bit;\r
+\r
+       component adder_16bit is\r
+       port( DATAA             : in    std_logic_vector(15 downto 0); \r
+                 DATAB         : in    std_logic_vector(15 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 CLOCKEN       : in    std_logic; \r
+                 RESULT        : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component adder_16bit;\r
+\r
+       component suber_12bit is\r
+       port( DATAA             : in    std_logic_vector(11 downto 0); \r
+                 DATAB         : in    std_logic_vector(11 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 CLOCKEN       : in    std_logic; \r
+                 RESULT        : out   std_logic_vector(11 downto 0)\r
+               );\r
+       end component suber_12bit;\r
+\r
+\r
+       component buf_toc is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 BUF_TICK_IN           : in    std_logic; -- tickmark from raw buffer\r
+                 BUF_START_IN          : in    std_logic; -- start of frame from raw buffer\r
+                 WAITFRAME_IN          : in    std_logic; -- statemachine is in "wait for frame" mode\r
+                 FRAMES_REQD_IN        : in    std_logic_vector(3 downto 0); -- number of frames requested from EDS\r
+                 BUF_LVL_IN            : in    std_logic_vector(7 downto 0);\r
+                 GOODDATA_OUT          : out   std_logic;\r
+                 BADDATA_OUT           : out   std_logic;\r
+                 NODATA_OUT            : out   std_logic;\r
+                 READY_OUT                     : out   std_logic;\r
+                 BSM_OUT                       : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component buf_toc;\r
+\r
+       component ref_row_sel is\r
+       port( CLK_IN                            : in    std_logic;\r
+                 READY_IN                              : in    std_logic_vector(15 downto 0);\r
+                 GOODDATA_IN                   : in    std_logic_vector(15 downto 0);\r
+                 FRAME_0_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_1_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_2_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_3_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_4_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_5_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_6_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_7_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_8_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_9_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_10_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_11_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_12_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_13_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_14_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_15_IN                   : in    std_logic_vector(11 downto 0);\r
+                 VALID_BUFS_OUT                : out   std_logic;\r
+                 READY_OUT                             : out   std_logic;\r
+                 ROW_ERROR_OUT                 : out   std_logic; -- at least one row number is wrong\r
+                 APV_ERROR_OUT                 : out   std_logic; -- at least one APV sent ERROR bit\r
+                 APV_ERROR_BITS_OUT    : out   std_logic_vector(15 downto 0);\r
+                 REF_ROW_OUT                   : out   std_logic_vector(7 downto 0); -- selected reference row\r
+                 DBG_OUT                               : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component ref_row_sel;\r
+\r
+       component frmctr_check is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 GOODDATA_IN           : in    std_logic_vector(15 downto 0);\r
+                 FRAMECOUNTER_IN       : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_0_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_1_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_2_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_3_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_4_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_5_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_6_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_7_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_8_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_9_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_10_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_11_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_12_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_13_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_14_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_15_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRC_ERROR_OUT         : out   std_logic; -- at least one framecounter is wrong\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component frmctr_check;\r
+\r
+       component apv_pc_nc_alu is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic;\r
+                 START_IN                      : in    std_logic;\r
+                 MAX_FRAMES_IN         : in    std_logic_vector(3 downto 0); -- number of frames requested\r
+                 CURR_FRAME_IN         : in    std_logic_vector(3 downto 0); -- current frame number\r
+                 LOC_FRM_CTR_IN        : in    std_logic_vector(3 downto 0); -- DEBUG\r
+                 EDS_FRM_CTR_IN        : in    std_logic_vector(3 downto 0); -- DEBUG\r
+                 BUF_GOOD_IN           : in    std_logic;\r
+                 BUF_BAD_IN            : in    std_logic;\r
+                 BUF_IGNORE_IN         : in    std_logic;\r
+                 ERROR_IN                      : in    std_logic_vector(3 downto 0); -- buffer status, errors from checkers\r
+                 DO_HEADER_IN          : in    std_logic;\r
+                 DO_ERROR_IN           : in    std_logic;\r
+                 EVT_TYPE_IN           : in    std_logic_vector(2 downto 0);\r
+                 RAW_ADDR_IN           : in    std_logic_vector(6 downto 0);\r
+                 RAW_DATA_IN           : in    std_logic_vector(37 downto 0);\r
+                 PED_DATA_IN           : in    std_logic_vector(17 downto 0);\r
+                 THR_DATA_IN           : in    std_logic_vector(17 downto 0);\r
+                 FRAME_IN                      : in    std_logic;\r
+                 FIFO_DATA_OUT         : out   std_logic_vector(26 downto 0); -- [21] -> [31], [20:0] -> [20:0]\r
+                 WE_OUT                        : out   std_logic;\r
+                 COUNT_OUT                     : out   std_logic_vector(9 downto 0);\r
+                 ANYDATA_OUT           : out   std_logic; -- this FIFO needs attention during readout\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component apv_pc_nc_alu;\r
+\r
+       component comp14bit is\r
+       port( DATAA             : in    std_logic_vector(13 downto 0); \r
+                 DATAB         : in    std_logic_vector(13 downto 0); \r
+                 CLOCK         : in    std_logic; \r
+                 CLOCKEN       : in    std_logic; \r
+                 ACLR          : in    std_logic; \r
+                 AGEB          : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component input_bram is\r
+       port( WRADDRESS : in    std_logic_vector(10 downto 0); \r
+                 RDADDRESS     : in    std_logic_vector(10 downto 0);  \r
+                 DATA          : in    std_logic_vector(17 downto 0); \r
+                 WE            : in    std_logic;\r
+                 RDCLOCK       : in    std_logic; \r
+                 RDCLOCKEN     : in    std_logic; \r
+                 RESET         : in    std_logic; \r
+                 WRCLOCK       : in    std_logic; \r
+                 WRCLOCKEN     : in    std_logic; \r
+                 Q                     : out   std_logic_vector(17 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component frame_status_mem is\r
+       port( WRADDRESS : in    std_logic_vector(3 downto 0); \r
+                 DATA          : in    std_logic_vector(11 downto 0);\r
+                 WRCLOCK       : in    std_logic;\r
+                 WE            : in    std_logic;\r
+                 WRCLOCKEN     : in    std_logic;\r
+                 RDADDRESS     : in    std_logic_vector(3 downto 0);\r
+                 RDCLOCK       : in    std_logic;\r
+                 RDCLOCKEN     : in    std_logic;\r
+                 RESET         : in    std_logic;\r
+                 Q                     : out   std_logic_vector(11 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component adder_6bit is\r
+       port( DATAA   : in   std_logic_vector(5 downto 0); \r
+                 DATAB   : in   std_logic_vector(5 downto 0); \r
+                 CLOCK   : in   std_logic; \r
+                 RESET   : in   std_logic; \r
+                 CLOCKEN : in   std_logic; \r
+                 RESULT  : out  std_logic_vector(5 downto 0)\r
+                );\r
+       end component;\r
+\r
+       component apv_lock_sm is\r
+       port( CLK_APV_IN        : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 SYNC_IN               : in    std_logic; -- start APV synchronisation\r
+                 ADC_VALID_IN  : in    std_logic; -- ADC delivers valid data\r
+                 TIMED_IN              : in    std_logic; -- synchronisation timeout\r
+                 MATCH_IN              : in    std_logic; -- artifical tickmark from synchronized counter\r
+                 LOCKED_IN             : in    std_logic; -- enough good tickmarks\r
+                 TICK_IN               : in    std_logic; -- tickmark from digital parser\r
+                 HEADER_IN             : in    std_logic; -- header from digital parser\r
+                 FLATLINE_IN   : in    std_logic; -- flatline from digital parser\r
+                 RST_PC_OUT    : out   std_logic; -- reset period counter\r
+                 RST_TC_OUT    : out   std_logic; -- reset timeout counter\r
+                 INC_TC_OUT    : out   std_logic;\r
+                 RST_LC_OUT    : out   std_logic; -- reset lock counter\r
+                 INC_LC_OUT    : out   std_logic;\r
+                 UNKNOWN_OUT   : out   std_logic;\r
+                 BADADC_OUT    : out   std_logic; -- ADC data invalid\r
+                 LOCKED_OUT    : out   std_logic;\r
+                 LOST_OUT              : out   std_logic;\r
+                 NOSYNC_OUT    : out   std_logic;\r
+                 NOAPV_OUT             : out   std_logic;\r
+                 BSM_OUT               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT             : out   std_logic_vector(15 downto 0)\r
+               );\r
+       end component;\r
+\r
+       component apv_digital is\r
+       port( CLK_APV_IN        : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 ADC_RAW_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_LOW_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_HIGH_IN   : in    std_logic_vector(11 downto 0);\r
+                 FL_LOW_IN             : in    std_logic_vector(11 downto 0);\r
+                 FL_HIGH_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_DATA_OUT  : out   std_logic_vector(11 downto 0);\r
+                 BIT_VALID_OUT : out   std_logic_vector(11 downto 0);\r
+                 BIT_HIGH_OUT  : out   std_logic;\r
+                 BIT_LOW_OUT   : out   std_logic;\r
+                 TICKMARK_OUT  : out   std_logic;\r
+                 HEADER_OUT    : out   std_logic;\r
+                 FLAT_LINE_OUT : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       component eds_buffer_dpram is\r
+       port( WRADDRESS         : in    std_logic_vector(3 downto 0); \r
+                 DATA                  : in    std_logic_vector(39 downto 0); \r
+                 WRCLOCK               : in    std_logic; \r
+                 WE                    : in    std_logic; \r
+                 WRCLOCKEN             : in    std_logic; \r
+                 RDADDRESS             : in    std_logic_vector(3 downto 0); \r
+                 RDCLOCK               : in    std_logic; \r
+                 RDCLOCKEN             : in    std_logic; \r
+                 RESET                 : in    std_logic; \r
+                 Q                             : out   std_logic_vector(39 downto 0)\r
+               );\r
+       end component;\r
+\r
+end package;\r
+\r
+-- Down in the Dumps...\r
+\r
diff --git a/src/adder_16bit.lpc b/src/adder_16bit.lpc
new file mode 100644 (file)
index 0000000..7d5f791
--- /dev/null
@@ -0,0 +1,36 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Adder\r
+CoreRevision=3.1\r
+ModuleName=adder_16bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=03/03/2009\r
+Time=10:27:46\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=16\r
+Representation=Unsigned\r
+UseCIport=0\r
+COport=None\r
+OutReg=1\r
+Complex=0\r
+Stage=0\r
diff --git a/src/adder_16bit.vhd b/src/adder_16bit.vhd
new file mode 100644 (file)
index 0000000..07ddeea
--- /dev/null
@@ -0,0 +1,303 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type add -width 16 -unsigned -output_reg -enable -pipeline 0 -e 
+
+-- Tue Mar 03 10:27:46 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adder_16bit is
+    port (
+        DataA: in  std_logic_vector(15 downto 0); 
+        DataB: in  std_logic_vector(15 downto 0); 
+        Clock: in  std_logic; 
+        Reset: in  std_logic; 
+        ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(15 downto 0));
+end adder_16bit;
+
+architecture Structure of adder_16bit is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal r0_sum15: std_logic;
+    signal r0_sum14: std_logic;
+    signal r0_sum13: std_logic;
+    signal r0_sum12: std_logic;
+    signal r0_sum11: std_logic;
+    signal r0_sum10: std_logic;
+    signal r0_sum9: std_logic;
+    signal r0_sum8: std_logic;
+    signal r0_sum7: std_logic;
+    signal r0_sum6: std_logic;
+    signal r0_sum5: std_logic;
+    signal r0_sum4: std_logic;
+    signal r0_sum3: std_logic;
+    signal r0_sum2: std_logic;
+    signal r0_sum1: std_logic;
+    signal r0_sum0: std_logic;
+    signal addsub_cod_0: std_logic;
+    signal tsum0: std_logic;
+    signal tsum1: std_logic;
+    signal tsum2: std_logic;
+    signal tsum3: std_logic;
+    signal co0: std_logic;
+    signal tsum4: std_logic;
+    signal tsum5: std_logic;
+    signal co1: std_logic;
+    signal tsum6: std_logic;
+    signal tsum7: std_logic;
+    signal co2: std_logic;
+    signal tsum8: std_logic;
+    signal tsum9: std_logic;
+    signal co3: std_logic;
+    signal tsum10: std_logic;
+    signal tsum11: std_logic;
+    signal co4: std_logic;
+    signal tsum12: std_logic;
+    signal tsum13: std_logic;
+    signal co5: std_logic;
+    signal tsum14: std_logic;
+    signal tsum15: std_logic;
+    signal co6: std_logic;
+    signal co7d: std_logic;
+    signal co7: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum15, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum15);
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum14, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum14);
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum13, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum13);
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum12, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum12);
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum11, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum11);
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum10, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum10);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum9, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum9);
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum8, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum8);
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum7, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum7);
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum6, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum6);
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum5, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum5);
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum4, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum4);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum3, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum3);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum2, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum2);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum1, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum1);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum0, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum0);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>co7d, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>addsub_cod_0);
+
+    addsub_0: FADD2B
+        port map (A0=>DataA(0), A1=>DataA(1), B0=>DataB(0), B1=>DataB(1), 
+            CI=>scuba_vlo, COUT=>co0, S0=>tsum0, S1=>tsum1);
+
+    addsub_1: FADD2B
+        port map (A0=>DataA(2), A1=>DataA(3), B0=>DataB(2), B1=>DataB(3), 
+            CI=>co0, COUT=>co1, S0=>tsum2, S1=>tsum3);
+
+    addsub_2: FADD2B
+        port map (A0=>DataA(4), A1=>DataA(5), B0=>DataB(4), B1=>DataB(5), 
+            CI=>co1, COUT=>co2, S0=>tsum4, S1=>tsum5);
+
+    addsub_3: FADD2B
+        port map (A0=>DataA(6), A1=>DataA(7), B0=>DataB(6), B1=>DataB(7), 
+            CI=>co2, COUT=>co3, S0=>tsum6, S1=>tsum7);
+
+    addsub_4: FADD2B
+        port map (A0=>DataA(8), A1=>DataA(9), B0=>DataB(8), B1=>DataB(9), 
+            CI=>co3, COUT=>co4, S0=>tsum8, S1=>tsum9);
+
+    addsub_5: FADD2B
+        port map (A0=>DataA(10), A1=>DataA(11), B0=>DataB(10), 
+            B1=>DataB(11), CI=>co4, COUT=>co5, S0=>tsum10, S1=>tsum11);
+
+    addsub_6: FADD2B
+        port map (A0=>DataA(12), A1=>DataA(13), B0=>DataB(12), 
+            B1=>DataB(13), CI=>co5, COUT=>co6, S0=>tsum12, S1=>tsum13);
+
+    addsub_7: FADD2B
+        port map (A0=>DataA(14), A1=>DataA(15), B0=>DataB(14), 
+            B1=>DataB(15), CI=>co6, COUT=>co7, S0=>tsum14, S1=>tsum15);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    addsubd: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co7, COUT=>open, S0=>co7d, S1=>open);
+
+    Result(15) <= r0_sum15;
+    Result(14) <= r0_sum14;
+    Result(13) <= r0_sum13;
+    Result(12) <= r0_sum12;
+    Result(11) <= r0_sum11;
+    Result(10) <= r0_sum10;
+    Result(9) <= r0_sum9;
+    Result(8) <= r0_sum8;
+    Result(7) <= r0_sum7;
+    Result(6) <= r0_sum6;
+    Result(5) <= r0_sum5;
+    Result(4) <= r0_sum4;
+    Result(3) <= r0_sum3;
+    Result(2) <= r0_sum2;
+    Result(1) <= r0_sum1;
+    Result(0) <= r0_sum0;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adder_16bit is
+    for Structure
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adder_16bit_tmpl.vhd b/src/adder_16bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..5251448
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.1
+-- Tue Mar 03 10:27:46 2009
+
+-- parameterized module component declaration
+component adder_16bit
+    port (DataA: in  std_logic_vector(15 downto 0); 
+        DataB: in  std_logic_vector(15 downto 0); Clock: in  std_logic; 
+        Reset: in  std_logic; ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(15 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adder_16bit
+    port map (DataA(15 downto 0)=>__, DataB(15 downto 0)=>__, Clock=>__, 
+        Reset=>__, ClockEn=>__, Result(15 downto 0)=>__);
diff --git a/src/adder_5bit.lpc b/src/adder_5bit.lpc
new file mode 100644 (file)
index 0000000..d47643d
--- /dev/null
@@ -0,0 +1,36 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Adder\r
+CoreRevision=3.1\r
+ModuleName=adder_5bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=03/03/2009\r
+Time=10:10:12\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=5\r
+Representation=Unsigned\r
+UseCIport=0\r
+COport=None\r
+OutReg=1\r
+Complex=0\r
+Stage=0\r
diff --git a/src/adder_5bit.vhd b/src/adder_5bit.vhd
new file mode 100644 (file)
index 0000000..55258be
--- /dev/null
@@ -0,0 +1,142 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type add -width 5 -unsigned -output_reg -enable -e 
+
+-- Tue Mar 03 10:10:12 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adder_5bit is
+    port (
+        DataA: in  std_logic_vector(4 downto 0); 
+        DataB: in  std_logic_vector(4 downto 0); 
+        Clock: in  std_logic; 
+        Reset: in  std_logic; 
+        ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(4 downto 0));
+end adder_5bit;
+
+architecture Structure of adder_5bit is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal r0_sum4: std_logic;
+    signal r0_sum3: std_logic;
+    signal r0_sum2: std_logic;
+    signal r0_sum1: std_logic;
+    signal r0_sum0: std_logic;
+    signal tsum0: std_logic;
+    signal tsum1: std_logic;
+    signal tsum2: std_logic;
+    signal tsum3: std_logic;
+    signal co0: std_logic;
+    signal tsum4: std_logic;
+    signal co1: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum4, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum4);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum3, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum3);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum2, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum2);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum1, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum1);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum0, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum0);
+
+    addsub_0: FADD2B
+        port map (A0=>DataA(0), A1=>DataA(1), B0=>DataB(0), B1=>DataB(1), 
+            CI=>scuba_vlo, COUT=>co0, S0=>tsum0, S1=>tsum1);
+
+    addsub_1: FADD2B
+        port map (A0=>DataA(2), A1=>DataA(3), B0=>DataB(2), B1=>DataB(3), 
+            CI=>co0, COUT=>co1, S0=>tsum2, S1=>tsum3);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    addsub_2: FADD2B
+        port map (A0=>DataA(4), A1=>scuba_vlo, B0=>DataB(4), 
+            B1=>scuba_vlo, CI=>co1, COUT=>open, S0=>tsum4, S1=>open);
+
+    Result(4) <= r0_sum4;
+    Result(3) <= r0_sum3;
+    Result(2) <= r0_sum2;
+    Result(1) <= r0_sum1;
+    Result(0) <= r0_sum0;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adder_5bit is
+    for Structure
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adder_5bit_tmpl.vhd b/src/adder_5bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..27e9025
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.1
+-- Tue Mar 03 10:10:12 2009
+
+-- parameterized module component declaration
+component adder_5bit
+    port (DataA: in  std_logic_vector(4 downto 0); 
+        DataB: in  std_logic_vector(4 downto 0); Clock: in  std_logic; 
+        Reset: in  std_logic; ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(4 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adder_5bit
+    port map (DataA(4 downto 0)=>__, DataB(4 downto 0)=>__, Clock=>__, 
+        Reset=>__, ClockEn=>__, Result(4 downto 0)=>__);
diff --git a/src/adder_6bit.lpc b/src/adder_6bit.lpc
new file mode 100644 (file)
index 0000000..b8caa0a
--- /dev/null
@@ -0,0 +1,36 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M35E\r
+PartName=LFE2M35E-6F672C\r
+SpeedGrade=-6\r
+Package=FPBGA672\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Adder\r
+CoreRevision=3.1\r
+ModuleName=adder_6bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=08/27/2008\r
+Time=11:31:51\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=6\r
+Representation=Unsigned\r
+UseCIport=0\r
+COport=None\r
+OutReg=1\r
+Complex=0\r
+Stage=0\r
diff --git a/src/adder_6bit.vhd b/src/adder_6bit.vhd
new file mode 100644 (file)
index 0000000..29a1593
--- /dev/null
@@ -0,0 +1,168 @@
+-- VHDL netlist generated by SCUBA ispLever_v71_PROD_Build (58)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_71\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type add -width 6 -unsigned -output_reg -enable -e 
+
+-- Wed Aug 27 11:31:51 2008
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity adder_6bit is
+    port (
+        DataA: in  std_logic_vector(5 downto 0); 
+        DataB: in  std_logic_vector(5 downto 0); 
+        Clock: in  std_logic; 
+        Reset: in  std_logic; 
+        ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(5 downto 0));
+end adder_6bit;
+
+architecture Structure of adder_6bit is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal r0_sum5: std_logic;
+    signal r0_sum4: std_logic;
+    signal r0_sum3: std_logic;
+    signal r0_sum2: std_logic;
+    signal r0_sum1: std_logic;
+    signal r0_sum0: std_logic;
+    signal addsub_cod_0: std_logic;
+    signal tsum0: std_logic;
+    signal tsum1: std_logic;
+    signal tsum2: std_logic;
+    signal tsum3: std_logic;
+    signal co0: std_logic;
+    signal tsum4: std_logic;
+    signal tsum5: std_logic;
+    signal co1: std_logic;
+    signal co2d: std_logic;
+    signal co2: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum5, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum5);
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum4, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum4);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum3, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum3);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum2, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum2);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum1, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum1);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tsum0, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_sum0);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>co2d, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>addsub_cod_0);
+
+    addsub_0: FADD2B
+        port map (A0=>DataA(0), A1=>DataA(1), B0=>DataB(0), B1=>DataB(1), 
+            CI=>scuba_vlo, COUT=>co0, S0=>tsum0, S1=>tsum1);
+
+    addsub_1: FADD2B
+        port map (A0=>DataA(2), A1=>DataA(3), B0=>DataB(2), B1=>DataB(3), 
+            CI=>co0, COUT=>co1, S0=>tsum2, S1=>tsum3);
+
+    addsub_2: FADD2B
+        port map (A0=>DataA(4), A1=>DataA(5), B0=>DataB(4), B1=>DataB(5), 
+            CI=>co1, COUT=>co2, S0=>tsum4, S1=>tsum5);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    addsubd: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co2, COUT=>open, S0=>co2d, S1=>open);
+
+    Result(5) <= r0_sum5;
+    Result(4) <= r0_sum4;
+    Result(3) <= r0_sum3;
+    Result(2) <= r0_sum2;
+    Result(1) <= r0_sum1;
+    Result(0) <= r0_sum0;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of adder_6bit is
+    for Structure
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/adder_6bit_tmpl.vhd b/src/adder_6bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..fbf6eb1
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v71_PROD_Build (58)
+-- Module  Version: 3.1
+-- Wed Aug 27 11:31:51 2008
+
+-- parameterized module component declaration
+component adder_6bit
+    port (DataA: in  std_logic_vector(5 downto 0); 
+        DataB: in  std_logic_vector(5 downto 0); Clock: in  std_logic; 
+        Reset: in  std_logic; ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(5 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : adder_6bit
+    port map (DataA(5 downto 0)=>__, DataB(5 downto 0)=>__, Clock=>__, 
+        Reset=>__, ClockEn=>__, Result(5 downto 0)=>__);
diff --git a/src/apv_adc_map_mem.lpc b/src/apv_adc_map_mem.lpc
new file mode 100644 (file)
index 0000000..fadf9ca
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=apv_adc_map_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/04/2009\r
+Time=16:10:56\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=128\r
+Data=4\r
+LUT=0\r
+MemFile=i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem\r
+MemFormat=orca\r
diff --git a/src/apv_adc_map_mem.srp b/src/apv_adc_map_mem.srp
new file mode 100644 (file)
index 0000000..5e3fe40
--- /dev/null
@@ -0,0 +1,30 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Wed Nov 04 16:10:56 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n apv_adc_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem -memformat orca -e 
+    Circuit name     : apv_adc_map_mem
+    Module type      : rom
+    Module Version   : 2.4
+    Address width    : 7
+    Ports            : 
+       Inputs       : Address[6:0]
+       Outputs      : Q[3:0]
+    I/O buffer       : not inserted
+    Memory file      : i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem
+    EDIF output      : suppressed
+    VHDL output      : apv_adc_map_mem.vhd
+    VHDL template    : apv_adc_map_mem_tmpl.vhd
+    VHDL testbench    : tb_apv_adc_map_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : apv_adc_map_mem.srp
+    Element Usage    :
+       ROM128X1 : 4
+    Estimated Resource Usage:
+            LUT : 16
diff --git a/src/apv_adc_map_mem.vhd b/src/apv_adc_map_mem.vhd
new file mode 100644 (file)
index 0000000..861a722
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 7 -num_rows 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem -memformat orca -e 
+
+-- Wed Nov 04 16:10:56 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity apv_adc_map_mem is
+    port (
+        Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end apv_adc_map_mem;
+
+architecture Structure of apv_adc_map_mem is
+
+    -- local component declarations
+    component ROM128X1
+    -- synopsys translate_off
+        generic (INITVAL : in String);
+    -- synopsys translate_on
+        port (AD6: in  std_logic; AD5: in  std_logic; AD4: in  std_logic; 
+            AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0xFF00FF00FF001FE0E01F7F80807F6956";
+    attribute initval of mem_0_2 : label is "0xF0F0F0F0F0F0079DF8621E0FE1F0E287";
+    attribute initval of mem_0_1 : label is "0xCCCCCCCCCCCC867A798519ECE6139D07";
+    attribute initval of mem_0_0 : label is "0xAAAAAAAAAAAA3553CAAC355ACAA5B1E2";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xFF00FF00FF001FE0E01F7F80807F6956")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xF0F0F0F0F0F0079DF8621E0FE1F0E287")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xCCCCCCCCCCCC867A798519ECE6139D07")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(1));
+
+    mem_0_0: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xAAAAAAAAAAAA3553CAAC355ACAA5B1E2")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of apv_adc_map_mem is
+    for Structure
+        for all:ROM128X1 use entity ecp2m.ROM128X1(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/apv_adc_map_mem_generate.log b/src/apv_adc_map_mem_generate.log
new file mode 100644 (file)
index 0000000..ea70ce7
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Wed Nov 04 16:10:56 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n apv_adc_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem -memformat orca -e \r
+    Circuit name     : apv_adc_map_mem\r
+    Module type      : rom\r
+    Module Version   : 2.4\r
+    Address width    : 7\r
+    Data width       : 4\r
+    Ports            : \r
+       Inputs       : Address[6:0]\r
+       Outputs      : Q[3:0]\r
+    I/O buffer       : not inserted\r
+    Memory file      : i:/vhdl_pro/adcmv3/src/apv_adc_mapping.mem\r
+    EDIF output      : suppressed\r
+    VHDL output      : apv_adc_map_mem.vhd\r
+    VHDL template    : apv_adc_map_mem_tmpl.vhd\r
+    VHDL testbench   : tb_apv_adc_map_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : apv_adc_map_mem.srp\r
+    Estimated Resource Usage:\r
+            LUT : 16\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\apv_adc_map_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/apv_adc_map_mem_tmpl.vhd b/src/apv_adc_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..b14294d
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+-- Wed Nov 04 16:10:56 2009
+
+-- parameterized module component declaration
+component apv_adc_map_mem
+    port (Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : apv_adc_map_mem
+    port map (Address(6 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/apv_adc_mapping.mem b/src/apv_adc_mapping.mem
new file mode 100644 (file)
index 0000000..1c4a8c6
--- /dev/null
@@ -0,0 +1,155 @@
+#Format=Address-Hex\r
+#Depth=128\r
+#DataWidth=4\r
+#AddrRadix=3\r
+#DataRadix=3\r
+\r
+# Backplane 0\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    3   5  10  12   9   7   0   -   4   6  11   8  14  13   2   1\r
+#\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# realADC   6  15  14   0   8   1   9   5   b   4   2   a   3   d   c   7\r
+00: 6\r
+01: f\r
+02: e\r
+03: 0\r
+04: 8\r
+05: 1\r
+06: 9\r
+07: 5\r
+08: b\r
+09: 4\r
+0a: 2\r
+0b: a\r
+0c: 3\r
+0d: d\r
+0e: c\r
+0f: 7\r
+# Backplane 1\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   12  11  10   9   8   7  13  14   3   2   1   0   6   5   4   -\r
+10: b\r
+11: a\r
+12: 9\r
+13: 8\r
+14: e\r
+15: d\r
+16: c\r
+17: 5\r
+18: 4\r
+19: 3\r
+1a: 2\r
+1b: 1\r
+1c: 0\r
+1d: 6\r
+1e: 7\r
+1f: f\r
+# Backplane 2\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    -   4   5   6   0   1   2   3  14  13   7   8   9  10  11  12\r
+20: 4 \r
+21: 5\r
+22: 6\r
+23: 7\r
+24: 1\r
+25: 2\r
+26: 3\r
+27: a\r
+28: b\r
+29: c\r
+2a: d\r
+2b: e\r
+2c: f\r
+2d: 9\r
+2e: 8\r
+2f: 0\r
+# Backplane 3\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   10   9   8   7   6   5  12  11   4   3   0   2   1   -  13  14\r
+30: a\r
+31: c\r
+32: b\r
+33: 9\r
+34: 8\r
+35: 5\r
+36: 4\r
+37: 3\r
+38: 2\r
+39: 1\r
+3a: 0\r
+3b: 7\r
+3c: 6\r
+3d: e\r
+3e: f\r
+3f: d\r
+# Backplane 4\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   14  13   -   1   2   0   3   4  11  12   5   6   7   8   9  10\r
+40: 5\r
+41: 3\r
+42: 4\r
+43: 6\r
+44: 7\r
+45: a\r
+46: b\r
+47: c\r
+48: d\r
+49: e\r
+4a: f\r
+4b: 8\r
+4c: 9\r
+4d: 1\r
+4e: 0\r
+4f: 2\r
+# unused (5) => 1:1\r
+50: 0\r
+51: 1\r
+52: 2\r
+53: 3\r
+54: 4\r
+55: 5\r
+56: 6\r
+57: 7\r
+58: 8\r
+59: 9\r
+5a: a\r
+5b: b\r
+5c: c\r
+5d: d\r
+5e: e\r
+5f: f\r
+# unused (6) => 1:1\r
+60: 0\r
+61: 1\r
+62: 2\r
+63: 3\r
+64: 4\r
+65: 5\r
+66: 6\r
+67: 7\r
+68: 8\r
+69: 9\r
+6a: a\r
+6b: b\r
+6c: c\r
+6d: d\r
+6e: e\r
+6f: f\r
+# unused (7) => 1:1\r
+70: 0\r
+71: 1\r
+72: 2\r
+73: 3\r
+74: 4\r
+75: 5\r
+76: 6\r
+77: 7\r
+78: 8\r
+79: 9\r
+7a: a\r
+7b: b\r
+7c: c\r
+7d: d\r
+7e: e\r
+7f: f\r
diff --git a/src/apv_digital.vhd b/src/apv_digital.vhd
new file mode 100755 (executable)
index 0000000..a7dedc7
--- /dev/null
@@ -0,0 +1,207 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity apv_digital is\r
+       port( CLK_APV_IN        : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 ADC_RAW_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_LOW_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_HIGH_IN   : in    std_logic_vector(11 downto 0);\r
+                 FL_LOW_IN             : in    std_logic_vector(11 downto 0);\r
+                 FL_HIGH_IN    : in    std_logic_vector(11 downto 0);\r
+                 BIT_DATA_OUT  : out   std_logic_vector(11 downto 0);\r
+                 BIT_VALID_OUT : out   std_logic_vector(11 downto 0);\r
+                 BIT_HIGH_OUT  : out   std_logic;\r
+                 BIT_LOW_OUT   : out   std_logic;\r
+                 TICKMARK_OUT  : out   std_logic;\r
+                 HEADER_OUT    : out   std_logic;\r
+                 FLAT_LINE_OUT : out   std_logic\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_digital is\r
+\r
+       signal next_bit_low             : std_logic;\r
+       signal bit_low                  : std_logic;\r
+       signal next_bit_high    : std_logic;\r
+       signal bit_high                 : std_logic;\r
+       signal next_bit_data    : std_logic;\r
+       signal bit_data                 : std_logic_vector(11 downto 0);\r
+       signal next_bit_valid   : std_logic;\r
+       signal bit_valid                : std_logic_vector(11 downto 0);\r
+       signal next_fl_low              : std_logic;\r
+       signal fl_low                   : std_logic;\r
+       signal next_fl_high             : std_logic;\r
+       signal fl_high                  : std_logic;\r
+       signal next_fl_found    : std_logic;\r
+       signal fl_found                 : std_logic_vector(2 downto 0);\r
+       signal next_flat_line   : std_logic;\r
+       signal flat_line                : std_logic;\r
+       signal next_tickmark    : std_logic;\r
+       signal tickmark                 : std_logic;\r
+       signal next_header              : std_logic;\r
+       signal header                   : std_logic;\r
+       \r
+begin\r
+\r
+-- ADC data is registered already, so we can operate on the inputs directly.\r
+\r
+--------------------------------------------------------------------------------------\r
+-- compare ADC raw data against "bit low" threshold, \r
+-- generate combinatorial "low" bit\r
+THE_BL_COMP: process( adc_raw_in, bit_low_in )\r
+begin\r
+       if( adc_raw_in < bit_low_in ) then\r
+               next_bit_low <= '1';\r
+       else\r
+               next_bit_low <= '0';\r
+       end if;\r
+end process THE_BL_COMP;\r
+\r
+-- compare ADC raw data against "bit high" threshold, \r
+--generate combinatorial "high" bit\r
+THE_BH_COMP: process( adc_raw_in, bit_high_in )\r
+begin\r
+       if( adc_raw_in > bit_high_in ) then\r
+               next_bit_high <= '1';\r
+       else\r
+               next_bit_high <= '0';\r
+       end if;\r
+end process THE_BH_COMP;\r
+\r
+-- store comparator result, enable pipelining\r
+THE_BIT_STORE_ONE: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       bit_high <= '0';\r
+                       bit_low  <= '0';\r
+               else\r
+                       bit_high <= next_bit_high;\r
+                       bit_low  <= next_bit_low;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_STORE_ONE;\r
+\r
+-- decode real bits with valid signal (10 => '1', 01 => '0', rest invalid)\r
+next_bit_data  <= bit_high and not bit_low;\r
+next_bit_valid <= bit_high xor     bit_low;\r
+\r
+THE_BIT_SHIFT: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       bit_valid <= (others => '0');\r
+                       bit_data  <= (others => '0');\r
+               else\r
+                       bit_valid(11 downto 1) <= bit_valid(10 downto 0);\r
+                       bit_valid(0)           <= next_bit_valid;\r
+                       bit_data(11 downto 1 ) <= bit_data(10 downto 0);\r
+                       bit_data(0)            <= next_bit_data;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_SHIFT;\r
+\r
+-- tickmark recognition: as stupid as possible, as easy as possible\r
+next_tickmark <= '1' when (bit_data(2 downto 0) = "100") else '0';\r
+\r
+-- header recognition: as stupid as possible, as easy as possible\r
+next_header   <= '1' when (bit_data(2 downto 0) = "111") else '0';\r
+\r
+-- store tickmark and header result, enable pipelining\r
+THE_BIT_STORE_TWO: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       tickmark <= '0';\r
+                       header   <= '0';\r
+               else\r
+                       tickmark <= next_tickmark;\r
+                       header   <= next_header;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_STORE_TWO;\r
+\r
+\r
+--------------------------------------------------------------------------------------\r
+-- flatline recognition: in case of missing APV the ADC amplifier stage is\r
+-- "shortcut" by 100Ohm and will give a flat line on half on the ADC range.\r
+THE_FLL_COMP: process( adc_raw_in, fl_low_in )\r
+begin\r
+       if( adc_raw_in > fl_low_in ) then\r
+               next_fl_low <= '1';\r
+       else\r
+               next_fl_low <= '0';\r
+       end if;\r
+end process THE_FLL_COMP;\r
+\r
+THE_FLH_COMP: process( adc_raw_in, fl_high_in )\r
+begin\r
+       if( adc_raw_in < fl_high_in ) then\r
+               next_fl_high <= '1';\r
+       else\r
+               next_fl_high <= '0';\r
+       end if;\r
+end process THE_FLH_COMP;\r
+\r
+-- register stage one: avoid long combinatorial delays\r
+THE_FL_REG_STAGE_ONE: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       fl_high <= '0';\r
+                       fl_low  <= '0';\r
+               else\r
+                       fl_high <= next_fl_high;\r
+                       fl_low  <= next_fl_low;\r
+               end if;\r
+       end if;\r
+end process THE_FL_REG_STAGE_ONE;\r
+\r
+-- ADC signal must between lower and upper range\r
+next_fl_found <= fl_high and fl_low;\r
+\r
+-- flatline shift register\r
+THE_FL_SHIFTER: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       fl_found   <= (others => '0');\r
+               else\r
+                       fl_found(2 downto 0) <= fl_found(1 downto 0) & next_fl_found;\r
+               end if;\r
+       end if;\r
+end process THE_FL_SHIFTER;\r
+\r
+-- majority decision\r
+next_flat_line <= (    fl_found(2) and fl_found(1) and     fl_found(0)) or\r
+                                 (not fl_found(2) and fl_found(1) and     fl_found(0)) or\r
+                                 (    fl_found(2) and fl_found(1) and not fl_found(0));\r
+\r
+-- register stage two: avoid long combinatorial delays\r
+THE_FL_REG_STAGE_TWO: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       flat_line <= '0';\r
+               else\r
+                       flat_line <= next_flat_line;\r
+               end if;\r
+       end if;\r
+end process THE_FL_REG_STAGE_TWO;\r
+\r
+-- output signals\r
+bit_data_out  <= bit_data;\r
+bit_valid_out <= bit_valid;\r
+flat_line_out <= flat_line;\r
+tickmark_out  <= tickmark;\r
+header_out    <= header;\r
+bit_high_out  <= bit_high;\r
+bit_low_out   <= bit_low;\r
+\r
+end behavioral;\r
diff --git a/src/apv_lock_sm.vhd b/src/apv_lock_sm.vhd
new file mode 100755 (executable)
index 0000000..57b56f7
--- /dev/null
@@ -0,0 +1,454 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity apv_lock_sm is\r
+       port( CLK_APV_IN        : in    std_logic;\r
+                 RESET_IN              : in    std_logic;\r
+                 SYNC_IN               : in    std_logic; -- start APV synchronisation\r
+                 ADC_VALID_IN  : in    std_logic; -- ADC delivers valid data\r
+                 TIMED_IN              : in    std_logic; -- synchronisation timeout\r
+                 MATCH_IN              : in    std_logic; -- artifical tickmark from synchronized counter\r
+                 LOCKED_IN             : in    std_logic; -- enough good tickmarks\r
+                 TICK_IN               : in    std_logic; -- tickmark from digital parser\r
+                 HEADER_IN             : in    std_logic; -- header from digital parser\r
+                 FLATLINE_IN   : in    std_logic; -- flatline from digital parser\r
+                 RST_PC_OUT    : out   std_logic; -- reset period counter\r
+                 RST_TC_OUT    : out   std_logic; -- reset timeout counter\r
+                 INC_TC_OUT    : out   std_logic;\r
+                 RST_LC_OUT    : out   std_logic; -- reset lock counter\r
+                 INC_LC_OUT    : out   std_logic;\r
+                 UNKNOWN_OUT   : out   std_logic; -- status unknown\r
+                 BADADC_OUT    : out   std_logic; -- ADC data invalid\r
+                 LOCKED_OUT    : out   std_logic; -- APV locked successfully\r
+                 LOST_OUT              : out   std_logic; -- APV sync is lost\r
+                 NOSYNC_OUT    : out   std_logic; -- APV sync failed\r
+                 NOAPV_OUT             : out   std_logic; -- no APV connected\r
+                 BSM_OUT               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT             : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_lock_sm is\r
+\r
+       -- State definition\r
+       -- SLEEP  : initial reset state\r
+       -- CLEAR  : clear counters and registers\r
+       -- UWSYNC : wait for SYNC_IN to deassert\r
+       -- USYNC  : teaching phase, not synchronized yet\r
+       -- U_BADM : tickmark found, but local counter mismatch\r
+       -- U_BADP : local counter match, but no tickmark found\r
+       -- U_GOOD : local counter and tickmark match\r
+       -- U_TIME : locking timed out\r
+       -- U_FLAT : no APV connected (open input)\r
+       -- U_ADC  : ADC data is marked invaled (ser2par failed)\r
+       -- SYNCED : APV is locked, normal operation state\r
+       -- S_BADM : spurious tickmark found => fatal\r
+       -- S_BADM : missing tickmark => fatal\r
+       -- S_BADD : spurious data frame found, or bad tickmark after dataframe => fatal\r
+       -- S_GOOD : local counter and tickmark match\r
+       -- S_DATA : data frame header found at correct position\r
+       -- S_FR0  : first tickmark period of data frame\r
+       -- S_FR1  : second tickmark period of data frame\r
+       -- S_FR2  : third tickmark period of data frame\r
+       -- S_FR3  : fourth tickmark period of data frame\r
+       -- S_ADC  : ADC data is marked invalid (ser2par failed)\r
+       -- S_LOST : lock lost in normal operation => fatal\r
+\r
+       -- state machine signals\r
+       type STATES is (SLEEP, CLEAR, USYNC, UWSYNC, U_BADM, U_BADP, U_GOOD, U_TIME, U_FLAT, U_ADC,\r
+                                       SYNCED, S_BADP, S_BADM, S_GOOD, S_DATA, S_FR0, S_FR1, S_FR2, S_FR3,\r
+                                       S_BADD, S_LOST, S_ADC);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- normal signals\r
+       signal bsm                              : std_logic_vector(7 downto 0);\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+       signal next_rst_tc              : std_logic;\r
+       signal rst_tc                   : std_logic;\r
+       signal next_inc_tc              : std_logic;\r
+       signal inc_tc                   : std_logic;\r
+       signal next_rst_lc              : std_logic;\r
+       signal rst_lc                   : std_logic;\r
+       signal next_inc_lc              : std_logic;\r
+       signal inc_lc                   : std_logic;\r
+       signal next_rst_pc              : std_logic;\r
+       signal rst_pc                   : std_logic;\r
+       signal next_unknown             : std_logic;\r
+       signal unknown                  : std_logic;\r
+       signal next_badadc              : std_logic;\r
+       signal badadc                   : std_logic;\r
+       signal next_locked              : std_logic;\r
+       signal locked                   : std_logic;\r
+       signal next_lost                : std_logic;\r
+       signal lost                             : std_logic;\r
+       signal next_nosync              : std_logic;\r
+       signal nosync                   : std_logic;\r
+       signal next_noapv               : std_logic;\r
+       signal noapv                    : std_logic;    \r
+       signal next_dataframe   : std_logic;\r
+       signal dataframe                : std_logic;\r
+       \r
+begin\r
+\r
+debug <= (others => '0');\r
+\r
+-- state machine for handling synchronisation\r
+-- state registers\r
+STATE_MEM: process( clk_apv_in ) \r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       rst_pc        <= '0';\r
+                       rst_lc        <= '0';\r
+                       inc_lc        <= '0';\r
+                       rst_tc        <= '0';\r
+                       inc_tc        <= '0';\r
+                       unknown       <= '1';\r
+                       badadc        <= '0';\r
+                       locked        <= '0';\r
+                       lost          <= '0';\r
+                       nosync        <= '0';\r
+                       noapv         <= '0';\r
+                       dataframe     <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       rst_pc        <= next_rst_pc;\r
+                       rst_lc        <= next_rst_lc;\r
+                       inc_lc        <= next_inc_lc;\r
+                       rst_tc        <= next_rst_tc;\r
+                       inc_tc        <= next_inc_tc;\r
+                       unknown       <= next_unknown;\r
+                       badadc        <= next_badadc;\r
+                       locked        <= next_locked;\r
+                       lost          <= next_lost;\r
+                       nosync        <= next_nosync;\r
+                       noapv         <= next_noapv;\r
+                       dataframe     <= next_dataframe;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, sync_in, match_in, tick_in, header_in, timed_in, locked_in, flatline_in, adc_valid_in )\r
+begin\r
+       NEXT_STATE  <= SLEEP; -- avoid latches\r
+       next_rst_pc    <= '0'; \r
+       next_rst_lc    <= '0'; \r
+       next_inc_lc    <= '0';\r
+       next_rst_tc    <= '0'; \r
+       next_inc_tc    <= '0';\r
+       next_unknown   <= '0';\r
+       next_badadc    <= '0';\r
+       next_locked    <= '0';\r
+       next_lost      <= '0';\r
+       next_nosync    <= '0';\r
+       next_noapv     <= '0';\r
+       next_dataframe <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE   <= CLEAR; -- start synchronisation\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_rst_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= SLEEP;\r
+                                                       next_unknown <= '1';\r
+                                               end if;\r
+               when CLEAR      =>      NEXT_STATE   <= UWSYNC;\r
+                                               next_unknown <= '1';\r
+               when UWSYNC     =>      if   ( (sync_in = '0') and (adc_valid_in = '1') ) then\r
+                                                       NEXT_STATE   <= USYNC;\r
+                                                       next_unknown <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '0') ) then\r
+                                                       NEXT_STATE   <= U_ADC;\r
+                                                       next_badadc  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= UWSYNC;\r
+                                                       next_unknown <= '1';\r
+                                               end if;\r
+               when USYNC      =>      if   ( (timed_in = '0') and (tick_in = '1') and (match_in = '0') ) then\r
+                                                       NEXT_STATE   <= U_BADM; -- local timer not correct\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_inc_tc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                               elsif( (timed_in = '0') and (tick_in = '0') and (match_in = '1') ) then\r
+                                                       NEXT_STATE   <= U_BADP; -- tickmark position not correct\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_inc_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                               elsif( (timed_in = '1') and (flatline_in = '0') ) then\r
+                                                       NEXT_STATE   <= U_TIME; -- timeout\r
+                                                       next_nosync  <= '1';\r
+                                               elsif( (timed_in = '1') and (flatline_in = '1') ) then\r
+                                                       NEXT_STATE   <= U_FLAT; -- no APV connected\r
+                                                       next_noapv   <= '1';\r
+                                               elsif( (timed_in = '0') and (tick_in = '1') and (locked_in = '0') ) then\r
+                                                       NEXT_STATE   <= U_GOOD; -- tickmark and counter match\r
+                                                       next_inc_lc  <= '1';\r
+                                                       next_inc_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                               elsif( (timed_in = '0') and (tick_in = '1') and (locked_in = '1') ) then\r
+                                                       NEXT_STATE   <= SYNCED; -- finally locked\r
+                                                       next_locked  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= USYNC; -- wait for events\r
+                                                       next_unknown <= '1';\r
+                                               end if;\r
+               when U_BADM     =>      NEXT_STATE   <= USYNC;\r
+                                               next_unknown <= '1';\r
+               when U_BADP     =>      NEXT_STATE   <= USYNC;\r
+                                               next_unknown <= '1';\r
+               when U_GOOD     =>      NEXT_STATE   <= USYNC;\r
+                                               next_unknown <= '1';\r
+               when U_FLAT     =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE   <= CLEAR; -- next try\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_rst_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                                       next_locked  <= '0';\r
+                                                       next_lost    <= '0';\r
+                                                       next_nosync  <= '0';\r
+                                                       next_noapv   <= '0';\r
+                                               else\r
+                                                       NEXT_STATE   <= U_FLAT;\r
+                                                       next_noapv   <= '1';\r
+                                               end if;\r
+               when U_TIME     =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE   <= CLEAR; -- next try\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_rst_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                                       next_locked  <= '0';\r
+                                                       next_lost    <= '0';\r
+                                                       next_nosync  <= '0';\r
+                                                       next_noapv   <= '0';\r
+                                               else\r
+                                                       NEXT_STATE   <= U_TIME;\r
+                                                       next_nosync  <= '1';\r
+                                               end if;\r
+               when U_ADC      =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE   <= CLEAR; -- next try\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_rst_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                                       next_locked  <= '0';\r
+                                                       next_lost    <= '0';\r
+                                                       next_nosync  <= '0';\r
+                                                       next_noapv   <= '0';\r
+                                               else\r
+                                                       NEXT_STATE   <= U_ADC;\r
+                                                       next_badadc  <= '1';\r
+                                               end if;\r
+               when SYNCED     =>      if   ( sync_in = '1' ) then\r
+                                                       NEXT_STATE   <= CLEAR;\r
+                                                       next_rst_pc  <= '1';\r
+                                                       next_rst_lc  <= '1';\r
+                                                       next_rst_tc  <= '1';\r
+                                                       next_unknown <= '1';\r
+                                                       next_locked  <= '0';\r
+                                                       next_lost    <= '0';\r
+                                                       next_nosync  <= '0';\r
+                                                       next_noapv   <= '0';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '0') ) then\r
+                                                       NEXT_STATE   <= S_ADC;\r
+                                                       next_badadc  <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '1') and (match_in = '0') and (tick_in = '1') and (header_in = '0') ) then\r
+                                                       NEXT_STATE   <= S_BADM;\r
+                                                       next_lost    <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '1') and (match_in = '0') and (tick_in = '0') and (header_in = '1') ) then\r
+                                                       NEXT_STATE   <= S_BADD;\r
+                                                       next_lost    <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '1') and (match_in = '1') and (tick_in = '0') and (header_in = '0') ) then\r
+                                                       NEXT_STATE   <= S_BADP;\r
+                                                       next_lost    <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '1') and (match_in = '1') and (tick_in = '1') ) then\r
+                                                       NEXT_STATE   <= S_GOOD;\r
+                                                       next_locked  <= '1';\r
+                                               elsif( (sync_in = '0') and (adc_valid_in = '1') and (match_in = '1') and (header_in = '1') ) then\r
+                                                       NEXT_STATE   <= S_DATA;\r
+                                                       next_locked  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= SYNCED;\r
+                                                       next_locked  <= '1';\r
+                                               end if;\r
+               when S_GOOD     =>      NEXT_STATE   <= SYNCED;\r
+                                               next_locked  <= '1';\r
+               when S_DATA     =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE     <= CLEAR;\r
+                                                       next_rst_pc    <= '1';\r
+                                                       next_rst_lc    <= '1';\r
+                                                       next_rst_tc    <= '1';\r
+                                                       next_unknown   <= '1';\r
+                                                       next_locked    <= '0';\r
+                                                       next_lost      <= '0';\r
+                                                       next_nosync    <= '0';\r
+                                                       next_noapv     <= '0';\r
+                                               else\r
+                                                       NEXT_STATE     <= S_FR0;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               end if;\r
+               when S_FR0      =>      if   ( sync_in = '1' ) then\r
+                                                       NEXT_STATE     <= CLEAR;\r
+                                                       next_rst_pc    <= '1';\r
+                                                       next_rst_lc    <= '1';\r
+                                                       next_rst_tc    <= '1';\r
+                                                       next_unknown   <= '1';\r
+                                                       next_locked    <= '0';\r
+                                                       next_lost      <= '0';\r
+                                                       next_nosync    <= '0';\r
+                                                       next_noapv     <= '0';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') ) then\r
+                                                       NEXT_STATE     <= S_FR1;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= S_FR0;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               end if;\r
+               when S_FR1      =>      if   ( sync_in = '1' ) then\r
+                                                       NEXT_STATE <= CLEAR;\r
+                                                       next_rst_pc    <= '1';\r
+                                                       next_rst_lc    <= '1';\r
+                                                       next_rst_tc    <= '1';\r
+                                                       next_unknown   <= '1';\r
+                                                       next_locked    <= '0';\r
+                                                       next_lost      <= '0';\r
+                                                       next_nosync    <= '0';\r
+                                                       next_noapv     <= '0';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') ) then\r
+                                                       NEXT_STATE     <= S_FR2;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= S_FR1;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               end if;\r
+               when S_FR2      =>      if   ( sync_in = '1' ) then\r
+                                                       NEXT_STATE     <= CLEAR;\r
+                                                       next_rst_pc    <= '1';\r
+                                                       next_rst_lc    <= '1';\r
+                                                       next_rst_tc    <= '1';\r
+                                                       next_unknown   <= '1';\r
+                                                       next_locked    <= '0';\r
+                                                       next_lost      <= '0';\r
+                                                       next_nosync    <= '0';\r
+                                                       next_noapv     <= '0';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') ) then\r
+                                                       NEXT_STATE     <= S_FR3;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= S_FR2;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               end if;\r
+               when S_FR3      =>      if   ( sync_in = '1' ) then\r
+                                                       NEXT_STATE     <= CLEAR;\r
+                                                       next_rst_pc    <= '1';\r
+                                                       next_rst_lc    <= '1';\r
+                                                       next_rst_tc    <= '1';\r
+                                                       next_unknown   <= '1';\r
+                                                       next_locked    <= '0';\r
+                                                       next_lost      <= '0';\r
+                                                       next_nosync    <= '0';\r
+                                                       next_noapv     <= '0';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') and (tick_in = '1') ) then\r
+                                                       NEXT_STATE     <= SYNCED;\r
+                                                       next_locked    <= '1';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') and (header_in = '1') ) then\r
+                                                       NEXT_STATE     <= S_DATA;\r
+                                                       next_locked    <= '1';\r
+                                               elsif( (sync_in = '0') and (match_in = '1') and (header_in = '0') and (tick_in = '0') ) then\r
+                                                       NEXT_STATE     <= S_BADD;\r
+                                               else\r
+                                                       NEXT_STATE     <= S_FR3;\r
+                                                       next_dataframe <= '1';\r
+                                                       next_locked    <= '1';\r
+                                               end if;\r
+               when S_BADD     =>      NEXT_STATE   <= S_LOST;\r
+                                               next_lost    <= '1';\r
+               when S_BADM     =>      NEXT_STATE   <= S_LOST;\r
+                                               next_lost    <= '1';\r
+               when S_BADP     =>      NEXT_STATE   <= S_LOST;\r
+                                               next_lost    <= '1';\r
+               when S_ADC      =>      NEXT_STATE   <= S_LOST;\r
+                                               next_lost    <= '1';\r
+               when S_LOST     =>      if( sync_in = '1' ) then\r
+                                                       NEXT_STATE    <= CLEAR; -- next try\r
+                                                       next_rst_pc   <= '1';\r
+                                                       next_rst_lc   <= '1';\r
+                                                       next_rst_tc   <= '1';\r
+                                                       next_unknown  <= '1';\r
+                                                       next_locked   <= '0';\r
+                                                       next_lost     <= '0';\r
+                                                       next_nosync   <= '0';\r
+                                                       next_noapv    <= '0';\r
+                                               else\r
+                                                       NEXT_STATE    <= S_LOST;\r
+                                                       next_lost     <= '1';\r
+                                               end if;\r
+               when others     =>      NEXT_STATE   <= SLEEP;\r
+                                               next_unknown <= '1';\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm <= x"00";\r
+               when CLEAR      =>      bsm <= x"01";\r
+               when UWSYNC     =>      bsm <= x"20"; \r
+               when USYNC      =>      bsm <= x"02";\r
+               when U_BADM     =>      bsm <= x"03";\r
+               when U_BADP     =>      bsm <= x"04";\r
+               when U_FLAT     =>      bsm <= x"05";\r
+               when U_GOOD     =>      bsm <= x"06";\r
+               when U_TIME     =>      bsm <= x"07";\r
+               when U_ADC      =>      bsm <= x"08";\r
+               when SYNCED     =>      bsm <= x"09";\r
+               when S_BADP     =>      bsm <= x"0a";\r
+               when S_BADM     =>      bsm <= x"0b";\r
+               when S_GOOD     =>      bsm <= x"0c";\r
+               when S_DATA     =>      bsm <= x"0d";\r
+               when S_FR0      =>      bsm <= x"0e";\r
+               when S_FR1      =>      bsm <= x"0f";\r
+               when S_FR2      =>      bsm <= x"10";\r
+               when S_FR3      =>      bsm <= x"11";\r
+               when S_BADD     =>      bsm <= x"12";\r
+               when S_ADC      =>      bsm <= x"13";\r
+               when S_LOST     =>      bsm <= x"14";\r
+               when others     =>      bsm <= x"ff";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+-- output signals\r
+debug_out     <= debug;\r
+bsm_out       <= bsm;\r
+unknown_out   <= unknown;\r
+badadc_out    <= badadc;\r
+locked_out    <= locked;\r
+lost_out      <= lost;\r
+nosync_out    <= nosync;\r
+noapv_out     <= noapv;\r
+rst_pc_out    <= rst_pc;\r
+rst_lc_out    <= rst_lc;\r
+rst_tc_out    <= rst_tc;\r
+inc_lc_out    <= inc_lc;\r
+inc_tc_out    <= inc_tc;\r
+\r
+end behavioral;\r
diff --git a/src/apv_locker.vhd b/src/apv_locker.vhd
new file mode 100755 (executable)
index 0000000..ee48a47
--- /dev/null
@@ -0,0 +1,434 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- This block takes care of syncing in the APVs. Only "synced" APVs are allowed to deliver data streams \r
+-- to the processing units. \r
+\r
+entity apv_locker is\r
+       port( CLK_APV_IN                        : in    std_logic;\r
+                 RESET_IN                              : in    std_logic;\r
+                 ADC_RAW_IN                    : in    std_logic_vector(11 downto 0);  -- ADC: raw data, synchronous to CLK_APV_IN\r
+                 ADC_VALID_IN                  : in    std_logic;                                              -- ADC: ser2par data is valid\r
+                 -- Slow control input, mainly digital thresholds here\r
+                 SYNC_IN                               : in    std_logic;                                              -- sync pulse input \r
+                 APV_ON_IN                             : in    std_logic;                                              -- this APV channel is switched on\r
+                 BIT_LOW_IN                    : in    std_logic_vector(11 downto 0);  -- slow control: threshold for digital '0'\r
+                 BIT_HIGH_IN                   : in    std_logic_vector(11 downto 0);  -- slow control: threshold for digital '1'\r
+                 FL_LOW_IN                             : in    std_logic_vector(11 downto 0);  -- lower threshold for ADC flatline\r
+                 FL_HIGH_IN                    : in    std_logic_vector(11 downto 0);  -- upper threshold for ADC flatline\r
+                 -- Generic APV status outputs (valid only if ADC_CLK_IN is working!)\r
+                 STATUS_IGNORE_OUT             : out   std_logic;                                              -- APV is to be ignored (effectively => switched off)\r
+                 STATUS_BADADC_OUT             : out   std_logic;                                              -- ADC ser2par data is invalid\r
+                 STATUS_UNKNOWN_OUT    : out   std_logic;                                              -- APV is not initialized yet\r
+                 STATUS_LOCKED_OUT             : out   std_logic;                                              -- APV locked successfully\r
+                 STATUS_LOST_OUT               : out   std_logic;                                              -- APV tickmark missing or wrong\r
+                 STATUS_NOSYNC_OUT             : out   std_logic;                                              -- APV did not lock successfully\r
+                 STATUS_MISSING_OUT    : out   std_logic;                                              -- APV is missing, ADC flatline detected\r
+                 STATUS_TICKMARK_OUT   : out   std_logic;\r
+                 -- Frame related status, to be stored in the raw status buffer\r
+                 -- Information is valid with APV_LAST_OUT, except FRAME_ERROR_OUT, FRAME_ROW_OUT and \r
+                 -- FRAME_CTR_OUT which are valid with beginning of APV_ANALOG_OUT.\r
+                 FRAME_ROW_OUT                 : out   std_logic_vector(7 downto 0);   -- decoded row from APV header\r
+                 FRAME_ERROR_OUT               : out   std_logic;                                              -- decoded error bit from APV header\r
+                 FRAME_FLAT_OUT                : out   std_logic;                                              -- APV sends a flat line (analog dead?)\r
+                 FRAME_OVF_OUT                 : out   std_logic;                                              -- at least one channel in frame was overflow\r
+                 FRAME_UDF_OUT                 : out   std_logic;                                              -- at least one channel in frame was underflow\r
+                 FRAME_CTR_OUT                 : out   std_logic_vector(3 downto 0);   -- frame counter for incoming data frames\r
+                 -- Channel related information, to be stored in the raw data buffer\r
+                 APV_CHANNEL_OUT               : out   std_logic_vector(6 downto 0);   -- physical channel ID\r
+                 APV_OVERFLOW_OUT              : out   std_logic;                                              -- channel is truncated high\r
+                 APV_UNDERFLOW_OUT             : out   std_logic;                                              -- channel is truncated low\r
+                 APV_RAW_OUT                   : out   std_logic_vector(11 downto 0);  -- APV raw data\r
+                 APV_ANALOG_OUT                : out   std_logic;                                              -- APV analog data is valid\r
+                 APV_START_OUT                 : out   std_logic;                                              -- valid data frame found, reserve one buffer \r
+                 APV_LAST_OUT                  : out   std_logic;                                              -- last APV channel of dataframe\r
+                 -- Debug information\r
+                 DEBUG_OUT                             : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_locker is\r
+\r
+       -- normal signals\r
+       signal lock_bsm                         : std_logic_vector(7 downto 0);\r
+       signal tickmark_found           : std_logic;\r
+       signal header_found                     : std_logic;\r
+       signal flatline_found           : std_logic;\r
+       signal status_unknown           : std_logic;\r
+       signal status_badadc            : std_logic;\r
+       signal status_locked            : std_logic;\r
+       signal status_lost                      : std_logic;\r
+       signal status_nosync            : std_logic;\r
+       signal status_missing           : std_logic;\r
+       signal next_status_ignore       : std_logic;\r
+       signal status_ignore            : std_logic;\r
+       signal frame_flat                       : std_logic;\r
+       signal next_frame_ovf           : std_logic;\r
+       signal frame_ovf                        : std_logic;\r
+       signal next_frame_udf           : std_logic;\r
+       signal frame_udf                        : std_logic;\r
+       signal frame_row                        : std_logic_vector(7 downto 0);\r
+       signal frame_error                      : std_logic;\r
+       signal bit_data                         : std_logic_vector(11 downto 0);\r
+       signal bit_valid                        : std_logic_vector(11 downto 0);\r
+\r
+       signal rst_pc_sm                        : std_logic;\r
+       signal rst_pc_ctr                       : std_logic;\r
+       signal pc_ctr                           : std_logic_vector(5 downto 0);\r
+       signal next_pc_match            : std_logic;\r
+       signal pc_match                         : std_logic;\r
+\r
+       signal rst_tc_sm                        : std_logic;\r
+       signal inc_tc_sm                        : std_logic;\r
+       signal tc_ctr                           : std_logic_vector(3 downto 0);\r
+       signal next_sync_timeout        : std_logic;\r
+       signal sync_timeout                     : std_logic;\r
+\r
+       signal rst_lc_sm                        : std_logic;\r
+       signal inc_lc_sm                        : std_logic;\r
+       signal lc_ctr                           : std_logic_vector(3 downto 0);\r
+       signal next_sync_success        : std_logic;\r
+       signal sync_success                     : std_logic;\r
+       \r
+       signal delay_store                      : std_logic_vector(7 downto 0);\r
+       signal store_header                     : std_logic;\r
+       \r
+       signal apv_channel                      : std_logic_vector(6 downto 0);\r
+       signal ce_chnl_ctr                      : std_logic;\r
+       signal frame_analog                     : std_logic;\r
+       signal set_frame_analog         : std_logic;\r
+       signal rst_frame_analog         : std_logic;\r
+       signal next_apv_last            : std_logic;\r
+       signal apv_last                         : std_logic;\r
+       signal apv_start                        : std_logic;\r
+       \r
+       signal adc_raw_one                      : std_logic_vector(11 downto 0);\r
+       signal adc_raw_two                      : std_logic_vector(11 downto 0);\r
+       \r
+       signal bit_high                         : std_logic;\r
+       signal bit_low                          : std_logic;\r
+       signal apv_overflow                     : std_logic;\r
+       signal apv_underflow            : std_logic;\r
+       \r
+       signal next_ce_underflow        : std_logic;\r
+       signal next_ce_overflow         : std_logic;\r
+\r
+       signal sum_ovf                          : std_logic_vector(7 downto 0);\r
+       signal sum_udf                          : std_logic_vector(7 downto 0);\r
+\r
+       signal frame_ctr                        : std_logic_vector(3 downto 0);\r
+       signal comb_ce_frame_ctr        : std_logic;\r
+       \r
+       signal debug                            : std_logic_vector(15 downto 0);\r
+       \r
+       signal apv_on                           : std_logic; -- 40MHz clock domain register\r
+       \r
+begin\r
+\r
+-- Debug signals\r
+debug <= (others => '0');\r
+\r
+-- Clock domain crossing\r
+THE_APVON_SYNCER: state_sync\r
+port map( STATE_A_IN           => apv_on_in,\r
+                 CLK_B_IN                      => clk_apv_in,\r
+                 RESET_B_IN            => reset_in,\r
+                 STATE_B_OUT           => apv_on\r
+               );\r
+\r
+-- Input stage, for tickmark and header recognition, and bit decoding.\r
+-- Also detects missing APVs by flatline.\r
+THE_APV_DIGITAL: apv_digital\r
+port map( CLK_APV_IN   => clk_apv_in,\r
+                 RESET_IN              => reset_in,\r
+                 ADC_RAW_IN    => adc_raw_in,\r
+                 BIT_LOW_IN    => bit_low_in,\r
+                 BIT_HIGH_IN   => bit_high_in,\r
+                 FL_LOW_IN             => fl_low_in,\r
+                 FL_HIGH_IN    => fl_high_in,\r
+                 BIT_DATA_OUT  => bit_data,\r
+                 BIT_VALID_OUT => bit_valid, -- for testing!\r
+                 BIT_HIGH_OUT  => bit_high, -- for analog off recognition, one cycle earlier\r
+                 BIT_LOW_OUT   => bit_low, -- for analog off recognition, one cycle earlier\r
+                 TICKMARK_OUT  => tickmark_found,\r
+                 HEADER_OUT    => header_found,\r
+                 FLAT_LINE_OUT => flatline_found\r
+               );\r
+\r
+-- Count enables for the underflow / overflow counters\r
+next_ce_underflow <= '1' when (bit_high = '0' and bit_low = '1' and frame_analog = '1') else '0';\r
+next_ce_overflow  <= '1' when (bit_high = '1' and bit_low = '0' and frame_analog = '1') else '0';\r
+\r
+-- Counter for underflow channels\r
+THE_UNDERFLOW_CTR_PROC: process( clk_apv_in )\r
+begin \r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( (reset_in = '1') or (delay_store(1) = '1') ) then\r
+                       sum_udf <= (others => '0');\r
+               elsif( next_ce_underflow = '1' ) then\r
+                       sum_udf <= sum_udf + 1; \r
+               end if;\r
+       end if;\r
+end process THE_UNDERFLOW_CTR_PROC;\r
+\r
+-- Reduced information: at least one channel was underflow\r
+next_frame_udf  <= '1' when (sum_udf /= x"00") else '0';\r
+-- Reduced information: all channels in a frame were underflow\r
+frame_flat      <= sum_udf(7);\r
+\r
+-- Counter for Overflow channels\r
+THE_OVERFLOW_CTR_PROC: process( clk_apv_in )\r
+begin \r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( (reset_in = '1') or (delay_store(1) = '1') ) then\r
+                       sum_ovf <= (others => '0');\r
+               elsif( next_ce_overflow = '1' ) then\r
+                       sum_ovf <= sum_ovf + 1; \r
+               end if;\r
+       end if;\r
+end process THE_OVERFLOW_CTR_PROC;\r
+\r
+-- Reduced information: at least one channel was underflow\r
+next_frame_ovf  <= '1' when (sum_ovf /= x"00") else '0';\r
+\r
+THE_SYNC_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               apv_overflow   <= next_ce_overflow;\r
+               apv_underflow  <= next_ce_underflow;\r
+               frame_ovf      <= next_frame_ovf;\r
+               frame_udf      <= next_frame_udf;\r
+               status_ignore  <= next_status_ignore;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- locking state machine\r
+THE_APV_LOCK_SM: apv_lock_sm\r
+port map( CLK_APV_IN   => clk_apv_in,\r
+                 RESET_IN              => reset_in,\r
+                 SYNC_IN               => sync_in, -- 40 MHz signal!\r
+                 ADC_VALID_IN  => adc_valid_in,\r
+                 TIMED_IN              => sync_timeout,\r
+                 MATCH_IN              => pc_match,\r
+                 LOCKED_IN             => sync_success,\r
+                 TICK_IN               => tickmark_found,\r
+                 HEADER_IN             => header_found,\r
+                 FLATLINE_IN   => flatline_found,\r
+                 RST_PC_OUT    => rst_pc_sm,\r
+                 RST_TC_OUT    => rst_tc_sm,\r
+                 INC_TC_OUT    => inc_tc_sm,\r
+                 RST_LC_OUT    => rst_lc_sm,\r
+                 INC_LC_OUT    => inc_lc_sm,\r
+                 UNKNOWN_OUT   => status_unknown,\r
+                 BADADC_OUT    => status_badadc,\r
+                 LOCKED_OUT    => status_locked,\r
+                 LOST_OUT              => status_lost,\r
+                 NOSYNC_OUT    => status_nosync,\r
+                 NOAPV_OUT             => status_missing,\r
+                 BSM_OUT               => lock_bsm,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+next_status_ignore <= not apv_on;\r
+\r
+\r
+-- synchronous reset for period counter (either by counter, or by state machine)\r
+next_pc_match <= '1' when ( pc_ctr = "100000" ) else '0'; -- "100001"\r
+\r
+-- period counter (0..34) for one tickmark period\r
+THE_PERIOD_COUNTER: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( (reset_in = '1') or (rst_pc_sm = '1') or (rst_pc_ctr = '1')) then\r
+                       pc_ctr     <= (others => '0');\r
+                       pc_match   <= '0';\r
+                       rst_pc_ctr <= '0';\r
+               else\r
+                       pc_ctr     <= pc_ctr + 1;\r
+                       pc_match   <= next_pc_match;\r
+                       rst_pc_ctr <= pc_match;\r
+               end if;         \r
+       end if;\r
+end process THE_PERIOD_COUNTER;\r
+\r
+-- watermark for the synchronisation timeout\r
+next_sync_timeout <= '1' when ( tc_ctr = x"f" ) else '0';\r
+\r
+-- timeout counter for the lock process\r
+THE_TIMEOUT_COUNTER: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( (reset_in = '1') or (rst_tc_sm = '1') ) then\r
+                       tc_ctr       <= (others => '0');\r
+                       sync_timeout <= '0';\r
+               elsif( inc_tc_sm = '1' ) then\r
+                       tc_ctr       <= tc_ctr + 1;\r
+                       sync_timeout <= next_sync_timeout;\r
+               end if;\r
+       end if;\r
+end process THE_TIMEOUT_COUNTER;\r
+\r
+-- watermark for the successful synchronisation \r
+next_sync_success <= '1' when ( lc_ctr = x"8" ) else '0';\r
+\r
+-- lock counter for the lock process\r
+THE_LOCK_COUNTER: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( (reset_in = '1') or (rst_lc_sm = '1') ) then\r
+                       lc_ctr       <= (others => '0');\r
+                       sync_success <= '0';\r
+               elsif( inc_lc_sm = '1' ) then\r
+                       lc_ctr       <= lc_ctr + 1;\r
+                       sync_success <= next_sync_success;\r
+               end if;\r
+       end if;\r
+end process THE_LOCK_COUNTER;\r
+\r
+-- registering the APV header needs some delay for header_found\r
+THE_DELAY_LINE: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       delay_store <= (others => '0');\r
+               else\r
+                       delay_store(7 downto 1) <= delay_store(6 downto 0);\r
+                       -- we only accept data frames when they arrive at a well defined tickmark place, \r
+                       -- when the APV is really switched on, and it is in locked state.\r
+                       delay_store(0)          <= header_found and pc_match and apv_on and status_locked;\r
+               end if;\r
+       end if;\r
+end process THE_DELAY_LINE;\r
+\r
+-- frame start signal for early blocking of the buffer page\r
+apv_start      <= delay_store(0);\r
+\r
+-- here we can adjust the correct delay for the pipelining\r
+store_header   <= delay_store(7);\r
+\r
+-- enable signal for underflow / overflow counters\r
+next_apv_last     <= '1' when (apv_channel = "1111110") else '0';\r
+set_frame_analog  <= '1' when (delay_store(6) = '1') else '0';\r
+rst_frame_analog  <= '1' when (next_apv_last = '1')  else '0';\r
+\r
+-- frame counter clock enable\r
+comb_ce_frame_ctr <= apv_last;\r
+\r
+-- analog frame, one cycle before output data.\r
+THE_FRAME_ANALOG_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       frame_analog <= '0';\r
+               elsif( set_frame_analog = '1' ) then\r
+                       frame_analog <= '1';\r
+               elsif( rst_frame_analog = '1' ) then\r
+                       frame_analog <= '0';\r
+               end if;\r
+       end if;\r
+end process THE_FRAME_ANALOG_PROC;\r
+\r
+-- real counter for channels is one cycle later\r
+THE_CE_CHNL_CTR_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       ce_chnl_ctr <= '0';\r
+               else\r
+                       ce_chnl_ctr <= frame_analog;\r
+               end if;\r
+       end if;\r
+end process THE_CE_CHNL_CTR_PROC;\r
+\r
+-- Channel counter, used for timing and PID generation\r
+THE_CHANNEL_CTR: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       apv_channel <= (others => '0');\r
+                       apv_last    <= '0';\r
+               elsif( ce_chnl_ctr = '1' ) then\r
+                       apv_channel <= apv_channel + 1;\r
+                       apv_last    <= next_apv_last;\r
+               end if;\r
+       end if;\r
+end process THE_CHANNEL_CTR;\r
+\r
+THE_APV_RAW_DELAY: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               adc_raw_two <= adc_raw_one;\r
+               adc_raw_one <= adc_raw_in;\r
+       end if;\r
+end process THE_APV_RAW_DELAY;\r
+\r
+-- storage registers\r
+THE_HEADER_STORAGE_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       frame_error <= '0'; -- bit is inverted!\r
+                       frame_row   <= (others => '0');                 \r
+               elsif( store_header = '1' ) then\r
+                       frame_error <= not bit_data(0); -- bit is inverted!\r
+                       frame_row   <= bit_data(8 downto 1);\r
+               end if;\r
+       end if;\r
+end process THE_HEADER_STORAGE_PROC;\r
+\r
+-- frame counter logic\r
+THE_FRAME_CTR_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       frame_ctr <= (others => '0');\r
+               elsif( comb_ce_frame_ctr = '1' ) then\r
+                       frame_ctr <= frame_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_FRAME_CTR_PROC;\r
+\r
+\r
+-- output signals\r
+status_ignore_out   <= status_ignore;\r
+status_unknown_out  <= status_unknown;\r
+status_badadc_out   <= status_badadc;\r
+status_locked_out   <= status_locked;\r
+status_lost_out     <= status_lost;\r
+status_nosync_out   <= status_nosync;\r
+status_missing_out  <= status_missing;\r
+status_tickmark_out <= pc_match;\r
+\r
+-- Changing SID to PID on the fly for free\r
+-- Keep in mind:  1- 0- 3- 2- 6- 5- 4\r
+apv_channel_out(6)  <= apv_channel(1);\r
+apv_channel_out(5)  <= apv_channel(0);\r
+apv_channel_out(4)  <= apv_channel(3);\r
+apv_channel_out(3)  <= apv_channel(2);\r
+apv_channel_out(2)  <= apv_channel(6);\r
+apv_channel_out(1)  <= apv_channel(5);\r
+apv_channel_out(0)  <= apv_channel(4);\r
+\r
+apv_raw_out         <= adc_raw_two;\r
+apv_overflow_out    <= apv_overflow;\r
+apv_underflow_out   <= apv_underflow;\r
+apv_analog_out      <= ce_chnl_ctr;\r
+apv_start_out          <= apv_start;\r
+apv_last_out        <= apv_last;\r
+\r
+frame_flat_out      <= frame_flat;\r
+frame_ovf_out       <= frame_ovf;\r
+frame_udf_out       <= frame_udf;\r
+frame_ctr_out       <= frame_ctr;\r
+frame_error_out     <= frame_error;\r
+frame_row_out       <= frame_row;\r
+\r
+-- Debug signals, do not use!\r
+debug_out           <= debug;\r
+\r
+end behavioral;\r
diff --git a/src/apv_map_mem.lpc b/src/apv_map_mem.lpc
new file mode 100644 (file)
index 0000000..d52bb95
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=apv_map_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=10/14/2009\r
+Time=17:47:59\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=128\r
+Data=4\r
+LUT=0\r
+MemFile=i:/vhdl_pro/adcmv3/src/apv_mapping.mem\r
+MemFormat=orca\r
diff --git a/src/apv_map_mem.srp b/src/apv_map_mem.srp
new file mode 100644 (file)
index 0000000..d3b5189
--- /dev/null
@@ -0,0 +1,30 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Wed Oct 14 17:47:59 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n apv_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv2/src/apv_mapping.mem -memformat orca -e 
+    Circuit name     : apv_map_mem
+    Module type      : rom
+    Module Version   : 2.4
+    Address width    : 7
+    Ports            : 
+       Inputs       : Address[6:0]
+       Outputs      : Q[3:0]
+    I/O buffer       : not inserted
+    Memory file      : i:/vhdl_pro/adcmv2/src/apv_mapping.mem
+    EDIF output      : suppressed
+    VHDL output      : apv_map_mem.vhd
+    VHDL template    : apv_map_mem_tmpl.vhd
+    VHDL testbench    : tb_apv_map_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : apv_map_mem.srp
+    Element Usage    :
+       ROM128X1 : 4
+    Estimated Resource Usage:
+            LUT : 16
diff --git a/src/apv_map_mem.vhd b/src/apv_map_mem.vhd
new file mode 100644 (file)
index 0000000..3c2f90e
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 7 -num_rows 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv2/src/apv_mapping.mem -memformat orca -e 
+
+-- Wed Oct 14 17:47:59 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity apv_map_mem is
+    port (
+        Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end apv_map_mem;
+
+architecture Structure of apv_map_mem is
+
+    -- local component declarations
+    component ROM128X1
+    -- synopsys translate_off
+        generic (INITVAL : in String);
+    -- synopsys translate_on
+        port (AD6: in  std_logic; AD5: in  std_logic; AD4: in  std_logic; 
+            AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0xFF00FF00FF001FE0E01F7F80807F6956";
+    attribute initval of mem_0_2 : label is "0xF0F0F0F0F0F0079DF8621E0FE1F0E287";
+    attribute initval of mem_0_1 : label is "0xCCCCCCCCCCCC867A798519ECE6139D07";
+    attribute initval of mem_0_0 : label is "0xAAAAAAAAAAAA3553CAAC355ACAA5B1E2";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xFF00FF00FF001FE0E01F7F80807F6956")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xF0F0F0F0F0F0079DF8621E0FE1F0E287")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xCCCCCCCCCCCC867A798519ECE6139D07")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(1));
+
+    mem_0_0: ROM128X1
+        -- synopsys translate_off
+        generic map (initval=> "0xAAAAAAAAAAAA3553CAAC355ACAA5B1E2")
+        -- synopsys translate_on
+        port map (AD6=>Address(6), AD5=>Address(5), AD4=>Address(4), 
+            AD3=>Address(3), AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of apv_map_mem is
+    for Structure
+        for all:ROM128X1 use entity ecp2m.ROM128X1(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/apv_map_mem_generate.log b/src/apv_map_mem_generate.log
new file mode 100644 (file)
index 0000000..49afe96
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Wed Oct 14 17:47:59 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n apv_map_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 7 -num_words 128 -data_width 4 -outdata UNREGISTERED -memfile i:/vhdl_pro/adcmv2/src/apv_mapping.mem -memformat orca -e \r
+    Circuit name     : apv_map_mem\r
+    Module type      : rom\r
+    Module Version   : 2.4\r
+    Address width    : 7\r
+    Data width       : 4\r
+    Ports            : \r
+       Inputs       : Address[6:0]\r
+       Outputs      : Q[3:0]\r
+    I/O buffer       : not inserted\r
+    Memory file      : i:/vhdl_pro/adcmv2/src/apv_mapping.mem\r
+    EDIF output      : suppressed\r
+    VHDL output      : apv_map_mem.vhd\r
+    VHDL template    : apv_map_mem_tmpl.vhd\r
+    VHDL testbench   : tb_apv_map_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : apv_map_mem.srp\r
+    Estimated Resource Usage:\r
+            LUT : 16\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\apv_map_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/apv_map_mem_tmpl.vhd b/src/apv_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..daaa9a8
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+-- Wed Oct 14 17:47:59 2009
+
+-- parameterized module component declaration
+component apv_map_mem
+    port (Address: in  std_logic_vector(6 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : apv_map_mem
+    port map (Address(6 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/apv_mapping.mem b/src/apv_mapping.mem
new file mode 100644 (file)
index 0000000..1c4a8c6
--- /dev/null
@@ -0,0 +1,155 @@
+#Format=Address-Hex\r
+#Depth=128\r
+#DataWidth=4\r
+#AddrRadix=3\r
+#DataRadix=3\r
+\r
+# Backplane 0\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    3   5  10  12   9   7   0   -   4   6  11   8  14  13   2   1\r
+#\r
+# mapAPV    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# realADC   6  15  14   0   8   1   9   5   b   4   2   a   3   d   c   7\r
+00: 6\r
+01: f\r
+02: e\r
+03: 0\r
+04: 8\r
+05: 1\r
+06: 9\r
+07: 5\r
+08: b\r
+09: 4\r
+0a: 2\r
+0b: a\r
+0c: 3\r
+0d: d\r
+0e: c\r
+0f: 7\r
+# Backplane 1\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   12  11  10   9   8   7  13  14   3   2   1   0   6   5   4   -\r
+10: b\r
+11: a\r
+12: 9\r
+13: 8\r
+14: e\r
+15: d\r
+16: c\r
+17: 5\r
+18: 4\r
+19: 3\r
+1a: 2\r
+1b: 1\r
+1c: 0\r
+1d: 6\r
+1e: 7\r
+1f: f\r
+# Backplane 2\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV    -   4   5   6   0   1   2   3  14  13   7   8   9  10  11  12\r
+20: 4 \r
+21: 5\r
+22: 6\r
+23: 7\r
+24: 1\r
+25: 2\r
+26: 3\r
+27: a\r
+28: b\r
+29: c\r
+2a: d\r
+2b: e\r
+2c: f\r
+2d: 9\r
+2e: 8\r
+2f: 0\r
+# Backplane 3\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   10   9   8   7   6   5  12  11   4   3   0   2   1   -  13  14\r
+30: a\r
+31: c\r
+32: b\r
+33: 9\r
+34: 8\r
+35: 5\r
+36: 4\r
+37: 3\r
+38: 2\r
+39: 1\r
+3a: 0\r
+3b: 7\r
+3c: 6\r
+3d: e\r
+3e: f\r
+3f: d\r
+# Backplane 4\r
+# realADC   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\r
+# mapAPV   14  13   -   1   2   0   3   4  11  12   5   6   7   8   9  10\r
+40: 5\r
+41: 3\r
+42: 4\r
+43: 6\r
+44: 7\r
+45: a\r
+46: b\r
+47: c\r
+48: d\r
+49: e\r
+4a: f\r
+4b: 8\r
+4c: 9\r
+4d: 1\r
+4e: 0\r
+4f: 2\r
+# unused (5) => 1:1\r
+50: 0\r
+51: 1\r
+52: 2\r
+53: 3\r
+54: 4\r
+55: 5\r
+56: 6\r
+57: 7\r
+58: 8\r
+59: 9\r
+5a: a\r
+5b: b\r
+5c: c\r
+5d: d\r
+5e: e\r
+5f: f\r
+# unused (6) => 1:1\r
+60: 0\r
+61: 1\r
+62: 2\r
+63: 3\r
+64: 4\r
+65: 5\r
+66: 6\r
+67: 7\r
+68: 8\r
+69: 9\r
+6a: a\r
+6b: b\r
+6c: c\r
+6d: d\r
+6e: e\r
+6f: f\r
+# unused (7) => 1:1\r
+70: 0\r
+71: 1\r
+72: 2\r
+73: 3\r
+74: 4\r
+75: 5\r
+76: 6\r
+77: 7\r
+78: 8\r
+79: 9\r
+7a: a\r
+7b: b\r
+7c: c\r
+7d: d\r
+7e: e\r
+7f: f\r
diff --git a/src/apv_pc_nc_alu.vhd b/src/apv_pc_nc_alu.vhd
new file mode 100644 (file)
index 0000000..04668c7
--- /dev/null
@@ -0,0 +1,360 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- IMPORTANT: 0,2,4,...,126 => physics channels\r
+--            1,3,5,...,127 => empty channels\r
+\r
+-- This unit takes frame data (channel order is fixed) and\r
+-- applies different steps of analysis depening on evt_type_in.\r
+-- Data is piped out directly.\r
+\r
+entity apv_pc_nc_alu is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic;\r
+                 START_IN                      : in    std_logic; -- start signal, used for initialisation of counters\r
+                 MAX_FRAMES_IN         : in    std_logic_vector(3 downto 0); -- number of frames requested\r
+                 CURR_FRAME_IN         : in    std_logic_vector(3 downto 0); -- current frame number\r
+                 LOC_FRM_CTR_IN        : in    std_logic_vector(3 downto 0); -- DEBUG\r
+                 EDS_FRM_CTR_IN        : in    std_logic_vector(3 downto 0); -- DEBUG\r
+                 BUF_GOOD_IN           : in    std_logic; -- process buffer\r
+                 BUF_BAD_IN            : in    std_logic; -- write only error header\r
+                 BUF_IGNORE_IN         : in    std_logic; -- do not write anything\r
+                 ERROR_IN                      : in    std_logic_vector(3 downto 0); -- buffer status, errors from checkers\r
+                 DO_HEADER_IN          : in    std_logic;\r
+                 DO_ERROR_IN           : in    std_logic;\r
+                 EVT_TYPE_IN           : in    std_logic_vector(2 downto 0);\r
+                 RAW_ADDR_IN           : in    std_logic_vector(6 downto 0);\r
+                 RAW_DATA_IN           : in    std_logic_vector(37 downto 0);\r
+                 PED_DATA_IN           : in    std_logic_vector(17 downto 0); \r
+                 THR_DATA_IN           : in    std_logic_vector(17 downto 0);\r
+                 FRAME_IN                      : in    std_logic;\r
+                 FIFO_DATA_OUT         : out   std_logic_vector(26 downto 0); -- [21] -> [31], [20:0] -> [20:0]\r
+                 WE_OUT                        : out   std_logic;\r
+                 COUNT_OUT                     : out   std_logic_vector(9 downto 0);\r
+                 ANYDATA_OUT           : out   std_logic; -- this FIFO needs attention during readout\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+----------------------------------------------------------------------\r
+-- LIMITATION: 4 frames with 128 channels each => 512\r
+--             + debug words <= 1023!!!!\r
+----------------------------------------------------------------------\r
+\r
+architecture behavioral of apv_pc_nc_alu is\r
+\r
+       -- normal signals\r
+       signal raw_data_q                       : std_logic_vector(12 downto 0); -- input register\r
+       signal ped_data_q                       : std_logic_vector(12 downto 0); -- input register\r
+       signal ped_corr_data_q          : std_logic_vector(12 downto 0); -- registered pedestal corrected value\r
+       signal ped_corr_data_qq         : std_logic_vector(12 downto 0); -- registered pedestal corrected value\r
+       signal ped_corr_data_qqq        : std_logic_vector(12 downto 0); -- registered pedestal corrected value\r
+       signal loc_baseline_q           : std_logic_vector(13 downto 0);\r
+       signal nc_corr_data_q           : std_logic_vector(13 downto 0);\r
+       signal nc_corr_data_qq          : std_logic_vector(13 downto 0);\r
+       signal nc_corr_data_qqq         : std_logic_vector(21 downto 0);\r
+       signal thr_data_q                       : std_logic_vector(13 downto 0);\r
+       signal udf_int                          : std_logic_vector(6 downto 0);\r
+       signal ovf_int                          : std_logic_vector(6 downto 0); \r
+       signal frame_int                        : std_logic_vector(6 downto 0);\r
+       signal off_int                          : std_logic_vector(6 downto 0);\r
+       signal next_data_we                     : std_logic;\r
+       signal data_we                          : std_logic;\r
+\r
+       signal thr_pass                         : std_logic;\r
+\r
+       -- data steering signals\r
+       signal next_ped_off                     : std_logic;\r
+       signal ped_off                          : std_logic; -- switch off pedestals\r
+       signal next_lcb_off                     : std_logic;\r
+       signal lcb_off                          : std_logic; -- switch off local baseline correction\r
+       signal next_clip_max            : std_logic;\r
+       signal clip_max                         : std_logic; -- clip OVF values to maximum \r
+       signal next_clip_min            : std_logic;\r
+       signal clip_min                         : std_logic; -- clip UDF values to minimum\r
+       signal next_bad_corr            : std_logic_vector(6 downto 2);\r
+       signal bad_corr                         : std_logic_vector(6 downto 2);\r
+       signal toggle                           : std_logic_vector(6 downto 0);\r
+       \r
+       -- Channel counter\r
+       signal channel                          : std_logic_vector(6 downto 0);\r
+\r
+       signal count                            : std_logic_vector(9 downto 0);\r
+\r
+       signal anydata                          : std_logic;\r
+\r
+       -- Debug signals\r
+       signal debug                            : std_logic_vector(15 downto 0);\r
+               \r
+begin\r
+\r
+---------------------------------------------------------------------------------\r
+-- Data steering signals: they decide, which stages of the calculation are taken.\r
+--\r
+-- evt_type     mnemonic     channels actions\r
+-- 000          RAW128          128   raw data (+ 4096 + 8192)\r
+-- 001          PED128          128   pedestal data (+ 4096 - pedestal)\r
+-- 010          PED128THR     <=128   pedestal data above threshold\r
+-- 011          ---             ---   ---\r
+-- 100          NC64PED64       128   do NC on physic channels, corr. channels pedestal corrected\r
+-- 101          NC64             64   only NC physic channels\r
+-- 110          NC64GOOD       <=64   only good NC channels\r
+-- 111          NC64THR        <=64   only good NC channels above threshold\r
+---------------------------------------------------------------------------------\r
+\r
+-- Switch off pedestals (RAW128 mode)\r
+next_ped_off  <= '1' when ( evt_type_in = "000" ) else '0';\r
+\r
+-- Switch off local baseline (RAW128, PED128, PED128THR modes)\r
+next_lcb_off  <= '1' when ( (evt_type_in = "000") or (evt_type_in = "001") or (evt_type_in = "010") ) else '0';\r
+\r
+-- Clipping function for neighbour corrected values (all modes except RAW128)\r
+next_clip_min <= '1' when ( ((evt_type_in = "001") or (evt_type_in = "010") or (evt_type_in = "011") or \r
+                                                        (evt_type_in(2) = '1') ) and (udf_int(2) = '1') ) \r
+                                        else '0';\r
+next_clip_max <= '1' when ( ((evt_type_in = "001") or (evt_type_in = "010") or (evt_type_in = "011") or \r
+                                                        (evt_type_in(2) = '1') ) and (ovf_int(2) = '1') ) \r
+                                        else '0';\r
+\r
+-- Neighbour correction: handle broken or switched off correction channels.\r
+-- A broken (UDF/OVF) or switched off (OFF) correction channel kills its two physical neighbour channels.\r
+next_bad_corr(2) <= '1' when ( (udf_int(0) = '1') or (udf_int(2) = '1') or\r
+                                                          (ovf_int(0) = '1') or (ovf_int(2) = '1') or\r
+                                                          (off_int(0) = '1') or (off_int(2) = '1') ) \r
+                                       else '0';\r
+\r
+next_bad_corr(3) <= '1' when ( (bad_corr(2) = '1') and (evt_type_in(2) = '1') ) else '0';\r
+\r
+next_bad_corr(4) <= '1' when ( ((bad_corr(3) = '1') and (toggle(3) = '1') and (frame_int(3) = '1')) or \r
+                                                      (off_int(3) = '1') ) \r
+                                           else '0';\r
+next_bad_corr(5) <= bad_corr(4);\r
+next_bad_corr(6) <= bad_corr(5);\r
+\r
+-- We carry the OVF/UDF/OFF information all through the chain!\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               ped_off               <= next_ped_off;\r
+               lcb_off               <= next_lcb_off;\r
+               clip_min              <= next_clip_min;\r
+               clip_max              <= next_clip_max;\r
+               bad_corr(6 downto 2)  <= next_bad_corr(6 downto 2); -- combinatorial feed\r
+               toggle(6 downto 0)    <= toggle(5 downto 0)    & raw_addr_in(0);\r
+               udf_int(6 downto 0)   <= udf_int(5 downto 0)   & raw_data_in(12);\r
+               ovf_int(6 downto 0)   <= ovf_int(5 downto 0)   & raw_data_in(13);\r
+               frame_int(6 downto 0) <= frame_int(5 downto 0) & frame_in;\r
+               off_int(6 downto 0)   <= off_int(5 downto 0)   & ped_data_in(16);\r
+               data_we               <= next_data_we;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- Input register, add 4096 to raw ADC values\r
+THE_RAW_INPUT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               raw_data_q <= '1' & raw_data_in(11 downto 0); \r
+       end if;\r
+end process THE_RAW_INPUT_PROC;\r
+\r
+-- Input register, either pipe in the pedestal value, or set it to zero\r
+THE_PED_INPUT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (ped_off = '1') ) then\r
+                       ped_data_q <= (others => '0');\r
+               else\r
+                       ped_data_q <= '0' & ped_data_in(11 downto 0); \r
+               end if;\r
+       end if;\r
+end process THE_PED_INPUT_PROC;\r
+\r
+-- Pedestal correction, store PC value, shift it for NC\r
+THE_PED_CORR_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               ped_corr_data_q <= raw_data_q - ped_data_q;\r
+       end if;\r
+end process THE_PED_CORR_STORE_PROC;\r
+\r
+-- Delay the pedestal corrected values by two clock cycles\r
+THE_PED_CORR_DELAY_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               ped_corr_data_qqq <= ped_corr_data_qq;\r
+               ped_corr_data_qq  <= ped_corr_data_q;\r
+       end if;\r
+end process THE_PED_CORR_DELAY_PROC;\r
+\r
+-- Mean value calculation for local baseline correction\r
+THE_MEAN_CALC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (lcb_off = '1') ) then\r
+                       loc_baseline_q <= (others => '0');      \r
+               else\r
+                       loc_baseline_q <= ('0' & ped_corr_data_q) + ('0' & ped_corr_data_qqq);\r
+               end if;\r
+       end if;\r
+end process THE_MEAN_CALC_PROC;\r
+\r
+-- Do the neighbour correction\r
+THE_NC_CORR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (clip_min = '1') ) then\r
+                       nc_corr_data_q <= (others => '0'); -- channel is underflow\r
+               elsif( clip_max = '1' ) then\r
+                       nc_corr_data_q <= (others => '1'); -- channel is overflow\r
+               else\r
+                       nc_corr_data_q <= ('1' & ped_corr_data_qqq) - ('0' & loc_baseline_q(13 downto 1));      \r
+               end if;\r
+       end if;\r
+end process THE_NC_CORR_PROC;\r
+\r
+-- One caveat: in PED128 our artificial baseline is 4096, in NC64THR it is 8192.\r
+thr_data_q(13) <= '1'; --'1' when (evt_type_in = "111") else '0';\r
+thr_data_q(12) <= '0' when (evt_type_in = "111") else '1';\r
+\r
+-- Threshold comparison\r
+THE_THR_COMP: comp14bit\r
+port map( DATAA                => nc_corr_data_q,\r
+                 DATAB         => thr_data_q,\r
+                 CLOCK         => clk_in, \r
+                 CLOCKEN       => '1', \r
+                 ACLR          => reset_in, -- BUG 10092009 \r
+                 AGEB          => thr_pass\r
+               );\r
+\r
+-- Delay NCD by one cycle, store THR data\r
+THE_NC_DELAY_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       nc_corr_data_qqq        <= (others => '0');\r
+                       nc_corr_data_qq         <= (others => '0');\r
+                       thr_data_q(11 downto 0) <= (others => '0');\r
+               else\r
+                       if   ( (do_header_in = '0') and (do_error_in = '0') ) then\r
+                               nc_corr_data_qqq(21)           <= '0'; -- DATA\r
+                               nc_corr_data_qqq(20 downto 14) <= channel;\r
+                               nc_corr_data_qqq(13 downto 0)  <= nc_corr_data_qq;\r
+                       elsif( (do_header_in = '1') ) then \r
+                               nc_corr_data_qqq(21)           <= '1'; -- HEADER\r
+                               nc_corr_data_qqq(20)           <= buf_bad_in;\r
+                               nc_corr_data_qqq(19 downto 16) <= error_in;\r
+                               nc_corr_data_qqq(15 downto 12) <= max_frames_in;\r
+                               nc_corr_data_qqq(11 downto 8)  <= curr_frame_in;\r
+                               nc_corr_data_qqq(7 downto 0)   <= raw_data_in(25 downto 18);\r
+                       elsif( (do_error_in = '1') ) then \r
+                               nc_corr_data_qqq(21)           <= '1'; -- HEADER\r
+                               nc_corr_data_qqq(20)           <= raw_data_in(26); -- error\r
+                               nc_corr_data_qqq(19 downto 16) <= eds_frm_ctr_in; -- EDS start frame\r
+                               nc_corr_data_qqq(15 downto 12) <= loc_frm_ctr_in; -- local frame counter value\r
+                               nc_corr_data_qqq(11 downto 8)  <= raw_data_in(17 downto 14); -- frame counter\r
+                               nc_corr_data_qqq(7 downto 0)   <= raw_data_in(25 downto 18); -- row\r
+                       end if;\r
+                       nc_corr_data_qq         <= nc_corr_data_q;\r
+                       thr_data_q(11 downto 0) <= thr_data_in(11 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_NC_DELAY_PROC;\r
+\r
+-- Judgement day: will data survive?\r
+next_data_we <= '1' when ( ((buf_good_in = '1') and (evt_type_in = "000") and (frame_int(5) = '1')) or \r
+                                                  ((buf_good_in = '1') and (evt_type_in = "001") and (frame_int(5) = '1')) or\r
+                                                  ((buf_good_in = '1') and (evt_type_in = "010") and (frame_int(5) = '1') and (thr_pass = '1') and (bad_corr(5) = '0')) or\r
+                                                  ((buf_good_in = '1') and (evt_type_in = "100") and (frame_int(5) = '1')) or\r
+                                                  ((buf_good_in = '1') and (evt_type_in = "101") and (frame_int(5) = '1') and (toggle(5) = '1')) or\r
+                                                  ((buf_good_in = '1') and (evt_type_in = "110") and (frame_int(5) = '1') and (toggle(5) = '1') and (bad_corr(5) = '0')) or\r
+                                                  ((buf_good_in = '1') and (evt_type_in = "111") and (frame_int(5) = '1') and (toggle(5) = '1') and (bad_corr(5) = '0') and (thr_pass = '1')) or\r
+                                                  (((buf_good_in = '1') or (buf_bad_in = '1')) and (do_header_in = '1')) or\r
+--                                                ((buf_bad_in  = '1') and (do_error_in = '1'))\r
+                                                  ((do_error_in = '1'))\r
+                                                ) \r
+                                       else '0';\r
+\r
+-- Channel counter for outgoing data\r
+THE_CHANNEL_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (start_in = '1') ) then\r
+                       channel <= (others => '0');\r
+               elsif( frame_int(5) = '1' ) then\r
+                       channel <= channel + 1;\r
+               end if;\r
+       end if;\r
+end process THE_CHANNEL_CTR_PROC;\r
+\r
+-- Channel counter for outgoing data\r
+THE_DATA_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (start_in = '1') ) then\r
+                       count   <= (others => '0');\r
+                       anydata <= '0';\r
+               elsif( (data_we = '1') and (anydata = '0') ) then\r
+                       anydata <= '1';\r
+               elsif( (data_we = '1') and (anydata = '1') ) then\r
+                       count   <= count + 1;\r
+               end if;\r
+       end if;\r
+end process THE_DATA_CTR_PROC;\r
+\r
+-- output signals (most of them are only needed for simulation!)\r
+we_out            <= data_we; \r
+count_out         <= count;\r
+anydata_out       <= anydata;\r
+\r
+-- Real FIFO input. We use a 2kx27 FIFO, with only 22bit carrying real information.\r
+-- [26:22] are used for debugging information\r
+-- [21]    will become D[31] in data (flag for data/header)\r
+-- [20:14] gives channel number\r
+-- [13:0]  ADC data\r
+fifo_data_out(26)           <= frame_int(6);\r
+fifo_data_out(25)           <= data_we;\r
+fifo_data_out(24)           <= bad_corr(6);\r
+fifo_data_out(23)           <= ovf_int(6);\r
+fifo_data_out(22)           <= udf_int(6);\r
+fifo_data_out(21 downto 0)  <= nc_corr_data_qqq; \r
+\r
+-- Debug signals\r
+--debug(31 downto 16)  <= (others => '0');\r
+debug(15)            <= thr_pass;\r
+debug(14)            <= '0';\r
+debug(13 downto 0)   <= thr_data_q;\r
+\r
+dbg_out              <= debug;\r
+\r
+end behavioral;\r
+\r
+--THE_NC_DELAY_PROC: process( clk_in )\r
+--begin\r
+--     if( rising_edge(clk_in) ) then\r
+--             if( reset_in = '1' ) then\r
+--                     nc_corr_data_qqq        <= (others => '0');\r
+--                     nc_corr_data_qq         <= (others => '0');\r
+--                     thr_data_q(11 downto 0) <= (others => '0');\r
+--             else\r
+--                     if( (do_header_in = '0') and (do_error_in = '0') ) then\r
+--                             nc_corr_data_qqq(21)           <= '0'; -- DATA\r
+--                             nc_corr_data_qqq(20 downto 14) <= channel;\r
+--                             nc_corr_data_qqq(13 downto 0)  <= nc_corr_data_qq;\r
+--                     else\r
+--                             nc_corr_data_qqq(21)           <= '1'; -- HEADER\r
+--                             nc_corr_data_qqq(20)           <= buf_bad_in;\r
+--                             nc_corr_data_qqq(19 downto 16) <= error_in;\r
+--                             nc_corr_data_qqq(15 downto 12) <= max_frames_in;\r
+--                             nc_corr_data_qqq(11 downto 8)  <= curr_frame_in;\r
+--                             nc_corr_data_qqq(7 downto 0)   <= raw_data_in(25 downto 18);\r
+--                     end if;\r
+--                     nc_corr_data_qq         <= nc_corr_data_q;\r
+--                     thr_data_q(11 downto 0) <= thr_data_in(11 downto 0);\r
+--             end if;\r
+--     end if;\r
+--end process THE_NC_DELAY_PROC;\r
diff --git a/src/apv_raw_buffer.vhd b/src/apv_raw_buffer.vhd
new file mode 100755 (executable)
index 0000000..47d3f24
--- /dev/null
@@ -0,0 +1,394 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- This entity is used to decouple the ADC/APV part (with 40MHz) from the data \r
+-- handling part (which runs with 100MHz).\r
+-- Signals:\r
+-- - all signals starting with ADC_* are synchronous to CLK_APV_IN\r
+-- - all signals starting with BUF_* are synchronous to BUF_CLK_IN\r
+-- - BUF_GOOD_OUT, BUF_BROKEN_OUT and BUF_IGNORE_OUT are to be checked if BUF_LEVEL_OUT[4:0] = 0\r
+-- - otherwise BUF_LEVEL_OUT[4:0] tells you how many frames are in the buffer\r
+-- - take care of the one clock delay between BUF_ADDR_IN and BUF_DATA_OUT.\r
+\r
+entity apv_raw_buffer is\r
+       port( CLK_APV_IN                : in    std_logic; -- write clock from APV handling stage\r
+                 RESET_IN                      : in    std_logic;\r
+                 -- buffer level control signals\r
+                 FRM_REQD_IN           : in    std_logic; -- one data frame has been requested from APV\r
+                 MAX_TRG_NUM_IN        : in    std_logic_vector(3 downto 0); -- maximum number of triggers per event\r
+                 -- CLK_APV_IN sync'ed signals from APV_LOCKER\r
+                 ADC_ANALOG_IN         : in    std_logic; -- write enable for ADC data\r
+                 ADC_START_IN          : in    std_logic; -- data frame detected, block the buffer page\r
+                 ADC_LAST_IN           : in    std_logic; -- last channel signal\r
+                 ADC_CHANNEL_IN        : in    std_logic_vector(6 downto 0); -- physical channel ID\r
+                 ADC_RAW_IN            : in    std_logic_vector(17 downto 0); -- raw ADC data, UDF, OVF, ERROR\r
+                 ADC_STATUS_IN         : in    std_logic_vector(7 downto 0); -- status information for APV\r
+                 ADC_FRAME_IN          : in    std_logic_vector(11 downto 0); -- status information for frame\r
+                 -- BUF_CLK_IN sync'ed signals from back side logic \r
+                 BUF_CLK_IN            : in    std_logic; -- read clock\r
+                 BUF_RESET_IN          : in    std_logic; -- 100MHz reset\r
+                 BUF_START_OUT         : out   std_logic; -- one block starts writing (aka ADC_START)\r
+                 BUF_READY_OUT         : out   std_logic; -- one block has been written (aka ADC_LAST)\r
+                 BUF_ADDR_IN           : in    std_logic_vector(6 downto 0); -- address inside current buffer\r
+                 BUF_DONE_IN           : in    std_logic; -- buffer has been read (discard buffer)\r
+                 BUF_DATA_OUT          : out   std_logic_vector(17 downto 0); -- data from buffer\r
+                 BUF_STATUS_OUT        : out   std_logic_vector(7 downto 0); -- generic APV status output\r
+                 BUF_FRAME_OUT         : out   std_logic_vector(11 downto 0); -- current frame status output\r
+                 BUF_GOOD_OUT          : out   std_logic; -- APV is active and synced -> GOOD situation\r
+                 BUF_BROKEN_OUT        : out   std_logic; -- APV is active, but not synced -> BAD situation\r
+                 BUF_IGNORE_OUT        : out   std_logic; -- APV is switched off -> switched off\r
+                 BUF_LEVEL_OUT         : out   std_logic_vector(4 downto 0); -- number of stored frames inside buffer\r
+                 BUF_TICKMARK_OUT      : out   std_logic; -- tickmark signal for timeouts in the EDS handler+\r
+                 BUF_FULL_OUT          : out   std_logic; -- inhibit any next trigger if set!\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_raw_buffer is\r
+\r
+       -- Placer Directives\r
+       attribute HGROUP : string;\r
+       -- for whole architecture\r
+       attribute HGROUP of behavioral : architecture  is "APV_RAW_BUF_group";\r
+\r
+       -- normal signals\r
+       signal adc_status_q             : std_logic_vector(7 downto 0);\r
+       signal adc_status_qq    : std_logic_vector(7 downto 0);\r
+\r
+       signal adc_start_x              : std_logic;\r
+       signal adc_start                : std_logic;\r
+       signal adc_last_x               : std_logic;\r
+       signal adc_last                 : std_logic;\r
+\r
+       signal ce_wr_pointer    : std_logic;\r
+       signal wr_pointer               : std_logic_vector(3 downto 0);\r
+       signal ce_rd_pointer    : std_logic;\r
+       signal rd_pointer               : std_logic_vector(3 downto 0);\r
+       \r
+       signal buf_good_x               : std_logic;\r
+       signal buf_good                 : std_logic;\r
+       signal buf_broken_x             : std_logic;\r
+       signal buf_broken               : std_logic;\r
+       signal buf_ignore_x             : std_logic;\r
+       signal buf_ignore               : std_logic;\r
+       \r
+       signal buf_level                : std_logic_vector(4 downto 0);\r
+       signal buf_level_up_x   : std_logic;\r
+       signal buf_level_down_x : std_logic;\r
+       \r
+       signal wr_data_addr             : std_logic_vector(10 downto 0);\r
+       signal wr_data_d                : std_logic_vector(17 downto 0);\r
+       signal wr_data_ena              : std_logic;\r
+       signal rd_data_addr             : std_logic_vector(10 downto 0);\r
+       signal rd_data_d                : std_logic_vector(17 downto 0);\r
+       signal rd_data_ena              : std_logic;\r
+\r
+       signal buf_frame                : std_logic_vector(11 downto 0);\r
+       \r
+       signal adc_tickmark             : std_logic;\r
+       signal buf_tickmark             : std_logic;\r
+\r
+       -- Alias names for status bits\r
+       signal apv_on_x                 : std_logic; -- 40MHz clock domain signal\r
+       signal apv_on                   : std_logic;\r
+       signal apv_adcok_x              : std_logic; -- 40MHz clock domain signal\r
+       signal apv_adcok                : std_logic;\r
+       signal apv_locked_x             : std_logic; -- 40MHz clock domain signal\r
+       signal apv_locked               : std_logic;\r
+\r
+       -- from old APV_BUFHANDLER block\r
+       signal apv_free_ctr                     : std_logic_vector(4 downto 0);\r
+       signal apv_free_up                      : std_logic;\r
+       signal apv_free_down            : std_logic;\r
+       signal buf_free_ctr                     : std_logic_vector(4 downto 0);\r
+       signal buf_free_up                      : std_logic;\r
+       signal buf_free_down            : std_logic;\r
+       \r
+       signal sum_apv_buf                      : std_logic_vector(5 downto 0);\r
+       signal sum_apv                          : std_logic_vector(5 downto 0);\r
+       signal sum_buf                          : std_logic_vector(5 downto 0);\r
+       signal trg_limit                        : std_logic_vector(5 downto 0);\r
+       \r
+       signal debug                            : std_logic_vector(15 downto 0);\r
+       \r
+       signal apv_or_buf_full_x        : std_logic;\r
+       signal apv_or_buf_full          : std_logic;\r
+       \r
+begin\r
+\r
+-- Debugging signals\r
+debug <= (others => '0');\r
+\r
+-- Aliasing of status bits from APV_LOCKER (40MHz domain)\r
+apv_adcok_x  <= not adc_status_in(7); -- '0' = good ADC, '1' = bad ADC\r
+apv_locked_x <= adc_status_in(5);     -- '0' = not locked, '1' = locked\r
+apv_on_x     <= not adc_status_in(1); -- '0' = "off" means "ignore", '1' = "on" means "look at me"\r
+\r
+THE_APV_ON_SYNC: state_sync\r
+port map( STATE_A_IN           => apv_on_x,\r
+                 CLK_B_IN                      => buf_clk_in,\r
+                 RESET_B_IN            => buf_reset_in,\r
+                 STATE_B_OUT           => apv_on\r
+               );\r
+\r
+THE_APV_LOCKED_SYNC: state_sync\r
+port map( STATE_A_IN           => apv_locked_x,\r
+                 CLK_B_IN                      => buf_clk_in,\r
+                 RESET_B_IN            => buf_reset_in,\r
+                 STATE_B_OUT           => apv_locked\r
+               );\r
+\r
+THE_APV_ADCOK_SYNC: state_sync\r
+port map( STATE_A_IN           => apv_adcok_x,\r
+                 CLK_B_IN                      => buf_clk_in,\r
+                 RESET_B_IN            => buf_reset_in,\r
+                 STATE_B_OUT           => apv_adcok\r
+               );\r
+\r
+-- We deliver three status signals to the data handler:\r
+-- BUF_GOOD_OUT  : APV is switched on and alive, so data packets can be expected in case of triggers.\r
+--                 Timeouts should be handled on this particular APV.\r
+-- BUF_BROKEN_OUT: APV is switched on and in trouble, so data packets will not come in here.\r
+--                 The data handler must take care of this situation.\r
+--                 Data frames already stored in the buffer may still be read out until LVL[4:0] = 0.\r
+-- BUF_IGNORE_OUT: APV is switched off, no matter if it is attached or nor, we don't accept any data frames\r
+--                 here.\r
+\r
+-- CLOCK DOMAINS!\r
+buf_good_x   <= '1' when ((apv_on = '1') and (apv_adcok = '1') and (apv_locked = '1')) else '0';\r
+buf_broken_x <= '1' when ((apv_on = '1') and (apv_adcok = '0'  or   apv_locked = '0')) else '0'; \r
+buf_ignore_x <= '1' when ( apv_on = '0' ) else '0';\r
+\r
+THE_BUF_SYNCER_PROC: process( buf_clk_in ) \r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               buf_good      <= buf_good_x;\r
+               buf_broken    <= buf_broken_x;\r
+               buf_ignore    <= buf_ignore_x;\r
+               -- not nicely done!!!\r
+               adc_status_qq <= adc_status_q;\r
+               adc_status_q  <= adc_status_in; -- BUG: just a quick hack\r
+       end if;\r
+end process THE_BUF_SYNCER_PROC;\r
+\r
+-- Transfer both start and stop signals to the other clock domain\r
+adc_start_x <= (adc_start_in and buf_good_x);\r
+\r
+THE_ADC_START_SYNCER: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_in,\r
+                 PULSE_A_IN    => adc_start_x,\r
+                 CLK_B_IN              => buf_clk_in,\r
+                 RESET_B_IN    => buf_reset_in,\r
+                 PULSE_B_OUT   => adc_start\r
+               );\r
+\r
+adc_last_x <= (adc_last_in and buf_good_x);\r
+\r
+THE_ADC_LAST_SYNCER: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_in,\r
+                 PULSE_A_IN    => adc_last_x,\r
+                 CLK_B_IN              => buf_clk_in,\r
+                 RESET_B_IN    => buf_reset_in,\r
+                 PULSE_B_OUT   => adc_last\r
+               );\r
+\r
+-- The tickmark signal is also transfered from 40M to 100M clock domain\r
+adc_tickmark <= adc_status_in(0); -- alias\r
+THE_TICKMARK_SYNCER: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_in,\r
+                 PULSE_A_IN    => adc_tickmark,\r
+                 CLK_B_IN              => buf_clk_in,\r
+                 RESET_B_IN    => buf_reset_in,\r
+                 PULSE_B_OUT   => buf_tickmark\r
+               );\r
+\r
+\r
+-- Control signals for the write pointer counter\r
+ce_wr_pointer <= adc_last_x;\r
+\r
+-- Write pointer counter\r
+THE_WR_POINTER: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       wr_pointer <= (others => '0');\r
+               elsif( ce_wr_pointer = '1' ) then\r
+                       wr_pointer <= wr_pointer + 1;\r
+               end if;\r
+       end if;\r
+end process THE_WR_POINTER;\r
+\r
+-- Control signals for the read pointer counter\r
+ce_rd_pointer <= buf_done_in and apv_on;\r
+\r
+-- Read pointer counter\r
+THE_RD_POINTER: process( buf_clk_in )\r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               if   ( buf_reset_in = '1' ) then\r
+                       rd_pointer <= (others => '0');\r
+               elsif( ce_rd_pointer = '1' ) then\r
+                       rd_pointer <= rd_pointer + 1;\r
+               end if;\r
+       end if;\r
+end process THE_RD_POINTER;\r
+\r
+-- We need a level counter for the EDS handler, anyhow\r
+buf_level_up_x   <= adc_last; \r
+buf_level_down_x <= (buf_done_in and buf_good);\r
+\r
+THE_BUF_LEVEL_COUNTER_PROC: process( buf_clk_in )\r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               if   ( buf_reset_in = '1' ) then\r
+                       buf_level <= (others => '0');\r
+               elsif( (buf_level_up_x = '1') and (buf_level_down_x = '0') ) then\r
+                       buf_level <= buf_level + 1;\r
+               elsif( (buf_level_up_x = '0') and (buf_level_down_x = '1') ) then\r
+                       buf_level <= buf_level - 1;\r
+               end if;\r
+       end if;\r
+end process THE_BUF_LEVEL_COUNTER_PROC;\r
+\r
+-- Control signals for the data EBRs\r
+wr_data_ena   <= adc_analog_in;\r
+rd_data_ena   <= '1';\r
+wr_data_addr  <= wr_pointer & adc_channel_in;\r
+rd_data_addr  <= rd_pointer & buf_addr_in;\r
+wr_data_d     <= adc_raw_in;\r
+\r
+-- We have two EBRs to implement a 2kx18 ring buffer\r
+THE_INPUT_BRAM: input_bram\r
+port map( WRADDRESS => wr_data_addr,\r
+                 RDADDRESS     => rd_data_addr,\r
+                 DATA => wr_data_d, \r
+                 WE => wr_data_ena,\r
+                 RDCLOCK => buf_clk_in,\r
+                 RDCLOCKEN => rd_data_ena,\r
+                 RESET => reset_in,\r
+                 WRCLOCK => clk_apv_in,\r
+                 WRCLOCKEN     => '1',\r
+                 Q => rd_data_d\r
+               );\r
+\r
+-- We use a LUT based DPRAM for the 16x12b status memory\r
+THE_FRAME_STATUS_MEM: frame_status_mem\r
+port map( WRADDRESS    => wr_pointer, \r
+                 DATA          => adc_frame_in,\r
+                 WRCLOCK       => clk_apv_in,\r
+                 WE            => ce_wr_pointer, -- we store the frame status with the last ADC word\r
+                 WRCLOCKEN     => '1',\r
+                 RDADDRESS     => rd_pointer,\r
+                 RDCLOCK       => buf_clk_in,\r
+                 RDCLOCKEN     => '1',\r
+                 RESET         => reset_in,\r
+                 Q                     => buf_frame\r
+               );\r
+\r
+------------------------------------------------------------------------------------------\r
+-- Buffer fill levels, busy generation\r
+------------------------------------------------------------------------------------------\r
+\r
+-- We need to keep track of the APV analog fifo fill level.\r
+-- Two signals are used: \r
+-- - an early "FRAME_REQD" to decrement to number of free entries,\r
+-- - a late "FRAME_RCVD" to notify that a requested frame has been transfered \r
+--   from APV to the raw buffer.\r
+\r
+apv_free_down <= frm_reqd_in;\r
+apv_free_up   <= adc_last;    \r
+\r
+THE_APV_FREE_COUNTER_PROC: process( buf_clk_in )\r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               if   ( buf_reset_in = '1' ) then\r
+                       apv_free_ctr <= "10000";\r
+               elsif( apv_free_down = '1' and apv_free_up = '0' ) then\r
+                       apv_free_ctr <= apv_free_ctr - 1; \r
+               elsif( apv_free_down = '0' and apv_free_up = '1' ) then\r
+                       apv_free_ctr <= apv_free_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_APV_FREE_COUNTER_PROC;\r
+\r
+-- The raw data buffer is also to be watched carefully. \r
+-- An early signal reserved on raw buffer page, while a late one releases one\r
+-- page to the buffer pool again.\r
+\r
+buf_free_down <= adc_start;\r
+buf_free_up   <= buf_done_in;\r
+\r
+THE_BUF_FREE_COUNTER_PROC: process( buf_clk_in )\r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               if   ( buf_reset_in = '1' ) then\r
+                       buf_free_ctr <= "10000";\r
+               elsif( buf_free_down = '1' and buf_free_up = '0' ) then\r
+                       buf_free_ctr <= buf_free_ctr - 1; \r
+               elsif( buf_free_down = '0' and buf_free_up = '1' ) then\r
+                       buf_free_ctr <= buf_free_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_BUF_FREE_COUNTER_PROC;\r
+\r
+-- We need to sum up and check if there is always enough space in the buffers\r
+-- (both APV and RAW_BUF) to store one full sized event, as given by MAX_TRG_NUM_IN.\r
+\r
+sum_apv <= '0' & apv_free_ctr;\r
+sum_buf <= '0' & buf_free_ctr;\r
+\r
+-- Balance the frames requested from APV and already present in raw buffers\r
+THE_APV_BUF_ADDER: adder_6bit\r
+port map( DATAA   => sum_apv,\r
+                 DATAB   => sum_buf,\r
+                 CLOCK   => buf_clk_in,\r
+                 RESET   => buf_reset_in, \r
+                 CLOCKEN => '1', \r
+                 RESULT  => sum_apv_buf\r
+                );\r
+\r
+-- We have a minimum number of buffer pages to keep:\r
+-- this construct makes 16 + (max_trg_num)\r
+trg_limit <= "01" & max_trg_num_in;\r
+\r
+apv_or_buf_full_x <= '1' when (sum_apv_buf < trg_limit) else '0';\r
+\r
+THE_SYNC_PROC: process( buf_clk_in )\r
+begin\r
+       if( rising_edge(buf_clk_in) ) then\r
+               apv_or_buf_full <= apv_or_buf_full_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+------------------------------------------------------------------------------------------\r
+------------------------------------------------------------------------------------------\r
+\r
+\r
+-- Output signals\r
+buf_data_out     <= rd_data_d;\r
+buf_start_out    <= adc_start;\r
+buf_ready_out    <= adc_last;\r
+buf_status_out   <= adc_status_qq;\r
+buf_frame_out    <= buf_frame;\r
+\r
+buf_good_out     <= buf_good;\r
+buf_broken_out   <= buf_broken;\r
+buf_ignore_out   <= buf_ignore;\r
+buf_level_out    <= buf_level;\r
+buf_full_out     <= apv_or_buf_full;\r
+\r
+buf_tickmark_out <= buf_tickmark;\r
+\r
+-- Debug signals\r
+debug_out        <= debug;\r
+\r
+end behavioral;\r
+\r
diff --git a/src/apv_sync_handler.vhd b/src/apv_sync_handler.vhd
new file mode 100644 (file)
index 0000000..5360675
--- /dev/null
@@ -0,0 +1,148 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity apv_sync_handler is\r
+       port( CLK_APV_IN                : in    std_logic; -- 40MHz phase shifted clock\r
+                 RESET_APV_IN          : in    std_logic; -- synced reset signal (40MHz APV)\r
+                 CLK_IN                        : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; \r
+                 APV_TRGSTART_IN       : in    std_logic; -- start signal for one sequence\r
+                 APV_TRGSEL_IN         : in    std_logic; -- select signal for one sequence\r
+                 APV_TRGDONE_OUT       : out   std_logic; -- APV trigger statemachine finished (100MHz)\r
+                 APV_TRG_OUT           : out   std_logic; -- TRG line signal (40MHz APV)\r
+                 APV_SYNC_OUT          : out   std_logic; -- signal for statemachines (40MHz APV)\r
+                 BSM_OUT                       : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_sync_handler is\r
+\r
+       -- state machine signals\r
+       type STATES is (SLEEP,START,T2,T1,T0,DLY0,DLY1,DLY2,DLY3,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- normal signals\r
+       signal apv_trgdone                      : std_logic;\r
+       signal apv_trgstart                     : std_logic;\r
+       signal comb_apv_trgstart        : std_logic;\r
+       -- state machine generated signals\r
+       signal next_apv_done            : std_logic;\r
+       signal apv_done                         : std_logic;\r
+       signal next_apv_trg                     : std_logic;\r
+       signal apv_trg                          : std_logic;\r
+       signal next_apv_sync            : std_logic;\r
+       signal apv_sync                         : std_logic;\r
+\r
+\r
+begin\r
+\r
+-- APV_TRGSTART_IN crosses a clock domain (100M -> 40M).\r
+comb_apv_trgstart <= apv_trgstart_in and apv_trgsel_in; \r
+\r
+THE_APVTRGSTART_SYNC: pulse_sync\r
+port map( CLK_A_IN             => clk_in,\r
+                 RESET_A_IN    => reset_in,\r
+                 PULSE_A_IN    => comb_apv_trgstart,\r
+                 CLK_B_IN              => clk_apv_in,\r
+                 RESET_B_IN    => reset_apv_in,\r
+                 PULSE_B_OUT   => apv_trgstart\r
+               );\r
+\r
+-- A statemachine handles all actions for creating the trigger sequence\r
+-- state registers\r
+STATE_MEM: process( clk_apv_in ) \r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_apv_in = '1' ) then\r
+                       CURRENT_STATE  <= SLEEP;\r
+                       apv_done       <= '0';\r
+                       apv_trg        <= '0';\r
+                       apv_sync       <= '0';\r
+               else\r
+                       CURRENT_STATE  <= NEXT_STATE;\r
+                       apv_done       <= next_apv_done;\r
+                       apv_trg        <= next_apv_trg;\r
+                       apv_sync       <= next_apv_sync;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, apv_trgstart )\r
+begin\r
+       NEXT_STATE     <= SLEEP; -- avoid latches\r
+       next_apv_done  <= '0';\r
+       next_apv_trg   <= '0';\r
+       next_apv_sync  <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( apv_trgstart = '1' ) then\r
+                                                       NEXT_STATE <= START;\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               end if;\r
+               when START      =>      NEXT_STATE    <= T2;\r
+                                               next_apv_trg  <= '1';\r
+               when T2         =>      NEXT_STATE    <= T1;\r
+               when T1         =>      NEXT_STATE    <= T0;\r
+                                               next_apv_trg  <= '1';\r
+               when T0         =>      NEXT_STATE    <= DLY0;\r
+                                               next_apv_sync <= '1';\r
+               when DLY0       =>      NEXT_STATE    <= DLY1;\r
+                                               next_apv_sync <= '1';\r
+               when DLY1       =>      NEXT_STATE    <= DLY2;\r
+                                               next_apv_sync <= '1';\r
+               when DLY2       =>      NEXT_STATE    <= DLY3;\r
+                                               next_apv_sync <= '1';\r
+               when DLY3       =>      NEXT_STATE    <= DONE;\r
+                                               next_apv_done <= '1';\r
+                                               next_apv_sync <= '1';\r
+               when DONE       =>      NEXT_STATE <= SLEEP;\r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_out <= x"0";\r
+               when START      =>      bsm_out <= x"1";\r
+               when T2         =>      bsm_out <= x"2";\r
+               when T1         =>      bsm_out <= x"3";\r
+               when T0         =>      bsm_out <= x"4";\r
+               when DLY0       =>      bsm_out <= x"5";\r
+               when DLY1       =>      bsm_out <= x"6";\r
+               when DLY2       =>      bsm_out <= x"7";\r
+               when DLY3       =>      bsm_out <= x"8";\r
+               when DONE       =>      bsm_out <= x"9";\r
+               when others     =>      bsm_out <= x"f";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+-- APV_TRGDONE_OUT crosses a clock domain (40M -> 100M).\r
+THE_APVTRGDONE_SYNC: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_apv_in,\r
+                 PULSE_A_IN    => apv_done,\r
+                 CLK_B_IN              => clk_in,\r
+                 RESET_B_IN    => reset_in,\r
+                 PULSE_B_OUT   => apv_trgdone\r
+               );\r
+\r
+-- output signals\r
+apv_trgdone_out <= apv_trgdone;\r
+apv_trg_out     <= apv_trg;\r
+apv_sync_out    <= apv_sync;\r
+\r
+debug_out(15 downto 0)  <= (others => '0');    \r
+\r
+end behavioral;\r
+\r
+\r
+\r
diff --git a/src/apv_trg_handler.vhd b/src/apv_trg_handler.vhd
new file mode 100644 (file)
index 0000000..af130f0
--- /dev/null
@@ -0,0 +1,232 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity apv_trg_handler is\r
+       port( CLK_APV_IN                : in    std_logic; -- 40MHz phase shifted clock\r
+                 RESET_APV_IN          : in    std_logic; -- synced reset signal (40MHz APV)\r
+                 CLK_IN                        : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; -- synced reset signal (100MHz master clock)\r
+                 APV_TRGSTART_IN       : in    std_logic; -- start signal for one sequence\r
+                 APV_TRGSEL_IN         : in    std_logic; -- select signal for one sequence\r
+                 APV_TRG_TODO_IN       : in    std_logic_vector(3 downto 0); -- number of APV triggers\r
+                 APV_TRG_DELAY_IN      : in    std_logic_vector(3 downto 0); -- delay between APV triggers\r
+                 APV_TRGDONE_OUT       : out   std_logic; -- APV trigger statemachine finished\r
+                 APV_TRG_OUT           : out   std_logic;\r
+                 APV_TRGSENT_OUT       : out   std_logic;\r
+                 BSM_OUT                       : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_trg_handler is\r
+\r
+       -- state machine signals\r
+       type STATES is (SLEEP,START,T2,T1,T0,DEL,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- normal signals\r
+       signal apv_trgstart                     : std_logic;\r
+       signal next_apv_trgstart        : std_logic;\r
+       signal todo_ctr                         : std_logic_vector(3 downto 0);\r
+       signal comb_todo_done           : std_logic;\r
+       signal delay_ctr                        : std_logic_vector(3 downto 0);\r
+       signal comb_delay_done          : std_logic;\r
+       signal apv_trgsent                      : std_logic;\r
+       signal apv_trgdone                      : std_logic;\r
+\r
+       -- State machine generates signals\r
+       signal next_todo_ctr_ce         : std_logic;\r
+       signal todo_ctr_ce                      : std_logic;\r
+       signal next_delay_ctr_ce        : std_logic;\r
+       signal delay_ctr_ce                     : std_logic;\r
+       signal next_delay_ctr_ld        : std_logic;\r
+       signal delay_ctr_ld                     : std_logic;\r
+       signal next_apv_done            : std_logic;\r
+       signal apv_done                         : std_logic;\r
+       signal next_apv_trgcnt          : std_logic;\r
+       signal apv_trgcnt                       : std_logic;\r
+       signal next_apv_trg                     : std_logic;\r
+       signal apv_trg                          : std_logic;\r
+\r
+begin\r
+\r
+-- APV_TRGSTART_IN crosses a clock domain (100M -> 40M).\r
+next_apv_trgstart <= apv_trgstart_in and apv_trgsel_in; \r
+\r
+THE_APVTRGSTART_SYNC: pulse_sync\r
+port map( CLK_A_IN             => clk_in,\r
+                 RESET_A_IN    => reset_in,\r
+                 PULSE_A_IN    => next_apv_trgstart,\r
+                 CLK_B_IN              => clk_apv_in,\r
+                 RESET_B_IN    => reset_apv_in,\r
+                 PULSE_B_OUT   => apv_trgstart\r
+               );\r
+\r
+-- A statemachine handles all actions for creating the trigger sequence (40MHz domain)\r
+-- state registers\r
+STATE_MEM: process( clk_apv_in ) \r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if( reset_apv_in = '1' ) then\r
+                       CURRENT_STATE  <= SLEEP;\r
+                       todo_ctr_ce        <= '0';\r
+                       delay_ctr_ce   <= '0';\r
+                       delay_ctr_ld   <= '0';\r
+                       apv_done       <= '0';\r
+                       apv_trgcnt     <= '0';\r
+                       apv_trg        <= '0';\r
+               else\r
+                       CURRENT_STATE  <= NEXT_STATE;\r
+                       todo_ctr_ce    <= next_todo_ctr_ce;\r
+                       delay_ctr_ce   <= next_delay_ctr_ce;\r
+                       delay_ctr_ld   <= next_delay_ctr_ld;\r
+                       apv_done       <= next_apv_done;\r
+                       apv_trgcnt     <= next_apv_trgcnt;\r
+                       apv_trg        <= next_apv_trg;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, apv_trgstart, comb_todo_done, comb_delay_done )\r
+begin\r
+       NEXT_STATE        <= SLEEP; -- avoid latches\r
+       next_todo_ctr_ce  <= '0';\r
+       next_delay_ctr_ce <= '0';\r
+       next_delay_ctr_ld <= '0';\r
+       next_apv_done     <= '0';\r
+       next_apv_trg      <= '0';\r
+       next_apv_trgcnt   <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( apv_trgstart = '1' ) then\r
+                                                       NEXT_STATE <= START;\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               end if;\r
+               when START      =>      if( comb_todo_done = '1' ) then\r
+                                                       NEXT_STATE    <= DONE;\r
+                                                       next_apv_done <= '1';\r
+                                               else\r
+                                                       NEXT_STATE        <= T2;\r
+                                                       next_delay_ctr_ld <= '1';\r
+                                                       next_apv_trg      <= '1';\r
+                                               end if;\r
+               when T2         =>      NEXT_STATE       <= T1;\r
+                                               next_todo_ctr_ce <= '1';\r
+                                               next_apv_trgcnt  <= '1';\r
+               when T1         =>      NEXT_STATE        <= T0;\r
+                                               next_delay_ctr_ce <= '1';\r
+               when T0         =>      if   ( (comb_todo_done = '1') ) then\r
+                                                       NEXT_STATE    <= DONE;\r
+                                                       next_apv_done <= '1';\r
+                                               elsif( (comb_todo_done = '0') and (comb_delay_done = '0') ) then\r
+                                                       NEXT_STATE        <= DEL;\r
+                                                       next_delay_ctr_ce <= '1';\r
+                                               elsif( (comb_todo_done = '0') and (comb_delay_done = '1') ) then\r
+                                                       NEXT_STATE        <= T2;\r
+                                                       next_delay_ctr_ld <= '1';\r
+                                                       next_apv_trg      <= '1';\r
+                                               end if;\r
+               when DEL        =>      if( comb_delay_done = '1' ) then\r
+                                                       NEXT_STATE        <= T2;\r
+                                                       next_delay_ctr_ld <= '1';\r
+                                                       next_apv_trg      <= '1';\r
+                                               else\r
+                                                       NEXT_STATE        <= DEL;\r
+                                                       next_delay_ctr_ce <= '1';\r
+                                               end if;\r
+               when DONE       =>      NEXT_STATE <= SLEEP;\r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_out <= x"0";\r
+               when START      =>      bsm_out <= x"1";\r
+               when T2         =>      bsm_out <= x"2";\r
+               when T1         =>      bsm_out <= x"3";\r
+               when T0         =>      bsm_out <= x"4";\r
+               when DEL        =>      bsm_out <= x"5";\r
+               when DONE       =>      bsm_out <= x"6";\r
+               when others     =>      bsm_out <= x"f";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+-- ToDo counter\r
+THE_TODO_CTR_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_apv_in = '1' ) then\r
+                       todo_ctr <= (others => '0');\r
+               elsif( apv_trgstart = '1' ) then\r
+                       todo_ctr <= apv_trg_todo_in;\r
+               elsif( todo_ctr_ce = '1' ) then\r
+                       todo_ctr <= todo_ctr - 1;\r
+               end if;\r
+       end if;\r
+end process THE_TODO_CTR_PROC;\r
+comb_todo_done <= '1' when (todo_ctr = x"0") else '0';\r
+\r
+-- Delay counter\r
+THE_DELAY_CTR_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               if   ( reset_apv_in = '1' ) then\r
+                       delay_ctr <= (others => '0');\r
+               elsif( delay_ctr_ld = '1' ) then\r
+                       delay_ctr <= apv_trg_delay_in;\r
+               elsif( delay_ctr_ce = '1' ) then\r
+                       delay_ctr <= delay_ctr - 1;\r
+               end if;\r
+       end if;\r
+end process THE_DELAY_CTR_PROC;\r
+comb_delay_done <= '1' when (delay_ctr = x"0") else '0';\r
+\r
+-- APV_TRGSENT_OUT crosses a clock domain (40M -> 100M).\r
+THE_APVTRGSENT_SYNC: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_apv_in, \r
+                 PULSE_A_IN    => apv_trgcnt,\r
+                 CLK_B_IN              => clk_in,\r
+                 RESET_B_IN    => reset_in,\r
+                 PULSE_B_OUT   => apv_trgsent\r
+               );\r
+\r
+-- APV_TRGDONE_OUT crosses a clock domain (40M -> 100M).\r
+THE_APVTRGDONE_SYNC: pulse_sync\r
+port map( CLK_A_IN             => clk_apv_in,\r
+                 RESET_A_IN    => reset_apv_in,\r
+                 PULSE_A_IN    => apv_done,\r
+                 CLK_B_IN              => clk_in,\r
+                 RESET_B_IN    => reset_in,\r
+                 PULSE_B_OUT   => apv_trgdone\r
+               );\r
+\r
+-- output signals\r
+apv_trgdone_out <= apv_trgdone;\r
+apv_trg_out     <= apv_trg;\r
+apv_trgsent_out <= apv_trgsent;\r
+\r
+debug_out(15 downto 12) <= todo_ctr;   \r
+debug_out(11 downto 8)  <= delay_ctr;  \r
+debug_out(7)            <= delay_ctr_ld;\r
+debug_out(6)            <= '0';\r
+debug_out(5)            <= comb_delay_done;\r
+debug_out(4)            <= delay_ctr_ce;\r
+debug_out(3)            <= apv_trgstart;\r
+debug_out(2)            <= '0';\r
+debug_out(1)            <= comb_todo_done;\r
+debug_out(0)            <= todo_ctr_ce;\r
+\r
+end behavioral;\r
+\r
+\r
+\r
diff --git a/src/apv_trgctrl.vhd b/src/apv_trgctrl.vhd
new file mode 100644 (file)
index 0000000..8b43a32
--- /dev/null
@@ -0,0 +1,382 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity apv_trgctrl is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; -- 100MHz clock domain reset\r
+                 CLK_APV_IN                    : in    std_logic; -- 40MHz phase shifted clock\r
+                 -- Triggers\r
+                 SYNC_TRG_IN                   : in    std_logic; -- 100MHz signal to SYNC APVs\r
+                 TIME_TRG_IN                   : in    std_logic_vector(3 downto 0); -- timing trigger inputs\r
+                 TRB_TRG_IN                    : in    std_logic_vector(3 downto 0); -- TRB trigger inputs\r
+                 STILL_BUSY_IN                 : in    std_logic; -- set to '1' if any buffer is in danger of overflow\r
+                 TRG_FOUND_OUT                 : out   std_logic; \r
+                 -- slow control settings\r
+                 TRG_MAX_OUT                   : out   std_logic_vector(3 downto 0); -- maximum number of triggers/event\r
+                 TRG_3_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 3\r
+                 TRG_3_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_2_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 2\r
+                 TRG_2_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_1_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 1\r
+                 TRG_1_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_0_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 0\r
+                 TRG_0_DELAY_IN                : in    std_logic_vector(3 downto 0); -- delay between triggers\r
+                 TRG_SETUP_IN                  : in    std_logic_vector(7 downto 0); -- setup of external triggers\r
+                 -- TRB LVL1 signals\r
+                 TRB_TTAG_IN                   : in    std_logic_vector(15 downto 0); -- TRB LVL1 trigger tag\r
+                 TRB_TRND_IN                   : in    std_logic_vector(7 downto 0); -- TRB LVL1 random tag\r
+                 TRB_TTYPE_IN                  : in    std_logic_vector(3 downto 0); -- TRB LVL1 trigger type\r
+                 TRB_TRGRCVD_IN                : in    std_logic; -- TRB LVL1 trigger received\r
+                 TRB_MISSING_OUT               : out   std_logic; -- TRB LVL1 trigger arrived, but has no corresponding timing trigger\r
+                 TRB_RELEASE_OUT               : out   std_logic; -- release TRB LVL1 channel\r
+                 TRB_RST_COUNTER_IN    : in    std_logic; -- reset timing trigger counter\r
+                 TRB_COUNTER_OUT               : out   std_logic_vector(15 downto 0); -- timing trigger counter\r
+                 -- EDS signals\r
+                 EDS_DATA_OUT                  : out   std_logic_vector(39 downto 0); -- EventDataSheet (tm) data word\r
+                 EDS_AVAIL_OUT                 : out   std_logic; -- EDS valid, APV trigger done\r
+                 EDS_DONE_IN                   : in    std_logic; -- release current EDS buffer\r
+                 EDS_FULL_OUT                  : out   std_logic; -- EDS buffer is full\r
+                 EDS_LEVEL_OUT                 : out   std_logic_vector(4 downto 0);\r
+                 FRM_REQD_OUT                  : out   std_logic; -- frame requested, (level counter decrement)\r
+                 -- APV signals        \r
+                 APV_TRG_OUT                   : out   std_logic;\r
+                 APV_SYNC_OUT                  : out   std_logic;\r
+                 DEBUG_OUT                             : out   std_logic_vector(63 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of apv_trgctrl is\r
+\r
+       -- Placer Directives\r
+       attribute HGROUP : string;\r
+       -- for whole architecture\r
+       attribute HGROUP of behavioral : architecture  is "APV_TRG_CTRL_group";\r
+\r
+       -- normal signals\r
+       signal apv_trgsel                       : std_logic_vector(3 downto 0);\r
+       signal apv_trgstart                     : std_logic;\r
+       signal apv_trgdone                      : std_logic_vector(3 downto 0);\r
+       signal next_apv_trgdone_all     : std_logic;\r
+       signal apv_trgdone_all          : std_logic;\r
+       signal apv_trg                          : std_logic_vector(3 downto 0);\r
+       signal next_apv_trg_all         : std_logic;\r
+       signal apv_trg_all                      : std_logic;\r
+       signal apv_clk_rst                      : std_logic; -- 40MHz sync'ed reset signal\r
+\r
+       signal sc_trg_stretch           : std_logic_vector(3 downto 0);\r
+       signal maximum_trg                      : std_logic_vector(3 downto 0);\r
+\r
+       -- EDS fill signals\r
+       signal atc_eds_data                     : std_logic_vector(39 downto 0);\r
+       signal atc_eds_start            : std_logic;\r
+       signal atc_eds_we                       : std_logic;\r
+       signal eds_data                         : std_logic_vector(39 downto 0);\r
+       signal eds_full                         : std_logic;\r
+       signal eds_avail                        : std_logic;\r
+       signal eds_level                        : std_logic_vector(4 downto 0);\r
+       signal trb_release                      : std_logic;\r
+       signal trb_missing                      : std_logic;\r
+       signal trg_found                        : std_logic;\r
+\r
+       signal test_eds_data            : std_logic_vector(39 downto 0);\r
+\r
+       -- APV signals  \r
+       signal apv_trgsent                      : std_logic_vector(3 downto 0);\r
+       signal next_apv_trgsent_all     : std_logic;\r
+       signal apv_trgsent_all          : std_logic;\r
+       signal apv_sync                         : std_logic;\r
+       signal apv_sync_signal          : std_logic;\r
+       \r
+       signal trb_counter                      : std_logic_vector(15 downto 0);\r
+       signal busy_release                     : std_logic;\r
+\r
+       signal debug                            : std_logic_vector(63 downto 0);\r
+       signal bsm                                      : std_logic_vector(7 downto 0);\r
+       \r
+begin\r
+\r
+---------------------------------------------------------------------------\r
+-- Debug\r
+---------------------------------------------------------------------------\r
+debug(63 downto 40) <= (others => '0');\r
+debug(39 downto 0)  <= test_eds_data;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- RESET signal clock domain crossing (100MHz sysclk -> 40MHz APV clock)\r
+---------------------------------------------------------------------------\r
+THE_RESET_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => clk_apv_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => apv_clk_rst\r
+               );\r
+               \r
+---------------------------------------------------------------------------\r
+-- TRB trigger (one clock pulse) stretchers\r
+---------------------------------------------------------------------------\r
+SC_TRG0_STRECH: pulse_stretch\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 START_IN                      => trb_trg_in(0),\r
+                 PULSE_OUT                     => sc_trg_stretch(0),\r
+                 DEBUG_OUT                     => open\r
+               );\r
+SC_TRG1_STRECH: pulse_stretch\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 START_IN                      => trb_trg_in(1),\r
+                 PULSE_OUT                     => sc_trg_stretch(1),\r
+                 DEBUG_OUT                     => open\r
+               );\r
+SC_TRG2_STRECH: pulse_stretch\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 START_IN                      => trb_trg_in(2),\r
+                 PULSE_OUT                     => sc_trg_stretch(2),\r
+                 DEBUG_OUT                     => open\r
+               );\r
+SC_TRG3_STRECH: pulse_stretch\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 START_IN                      => trb_trg_in(3),\r
+                 PULSE_OUT                     => sc_trg_stretch(3),\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Busy handling\r
+---------------------------------------------------------------------------\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               busy_release <= not still_busy_in and not eds_full;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+---------------------------------------------------------------------------\r
+-- Triggers can either be sourced from hardware inputs (four LVDS signals), or by slow control accesses.\r
+-- Each trigger input has its own settings (# triggers, delay inbetween), and can control an own state machine\r
+-- for generation of APV TRG pulse sequences (like 1-0-0, or 1-0-1, etc.)\r
+---------------------------------------------------------------------------\r
+THE_REAL_TRG_HANDLER: real_trg_handler\r
+port map( CLK_IN                               => clk_in,\r
+                 RESET_IN                              => reset_in, \r
+                 TIME_TRG_IN                   => time_trg_in,\r
+                 TRB_TRG_IN                    => sc_trg_stretch,\r
+                 APV_TRGDONE_IN                => apv_trgdone_all,\r
+                 TRG_3_TODO_IN                 => trg_3_todo_in,\r
+                 TRG_2_TODO_IN                 => trg_2_todo_in,\r
+                 TRG_1_TODO_IN                 => trg_1_todo_in,\r
+                 TRG_0_TODO_IN                 => trg_0_todo_in,\r
+                 TRG_SETUP_IN                  => trg_setup_in,\r
+                 TRG_FOUND_OUT                 => trg_found,\r
+                 TRB_TTAG_IN                   => trb_ttag_in,\r
+                 TRB_TRND_IN                   => trb_trnd_in,\r
+                 TRB_TTYPE_IN                  => trb_ttype_in,\r
+                 TRB_TRGRCVD_IN                => trb_trgrcvd_in,\r
+                 TRB_MISSING_OUT               => trb_missing,\r
+                 BUSY_RELEASE_IN               => busy_release,\r
+                 RST_LVL1_COUNTER_IN   => trb_rst_counter_in,\r
+                 LVL1_COUNTER_OUT              => trb_counter,\r
+                 APV_TRGSEL_OUT                => apv_trgsel,\r
+                 APV_TRGSTART_OUT              => apv_trgstart,\r
+                 EDS_DATA_OUT                  => atc_eds_data,\r
+                 EDS_START_OUT                 => atc_eds_start, -- just for debugging\r
+                 EDS_WE_OUT                    => atc_eds_we,\r
+                 EDS_READY_OUT                 => trb_release,\r
+                 DBG_FRMCTR_OUT                => open,\r
+                 BSM_OUT                               => bsm, --open,\r
+                 DEBUG_OUT                             => open --debug\r
+               );\r
+\r
+-- automatically determine the maximum amount of APV frames per trigger\r
+-- mind the delay in this block!\r
+THE_MAX_TRG: max_data\r
+port map( CLK_IN                               => clk_in,\r
+                 RESET_IN                              => reset_in,\r
+                 TODO_3_IN                             => trg_3_todo_in,\r
+                 TODO_2_IN                             => trg_2_todo_in,\r
+                 TODO_1_IN                             => trg_1_todo_in,\r
+                 TODO_0_IN                             => trg_0_todo_in,\r
+                 TODO_MAX_OUT                  => maximum_trg,\r
+                 DEBUG_OUT                             => open\r
+               );\r
+\r
+-- Only for storing last EDS for debugging!\r
+THE_TEST_EDS_DATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( atc_eds_we = '1' ) then\r
+                       test_eds_data <= atc_eds_data;\r
+               end if;\r
+       end if;\r
+end process THE_TEST_EDS_DATA_PROC;\r
+\r
+---------------------------------------------------------------------------\r
+-- EDS buffer with fill level information\r
+---------------------------------------------------------------------------\r
+THE_EDS_BUF: eds_buf\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 EDS_DATA_IN           => atc_eds_data,                -- data from trigger handler\r
+                 EDS_WE_IN                     => atc_eds_we,                  -- write enable from trigger handler\r
+                 EDS_DONE_IN           => eds_done_in,                 -- release current EDS page\r
+                 EDS_DATA_OUT          => eds_data,                    -- current EDS data out\r
+                 EDS_AVAILABLE_OUT     => eds_avail,                   -- current EDS is valid\r
+                 BUF_FULL_OUT          => eds_full,                    -- EDS buffer is full\r
+                 BUF_LEVEL_OUT         => eds_level,                   -- for debugging\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Trigger input 3: normal trigger\r
+---------------------------------------------------------------------------\r
+THE_APV_TRG_HANDLER_3: apv_trg_handler\r
+port map( CLK_APV_IN           => clk_apv_in,\r
+                 RESET_APV_IN          => apv_clk_rst,\r
+                 CLK_IN                        => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 APV_TRGSTART_IN       => apv_trgstart,\r
+                 APV_TRGSEL_IN         => apv_trgsel(3),\r
+                 APV_TRG_TODO_IN       => trg_3_todo_in,\r
+                 APV_TRG_DELAY_IN      => trg_3_delay_in,\r
+                 APV_TRGDONE_OUT       => apv_trgdone(3),\r
+                 APV_TRG_OUT           => apv_trg(3),\r
+                 APV_TRGSENT_OUT       => apv_trgsent(3),\r
+                 BSM_OUT                       => open,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Trigger input 2: normal trigger\r
+---------------------------------------------------------------------------\r
+THE_APV_TRG_HANDLER_2: apv_trg_handler\r
+port map( CLK_APV_IN           => clk_apv_in,\r
+                 RESET_APV_IN          => apv_clk_rst,\r
+                 CLK_IN                        => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 APV_TRGSTART_IN       => apv_trgstart,\r
+                 APV_TRGSEL_IN         => apv_trgsel(2),\r
+                 APV_TRG_TODO_IN       => trg_2_todo_in,\r
+                 APV_TRG_DELAY_IN      => trg_2_delay_in,\r
+                 APV_TRGDONE_OUT       => apv_trgdone(2),\r
+                 APV_TRG_OUT           => apv_trg(2),\r
+                 APV_TRGSENT_OUT       => apv_trgsent(2),\r
+                 BSM_OUT                       => open,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Trigger input 1: normal trigger\r
+---------------------------------------------------------------------------\r
+THE_APV_TRG_HANDLER_1: apv_trg_handler\r
+port map( CLK_APV_IN           => clk_apv_in,\r
+                 RESET_APV_IN          => apv_clk_rst,\r
+                 CLK_IN                        => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 APV_TRGSTART_IN       => apv_trgstart,\r
+                 APV_TRGSEL_IN         => apv_trgsel(1),\r
+                 APV_TRG_TODO_IN       => trg_1_todo_in,\r
+                 APV_TRG_DELAY_IN      => trg_1_delay_in,\r
+                 APV_TRGDONE_OUT       => apv_trgdone(1),\r
+                 APV_TRG_OUT           => apv_trg(1),\r
+                 APV_TRGSENT_OUT       => apv_trgsent(1),\r
+                 BSM_OUT                       => open,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Trigger input 0: normal trigger\r
+---------------------------------------------------------------------------\r
+THE_APV_TRG_HANDLER_0: apv_trg_handler\r
+port map( CLK_APV_IN           => clk_apv_in,\r
+                 RESET_APV_IN          => apv_clk_rst,\r
+                 CLK_IN                        => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 APV_TRGSTART_IN       => apv_trgstart,\r
+                 APV_TRGSEL_IN         => apv_trgsel(0),\r
+                 APV_TRG_TODO_IN       => trg_0_todo_in,\r
+                 APV_TRG_DELAY_IN      => trg_0_delay_in,\r
+                 APV_TRGDONE_OUT       => apv_trgdone(0),\r
+                 APV_TRG_OUT           => apv_trg(0),\r
+                 APV_TRGSENT_OUT       => apv_trgsent(0),\r
+                 BSM_OUT                       => open,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- APV SYNC trigger signal -- NOT CLEAN, outside trigger logic!\r
+---------------------------------------------------------------------------\r
+THE_APV_SYNC_HANDLER: apv_sync_handler\r
+port map( CLK_APV_IN           => clk_apv_in,\r
+                 RESET_APV_IN          => apv_clk_rst,\r
+                 CLK_IN                        => clk_in,\r
+                 RESET_IN                      => reset_in, \r
+                 APV_TRGSTART_IN       => sync_trg_in,\r
+                 APV_TRGSEL_IN         => '1',\r
+                 APV_TRGDONE_OUT       => open,\r
+                 APV_TRG_OUT           => apv_sync_signal,\r
+                 APV_SYNC_OUT          => apv_sync,\r
+                 BSM_OUT                       => open,\r
+                 DEBUG_OUT                     => open\r
+               );\r
+\r
+-- combine all DONE and SENT signals for feedback\r
+next_apv_trgdone_all <= apv_trgdone(3) or apv_trgdone(2) or apv_trgdone(1) or apv_trgdone(0);\r
+next_apv_trgsent_all <= apv_trgsent(3) or apv_trgsent(2) or apv_trgsent(1) or apv_trgsent(0);\r
+\r
+THE_SYNC_AVP_HOUSEKEEPING_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               apv_trgdone_all <= next_apv_trgdone_all;\r
+               apv_trgsent_all <= next_apv_trgsent_all;\r
+       end if;\r
+end process THE_SYNC_AVP_HOUSEKEEPING_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- APV triggering\r
+---------------------------------------------------------------------------\r
+-- we combine all four trigger sources, and the sync source\r
+next_apv_trg_all <= apv_trg(3) or apv_trg(2) or apv_trg(1) or apv_trg(0) or apv_sync_signal;\r
+\r
+THE_SYNC_AVP_TRG_PROC: process( clk_apv_in )\r
+begin\r
+       if( rising_edge(clk_apv_in) ) then\r
+               apv_trg_all     <= next_apv_trg_all;\r
+       end if;\r
+end process THE_SYNC_AVP_TRG_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- output signals\r
+---------------------------------------------------------------------------\r
+eds_data_out     <= eds_data;\r
+eds_avail_out    <= eds_avail;\r
+eds_full_out     <= eds_full;\r
+eds_level_out    <= eds_level;\r
+frm_reqd_out     <= apv_trgsent_all;\r
+trb_release_out  <= trb_release;\r
+trb_missing_out  <= trb_missing;\r
+trb_counter_out  <= trb_counter;\r
+\r
+apv_trg_out      <= apv_trg_all;\r
+apv_sync_out     <= apv_sync;\r
+\r
+trg_found_out    <= trg_found;\r
+trg_max_out      <= maximum_trg;\r
+\r
+---------------------------------------------------------------------------\r
+-- Debug signals\r
+---------------------------------------------------------------------------\r
+debug_out       <= debug;\r
+\r
+end behavioral;\r
+\r
+\r
diff --git a/src/buf_toc.vhd b/src/buf_toc.vhd
new file mode 100644 (file)
index 0000000..0cc2fc8
--- /dev/null
@@ -0,0 +1,269 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- bugfixing:\r
+-- ddmmyy - blafasel\r
+\r
+entity buf_toc is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 BUF_TICK_IN           : in    std_logic; -- tickmark from raw buffer\r
+                 BUF_START_IN          : in    std_logic; -- start of frame from raw buffer\r
+                 WAITFRAME_IN          : in    std_logic; -- statemachine is in "wait for frame" mode\r
+                 FRAMES_REQD_IN        : in    std_logic_vector(3 downto 0); -- number of frames requested from EDS\r
+                 BUF_LVL_IN            : in    std_logic_vector(7 downto 0);\r
+                 GOODDATA_OUT          : out   std_logic; -- APV is on, sent data, process it\r
+                 BADDATA_OUT           : out   std_logic; -- APV is on, broken buffer, NO processing, only ERROR HDR\r
+                 NODATA_OUT            : out   std_logic; -- APV is off, do not send anything!\r
+                 READY_OUT                     : out   std_logic;\r
+                 BSM_OUT                       : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of buf_toc is\r
+\r
+       -- components\r
+\r
+       -- state machine signals\r
+       type STATES is (SLEEP,CLEAR,RSTTOC,WATCH,COUNT,GDATA,BDATA,IDATA,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- normal signals\r
+       signal bsm_x                            : std_logic_vector(7 downto 0);\r
+       signal debug_x                          : std_logic_vector(15 downto 0);\r
+\r
+       signal buf_lvl                          : std_logic_vector(4 downto 0);\r
+       signal buf_good                         : std_logic;\r
+       signal buf_broken                       : std_logic;\r
+       signal buf_ignore                       : std_logic;\r
+       \r
+       signal next_gooddata            : std_logic;\r
+       signal gooddata                         : std_logic;\r
+       signal next_baddata                     : std_logic;\r
+       signal baddata                          : std_logic;\r
+       signal next_nodata                      : std_logic;\r
+       signal nodata                           : std_logic;\r
+       signal next_ready                       : std_logic;\r
+       signal ready                            : std_logic;\r
+\r
+       signal frames_needed            : std_logic_vector(4 downto 0);\r
+\r
+       signal next_frames_avail        : std_logic;\r
+       signal frames_avail                     : std_logic;\r
+\r
+       signal toc_ctr                          : std_logic_vector(3 downto 0);\r
+       signal next_toc_rst                     : std_logic;\r
+       signal toc_rst                          : std_logic;\r
+       signal next_toc_ce                      : std_logic;\r
+       signal toc_ce                           : std_logic;\r
+       signal next_toc_hit                     : std_logic;\r
+       signal toc_hit                          : std_logic;\r
+       \r
+       signal next_stat_clr            : std_logic;\r
+       signal stat_clr                         : std_logic;\r
+       \r
+       signal stat_good                        : std_logic;\r
+       signal stat_bad                         : std_logic;\r
+       signal stat_ignore                      : std_logic;\r
+       \r
+begin\r
+\r
+-- Aliasing\r
+buf_good   <= buf_lvl_in(7);\r
+buf_broken <= buf_lvl_in(6);\r
+buf_ignore <= buf_lvl_in(5);\r
+buf_lvl    <= buf_lvl_in(4 downto 0);\r
+\r
+-- Timeout counter\r
+THE_TIMEOUT_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (toc_rst = '1') ) then\r
+                       toc_ctr <= (others => '0');\r
+               elsif( toc_ce = '1' ) then\r
+                       toc_ctr <= toc_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_TIMEOUT_COUNTER_PROC;\r
+\r
+next_toc_hit <= '1' when (toc_ctr = x"f") else '0';\r
+\r
+-- Check for the number of available frames\r
+frames_needed     <= '0' & frames_reqd_in;\r
+next_frames_avail <= '1' when ( buf_lvl >= frames_needed ) else '0';\r
+\r
+-- Synchronization process\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               toc_hit      <= next_toc_hit;\r
+               frames_avail <= next_frames_avail;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- state machine for handling synchronisation\r
+-- state registers\r
+STATE_MEM: process( clk_in ) \r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       gooddata      <= '0';\r
+                       baddata       <= '0';\r
+                       nodata        <= '0';\r
+                       toc_ce        <= '0';\r
+                       toc_rst       <= '0';\r
+                       ready         <= '0';\r
+                       stat_clr      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       gooddata      <= next_gooddata;\r
+                       baddata       <= next_baddata;\r
+                       nodata        <= next_nodata;\r
+                       toc_ce        <= next_toc_ce;\r
+                       toc_rst       <= next_toc_rst;\r
+                       ready         <= next_ready;\r
+                       stat_clr      <= next_stat_clr;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, waitframe_in, buf_good, buf_ignore, \r
+                                                 buf_start_in, buf_tick_in, frames_avail, toc_hit )\r
+begin\r
+       NEXT_STATE    <= SLEEP; -- avoid latches\r
+       next_gooddata <= '0';\r
+       next_baddata  <= '0';\r
+       next_nodata   <= '0';\r
+       next_toc_ce   <= '0';\r
+       next_toc_rst  <= '0';\r
+       next_ready    <= '0';\r
+       next_stat_clr <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( waitframe_in = '1' ) then\r
+                                                       NEXT_STATE    <= CLEAR;\r
+                                                       next_stat_clr <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               end if;\r
+               when CLEAR      =>      if   ( buf_ignore = '1' ) then\r
+                                                       NEXT_STATE   <= IDATA; -- switched off buffer, ignore it\r
+                                                       next_nodata  <= '1';\r
+                                               elsif( buf_good = '1' ) then\r
+                                                       NEXT_STATE   <= RSTTOC; -- good buffer, start of wait\r
+                                                       next_toc_rst <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= BDATA; -- bad buffer, so we skip it immediatly\r
+                                                       next_baddata <= '1';\r
+                                               end if;\r
+               when RSTTOC     =>      NEXT_STATE <= WATCH;\r
+               when WATCH      =>      if   ( frames_avail = '1' ) then\r
+                                                       NEXT_STATE    <= GDATA; -- all frames did arrive\r
+                                                       next_gooddata <= '1';\r
+                                               elsif( (toc_hit = '1') or (buf_good = '0') ) then\r
+                                                       NEXT_STATE    <= BDATA; -- timeout or broken buffer\r
+                                                       next_baddata  <= '1';\r
+                                               elsif( (frames_avail = '0') and (buf_start_in = '1') ) then\r
+                                                       NEXT_STATE   <= RSTTOC; -- buffer arrived, reset TOC\r
+                                                       next_toc_rst <= '1';\r
+                                               elsif( (frames_avail = '0') and (buf_tick_in = '1') ) then\r
+                                                       NEXT_STATE   <= COUNT;\r
+                                                       next_toc_ce  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WATCH;\r
+                                               end if;\r
+               when COUNT      =>      NEXT_STATE <= WATCH;\r
+               when GDATA      =>      NEXT_STATE <= DONE;\r
+                                               next_ready <= '1';\r
+               when BDATA      =>      NEXT_STATE <= DONE;\r
+                                               next_ready <= '1';\r
+               when IDATA      =>      NEXT_STATE <= DONE;\r
+                                               next_ready <= '1';\r
+               when DONE       =>      if( waitframe_in = '1' ) then\r
+                                                       NEXT_STATE <= DONE;\r
+                                                       next_ready <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               end if;\r
+               \r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_x <= x"00";\r
+               when CLEAR      =>      bsm_x <= x"01"; \r
+               when RSTTOC     =>      bsm_x <= x"02"; \r
+               when WATCH      =>      bsm_x <= x"03";\r
+               when COUNT      =>      bsm_x <= x"04";\r
+               when GDATA      =>      bsm_x <= x"05";\r
+               when BDATA      =>      bsm_x <= x"06";\r
+               when IDATA      =>      bsm_x <= x"07";\r
+               when DONE       =>      bsm_x <= x"08";\r
+               when others     =>      bsm_x <= x"ff";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+-- We store the GOODDATA and BADDATA result for the following data transfer\r
+-- stat_good and stat_bad are valid for the whole buffer processing phase!\r
+THE_GOODDATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (stat_clr = '1') ) then\r
+                       stat_good <= '0';\r
+               elsif( gooddata = '1' ) then\r
+                       stat_good <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_GOODDATA_PROC;\r
+THE_BADDATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (stat_clr = '1') ) then\r
+                       stat_bad <= '0';\r
+               elsif( baddata = '1' ) then\r
+                       stat_bad <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_BADDATA_PROC;\r
+THE_IGNOREDATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (stat_clr = '1') ) then\r
+                       stat_ignore <= '0';\r
+               elsif( nodata = '1' ) then\r
+                       stat_ignore <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_IGNOREDATA_PROC;\r
+\r
+-- output signals\r
+gooddata_out  <= stat_good;\r
+baddata_out   <= stat_bad;\r
+nodata_out    <= stat_ignore;\r
+ready_out     <= ready;\r
+\r
+-- debug signals\r
+debug_x(15 downto 9) <= (others => '0');\r
+debug_x(8)           <= toc_hit;\r
+debug_x(7)           <= frames_avail;\r
+debug_x(6)           <= gooddata;\r
+debug_x(5)           <= baddata;\r
+debug_x(4)           <= ready;\r
+debug_x(3 downto 0)  <= toc_ctr;\r
+\r
+dbg_out       <= debug_x;\r
+bsm_out       <= bsm_x;\r
+\r
+end behavioral;\r
diff --git a/src/comp14bit.lpc b/src/comp14bit.lpc
new file mode 100644 (file)
index 0000000..1e63ce1
--- /dev/null
@@ -0,0 +1,35 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Comparator\r
+CoreRevision=3.1\r
+ModuleName=comp14bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=02/26/2009\r
+Time=14:35:12\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=14\r
+FuncComparator= A >= B\r
+ReprComparator=Unsigned\r
+Lut=0\r
+OutReg=1\r
+Stage=0\r
diff --git a/src/comp14bit.vhd b/src/comp14bit.vhd
new file mode 100644 (file)
index 0000000..64d5851
--- /dev/null
@@ -0,0 +1,131 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n comp14bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type comp -width 14 -unsigned -port ageb -output_reg -enable -pipeline 0 -e 
+
+-- Thu Feb 26 14:35:13 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity comp14bit is
+    port (
+        DataA: in  std_logic_vector(13 downto 0); 
+        DataB: in  std_logic_vector(13 downto 0); 
+        Clock: in  std_logic; 
+        ClockEn: in  std_logic; 
+        Aclr: in  std_logic; 
+        AGEB: out  std_logic);
+end comp14bit;
+
+architecture Structure of comp14bit is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal cmp_ci: std_logic;
+    signal co0: std_logic;
+    signal co1: std_logic;
+    signal co2: std_logic;
+    signal co3: std_logic;
+    signal co4: std_logic;
+    signal co5: std_logic;
+    signal ageb_out: std_logic;
+    signal ageb_out_c: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_0 : label is "ENABLED";
+
+begin
+    -- component instantiation statements
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ageb_out, SP=>ClockEn, CK=>Clock, CD=>Aclr, Q=>AGEB);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, 
+            S1=>open);
+
+    cmp_0: AGEB2
+        port map (A0=>DataA(0), A1=>DataA(1), B0=>DataB(0), B1=>DataB(1), 
+            CI=>cmp_ci, GE=>co0);
+
+    cmp_1: AGEB2
+        port map (A0=>DataA(2), A1=>DataA(3), B0=>DataB(2), B1=>DataB(3), 
+            CI=>co0, GE=>co1);
+
+    cmp_2: AGEB2
+        port map (A0=>DataA(4), A1=>DataA(5), B0=>DataB(4), B1=>DataB(5), 
+            CI=>co1, GE=>co2);
+
+    cmp_3: AGEB2
+        port map (A0=>DataA(6), A1=>DataA(7), B0=>DataB(6), B1=>DataB(7), 
+            CI=>co2, GE=>co3);
+
+    cmp_4: AGEB2
+        port map (A0=>DataA(8), A1=>DataA(9), B0=>DataB(8), B1=>DataB(9), 
+            CI=>co3, GE=>co4);
+
+    cmp_5: AGEB2
+        port map (A0=>DataA(10), A1=>DataA(11), B0=>DataB(10), 
+            B1=>DataB(11), CI=>co4, GE=>co5);
+
+    cmp_6: AGEB2
+        port map (A0=>DataA(12), A1=>DataA(13), B0=>DataB(12), 
+            B1=>DataB(13), CI=>co5, GE=>ageb_out_c);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>ageb_out_c, COUT=>open, S0=>ageb_out, 
+            S1=>open);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of comp14bit is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/comp14bit_tmpl.vhd b/src/comp14bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..a4761de
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.1
+-- Thu Feb 26 14:35:13 2009
+
+-- parameterized module component declaration
+component comp14bit
+    port (DataA: in  std_logic_vector(13 downto 0); 
+        DataB: in  std_logic_vector(13 downto 0); Clock: in  std_logic; 
+        ClockEn: in  std_logic; Aclr: in  std_logic; 
+        AGEB: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : comp14bit
+    port map (DataA(13 downto 0)=>__, DataB(13 downto 0)=>__, Clock=>__, 
+        ClockEn=>__, Aclr=>__, AGEB=>__);
diff --git a/src/comp4bit.lpc b/src/comp4bit.lpc
new file mode 100644 (file)
index 0000000..f709952
--- /dev/null
@@ -0,0 +1,35 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Comparator\r
+CoreRevision=3.1\r
+ModuleName=comp4bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=10/09/2009\r
+Time=16:19:24\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=4\r
+FuncComparator= A > B\r
+ReprComparator=Unsigned\r
+Lut=0\r
+OutReg=0\r
+Stage=0\r
diff --git a/src/comp4bit.srp b/src/comp4bit.srp
new file mode 100644 (file)
index 0000000..8a904b6
--- /dev/null
@@ -0,0 +1,32 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Fri Oct 09 16:19:24 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n comp4bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type comp -width 4 -unsigned -port agtb -e 
+    Circuit name     : comp4bit
+    Module type      : comp
+    Module Version   : 3.1
+    Width            : 4
+    Ports            : 
+       Inputs       : DataA[3:0], DataB[3:0]
+       Outputs      : AGTB
+    I/O buffer       : not inserted
+    Representation   : unsigned number
+    EDIF output      : suppressed
+    VHDL output      : comp4bit.vhd
+    VHDL template    : comp4bit_tmpl.vhd
+    VHDL testbench    : tb_comp4bit_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : comp4bit.srp
+    Element Usage    :
+          ALEB2 : 2
+         FADD2B : 2
+            INV : 1
+    Estimated Resource Usage:
+            LUT : 8
diff --git a/src/comp4bit.vhd b/src/comp4bit.vhd
new file mode 100644 (file)
index 0000000..9d31e21
--- /dev/null
@@ -0,0 +1,96 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n comp4bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type comp -width 4 -unsigned -port agtb -e 
+
+-- Fri Oct 09 16:19:24 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity comp4bit is
+    port (
+        DataA: in  std_logic_vector(3 downto 0); 
+        DataB: in  std_logic_vector(3 downto 0); 
+        AGTB: out  std_logic);
+end comp4bit;
+
+architecture Structure of comp4bit is
+
+    -- internal signal declarations
+    signal co1_inv: std_logic;
+    signal scuba_vhi: std_logic;
+    signal cmp_ci: std_logic;
+    signal co0: std_logic;
+    signal co1: std_logic;
+    signal agtb_out_c: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component ALEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; LE: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    INV_0: INV
+        port map (A=>co1, Z=>co1_inv);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, 
+            S1=>open);
+
+    cmp_0: ALEB2
+        port map (A0=>DataA(0), A1=>DataA(1), B0=>DataB(0), B1=>DataB(1), 
+            CI=>cmp_ci, LE=>co0);
+
+    cmp_1: ALEB2
+        port map (A0=>DataA(2), A1=>DataA(3), B0=>DataB(2), B1=>DataB(3), 
+            CI=>co0, LE=>agtb_out_c);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>agtb_out_c, COUT=>open, S0=>co1, S1=>open);
+
+    AGTB <= co1_inv;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of comp4bit is
+    for Structure
+        for all:ALEB2 use entity ecp2m.ALEB2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/comp4bit_generate.log b/src/comp4bit_generate.log
new file mode 100644 (file)
index 0000000..b68902a
--- /dev/null
@@ -0,0 +1,46 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Fri Oct 09 16:19:24 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n comp4bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type comp -width 4 -unsigned -port agtb -e \r
+    Circuit name     : comp4bit\r
+    Module type      : comp\r
+    Module Version   : 3.1\r
+    Width            : 4\r
+    Ports            : \r
+       Inputs       : DataA[3:0], DataB[3:0]\r
+       Outputs      : AGTB\r
+    I/O buffer       : not inserted\r
+    Representation   : unsigned number\r
+    EDIF output      : suppressed\r
+    VHDL output      : comp4bit.vhd\r
+    VHDL template    : comp4bit_tmpl.vhd\r
+    VHDL testbench   : tb_comp4bit_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : comp4bit.srp\r
+    Estimated Resource Usage:\r
+            LUT : 8\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: comp4bit.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/comp4bit_tmpl.vhd b/src/comp4bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..1e36d6e
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.1
+-- Fri Oct 09 16:19:24 2009
+
+-- parameterized module component declaration
+component comp4bit
+    port (DataA: in  std_logic_vector(3 downto 0); 
+        DataB: in  std_logic_vector(3 downto 0); AGTB: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : comp4bit
+    port map (DataA(3 downto 0)=>__, DataB(3 downto 0)=>__, AGTB=>__);
diff --git a/src/crossover.lpc b/src/crossover.lpc
new file mode 100644 (file)
index 0000000..49ca7f6
--- /dev/null
@@ -0,0 +1,47 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=FIFO_DC\r
+CoreRevision=5.0\r
+ModuleName=crossover\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/20/2009\r
+Time=11:16:47\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+FIFOImp=LUT Based\r
+Depth=16\r
+Width=96\r
+RDepth=16\r
+RWidth=96\r
+regout=0\r
+CtrlByRdEn=0\r
+EmpFlg=0\r
+PeMode=Static - Single Threshold\r
+PeAssert=4\r
+PeDeassert=12\r
+FullFlg=0\r
+PfMode=Static - Single Threshold\r
+PfAssert=12\r
+PfDeassert=506\r
+RDataCount=1\r
+WDataCount=1\r
+EnECC=0\r
diff --git a/src/crossover.srp b/src/crossover.srp
new file mode 100644 (file)
index 0000000..dd496d7
--- /dev/null
@@ -0,0 +1,43 @@
+SCUBA, Version ispLever_v72_PROD_Build (44)
+Fri Nov 20 11:16:48 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -n crossover -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type fifodc -pfu_fifo -addr_width 4 -data_width 96 -num_words 16 -rdata_width 96 -no_enable -pe -1 -pf -1 -rfill -fill -e 
+    Circuit name     : crossover
+    Module type      : ebfifo
+    Module Version   : 5.0
+    Ports            : 
+       Inputs       : Data[95:0], WrClock, RdClock, WrEn, RdEn, Reset, RPReset
+       Outputs      : Q[95:0], WCNT[4:0], RCNT[4:0], Empty, Full
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : crossover.vhd
+    VHDL template    : crossover_tmpl.vhd
+    VHDL testbench    : tb_crossover_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : crossover.srp
+    Element Usage    :
+          AGEB2 : 6
+           AND2 : 2
+            CU2 : 6
+         FADD2B : 8
+         FSUB2B : 6
+        FD1P3BX : 2
+        FD1P3DX : 124
+        FD1S3BX : 1
+        FD1S3DX : 31
+            INV : 2
+            OR2 : 1
+        ROM16X1 : 13
+       DPR16X4A : 24
+           XOR2 : 10
+    Estimated Resource Usage:
+            LUT : 78
+           DRAM : 24
+            Reg : 158
diff --git a/src/crossover.vhd b/src/crossover.vhd
new file mode 100644 (file)
index 0000000..4342242
--- /dev/null
@@ -0,0 +1,2049 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 5.0
+--F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ebfifo -pfu_fifo -depth 16 -width 96 -depth 16 -rdata_width 96 -no_enable -pe -1 -pf -1 -rfill -fill -e 
+
+-- Fri Nov 20 11:16:48 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity crossover is
+    port (
+        Data: in  std_logic_vector(95 downto 0); 
+        WrClock: in  std_logic; 
+        RdClock: in  std_logic; 
+        WrEn: in  std_logic; 
+        RdEn: in  std_logic; 
+        Reset: in  std_logic; 
+        RPReset: in  std_logic; 
+        Q: out  std_logic_vector(95 downto 0); 
+        WCNT: out  std_logic_vector(4 downto 0); 
+        RCNT: out  std_logic_vector(4 downto 0); 
+        Empty: out  std_logic; 
+        Full: out  std_logic);
+end crossover;
+
+architecture Structure of crossover is
+
+    -- internal signal declarations
+    signal invout_1: std_logic;
+    signal invout_0: std_logic;
+    signal w_gdata_0: std_logic;
+    signal w_gdata_1: std_logic;
+    signal w_gdata_2: std_logic;
+    signal w_gdata_3: std_logic;
+    signal wptr_4: std_logic;
+    signal r_gdata_0: std_logic;
+    signal r_gdata_1: std_logic;
+    signal r_gdata_2: std_logic;
+    signal r_gdata_3: std_logic;
+    signal rptr_4: std_logic;
+    signal w_gcount_0: std_logic;
+    signal w_gcount_1: std_logic;
+    signal w_gcount_2: std_logic;
+    signal w_gcount_3: std_logic;
+    signal w_gcount_4: std_logic;
+    signal r_gcount_0: std_logic;
+    signal r_gcount_1: std_logic;
+    signal r_gcount_2: std_logic;
+    signal r_gcount_3: std_logic;
+    signal r_gcount_4: std_logic;
+    signal w_gcount_r20: std_logic;
+    signal w_gcount_r0: std_logic;
+    signal w_gcount_r21: std_logic;
+    signal w_gcount_r1: std_logic;
+    signal w_gcount_r22: std_logic;
+    signal w_gcount_r2: std_logic;
+    signal w_gcount_r23: std_logic;
+    signal w_gcount_r3: std_logic;
+    signal w_gcount_r24: std_logic;
+    signal w_gcount_r4: std_logic;
+    signal r_gcount_w20: std_logic;
+    signal r_gcount_w0: std_logic;
+    signal r_gcount_w21: std_logic;
+    signal r_gcount_w1: std_logic;
+    signal r_gcount_w22: std_logic;
+    signal r_gcount_w2: std_logic;
+    signal r_gcount_w23: std_logic;
+    signal r_gcount_w3: std_logic;
+    signal r_gcount_w24: std_logic;
+    signal r_gcount_w4: std_logic;
+    signal empty_i: std_logic;
+    signal rRst: std_logic;
+    signal full_i: std_logic;
+    signal iwcount_0: std_logic;
+    signal iwcount_1: std_logic;
+    signal w_gctr_ci: std_logic;
+    signal iwcount_2: std_logic;
+    signal iwcount_3: std_logic;
+    signal co0: std_logic;
+    signal iwcount_4: std_logic;
+    signal co2: std_logic;
+    signal wcount_4: std_logic;
+    signal co1: std_logic;
+    signal ircount_0: std_logic;
+    signal ircount_1: std_logic;
+    signal r_gctr_ci: std_logic;
+    signal ircount_2: std_logic;
+    signal ircount_3: std_logic;
+    signal co0_1: std_logic;
+    signal ircount_4: std_logic;
+    signal co2_1: std_logic;
+    signal rcount_4: std_logic;
+    signal co1_1: std_logic;
+    signal wfill_sub_0: std_logic;
+    signal wfill_sub_1: std_logic;
+    signal wfill_sub_2: std_logic;
+    signal co0_2: std_logic;
+    signal wfill_sub_3: std_logic;
+    signal wfill_sub_4: std_logic;
+    signal co1_2: std_logic;
+    signal wfill_sub_msb: std_logic;
+    signal co2_2d: std_logic;
+    signal co2_2: std_logic;
+    signal rfill_sub_0: std_logic;
+    signal scuba_vhi: std_logic;
+    signal rfill_sub_1: std_logic;
+    signal rfill_sub_2: std_logic;
+    signal co0_3: std_logic;
+    signal rfill_sub_3: std_logic;
+    signal rfill_sub_4: std_logic;
+    signal co1_3: std_logic;
+    signal rfill_sub_msb: std_logic;
+    signal co2_3d: std_logic;
+    signal co2_3: std_logic;
+    signal rden_i: std_logic;
+    signal cmp_ci: std_logic;
+    signal wcount_r0: std_logic;
+    signal w_g2b_xor_cluster_0: std_logic;
+    signal rcount_0: std_logic;
+    signal rcount_1: std_logic;
+    signal co0_4: std_logic;
+    signal wcount_r2: std_logic;
+    signal wcount_r3: std_logic;
+    signal rcount_2: std_logic;
+    signal rcount_3: std_logic;
+    signal co1_4: std_logic;
+    signal empty_cmp_clr: std_logic;
+    signal empty_cmp_set: std_logic;
+    signal empty_d: std_logic;
+    signal empty_d_c: std_logic;
+    signal wren_i: std_logic;
+    signal cmp_ci_1: std_logic;
+    signal rcount_w0: std_logic;
+    signal r_g2b_xor_cluster_0: std_logic;
+    signal wcount_0: std_logic;
+    signal wcount_1: std_logic;
+    signal co0_5: std_logic;
+    signal rcount_w2: std_logic;
+    signal rcount_w3: std_logic;
+    signal wcount_2: std_logic;
+    signal wcount_3: std_logic;
+    signal co1_5: std_logic;
+    signal full_cmp_clr: std_logic;
+    signal full_cmp_set: std_logic;
+    signal full_d: std_logic;
+    signal full_d_c: std_logic;
+    signal scuba_vlo: std_logic;
+    signal rdataout95: std_logic;
+    signal rdataout94: std_logic;
+    signal rdataout93: std_logic;
+    signal rdataout92: std_logic;
+    signal rdataout91: std_logic;
+    signal rdataout90: std_logic;
+    signal rdataout89: std_logic;
+    signal rdataout88: std_logic;
+    signal rdataout87: std_logic;
+    signal rdataout86: std_logic;
+    signal rdataout85: std_logic;
+    signal rdataout84: std_logic;
+    signal rdataout83: std_logic;
+    signal rdataout82: std_logic;
+    signal rdataout81: std_logic;
+    signal rdataout80: std_logic;
+    signal rdataout79: std_logic;
+    signal rdataout78: std_logic;
+    signal rdataout77: std_logic;
+    signal rdataout76: std_logic;
+    signal rdataout75: std_logic;
+    signal rdataout74: std_logic;
+    signal rdataout73: std_logic;
+    signal rdataout72: std_logic;
+    signal rdataout71: std_logic;
+    signal rdataout70: std_logic;
+    signal rdataout69: std_logic;
+    signal rdataout68: std_logic;
+    signal rdataout67: std_logic;
+    signal rdataout66: std_logic;
+    signal rdataout65: std_logic;
+    signal rdataout64: std_logic;
+    signal rdataout63: std_logic;
+    signal rdataout62: std_logic;
+    signal rdataout61: std_logic;
+    signal rdataout60: std_logic;
+    signal rdataout59: std_logic;
+    signal rdataout58: std_logic;
+    signal rdataout57: std_logic;
+    signal rdataout56: std_logic;
+    signal rdataout55: std_logic;
+    signal rdataout54: std_logic;
+    signal rdataout53: std_logic;
+    signal rdataout52: std_logic;
+    signal rdataout51: std_logic;
+    signal rdataout50: std_logic;
+    signal rdataout49: std_logic;
+    signal rdataout48: std_logic;
+    signal rdataout47: std_logic;
+    signal rdataout46: std_logic;
+    signal rdataout45: std_logic;
+    signal rdataout44: std_logic;
+    signal rdataout43: std_logic;
+    signal rdataout42: std_logic;
+    signal rdataout41: std_logic;
+    signal rdataout40: std_logic;
+    signal rdataout39: std_logic;
+    signal rdataout38: std_logic;
+    signal rdataout37: std_logic;
+    signal rdataout36: std_logic;
+    signal rdataout35: std_logic;
+    signal rdataout34: std_logic;
+    signal rdataout33: std_logic;
+    signal rdataout32: std_logic;
+    signal rdataout31: std_logic;
+    signal rdataout30: std_logic;
+    signal rdataout29: std_logic;
+    signal rdataout28: std_logic;
+    signal rdataout27: std_logic;
+    signal rdataout26: std_logic;
+    signal rdataout25: std_logic;
+    signal rdataout24: std_logic;
+    signal rdataout23: std_logic;
+    signal rdataout22: std_logic;
+    signal rdataout21: std_logic;
+    signal rdataout20: std_logic;
+    signal rdataout19: std_logic;
+    signal rdataout18: std_logic;
+    signal rdataout17: std_logic;
+    signal rdataout16: std_logic;
+    signal rdataout15: std_logic;
+    signal rdataout14: std_logic;
+    signal rdataout13: std_logic;
+    signal rdataout12: std_logic;
+    signal rdataout11: std_logic;
+    signal rdataout10: std_logic;
+    signal rdataout9: std_logic;
+    signal rdataout8: std_logic;
+    signal rdataout7: std_logic;
+    signal rdataout6: std_logic;
+    signal rdataout5: std_logic;
+    signal rdataout4: std_logic;
+    signal rdataout3: std_logic;
+    signal rdataout2: std_logic;
+    signal rdataout1: std_logic;
+    signal rdataout0: std_logic;
+    signal rptr_3: std_logic;
+    signal rptr_2: std_logic;
+    signal rptr_1: std_logic;
+    signal rptr_0: std_logic;
+    signal dec0_wre3: std_logic;
+    signal wptr_3: std_logic;
+    signal wptr_2: std_logic;
+    signal wptr_1: std_logic;
+    signal wptr_0: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component CU2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CO: out  std_logic; NC0: out  std_logic; NC1: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FSUB2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; BI: in  std_logic; BOUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            PD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1S3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; PD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component FD1S3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; CD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component OR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component XOR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_12 : label is "0x8000";
+    attribute initval of LUT4_11 : label is "0x6996";
+    attribute initval of LUT4_10 : label is "0x6996";
+    attribute initval of LUT4_9 : label is "0x6996";
+    attribute initval of LUT4_8 : label is "0x6996";
+    attribute initval of LUT4_7 : label is "0x6996";
+    attribute initval of LUT4_6 : label is "0x6996";
+    attribute initval of LUT4_5 : label is "0x6996";
+    attribute initval of LUT4_4 : label is "0x6996";
+    attribute initval of LUT4_3 : label is "0x0410";
+    attribute initval of LUT4_2 : label is "0x1004";
+    attribute initval of LUT4_1 : label is "0x0140";
+    attribute initval of LUT4_0 : label is "0x4001";
+    attribute GSR of FF_157 : label is "ENABLED";
+    attribute GSR of FF_156 : label is "ENABLED";
+    attribute GSR of FF_155 : label is "ENABLED";
+    attribute GSR of FF_154 : label is "ENABLED";
+    attribute GSR of FF_153 : label is "ENABLED";
+    attribute GSR of FF_152 : label is "ENABLED";
+    attribute GSR of FF_151 : label is "ENABLED";
+    attribute GSR of FF_150 : label is "ENABLED";
+    attribute GSR of FF_149 : label is "ENABLED";
+    attribute GSR of FF_148 : label is "ENABLED";
+    attribute GSR of FF_147 : label is "ENABLED";
+    attribute GSR of FF_146 : label is "ENABLED";
+    attribute GSR of FF_145 : label is "ENABLED";
+    attribute GSR of FF_144 : label is "ENABLED";
+    attribute GSR of FF_143 : label is "ENABLED";
+    attribute GSR of FF_142 : label is "ENABLED";
+    attribute GSR of FF_141 : label is "ENABLED";
+    attribute GSR of FF_140 : label is "ENABLED";
+    attribute GSR of FF_139 : label is "ENABLED";
+    attribute GSR of FF_138 : label is "ENABLED";
+    attribute GSR of FF_137 : label is "ENABLED";
+    attribute GSR of FF_136 : label is "ENABLED";
+    attribute GSR of FF_135 : label is "ENABLED";
+    attribute GSR of FF_134 : label is "ENABLED";
+    attribute GSR of FF_133 : label is "ENABLED";
+    attribute GSR of FF_132 : label is "ENABLED";
+    attribute GSR of FF_131 : label is "ENABLED";
+    attribute GSR of FF_130 : label is "ENABLED";
+    attribute GSR of FF_129 : label is "ENABLED";
+    attribute GSR of FF_128 : label is "ENABLED";
+    attribute GSR of FF_127 : label is "ENABLED";
+    attribute GSR of FF_126 : label is "ENABLED";
+    attribute GSR of FF_125 : label is "ENABLED";
+    attribute GSR of FF_124 : label is "ENABLED";
+    attribute GSR of FF_123 : label is "ENABLED";
+    attribute GSR of FF_122 : label is "ENABLED";
+    attribute GSR of FF_121 : label is "ENABLED";
+    attribute GSR of FF_120 : label is "ENABLED";
+    attribute GSR of FF_119 : label is "ENABLED";
+    attribute GSR of FF_118 : label is "ENABLED";
+    attribute GSR of FF_117 : label is "ENABLED";
+    attribute GSR of FF_116 : label is "ENABLED";
+    attribute GSR of FF_115 : label is "ENABLED";
+    attribute GSR of FF_114 : label is "ENABLED";
+    attribute GSR of FF_113 : label is "ENABLED";
+    attribute GSR of FF_112 : label is "ENABLED";
+    attribute GSR of FF_111 : label is "ENABLED";
+    attribute GSR of FF_110 : label is "ENABLED";
+    attribute GSR of FF_109 : label is "ENABLED";
+    attribute GSR of FF_108 : label is "ENABLED";
+    attribute GSR of FF_107 : label is "ENABLED";
+    attribute GSR of FF_106 : label is "ENABLED";
+    attribute GSR of FF_105 : label is "ENABLED";
+    attribute GSR of FF_104 : label is "ENABLED";
+    attribute GSR of FF_103 : label is "ENABLED";
+    attribute GSR of FF_102 : label is "ENABLED";
+    attribute GSR of FF_101 : label is "ENABLED";
+    attribute GSR of FF_100 : label is "ENABLED";
+    attribute GSR of FF_99 : label is "ENABLED";
+    attribute GSR of FF_98 : label is "ENABLED";
+    attribute GSR of FF_97 : label is "ENABLED";
+    attribute GSR of FF_96 : label is "ENABLED";
+    attribute GSR of FF_95 : label is "ENABLED";
+    attribute GSR of FF_94 : label is "ENABLED";
+    attribute GSR of FF_93 : label is "ENABLED";
+    attribute GSR of FF_92 : label is "ENABLED";
+    attribute GSR of FF_91 : label is "ENABLED";
+    attribute GSR of FF_90 : label is "ENABLED";
+    attribute GSR of FF_89 : label is "ENABLED";
+    attribute GSR of FF_88 : label is "ENABLED";
+    attribute GSR of FF_87 : label is "ENABLED";
+    attribute GSR of FF_86 : label is "ENABLED";
+    attribute GSR of FF_85 : label is "ENABLED";
+    attribute GSR of FF_84 : label is "ENABLED";
+    attribute GSR of FF_83 : label is "ENABLED";
+    attribute GSR of FF_82 : label is "ENABLED";
+    attribute GSR of FF_81 : label is "ENABLED";
+    attribute GSR of FF_80 : label is "ENABLED";
+    attribute GSR of FF_79 : label is "ENABLED";
+    attribute GSR of FF_78 : label is "ENABLED";
+    attribute GSR of FF_77 : label is "ENABLED";
+    attribute GSR of FF_76 : label is "ENABLED";
+    attribute GSR of FF_75 : label is "ENABLED";
+    attribute GSR of FF_74 : label is "ENABLED";
+    attribute GSR of FF_73 : label is "ENABLED";
+    attribute GSR of FF_72 : label is "ENABLED";
+    attribute GSR of FF_71 : label is "ENABLED";
+    attribute GSR of FF_70 : label is "ENABLED";
+    attribute GSR of FF_69 : label is "ENABLED";
+    attribute GSR of FF_68 : label is "ENABLED";
+    attribute GSR of FF_67 : label is "ENABLED";
+    attribute GSR of FF_66 : label is "ENABLED";
+    attribute GSR of FF_65 : label is "ENABLED";
+    attribute GSR of FF_64 : label is "ENABLED";
+    attribute GSR of FF_63 : label is "ENABLED";
+    attribute GSR of FF_62 : label is "ENABLED";
+    attribute GSR of FF_61 : label is "ENABLED";
+    attribute GSR of FF_60 : label is "ENABLED";
+    attribute GSR of FF_59 : label is "ENABLED";
+    attribute GSR of FF_58 : label is "ENABLED";
+    attribute GSR of FF_57 : label is "ENABLED";
+    attribute GSR of FF_56 : label is "ENABLED";
+    attribute GSR of FF_55 : label is "ENABLED";
+    attribute GSR of FF_54 : label is "ENABLED";
+    attribute GSR of FF_53 : label is "ENABLED";
+    attribute GSR of FF_52 : label is "ENABLED";
+    attribute GSR of FF_51 : label is "ENABLED";
+    attribute GSR of FF_50 : label is "ENABLED";
+    attribute GSR of FF_49 : label is "ENABLED";
+    attribute GSR of FF_48 : label is "ENABLED";
+    attribute GSR of FF_47 : label is "ENABLED";
+    attribute GSR of FF_46 : label is "ENABLED";
+    attribute GSR of FF_45 : label is "ENABLED";
+    attribute GSR of FF_44 : label is "ENABLED";
+    attribute GSR of FF_43 : label is "ENABLED";
+    attribute GSR of FF_42 : label is "ENABLED";
+    attribute GSR of FF_41 : label is "ENABLED";
+    attribute GSR of FF_40 : label is "ENABLED";
+    attribute GSR of FF_39 : label is "ENABLED";
+    attribute GSR of FF_38 : label is "ENABLED";
+    attribute GSR of FF_37 : label is "ENABLED";
+    attribute GSR of FF_36 : label is "ENABLED";
+    attribute GSR of FF_35 : label is "ENABLED";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    AND2_t12: AND2
+        port map (A=>WrEn, B=>invout_1, Z=>wren_i);
+
+    INV_1: INV
+        port map (A=>full_i, Z=>invout_1);
+
+    AND2_t11: AND2
+        port map (A=>RdEn, B=>invout_0, Z=>rden_i);
+
+    INV_0: INV
+        port map (A=>empty_i, Z=>invout_0);
+
+    OR2_t10: OR2
+        port map (A=>Reset, B=>RPReset, Z=>rRst);
+
+    XOR2_t9: XOR2
+        port map (A=>wcount_0, B=>wcount_1, Z=>w_gdata_0);
+
+    XOR2_t8: XOR2
+        port map (A=>wcount_1, B=>wcount_2, Z=>w_gdata_1);
+
+    XOR2_t7: XOR2
+        port map (A=>wcount_2, B=>wcount_3, Z=>w_gdata_2);
+
+    XOR2_t6: XOR2
+        port map (A=>wcount_3, B=>wcount_4, Z=>w_gdata_3);
+
+    XOR2_t5: XOR2
+        port map (A=>rcount_0, B=>rcount_1, Z=>r_gdata_0);
+
+    XOR2_t4: XOR2
+        port map (A=>rcount_1, B=>rcount_2, Z=>r_gdata_1);
+
+    XOR2_t3: XOR2
+        port map (A=>rcount_2, B=>rcount_3, Z=>r_gdata_2);
+
+    XOR2_t2: XOR2
+        port map (A=>rcount_3, B=>rcount_4, Z=>r_gdata_3);
+
+    LUT4_12: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vhi, AD2=>wren_i, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec0_wre3);
+
+    LUT4_11: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r21, AD2=>w_gcount_r22, 
+            AD1=>w_gcount_r23, AD0=>w_gcount_r24, 
+            DO0=>w_g2b_xor_cluster_0);
+
+    LUT4_10: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r23, AD2=>w_gcount_r24, AD1=>scuba_vlo, 
+            AD0=>scuba_vlo, DO0=>wcount_r3);
+
+    LUT4_9: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r22, AD2=>w_gcount_r23, 
+            AD1=>w_gcount_r24, AD0=>scuba_vlo, DO0=>wcount_r2);
+
+    LUT4_8: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r20, AD2=>w_gcount_r21, 
+            AD1=>w_gcount_r22, AD0=>wcount_r3, DO0=>wcount_r0);
+
+    LUT4_7: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w21, AD2=>r_gcount_w22, 
+            AD1=>r_gcount_w23, AD0=>r_gcount_w24, 
+            DO0=>r_g2b_xor_cluster_0);
+
+    LUT4_6: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w23, AD2=>r_gcount_w24, AD1=>scuba_vlo, 
+            AD0=>scuba_vlo, DO0=>rcount_w3);
+
+    LUT4_5: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w22, AD2=>r_gcount_w23, 
+            AD1=>r_gcount_w24, AD0=>scuba_vlo, DO0=>rcount_w2);
+
+    LUT4_4: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w20, AD2=>r_gcount_w21, 
+            AD1=>r_gcount_w22, AD0=>rcount_w3, DO0=>rcount_w0);
+
+    XOR2_t1: XOR2
+        port map (A=>wptr_4, B=>r_gcount_w24, Z=>wfill_sub_msb);
+
+    XOR2_t0: XOR2
+        port map (A=>w_gcount_r24, B=>rptr_4, Z=>rfill_sub_msb);
+
+    LUT4_3: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x0410")
+        -- synopsys translate_on
+        port map (AD3=>rptr_4, AD2=>rcount_4, AD1=>w_gcount_r24, 
+            AD0=>scuba_vlo, DO0=>empty_cmp_set);
+
+    LUT4_2: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x1004")
+        -- synopsys translate_on
+        port map (AD3=>rptr_4, AD2=>rcount_4, AD1=>w_gcount_r24, 
+            AD0=>scuba_vlo, DO0=>empty_cmp_clr);
+
+    LUT4_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x0140")
+        -- synopsys translate_on
+        port map (AD3=>wptr_4, AD2=>wcount_4, AD1=>r_gcount_w24, 
+            AD0=>scuba_vlo, DO0=>full_cmp_set);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x4001")
+        -- synopsys translate_on
+        port map (AD3=>wptr_4, AD2=>wcount_4, AD1=>r_gcount_w24, 
+            AD0=>scuba_vlo, DO0=>full_cmp_clr);
+
+    FF_157: FD1P3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_0, SP=>wren_i, CK=>WrClock, PD=>Reset, 
+            Q=>wcount_0);
+
+    FF_156: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_1);
+
+    FF_155: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_2);
+
+    FF_154: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_3);
+
+    FF_153: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_4);
+
+    FF_152: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_0, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_0);
+
+    FF_151: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_1);
+
+    FF_150: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_2);
+
+    FF_149: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_3);
+
+    FF_148: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_4);
+
+    FF_147: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_0, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_0);
+
+    FF_146: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_1);
+
+    FF_145: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_2);
+
+    FF_144: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_3);
+
+    FF_143: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_4);
+
+    FF_142: FD1P3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_0, SP=>rden_i, CK=>RdClock, PD=>rRst, 
+            Q=>rcount_0);
+
+    FF_141: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_1);
+
+    FF_140: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_2);
+
+    FF_139: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_3);
+
+    FF_138: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_4);
+
+    FF_137: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_0, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_0);
+
+    FF_136: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_1);
+
+    FF_135: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_2);
+
+    FF_134: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_3);
+
+    FF_133: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_4);
+
+    FF_132: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_0, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_0);
+
+    FF_131: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_1);
+
+    FF_130: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_2);
+
+    FF_129: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_3);
+
+    FF_128: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_4);
+
+    FF_127: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout0, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(0));
+
+    FF_126: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(1));
+
+    FF_125: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(2));
+
+    FF_124: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(3));
+
+    FF_123: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(4));
+
+    FF_122: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout5, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(5));
+
+    FF_121: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout6, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(6));
+
+    FF_120: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout7, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(7));
+
+    FF_119: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout8, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(8));
+
+    FF_118: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout9, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(9));
+
+    FF_117: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout10, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(10));
+
+    FF_116: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout11, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(11));
+
+    FF_115: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout12, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(12));
+
+    FF_114: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout13, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(13));
+
+    FF_113: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout14, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(14));
+
+    FF_112: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout15, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(15));
+
+    FF_111: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout16, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(16));
+
+    FF_110: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout17, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(17));
+
+    FF_109: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout18, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(18));
+
+    FF_108: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout19, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(19));
+
+    FF_107: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout20, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(20));
+
+    FF_106: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout21, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(21));
+
+    FF_105: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout22, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(22));
+
+    FF_104: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout23, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(23));
+
+    FF_103: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout24, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(24));
+
+    FF_102: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout25, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(25));
+
+    FF_101: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout26, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(26));
+
+    FF_100: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout27, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(27));
+
+    FF_99: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout28, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(28));
+
+    FF_98: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout29, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(29));
+
+    FF_97: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout30, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(30));
+
+    FF_96: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout31, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(31));
+
+    FF_95: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout32, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(32));
+
+    FF_94: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout33, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(33));
+
+    FF_93: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout34, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(34));
+
+    FF_92: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout35, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(35));
+
+    FF_91: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout36, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(36));
+
+    FF_90: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout37, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(37));
+
+    FF_89: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout38, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(38));
+
+    FF_88: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout39, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(39));
+
+    FF_87: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout40, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(40));
+
+    FF_86: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout41, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(41));
+
+    FF_85: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout42, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(42));
+
+    FF_84: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout43, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(43));
+
+    FF_83: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout44, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(44));
+
+    FF_82: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout45, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(45));
+
+    FF_81: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout46, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(46));
+
+    FF_80: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout47, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(47));
+
+    FF_79: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout48, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(48));
+
+    FF_78: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout49, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(49));
+
+    FF_77: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout50, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(50));
+
+    FF_76: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout51, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(51));
+
+    FF_75: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout52, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(52));
+
+    FF_74: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout53, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(53));
+
+    FF_73: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout54, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(54));
+
+    FF_72: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout55, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(55));
+
+    FF_71: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout56, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(56));
+
+    FF_70: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout57, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(57));
+
+    FF_69: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout58, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(58));
+
+    FF_68: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout59, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(59));
+
+    FF_67: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout60, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(60));
+
+    FF_66: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout61, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(61));
+
+    FF_65: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout62, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(62));
+
+    FF_64: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout63, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(63));
+
+    FF_63: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout64, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(64));
+
+    FF_62: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout65, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(65));
+
+    FF_61: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout66, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(66));
+
+    FF_60: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout67, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(67));
+
+    FF_59: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout68, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(68));
+
+    FF_58: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout69, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(69));
+
+    FF_57: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout70, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(70));
+
+    FF_56: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout71, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(71));
+
+    FF_55: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout72, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(72));
+
+    FF_54: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout73, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(73));
+
+    FF_53: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout74, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(74));
+
+    FF_52: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout75, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(75));
+
+    FF_51: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout76, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(76));
+
+    FF_50: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout77, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(77));
+
+    FF_49: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout78, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(78));
+
+    FF_48: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout79, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(79));
+
+    FF_47: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout80, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(80));
+
+    FF_46: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout81, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(81));
+
+    FF_45: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout82, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(82));
+
+    FF_44: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout83, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(83));
+
+    FF_43: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout84, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(84));
+
+    FF_42: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout85, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(85));
+
+    FF_41: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout86, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(86));
+
+    FF_40: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout87, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(87));
+
+    FF_39: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout88, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(88));
+
+    FF_38: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout89, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(89));
+
+    FF_37: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout90, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(90));
+
+    FF_36: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout91, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(91));
+
+    FF_35: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout92, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(92));
+
+    FF_34: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout93, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(93));
+
+    FF_33: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout94, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(94));
+
+    FF_32: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout95, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>Q(95));
+
+    FF_31: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_0, CK=>RdClock, CD=>Reset, Q=>w_gcount_r0);
+
+    FF_30: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_1, CK=>RdClock, CD=>Reset, Q=>w_gcount_r1);
+
+    FF_29: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_2, CK=>RdClock, CD=>Reset, Q=>w_gcount_r2);
+
+    FF_28: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_3, CK=>RdClock, CD=>Reset, Q=>w_gcount_r3);
+
+    FF_27: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_4, CK=>RdClock, CD=>Reset, Q=>w_gcount_r4);
+
+    FF_26: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w0);
+
+    FF_25: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w1);
+
+    FF_24: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w2);
+
+    FF_23: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w3);
+
+    FF_22: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w4);
+
+    FF_21: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r0, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r20);
+
+    FF_20: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r1, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r21);
+
+    FF_19: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r2, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r22);
+
+    FF_18: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r3, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r23);
+
+    FF_17: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r4, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r24);
+
+    FF_16: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w20);
+
+    FF_15: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w21);
+
+    FF_14: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w22);
+
+    FF_13: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w23);
+
+    FF_12: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w24);
+
+    FF_11: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wfill_sub_0, CK=>WrClock, CD=>Reset, Q=>WCNT(0));
+
+    FF_10: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wfill_sub_1, CK=>WrClock, CD=>Reset, Q=>WCNT(1));
+
+    FF_9: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wfill_sub_2, CK=>WrClock, CD=>Reset, Q=>WCNT(2));
+
+    FF_8: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wfill_sub_3, CK=>WrClock, CD=>Reset, Q=>WCNT(3));
+
+    FF_7: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wfill_sub_4, CK=>WrClock, CD=>Reset, Q=>WCNT(4));
+
+    FF_6: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rfill_sub_0, CK=>RdClock, CD=>rRst, Q=>RCNT(0));
+
+    FF_5: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rfill_sub_1, CK=>RdClock, CD=>rRst, Q=>RCNT(1));
+
+    FF_4: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rfill_sub_2, CK=>RdClock, CD=>rRst, Q=>RCNT(2));
+
+    FF_3: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rfill_sub_3, CK=>RdClock, CD=>rRst, Q=>RCNT(3));
+
+    FF_2: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rfill_sub_4, CK=>RdClock, CD=>rRst, Q=>RCNT(4));
+
+    FF_1: FD1S3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>empty_d, CK=>RdClock, PD=>rRst, Q=>empty_i);
+
+    FF_0: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>full_d, CK=>WrClock, CD=>Reset, Q=>full_i);
+
+    w_gctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>w_gctr_ci, S0=>open, 
+            S1=>open);
+
+    w_gctr_0: CU2
+        port map (CI=>w_gctr_ci, PC0=>wcount_0, PC1=>wcount_1, CO=>co0, 
+            NC0=>iwcount_0, NC1=>iwcount_1);
+
+    w_gctr_1: CU2
+        port map (CI=>co0, PC0=>wcount_2, PC1=>wcount_3, CO=>co1, 
+            NC0=>iwcount_2, NC1=>iwcount_3);
+
+    w_gctr_2: CU2
+        port map (CI=>co1, PC0=>wcount_4, PC1=>scuba_vlo, CO=>co2, 
+            NC0=>iwcount_4, NC1=>open);
+
+    r_gctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>r_gctr_ci, S0=>open, 
+            S1=>open);
+
+    r_gctr_0: CU2
+        port map (CI=>r_gctr_ci, PC0=>rcount_0, PC1=>rcount_1, CO=>co0_1, 
+            NC0=>ircount_0, NC1=>ircount_1);
+
+    r_gctr_1: CU2
+        port map (CI=>co0_1, PC0=>rcount_2, PC1=>rcount_3, CO=>co1_1, 
+            NC0=>ircount_2, NC1=>ircount_3);
+
+    r_gctr_2: CU2
+        port map (CI=>co1_1, PC0=>rcount_4, PC1=>scuba_vlo, CO=>co2_1, 
+            NC0=>ircount_4, NC1=>open);
+
+    wfill_0: FSUB2B
+        port map (A0=>scuba_vhi, A1=>wptr_0, B0=>scuba_vlo, 
+            B1=>rcount_w0, BI=>scuba_vlo, BOUT=>co0_2, S0=>open, 
+            S1=>wfill_sub_0);
+
+    wfill_1: FSUB2B
+        port map (A0=>wptr_1, A1=>wptr_2, B0=>r_g2b_xor_cluster_0, 
+            B1=>rcount_w2, BI=>co0_2, BOUT=>co1_2, S0=>wfill_sub_1, 
+            S1=>wfill_sub_2);
+
+    wfill_2: FSUB2B
+        port map (A0=>wptr_3, A1=>wfill_sub_msb, B0=>rcount_w3, 
+            B1=>scuba_vlo, BI=>co1_2, BOUT=>co2_2, S0=>wfill_sub_3, 
+            S1=>wfill_sub_4);
+
+    wfilld: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co2_2, COUT=>open, S0=>co2_2d, S1=>open);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    rfill_0: FSUB2B
+        port map (A0=>scuba_vhi, A1=>wcount_r0, B0=>scuba_vlo, 
+            B1=>rptr_0, BI=>scuba_vlo, BOUT=>co0_3, S0=>open, 
+            S1=>rfill_sub_0);
+
+    rfill_1: FSUB2B
+        port map (A0=>w_g2b_xor_cluster_0, A1=>wcount_r2, B0=>rptr_1, 
+            B1=>rptr_2, BI=>co0_3, BOUT=>co1_3, S0=>rfill_sub_1, 
+            S1=>rfill_sub_2);
+
+    rfill_2: FSUB2B
+        port map (A0=>wcount_r3, A1=>rfill_sub_msb, B0=>rptr_3, 
+            B1=>scuba_vlo, BI=>co1_3, BOUT=>co2_3, S0=>rfill_sub_3, 
+            S1=>rfill_sub_4);
+
+    rfilld: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co2_3, COUT=>open, S0=>co2_3d, S1=>open);
+
+    empty_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vlo, A1=>rden_i, B0=>scuba_vlo, B1=>rden_i, 
+            CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, S1=>open);
+
+    empty_cmp_0: AGEB2
+        port map (A0=>rcount_0, A1=>rcount_1, B0=>wcount_r0, 
+            B1=>w_g2b_xor_cluster_0, CI=>cmp_ci, GE=>co0_4);
+
+    empty_cmp_1: AGEB2
+        port map (A0=>rcount_2, A1=>rcount_3, B0=>wcount_r2, 
+            B1=>wcount_r3, CI=>co0_4, GE=>co1_4);
+
+    empty_cmp_2: AGEB2
+        port map (A0=>empty_cmp_set, A1=>scuba_vlo, B0=>empty_cmp_clr, 
+            B1=>scuba_vlo, CI=>co1_4, GE=>empty_d_c);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>empty_d_c, COUT=>open, S0=>empty_d, 
+            S1=>open);
+
+    full_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vlo, A1=>wren_i, B0=>scuba_vlo, B1=>wren_i, 
+            CI=>scuba_vlo, COUT=>cmp_ci_1, S0=>open, S1=>open);
+
+    full_cmp_0: AGEB2
+        port map (A0=>wcount_0, A1=>wcount_1, B0=>rcount_w0, 
+            B1=>r_g2b_xor_cluster_0, CI=>cmp_ci_1, GE=>co0_5);
+
+    full_cmp_1: AGEB2
+        port map (A0=>wcount_2, A1=>wcount_3, B0=>rcount_w2, 
+            B1=>rcount_w3, CI=>co0_5, GE=>co1_5);
+
+    full_cmp_2: AGEB2
+        port map (A0=>full_cmp_set, A1=>scuba_vlo, B0=>full_cmp_clr, 
+            B1=>scuba_vlo, CI=>co1_5, GE=>full_d_c);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    a1: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>full_d_c, COUT=>open, S0=>full_d, 
+            S1=>open);
+
+    fifo_pfu_0_0: DPR16X4A
+        port map (DI0=>Data(92), DI1=>Data(93), DI2=>Data(94), 
+            DI3=>Data(95), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout92, 
+            DO1=>rdataout93, DO2=>rdataout94, DO3=>rdataout95);
+
+    fifo_pfu_0_1: DPR16X4A
+        port map (DI0=>Data(88), DI1=>Data(89), DI2=>Data(90), 
+            DI3=>Data(91), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout88, 
+            DO1=>rdataout89, DO2=>rdataout90, DO3=>rdataout91);
+
+    fifo_pfu_0_2: DPR16X4A
+        port map (DI0=>Data(84), DI1=>Data(85), DI2=>Data(86), 
+            DI3=>Data(87), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout84, 
+            DO1=>rdataout85, DO2=>rdataout86, DO3=>rdataout87);
+
+    fifo_pfu_0_3: DPR16X4A
+        port map (DI0=>Data(80), DI1=>Data(81), DI2=>Data(82), 
+            DI3=>Data(83), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout80, 
+            DO1=>rdataout81, DO2=>rdataout82, DO3=>rdataout83);
+
+    fifo_pfu_0_4: DPR16X4A
+        port map (DI0=>Data(76), DI1=>Data(77), DI2=>Data(78), 
+            DI3=>Data(79), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout76, 
+            DO1=>rdataout77, DO2=>rdataout78, DO3=>rdataout79);
+
+    fifo_pfu_0_5: DPR16X4A
+        port map (DI0=>Data(72), DI1=>Data(73), DI2=>Data(74), 
+            DI3=>Data(75), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout72, 
+            DO1=>rdataout73, DO2=>rdataout74, DO3=>rdataout75);
+
+    fifo_pfu_0_6: DPR16X4A
+        port map (DI0=>Data(68), DI1=>Data(69), DI2=>Data(70), 
+            DI3=>Data(71), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout68, 
+            DO1=>rdataout69, DO2=>rdataout70, DO3=>rdataout71);
+
+    fifo_pfu_0_7: DPR16X4A
+        port map (DI0=>Data(64), DI1=>Data(65), DI2=>Data(66), 
+            DI3=>Data(67), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout64, 
+            DO1=>rdataout65, DO2=>rdataout66, DO3=>rdataout67);
+
+    fifo_pfu_0_8: DPR16X4A
+        port map (DI0=>Data(60), DI1=>Data(61), DI2=>Data(62), 
+            DI3=>Data(63), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout60, 
+            DO1=>rdataout61, DO2=>rdataout62, DO3=>rdataout63);
+
+    fifo_pfu_0_9: DPR16X4A
+        port map (DI0=>Data(56), DI1=>Data(57), DI2=>Data(58), 
+            DI3=>Data(59), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout56, 
+            DO1=>rdataout57, DO2=>rdataout58, DO3=>rdataout59);
+
+    fifo_pfu_0_10: DPR16X4A
+        port map (DI0=>Data(52), DI1=>Data(53), DI2=>Data(54), 
+            DI3=>Data(55), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout52, 
+            DO1=>rdataout53, DO2=>rdataout54, DO3=>rdataout55);
+
+    fifo_pfu_0_11: DPR16X4A
+        port map (DI0=>Data(48), DI1=>Data(49), DI2=>Data(50), 
+            DI3=>Data(51), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout48, 
+            DO1=>rdataout49, DO2=>rdataout50, DO3=>rdataout51);
+
+    fifo_pfu_0_12: DPR16X4A
+        port map (DI0=>Data(44), DI1=>Data(45), DI2=>Data(46), 
+            DI3=>Data(47), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout44, 
+            DO1=>rdataout45, DO2=>rdataout46, DO3=>rdataout47);
+
+    fifo_pfu_0_13: DPR16X4A
+        port map (DI0=>Data(40), DI1=>Data(41), DI2=>Data(42), 
+            DI3=>Data(43), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout40, 
+            DO1=>rdataout41, DO2=>rdataout42, DO3=>rdataout43);
+
+    fifo_pfu_0_14: DPR16X4A
+        port map (DI0=>Data(36), DI1=>Data(37), DI2=>Data(38), 
+            DI3=>Data(39), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout36, 
+            DO1=>rdataout37, DO2=>rdataout38, DO3=>rdataout39);
+
+    fifo_pfu_0_15: DPR16X4A
+        port map (DI0=>Data(32), DI1=>Data(33), DI2=>Data(34), 
+            DI3=>Data(35), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout32, 
+            DO1=>rdataout33, DO2=>rdataout34, DO3=>rdataout35);
+
+    fifo_pfu_0_16: DPR16X4A
+        port map (DI0=>Data(28), DI1=>Data(29), DI2=>Data(30), 
+            DI3=>Data(31), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout28, 
+            DO1=>rdataout29, DO2=>rdataout30, DO3=>rdataout31);
+
+    fifo_pfu_0_17: DPR16X4A
+        port map (DI0=>Data(24), DI1=>Data(25), DI2=>Data(26), 
+            DI3=>Data(27), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout24, 
+            DO1=>rdataout25, DO2=>rdataout26, DO3=>rdataout27);
+
+    fifo_pfu_0_18: DPR16X4A
+        port map (DI0=>Data(20), DI1=>Data(21), DI2=>Data(22), 
+            DI3=>Data(23), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout20, 
+            DO1=>rdataout21, DO2=>rdataout22, DO3=>rdataout23);
+
+    fifo_pfu_0_19: DPR16X4A
+        port map (DI0=>Data(16), DI1=>Data(17), DI2=>Data(18), 
+            DI3=>Data(19), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout16, 
+            DO1=>rdataout17, DO2=>rdataout18, DO3=>rdataout19);
+
+    fifo_pfu_0_20: DPR16X4A
+        port map (DI0=>Data(12), DI1=>Data(13), DI2=>Data(14), 
+            DI3=>Data(15), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout12, 
+            DO1=>rdataout13, DO2=>rdataout14, DO3=>rdataout15);
+
+    fifo_pfu_0_21: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>Data(11), WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, 
+            RAD1=>rptr_1, RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, 
+            WAD1=>wptr_1, WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout8, 
+            DO1=>rdataout9, DO2=>rdataout10, DO3=>rdataout11);
+
+    fifo_pfu_0_22: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, RAD1=>rptr_1, 
+            RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, WAD1=>wptr_1, 
+            WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout4, DO1=>rdataout5, 
+            DO2=>rdataout6, DO3=>rdataout7);
+
+    fifo_pfu_0_23: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>rptr_0, RAD1=>rptr_1, 
+            RAD2=>rptr_2, RAD3=>rptr_3, WAD0=>wptr_0, WAD1=>wptr_1, 
+            WAD2=>wptr_2, WAD3=>wptr_3, DO0=>rdataout0, DO1=>rdataout1, 
+            DO2=>rdataout2, DO3=>rdataout3);
+
+    Empty <= empty_i;
+    Full <= full_i;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of crossover is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:CU2 use entity ecp2m.CU2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FSUB2B use entity ecp2m.FSUB2B(V); end for;
+        for all:FD1P3BX use entity ecp2m.FD1P3BX(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:FD1S3BX use entity ecp2m.FD1S3BX(V); end for;
+        for all:FD1S3DX use entity ecp2m.FD1S3DX(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:OR2 use entity ecp2m.OR2(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:XOR2 use entity ecp2m.XOR2(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/crossover_generate.log b/src/crossover_generate.log
new file mode 100644 (file)
index 0000000..4a2c3aa
--- /dev/null
@@ -0,0 +1,46 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_PROD_Build (44)\r
+Fri Nov 20 11:16:48 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -n crossover -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type fifodc -pfu_fifo -addr_width 4 -data_width 96 -num_words 16 -rdata_width 96 -no_enable -pe -1 -pf -1 -rfill -fill -e \r
+    Circuit name     : crossover\r
+    Module type      : ebfifo\r
+    Module Version   : 5.0\r
+    Ports            : \r
+       Inputs       : Data[95:0], WrClock, RdClock, WrEn, RdEn, Reset, RPReset\r
+       Outputs      : Q[95:0], WCNT[4:0], RCNT[4:0], Empty, Full\r
+    I/O buffer       : not inserted\r
+    EDIF output      : suppressed\r
+    VHDL output      : crossover.vhd\r
+    VHDL template    : crossover_tmpl.vhd\r
+    VHDL testbench   : tb_crossover_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : crossover.srp\r
+    Estimated Resource Usage:\r
+            LUT : 78\r
+           DRAM : 24\r
+            Reg : 158\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\crossover.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/crossover_tmpl.vhd b/src/crossover_tmpl.vhd
new file mode 100644 (file)
index 0000000..bbdc80d
--- /dev/null
@@ -0,0 +1,20 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 5.0
+-- Fri Nov 20 11:16:48 2009
+
+-- parameterized module component declaration
+component crossover
+    port (Data: in  std_logic_vector(95 downto 0); 
+        WrClock: in  std_logic; RdClock: in  std_logic; 
+        WrEn: in  std_logic; RdEn: in  std_logic; Reset: in  std_logic; 
+        RPReset: in  std_logic; Q: out  std_logic_vector(95 downto 0); 
+        WCNT: out  std_logic_vector(4 downto 0); 
+        RCNT: out  std_logic_vector(4 downto 0); Empty: out  std_logic; 
+        Full: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : crossover
+    port map (Data(95 downto 0)=>__, WrClock=>__, RdClock=>__, WrEn=>__, 
+        RdEn=>__, Reset=>__, RPReset=>__, Q(95 downto 0)=>__, WCNT(4 downto 0)=>__, 
+        RCNT(4 downto 0)=>__, Empty=>__, Full=>__);
diff --git a/src/decoder_8bit.lpc b/src/decoder_8bit.lpc
new file mode 100644 (file)
index 0000000..4a28d48
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=decoder_8bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=03/03/2009\r
+Time=09:38:59\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=256\r
+Data=4\r
+LUT=0\r
+MemFile=z:/vhdl_pro/adcm_v2/decoder_8bit.mem\r
+MemFormat=orca\r
diff --git a/src/decoder_8bit.mem b/src/decoder_8bit.mem
new file mode 100644 (file)
index 0000000..55fdbdf
--- /dev/null
@@ -0,0 +1,38 @@
+#Format=AddrHex
+#Depth=256
+#Width=4
+#AddrRadix=3
+#DataRadix=3
+#Data
+00: 0 1 1 2 1 2 2 3
+08: 1 2 2 3 2 3 3 4
+10: 1 2 2 3 2 3 3 4
+18: 2 3 3 4 3 4 4 5
+20: 1 2 2 3 2 3 3 4 
+28: 2 3 3 4 3 4 4 5 
+30: 2 3 3 4 3 4 4 5
+38: 3 4 4 5 4 5 5 6
+40: 1 2 2 3 2 3 3 4 
+48: 2 3 3 4 3 4 4 5 
+50: 2 3 3 4 3 4 4 5 
+58: 3 4 4 5 4 5 5 6 
+60: 2 3 3 4 3 4 4 5 
+68: 3 4 4 5 4 5 5 6 
+70: 3 4 4 5 4 5 5 6 
+78: 4 5 5 6 5 6 6 7
+80: 1 2 2 3 2 3 3 4
+88: 2 3 3 4 3 4 4 5
+90: 2 3 3 4 3 4 4 5
+98: 3 4 4 5 4 5 5 6
+a0: 2 3 3 4 3 4 4 5
+a8: 3 4 4 5 4 5 5 6
+b0: 3 4 4 5 4 5 5 6
+b8: 4 5 5 6 5 6 6 7
+c0: 2 3 3 4 3 4 4 5
+c8: 3 4 4 5 4 5 5 6
+d0: 3 4 4 5 4 5 5 6
+d8: 4 5 5 6 5 6 6 7
+e0: 3 4 4 5 4 5 5 6 
+e8: 4 5 5 6 5 6 6 7
+f0: 4 5 5 6 5 6 6 7
+f8: 5 6 6 7 6 7 7 8
\ No newline at end of file
diff --git a/src/decoder_8bit.vhd b/src/decoder_8bit.vhd
new file mode 100644 (file)
index 0000000..bff958b
--- /dev/null
@@ -0,0 +1,81 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 8 -num_rows 256 -data_width 4 -outdata UNREGISTERED -memfile z:/vhdl_pro/adcm_v2/decoder_8bit.mem -memformat orca -e 
+
+-- Tue Mar 03 09:38:59 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity decoder_8bit is
+    port (
+        Address: in  std_logic_vector(7 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end decoder_8bit;
+
+architecture Structure of decoder_8bit is
+
+    -- local component declarations
+    component ROM256X1
+    -- synopsys translate_off
+        generic (INITVAL : in String);
+    -- synopsys translate_on
+        port (AD7: in  std_logic; AD6: in  std_logic; AD5: in  std_logic; 
+            AD4: in  std_logic; AD3: in  std_logic; AD2: in  std_logic; 
+            AD1: in  std_logic; AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0x8000000000000000000000000000000000000000000000000000000000000000";
+    attribute initval of mem_0_2 : label is "0x7FFFFFFEFFFEFEE8FFFEFEE8FEE8E880FFFEFEE8FEE8E880FEE8E880E8808000";
+    attribute initval of mem_0_1 : label is "0x7EE8E881E8818117E88181178117177EE88181178117177E8117177E177E7EE8";
+    attribute initval of mem_0_0 : label is "0x6996966996696996966969966996966996696996699696696996966996696996";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM256X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000000000000000000000000000000000000000000000000000000000000000")
+        -- synopsys translate_on
+        port map (AD7=>Address(7), AD6=>Address(6), AD5=>Address(5), 
+            AD4=>Address(4), AD3=>Address(3), AD2=>Address(2), 
+            AD1=>Address(1), AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM256X1
+        -- synopsys translate_off
+        generic map (initval=> "0x7FFFFFFEFFFEFEE8FFFEFEE8FEE8E880FFFEFEE8FEE8E880FEE8E880E8808000")
+        -- synopsys translate_on
+        port map (AD7=>Address(7), AD6=>Address(6), AD5=>Address(5), 
+            AD4=>Address(4), AD3=>Address(3), AD2=>Address(2), 
+            AD1=>Address(1), AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM256X1
+        -- synopsys translate_off
+        generic map (initval=> "0x7EE8E881E8818117E88181178117177EE88181178117177E8117177E177E7EE8")
+        -- synopsys translate_on
+        port map (AD7=>Address(7), AD6=>Address(6), AD5=>Address(5), 
+            AD4=>Address(4), AD3=>Address(3), AD2=>Address(2), 
+            AD1=>Address(1), AD0=>Address(0), DO0=>Q(1));
+
+    mem_0_0: ROM256X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996966996696996966969966996966996696996699696696996966996696996")
+        -- synopsys translate_on
+        port map (AD7=>Address(7), AD6=>Address(6), AD5=>Address(5), 
+            AD4=>Address(4), AD3=>Address(3), AD2=>Address(2), 
+            AD1=>Address(1), AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of decoder_8bit is
+    for Structure
+        for all:ROM256X1 use entity ecp2m.ROM256X1(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/decoder_8bit_tmpl.vhd b/src/decoder_8bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..fb3c041
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 2.4
+-- Tue Mar 03 09:38:59 2009
+
+-- parameterized module component declaration
+component decoder_8bit
+    port (Address: in  std_logic_vector(7 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : decoder_8bit
+    port map (Address(7 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/dhdr_buf.vhd b/src/dhdr_buf.vhd
new file mode 100644 (file)
index 0000000..8a18c7e
--- /dev/null
@@ -0,0 +1,130 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity dhdr_buf is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; \r
+                 -- DHDR information block\r
+                 DHDR_DATA_IN                  : in    std_logic_vector(47 downto 0); -- EDS data input\r
+                 DHDR_WE_IN                    : in    std_logic; -- EDS write enable\r
+                 DHDR_DONE_IN                  : in    std_logic; -- release EDS \r
+                 DHDR_DATA_OUT                 : out   std_logic_vector(47 downto 0);\r
+                 DHDR_AVAILABLE_OUT    : out   std_logic;\r
+                 -- trigger busy information\r
+                 BUF_FULL_OUT                  : out   std_logic;\r
+                 BUF_LEVEL_OUT                 : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                             : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of dhdr_buf is\r
+\r
+       -- normal signals\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+\r
+       -- Signals for controlling the DHDR buffer memory\r
+       signal dhdr_data                : std_logic_vector(47 downto 0);\r
+       signal dhdr_rd_addr             : std_logic_vector(3 downto 0);\r
+       signal dhdr_wr_addr             : std_logic_vector(3 downto 0);\r
+       signal dhdr_wr                  : std_logic;\r
+       signal dhdr_rd                  : std_logic;\r
+       signal dhdr_free_ctr    : std_logic_vector(4 downto 0); -- fill level counter\r
+       signal dhdr_free_up             : std_logic;\r
+       signal dhdr_free_down   : std_logic;\r
+       signal dhdr_available_x : std_logic; \r
+       signal dhdr_available   : std_logic; -- at least one valid EDS entry is available\r
+       signal dhdr_full_x              : std_logic;\r
+       signal dhdr_full                : std_logic;\r
+       \r
+begin\r
+\r
+-- General process for syncing combinatorial signals\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               dhdr_available  <= dhdr_available_x;\r
+               dhdr_full       <= dhdr_full_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- Write address pointer for EDS buffer\r
+dhdr_wr <= dhdr_we_in;\r
+\r
+THE_WR_ADDR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       dhdr_wr_addr <= (others => '0');\r
+               elsif( dhdr_wr = '1' ) then\r
+                       dhdr_wr_addr <= dhdr_wr_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_WR_ADDR_PROC;\r
+\r
+-- Read address pointer for EDS buffer\r
+dhdr_rd <= dhdr_done_in;\r
+\r
+THE_RD_ADDR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       dhdr_rd_addr <= (others => '0');\r
+               elsif( dhdr_rd = '1' ) then\r
+                       dhdr_rd_addr <= dhdr_rd_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_RD_ADDR_PROC;\r
+\r
+-- Buffer fill level counter\r
+dhdr_free_down <= dhdr_we_in;\r
+dhdr_free_up   <= dhdr_done_in;\r
+\r
+THE_DHDR_FREE_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       dhdr_free_ctr <= "10000";\r
+               elsif( (dhdr_free_down = '1') and (dhdr_free_up = '0') ) then\r
+                       dhdr_free_ctr <= dhdr_free_ctr - 1; \r
+               elsif( (dhdr_free_down = '0') and (dhdr_free_up = '1') ) then\r
+                       dhdr_free_ctr <= dhdr_free_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_DHDR_FREE_COUNTER_PROC;\r
+\r
+dhdr_full_x        <= '1' when (dhdr_free_ctr = "00000") else '0';\r
+\r
+-- A 16x32b DPRAM is used for buffering the DataHeaDeR (DHDR)\r
+THE_DHDR_BUFFER: dhdr_buffer_dpram\r
+port map( WRADDRESS            => dhdr_wr_addr,\r
+                 DATA                  => dhdr_data_in,\r
+                 WRCLOCK               => clk_in, \r
+                 WE                    => dhdr_we_in, \r
+                 WRCLOCKEN             => '1', \r
+                 RDADDRESS             => dhdr_rd_addr, \r
+                 RDCLOCK               => clk_in, \r
+                 RDCLOCKEN             => '1', \r
+                 RESET                 => reset_in, \r
+                 Q                             => dhdr_data\r
+               );\r
+\r
+-- Are there any EDS to work on?\r
+dhdr_available_x <= '1' when (dhdr_wr_addr /= dhdr_rd_addr) else '0';\r
+\r
+-- Debug signals\r
+debug(15 downto 0)  <= (others => '0');\r
+\r
+-- Output signals\r
+dhdr_data_out      <= dhdr_data;\r
+dhdr_available_out <= dhdr_available;\r
+buf_full_out       <= dhdr_full;\r
+buf_level_out      <= dhdr_free_ctr;\r
+debug_out          <= debug;\r
+\r
+end behavioral;\r
diff --git a/src/dhdr_buffer_dpram.lpc b/src/dhdr_buffer_dpram.lpc
new file mode 100644 (file)
index 0000000..705d305
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_DPRAM\r
+CoreRevision=3.4\r
+ModuleName=dhdr_buffer_dpram\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=03/03/2009\r
+Time=16:49:44\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=16\r
+Data=48\r
+LUT=1\r
+MemFile=\r
+MemFormat=orca\r
diff --git a/src/dhdr_buffer_dpram.vhd b/src/dhdr_buffer_dpram.vhd
new file mode 100644 (file)
index 0000000..42c5e0f
--- /dev/null
@@ -0,0 +1,636 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type sdpram -rdata_width 48 -data_width 48 -num_rows 16 -outData REGISTERED -e 
+
+-- Tue Mar 03 16:49:44 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity dhdr_buffer_dpram is
+    port (
+        WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(47 downto 0); 
+        WrClock: in  std_logic; 
+        WE: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(47 downto 0));
+end dhdr_buffer_dpram;
+
+architecture Structure of dhdr_buffer_dpram is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+    signal scuba_vhi: std_logic;
+    signal dataout47_ffin: std_logic;
+    signal dataout46_ffin: std_logic;
+    signal dataout45_ffin: std_logic;
+    signal dataout44_ffin: std_logic;
+    signal dataout43_ffin: std_logic;
+    signal dataout42_ffin: std_logic;
+    signal dataout41_ffin: std_logic;
+    signal dataout40_ffin: std_logic;
+    signal dataout39_ffin: std_logic;
+    signal dataout38_ffin: std_logic;
+    signal dataout37_ffin: std_logic;
+    signal dataout36_ffin: std_logic;
+    signal dataout35_ffin: std_logic;
+    signal dataout34_ffin: std_logic;
+    signal dataout33_ffin: std_logic;
+    signal dataout32_ffin: std_logic;
+    signal dataout31_ffin: std_logic;
+    signal dataout30_ffin: std_logic;
+    signal dataout29_ffin: std_logic;
+    signal dataout28_ffin: std_logic;
+    signal dataout27_ffin: std_logic;
+    signal dataout26_ffin: std_logic;
+    signal dataout25_ffin: std_logic;
+    signal dataout24_ffin: std_logic;
+    signal dataout23_ffin: std_logic;
+    signal dataout22_ffin: std_logic;
+    signal dataout21_ffin: std_logic;
+    signal dataout20_ffin: std_logic;
+    signal dataout19_ffin: std_logic;
+    signal dataout18_ffin: std_logic;
+    signal dataout17_ffin: std_logic;
+    signal dataout16_ffin: std_logic;
+    signal dataout15_ffin: std_logic;
+    signal dataout14_ffin: std_logic;
+    signal dataout13_ffin: std_logic;
+    signal dataout12_ffin: std_logic;
+    signal dataout11_ffin: std_logic;
+    signal dataout10_ffin: std_logic;
+    signal dataout9_ffin: std_logic;
+    signal dataout8_ffin: std_logic;
+    signal dataout7_ffin: std_logic;
+    signal dataout6_ffin: std_logic;
+    signal dataout5_ffin: std_logic;
+    signal dataout4_ffin: std_logic;
+    signal dataout3_ffin: std_logic;
+    signal dataout2_ffin: std_logic;
+    signal dataout1_ffin: std_logic;
+    signal dataout0_ffin: std_logic;
+    signal dec0_wre3: std_logic;
+
+    -- local component declarations
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_0 : label is "0x8000";
+    attribute GSR of FF_47 : label is "ENABLED";
+    attribute GSR of FF_46 : label is "ENABLED";
+    attribute GSR of FF_45 : label is "ENABLED";
+    attribute GSR of FF_44 : label is "ENABLED";
+    attribute GSR of FF_43 : label is "ENABLED";
+    attribute GSR of FF_42 : label is "ENABLED";
+    attribute GSR of FF_41 : label is "ENABLED";
+    attribute GSR of FF_40 : label is "ENABLED";
+    attribute GSR of FF_39 : label is "ENABLED";
+    attribute GSR of FF_38 : label is "ENABLED";
+    attribute GSR of FF_37 : label is "ENABLED";
+    attribute GSR of FF_36 : label is "ENABLED";
+    attribute GSR of FF_35 : label is "ENABLED";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>WE, AD2=>WrClockEn, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec0_wre3);
+
+    FF_47: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout47_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(47));
+
+    FF_46: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout46_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(46));
+
+    FF_45: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout45_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(45));
+
+    FF_44: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout44_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(44));
+
+    FF_43: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout43_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(43));
+
+    FF_42: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout42_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(42));
+
+    FF_41: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout41_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(41));
+
+    FF_40: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout40_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(40));
+
+    FF_39: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout39_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(39));
+
+    FF_38: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout38_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(38));
+
+    FF_37: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout37_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(37));
+
+    FF_36: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout36_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(36));
+
+    FF_35: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout35_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(35));
+
+    FF_34: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout34_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(34));
+
+    FF_33: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout33_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(33));
+
+    FF_32: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout32_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(32));
+
+    FF_31: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout31_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(31));
+
+    FF_30: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout30_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(30));
+
+    FF_29: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout29_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(29));
+
+    FF_28: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout28_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(28));
+
+    FF_27: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout27_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(27));
+
+    FF_26: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout26_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(26));
+
+    FF_25: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout25_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(25));
+
+    FF_24: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout24_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(24));
+
+    FF_23: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout23_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(23));
+
+    FF_22: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout22_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(22));
+
+    FF_21: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout21_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(21));
+
+    FF_20: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout20_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(20));
+
+    FF_19: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout19_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(19));
+
+    FF_18: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout18_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(18));
+
+    FF_17: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout17_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(17));
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout16_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(16));
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout15_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(15));
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout14_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(14));
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout13_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(13));
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout12_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(12));
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout11_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(11));
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout10_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(10));
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout9_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(9));
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout8_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(8));
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout7_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(7));
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout6_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(6));
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout5_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(5));
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout4_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(4));
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout3_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(3));
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout2_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(2));
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout1_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(1));
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout0_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(0));
+
+    mem_0_0: DPR16X4A
+        port map (DI0=>Data(44), DI1=>Data(45), DI2=>Data(46), 
+            DI3=>Data(47), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout44_ffin, 
+            DO1=>dataout45_ffin, DO2=>dataout46_ffin, 
+            DO3=>dataout47_ffin);
+
+    mem_0_1: DPR16X4A
+        port map (DI0=>Data(40), DI1=>Data(41), DI2=>Data(42), 
+            DI3=>Data(43), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout40_ffin, 
+            DO1=>dataout41_ffin, DO2=>dataout42_ffin, 
+            DO3=>dataout43_ffin);
+
+    mem_0_2: DPR16X4A
+        port map (DI0=>Data(36), DI1=>Data(37), DI2=>Data(38), 
+            DI3=>Data(39), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout36_ffin, 
+            DO1=>dataout37_ffin, DO2=>dataout38_ffin, 
+            DO3=>dataout39_ffin);
+
+    mem_0_3: DPR16X4A
+        port map (DI0=>Data(32), DI1=>Data(33), DI2=>Data(34), 
+            DI3=>Data(35), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout32_ffin, 
+            DO1=>dataout33_ffin, DO2=>dataout34_ffin, 
+            DO3=>dataout35_ffin);
+
+    mem_0_4: DPR16X4A
+        port map (DI0=>Data(28), DI1=>Data(29), DI2=>Data(30), 
+            DI3=>Data(31), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout28_ffin, 
+            DO1=>dataout29_ffin, DO2=>dataout30_ffin, 
+            DO3=>dataout31_ffin);
+
+    mem_0_5: DPR16X4A
+        port map (DI0=>Data(24), DI1=>Data(25), DI2=>Data(26), 
+            DI3=>Data(27), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout24_ffin, 
+            DO1=>dataout25_ffin, DO2=>dataout26_ffin, 
+            DO3=>dataout27_ffin);
+
+    mem_0_6: DPR16X4A
+        port map (DI0=>Data(20), DI1=>Data(21), DI2=>Data(22), 
+            DI3=>Data(23), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout20_ffin, 
+            DO1=>dataout21_ffin, DO2=>dataout22_ffin, 
+            DO3=>dataout23_ffin);
+
+    mem_0_7: DPR16X4A
+        port map (DI0=>Data(16), DI1=>Data(17), DI2=>Data(18), 
+            DI3=>Data(19), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout16_ffin, 
+            DO1=>dataout17_ffin, DO2=>dataout18_ffin, 
+            DO3=>dataout19_ffin);
+
+    mem_0_8: DPR16X4A
+        port map (DI0=>Data(12), DI1=>Data(13), DI2=>Data(14), 
+            DI3=>Data(15), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout12_ffin, 
+            DO1=>dataout13_ffin, DO2=>dataout14_ffin, 
+            DO3=>dataout15_ffin);
+
+    mem_0_9: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>Data(11), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout8_ffin, 
+            DO1=>dataout9_ffin, DO2=>dataout10_ffin, DO3=>dataout11_ffin);
+
+    mem_0_10: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout4_ffin, DO1=>dataout5_ffin, 
+            DO2=>dataout6_ffin, DO3=>dataout7_ffin);
+
+    mem_0_11: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout0_ffin, DO1=>dataout1_ffin, 
+            DO2=>dataout2_ffin, DO3=>dataout3_ffin);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of dhdr_buffer_dpram is
+    for Structure
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/dhdr_buffer_dpram_tmpl.vhd b/src/dhdr_buffer_dpram_tmpl.vhd
new file mode 100644 (file)
index 0000000..a3ac36e
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 3.4
+-- Tue Mar 03 16:49:44 2009
+
+-- parameterized module component declaration
+component dhdr_buffer_dpram
+    port (WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(47 downto 0); WrClock: in  std_logic; 
+        WE: in  std_logic; WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; Q: out  std_logic_vector(47 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : dhdr_buffer_dpram
+    port map (WrAddress(3 downto 0)=>__, Data(47 downto 0)=>__, WrClock=>__, 
+        WE=>__, WrClockEn=>__, RdAddress(3 downto 0)=>__, RdClock=>__, 
+        RdClockEn=>__, Reset=>__, Q(47 downto 0)=>__);
diff --git a/src/dll_100m.lpc b/src/dll_100m.lpc
new file mode 100644 (file)
index 0000000..4467a81
--- /dev/null
@@ -0,0 +1,39 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=DLL\r
+CoreRevision=3.2\r
+ModuleName=dll_100m\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=01/29/2009\r
+Time=18:49:16\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+dlltype=Clock Injection Delay Removal\r
+fin=100\r
+clkos_div=1\r
+clkos_ph=0\r
+Mode=CLKOP\r
+Freq=CLKI\r
+Smiports=0\r
+RSTNport=1\r
+reset_en=0\r
+DCNTL=0\r
diff --git a/src/dll_100m.vhd b/src/dll_100m.vhd
new file mode 100644 (file)
index 0000000..079cd32
--- /dev/null
@@ -0,0 +1,126 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.2
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n dll_100m -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type dll -dll_type cid -fin 100 -clkos_div 1 -fb_mode 0 -use_rstn -e 
+
+-- Thu Jan 29 18:49:16 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity dll_100m is
+    port (
+        clk: in  std_logic; 
+        resetn: in  std_logic; 
+        aluhold: in  std_logic; 
+        clkop: out  std_logic; 
+        clkos: out  std_logic; 
+        lock: out  std_logic);
+ attribute dont_touch : string;
+ attribute dont_touch of dll_100m : entity is "true";
+end dll_100m;
+
+architecture Structure of dll_100m is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+    signal clkos_t: std_logic;
+    signal clkop_t: std_logic;
+    signal clk_t: std_logic;
+
+    -- local component declarations
+    component CIDDLLA
+    -- synopsys translate_off
+        generic (ALU_INIT_CNTVAL : in Integer; 
+                ALU_UNLOCK_CNT : in Integer; ALU_LOCK_CNT : in Integer; 
+                GSR : in String; CLKOS_DIV : in Integer; 
+                CLKI_DIV : in Integer; CLKOS_FPHASE : in Integer; 
+                CLKOS_PHASE : in Integer; CLKOP_PHASE : in Integer);
+    -- synopsys translate_on
+        port (CLKI: in  std_logic; CLKFB: in  std_logic; 
+            RSTN: in  std_logic; ALUHOLD: in  std_logic; 
+            SMIADDR9: in  std_logic; SMIADDR8: in  std_logic; 
+            SMIADDR7: in  std_logic; SMIADDR6: in  std_logic; 
+            SMIADDR5: in  std_logic; SMIADDR4: in  std_logic; 
+            SMIADDR3: in  std_logic; SMIADDR2: in  std_logic; 
+            SMIADDR1: in  std_logic; SMIADDR0: in  std_logic; 
+            SMIRD: in  std_logic; SMIWR: in  std_logic; 
+            SMICLK: in  std_logic; SMIWDATA: in  std_logic; 
+            SMIRSTN: in  std_logic; CLKOP: out  std_logic; 
+            CLKOS: out  std_logic; LOCK: out  std_logic; 
+            SMIRDATA: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute FREQUENCY_PIN_CLKOS : string; 
+    attribute FREQUENCY_PIN_CLKOP : string; 
+    attribute FREQUENCY_PIN_CLKI : string; 
+    attribute GSR : string; 
+    attribute CLKFB_PDEL : string; 
+    attribute CLKI_PDEL : string; 
+    attribute ALU_INIT_CNTVAL : string; 
+    attribute ALU_UNLOCK_CNT : string; 
+    attribute ALU_LOCK_CNT : string; 
+    attribute CLKI_DIV : string; 
+    attribute CLKOS_DIV : string; 
+    attribute CLKOS_FPHASE : string; 
+    attribute CLKOS_PHASE : string; 
+    attribute CLKOP_PHASE : string; 
+    attribute FREQUENCY_PIN_CLKOS of dll_100m_0_0 : label is "100.000000";
+    attribute FREQUENCY_PIN_CLKOP of dll_100m_0_0 : label is "100.000000";
+    attribute FREQUENCY_PIN_CLKI of dll_100m_0_0 : label is "100.000000";
+    attribute GSR of dll_100m_0_0 : label is "DISABLED";
+    attribute CLKFB_PDEL of dll_100m_0_0 : label is "DEL0";
+    attribute CLKI_PDEL of dll_100m_0_0 : label is "DEL0";
+    attribute ALU_INIT_CNTVAL of dll_100m_0_0 : label is "0";
+    attribute ALU_UNLOCK_CNT of dll_100m_0_0 : label is "3";
+    attribute ALU_LOCK_CNT of dll_100m_0_0 : label is "3";
+    attribute CLKI_DIV of dll_100m_0_0 : label is "1";
+    attribute CLKOS_DIV of dll_100m_0_0 : label is "1";
+    attribute CLKOS_FPHASE of dll_100m_0_0 : label is "0";
+    attribute CLKOS_PHASE of dll_100m_0_0 : label is "270";
+    attribute CLKOP_PHASE of dll_100m_0_0 : label is "270";
+    attribute syn_keep : boolean;
+    attribute syn_noprune : boolean;
+    attribute syn_noprune of Structure : architecture is true;
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    dll_100m_0_0: CIDDLLA
+        -- synopsys translate_off
+        generic map (GSR=> "DISABLED", ALU_INIT_CNTVAL=>  0, 
+        ALU_UNLOCK_CNT=>  3, ALU_LOCK_CNT=>  3, CLKI_DIV=>  1, CLKOS_DIV=>  1, 
+        CLKOS_FPHASE=>  0, CLKOS_PHASE=>  270, CLKOP_PHASE=>  270)
+        -- synopsys translate_on
+        port map (CLKI=>clk_t, CLKFB=>clkop_t, RSTN=>resetn, 
+            ALUHOLD=>aluhold, SMIADDR9=>scuba_vlo, SMIADDR8=>scuba_vlo, 
+            SMIADDR7=>scuba_vlo, SMIADDR6=>scuba_vlo, 
+            SMIADDR5=>scuba_vlo, SMIADDR4=>scuba_vlo, 
+            SMIADDR3=>scuba_vlo, SMIADDR2=>scuba_vlo, 
+            SMIADDR1=>scuba_vlo, SMIADDR0=>scuba_vlo, SMIRD=>scuba_vlo, 
+            SMIWR=>scuba_vlo, SMICLK=>scuba_vlo, SMIWDATA=>scuba_vlo, 
+            SMIRSTN=>scuba_vlo, CLKOP=>clkop_t, CLKOS=>clkos_t, 
+            LOCK=>lock, SMIRDATA=>open);
+
+    clkos <= clkos_t;
+    clkop <= clkop_t;
+    clk_t <= clk;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of dll_100m is
+    for Structure
+        for all:CIDDLLA use entity ecp2m.CIDDLLA(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/dll_100m_tmpl.vhd b/src/dll_100m_tmpl.vhd
new file mode 100644 (file)
index 0000000..dfc2502
--- /dev/null
@@ -0,0 +1,15 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.2
+-- Thu Jan 29 18:49:16 2009
+
+-- parameterized module component declaration
+component dll_100m
+    port (clk: in  std_logic; resetn: in  std_logic; 
+        aluhold: in  std_logic; clkop: out  std_logic; 
+        clkos: out  std_logic; lock: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : dll_100m
+    port map (clk=>__, resetn=>__, aluhold=>__, clkop=>__, clkos=>__, 
+        lock=>__);
diff --git a/src/dpram_8x19.lpc b/src/dpram_8x19.lpc
new file mode 100644 (file)
index 0000000..b215053
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_DPRAM\r
+CoreRevision=3.4\r
+ModuleName=dpram_8x19\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/20/2009\r
+Time=19:14:27\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=16\r
+Data=19\r
+LUT=0\r
+MemFile=\r
+MemFormat=orca\r
diff --git a/src/dpram_8x19.srp b/src/dpram_8x19.srp
new file mode 100644 (file)
index 0000000..ded8bac
--- /dev/null
@@ -0,0 +1,32 @@
+SCUBA, Version ispLever_v72_PROD_Build (44)
+Fri Nov 20 19:14:28 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -n dpram_8x19 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type ramdps -raddr_width 4 -rwidth 19 -waddr_width 4 -wwidth 19 -rnum_words 16 -wnum_words 16 -outData UNREGISTERED -e 
+    Circuit name     : dpram_8x19
+    Module type      : sdpram
+    Module Version   : 3.4
+    Address width    : 4
+    Ports            : 
+       Inputs       : WrAddress[3:0], Data[18:0], WrClock, WE, WrClockEn, RdAddress[3:0]
+       Outputs      : Q[18:0]
+    I/O buffer       : not inserted
+    Clock edge       : rising edge
+    EDIF output      : suppressed
+    VHDL output      : dpram_8x19.vhd
+    VHDL template    : dpram_8x19_tmpl.vhd
+    VHDL testbench    : tb_dpram_8x19_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : dpram_8x19.srp
+    Element Usage    :
+        ROM16X1 : 1
+       DPR16X4A : 5
+    Estimated Resource Usage:
+            LUT : 1
+           DRAM : 5
diff --git a/src/dpram_8x19.vhd b/src/dpram_8x19.vhd
new file mode 100644 (file)
index 0000000..771e6ca
--- /dev/null
@@ -0,0 +1,127 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.4
+--F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type sdpram -rdata_width 19 -data_width 19 -num_rows 16 -outData UNREGISTERED -e 
+
+-- Fri Nov 20 19:14:28 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity dpram_8x19 is
+    port (
+        WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(18 downto 0); 
+        WrClock: in  std_logic; 
+        WE: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        Q: out  std_logic_vector(18 downto 0));
+end dpram_8x19;
+
+architecture Structure of dpram_8x19 is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal scuba_vlo: std_logic;
+    signal dec0_wre3: std_logic;
+
+    -- local component declarations
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of LUT4_0 : label is "0x8000";
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>WE, AD2=>WrClockEn, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec0_wre3);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    mem_0_0: DPR16X4A
+        port map (DI0=>Data(16), DI1=>Data(17), DI2=>Data(18), 
+            DI3=>scuba_vlo, WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>Q(16), 
+            DO1=>Q(17), DO2=>Q(18), DO3=>open);
+
+    mem_0_1: DPR16X4A
+        port map (DI0=>Data(12), DI1=>Data(13), DI2=>Data(14), 
+            DI3=>Data(15), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>Q(12), 
+            DO1=>Q(13), DO2=>Q(14), DO3=>Q(15));
+
+    mem_0_2: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>Data(11), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>Q(8), DO1=>Q(9), 
+            DO2=>Q(10), DO3=>Q(11));
+
+    mem_0_3: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>Q(4), DO1=>Q(5), DO2=>Q(6), 
+            DO3=>Q(7));
+
+    mem_0_4: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>Q(0), DO1=>Q(1), DO2=>Q(2), 
+            DO3=>Q(3));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of dpram_8x19 is
+    for Structure
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/dpram_8x19_generate.log b/src/dpram_8x19_generate.log
new file mode 100644 (file)
index 0000000..f50d5d2
--- /dev/null
@@ -0,0 +1,48 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_PROD_Build (44)\r
+Fri Nov 20 19:14:28 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -n dpram_8x19 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type ramdps -raddr_width 4 -rwidth 19 -waddr_width 4 -wwidth 19 -rnum_words 16 -wnum_words 16 -outData UNREGISTERED -e \r
+    Circuit name     : dpram_8x19\r
+    Module type      : sdpram\r
+    Module Version   : 3.4\r
+    Address width    : 4\r
+    Data width       : 19\r
+    Ports            : \r
+       Inputs       : WrAddress[3:0], Data[18:0], WrClock, WE, WrClockEn, RdAddress[3:0]\r
+       Outputs      : Q[18:0]\r
+    I/O buffer       : not inserted\r
+    Clock edge       : rising edge\r
+    EDIF output      : suppressed\r
+    VHDL output      : dpram_8x19.vhd\r
+    VHDL template    : dpram_8x19_tmpl.vhd\r
+    VHDL testbench   : tb_dpram_8x19_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : dpram_8x19.srp\r
+    Estimated Resource Usage:\r
+            LUT : 1\r
+           DRAM : 5\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\dpram_8x19.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/dpram_8x19_tmpl.vhd b/src/dpram_8x19_tmpl.vhd
new file mode 100644 (file)
index 0000000..9985f90
--- /dev/null
@@ -0,0 +1,17 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 3.4
+-- Fri Nov 20 19:14:28 2009
+
+-- parameterized module component declaration
+component dpram_8x19
+    port (WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(18 downto 0); WrClock: in  std_logic; 
+        WE: in  std_logic; WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        Q: out  std_logic_vector(18 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : dpram_8x19
+    port map (WrAddress(3 downto 0)=>__, Data(18 downto 0)=>__, WrClock=>__, 
+        WE=>__, WrClockEn=>__, RdAddress(3 downto 0)=>__, Q(18 downto 0)=>__);
diff --git a/src/eds_buf.vhd b/src/eds_buf.vhd
new file mode 100644 (file)
index 0000000..446ffbb
--- /dev/null
@@ -0,0 +1,130 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity eds_buf is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                      : in    std_logic; \r
+                 -- EDS input, all synced to CLK_IN\r
+                 EDS_DATA_IN           : in    std_logic_vector(39 downto 0); -- EDS data input\r
+                 EDS_WE_IN                     : in    std_logic; -- EDS write enable\r
+                 EDS_DONE_IN           : in    std_logic; -- release EDS \r
+                 EDS_DATA_OUT          : out   std_logic_vector(39 downto 0);\r
+                 EDS_AVAILABLE_OUT     : out   std_logic;\r
+                 -- trigger busy information\r
+                 BUF_FULL_OUT          : out   std_logic;\r
+                 BUF_LEVEL_OUT         : out   std_logic_vector(4 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of eds_buf is\r
+\r
+       -- normal signals\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+\r
+       -- Signals for controlling the EDS buffer memory\r
+       signal eds_data                 : std_logic_vector(39 downto 0);\r
+       signal eds_rd_addr              : std_logic_vector(3 downto 0);\r
+       signal eds_wr_addr              : std_logic_vector(3 downto 0);\r
+       signal eds_wr                   : std_logic;\r
+       signal eds_rd                   : std_logic;\r
+       signal eds_free_ctr             : std_logic_vector(4 downto 0); -- fill level counter\r
+       signal eds_free_up              : std_logic;\r
+       signal eds_free_down    : std_logic;\r
+       signal eds_available_x  : std_logic; \r
+       signal eds_available    : std_logic; -- at least one valid EDS entry is available\r
+       signal eds_full_x               : std_logic;\r
+       signal eds_full                 : std_logic;\r
+       \r
+begin\r
+\r
+-- General process for syncing combinatorial signals\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               eds_available  <= eds_available_x;\r
+               eds_full       <= eds_full_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- Write address pointer for EDS buffer\r
+eds_wr <= eds_we_in;\r
+\r
+THE_WR_ADDR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       eds_wr_addr <= (others => '0');\r
+               elsif( eds_wr = '1' ) then\r
+                       eds_wr_addr <= eds_wr_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_WR_ADDR_PROC;\r
+\r
+-- Read address pointer for EDS buffer\r
+eds_rd <= eds_done_in;\r
+\r
+THE_RD_ADDR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       eds_rd_addr <= (others => '0');\r
+               elsif( eds_rd = '1' ) then\r
+                       eds_rd_addr <= eds_rd_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_RD_ADDR_PROC;\r
+\r
+-- Buffer fill level counter\r
+eds_free_down <= eds_we_in;\r
+eds_free_up   <= eds_done_in;\r
+\r
+THE_EDS_FREE_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       eds_free_ctr <= "10000";\r
+               elsif( eds_free_down = '1' and eds_free_up = '0' ) then\r
+                       eds_free_ctr <= eds_free_ctr - 1; \r
+               elsif( eds_free_down = '0' and eds_free_up = '1' ) then\r
+                       eds_free_ctr <= eds_free_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_EDS_FREE_COUNTER_PROC;\r
+\r
+eds_full_x        <= '1' when (eds_free_ctr = "00000") else '0';\r
+\r
+-- A 16x40b DPRAM is used for buffering the EventDataSheets (EDS)\r
+THE_EDS_BUFFER: eds_buffer_dpram\r
+port map( WRADDRESS            => eds_wr_addr,\r
+                 DATA                  => eds_data_in,\r
+                 WRCLOCK               => clk_in, \r
+                 WE                    => eds_we_in, \r
+                 WRCLOCKEN             => '1', \r
+                 RDADDRESS             => eds_rd_addr, \r
+                 RDCLOCK               => clk_in, \r
+                 RDCLOCKEN             => '1', \r
+                 RESET                 => reset_in, \r
+                 Q                             => eds_data\r
+               );\r
+\r
+-- Are there any EDS to work on?\r
+eds_available_x <= '1' when (eds_wr_addr /= eds_rd_addr) else '0';\r
+\r
+-- Debug signals\r
+debug(15 downto 0)  <= (others => '0');\r
+\r
+-- Output signals\r
+eds_data_out      <= eds_data;\r
+eds_available_out <= eds_available;\r
+buf_full_out      <= eds_full;\r
+buf_level_out     <= eds_free_ctr;\r
+debug_out         <= debug;\r
+\r
+end behavioral;\r
diff --git a/src/eds_buffer_dpram.lpc b/src/eds_buffer_dpram.lpc
new file mode 100644 (file)
index 0000000..604c395
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M35E\r
+PartName=LFE2M35E-6F672C\r
+SpeedGrade=-6\r
+Package=FPBGA672\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_DPRAM\r
+CoreRevision=3.3\r
+ModuleName=eds_buffer_dpram\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=08/29/2008\r
+Time=14:24:36\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=16\r
+Data=40\r
+LUT=1\r
+MemFile=\r
+MemFormat=orca\r
diff --git a/src/eds_buffer_dpram.vhd b/src/eds_buffer_dpram.vhd
new file mode 100644 (file)
index 0000000..2b3d495
--- /dev/null
@@ -0,0 +1,546 @@
+-- VHDL netlist generated by SCUBA ispLever_v71_PROD_Build (58)
+-- Module  Version: 3.3
+--X:\Programme\ispTOOLS_71\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type sdpram -rdata_width 40 -data_width 40 -num_rows 16 -outData REGISTERED -e 
+
+-- Fri Aug 29 14:24:36 2008
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity eds_buffer_dpram is
+    port (
+        WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(39 downto 0); 
+        WrClock: in  std_logic; 
+        WE: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(39 downto 0));
+end eds_buffer_dpram;
+
+architecture Structure of eds_buffer_dpram is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+    signal scuba_vhi: std_logic;
+    signal dataout39_ffin: std_logic;
+    signal dataout38_ffin: std_logic;
+    signal dataout37_ffin: std_logic;
+    signal dataout36_ffin: std_logic;
+    signal dataout35_ffin: std_logic;
+    signal dataout34_ffin: std_logic;
+    signal dataout33_ffin: std_logic;
+    signal dataout32_ffin: std_logic;
+    signal dataout31_ffin: std_logic;
+    signal dataout30_ffin: std_logic;
+    signal dataout29_ffin: std_logic;
+    signal dataout28_ffin: std_logic;
+    signal dataout27_ffin: std_logic;
+    signal dataout26_ffin: std_logic;
+    signal dataout25_ffin: std_logic;
+    signal dataout24_ffin: std_logic;
+    signal dataout23_ffin: std_logic;
+    signal dataout22_ffin: std_logic;
+    signal dataout21_ffin: std_logic;
+    signal dataout20_ffin: std_logic;
+    signal dataout19_ffin: std_logic;
+    signal dataout18_ffin: std_logic;
+    signal dataout17_ffin: std_logic;
+    signal dataout16_ffin: std_logic;
+    signal dataout15_ffin: std_logic;
+    signal dataout14_ffin: std_logic;
+    signal dataout13_ffin: std_logic;
+    signal dataout12_ffin: std_logic;
+    signal dataout11_ffin: std_logic;
+    signal dataout10_ffin: std_logic;
+    signal dataout9_ffin: std_logic;
+    signal dataout8_ffin: std_logic;
+    signal dataout7_ffin: std_logic;
+    signal dataout6_ffin: std_logic;
+    signal dataout5_ffin: std_logic;
+    signal dataout4_ffin: std_logic;
+    signal dataout3_ffin: std_logic;
+    signal dataout2_ffin: std_logic;
+    signal dataout1_ffin: std_logic;
+    signal dataout0_ffin: std_logic;
+    signal dec_wre3: std_logic;
+
+    -- local component declarations
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_0 : label is "0x8000";
+    attribute GSR of FF_39 : label is "ENABLED";
+    attribute GSR of FF_38 : label is "ENABLED";
+    attribute GSR of FF_37 : label is "ENABLED";
+    attribute GSR of FF_36 : label is "ENABLED";
+    attribute GSR of FF_35 : label is "ENABLED";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>WE, AD2=>WrClockEn, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec_wre3);
+
+    FF_39: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout39_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(39));
+
+    FF_38: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout38_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(38));
+
+    FF_37: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout37_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(37));
+
+    FF_36: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout36_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(36));
+
+    FF_35: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout35_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(35));
+
+    FF_34: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout34_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(34));
+
+    FF_33: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout33_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(33));
+
+    FF_32: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout32_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(32));
+
+    FF_31: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout31_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(31));
+
+    FF_30: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout30_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(30));
+
+    FF_29: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout29_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(29));
+
+    FF_28: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout28_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(28));
+
+    FF_27: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout27_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(27));
+
+    FF_26: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout26_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(26));
+
+    FF_25: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout25_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(25));
+
+    FF_24: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout24_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(24));
+
+    FF_23: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout23_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(23));
+
+    FF_22: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout22_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(22));
+
+    FF_21: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout21_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(21));
+
+    FF_20: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout20_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(20));
+
+    FF_19: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout19_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(19));
+
+    FF_18: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout18_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(18));
+
+    FF_17: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout17_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(17));
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout16_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(16));
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout15_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(15));
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout14_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(14));
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout13_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(13));
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout12_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(12));
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout11_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(11));
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout10_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(10));
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout9_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(9));
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout8_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(8));
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout7_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(7));
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout6_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(6));
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout5_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(5));
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout4_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(4));
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout3_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(3));
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout2_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(2));
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout1_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(1));
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout0_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(0));
+
+    mem_0_0: DPR16X4A
+        port map (DI0=>Data(36), DI1=>Data(37), DI2=>Data(38), 
+            DI3=>Data(39), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout36_ffin, 
+            DO1=>dataout37_ffin, DO2=>dataout38_ffin, 
+            DO3=>dataout39_ffin);
+
+    mem_0_1: DPR16X4A
+        port map (DI0=>Data(32), DI1=>Data(33), DI2=>Data(34), 
+            DI3=>Data(35), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout32_ffin, 
+            DO1=>dataout33_ffin, DO2=>dataout34_ffin, 
+            DO3=>dataout35_ffin);
+
+    mem_0_2: DPR16X4A
+        port map (DI0=>Data(28), DI1=>Data(29), DI2=>Data(30), 
+            DI3=>Data(31), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout28_ffin, 
+            DO1=>dataout29_ffin, DO2=>dataout30_ffin, 
+            DO3=>dataout31_ffin);
+
+    mem_0_3: DPR16X4A
+        port map (DI0=>Data(24), DI1=>Data(25), DI2=>Data(26), 
+            DI3=>Data(27), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout24_ffin, 
+            DO1=>dataout25_ffin, DO2=>dataout26_ffin, 
+            DO3=>dataout27_ffin);
+
+    mem_0_4: DPR16X4A
+        port map (DI0=>Data(20), DI1=>Data(21), DI2=>Data(22), 
+            DI3=>Data(23), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout20_ffin, 
+            DO1=>dataout21_ffin, DO2=>dataout22_ffin, 
+            DO3=>dataout23_ffin);
+
+    mem_0_5: DPR16X4A
+        port map (DI0=>Data(16), DI1=>Data(17), DI2=>Data(18), 
+            DI3=>Data(19), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout16_ffin, 
+            DO1=>dataout17_ffin, DO2=>dataout18_ffin, 
+            DO3=>dataout19_ffin);
+
+    mem_0_6: DPR16X4A
+        port map (DI0=>Data(12), DI1=>Data(13), DI2=>Data(14), 
+            DI3=>Data(15), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout12_ffin, 
+            DO1=>dataout13_ffin, DO2=>dataout14_ffin, 
+            DO3=>dataout15_ffin);
+
+    mem_0_7: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>Data(11), WCK=>WrClock, WRE=>dec_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout8_ffin, 
+            DO1=>dataout9_ffin, DO2=>dataout10_ffin, DO3=>dataout11_ffin);
+
+    mem_0_8: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>WrClock, WRE=>dec_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout4_ffin, DO1=>dataout5_ffin, 
+            DO2=>dataout6_ffin, DO3=>dataout7_ffin);
+
+    mem_0_9: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>WrClock, WRE=>dec_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout0_ffin, DO1=>dataout1_ffin, 
+            DO2=>dataout2_ffin, DO3=>dataout3_ffin);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of eds_buffer_dpram is
+    for Structure
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/eds_buffer_dpram_tmpl.vhd b/src/eds_buffer_dpram_tmpl.vhd
new file mode 100644 (file)
index 0000000..95c9ae0
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v71_PROD_Build (58)
+-- Module  Version: 3.3
+-- Fri Aug 29 14:24:36 2008
+
+-- parameterized module component declaration
+component eds_buffer_dpram
+    port (WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(39 downto 0); WrClock: in  std_logic; 
+        WE: in  std_logic; WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; Q: out  std_logic_vector(39 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : eds_buffer_dpram
+    port map (WrAddress(3 downto 0)=>__, Data(39 downto 0)=>__, WrClock=>__, 
+        WE=>__, WrClockEn=>__, RdAddress(3 downto 0)=>__, RdClock=>__, 
+        RdClockEn=>__, Reset=>__, Q(39 downto 0)=>__);
diff --git a/src/fifo_16x11.lpc b/src/fifo_16x11.lpc
new file mode 100644 (file)
index 0000000..49a7243
--- /dev/null
@@ -0,0 +1,44 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=FIFO\r
+CoreRevision=4.5\r
+ModuleName=fifo_16x11\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=03/03/2009\r
+Time=16:26:00\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+FIFOImp=LUT Based\r
+Depth=16\r
+Width=11\r
+regout=0\r
+CtrlByRdEn=0\r
+EmpFlg=0\r
+PeMode=Static - Single Threshold\r
+PeAssert=10\r
+PeDeassert=12\r
+FullFlg=0\r
+PfMode=Static - Single Threshold\r
+PfAssert=508\r
+PfDeassert=506\r
+RDataCount=1\r
+EnECC=0\r
diff --git a/src/fifo_16x11.vhd b/src/fifo_16x11.vhd
new file mode 100644 (file)
index 0000000..6214fe8
--- /dev/null
@@ -0,0 +1,616 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.5
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ebfifo -pfu_fifo -depth 16 -width 11 -depth 16 -no_enable -pe -1 -pf -1 -fill -e 
+
+-- Tue Mar 03 16:26:00 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity fifo_16x11 is
+    port (
+        Data: in  std_logic_vector(10 downto 0); 
+        Clock: in  std_logic; 
+        WrEn: in  std_logic; 
+        RdEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(10 downto 0); 
+        WCNT: out  std_logic_vector(4 downto 0); 
+        Empty: out  std_logic; 
+        Full: out  std_logic);
+end fifo_16x11;
+
+architecture Structure of fifo_16x11 is
+
+    -- internal signal declarations
+    signal invout_1: std_logic;
+    signal invout_0: std_logic;
+    signal rden_i_inv: std_logic;
+    signal fcnt_en: std_logic;
+    signal empty_i: std_logic;
+    signal empty_d: std_logic;
+    signal full_i: std_logic;
+    signal full_d: std_logic;
+    signal ifcount_0: std_logic;
+    signal ifcount_1: std_logic;
+    signal bdcnt_bctr_ci: std_logic;
+    signal ifcount_2: std_logic;
+    signal ifcount_3: std_logic;
+    signal co0: std_logic;
+    signal ifcount_4: std_logic;
+    signal co2: std_logic;
+    signal cnt_con: std_logic;
+    signal co1: std_logic;
+    signal cmp_ci: std_logic;
+    signal rden_i: std_logic;
+    signal co0_1: std_logic;
+    signal co1_1: std_logic;
+    signal cmp_le_1: std_logic;
+    signal cmp_le_1_c: std_logic;
+    signal cmp_ci_1: std_logic;
+    signal fcount_0: std_logic;
+    signal fcount_1: std_logic;
+    signal co0_2: std_logic;
+    signal wren_i: std_logic;
+    signal fcount_2: std_logic;
+    signal fcount_3: std_logic;
+    signal co1_2: std_logic;
+    signal wren_i_inv: std_logic;
+    signal fcount_4: std_logic;
+    signal cmp_ge_d1: std_logic;
+    signal cmp_ge_d1_c: std_logic;
+    signal iwcount_0: std_logic;
+    signal iwcount_1: std_logic;
+    signal w_ctr_ci: std_logic;
+    signal iwcount_2: std_logic;
+    signal iwcount_3: std_logic;
+    signal co0_3: std_logic;
+    signal iwcount_4: std_logic;
+    signal co2_1: std_logic;
+    signal wcount_4: std_logic;
+    signal co1_3: std_logic;
+    signal scuba_vhi: std_logic;
+    signal ircount_0: std_logic;
+    signal ircount_1: std_logic;
+    signal r_ctr_ci: std_logic;
+    signal ircount_2: std_logic;
+    signal ircount_3: std_logic;
+    signal co0_4: std_logic;
+    signal ircount_4: std_logic;
+    signal co2_2: std_logic;
+    signal rcount_4: std_logic;
+    signal co1_4: std_logic;
+    signal rdataout10: std_logic;
+    signal rdataout9: std_logic;
+    signal rdataout8: std_logic;
+    signal scuba_vlo: std_logic;
+    signal rdataout7: std_logic;
+    signal rdataout6: std_logic;
+    signal rdataout5: std_logic;
+    signal rdataout4: std_logic;
+    signal rdataout3: std_logic;
+    signal rdataout2: std_logic;
+    signal rdataout1: std_logic;
+    signal rdataout0: std_logic;
+    signal rcount_3: std_logic;
+    signal rcount_2: std_logic;
+    signal rcount_1: std_logic;
+    signal rcount_0: std_logic;
+    signal dec0_wre3: std_logic;
+    signal wcount_3: std_logic;
+    signal wcount_2: std_logic;
+    signal wcount_1: std_logic;
+    signal wcount_0: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component ALEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; LE: out  std_logic);
+    end component;
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component CU2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CO: out  std_logic; NC0: out  std_logic; NC1: out  std_logic);
+    end component;
+    component CB2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CON: in  std_logic; CO: out  std_logic; NC0: out  std_logic; 
+            NC1: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1S3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; PD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component FD1S3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; CD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component XOR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_2 : label is "0x3232";
+    attribute initval of LUT4_1 : label is "0x3232";
+    attribute initval of LUT4_0 : label is "0x8000";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    AND2_t3: AND2
+        port map (A=>WrEn, B=>invout_1, Z=>wren_i);
+
+    INV_3: INV
+        port map (A=>full_i, Z=>invout_1);
+
+    AND2_t2: AND2
+        port map (A=>RdEn, B=>invout_0, Z=>rden_i);
+
+    INV_2: INV
+        port map (A=>empty_i, Z=>invout_0);
+
+    AND2_t1: AND2
+        port map (A=>wren_i, B=>rden_i_inv, Z=>cnt_con);
+
+    XOR2_t0: XOR2
+        port map (A=>wren_i, B=>rden_i, Z=>fcnt_en);
+
+    INV_1: INV
+        port map (A=>rden_i, Z=>rden_i_inv);
+
+    INV_0: INV
+        port map (A=>wren_i, Z=>wren_i_inv);
+
+    LUT4_2: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_le_1, AD1=>wren_i, 
+            AD0=>empty_i, DO0=>empty_d);
+
+    LUT4_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_ge_d1, AD1=>rden_i, 
+            AD0=>full_i, DO0=>full_d);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vhi, AD2=>wren_i, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec0_wre3);
+
+    FF_27: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_0, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_0);
+
+    FF_26: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_1, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_1);
+
+    FF_25: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_2, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_2);
+
+    FF_24: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_3, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_3);
+
+    FF_23: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_4, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_4);
+
+    FF_22: FD1S3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>empty_d, CK=>Clock, PD=>Reset, Q=>empty_i);
+
+    FF_21: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>full_d, CK=>Clock, CD=>Reset, Q=>full_i);
+
+    FF_20: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_0, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_0);
+
+    FF_19: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_1, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_1);
+
+    FF_18: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_2, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_2);
+
+    FF_17: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_3, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_3);
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_4, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_4);
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_0, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_0);
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_1, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_1);
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_2, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_2);
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_3, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_3);
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_4, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_4);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout0, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(0));
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout1, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(1));
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout2, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(2));
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout3, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(3));
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout4, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(4));
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout5, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(5));
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout6, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(6));
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout7, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(7));
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout8, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(8));
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout9, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(9));
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rdataout10, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>Q(10));
+
+    bdcnt_bctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>cnt_con, B0=>scuba_vlo, B1=>cnt_con, 
+            CI=>scuba_vlo, COUT=>bdcnt_bctr_ci, S0=>open, S1=>open);
+
+    bdcnt_bctr_0: CB2
+        port map (CI=>bdcnt_bctr_ci, PC0=>fcount_0, PC1=>fcount_1, 
+            CON=>cnt_con, CO=>co0, NC0=>ifcount_0, NC1=>ifcount_1);
+
+    bdcnt_bctr_1: CB2
+        port map (CI=>co0, PC0=>fcount_2, PC1=>fcount_3, CON=>cnt_con, 
+            CO=>co1, NC0=>ifcount_2, NC1=>ifcount_3);
+
+    bdcnt_bctr_2: CB2
+        port map (CI=>co1, PC0=>fcount_4, PC1=>scuba_vlo, CON=>cnt_con, 
+            CO=>co2, NC0=>ifcount_4, NC1=>open);
+
+    e_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, 
+            S1=>open);
+
+    e_cmp_0: ALEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>rden_i, B1=>scuba_vlo, 
+            CI=>cmp_ci, LE=>co0_1);
+
+    e_cmp_1: ALEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co0_1, LE=>co1_1);
+
+    e_cmp_2: ALEB2
+        port map (A0=>fcount_4, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co1_1, LE=>cmp_le_1_c);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_le_1_c, COUT=>open, S0=>cmp_le_1, 
+            S1=>open);
+
+    g_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci_1, S0=>open, 
+            S1=>open);
+
+    g_cmp_0: AGEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>wren_i, B1=>wren_i, 
+            CI=>cmp_ci_1, GE=>co0_2);
+
+    g_cmp_1: AGEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>wren_i, B1=>wren_i, 
+            CI=>co0_2, GE=>co1_2);
+
+    g_cmp_2: AGEB2
+        port map (A0=>fcount_4, A1=>scuba_vlo, B0=>wren_i_inv, 
+            B1=>scuba_vlo, CI=>co1_2, GE=>cmp_ge_d1_c);
+
+    a1: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_ge_d1_c, COUT=>open, S0=>cmp_ge_d1, 
+            S1=>open);
+
+    w_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>w_ctr_ci, S0=>open, 
+            S1=>open);
+
+    w_ctr_0: CU2
+        port map (CI=>w_ctr_ci, PC0=>wcount_0, PC1=>wcount_1, CO=>co0_3, 
+            NC0=>iwcount_0, NC1=>iwcount_1);
+
+    w_ctr_1: CU2
+        port map (CI=>co0_3, PC0=>wcount_2, PC1=>wcount_3, CO=>co1_3, 
+            NC0=>iwcount_2, NC1=>iwcount_3);
+
+    w_ctr_2: CU2
+        port map (CI=>co1_3, PC0=>wcount_4, PC1=>scuba_vlo, CO=>co2_1, 
+            NC0=>iwcount_4, NC1=>open);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    r_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>r_ctr_ci, S0=>open, 
+            S1=>open);
+
+    r_ctr_0: CU2
+        port map (CI=>r_ctr_ci, PC0=>rcount_0, PC1=>rcount_1, CO=>co0_4, 
+            NC0=>ircount_0, NC1=>ircount_1);
+
+    r_ctr_1: CU2
+        port map (CI=>co0_4, PC0=>rcount_2, PC1=>rcount_3, CO=>co1_4, 
+            NC0=>ircount_2, NC1=>ircount_3);
+
+    r_ctr_2: CU2
+        port map (CI=>co1_4, PC0=>rcount_4, PC1=>scuba_vlo, CO=>co2_2, 
+            NC0=>ircount_4, NC1=>open);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    fifo_pfu_0_0: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>scuba_vlo, WCK=>Clock, WRE=>dec0_wre3, RAD0=>rcount_0, 
+            RAD1=>rcount_1, RAD2=>rcount_2, RAD3=>rcount_3, 
+            WAD0=>wcount_0, WAD1=>wcount_1, WAD2=>wcount_2, 
+            WAD3=>wcount_3, DO0=>rdataout8, DO1=>rdataout9, 
+            DO2=>rdataout10, DO3=>open);
+
+    fifo_pfu_0_1: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>Clock, WRE=>dec0_wre3, RAD0=>rcount_0, RAD1=>rcount_1, 
+            RAD2=>rcount_2, RAD3=>rcount_3, WAD0=>wcount_0, 
+            WAD1=>wcount_1, WAD2=>wcount_2, WAD3=>wcount_3, 
+            DO0=>rdataout4, DO1=>rdataout5, DO2=>rdataout6, 
+            DO3=>rdataout7);
+
+    fifo_pfu_0_2: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>Clock, WRE=>dec0_wre3, RAD0=>rcount_0, RAD1=>rcount_1, 
+            RAD2=>rcount_2, RAD3=>rcount_3, WAD0=>wcount_0, 
+            WAD1=>wcount_1, WAD2=>wcount_2, WAD3=>wcount_3, 
+            DO0=>rdataout0, DO1=>rdataout1, DO2=>rdataout2, 
+            DO3=>rdataout3);
+
+    WCNT(0) <= fcount_0;
+    WCNT(1) <= fcount_1;
+    WCNT(2) <= fcount_2;
+    WCNT(3) <= fcount_3;
+    WCNT(4) <= fcount_4;
+    Empty <= empty_i;
+    Full <= full_i;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of fifo_16x11 is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:ALEB2 use entity ecp2m.ALEB2(V); end for;
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:CU2 use entity ecp2m.CU2(V); end for;
+        for all:CB2 use entity ecp2m.CB2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:FD1S3BX use entity ecp2m.FD1S3BX(V); end for;
+        for all:FD1S3DX use entity ecp2m.FD1S3DX(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:XOR2 use entity ecp2m.XOR2(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/fifo_16x11_tmpl.vhd b/src/fifo_16x11_tmpl.vhd
new file mode 100644 (file)
index 0000000..5e157c8
--- /dev/null
@@ -0,0 +1,18 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.5
+-- Tue Mar 03 16:26:00 2009
+
+-- parameterized module component declaration
+component fifo_16x11
+    port (Data: in  std_logic_vector(10 downto 0); Clock: in  std_logic; 
+        WrEn: in  std_logic; RdEn: in  std_logic; Reset: in  std_logic; 
+        Q: out  std_logic_vector(10 downto 0); 
+        WCNT: out  std_logic_vector(4 downto 0); Empty: out  std_logic; 
+        Full: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : fifo_16x11
+    port map (Data(10 downto 0)=>__, Clock=>__, WrEn=>__, RdEn=>__, 
+        Reset=>__, Q(10 downto 0)=>__, WCNT(4 downto 0)=>__, Empty=>__, 
+        Full=>__);
diff --git a/src/fifo_2kx27.lpc b/src/fifo_2kx27.lpc
new file mode 100644 (file)
index 0000000..77bc0d4
--- /dev/null
@@ -0,0 +1,44 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=FIFO\r
+CoreRevision=4.5\r
+ModuleName=fifo_2kx27\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=02/27/2009\r
+Time=12:01:58\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+FIFOImp=EBR Based\r
+Depth=2048\r
+Width=27\r
+regout=0\r
+CtrlByRdEn=0\r
+EmpFlg=0\r
+PeMode=Static - Single Threshold\r
+PeAssert=10\r
+PeDeassert=12\r
+FullFlg=0\r
+PfMode=Static - Single Threshold\r
+PfAssert=508\r
+PfDeassert=506\r
+RDataCount=1\r
+EnECC=0\r
diff --git a/src/fifo_2kx27.vhd b/src/fifo_2kx27.vhd
new file mode 100644 (file)
index 0000000..e2011a1
--- /dev/null
@@ -0,0 +1,1004 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.5
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ebfifo -depth 2048 -width 27 -depth 2048 -no_enable -pe -1 -pf -1 -fill -e 
+
+-- Fri Feb 27 12:01:58 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity fifo_2kx27 is
+    port (
+        Data: in  std_logic_vector(26 downto 0); 
+        Clock: in  std_logic; 
+        WrEn: in  std_logic; 
+        RdEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(26 downto 0); 
+        WCNT: out  std_logic_vector(11 downto 0); 
+        Empty: out  std_logic; 
+        Full: out  std_logic);
+end fifo_2kx27;
+
+architecture Structure of fifo_2kx27 is
+
+    -- internal signal declarations
+    signal invout_1: std_logic;
+    signal invout_0: std_logic;
+    signal rden_i_inv: std_logic;
+    signal fcnt_en: std_logic;
+    signal empty_i: std_logic;
+    signal empty_d: std_logic;
+    signal full_i: std_logic;
+    signal full_d: std_logic;
+    signal ifcount_0: std_logic;
+    signal ifcount_1: std_logic;
+    signal bdcnt_bctr_ci: std_logic;
+    signal ifcount_2: std_logic;
+    signal ifcount_3: std_logic;
+    signal co0: std_logic;
+    signal ifcount_4: std_logic;
+    signal ifcount_5: std_logic;
+    signal co1: std_logic;
+    signal ifcount_6: std_logic;
+    signal ifcount_7: std_logic;
+    signal co2: std_logic;
+    signal ifcount_8: std_logic;
+    signal ifcount_9: std_logic;
+    signal co3: std_logic;
+    signal ifcount_10: std_logic;
+    signal ifcount_11: std_logic;
+    signal co5: std_logic;
+    signal cnt_con: std_logic;
+    signal co4: std_logic;
+    signal cmp_ci: std_logic;
+    signal rden_i: std_logic;
+    signal co0_1: std_logic;
+    signal co1_1: std_logic;
+    signal co2_1: std_logic;
+    signal co3_1: std_logic;
+    signal co4_1: std_logic;
+    signal cmp_le_1: std_logic;
+    signal cmp_le_1_c: std_logic;
+    signal cmp_ci_1: std_logic;
+    signal fcount_0: std_logic;
+    signal fcount_1: std_logic;
+    signal co0_2: std_logic;
+    signal fcount_2: std_logic;
+    signal fcount_3: std_logic;
+    signal co1_2: std_logic;
+    signal fcount_4: std_logic;
+    signal fcount_5: std_logic;
+    signal co2_2: std_logic;
+    signal fcount_6: std_logic;
+    signal fcount_7: std_logic;
+    signal co3_2: std_logic;
+    signal fcount_8: std_logic;
+    signal fcount_9: std_logic;
+    signal co4_2: std_logic;
+    signal wren_i: std_logic;
+    signal wren_i_inv: std_logic;
+    signal fcount_10: std_logic;
+    signal fcount_11: std_logic;
+    signal cmp_ge_d1: std_logic;
+    signal cmp_ge_d1_c: std_logic;
+    signal iwcount_0: std_logic;
+    signal iwcount_1: std_logic;
+    signal wcount_0: std_logic;
+    signal wcount_1: std_logic;
+    signal w_ctr_ci: std_logic;
+    signal iwcount_2: std_logic;
+    signal iwcount_3: std_logic;
+    signal wcount_2: std_logic;
+    signal wcount_3: std_logic;
+    signal co0_3: std_logic;
+    signal iwcount_4: std_logic;
+    signal iwcount_5: std_logic;
+    signal wcount_4: std_logic;
+    signal wcount_5: std_logic;
+    signal co1_3: std_logic;
+    signal iwcount_6: std_logic;
+    signal iwcount_7: std_logic;
+    signal wcount_6: std_logic;
+    signal wcount_7: std_logic;
+    signal co2_3: std_logic;
+    signal iwcount_8: std_logic;
+    signal iwcount_9: std_logic;
+    signal wcount_8: std_logic;
+    signal wcount_9: std_logic;
+    signal co3_3: std_logic;
+    signal iwcount_10: std_logic;
+    signal iwcount_11: std_logic;
+    signal co5_1: std_logic;
+    signal wcount_10: std_logic;
+    signal wcount_11: std_logic;
+    signal co4_3: std_logic;
+    signal scuba_vlo: std_logic;
+    signal scuba_vhi: std_logic;
+    signal ircount_0: std_logic;
+    signal ircount_1: std_logic;
+    signal rcount_0: std_logic;
+    signal rcount_1: std_logic;
+    signal r_ctr_ci: std_logic;
+    signal ircount_2: std_logic;
+    signal ircount_3: std_logic;
+    signal rcount_2: std_logic;
+    signal rcount_3: std_logic;
+    signal co0_4: std_logic;
+    signal ircount_4: std_logic;
+    signal ircount_5: std_logic;
+    signal rcount_4: std_logic;
+    signal rcount_5: std_logic;
+    signal co1_4: std_logic;
+    signal ircount_6: std_logic;
+    signal ircount_7: std_logic;
+    signal rcount_6: std_logic;
+    signal rcount_7: std_logic;
+    signal co2_4: std_logic;
+    signal ircount_8: std_logic;
+    signal ircount_9: std_logic;
+    signal rcount_8: std_logic;
+    signal rcount_9: std_logic;
+    signal co3_4: std_logic;
+    signal ircount_10: std_logic;
+    signal ircount_11: std_logic;
+    signal co5_2: std_logic;
+    signal rcount_10: std_logic;
+    signal rcount_11: std_logic;
+    signal co4_4: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component ALEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; LE: out  std_logic);
+    end component;
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component CU2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CO: out  std_logic; NC0: out  std_logic; NC1: out  std_logic);
+    end component;
+    component CB2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CON: in  std_logic; CO: out  std_logic; NC0: out  std_logic; 
+            NC1: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1S3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; PD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component FD1S3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; CD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component XOR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_1 : label is "0x3232";
+    attribute initval of LUT4_0 : label is "0x3232";
+    attribute MEM_LPC_FILE of pdp_ram_0_0_2 : label is "fifo_2kx27.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_0_2 : label is "";
+    attribute CSDECODE_B of pdp_ram_0_0_2 : label is "0b000";
+    attribute CSDECODE_A of pdp_ram_0_0_2 : label is "0b000";
+    attribute WRITEMODE_B of pdp_ram_0_0_2 : label is "NORMAL";
+    attribute WRITEMODE_A of pdp_ram_0_0_2 : label is "NORMAL";
+    attribute GSR of pdp_ram_0_0_2 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_0_2 : label is "ASYNC";
+    attribute REGMODE_B of pdp_ram_0_0_2 : label is "NOREG";
+    attribute REGMODE_A of pdp_ram_0_0_2 : label is "NOREG";
+    attribute DATA_WIDTH_B of pdp_ram_0_0_2 : label is "9";
+    attribute DATA_WIDTH_A of pdp_ram_0_0_2 : label is "9";
+    attribute MEM_LPC_FILE of pdp_ram_0_1_1 : label is "fifo_2kx27.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_1_1 : label is "";
+    attribute CSDECODE_B of pdp_ram_0_1_1 : label is "0b000";
+    attribute CSDECODE_A of pdp_ram_0_1_1 : label is "0b000";
+    attribute WRITEMODE_B of pdp_ram_0_1_1 : label is "NORMAL";
+    attribute WRITEMODE_A of pdp_ram_0_1_1 : label is "NORMAL";
+    attribute GSR of pdp_ram_0_1_1 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_1_1 : label is "ASYNC";
+    attribute REGMODE_B of pdp_ram_0_1_1 : label is "NOREG";
+    attribute REGMODE_A of pdp_ram_0_1_1 : label is "NOREG";
+    attribute DATA_WIDTH_B of pdp_ram_0_1_1 : label is "9";
+    attribute DATA_WIDTH_A of pdp_ram_0_1_1 : label is "9";
+    attribute MEM_LPC_FILE of pdp_ram_0_2_0 : label is "fifo_2kx27.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_2_0 : label is "";
+    attribute CSDECODE_B of pdp_ram_0_2_0 : label is "0b000";
+    attribute CSDECODE_A of pdp_ram_0_2_0 : label is "0b000";
+    attribute WRITEMODE_B of pdp_ram_0_2_0 : label is "NORMAL";
+    attribute WRITEMODE_A of pdp_ram_0_2_0 : label is "NORMAL";
+    attribute GSR of pdp_ram_0_2_0 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_2_0 : label is "ASYNC";
+    attribute REGMODE_B of pdp_ram_0_2_0 : label is "NOREG";
+    attribute REGMODE_A of pdp_ram_0_2_0 : label is "NOREG";
+    attribute DATA_WIDTH_B of pdp_ram_0_2_0 : label is "9";
+    attribute DATA_WIDTH_A of pdp_ram_0_2_0 : label is "9";
+    attribute GSR of FF_37 : label is "ENABLED";
+    attribute GSR of FF_36 : label is "ENABLED";
+    attribute GSR of FF_35 : label is "ENABLED";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    AND2_t3: AND2
+        port map (A=>WrEn, B=>invout_1, Z=>wren_i);
+
+    INV_3: INV
+        port map (A=>full_i, Z=>invout_1);
+
+    AND2_t2: AND2
+        port map (A=>RdEn, B=>invout_0, Z=>rden_i);
+
+    INV_2: INV
+        port map (A=>empty_i, Z=>invout_0);
+
+    AND2_t1: AND2
+        port map (A=>wren_i, B=>rden_i_inv, Z=>cnt_con);
+
+    XOR2_t0: XOR2
+        port map (A=>wren_i, B=>rden_i, Z=>fcnt_en);
+
+    INV_1: INV
+        port map (A=>rden_i, Z=>rden_i_inv);
+
+    INV_0: INV
+        port map (A=>wren_i, Z=>wren_i_inv);
+
+    LUT4_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_le_1, AD1=>wren_i, 
+            AD0=>empty_i, DO0=>empty_d);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_ge_d1, AD1=>rden_i, 
+            AD0=>full_i, DO0=>full_d);
+
+    pdp_ram_0_0_2: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "ASYNC", 
+        REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=>  9, 
+        DATA_WIDTH_A=>  9)
+        -- synopsys translate_on
+        port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), 
+            DIA3=>Data(3), DIA4=>Data(4), DIA5=>Data(5), DIA6=>Data(6), 
+            DIA7=>Data(7), DIA8=>Data(8), DIA9=>scuba_vlo, 
+            DIA10=>scuba_vlo, DIA11=>scuba_vlo, DIA12=>scuba_vlo, 
+            DIA13=>scuba_vlo, DIA14=>scuba_vlo, DIA15=>scuba_vlo, 
+            DIA16=>scuba_vlo, DIA17=>scuba_vlo, ADA0=>scuba_vlo, 
+            ADA1=>scuba_vlo, ADA2=>scuba_vlo, ADA3=>wcount_0, 
+            ADA4=>wcount_1, ADA5=>wcount_2, ADA6=>wcount_3, 
+            ADA7=>wcount_4, ADA8=>wcount_5, ADA9=>wcount_6, 
+            ADA10=>wcount_7, ADA11=>wcount_8, ADA12=>wcount_9, 
+            ADA13=>wcount_10, CEA=>wren_i, CLKA=>Clock, WEA=>scuba_vhi, 
+            CSA0=>scuba_vlo, CSA1=>scuba_vlo, CSA2=>scuba_vlo, 
+            RSTA=>Reset, DIB0=>scuba_vlo, DIB1=>scuba_vlo, 
+            DIB2=>scuba_vlo, DIB3=>scuba_vlo, DIB4=>scuba_vlo, 
+            DIB5=>scuba_vlo, DIB6=>scuba_vlo, DIB7=>scuba_vlo, 
+            DIB8=>scuba_vlo, DIB9=>scuba_vlo, DIB10=>scuba_vlo, 
+            DIB11=>scuba_vlo, DIB12=>scuba_vlo, DIB13=>scuba_vlo, 
+            DIB14=>scuba_vlo, DIB15=>scuba_vlo, DIB16=>scuba_vlo, 
+            DIB17=>scuba_vlo, ADB0=>scuba_vlo, ADB1=>scuba_vlo, 
+            ADB2=>scuba_vlo, ADB3=>rcount_0, ADB4=>rcount_1, 
+            ADB5=>rcount_2, ADB6=>rcount_3, ADB7=>rcount_4, 
+            ADB8=>rcount_5, ADB9=>rcount_6, ADB10=>rcount_7, 
+            ADB11=>rcount_8, ADB12=>rcount_9, ADB13=>rcount_10, 
+            CEB=>rden_i, CLKB=>Clock, WEB=>scuba_vlo, CSB0=>scuba_vlo, 
+            CSB1=>scuba_vlo, CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>open, 
+            DOA1=>open, DOA2=>open, DOA3=>open, DOA4=>open, DOA5=>open, 
+            DOA6=>open, DOA7=>open, DOA8=>open, DOA9=>open, DOA10=>open, 
+            DOA11=>open, DOA12=>open, DOA13=>open, DOA14=>open, 
+            DOA15=>open, DOA16=>open, DOA17=>open, DOB0=>Q(0), 
+            DOB1=>Q(1), DOB2=>Q(2), DOB3=>Q(3), DOB4=>Q(4), DOB5=>Q(5), 
+            DOB6=>Q(6), DOB7=>Q(7), DOB8=>Q(8), DOB9=>open, DOB10=>open, 
+            DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, 
+            DOB15=>open, DOB16=>open, DOB17=>open);
+
+    pdp_ram_0_1_1: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "ASYNC", 
+        REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=>  9, 
+        DATA_WIDTH_A=>  9)
+        -- synopsys translate_on
+        port map (DIA0=>Data(9), DIA1=>Data(10), DIA2=>Data(11), 
+            DIA3=>Data(12), DIA4=>Data(13), DIA5=>Data(14), 
+            DIA6=>Data(15), DIA7=>Data(16), DIA8=>Data(17), 
+            DIA9=>scuba_vlo, DIA10=>scuba_vlo, DIA11=>scuba_vlo, 
+            DIA12=>scuba_vlo, DIA13=>scuba_vlo, DIA14=>scuba_vlo, 
+            DIA15=>scuba_vlo, DIA16=>scuba_vlo, DIA17=>scuba_vlo, 
+            ADA0=>scuba_vlo, ADA1=>scuba_vlo, ADA2=>scuba_vlo, 
+            ADA3=>wcount_0, ADA4=>wcount_1, ADA5=>wcount_2, 
+            ADA6=>wcount_3, ADA7=>wcount_4, ADA8=>wcount_5, 
+            ADA9=>wcount_6, ADA10=>wcount_7, ADA11=>wcount_8, 
+            ADA12=>wcount_9, ADA13=>wcount_10, CEA=>wren_i, CLKA=>Clock, 
+            WEA=>scuba_vhi, CSA0=>scuba_vlo, CSA1=>scuba_vlo, 
+            CSA2=>scuba_vlo, RSTA=>Reset, DIB0=>scuba_vlo, 
+            DIB1=>scuba_vlo, DIB2=>scuba_vlo, DIB3=>scuba_vlo, 
+            DIB4=>scuba_vlo, DIB5=>scuba_vlo, DIB6=>scuba_vlo, 
+            DIB7=>scuba_vlo, DIB8=>scuba_vlo, DIB9=>scuba_vlo, 
+            DIB10=>scuba_vlo, DIB11=>scuba_vlo, DIB12=>scuba_vlo, 
+            DIB13=>scuba_vlo, DIB14=>scuba_vlo, DIB15=>scuba_vlo, 
+            DIB16=>scuba_vlo, DIB17=>scuba_vlo, ADB0=>scuba_vlo, 
+            ADB1=>scuba_vlo, ADB2=>scuba_vlo, ADB3=>rcount_0, 
+            ADB4=>rcount_1, ADB5=>rcount_2, ADB6=>rcount_3, 
+            ADB7=>rcount_4, ADB8=>rcount_5, ADB9=>rcount_6, 
+            ADB10=>rcount_7, ADB11=>rcount_8, ADB12=>rcount_9, 
+            ADB13=>rcount_10, CEB=>rden_i, CLKB=>Clock, WEB=>scuba_vlo, 
+            CSB0=>scuba_vlo, CSB1=>scuba_vlo, CSB2=>scuba_vlo, 
+            RSTB=>Reset, DOA0=>open, DOA1=>open, DOA2=>open, DOA3=>open, 
+            DOA4=>open, DOA5=>open, DOA6=>open, DOA7=>open, DOA8=>open, 
+            DOA9=>open, DOA10=>open, DOA11=>open, DOA12=>open, 
+            DOA13=>open, DOA14=>open, DOA15=>open, DOA16=>open, 
+            DOA17=>open, DOB0=>Q(9), DOB1=>Q(10), DOB2=>Q(11), 
+            DOB3=>Q(12), DOB4=>Q(13), DOB5=>Q(14), DOB6=>Q(15), 
+            DOB7=>Q(16), DOB8=>Q(17), DOB9=>open, DOB10=>open, 
+            DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, 
+            DOB15=>open, DOB16=>open, DOB17=>open);
+
+    pdp_ram_0_2_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "ASYNC", 
+        REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=>  9, 
+        DATA_WIDTH_A=>  9)
+        -- synopsys translate_on
+        port map (DIA0=>Data(18), DIA1=>Data(19), DIA2=>Data(20), 
+            DIA3=>Data(21), DIA4=>Data(22), DIA5=>Data(23), 
+            DIA6=>Data(24), DIA7=>Data(25), DIA8=>Data(26), 
+            DIA9=>scuba_vlo, DIA10=>scuba_vlo, DIA11=>scuba_vlo, 
+            DIA12=>scuba_vlo, DIA13=>scuba_vlo, DIA14=>scuba_vlo, 
+            DIA15=>scuba_vlo, DIA16=>scuba_vlo, DIA17=>scuba_vlo, 
+            ADA0=>scuba_vlo, ADA1=>scuba_vlo, ADA2=>scuba_vlo, 
+            ADA3=>wcount_0, ADA4=>wcount_1, ADA5=>wcount_2, 
+            ADA6=>wcount_3, ADA7=>wcount_4, ADA8=>wcount_5, 
+            ADA9=>wcount_6, ADA10=>wcount_7, ADA11=>wcount_8, 
+            ADA12=>wcount_9, ADA13=>wcount_10, CEA=>wren_i, CLKA=>Clock, 
+            WEA=>scuba_vhi, CSA0=>scuba_vlo, CSA1=>scuba_vlo, 
+            CSA2=>scuba_vlo, RSTA=>Reset, DIB0=>scuba_vlo, 
+            DIB1=>scuba_vlo, DIB2=>scuba_vlo, DIB3=>scuba_vlo, 
+            DIB4=>scuba_vlo, DIB5=>scuba_vlo, DIB6=>scuba_vlo, 
+            DIB7=>scuba_vlo, DIB8=>scuba_vlo, DIB9=>scuba_vlo, 
+            DIB10=>scuba_vlo, DIB11=>scuba_vlo, DIB12=>scuba_vlo, 
+            DIB13=>scuba_vlo, DIB14=>scuba_vlo, DIB15=>scuba_vlo, 
+            DIB16=>scuba_vlo, DIB17=>scuba_vlo, ADB0=>scuba_vlo, 
+            ADB1=>scuba_vlo, ADB2=>scuba_vlo, ADB3=>rcount_0, 
+            ADB4=>rcount_1, ADB5=>rcount_2, ADB6=>rcount_3, 
+            ADB7=>rcount_4, ADB8=>rcount_5, ADB9=>rcount_6, 
+            ADB10=>rcount_7, ADB11=>rcount_8, ADB12=>rcount_9, 
+            ADB13=>rcount_10, CEB=>rden_i, CLKB=>Clock, WEB=>scuba_vlo, 
+            CSB0=>scuba_vlo, CSB1=>scuba_vlo, CSB2=>scuba_vlo, 
+            RSTB=>Reset, DOA0=>open, DOA1=>open, DOA2=>open, DOA3=>open, 
+            DOA4=>open, DOA5=>open, DOA6=>open, DOA7=>open, DOA8=>open, 
+            DOA9=>open, DOA10=>open, DOA11=>open, DOA12=>open, 
+            DOA13=>open, DOA14=>open, DOA15=>open, DOA16=>open, 
+            DOA17=>open, DOB0=>Q(18), DOB1=>Q(19), DOB2=>Q(20), 
+            DOB3=>Q(21), DOB4=>Q(22), DOB5=>Q(23), DOB6=>Q(24), 
+            DOB7=>Q(25), DOB8=>Q(26), DOB9=>open, DOB10=>open, 
+            DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, 
+            DOB15=>open, DOB16=>open, DOB17=>open);
+
+    FF_37: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_0, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_0);
+
+    FF_36: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_1, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_1);
+
+    FF_35: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_2, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_2);
+
+    FF_34: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_3, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_3);
+
+    FF_33: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_4, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_4);
+
+    FF_32: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_5, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_5);
+
+    FF_31: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_6, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_6);
+
+    FF_30: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_7, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_7);
+
+    FF_29: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_8, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_8);
+
+    FF_28: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_9, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_9);
+
+    FF_27: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_10, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_10);
+
+    FF_26: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_11, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_11);
+
+    FF_25: FD1S3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>empty_d, CK=>Clock, PD=>Reset, Q=>empty_i);
+
+    FF_24: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>full_d, CK=>Clock, CD=>Reset, Q=>full_i);
+
+    FF_23: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_0, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_0);
+
+    FF_22: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_1, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_1);
+
+    FF_21: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_2, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_2);
+
+    FF_20: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_3, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_3);
+
+    FF_19: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_4, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_4);
+
+    FF_18: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_5, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_5);
+
+    FF_17: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_6, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_6);
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_7, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_7);
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_8, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_8);
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_9, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_9);
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_10, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_10);
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_11, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_11);
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_0, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_0);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_1, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_1);
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_2, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_2);
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_3, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_3);
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_4, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_4);
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_5, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_5);
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_6, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_6);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_7, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_7);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_8, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_8);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_9, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_9);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_10, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_10);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_11, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_11);
+
+    bdcnt_bctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>cnt_con, B0=>scuba_vlo, B1=>cnt_con, 
+            CI=>scuba_vlo, COUT=>bdcnt_bctr_ci, S0=>open, S1=>open);
+
+    bdcnt_bctr_0: CB2
+        port map (CI=>bdcnt_bctr_ci, PC0=>fcount_0, PC1=>fcount_1, 
+            CON=>cnt_con, CO=>co0, NC0=>ifcount_0, NC1=>ifcount_1);
+
+    bdcnt_bctr_1: CB2
+        port map (CI=>co0, PC0=>fcount_2, PC1=>fcount_3, CON=>cnt_con, 
+            CO=>co1, NC0=>ifcount_2, NC1=>ifcount_3);
+
+    bdcnt_bctr_2: CB2
+        port map (CI=>co1, PC0=>fcount_4, PC1=>fcount_5, CON=>cnt_con, 
+            CO=>co2, NC0=>ifcount_4, NC1=>ifcount_5);
+
+    bdcnt_bctr_3: CB2
+        port map (CI=>co2, PC0=>fcount_6, PC1=>fcount_7, CON=>cnt_con, 
+            CO=>co3, NC0=>ifcount_6, NC1=>ifcount_7);
+
+    bdcnt_bctr_4: CB2
+        port map (CI=>co3, PC0=>fcount_8, PC1=>fcount_9, CON=>cnt_con, 
+            CO=>co4, NC0=>ifcount_8, NC1=>ifcount_9);
+
+    bdcnt_bctr_5: CB2
+        port map (CI=>co4, PC0=>fcount_10, PC1=>fcount_11, CON=>cnt_con, 
+            CO=>co5, NC0=>ifcount_10, NC1=>ifcount_11);
+
+    e_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, 
+            S1=>open);
+
+    e_cmp_0: ALEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>rden_i, B1=>scuba_vlo, 
+            CI=>cmp_ci, LE=>co0_1);
+
+    e_cmp_1: ALEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co0_1, LE=>co1_1);
+
+    e_cmp_2: ALEB2
+        port map (A0=>fcount_4, A1=>fcount_5, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co1_1, LE=>co2_1);
+
+    e_cmp_3: ALEB2
+        port map (A0=>fcount_6, A1=>fcount_7, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co2_1, LE=>co3_1);
+
+    e_cmp_4: ALEB2
+        port map (A0=>fcount_8, A1=>fcount_9, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co3_1, LE=>co4_1);
+
+    e_cmp_5: ALEB2
+        port map (A0=>fcount_10, A1=>fcount_11, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co4_1, LE=>cmp_le_1_c);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_le_1_c, COUT=>open, S0=>cmp_le_1, 
+            S1=>open);
+
+    g_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci_1, S0=>open, 
+            S1=>open);
+
+    g_cmp_0: AGEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>wren_i, B1=>wren_i, 
+            CI=>cmp_ci_1, GE=>co0_2);
+
+    g_cmp_1: AGEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>wren_i, B1=>wren_i, 
+            CI=>co0_2, GE=>co1_2);
+
+    g_cmp_2: AGEB2
+        port map (A0=>fcount_4, A1=>fcount_5, B0=>wren_i, B1=>wren_i, 
+            CI=>co1_2, GE=>co2_2);
+
+    g_cmp_3: AGEB2
+        port map (A0=>fcount_6, A1=>fcount_7, B0=>wren_i, B1=>wren_i, 
+            CI=>co2_2, GE=>co3_2);
+
+    g_cmp_4: AGEB2
+        port map (A0=>fcount_8, A1=>fcount_9, B0=>wren_i, B1=>wren_i, 
+            CI=>co3_2, GE=>co4_2);
+
+    g_cmp_5: AGEB2
+        port map (A0=>fcount_10, A1=>fcount_11, B0=>wren_i, 
+            B1=>wren_i_inv, CI=>co4_2, GE=>cmp_ge_d1_c);
+
+    a1: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_ge_d1_c, COUT=>open, S0=>cmp_ge_d1, 
+            S1=>open);
+
+    w_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>w_ctr_ci, S0=>open, 
+            S1=>open);
+
+    w_ctr_0: CU2
+        port map (CI=>w_ctr_ci, PC0=>wcount_0, PC1=>wcount_1, CO=>co0_3, 
+            NC0=>iwcount_0, NC1=>iwcount_1);
+
+    w_ctr_1: CU2
+        port map (CI=>co0_3, PC0=>wcount_2, PC1=>wcount_3, CO=>co1_3, 
+            NC0=>iwcount_2, NC1=>iwcount_3);
+
+    w_ctr_2: CU2
+        port map (CI=>co1_3, PC0=>wcount_4, PC1=>wcount_5, CO=>co2_3, 
+            NC0=>iwcount_4, NC1=>iwcount_5);
+
+    w_ctr_3: CU2
+        port map (CI=>co2_3, PC0=>wcount_6, PC1=>wcount_7, CO=>co3_3, 
+            NC0=>iwcount_6, NC1=>iwcount_7);
+
+    w_ctr_4: CU2
+        port map (CI=>co3_3, PC0=>wcount_8, PC1=>wcount_9, CO=>co4_3, 
+            NC0=>iwcount_8, NC1=>iwcount_9);
+
+    w_ctr_5: CU2
+        port map (CI=>co4_3, PC0=>wcount_10, PC1=>wcount_11, CO=>co5_1, 
+            NC0=>iwcount_10, NC1=>iwcount_11);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    r_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>r_ctr_ci, S0=>open, 
+            S1=>open);
+
+    r_ctr_0: CU2
+        port map (CI=>r_ctr_ci, PC0=>rcount_0, PC1=>rcount_1, CO=>co0_4, 
+            NC0=>ircount_0, NC1=>ircount_1);
+
+    r_ctr_1: CU2
+        port map (CI=>co0_4, PC0=>rcount_2, PC1=>rcount_3, CO=>co1_4, 
+            NC0=>ircount_2, NC1=>ircount_3);
+
+    r_ctr_2: CU2
+        port map (CI=>co1_4, PC0=>rcount_4, PC1=>rcount_5, CO=>co2_4, 
+            NC0=>ircount_4, NC1=>ircount_5);
+
+    r_ctr_3: CU2
+        port map (CI=>co2_4, PC0=>rcount_6, PC1=>rcount_7, CO=>co3_4, 
+            NC0=>ircount_6, NC1=>ircount_7);
+
+    r_ctr_4: CU2
+        port map (CI=>co3_4, PC0=>rcount_8, PC1=>rcount_9, CO=>co4_4, 
+            NC0=>ircount_8, NC1=>ircount_9);
+
+    r_ctr_5: CU2
+        port map (CI=>co4_4, PC0=>rcount_10, PC1=>rcount_11, CO=>co5_2, 
+            NC0=>ircount_10, NC1=>ircount_11);
+
+    WCNT(0) <= fcount_0;
+    WCNT(1) <= fcount_1;
+    WCNT(2) <= fcount_2;
+    WCNT(3) <= fcount_3;
+    WCNT(4) <= fcount_4;
+    WCNT(5) <= fcount_5;
+    WCNT(6) <= fcount_6;
+    WCNT(7) <= fcount_7;
+    WCNT(8) <= fcount_8;
+    WCNT(9) <= fcount_9;
+    WCNT(10) <= fcount_10;
+    WCNT(11) <= fcount_11;
+    Empty <= empty_i;
+    Full <= full_i;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of fifo_2kx27 is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:ALEB2 use entity ecp2m.ALEB2(V); end for;
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:CU2 use entity ecp2m.CU2(V); end for;
+        for all:CB2 use entity ecp2m.CB2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:FD1S3BX use entity ecp2m.FD1S3BX(V); end for;
+        for all:FD1S3DX use entity ecp2m.FD1S3DX(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:XOR2 use entity ecp2m.XOR2(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/fifo_2kx27_tmpl.vhd b/src/fifo_2kx27_tmpl.vhd
new file mode 100644 (file)
index 0000000..7e0698c
--- /dev/null
@@ -0,0 +1,18 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP1_Build (24)
+-- Module  Version: 4.5
+-- Fri Feb 27 12:01:58 2009
+
+-- parameterized module component declaration
+component fifo_2kx27
+    port (Data: in  std_logic_vector(26 downto 0); Clock: in  std_logic; 
+        WrEn: in  std_logic; RdEn: in  std_logic; Reset: in  std_logic; 
+        Q: out  std_logic_vector(26 downto 0); 
+        WCNT: out  std_logic_vector(11 downto 0); Empty: out  std_logic; 
+        Full: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : fifo_2kx27
+    port map (Data(26 downto 0)=>__, Clock=>__, WrEn=>__, RdEn=>__, 
+        Reset=>__, Q(26 downto 0)=>__, WCNT(11 downto 0)=>__, Empty=>__, 
+        Full=>__);
diff --git a/src/frame_status_mem.lpc b/src/frame_status_mem.lpc
new file mode 100644 (file)
index 0000000..7761bd4
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_DPRAM\r
+CoreRevision=3.5\r
+ModuleName=frame_status_mem\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=09/14/2009\r
+Time=13:08:21\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=16\r
+Data=12\r
+LUT=1\r
+MemFile=\r
+MemFormat=orca\r
diff --git a/src/frame_status_mem.srp b/src/frame_status_mem.srp
new file mode 100644 (file)
index 0000000..cf54009
--- /dev/null
@@ -0,0 +1,34 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Mon Sep 14 13:08:21 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n frame_status_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type ramdps -raddr_width 4 -rwidth 12 -waddr_width 4 -wwidth 12 -rnum_words 16 -wnum_words 16 -outData REGISTERED -e 
+    Circuit name     : frame_status_mem
+    Module type      : sdpram
+    Module Version   : 3.5
+    Address width    : 4
+    Ports            : 
+       Inputs       : WrAddress[3:0], Data[11:0], WrClock, WE, WrClockEn, RdAddress[3:0], RdClock, RdClockEn, Reset
+       Outputs      : Q[11:0]
+    I/O buffer       : not inserted
+    Clock edge       : rising edge
+    EDIF output      : suppressed
+    VHDL output      : frame_status_mem.vhd
+    VHDL template    : frame_status_mem_tmpl.vhd
+    VHDL testbench    : tb_frame_status_mem_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : frame_status_mem.srp
+    Element Usage    :
+        FD1P3DX : 12
+        ROM16X1 : 1
+       DPR16X4A : 3
+    Estimated Resource Usage:
+            LUT : 1
+           DRAM : 3
+            Reg : 12
diff --git a/src/frame_status_mem.vhd b/src/frame_status_mem.vhd
new file mode 100644 (file)
index 0000000..9400698
--- /dev/null
@@ -0,0 +1,231 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.5
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type sdpram -rdata_width 12 -data_width 12 -num_rows 16 -outData REGISTERED -e 
+
+-- Mon Sep 14 13:08:21 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity frame_status_mem is
+    port (
+        WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(11 downto 0); 
+        WrClock: in  std_logic; 
+        WE: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(11 downto 0));
+end frame_status_mem;
+
+architecture Structure of frame_status_mem is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+    signal scuba_vhi: std_logic;
+    signal dataout11_ffin: std_logic;
+    signal dataout10_ffin: std_logic;
+    signal dataout9_ffin: std_logic;
+    signal dataout8_ffin: std_logic;
+    signal dataout7_ffin: std_logic;
+    signal dataout6_ffin: std_logic;
+    signal dataout5_ffin: std_logic;
+    signal dataout4_ffin: std_logic;
+    signal dataout3_ffin: std_logic;
+    signal dataout2_ffin: std_logic;
+    signal dataout1_ffin: std_logic;
+    signal dataout0_ffin: std_logic;
+    signal dec0_wre3: std_logic;
+
+    -- local component declarations
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component DPR16X4A
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; WCK: in  std_logic; WRE: in  std_logic; 
+            RAD0: in  std_logic; RAD1: in  std_logic; 
+            RAD2: in  std_logic; RAD3: in  std_logic; 
+            WAD0: in  std_logic; WAD1: in  std_logic; 
+            WAD2: in  std_logic; WAD3: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_0 : label is "0x8000";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x8000")
+        -- synopsys translate_on
+        port map (AD3=>WE, AD2=>WrClockEn, AD1=>scuba_vhi, 
+            AD0=>scuba_vhi, DO0=>dec0_wre3);
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout11_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(11));
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout10_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(10));
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout9_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(9));
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout8_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(8));
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout7_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(7));
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout6_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(6));
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout5_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(5));
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout4_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(4));
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout3_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(3));
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout2_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(2));
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout1_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(1));
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>dataout0_ffin, SP=>RdClockEn, CK=>RdClock, 
+            CD=>Reset, Q=>Q(0));
+
+    mem_0_0: DPR16X4A
+        port map (DI0=>Data(8), DI1=>Data(9), DI2=>Data(10), 
+            DI3=>Data(11), WCK=>WrClock, WRE=>dec0_wre3, 
+            RAD0=>RdAddress(0), RAD1=>RdAddress(1), RAD2=>RdAddress(2), 
+            RAD3=>RdAddress(3), WAD0=>WrAddress(0), WAD1=>WrAddress(1), 
+            WAD2=>WrAddress(2), WAD3=>WrAddress(3), DO0=>dataout8_ffin, 
+            DO1=>dataout9_ffin, DO2=>dataout10_ffin, DO3=>dataout11_ffin);
+
+    mem_0_1: DPR16X4A
+        port map (DI0=>Data(4), DI1=>Data(5), DI2=>Data(6), DI3=>Data(7), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout4_ffin, DO1=>dataout5_ffin, 
+            DO2=>dataout6_ffin, DO3=>dataout7_ffin);
+
+    mem_0_2: DPR16X4A
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            WCK=>WrClock, WRE=>dec0_wre3, RAD0=>RdAddress(0), 
+            RAD1=>RdAddress(1), RAD2=>RdAddress(2), RAD3=>RdAddress(3), 
+            WAD0=>WrAddress(0), WAD1=>WrAddress(1), WAD2=>WrAddress(2), 
+            WAD3=>WrAddress(3), DO0=>dataout0_ffin, DO1=>dataout1_ffin, 
+            DO2=>dataout2_ffin, DO3=>dataout3_ffin);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of frame_status_mem is
+    for Structure
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:DPR16X4A use entity ecp2m.DPR16X4A(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/frame_status_mem_generate.log b/src/frame_status_mem_generate.log
new file mode 100644 (file)
index 0000000..c0b628b
--- /dev/null
@@ -0,0 +1,49 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Mon Sep 14 13:08:21 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n frame_status_mem -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type ramdps -raddr_width 4 -rwidth 12 -waddr_width 4 -wwidth 12 -rnum_words 16 -wnum_words 16 -outData REGISTERED -e \r
+    Circuit name     : frame_status_mem\r
+    Module type      : sdpram\r
+    Module Version   : 3.5\r
+    Address width    : 4\r
+    Data width       : 12\r
+    Ports            : \r
+       Inputs       : WrAddress[3:0], Data[11:0], WrClock, WE, WrClockEn, RdAddress[3:0], RdClock, RdClockEn, Reset\r
+       Outputs      : Q[11:0]\r
+    I/O buffer       : not inserted\r
+    Clock edge       : rising edge\r
+    EDIF output      : suppressed\r
+    VHDL output      : frame_status_mem.vhd\r
+    VHDL template    : frame_status_mem_tmpl.vhd\r
+    VHDL testbench   : tb_frame_status_mem_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : frame_status_mem.srp\r
+    Estimated Resource Usage:\r
+            LUT : 1\r
+           DRAM : 3\r
+            Reg : 12\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: frame_status_mem.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/frame_status_mem_tmpl.vhd b/src/frame_status_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..9bb11c2
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.5
+-- Mon Sep 14 13:08:21 2009
+
+-- parameterized module component declaration
+component frame_status_mem
+    port (WrAddress: in  std_logic_vector(3 downto 0); 
+        Data: in  std_logic_vector(11 downto 0); WrClock: in  std_logic; 
+        WE: in  std_logic; WrClockEn: in  std_logic; 
+        RdAddress: in  std_logic_vector(3 downto 0); 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; Q: out  std_logic_vector(11 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : frame_status_mem
+    port map (WrAddress(3 downto 0)=>__, Data(11 downto 0)=>__, WrClock=>__, 
+        WE=>__, WrClockEn=>__, RdAddress(3 downto 0)=>__, RdClock=>__, 
+        RdClockEn=>__, Reset=>__, Q(11 downto 0)=>__);
diff --git a/src/frmctr_check.vhd b/src/frmctr_check.vhd
new file mode 100755 (executable)
index 0000000..7eaae72
--- /dev/null
@@ -0,0 +1,89 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- This module checks the framecounter setting embedded inside the APV raw data.\r
+-- Only channels with GOODDATA are taken into account.\r
+\r
+entity frmctr_check is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 GOODDATA_IN           : in    std_logic_vector(15 downto 0);\r
+                 FRAMECOUNTER_IN       : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_0_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_1_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_2_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_3_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_4_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_5_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_6_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_7_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_8_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_9_IN           : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_10_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_11_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_12_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_13_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_14_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRM_NR_15_IN          : in    std_logic_vector(3 downto 0);\r
+                 FRC_ERROR_OUT         : out   std_logic; -- at least one framecounter is wrong\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of frmctr_check is\r
+\r
+       -- normal signals\r
+       signal debug_x                  : std_logic_vector(15 downto 0);\r
+\r
+       signal next_frc_match   : std_logic_vector(15 downto 0);        \r
+       signal frc_match                : std_logic_vector(15 downto 0);        \r
+       signal next_frc_error   : std_logic;\r
+       signal frc_error                : std_logic;\r
+       \r
+begin\r
+\r
+-- Sync process\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               frc_match   <= next_frc_match;\r
+               frc_error   <= next_frc_error;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- Check the individual buffers\r
+-- If an APV is "not good" (i.e. broken or switched off) we assume a match.\r
+-- In case all APVs are switched off we get a match, this situation should be reconsidered...\r
+next_frc_match(0)  <= '1' when ( (frm_nr_0_in = framecounter_in)  or (gooddata_in(0) = '0') )  else '0';\r
+next_frc_match(1)  <= '1' when ( (frm_nr_1_in = framecounter_in)  or (gooddata_in(1) = '0') )  else '0';\r
+next_frc_match(2)  <= '1' when ( (frm_nr_2_in = framecounter_in)  or (gooddata_in(2) = '0') )  else '0';\r
+next_frc_match(3)  <= '1' when ( (frm_nr_3_in = framecounter_in)  or (gooddata_in(3) = '0') )  else '0';\r
+next_frc_match(4)  <= '1' when ( (frm_nr_4_in = framecounter_in)  or (gooddata_in(4) = '0') )  else '0';\r
+next_frc_match(5)  <= '1' when ( (frm_nr_5_in = framecounter_in)  or (gooddata_in(5) = '0') )  else '0';\r
+next_frc_match(6)  <= '1' when ( (frm_nr_6_in = framecounter_in)  or (gooddata_in(6) = '0') )  else '0';\r
+next_frc_match(7)  <= '1' when ( (frm_nr_7_in = framecounter_in)  or (gooddata_in(7) = '0') )  else '0';\r
+next_frc_match(8)  <= '1' when ( (frm_nr_8_in = framecounter_in)  or (gooddata_in(8) = '0') )  else '0';\r
+next_frc_match(9)  <= '1' when ( (frm_nr_9_in = framecounter_in)  or (gooddata_in(9) = '0') )  else '0';\r
+next_frc_match(10) <= '1' when ( (frm_nr_10_in = framecounter_in) or (gooddata_in(10) = '0') ) else '0';\r
+next_frc_match(11) <= '1' when ( (frm_nr_11_in = framecounter_in) or (gooddata_in(11) = '0') ) else '0';\r
+next_frc_match(12) <= '1' when ( (frm_nr_12_in = framecounter_in) or (gooddata_in(12) = '0') ) else '0';\r
+next_frc_match(13) <= '1' when ( (frm_nr_13_in = framecounter_in) or (gooddata_in(13) = '0') ) else '0';\r
+next_frc_match(14) <= '1' when ( (frm_nr_14_in = framecounter_in) or (gooddata_in(14) = '0') ) else '0';\r
+next_frc_match(15) <= '1' when ( (frm_nr_15_in = framecounter_in) or (gooddata_in(15) = '0') ) else '0';\r
+\r
+-- Combine all signals\r
+next_frc_error <= '1' when ( frc_match /= x"ffff" ) else '0';\r
+\r
+-- output signals\r
+frc_error_out <= frc_error;\r
+\r
+-- debug signals\r
+debug_x(15 downto 0)  <= (others => '0');\r
+\r
+dbg_out       <= debug_x;\r
+\r
+end behavioral;\r
diff --git a/src/i2c_gstart.vhd b/src/i2c_gstart.vhd
new file mode 100644 (file)
index 0000000..ec4d696
--- /dev/null
@@ -0,0 +1,227 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity I2C_GSTART is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         START_IN              : in    std_logic; \r
+      DOSTART_IN       : in    std_logic;      \r
+         I2C_SPEED_IN  : in    std_logic_vector(7 downto 0);\r
+         SDONE_OUT             : out   std_logic;\r
+         SOK_OUT               : out   std_logic;\r
+      SDA_IN           : in    std_logic;\r
+         SCL_IN                : in    std_logic;\r
+         R_SCL_OUT             : out   std_logic;\r
+         S_SCL_OUT             : out   std_logic;\r
+      R_SDA_OUT                : out   std_logic;\r
+      S_SDA_OUT                : out   std_logic;\r
+         BSM_OUT               : out   std_logic_vector(3 downto 0)\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of I2C_GSTART is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,P_SCL,WCTR0,P_SDA,WCTR1,P_CHK,S_CHK0,RS_SDA,S_CHK1,ERROR,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       signal bsm                      : std_logic_vector(3 downto 0);\r
+       signal cctr                     : std_logic_vector(7 downto 0); -- counter for bit length\r
+\r
+       signal cycdone_x        : std_logic;\r
+       signal cycdone          : std_logic; -- one counter period done\r
+\r
+       signal load_cyc_x       : std_logic;\r
+       signal load_cyc         : std_logic;\r
+       signal dec_cyc_x        : std_logic;\r
+       signal dec_cyc          : std_logic; \r
+       signal sdone_x          : std_logic;\r
+       signal sdone            : std_logic; -- Start/Stop done\r
+       signal sok_x            : std_logic;\r
+       signal sok                      : std_logic; -- Start/Stop OK\r
+\r
+       signal r_scl            : std_logic;\r
+       signal s_scl            : std_logic;\r
+       signal r_sda            : std_logic;\r
+       signal s_sda            : std_logic;\r
+\r
+-- Moduls\r
+\r
+begin\r
+\r
+-- Countdown for one half of SCL (adjustable clock width)\r
+THE_CYC_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       cctr <= (others => '0');\r
+               elsif( load_cyc = '1' ) then \r
+                       cctr <= i2c_speed_in;\r
+               elsif( dec_cyc = '1' ) then\r
+                       cctr <= cctr - 1;\r
+               end if;\r
+       end if;\r
+end process THE_CYC_CTR_PROC;\r
+\r
+-- end of cycle recognition\r
+cycdone_x <= '1' when (cctr = x"00") else '0';\r
+\r
+-- The main state machine\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if ( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       load_cyc      <= '0';\r
+                       dec_cyc       <= '0';\r
+                       sdone         <= '0';\r
+                       sok           <= '0';\r
+                       cycdone       <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       load_cyc      <= load_cyc_x;\r
+                       dec_cyc       <= dec_cyc_x;\r
+                       sdone         <= sdone_x;\r
+                       sok           <= sok_x;\r
+                       cycdone       <= cycdone_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, dostart_in, start_in, sda_in, scl_in, cycdone)\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       load_cyc_x <= '0';\r
+       dec_cyc_x  <= '0';\r
+       sdone_x    <= '0';\r
+       sok_x      <= '1';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if   ( (dostart_in = '1') and (start_in = '1') ) then\r
+                                                       NEXT_STATE <= S_CHK0; -- generate a start condition\r
+                                                       load_cyc_x <= '1';\r
+                                               elsif( (dostart_in = '1') and (start_in = '0') ) then\r
+                                                       NEXT_STATE <= P_SCL; -- generate a stop condition\r
+                                                       load_cyc_x <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               end if;\r
+               when P_SCL      =>      NEXT_STATE <= WCTR0;\r
+                                               dec_cyc_x  <= '1';\r
+               when S_CHK0 =>  if( (sda_in = '1') and (scl_in = '1') ) then\r
+                                                       NEXT_STATE <= RS_SDA;\r
+                                               else\r
+                                                       NEXT_STATE <= ERROR;\r
+                                                       sok_x      <= '0';\r
+                                               end if;\r
+               when RS_SDA     =>      NEXT_STATE <= WCTR0;\r
+                                               dec_cyc_x  <= '1';\r
+               when WCTR0      =>      if   ( (cycdone = '1') and (start_in = '1') ) then\r
+                                                       NEXT_STATE <= S_CHK1;\r
+                                               elsif( (cycdone = '1') and (start_in = '0') ) then\r
+                                                       NEXT_STATE <= P_SDA;\r
+                                                       load_cyc_x <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WCTR0;\r
+                                                       dec_cyc_x  <= '1';\r
+                                               end if;\r
+               when S_CHK1     =>      if( (sda_in = '0') and (scl_in = '1') ) then\r
+                                                       NEXT_STATE <= DONE;\r
+                                               else\r
+                                                       NEXT_STATE <= ERROR;\r
+                                                       sok_x      <= '0';\r
+                                               end if;\r
+               when P_SDA      =>      NEXT_STATE <= WCTR1;\r
+                                               dec_cyc_x  <= '1';\r
+               when WCTR1      =>      if( (cycdone = '1') ) then\r
+                                                       NEXT_STATE <= P_CHK;\r
+                                               else\r
+                                                       NEXT_STATE <= WCTR1;\r
+                                                       dec_cyc_x  <= '1';\r
+                                               end if;\r
+               when P_CHK      =>      if( (sda_in = '1') and (scl_in = '1') ) then\r
+                                                       NEXT_STATE <= DONE;\r
+                                                       sdone_x    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= ERROR;\r
+                                                       sok_x      <= '0';\r
+                                               end if;\r
+               when ERROR      =>      if( dostart_in = '0' ) then\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               else\r
+                                                       NEXT_STATE <= ERROR;\r
+                                                       sdone_x    <= '1';\r
+                                                       sok_x      <= '0';\r
+                                               end if;\r
+               when DONE       =>      if( dostart_in = '0' ) then\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               else\r
+                                                       NEXT_STATE <= DONE;\r
+                                                       sdone_x    <= '1';\r
+                                               end if;\r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+-- Output decoding\r
+DECODE: process(CURRENT_STATE)\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm <= x"0";\r
+               when S_CHK0     =>      bsm <= x"1";\r
+               when RS_SDA     =>      bsm <= x"2";\r
+               when P_SCL      =>      bsm <= x"3";\r
+               when WCTR0      =>      bsm <= x"4";\r
+               when S_CHK1     =>      bsm <= x"5";\r
+               when P_SDA      =>      bsm <= x"6";\r
+               when WCTR1      =>      bsm <= x"7";\r
+               when P_CHK      =>      bsm <= x"8";\r
+               when DONE       =>      bsm <= x"9";\r
+               when ERROR      =>      bsm <= x"e";\r
+               when others     =>      bsm <= x"f";\r
+       end case;\r
+end process DECODE;\r
+\r
+S_R_GEN: process(CURRENT_STATE)\r
+begin\r
+       if   ( CURRENT_STATE = P_SCL ) then\r
+               r_scl <= '0';\r
+               s_scl <= '1';\r
+               r_sda <= '0';\r
+               s_sda <= '0';\r
+       elsif( CURRENT_STATE = RS_SDA ) then\r
+               r_scl <= '0';\r
+               s_scl <= '0';\r
+               r_sda <= '1';\r
+               s_sda <= '0';\r
+       elsif( CURRENT_STATE = P_SDA ) then\r
+               r_scl <= '0';\r
+               s_scl <= '0';\r
+               r_sda <= '0';\r
+               s_sda <= '1';\r
+       else\r
+               r_scl <= '0';\r
+               s_scl <= '0';\r
+               r_sda <= '0';\r
+               s_sda <= '0';\r
+       end if;\r
+end process S_R_GEN;\r
+\r
+-- Outputs\r
+r_scl_out <= r_scl;\r
+s_scl_out <= s_scl;\r
+r_sda_out <= r_sda;\r
+s_sda_out <= s_sda;\r
+sdone_out <= sdone;\r
+sok_out   <= sok;\r
+\r
+-- Debug\r
+bsm_out <= bsm;\r
+\r
+end Behavioral;\r
diff --git a/src/i2c_master.vhd b/src/i2c_master.vhd
new file mode 100644 (file)
index 0000000..e843b62
--- /dev/null
@@ -0,0 +1,201 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity i2c_master is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_BUSY_OUT  : out   std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I2C connections\r
+         SDA_IN                : in    std_logic;\r
+         SDA_OUT               : out   std_logic;\r
+         SCL_IN                : in    std_logic;\r
+         SCL_OUT               : out   std_logic;\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of i2c_master is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_busy_x               : std_logic;\r
+       signal slv_busy                 : std_logic;\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal reg_slv_data_in  : std_logic_vector(31 downto 0); -- registered data input\r
+       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- read back data\r
+       signal reg_busy                 : std_logic;\r
+\r
+       signal status_data              : std_logic_vector(31 downto 0);\r
+       signal i2c_debug                : std_logic_vector(31 downto 0);\r
+\r
+begin\r
+\r
+---------------------------------------------------------\r
+-- I2C master                                          --\r
+---------------------------------------------------------\r
+\r
+THE_I2C_SLIM: i2c_slim\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- I2C command / setup\r
+                 I2C_GO_IN             => reg_slv_data_in(31),\r
+                 ACTION_IN             => reg_slv_data_in(30),\r
+                 I2C_SPEED_IN  => reg_slv_data_in(29 downto 24),\r
+                 I2C_ADR_IN    => reg_slv_data_in(23 downto 16),\r
+                 I2C_CMD_IN    => reg_slv_data_in(15 downto 8),\r
+                 I2C_DW_IN             => reg_slv_data_in(7 downto 0),\r
+                 I2C_DR_OUT    => status_data(7 downto 0),\r
+                 STATUS_OUT    => status_data(31 downto 24),\r
+                 I2C_BUSY_OUT  => reg_busy,\r
+                 -- I2C connections\r
+                 SDA_IN                => sda_in,\r
+                 SDA_OUT               => sda_out,\r
+                 SCL_IN                => scl_in,\r
+                 SCL_OUT               => scl_out,\r
+                 -- Debug\r
+                 STAT                  => i2c_debug\r
+               );\r
+\r
+status_data(23 downto 21) <= (others => '0');\r
+status_data(20 downto 16) <= i2c_debug(4 downto 0);\r
+status_data(15 downto 8)  <= (others => '0');\r
+\r
+-- Fake\r
+stat <= i2c_debug;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_busy      <= '0';\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_busy      <= slv_busy_x;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, reg_busy )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_busy_x <= '0';\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( (reg_busy = '0') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( (reg_busy = '0') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       elsif( (reg_busy = '1') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       elsif( (reg_busy = '1') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when RD_BSY             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when WR_BSY             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_in <= (others => '0');\r
+               elsif( store_wr = '1' ) then\r
+                       reg_slv_data_in <= slv_data_in;\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_out <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       reg_slv_data_out <= status_data;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_busy_out <= slv_busy;\r
+slv_data_out <= reg_slv_data_out;\r
+\r
+end Behavioral;\r
diff --git a/src/i2c_sendb.vhd b/src/i2c_sendb.vhd
new file mode 100644 (file)
index 0000000..42d8187
--- /dev/null
@@ -0,0 +1,299 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity I2C_SENDB is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         DOBYTE_IN             : in    std_logic; \r
+         I2C_SPEED_IN  : in    std_logic_vector( 7 downto 0 );\r
+         I2C_BYTE_IN   : in    std_logic_vector( 8 downto 0 ); \r
+         I2C_BACK_OUT  : out   std_logic_vector( 8 downto 0 );\r
+      SDA_IN           : in    std_logic;\r
+      R_SDA_OUT                : out   std_logic;\r
+      S_SDA_OUT                : out   std_logic;\r
+--       SCL_IN                : in    std_logic;\r
+         R_SCL_OUT             : out   std_logic;\r
+         S_SCL_OUT             : out   std_logic;\r
+         BDONE_OUT             : out   std_logic;\r
+         BOK_OUT               : out   std_logic;\r
+         BSM_OUT               : out   std_logic_vector( 3 downto 0 )\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of I2C_SENDB is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,LCL,WCL,LCH,WCH,FREE,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       signal bsm                      : std_logic_vector( 3 downto 0 );\r
+\r
+       signal inc_bit_x        : std_logic;\r
+       signal inc_bit          : std_logic; -- increment bit counter for byte to send\r
+       signal rst_bit_x        : std_logic;\r
+       signal rst_bit          : std_logic; -- reset bit counter for byte to send\r
+       signal load_cyc_x       : std_logic;\r
+       signal load_cyc         : std_logic; -- load cycle counter (SCL length)\r
+       signal dec_cyc_x        : std_logic;\r
+       signal dec_cyc          : std_logic; -- decrement cycle counter (SCL length)\r
+       signal load_sr_x        : std_logic;\r
+       signal load_sr          : std_logic; -- load output shift register\r
+       signal shift_o_x        : std_logic;\r
+       signal shift_o          : std_logic; -- output shift register control\r
+       signal shift_i_x        : std_logic;\r
+       signal shift_i          : std_logic; -- input shift register control\r
+       signal bdone_x          : std_logic;\r
+       signal bdone            : std_logic;\r
+       signal r_scl_x          : std_logic;\r
+       signal r_scl            : std_logic; -- output for SCL \r
+       signal s_scl_x          : std_logic;\r
+       signal s_scl            : std_logic; -- output for SCL\r
+\r
+       signal bctr                     : std_logic_vector( 3 downto 0 ); -- bit counter        (1...9)\r
+       signal cctr                     : std_logic_vector( 7 downto 0 ); -- counter for bit length\r
+       signal bok                      : std_logic;\r
+       signal cycdone          : std_logic; -- one counter period done\r
+       signal bytedone         : std_logic; -- all bits sents\r
+       signal in_sr            : std_logic_vector( 8 downto 0 ); -- shift register for byte in\r
+       signal out_sr           : std_logic_vector( 8 downto 0 ); -- shift register for byte out\r
+       signal i2c_back         : std_logic_vector( 8 downto 0 ); -- shift register for byte in\r
+       signal r_sda            : std_logic; -- output for SDA\r
+       signal s_sda            : std_logic; -- output for SDA\r
+       signal load                     : std_logic; -- delay register\r
+       signal i2c_d            : std_logic; -- auxiliary register\r
+\r
+-- Moduls\r
+\r
+begin\r
+\r
+-- Bit counter (for byte to send)\r
+THE_BIT_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       bctr <= (others => '0');\r
+               elsif( rst_bit = '1' ) then\r
+                       bctr <= (others => '0');\r
+               elsif( inc_bit = '1' ) then\r
+                       bctr <= bctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_CTR_PROC;\r
+\r
+-- end of byte recognition\r
+bytedone <= '1' when (bctr = x"9") else '0';\r
+\r
+-- Countdown for one half of SCL (adjustable clock width)\r
+THE_CYC_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       cctr <= (others => '0');\r
+               elsif( load_cyc = '1' ) then \r
+                       cctr <= i2c_speed_in;\r
+               elsif( dec_cyc = '1' ) then\r
+                       cctr <= cctr - 1;\r
+               end if;\r
+       end if;\r
+end process THE_CYC_CTR_PROC;\r
+\r
+-- end of cycle recognition\r
+cycdone <= '1' when (cctr = x"00") else '0';\r
+       \r
+-- Bit output\r
+THE_BIT_OUT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       out_sr <= (others => '0');\r
+                       i2c_d <= '1';\r
+               elsif( load_sr = '1' ) then\r
+                       out_sr <= i2c_byte_in;\r
+                       i2c_d  <= '1';\r
+               elsif( shift_o = '1' ) then\r
+                       i2c_d <= out_sr(8);\r
+                       out_sr(8 downto 0) <= out_sr(7 downto 0) & '0';\r
+               end if;\r
+       end if;\r
+end process THE_BIT_OUT_PROC;\r
+\r
+-- Bit input\r
+THE_BIT_IN_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then  \r
+               if   ( reset_in = '1' ) then\r
+                       in_sr <= (others => '1');\r
+               elsif( shift_o = '1' ) then\r
+                       in_sr(8 downto 1) <= in_sr(7 downto 0);\r
+                       in_sr(0) <= sda_in;\r
+               end if;\r
+       end if;\r
+end process THE_BIT_IN_PROC;\r
+\r
+-- Output register for readback data (could be reduced to SR_IN_INT)\r
+THE_I2C_BACK_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       i2c_back <= (others => '1');\r
+               elsif( shift_i = '1' ) then\r
+                       i2c_back(8 downto 1) <= in_sr(7 downto 0);\r
+                       i2c_back(0) <= sda_in;\r
+               end if;\r
+       end if;\r
+end process THE_I2C_BACK_PROC;\r
+\r
+-- ByteOK is the inverted ACK bit from readback data.\r
+bok <= not i2c_back(0); -- BUG\r
+\r
+-- The main state machine\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1') then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       inc_bit       <= '0';\r
+                       rst_bit       <= '0';\r
+                       load_cyc      <= '0';\r
+                       dec_cyc       <= '0';\r
+                       load_sr       <= '0';\r
+                       shift_o       <= '0';\r
+                       shift_i       <= '0';\r
+                       bdone         <= '0';\r
+                       r_scl         <= '0';\r
+                       s_scl         <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       inc_bit       <= inc_bit_x;\r
+                       rst_bit       <= rst_bit_x;\r
+                       load_cyc      <= load_cyc_x;\r
+                       dec_cyc       <= dec_cyc_x;\r
+                       load_sr       <= load_sr_x;\r
+                       shift_o       <= shift_o_x;\r
+                       shift_i       <= shift_i_x;\r
+                       bdone         <= bdone_x;\r
+                       r_scl         <= r_scl_x;\r
+                       s_scl         <= s_scl_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, dobyte_in, cycdone, bytedone)\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       inc_bit_x  <= '0';\r
+       rst_bit_x  <= '0';\r
+       load_cyc_x <= '0';\r
+       dec_cyc_x  <= '0';\r
+       load_sr_x  <= '0';\r
+       shift_o_x  <= '0';\r
+       shift_i_x  <= '0';\r
+       bdone_x    <= '0';\r
+       r_scl_x    <= '0';\r
+       s_scl_x    <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( dobyte_in = '1' ) then\r
+                                                       NEXT_STATE <= LCL;\r
+                                                       inc_bit_x  <= '1';\r
+                                                       load_cyc_x <= '1';\r
+                                                       shift_o_x  <= '1';\r
+                                                       r_scl_x    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                                       load_sr_x  <= '1';\r
+                                               end if;\r
+               when LCL        =>      NEXT_STATE <= WCL;\r
+                                               dec_cyc_x  <= '1';\r
+               when WCL        =>      if( cycdone = '1' ) then\r
+                                                       NEXT_STATE <= LCH;\r
+                                                       load_cyc_x <= '1';\r
+                                                       s_scl_x    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WCL;\r
+                                                       dec_cyc_x  <= '1';\r
+                                               end if;\r
+               when LCH        =>      NEXT_STATE <= WCH;\r
+                                               dec_cyc_x  <= '1';\r
+               when WCH        =>      if   ( (cycdone = '1') and (bytedone = '0') ) then\r
+                                                       NEXT_STATE <= LCL;\r
+                                                       inc_bit_x  <= '1';\r
+                                                       load_cyc_x <= '1';\r
+                                                       shift_o_x  <= '1';\r
+                                                       r_scl_x    <= '1';\r
+                                               elsif( (cycdone = '1') and (bytedone = '1') ) then\r
+                                                       NEXT_STATE <= FREE;\r
+                                                       shift_o_x  <= '1';\r
+                                                       shift_i_x  <= '1';\r
+                                                       r_scl_x    <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WCH;\r
+                                                       dec_cyc_x  <= '1';\r
+                                               end if;\r
+               when FREE       =>      NEXT_STATE <= DONE;\r
+                                               rst_bit_x  <= '1';\r
+                                               bdone_x    <= '1';\r
+               when DONE       =>      if( dobyte_in = '0' ) then\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               else\r
+                                                       NEXT_STATE <= DONE;\r
+                                                       rst_bit_x  <= '1';\r
+                                                       bdone_x    <= '1';\r
+                                               end if;\r
+                               -- Just in case...\r
+               when others =>  NEXT_STATE <= SLEEP; \r
+       end case;\r
+end process TRANSFORM;\r
+\r
+-- Output decoding\r
+DECODE: process(CURRENT_STATE)\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm <= x"0";\r
+               when LCL        =>      bsm <= x"1";\r
+               when WCL        =>      bsm <= x"2";\r
+               when LCH        =>      bsm <= x"3";\r
+               when WCH        =>      bsm <= x"4";\r
+               when FREE       =>      bsm <= x"5";\r
+               when DONE       =>      bsm <= x"6";\r
+               when others     =>      bsm <= x"f";\r
+       end case;                                                \r
+end process DECODE;\r
+\r
+-- SCL and SDA output pulses\r
+THE_SDA_OUT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       load  <= '0'; -- was a bug, found 081008\r
+                       r_sda <= '0';\r
+                       s_sda <= '0';\r
+               else\r
+                       load  <= shift_o; \r
+                       r_sda <= load and not i2c_d;\r
+                       s_sda <= load and     i2c_d;\r
+               end if;\r
+       end if;\r
+end process THE_SDA_OUT_PROC;\r
+\r
+-- Outputs\r
+r_scl_out    <= r_scl;\r
+s_scl_out    <= s_scl;\r
+r_sda_out    <= r_sda;\r
+s_sda_out    <= s_sda;\r
+\r
+i2c_back_out <= i2c_back;\r
+\r
+bdone_out    <= bdone;\r
+bok_out      <= bok;\r
+\r
+-- Debugging   \r
+bsm_out      <= bsm;\r
+\r
+end Behavioral;\r
diff --git a/src/i2c_slim.vhd b/src/i2c_slim.vhd
new file mode 100644 (file)
index 0000000..5c347ea
--- /dev/null
@@ -0,0 +1,447 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- BUG: does alway set bit 0 of address byte to zero !!!!\r
+-- REMARK: this is not a bug, but a feature....\r
+\r
+entity i2c_slim is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- I2C command / setup\r
+         I2C_GO_IN             : in    std_logic; -- startbit to trigger I2C actions\r
+         ACTION_IN             : in    std_logic; -- '0' -> write, '1' -> read\r
+         I2C_SPEED_IN  : in    std_logic_vector( 5 downto 0 ); -- speed adjustment (to be defined)\r
+         I2C_ADR_IN    : in    std_logic_vector( 7 downto 0 ); -- I2C address byte (R/W bit is ignored)\r
+         I2C_CMD_IN    : in    std_logic_vector( 7 downto 0 ); -- I2C command byte (sent after address byte)\r
+         I2C_DW_IN             : in    std_logic_vector( 7 downto 0 ); -- data word for write command\r
+         I2C_DR_OUT    : out   std_logic_vector( 7 downto 0 ); -- data word from read command\r
+         STATUS_OUT    : out   std_logic_vector( 7 downto 0 ); -- status and error bits\r
+         I2C_BUSY_OUT  : out   std_logic;\r
+         -- I2C connections\r
+         SDA_IN                : in    std_logic;\r
+         SDA_OUT               : out   std_logic;\r
+         SCL_IN                : in    std_logic;\r
+         SCL_OUT               : out   std_logic;\r
+         -- Debug\r
+         STAT                  : out   std_logic_vector(31 downto 0)\r
+       );\r
+end i2c_slim;\r
+\r
+architecture Behavioral of i2c_slim is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,LOADA,GSTART,SENDA,LOADC,SENDC,LOADD,SENDD,GSTOP,INC,\r
+                                       E_START,E_ADDR,E_CMD,E_WD,E_RSTART,E_RADDR,DONE,FAILED,CLRERR);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+       \r
+       signal bsm                      : std_logic_vector( 4 downto 0 );\r
+       signal phase            : std_logic; -- '0' => first phase, '1' => second phase of read cycle\r
+\r
+       signal start_x          : std_logic;\r
+       signal start            : std_logic; -- '0' => generate STOP, '1' => generate START\r
+       signal dostart_x        : std_logic;\r
+       signal dostart          : std_logic; -- trigger the GenStart module\r
+       signal dobyte_x         : std_logic;\r
+       signal dobyte           : std_logic; -- trigger the ByteSend module\r
+       signal i2c_done_x       : std_logic;\r
+       signal i2c_done         : std_logic; -- acknowledge signal to the outside world\r
+       signal running_x        : std_logic;\r
+       signal running          : std_logic; -- legacy\r
+\r
+       signal load_a_x         : std_logic;\r
+       signal load_a           : std_logic;\r
+       signal load_c_x         : std_logic;\r
+       signal load_c           : std_logic;\r
+       signal load_d_x         : std_logic;\r
+       signal load_d           : std_logic;\r
+\r
+       signal sdone            : std_logic; -- acknowledge signal from GenStart module\r
+       signal sok                      : std_logic; -- status signal from GenStart module\r
+       signal bdone            : std_logic; -- acknowledge signal from SendByte module\r
+       signal bok                      : std_logic; -- status signal from SendByte module\r
+       signal e_sf                     : std_logic; -- Start failed\r
+       signal e_anak           : std_logic; -- Adress byte NAK\r
+       signal e_cnak           : std_logic; -- Command byte NAK\r
+       signal e_dnak           : std_logic; -- Data byte NAK\r
+       signal e_rsf            : std_logic; -- Repeated Start failed\r
+       signal e_ranak          : std_logic; -- Repeated Adress NAK\r
+       signal i2c_byte         : std_logic_vector( 8 downto 0 );\r
+       signal i2c_dr           : std_logic_vector( 8 downto 0 );\r
+\r
+       signal s_scl            : std_logic;\r
+       signal r_scl            : std_logic;\r
+       signal s_sda            : std_logic;\r
+       signal r_sda            : std_logic;\r
+       signal r_scl_gs         : std_logic;\r
+       signal s_scl_gs         : std_logic;\r
+       signal r_sda_gs         : std_logic;\r
+       signal s_sda_gs         : std_logic;\r
+       signal r_scl_sb         : std_logic;\r
+       signal s_scl_sb         : std_logic;\r
+       signal r_sda_sb         : std_logic;\r
+       signal s_sda_sb         : std_logic;\r
+\r
+       signal gs_debug         : std_logic_vector(3 downto 0);\r
+\r
+       signal i2c_speed        : std_logic_vector(7 downto 0);\r
+\r
+begin\r
+\r
+i2c_speed <= i2c_speed_in & "00";\r
+\r
+-- Read phase indicator\r
+THE_PHASE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       phase <= '0';\r
+               elsif( CURRENT_STATE = INC ) then\r
+                       phase <= '1';\r
+               elsif( (CURRENT_STATE = DONE) or (CURRENT_STATE = SLEEP) ) then\r
+                       phase <= '0';\r
+               end if;\r
+       end if;\r
+end process THE_PHASE_PROC;\r
+\r
+-- The main state machine\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       start         <= '0';\r
+                       dostart       <= '0';\r
+                       dobyte        <= '0';\r
+                       i2c_done      <= '0';\r
+                       running       <= '0';\r
+                       load_a        <= '0';\r
+                       load_c        <= '0';\r
+                       load_d        <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       start         <= start_x;\r
+                       dostart       <= dostart_x;\r
+                       dobyte        <= dobyte_x;\r
+                       i2c_done      <= i2c_done_x;\r
+                       running       <= running_x;\r
+                       load_a        <= load_a_x;\r
+                       load_c        <= load_c_x;\r
+                       load_d        <= load_d_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, i2c_go_in, sdone, sok, phase, bdone, bok, action_in)\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       start_x    <= '0';\r
+       dostart_x  <= '0';\r
+       dobyte_x   <= '0';\r
+       i2c_done_x <= '0';\r
+       running_x  <= '1';\r
+       load_a_x   <= '0';\r
+       load_c_x   <= '0';\r
+       load_d_x   <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if( i2c_go_in = '1' ) then\r
+                                                               NEXT_STATE <= CLRERR;\r
+                                                       else\r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                               running_x  <= '0';\r
+                                                       end if;\r
+               when CLRERR             =>      NEXT_STATE <= LOADA;\r
+                                                       load_a_x   <= '1';\r
+               when LOADA              =>      NEXT_STATE <= GSTART;\r
+                                                       start_x    <= '1';\r
+                                                       dostart_x  <= '1';\r
+               when GSTART             =>      if   ( (sdone = '1') and (sok = '1') ) then\r
+                                                               NEXT_STATE <= SENDA;\r
+                                                               dobyte_x   <= '1';\r
+                                                       elsif( (sdone = '1') and (sok = '0') and (phase = '0') ) then\r
+                                                               NEXT_STATE <= E_START; -- first START condition failed\r
+                                                       elsif( (sdone = '1') and (sok = '0') and (phase = '1') ) then\r
+                                                               NEXT_STATE <= E_RSTART; -- second START condition failed\r
+                                                       else\r
+                                                               NEXT_STATE <= GSTART;\r
+                                                               start_x    <= '1';\r
+                                                               dostart_x  <= '1';\r
+                                                       end if;\r
+               when E_START    =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when E_RSTART   =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when SENDA              =>      if   ( (bdone = '1') and (bok = '1') and (action_in = '0') ) then\r
+                                                               NEXT_STATE <= LOADC; -- I2C write\r
+                                                               load_c_x   <= '1'; \r
+                                                       elsif( (bdone = '1') and (bok = '1') and (action_in = '1') and (phase = '0') ) then\r
+                                                               NEXT_STATE <= LOADC;    -- I2C read, send register address\r
+                                                               load_c_x   <= '1';\r
+                                                       elsif( (bdone = '1') and (bok = '1') and (action_in = '1') and (phase = '1') ) then\r
+                                                               NEXT_STATE <= LOADD;    -- I2C read, send 0xff dummy byte\r
+                                                               load_d_x   <= '1';\r
+                                                       elsif( (bdone = '1') and (bok = '0') and (phase = '0') ) then\r
+                                                               NEXT_STATE <= E_ADDR; -- first address phase failed\r
+                                                       elsif( (bdone = '1') and (bok = '0') and (phase = '1') ) then\r
+                                                               NEXT_STATE <= E_RADDR; -- second address phase failed\r
+                                                       else\r
+                                                               NEXT_STATE <= SENDA;\r
+                                                               dobyte_x   <= '1';\r
+                                                       end if;\r
+               when E_ADDR             =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when E_RADDR    =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when LOADC              =>      NEXT_STATE <= SENDC;\r
+--                                                     dobyte_x   <= '1';\r
+               when SENDC              =>      if   ( (bdone = '1') and (bok = '1') and (action_in = '0') ) then\r
+                                                               NEXT_STATE <= LOADD; -- I2C write, prepare data\r
+                                                               load_d_x   <= '1';\r
+                                                       elsif( (bdone = '1') and (bok = '1') and (action_in = '1') ) then\r
+                                                               NEXT_STATE <= GSTOP; -- I2C read, first phase ends\r
+                                                               dostart_x  <= '1';\r
+                                                       elsif( (bdone = '1') and (bok = '0') ) then\r
+                                                               NEXT_STATE <= E_CMD; -- command phase failed\r
+                                                       else\r
+                                                               NEXT_STATE <= SENDC;\r
+                                                               dobyte_x   <= '1';\r
+                                                       end if; \r
+               when E_CMD              =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when LOADD              =>      NEXT_STATE <= SENDD;\r
+               when SENDD              =>      if   ( (bdone = '1') and (bok = '1') and (action_in = '0') ) then\r
+                                                               NEXT_STATE <= GSTOP;    -- I2C write, data phase failed\r
+                                                               dostart_x  <= '1';\r
+                                                       elsif( (bdone = '1') and                 (action_in = '1') ) then\r
+                                                               NEXT_STATE <= GSTOP; -- I2C read, data phase\r
+                                                               dostart_x  <= '1'; \r
+                                                       elsif( (bdone = '1') and (bok = '0') and (action_in = '0') ) then\r
+                                                               NEXT_STATE <= E_WD; -- I2C write, data phase failed\r
+                                                       else\r
+                                                               NEXT_STATE <= SENDD;\r
+                                                               dobyte_x   <= '1';\r
+                                                       end if;\r
+               when E_WD               =>      NEXT_STATE <= FAILED;\r
+                                                       dostart_x  <= '1';\r
+               when GSTOP              =>      if   ( (sdone = '1') and (action_in = '0') ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       elsif( (sdone = '1') and (action_in = '1') and (phase = '1') ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       elsif( (sdone = '1') and (action_in = '1') and (phase = '0') ) then\r
+                                                               NEXT_STATE <= INC;\r
+                                                       else\r
+                                                               NEXT_STATE <= GSTOP;\r
+                                                               dostart_x  <= '1';\r
+                                                       end if;\r
+               when INC                =>      NEXT_STATE <= LOADA;\r
+                                                       load_a_x   <= '1';\r
+               when FAILED             =>      if( sdone = '1' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               i2c_done_x <= '1';\r
+                                                               running_x  <= '0';\r
+                                                       else\r
+                                                               NEXT_STATE <= FAILED;\r
+                                                               dostart_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      if( i2c_go_in = '1' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               i2c_done_x <= '1';\r
+                                                               running_x  <= '0';\r
+                                                       else\r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+                               -- Just in case...\r
+               when others     =>      NEXT_STATE <= SLEEP; \r
+       end case;\r
+end process TRANSFORM;\r
+\r
+-- Output decoding\r
+DECODE: process(CURRENT_STATE)\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      bsm <= b"00000"; -- 00\r
+               when CLRERR             =>      bsm <= b"01100"; -- 0c\r
+               when LOADA              =>      bsm <= b"00001"; -- 01\r
+               when GSTART             =>      bsm <= b"00010"; -- 02\r
+               when SENDA              =>      bsm <= b"00011"; -- 03\r
+               when LOADC              =>      bsm <= b"00100"; -- 04\r
+               when SENDC              =>      bsm <= b"00101"; -- 05\r
+               when LOADD              =>      bsm <= b"00110"; -- 06\r
+               when SENDD              =>      bsm <= b"00111"; -- 07\r
+               when GSTOP              =>      bsm <= b"01000"; -- 08\r
+               when INC                =>      bsm <= b"01001"; -- 09\r
+               when FAILED             =>      bsm <= b"01010"; -- 0a\r
+               when DONE               =>      bsm <= b"01011"; -- 0b\r
+               when E_START    =>      bsm <= b"10000"; -- 10\r
+               when E_RSTART   =>      bsm <= b"10001"; -- 11\r
+               when E_ADDR             =>      bsm <= b"10010"; -- 12\r
+               when E_RADDR    =>      bsm <= b"10011"; -- 13\r
+               when E_CMD              =>      bsm <= b"10100"; -- 14\r
+               when E_WD               =>      bsm <= b"10101"; -- 15\r
+               when others             =>      bsm <= b"11111"; -- 1f\r
+       end case;                                                        \r
+end process DECODE;\r
+\r
+-- We need to load different data sets\r
+--LOAD_DATA_PROC: process( clk_in, reset_in, CURRENT_STATE, action_in, phase)\r
+LOAD_DATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       i2c_byte <= (others => '1');\r
+               elsif( (CURRENT_STATE = LOADA) and (phase = '0') ) then\r
+                       i2c_byte <= i2c_adr_in(6 downto 0) & '0' & '1'; -- send write address, receive ACK\r
+               elsif( (CURRENT_STATE = LOADA) and (phase = '1') ) then\r
+                       i2c_byte <= i2c_adr_in(6 downto 0) & '1' & '1'; -- send read address, receive ACK\r
+               elsif( (CURRENT_STATE = LOADC) and (action_in = '0') ) then\r
+                       i2c_byte <= i2c_cmd_in(7 downto 1) & '0' & '1'; -- send command byte (WRITE), receive ACK\r
+               elsif( (CURRENT_STATE = LOADC) and (action_in = '1') ) then\r
+                       i2c_byte <= i2c_cmd_in(7 downto 1) & '1' & '1'; -- send command byte (READ), receive ACK\r
+               elsif( (CURRENT_STATE = LOADD) and (action_in = '0') ) then\r
+                       i2c_byte <= i2c_dw_in & '1'; -- send data byte, receive ACK\r
+               elsif( (CURRENT_STATE = LOADD) and (action_in = '1') ) then\r
+                       i2c_byte <= x"ff" & '1'; -- send 0xff byte, send NACK\r
+               end if;\r
+       end if;\r
+end process LOAD_DATA_PROC;\r
+\r
+-- The SendByte module\r
+THE_I2C_SENDB: I2C_SENDB\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 DOBYTE_IN             => dobyte,\r
+                 I2C_SPEED_IN  => i2c_speed,\r
+                 I2C_BYTE_IN   => i2c_byte,\r
+                 I2C_BACK_OUT  => i2c_dr,\r
+                 SDA_IN                => sda_in,\r
+                 R_SDA_OUT             => r_sda_sb,\r
+                 S_SDA_OUT             => s_sda_sb,\r
+--               SCL_IN                => scl_in,\r
+                 R_SCL_OUT             => r_scl_sb,\r
+                 S_SCL_OUT             => s_scl_sb,\r
+                 BDONE_OUT             => bdone,\r
+                 BOK_OUT               => bok,\r
+                 BSM_OUT               => open\r
+               );\r
+\r
+-- The GenStart module\r
+THE_I2C_GSTART: I2C_GSTART\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 START_IN              => start,\r
+          DOSTART_IN   => dostart,\r
+                 I2C_SPEED_IN  => i2c_speed,\r
+                 SDONE_OUT             => sdone,\r
+                 SOK_OUT               => sok,\r
+                 SDA_IN                => sda_in,\r
+                 SCL_IN                => scl_in,\r
+                 R_SCL_OUT             => r_scl_gs,\r
+                 S_SCL_OUT             => s_scl_gs,\r
+                 R_SDA_OUT             => r_sda_gs,\r
+                 S_SDA_OUT             => s_sda_gs,\r
+                 BSM_OUT               => gs_debug --open\r
+           );\r
+\r
+r_scl <= r_scl_gs or r_scl_sb;\r
+s_scl <= s_scl_gs or s_scl_sb;\r
+r_sda <= r_sda_gs or r_sda_sb;\r
+s_sda <= s_sda_gs or s_sda_sb;\r
+\r
+-- Output flipflops for SCL and SDA lines\r
+THE_SCL_SDA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       scl_out <= '1';\r
+                       sda_out <= '1';\r
+               elsif( (r_scl = '1') and (s_scl = '0') ) then\r
+                       scl_out <= '0';\r
+               elsif( (r_scl = '0') and (s_scl = '1') ) then\r
+                       scl_out <= '1';\r
+               elsif( (r_sda = '1') and (s_sda = '0') ) then\r
+                       sda_out <= '0';\r
+               elsif( (r_sda = '0') and (s_sda = '1') ) then\r
+                       sda_out <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_SCL_SDA_PROC;\r
+\r
+-- Error bits\r
+THE_ERR_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       e_sf            <= '0';\r
+                       e_anak          <= '0';\r
+                       e_cnak          <= '0';\r
+                       e_dnak          <= '0';\r
+                       e_rsf           <= '0';\r
+                       e_ranak         <= '0';\r
+               elsif( CURRENT_STATE = CLRERR ) then\r
+                       e_sf            <= '0';\r
+                       e_anak          <= '0';\r
+                       e_cnak          <= '0';\r
+                       e_dnak          <= '0';\r
+                       e_rsf           <= '0';\r
+                       e_ranak         <= '0';\r
+               elsif( CURRENT_STATE = E_START ) then\r
+                       e_sf            <= '1';\r
+               elsif( CURRENT_STATE = E_RSTART ) then\r
+                       e_rsf           <= '1';\r
+               elsif( CURRENT_STATE = E_ADDR ) then\r
+                       e_anak          <= '1';\r
+               elsif( CURRENT_STATE = E_RADDR ) then\r
+                       e_ranak         <= '1';\r
+               elsif( CURRENT_STATE = E_CMD ) then\r
+                       e_cnak          <= '1';\r
+               elsif( CURRENT_STATE = E_WD ) then\r
+                       e_dnak          <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_ERR_REG_PROC;\r
+\r
+status_out(7) <= running;\r
+status_out(6) <= i2c_done;\r
+status_out(5) <= e_ranak;\r
+status_out(4) <= e_rsf;\r
+status_out(3) <= e_dnak;\r
+status_out(2) <= e_cnak;\r
+status_out(1) <= e_anak;\r
+status_out(0) <= e_sf;\r
+\r
+-- Outputs     \r
+i2c_dr_out             <= i2c_dr(8 downto 1);\r
+i2c_busy_out    <= running;\r
+\r
+-- Debug stuff\r
+stat(31 downto 28) <= (others => '0');\r
+stat(27)           <= s_sda;\r
+stat(26)           <= r_sda;\r
+stat(25)           <= s_scl;\r
+stat(24)           <= r_scl;\r
+stat(23)           <= s_sda_sb;\r
+stat(22)           <= r_sda_sb;\r
+stat(21)           <= s_scl_sb;\r
+stat(20)           <= r_scl_sb;\r
+stat(19)           <= s_sda_gs;\r
+stat(18)           <= r_sda_gs;\r
+stat(17)           <= s_scl_gs;\r
+stat(16)           <= r_scl_gs;\r
+stat(15 downto 12) <= gs_debug;\r
+stat(11)           <= bok;\r
+stat(10)           <= bdone;\r
+stat(9)            <= dobyte;\r
+stat(8)            <= sok;\r
+stat(7)            <= dobyte;\r
+stat(6)            <= s_sda_sb;\r
+stat(5)            <= r_sda_sb;\r
+stat(4 downto 0)   <= bsm;\r
+\r
+\r
+end Behavioral;\r
diff --git a/src/input_bram.lpc b/src/input_bram.lpc
new file mode 100644 (file)
index 0000000..3c20b62
--- /dev/null
@@ -0,0 +1,50 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=RAM_DP\r
+CoreRevision=6.1\r
+ModuleName=input_bram\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=09/14/2009\r
+Time=12:58:01\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+RAddress=2048\r
+RData=18\r
+WAddress=2048\r
+WData=18\r
+enByte=0\r
+ByteSize=9\r
+adPipeline=0\r
+inPipeline=0\r
+outPipeline=1\r
+MOR=0\r
+InData=Registered\r
+AdControl=Registered\r
+MemFile=\r
+MemFormat=hex\r
+Reset=Sync\r
+GSR=Enabled\r
+Pad=0\r
+EnECC=0\r
+Optimization=Speed\r
+EnSleep=ENABLED\r
+Pipeline=0\r
diff --git a/src/input_bram.srp b/src/input_bram.srp
new file mode 100644 (file)
index 0000000..22a45ab
--- /dev/null
@@ -0,0 +1,28 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Mon Sep 14 12:58:01 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n input_bram -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 11 -rwidth 18 -waddr_width 11 -wwidth 18 -rnum_words 2048 -wnum_words 2048 -outdata REGISTERED -resetmode SYNC -cascade -1 -e 
+    Circuit name     : input_bram
+    Module type      : RAM_DP
+    Module Version   : 6.1
+    Ports            : 
+       Inputs       : WrAddress[10:0], RdAddress[10:0], Data[17:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn
+       Outputs      : Q[17:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : input_bram.vhd
+    VHDL template    : input_bram_tmpl.vhd
+    VHDL testbench    : tb_input_bram_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : input_bram.srp
+    Element Usage    :
+         DP16KB : 2
+    Estimated Resource Usage:
+            EBR : 2
diff --git a/src/input_bram.vhd b/src/input_bram.vhd
new file mode 100644 (file)
index 0000000..050f155
--- /dev/null
@@ -0,0 +1,249 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type bram -wp 10 -rp 0011 -rdata_width 18 -data_width 18 -num_rows 2048 -outdata REGISTERED -resetmode SYNC -cascade -1 -e 
+
+-- Mon Sep 14 12:58:01 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity input_bram is
+    port (
+        WrAddress: in  std_logic_vector(10 downto 0); 
+        RdAddress: in  std_logic_vector(10 downto 0); 
+        Data: in  std_logic_vector(17 downto 0); 
+        WE: in  std_logic; 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        Q: out  std_logic_vector(17 downto 0));
+end input_bram;
+
+architecture Structure of input_bram is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute GSR : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute MEM_LPC_FILE of input_bram_0_0_1 : label is "input_bram.lpc";
+    attribute MEM_INIT_FILE of input_bram_0_0_1 : label is "";
+    attribute CSDECODE_B of input_bram_0_0_1 : label is "0b000";
+    attribute CSDECODE_A of input_bram_0_0_1 : label is "0b000";
+    attribute WRITEMODE_B of input_bram_0_0_1 : label is "NORMAL";
+    attribute WRITEMODE_A of input_bram_0_0_1 : label is "NORMAL";
+    attribute GSR of input_bram_0_0_1 : label is "DISABLED";
+    attribute RESETMODE of input_bram_0_0_1 : label is "SYNC";
+    attribute REGMODE_B of input_bram_0_0_1 : label is "OUTREG";
+    attribute REGMODE_A of input_bram_0_0_1 : label is "OUTREG";
+    attribute DATA_WIDTH_B of input_bram_0_0_1 : label is "9";
+    attribute DATA_WIDTH_A of input_bram_0_0_1 : label is "9";
+    attribute MEM_LPC_FILE of input_bram_0_1_0 : label is "input_bram.lpc";
+    attribute MEM_INIT_FILE of input_bram_0_1_0 : label is "";
+    attribute CSDECODE_B of input_bram_0_1_0 : label is "0b000";
+    attribute CSDECODE_A of input_bram_0_1_0 : label is "0b000";
+    attribute WRITEMODE_B of input_bram_0_1_0 : label is "NORMAL";
+    attribute WRITEMODE_A of input_bram_0_1_0 : label is "NORMAL";
+    attribute GSR of input_bram_0_1_0 : label is "DISABLED";
+    attribute RESETMODE of input_bram_0_1_0 : label is "SYNC";
+    attribute REGMODE_B of input_bram_0_1_0 : label is "OUTREG";
+    attribute REGMODE_A of input_bram_0_1_0 : label is "OUTREG";
+    attribute DATA_WIDTH_B of input_bram_0_1_0 : label is "9";
+    attribute DATA_WIDTH_A of input_bram_0_1_0 : label is "9";
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    input_bram_0_0_1: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "SYNC", 
+        REGMODE_B=> "OUTREG", REGMODE_A=> "OUTREG", DATA_WIDTH_B=>  9, 
+        DATA_WIDTH_A=>  9)
+        -- synopsys translate_on
+        port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), 
+            DIA3=>Data(3), DIA4=>Data(4), DIA5=>Data(5), DIA6=>Data(6), 
+            DIA7=>Data(7), DIA8=>Data(8), DIA9=>scuba_vlo, 
+            DIA10=>scuba_vlo, DIA11=>scuba_vlo, DIA12=>scuba_vlo, 
+            DIA13=>scuba_vlo, DIA14=>scuba_vlo, DIA15=>scuba_vlo, 
+            DIA16=>scuba_vlo, DIA17=>scuba_vlo, ADA0=>scuba_vlo, 
+            ADA1=>scuba_vlo, ADA2=>scuba_vlo, ADA3=>WrAddress(0), 
+            ADA4=>WrAddress(1), ADA5=>WrAddress(2), ADA6=>WrAddress(3), 
+            ADA7=>WrAddress(4), ADA8=>WrAddress(5), ADA9=>WrAddress(6), 
+            ADA10=>WrAddress(7), ADA11=>WrAddress(8), 
+            ADA12=>WrAddress(9), ADA13=>WrAddress(10), CEA=>WrClockEn, 
+            CLKA=>WrClock, WEA=>WE, CSA0=>scuba_vlo, CSA1=>scuba_vlo, 
+            CSA2=>scuba_vlo, RSTA=>Reset, DIB0=>scuba_vlo, 
+            DIB1=>scuba_vlo, DIB2=>scuba_vlo, DIB3=>scuba_vlo, 
+            DIB4=>scuba_vlo, DIB5=>scuba_vlo, DIB6=>scuba_vlo, 
+            DIB7=>scuba_vlo, DIB8=>scuba_vlo, DIB9=>scuba_vlo, 
+            DIB10=>scuba_vlo, DIB11=>scuba_vlo, DIB12=>scuba_vlo, 
+            DIB13=>scuba_vlo, DIB14=>scuba_vlo, DIB15=>scuba_vlo, 
+            DIB16=>scuba_vlo, DIB17=>scuba_vlo, ADB0=>scuba_vlo, 
+            ADB1=>scuba_vlo, ADB2=>scuba_vlo, ADB3=>RdAddress(0), 
+            ADB4=>RdAddress(1), ADB5=>RdAddress(2), ADB6=>RdAddress(3), 
+            ADB7=>RdAddress(4), ADB8=>RdAddress(5), ADB9=>RdAddress(6), 
+            ADB10=>RdAddress(7), ADB11=>RdAddress(8), 
+            ADB12=>RdAddress(9), ADB13=>RdAddress(10), CEB=>RdClockEn, 
+            CLKB=>RdClock, WEB=>scuba_vlo, CSB0=>scuba_vlo, 
+            CSB1=>scuba_vlo, CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>open, 
+            DOA1=>open, DOA2=>open, DOA3=>open, DOA4=>open, DOA5=>open, 
+            DOA6=>open, DOA7=>open, DOA8=>open, DOA9=>open, DOA10=>open, 
+            DOA11=>open, DOA12=>open, DOA13=>open, DOA14=>open, 
+            DOA15=>open, DOA16=>open, DOA17=>open, DOB0=>Q(0), 
+            DOB1=>Q(1), DOB2=>Q(2), DOB3=>Q(3), DOB4=>Q(4), DOB5=>Q(5), 
+            DOB6=>Q(6), DOB7=>Q(7), DOB8=>Q(8), DOB9=>open, DOB10=>open, 
+            DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, 
+            DOB15=>open, DOB16=>open, DOB17=>open);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    input_bram_0_1_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "SYNC", 
+        REGMODE_B=> "OUTREG", REGMODE_A=> "OUTREG", DATA_WIDTH_B=>  9, 
+        DATA_WIDTH_A=>  9)
+        -- synopsys translate_on
+        port map (DIA0=>Data(9), DIA1=>Data(10), DIA2=>Data(11), 
+            DIA3=>Data(12), DIA4=>Data(13), DIA5=>Data(14), 
+            DIA6=>Data(15), DIA7=>Data(16), DIA8=>Data(17), 
+            DIA9=>scuba_vlo, DIA10=>scuba_vlo, DIA11=>scuba_vlo, 
+            DIA12=>scuba_vlo, DIA13=>scuba_vlo, DIA14=>scuba_vlo, 
+            DIA15=>scuba_vlo, DIA16=>scuba_vlo, DIA17=>scuba_vlo, 
+            ADA0=>scuba_vlo, ADA1=>scuba_vlo, ADA2=>scuba_vlo, 
+            ADA3=>WrAddress(0), ADA4=>WrAddress(1), ADA5=>WrAddress(2), 
+            ADA6=>WrAddress(3), ADA7=>WrAddress(4), ADA8=>WrAddress(5), 
+            ADA9=>WrAddress(6), ADA10=>WrAddress(7), ADA11=>WrAddress(8), 
+            ADA12=>WrAddress(9), ADA13=>WrAddress(10), CEA=>WrClockEn, 
+            CLKA=>WrClock, WEA=>WE, CSA0=>scuba_vlo, CSA1=>scuba_vlo, 
+            CSA2=>scuba_vlo, RSTA=>Reset, DIB0=>scuba_vlo, 
+            DIB1=>scuba_vlo, DIB2=>scuba_vlo, DIB3=>scuba_vlo, 
+            DIB4=>scuba_vlo, DIB5=>scuba_vlo, DIB6=>scuba_vlo, 
+            DIB7=>scuba_vlo, DIB8=>scuba_vlo, DIB9=>scuba_vlo, 
+            DIB10=>scuba_vlo, DIB11=>scuba_vlo, DIB12=>scuba_vlo, 
+            DIB13=>scuba_vlo, DIB14=>scuba_vlo, DIB15=>scuba_vlo, 
+            DIB16=>scuba_vlo, DIB17=>scuba_vlo, ADB0=>scuba_vlo, 
+            ADB1=>scuba_vlo, ADB2=>scuba_vlo, ADB3=>RdAddress(0), 
+            ADB4=>RdAddress(1), ADB5=>RdAddress(2), ADB6=>RdAddress(3), 
+            ADB7=>RdAddress(4), ADB8=>RdAddress(5), ADB9=>RdAddress(6), 
+            ADB10=>RdAddress(7), ADB11=>RdAddress(8), 
+            ADB12=>RdAddress(9), ADB13=>RdAddress(10), CEB=>RdClockEn, 
+            CLKB=>RdClock, WEB=>scuba_vlo, CSB0=>scuba_vlo, 
+            CSB1=>scuba_vlo, CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>open, 
+            DOA1=>open, DOA2=>open, DOA3=>open, DOA4=>open, DOA5=>open, 
+            DOA6=>open, DOA7=>open, DOA8=>open, DOA9=>open, DOA10=>open, 
+            DOA11=>open, DOA12=>open, DOA13=>open, DOA14=>open, 
+            DOA15=>open, DOA16=>open, DOA17=>open, DOB0=>Q(9), 
+            DOB1=>Q(10), DOB2=>Q(11), DOB3=>Q(12), DOB4=>Q(13), 
+            DOB5=>Q(14), DOB6=>Q(15), DOB7=>Q(16), DOB8=>Q(17), 
+            DOB9=>open, DOB10=>open, DOB11=>open, DOB12=>open, 
+            DOB13=>open, DOB14=>open, DOB15=>open, DOB16=>open, 
+            DOB17=>open);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of input_bram is
+    for Structure
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/input_bram_generate.log b/src/input_bram_generate.log
new file mode 100644 (file)
index 0000000..c01e233
--- /dev/null
@@ -0,0 +1,44 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Mon Sep 14 12:58:01 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n input_bram -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 11 -rwidth 18 -waddr_width 11 -wwidth 18 -rnum_words 2048 -wnum_words 2048 -outdata REGISTERED -resetmode SYNC -cascade -1 -e \r
+    Circuit name     : input_bram\r
+    Module type      : RAM_DP\r
+    Module Version   : 6.1\r
+    Ports            : \r
+       Inputs       : WrAddress[10:0], RdAddress[10:0], Data[17:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn\r
+       Outputs      : Q[17:0]\r
+    I/O buffer       : not inserted\r
+    EDIF output      : suppressed\r
+    VHDL output      : input_bram.vhd\r
+    VHDL template    : input_bram_tmpl.vhd\r
+    VHDL testbench   : tb_input_bram_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : input_bram.srp\r
+    Estimated Resource Usage:\r
+            EBR : 2\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\input_bram.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/input_bram_tmpl.vhd b/src/input_bram_tmpl.vhd
new file mode 100644 (file)
index 0000000..7b37858
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+-- Mon Sep 14 12:58:01 2009
+
+-- parameterized module component declaration
+component input_bram
+    port (WrAddress: in  std_logic_vector(10 downto 0); 
+        RdAddress: in  std_logic_vector(10 downto 0); 
+        Data: in  std_logic_vector(17 downto 0); WE: in  std_logic; 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; Q: out  std_logic_vector(17 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : input_bram
+    port map (WrAddress(10 downto 0)=>__, RdAddress(10 downto 0)=>__, 
+        Data(17 downto 0)=>__, WE=>__, RdClock=>__, RdClockEn=>__, Reset=>__, 
+        WrClock=>__, WrClockEn=>__, Q(17 downto 0)=>__);
diff --git a/src/ipu_fifo_stage.vhd b/src/ipu_fifo_stage.vhd
new file mode 100644 (file)
index 0000000..1ef4bd4
--- /dev/null
@@ -0,0 +1,562 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- Missing: FIFO buffer handling, full / empty checks\r
+\r
+entity ipu_fifo_stage is\r
+       port( CLK_IN                                    : in    std_logic; -- 100MHz local clock\r
+                 RESET_IN                                      : in    std_logic; -- synchronous reset\r
+                 -- Slow control signals       \r
+                 SECTOR_IN                                     : in    std_logic_vector(2 downto 0);\r
+                 MODULE_IN                                     : in    std_logic_vector(2 downto 0);\r
+                 -- IPU channel connections\r
+                 IPU_NUMBER_IN                         : in    std_logic_vector(15 downto 0); -- trigger tag\r
+                 IPU_INFORMATION_IN            : in    std_logic_vector(7 downto 0); -- trigger information\r
+                 IPU_START_READOUT_IN          : in    std_logic; -- gimme data!\r
+                 IPU_DATA_OUT                          : out   std_logic_vector(31 downto 0); -- detector data, equipped with DHDR\r
+                 IPU_DATAREADY_OUT                     : out   std_logic; -- data is valid\r
+                 IPU_READOUT_FINISHED_OUT      : out   std_logic; -- no more data, end transfer, send TRM\r
+                 IPU_READ_IN                           : in    std_logic; -- read strobe, low every second cycle \r
+                 IPU_LENGTH_OUT                        : out   std_logic_vector(15 downto 0); -- length of data packet (32bit words) (?)\r
+                 IPU_ERROR_PATTERN_OUT         : out   std_logic_vector(31 downto 0); -- error pattern\r
+                 LVL2_COUNTER_OUT                      : out   std_logic_vector(15 downto 0); -- local IPU cycle counter\r
+                 -- DHDR buffer input\r
+                 DHDR_DATA_IN                          : in    std_logic_vector(31 downto 0);\r
+                 DHDR_LENGTH_IN                        : in    std_logic_vector(15 downto 0);\r
+                 DHDR_STORE_IN                         : in    std_logic;\r
+                 DHDR_BUF_FULL_OUT                     : out   std_logic;\r
+                 -- processed data input\r
+                 FIFO_START_IN                         : in    std_logic;\r
+                 FIFO_0_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_1_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_2_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_3_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_4_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_5_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_6_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_7_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_8_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_9_DATA_IN                        : in    std_logic_vector(39 downto 0);\r
+                 FIFO_10_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_11_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_12_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_13_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_14_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_15_DATA_IN                       : in    std_logic_vector(39 downto 0);\r
+                 FIFO_WE_IN                            : in    std_logic_vector(15 downto 0);\r
+                 FIFO_DONE_IN                          : in    std_logic; -- write level information into small FIFOs\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT                           : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                                       : out   std_logic_vector(63 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of ipu_fifo_stage is\r
+\r
+       -- Placer Directives\r
+       attribute HGROUP : string;\r
+       -- for whole architecture\r
+       attribute HGROUP of behavioral : architecture  is "IPU_FIFO_STAGE_group";\r
+\r
+       -- state machine definitions\r
+       type STATES is (SLEEP,RDLF,GETFD,DELH,WHDR,GETD,WAITD,WAITDL,DEL0,DONE);        \r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- signals\r
+       signal debug                            : std_logic_vector(63 downto 0);\r
+       signal bsm_x                            : std_logic_vector(7 downto 0);\r
+       signal next_trgnum_match        : std_logic;\r
+       signal trgnum_match                     : std_logic;\r
+\r
+       signal dhdr_fifo_in                     : std_logic_vector(47 downto 0);\r
+       signal dhdr_fifo_out            : std_logic_vector(47 downto 0);\r
+       signal dhdr_avail                       : std_logic;\r
+       signal next_todo_list           : std_logic_vector(15 downto 0);\r
+       signal todo_list                        : std_logic_vector(15 downto 0);\r
+       signal next_fifo_sel            : std_logic_vector(4 downto 0);\r
+       signal fifo_sel                         : std_logic_vector(4 downto 0);\r
+       signal next_sel_fifo            : std_logic_vector(15 downto 0);\r
+       signal sel_fifo                         : std_logic_vector(15 downto 0);\r
+\r
+       signal comb_rd_dfifo            : std_logic_vector(15 downto 0);\r
+       signal comb_st_data                     : std_logic_vector(15 downto 0);\r
+       signal comb_ack_todo            : std_logic;\r
+\r
+       signal ipu_out_data                     : std_logic_vector(31 downto 0);\r
+\r
+       -- state machine signals\r
+       signal next_rd_lfifo            : std_logic;\r
+       signal rd_lfifo                         : std_logic; -- read current LENGTH_FIFO information (as well as LockAtMe bit)\r
+       signal next_dataready           : std_logic;\r
+       signal dataready                        : std_logic; -- data word is available\r
+       signal next_set_hdr                     : std_logic;\r
+       signal set_hdr                          : std_logic; -- store DHDR in output register\r
+       signal next_set_data            : std_logic;\r
+       signal set_data                         : std_logic; -- store DATA from current DATA FIFO in output register\r
+       signal next_ld_todo                     : std_logic;\r
+       signal ld_todo                          : std_logic; -- load initial TODO list\r
+       signal next_ack_todo            : std_logic;\r
+       signal ack_todo                         : std_logic; -- remove current entry from TODO list\r
+       signal next_finished            : std_logic;\r
+       signal finished                         : std_logic; -- readout is finished\r
+\r
+       -- generate needs arrays...\r
+       type fifo_data_t is array (0 to 15) of std_logic_vector(26 downto 0);\r
+       signal fifo_in_data                     : fifo_data_t;\r
+       signal fifo_out_data            : fifo_data_t;\r
+       type fifo_count_t is array (0 to 15) of std_logic_vector(10 downto 0);\r
+       signal fifo_in_count            : fifo_count_t;\r
+       type fifo_todo_t is array (0 to 15) of std_logic_vector(9 downto 0);\r
+       signal fifo_todo                        : fifo_todo_t;\r
+       type fifo_ldata_t is array (0 to 15) of std_logic_vector(10 downto 0);\r
+       signal fifo_ldata                       : fifo_ldata_t;\r
+       type fifo_wcnt_t is array (0 to 15) of std_logic_vector(11 downto 0);\r
+       signal fifo_wcnt                        : fifo_wcnt_t;\r
+       signal fifo_data_free           : fifo_wcnt_t;\r
+\r
+       \r
+       signal next_fifo_done           : std_logic_vector(15 downto 0);\r
+       signal fifo_done                        : std_logic_vector(15 downto 0);\r
+       signal next_fifo_last           : std_logic;\r
+       signal fifo_last                        : std_logic;\r
+       \r
+       signal my_trg_number            : std_logic_vector(31 downto 0); -- just for checking!\r
+       \r
+       signal old_apv_num                      : std_logic_vector(3 downto 0);\r
+       signal new_apv_num                      : std_logic_vector(3 downto 0);\r
+\r
+       signal cyclectr                         : std_logic_vector(15 downto 0); -- cycle counter\r
+\r
+       signal dhdr_buf_full            : std_logic;\r
+       \r
+begin\r
+---------------------------------------------------------------------------\r
+-- Statemachine\r
+---------------------------------------------------------------------------\r
+\r
+-- state registers\r
+STATE_MEM: process( clk_in ) \r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE    <= SLEEP;\r
+                       rd_lfifo         <= '0';\r
+                       dataready        <= '0';\r
+                       set_hdr          <= '0';\r
+                       set_data         <= '0';\r
+                       ld_todo          <= '0';\r
+                       ack_todo         <= '0';\r
+                       finished         <= '0';\r
+               else\r
+                       CURRENT_STATE    <= NEXT_STATE;\r
+                       rd_lfifo         <= next_rd_lfifo;\r
+                       dataready        <= next_dataready;\r
+                       set_hdr          <= next_set_hdr;\r
+                       set_data         <= next_set_data;\r
+                       ld_todo          <= next_ld_todo;\r
+                       ack_todo         <= next_ack_todo;\r
+                       finished         <= next_finished;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, dhdr_avail, ipu_start_readout_in, ipu_read_in, fifo_last, fifo_sel(4) )\r
+begin\r
+       NEXT_STATE         <= SLEEP; -- avoid latches\r
+       next_rd_lfifo      <= '0';\r
+       next_dataready     <= '0';\r
+       next_set_hdr       <= '0';\r
+       next_set_data      <= '0';\r
+       next_ld_todo       <= '0';\r
+       next_ack_todo      <= '0';\r
+       next_finished      <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( (dhdr_avail = '1') and (ipu_start_readout_in = '1') ) then\r
+                                                       NEXT_STATE    <= RDLF;\r
+                                                       next_rd_lfifo <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= SLEEP;\r
+                                               end if;\r
+               when RDLF       =>      NEXT_STATE    <= GETFD;\r
+                                               next_set_hdr  <= '1';\r
+                                               next_ld_todo  <= '1';\r
+               when GETFD      =>      NEXT_STATE <= DELH;\r
+               when DELH       =>      NEXT_STATE     <= WHDR;\r
+                                               next_dataready <= '1';\r
+               when WHDR       =>      if   ( (ipu_read_in = '1') and (fifo_sel(4) = '0') ) then\r
+                                                       NEXT_STATE     <= GETD; -- there are datawords to send\r
+                                                       next_set_data  <= '1';\r
+                                                       next_ack_todo  <= '1';\r
+                                               elsif( (ipu_read_in = '1') and (fifo_sel(4) = '1') ) then\r
+                                                       NEXT_STATE     <= DONE; -- only DHDR, no data words\r
+                                                       next_finished  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= WHDR;\r
+                                                       next_dataready <= '1';\r
+                                               end if;\r
+               when GETD       =>      if( fifo_last = '1' ) then\r
+                                                       NEXT_STATE     <= DEL0;\r
+                                               else \r
+                                                       NEXT_STATE     <= WAITD;\r
+                                                       next_dataready <= '1';\r
+                                               end if;\r
+               when WAITD      =>      if( ipu_read_in = '1' ) then\r
+                                                       NEXT_STATE     <= GETD;\r
+                                                       next_set_data  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= WAITD;\r
+                                                       next_dataready <= '1';\r
+                                               end if;\r
+               when DEL0       =>      NEXT_STATE     <= WAITDL;\r
+                                               next_dataready <= '1';\r
+               when WAITDL     =>      if   ( (ipu_read_in = '1') and (fifo_sel(4) = '0') ) then\r
+                                                       NEXT_STATE     <= GETD;\r
+                                                       next_set_data  <= '1';\r
+                                                       next_ack_todo  <= '1';\r
+                                               elsif( (ipu_read_in = '1') and (fifo_sel(4) = '1') ) then\r
+                                                       NEXT_STATE     <= DONE;\r
+                                                       next_finished  <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= WAITDL;\r
+                                                       next_dataready <= '1';\r
+                                               end if;\r
+               when DONE       =>      if( ipu_start_readout_in = '0' ) then\r
+                                                       NEXT_STATE <= SLEEP;\r
+                                               else\r
+                                                       NEXT_STATE <= DONE;\r
+                                               end if;\r
+\r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- Handshaking to IPU data channel\r
+ipu_dataready_out        <= dataready;\r
+ipu_readout_finished_out <= finished;\r
+\r
+-- length information can be simply copied\r
+ipu_length_out <= dhdr_fifo_out(47 downto 32);\r
+\r
+-- IPU error pattern: [24] => trigger tag mismatch\r
+ipu_error_pattern_out(31 downto 25) <= (others => '0');\r
+ipu_error_pattern_out(24)           <= not trgnum_match;\r
+ipu_error_pattern_out(23 downto 0)  <= (others => '0');\r
+\r
+-- state decoding (ONLY FOR DEBUGGING!)\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_x <= x"00";\r
+               when RDLF       =>      bsm_x <= x"01";\r
+               when GETFD      =>      bsm_x <= x"02";\r
+               when DELH       =>      bsm_x <= x"03";\r
+               when WHDR       =>      bsm_x <= x"04";\r
+               when GETD       =>      bsm_x <= x"05";\r
+               when WAITD      =>      bsm_x <= x"06";\r
+               when WAITDL     =>      bsm_x <= x"07";\r
+               when DEL0       =>      bsm_x <= x"08";\r
+               when DONE       =>      bsm_x <= x"09";\r
+               when others     =>      bsm_x <= x"ff";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+---------------------------------------------------------------------------\r
+-- Aliasing the data streams\r
+---------------------------------------------------------------------------\r
+fifo_in_data(0)  <= fifo_0_data_in(26 downto 0);       fifo_in_count(0)  <= fifo_0_data_in(37 downto 27);\r
+fifo_in_data(1)  <= fifo_1_data_in(26 downto 0);       fifo_in_count(1)  <= fifo_1_data_in(37 downto 27);\r
+fifo_in_data(2)  <= fifo_2_data_in(26 downto 0);       fifo_in_count(2)  <= fifo_2_data_in(37 downto 27);\r
+fifo_in_data(3)  <= fifo_3_data_in(26 downto 0);       fifo_in_count(3)  <= fifo_3_data_in(37 downto 27);\r
+fifo_in_data(4)  <= fifo_4_data_in(26 downto 0);       fifo_in_count(4)  <= fifo_4_data_in(37 downto 27);\r
+fifo_in_data(5)  <= fifo_5_data_in(26 downto 0);       fifo_in_count(5)  <= fifo_5_data_in(37 downto 27);\r
+fifo_in_data(6)  <= fifo_6_data_in(26 downto 0);       fifo_in_count(6)  <= fifo_6_data_in(37 downto 27);\r
+fifo_in_data(7)  <= fifo_7_data_in(26 downto 0);       fifo_in_count(7)  <= fifo_7_data_in(37 downto 27);\r
+fifo_in_data(8)  <= fifo_8_data_in(26 downto 0);       fifo_in_count(8)  <= fifo_8_data_in(37 downto 27);\r
+fifo_in_data(9)  <= fifo_9_data_in(26 downto 0);       fifo_in_count(9)  <= fifo_9_data_in(37 downto 27);\r
+fifo_in_data(10) <= fifo_10_data_in(26 downto 0);      fifo_in_count(10) <= fifo_10_data_in(37 downto 27);\r
+fifo_in_data(11) <= fifo_11_data_in(26 downto 0);      fifo_in_count(11) <= fifo_11_data_in(37 downto 27);\r
+fifo_in_data(12) <= fifo_12_data_in(26 downto 0);      fifo_in_count(12) <= fifo_12_data_in(37 downto 27);\r
+fifo_in_data(13) <= fifo_13_data_in(26 downto 0);      fifo_in_count(13) <= fifo_13_data_in(37 downto 27);\r
+fifo_in_data(14) <= fifo_14_data_in(26 downto 0);      fifo_in_count(14) <= fifo_14_data_in(37 downto 27);\r
+fifo_in_data(15) <= fifo_15_data_in(26 downto 0);      fifo_in_count(15) <= fifo_15_data_in(37 downto 27);\r
+\r
+---------------------------------------------------------------------------\r
+-- DATA and LENGTH FIFO for the APV data streams\r
+---------------------------------------------------------------------------\r
+\r
+GEN_FIFO: for i in 0 to 15 generate\r
+       THE_DFIFO: fifo_2kx27\r
+       port map( DATA          => fifo_in_data(i),\r
+                         CLOCK         => clk_in, \r
+                         WREN          => fifo_we_in(i), \r
+                         RDEN          => comb_rd_dfifo(i), -- BUG\r
+                         RESET         => reset_in, \r
+                         Q                     => fifo_out_data(i), -- BUG\r
+                         WCNT          => fifo_wcnt(i), -- BUG\r
+                         EMPTY         => open, -- BUG\r
+                         FULL          => open  -- BUG\r
+                       );\r
+\r
+       -- Combinatorial read pulse for FIFOs\r
+       comb_rd_dfifo(i) <= (not fifo_done(i) and sel_fifo(i) and ipu_read_in and dataready) or (ld_todo and fifo_ldata(i)(10));   \r
+\r
+       -- Combinatorial store pulse for data (last data word need to be transfered also!)\r
+       comb_st_data(i)  <= (sel_fifo(i) and ipu_read_in and dataready);\r
+       -- BUGBUGBUG: one clock cycle too late when changing FIFOs....\r
+\r
+       -- getting the number of free entries in the data fifo by subtracting [size] - [used entries]\r
+       THE_SUBTRACTOR: suber_12bit\r
+       port map( DATAA         => x"800",\r
+                         DATAB         => fifo_wcnt(i),\r
+                         CLOCK         => clk_in,\r
+                         RESET         => reset_in,\r
+                         CLOCKEN       => '1',\r
+                         RESULT        => fifo_data_free(i)\r
+                       );\r
+\r
+       -- length fifo - stores the number of words to fetch from dfifo\r
+       THE_LFIFO: fifo_16x11\r
+       port map( DATA          => fifo_in_count(i), \r
+                         CLOCK         => clk_in,\r
+                         WREN          => fifo_done_in, \r
+                         RDEN          => rd_lfifo,\r
+                         RESET         => reset_in, \r
+                         Q                     => fifo_ldata(i), \r
+                         WCNT          => open, -- BUG\r
+                         EMPTY         => open, -- BUG\r
+                         FULL          => open  -- BUG\r
+               );\r
+       next_todo_list(i) <= fifo_ldata(i)(10);\r
+\r
+       THE_TODO_CTR_PROC: process( clk_in )\r
+       begin\r
+               if( rising_edge(clk_in) ) then\r
+                       if( (reset_in = '1') or (rd_lfifo = '1') ) then\r
+                               fifo_todo(i) <= (others => '0');\r
+                       elsif( ld_todo = '1' ) then\r
+                               fifo_todo(i) <= fifo_ldata(i)(9 downto 0);\r
+                       elsif( comb_rd_dfifo(i) = '1' ) then\r
+                               fifo_todo(i) <= fifo_todo(i) - 1;\r
+                       end if;\r
+               end if;\r
+       end process THE_TODO_CTR_PROC;\r
+\r
+       next_fifo_done(i) <= '1' when ( fifo_todo(i) = b"00_0000_0000" ) else '0';\r
+\r
+end generate GEN_FIFO;\r
+\r
+comb_ack_todo <= fifo_last and set_data;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- DHDR buffer - delivers all information\r
+---------------------------------------------------------------------------\r
+dhdr_fifo_in <= dhdr_length_in & dhdr_data_in;\r
+\r
+THE_DHDR_BUF: dhdr_buf\r
+port map( CLK_IN                               => clk_in,\r
+                 RESET_IN                              => reset_in, \r
+                 DHDR_DATA_IN                  => dhdr_fifo_in,\r
+                 DHDR_WE_IN                    => dhdr_store_in,\r
+                 DHDR_DONE_IN                  => finished,\r
+                 DHDR_DATA_OUT                 => dhdr_fifo_out,\r
+                 DHDR_AVAILABLE_OUT    => dhdr_avail,\r
+                 BUF_FULL_OUT                  => dhdr_buf_full,\r
+                 BUF_LEVEL_OUT                 => open,\r
+                 DEBUG_OUT                             => open\r
+               );\r
+\r
+-- compare incoming trigger number with stored DHDR information\r
+next_trgnum_match <= '1' when ( ipu_number_in = dhdr_fifo_out(15 downto 0) ) else '0';\r
+\r
+THE_TRGNUM_MATCH_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       trgnum_match  <= '0';\r
+                       my_trg_number <= (others => '0');\r
+               elsif( set_hdr = '1' ) then\r
+                       trgnum_match  <= next_trgnum_match;\r
+                       my_trg_number <= ipu_number_in & dhdr_fifo_out(15 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_TRGNUM_MATCH_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- priority encoding is used to select the next buffer for readout\r
+---------------------------------------------------------------------------\r
+--THE_PRI_ENCODER_PROC: process( todo_list, fifo_sel, fifo_done )\r
+THE_PRI_ENCODER_PROC: process( todo_list, fifo_done )\r
+begin\r
+       if   ( todo_list(15 downto 15) = "1" ) then\r
+               next_fifo_sel <= "01111"; next_sel_fifo <= b"1000_0000_0000_0000"; next_fifo_last <= fifo_done(15);\r
+       elsif( todo_list(15 downto 14) = "01" ) then\r
+               next_fifo_sel <= "01110"; next_sel_fifo <= b"0100_0000_0000_0000"; next_fifo_last <= fifo_done(14);\r
+       elsif( todo_list(15 downto 13) = "001" ) then\r
+               next_fifo_sel <= "01101"; next_sel_fifo <= b"0010_0000_0000_0000"; next_fifo_last <= fifo_done(13);\r
+       elsif( todo_list(15 downto 12) = "0001" ) then\r
+               next_fifo_sel <= "01100"; next_sel_fifo <= b"0001_0000_0000_0000"; next_fifo_last <= fifo_done(12);\r
+       elsif( todo_list(15 downto 11) = "00001" ) then\r
+               next_fifo_sel <= "01011"; next_sel_fifo <= b"0000_1000_0000_0000"; next_fifo_last <= fifo_done(11);\r
+       elsif( todo_list(15 downto 10) = "000001" ) then\r
+               next_fifo_sel <= "01010"; next_sel_fifo <= b"0000_0100_0000_0000"; next_fifo_last <= fifo_done(10);\r
+       elsif( todo_list(15 downto 9)  = "0000001" ) then\r
+               next_fifo_sel <= "01001"; next_sel_fifo <= b"0000_0010_0000_0000"; next_fifo_last <= fifo_done(9);\r
+       elsif( todo_list(15 downto 8)  = "00000001" ) then\r
+               next_fifo_sel <= "01000"; next_sel_fifo <= b"0000_0001_0000_0000"; next_fifo_last <= fifo_done(8);\r
+       elsif( todo_list(15 downto 7)  = "000000001" ) then\r
+               next_fifo_sel <= "00111"; next_sel_fifo <= b"0000_0000_1000_0000"; next_fifo_last <= fifo_done(7);\r
+       elsif( todo_list(15 downto 6)  = "0000000001" ) then\r
+               next_fifo_sel <= "00110"; next_sel_fifo <= b"0000_0000_0100_0000"; next_fifo_last <= fifo_done(6);\r
+       elsif( todo_list(15 downto 5)  = "00000000001" ) then\r
+               next_fifo_sel <= "00101"; next_sel_fifo <= b"0000_0000_0010_0000"; next_fifo_last <= fifo_done(5);\r
+       elsif( todo_list(15 downto 4)  = "000000000001" ) then\r
+               next_fifo_sel <= "00100"; next_sel_fifo <= b"0000_0000_0001_0000"; next_fifo_last <= fifo_done(4);\r
+       elsif( todo_list(15 downto 3)  = "0000000000001" ) then\r
+               next_fifo_sel <= "00011"; next_sel_fifo <= b"0000_0000_0000_1000"; next_fifo_last <= fifo_done(3);\r
+       elsif( todo_list(15 downto 2)  = "00000000000001" ) then\r
+               next_fifo_sel <= "00010"; next_sel_fifo <= b"0000_0000_0000_0100"; next_fifo_last <= fifo_done(2);\r
+       elsif( todo_list(15 downto 1)  = "000000000000001" ) then\r
+               next_fifo_sel <= "00001"; next_sel_fifo <= b"0000_0000_0000_0010"; next_fifo_last <= fifo_done(1);\r
+       elsif( todo_list(15 downto 0)  = "0000000000000001" ) then\r
+               next_fifo_sel <= "00000"; next_sel_fifo <= b"0000_0000_0000_0001"; next_fifo_last <= fifo_done(0);\r
+       else\r
+               next_fifo_sel <= "10000"; next_sel_fifo <= b"0000_0000_0000_0000"; next_fifo_last <= '0';\r
+       end if;\r
+end process THE_PRI_ENCODER_PROC;\r
+\r
+-- We need to clear single bits during readout here!!!\r
+THE_TODO_LIST_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       todo_list <= (others => '0');\r
+               elsif( ld_todo = '1' ) then\r
+                       todo_list <= next_todo_list; -- store initial todo list\r
+               elsif( comb_ack_todo = '1' ) then\r
+                       todo_list <= todo_list and not sel_fifo; -- does this work?!?\r
+               end if;\r
+       end if;\r
+end process THE_TODO_LIST_PROC;\r
+\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- synchronizing process\r
+---------------------------------------------------------------------------\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               fifo_sel     <= next_fifo_sel;\r
+               sel_fifo     <= next_sel_fifo;\r
+               fifo_done    <= next_fifo_done;\r
+               fifo_last    <= next_fifo_last;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- backplane wise APV mapping \r
+---------------------------------------------------------------------------\r
+old_apv_num <= fifo_sel(3 downto 0); \r
+\r
+THE_ADC_APV_MAP_MEM: adc_apv_map_mem\r
+port map( ADDRESS(6 downto 4)  => module_in(2 downto 0),\r
+                 ADDRESS(3 downto 0)   => old_apv_num, \r
+                 Q                                             => new_apv_num\r
+                );\r
+\r
+---------------------------------------------------------------------------\r
+-- Data multiplexer\r
+---------------------------------------------------------------------------\r
+THE_DATA_MUX_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( set_hdr = '1' ) then\r
+                       ipu_out_data <= dhdr_fifo_out(31 downto 0);\r
+               elsif( comb_st_data(0) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(0)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(0)(20 downto 0);\r
+               elsif( comb_st_data(1) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(1)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(1)(20 downto 0);\r
+               elsif( comb_st_data(2) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(2)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(2)(20 downto 0);\r
+               elsif( comb_st_data(3) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(3)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(3)(20 downto 0);\r
+               elsif( comb_st_data(4) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(4)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(4)(20 downto 0);\r
+               elsif( comb_st_data(5) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(5)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(5)(20 downto 0);\r
+               elsif( comb_st_data(6) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(6)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(6)(20 downto 0);\r
+               elsif( comb_st_data(7) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(7)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(7)(20 downto 0);\r
+               elsif( comb_st_data(8) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(8)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(8)(20 downto 0);\r
+               elsif( comb_st_data(9) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(9)(21)  & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(9)(20 downto 0);\r
+               elsif( comb_st_data(10) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(10)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(10)(20 downto 0);\r
+               elsif( comb_st_data(11) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(11)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(11)(20 downto 0);\r
+               elsif( comb_st_data(12) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(12)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(12)(20 downto 0);\r
+               elsif( comb_st_data(13) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(13)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(13)(20 downto 0);\r
+               elsif( comb_st_data(14) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(14)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(14)(20 downto 0);\r
+               elsif( comb_st_data(15) = '1' ) then\r
+                       ipu_out_data <= fifo_out_data(15)(21) & sector_in(2 downto 0) & module_in(2 downto 0) & new_apv_num & fifo_out_data(15)(20 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_DATA_MUX_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- IPU cycle counter... just to be sure\r
+---------------------------------------------------------------------------\r
+THE_CYCLE_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       cyclectr <= (others => '0');\r
+               elsif( finished = '1' ) then\r
+                       cyclectr <= cyclectr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_CYCLE_COUNTER_PROC;\r
+\r
+---------------------------------------------------------------------------\r
+-- debug information\r
+---------------------------------------------------------------------------\r
+debug(63 downto 28) <= (others => '0');\r
+debug(27 downto 16) <= fifo_data_free(13);\r
+debug(15 downto 12) <= (others => '0');\r
+debug(11 downto 0)  <= fifo_wcnt(13);\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Output signals\r
+---------------------------------------------------------------------------\r
+ipu_data_out      <= ipu_out_data;\r
+lvl2_counter_out  <= cyclectr;\r
+dhdr_buf_full_out <= dhdr_buf_full;\r
+\r
+---------------------------------------------------------------------------\r
+-- DEBUG signals\r
+---------------------------------------------------------------------------\r
+dbg_bsm_out     <= bsm_x;\r
+dbg_out         <= debug;\r
+\r
+end behavioral;\r
+\r
+\r
+       \r
+\r
+\r
diff --git a/src/logic_analyzer.vhd b/src/logic_analyzer.vhd
new file mode 100644 (file)
index 0000000..245f894
--- /dev/null
@@ -0,0 +1,225 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity logic_analyzer is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- control signals\r
+         ARM_IN                : in    std_logic; -- arm the machine\r
+         TRG_IN                : in    std_logic; -- trigger the data acquisition\r
+         MAX_SAMPLE_IN : in    std_logic_vector(9 downto 0); \r
+         -- status signals\r
+         SM_ADDR_OUT   : out   std_logic_vector(9 downto 0); -- sample RAM addresses\r
+         SM_CE_OUT             : out   std_logic;\r
+         SM_WE_OUT             : out   std_logic; -- write enable for sample RAM\r
+         CLEAR_OUT             : out   std_logic; -- sample memory is being cleared\r
+         RUN_OUT               : out   std_logic; -- ready for trigger\r
+         SAMPLE_OUT    : out   std_logic; -- data acquisition running\r
+         READY_OUT             : out   std_logic; -- data acquisition is finished\r
+         LAST_OUT              : out   std_logic; -- last data word of sampling\r
+         -- Status lines\r
+         BSM_OUT               : out   std_logic_vector(3 downto 0);\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of logic_analyzer is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SM_SLEEP,SM_CLEAR,SM_RUN,SM_SAMPLE,SM_READY);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       signal sm_addr                  : std_logic_vector(9 downto 0);\r
+       signal sm_counter               : std_logic_vector(9 downto 0);\r
+\r
+       signal sm_we_x                  : std_logic;\r
+       signal sm_we                    : std_logic;\r
+       signal sm_ce_x                  : std_logic;\r
+       signal sm_ce                    : std_logic;\r
+       signal sm_rst_x                 : std_logic;\r
+       signal sm_rst                   : std_logic;\r
+       signal sm_acq_x                 : std_logic;\r
+       signal sm_acq                   : std_logic;\r
+       signal sm_done_x                : std_logic;\r
+       signal sm_done                  : std_logic;\r
+\r
+       signal sm_clear_done_x  : std_logic;\r
+       signal sm_clear_done    : std_logic;\r
+       signal sm_sample_done_x : std_logic;\r
+       signal sm_sample_done   : std_logic;\r
+\r
+       signal data_available   : std_logic;\r
+\r
+--     signal debug                    : std_logic_vector(31 downto 0);\r
+\r
+begin\r
+\r
+-- Fake\r
+stat(31 downto 17) <= (others => '0');\r
+stat(16)           <= sm_sample_done;\r
+stat(15 downto 10) <= (others => '0');\r
+stat(9 downto 0)   <= sm_counter;\r
+\r
+-- address counter\r
+THE_ADDR_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (sm_rst = '1') ) then\r
+                       sm_addr <= (others => '0');\r
+               elsif( sm_ce = '1' ) then\r
+                       sm_addr <= sm_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_ADDR_CTR_PROC;\r
+\r
+sm_clear_done_x  <= '1' when (sm_addr = b"11_1111_1110") else '0';\r
+\r
+THE_SAMPLE_CTR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (reset_in = '1') or (sm_rst = '1') ) then\r
+                       sm_counter <= (others => '0');\r
+               elsif( sm_acq = '1' ) then\r
+                       sm_counter <= sm_counter + 1;\r
+               end if;\r
+       end if;\r
+end process THE_SAMPLE_CTR_PROC;\r
+\r
+sm_sample_done_x <= '1' when (sm_counter = max_sample_in) else '0';\r
+\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               sm_clear_done   <= sm_clear_done_x;\r
+               sm_sample_done  <= sm_sample_done_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+THE_READY_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (sm_rst = '1') ) then\r
+                       data_available <= '0';\r
+               elsif( sm_sample_done = '1' ) then\r
+                       data_available <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_READY_PROC;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SM_SLEEP;\r
+                       sm_rst        <= '0';\r
+                       sm_ce         <= '0';\r
+                       sm_we         <= '0';\r
+                       sm_acq        <= '0';\r
+                       sm_done       <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       sm_rst        <= sm_rst_x;\r
+                       sm_ce         <= sm_ce_x;\r
+                       sm_we         <= sm_we_x;\r
+                       sm_acq        <= sm_acq_x;\r
+                       sm_done       <= sm_done_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, arm_in, trg_in, sm_clear_done, sm_sample_done )\r
+begin\r
+       NEXT_STATE <= SM_SLEEP;\r
+       sm_rst_x   <= '0';\r
+       sm_ce_x    <= '0';\r
+       sm_we_x    <= '0';\r
+       sm_acq_x   <= '0';\r
+       sm_done_x  <= '0';\r
+       case CURRENT_STATE is\r
+               when SM_SLEEP   =>      if( arm_in = '1' ) then\r
+                                                               NEXT_STATE <= SM_CLEAR;\r
+                                                               sm_rst_x   <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SM_SLEEP;\r
+                                                       end if;\r
+               when SM_CLEAR   =>      if( sm_clear_done = '1' ) then\r
+                                                               NEXT_STATE <= SM_RUN;\r
+                                                               sm_ce_x    <= '1';\r
+                                                               sm_we_x    <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= SM_CLEAR;\r
+                                                               sm_ce_x    <= '1';\r
+                                                               sm_we_x    <= '1';\r
+                                                       end if;\r
+               when SM_RUN             =>      if( trg_in = '1' ) then\r
+                                                               NEXT_STATE <= SM_SAMPLE;\r
+                                                               sm_ce_x    <= '1';\r
+                                                               sm_we_x    <= '1';\r
+                                                               sm_acq_x   <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= SM_RUN;\r
+                                                               sm_ce_x    <= '1';\r
+                                                               sm_we_x    <= '1';\r
+                                                       end if;\r
+               when SM_SAMPLE  =>      if( sm_sample_done = '1' ) then\r
+                                                               NEXT_STATE <= SM_READY;\r
+                                                               sm_done_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= SM_SAMPLE;\r
+                                                               sm_ce_x    <= '1';\r
+                                                               sm_we_x    <= '1';\r
+                                                               sm_acq_x   <= '1';\r
+                                                       end if;\r
+               when SM_READY   =>      NEXT_STATE <= SM_SLEEP;\r
+\r
+               when others             =>      NEXT_STATE <= SM_SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SM_SLEEP   =>      bsm_out    <= x"0";\r
+                                                       clear_out  <= '0';\r
+                                                       run_out    <= '0';\r
+               when SM_CLEAR   =>      bsm_out    <= x"1";\r
+                                                       clear_out  <= '1';\r
+                                                       run_out    <= '0';\r
+               when SM_RUN             =>      bsm_out    <= x"2";\r
+                                                       clear_out  <= '0';\r
+                                                       run_out    <= '1';\r
+               when SM_SAMPLE  =>      bsm_out    <= x"3";\r
+                                                       clear_out  <= '0';\r
+                                                       run_out    <= '0';\r
+               when SM_READY   =>      bsm_out    <= x"4";\r
+                                                       clear_out  <= '0';\r
+                                                       run_out    <= '0';\r
+               when others             =>      bsm_out    <= x"f";\r
+                                                       clear_out  <= '0';\r
+                                                       run_out    <= '0';\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+---------------------------------------------------------\r
+-- output signals                                      --\r
+---------------------------------------------------------\r
+sm_addr_out <= sm_addr;\r
+sm_we_out   <= sm_we;\r
+sm_ce_out   <= sm_ce;\r
+ready_out   <= data_available;\r
+sample_out  <= sm_acq;\r
+last_out    <= sm_sample_done;\r
+\r
+end Behavioral;\r
diff --git a/src/max_data.vhd b/src/max_data.vhd
new file mode 100644 (file)
index 0000000..01cc2ee
--- /dev/null
@@ -0,0 +1,178 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity max_data is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 TODO_3_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_2_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_1_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_0_IN                     : in    std_logic_vector(3 downto 0);\r
+                 TODO_MAX_OUT          : out   std_logic_vector(3 downto 0);\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of max_data is\r
+\r
+       -- Placer Directives\r
+\r
+       -- normal signals              \r
+       -- first comparatopr step\r
+       signal max_32_data              : std_logic_vector(3 downto 0);\r
+       signal max_21_data              : std_logic_vector(3 downto 0);\r
+       signal max_10_data              : std_logic_vector(3 downto 0);\r
+       signal comb_3_gt_2              : std_logic;\r
+       signal comb_2_gt_1              : std_logic;\r
+       signal comb_1_gt_0              : std_logic;\r
+       -- second comparator step\r
+       signal max_321_data             : std_logic_vector(3 downto 0);\r
+       signal max_210_data             : std_logic_vector(3 downto 0);\r
+       signal comb_32_gt_21    : std_logic;\r
+       signal comb_21_gt_10    : std_logic;\r
+       -- third comparator step\r
+       signal max_final_data   : std_logic_vector(3 downto 0);\r
+       signal comb_final               : std_logic;\r
+\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+\r
+begin                                          \r
+\r
+-- FIRST COMPARATOR STEP\r
+-- compare MAX_3 against MAX_2, store the bigger one\r
+THE_COMP_3_2: comp4bit\r
+port map( DATAA                => todo_3_in,\r
+                 DATAB         => todo_2_in,\r
+                 AGTB          => comb_3_gt_2\r
+               );\r
+\r
+THE_3_2_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_32_data <= (others => '0');\r
+               elsif( comb_3_gt_2 = '1' ) then\r
+                       max_32_data <= todo_3_in;\r
+               else\r
+                       max_32_data <= todo_2_in;\r
+               end if;\r
+       end if;\r
+end process THE_3_2_STORE_PROC;\r
+\r
+\r
+-- compare MAX_2 against MAX_1, store the bigger one\r
+THE_COMP_2_1: comp4bit\r
+port map( DATAA                => todo_2_in,\r
+                 DATAB         => todo_1_in,\r
+                 AGTB          => comb_2_gt_1\r
+               );\r
+\r
+THE_2_1_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_21_data <= (others => '0');\r
+               elsif( comb_2_gt_1 = '1' ) then\r
+                       max_21_data <= todo_2_in;\r
+               else\r
+                       max_21_data <= todo_1_in;\r
+               end if;\r
+       end if;\r
+end process THE_2_1_STORE_PROC;\r
+\r
+-- compare MAX_1 against MAX_0, store the bigger one\r
+THE_COMP_1_0: comp4bit\r
+port map( DATAA                => todo_1_in,\r
+                 DATAB         => todo_0_in,\r
+                 AGTB          => comb_1_gt_0\r
+               );\r
+\r
+THE_1_0_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_10_data <= (others => '0');\r
+               elsif( comb_1_gt_0 = '1' ) then\r
+                       max_10_data <= todo_1_in;\r
+               else\r
+                       max_10_data <= todo_0_in;\r
+               end if;\r
+       end if;\r
+end process THE_1_0_STORE_PROC;\r
+\r
+\r
+-- SECOND COMPARATOR STEP\r
+-- compare MAX_32 against MAX_21, store the bigger one\r
+THE_COMP_32_21: comp4bit\r
+port map( DATAA                => max_32_data,\r
+                 DATAB         => max_21_data,\r
+                 AGTB          => comb_32_gt_21\r
+               );\r
+\r
+THE_32_21_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_321_data <= (others => '0');\r
+               elsif( comb_32_gt_21 = '1' ) then\r
+                       max_321_data <= max_32_data;\r
+               else\r
+                       max_321_data <= max_21_data;\r
+               end if;\r
+       end if;\r
+end process THE_32_21_STORE_PROC;\r
+\r
+-- compare MAX_21 against MAX_10, store the bigger one\r
+THE_COMP_21_10: comp4bit\r
+port map( DATAA                => max_21_data,\r
+                 DATAB         => max_10_data,\r
+                 AGTB          => comb_21_gt_10\r
+               );\r
+\r
+THE_21_10_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_210_data <= (others => '0');\r
+               elsif( comb_21_gt_10 = '1' ) then\r
+                       max_210_data <= max_21_data;\r
+               else\r
+                       max_210_data <= max_10_data;\r
+               end if;\r
+       end if;\r
+end process THE_21_10_STORE_PROC;\r
+\r
+-- FINAL COMPARATOR STEP\r
+THE_COMP_FINAL: comp4bit\r
+port map( DATAA                => max_321_data,\r
+                 DATAB         => max_210_data,\r
+                 AGTB          => comb_final\r
+               );\r
+\r
+THE_FINAL_STORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       max_final_data <= (others => '0');\r
+               elsif( comb_final = '1' ) then\r
+                       max_final_data <= max_321_data;\r
+               else\r
+                       max_final_data <= max_210_data;\r
+               end if;\r
+       end if;\r
+end process THE_FINAL_STORE_PROC;\r
+\r
+-- debug signals\r
+debug(15 downto 0)  <= (others => '0');\r
+\r
+-- output signals\r
+todo_max_out  <= max_final_data;\r
+debug_out     <= debug;  \r
+                                               \r
+end behavioral;                                \r
+                                              
\ No newline at end of file
diff --git a/src/msg_file.log b/src/msg_file.log
new file mode 100644 (file)
index 0000000..079084d
--- /dev/null
@@ -0,0 +1,35 @@
+SCUBA, Version ispLever_v72_PROD_Build (44)\r
+Fri Nov 20 19:14:28 2009\r
+  \r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+  \r
+BEGIN SCUBA Module Synthesis\r
+  \r
+    Issued command   : F:\Programme\ispTOOLS7_2\ispfpga\bin\nt\scuba.exe -w -n dpram_8x19 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type ramdps -raddr_width 4 -rwidth 19 -waddr_width 4 -wwidth 19 -rnum_words 16 -wnum_words 16 -outData UNREGISTERED -e \r
+    Circuit name     : dpram_8x19\r
+    Module type      : sdpram\r
+    Module Version   : 3.4\r
+    Address width    : 4\r
+    Data width       : 19\r
+    Ports            : \r
+    Inputs       : WrAddress[3:0], Data[18:0], WrClock, WE, WrClockEn, RdAddress[3:0]\r
+    Outputs      : Q[18:0]\r
+    I/O buffer       : not inserted\r
+    Clock edge       : rising edge\r
+    EDIF output      : suppressed\r
+    VHDL output      : dpram_8x19.vhd\r
+    VHDL template    : dpram_8x19_tmpl.vhd\r
+    VHDL testbench   : tb_dpram_8x19_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : dpram_8x19.srp\r
+    Estimated Resource Usage:\r
+            LUT : 1\r
+           DRAM : 5\r
+  \r
+END   SCUBA Module Synthesis\r
+\r
diff --git a/src/mult_3x8.lpc b/src/mult_3x8.lpc
new file mode 100644 (file)
index 0000000..0ba594a
--- /dev/null
@@ -0,0 +1,41 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Multiplier\r
+CoreRevision=4.3\r
+ModuleName=mult_3x8\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=10/29/2009\r
+Time=11:23:02\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+pmi_implemenntation=LUT\r
+pmi_const_coeff=No\r
+pmi_coeff_value=2\r
+pmi_ram_mult=No\r
+pmi_dataa_width=3\r
+pmi_datab_width=8\r
+pmi_datap_width=11\r
+pmi_signa=Unsigned\r
+pmi_signb=Unsigned\r
+pmi_additional_pipeline=0\r
+pmi_input_reg=No\r
+pmi_output_reg=Yes\r
diff --git a/src/mult_3x8.srp b/src/mult_3x8.srp
new file mode 100644 (file)
index 0000000..aa3ac4e
--- /dev/null
@@ -0,0 +1,32 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Thu Oct 29 11:23:03 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n mult_3x8 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type dspmult -simple_portname -pfu_mult -widtha 3 -widthb 8 -widthp 11 -PL_stages 0 -output_reg -clk0 -ce0 -rst0 -e 
+    Circuit name     : mult_3x8
+    Module type      : dspmult_a
+    Module Version   : 4.3
+    Ports            : 
+       Inputs       : Clock, ClkEn, Aclr, DataA[2:0], DataB[7:0]
+       Outputs      : Result[10:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : mult_3x8.vhd
+    VHDL template    : mult_3x8_tmpl.vhd
+    VHDL testbench    : tb_mult_3x8_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : mult_3x8.srp
+    Element Usage    :
+           AND2 : 9
+         FADD2B : 6
+        FD1P3DX : 11
+          MULT2 : 4
+    Estimated Resource Usage:
+            LUT : 29
+            Reg : 11
diff --git a/src/mult_3x8.vhd b/src/mult_3x8.vhd
new file mode 100644 (file)
index 0000000..4f31420
--- /dev/null
@@ -0,0 +1,295 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 4.3
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n mult_3x8 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type dspmult -simple_portname -pfu_mult -widtha 3 -widthb 8 -widthp 11 -PL_stages 0 -output_reg -clk0 -ce0 -rst0 -e 
+
+-- Thu Oct 29 11:23:03 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity mult_3x8 is
+    port (
+        Clock: in  std_logic; 
+        ClkEn: in  std_logic; 
+        Aclr: in  std_logic; 
+        DataA: in  std_logic_vector(2 downto 0); 
+        DataB: in  std_logic_vector(7 downto 0); 
+        Result: out  std_logic_vector(10 downto 0));
+end mult_3x8;
+
+architecture Structure of mult_3x8 is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal mult_3x8_0_pp_0_0: std_logic;
+    signal rego_o_0: std_logic;
+    signal rego_o_1: std_logic;
+    signal rego_o_2: std_logic;
+    signal rego_o_3: std_logic;
+    signal mult_3x8_0_pp_1_2: std_logic;
+    signal mult_3x8_0_pp_1_3: std_logic;
+    signal rego_o_4: std_logic;
+    signal rego_o_5: std_logic;
+    signal co_t_mult_3x8_0_0_1: std_logic;
+    signal mult_3x8_0_pp_1_4: std_logic;
+    signal mult_3x8_0_pp_1_5: std_logic;
+    signal rego_o_6: std_logic;
+    signal rego_o_7: std_logic;
+    signal co_t_mult_3x8_0_0_2: std_logic;
+    signal mult_3x8_0_pp_1_6: std_logic;
+    signal mult_3x8_0_pp_1_7: std_logic;
+    signal rego_o_8: std_logic;
+    signal rego_o_9: std_logic;
+    signal co_t_mult_3x8_0_0_3: std_logic;
+    signal mult_3x8_0_pp_1_8: std_logic;
+    signal mult_3x8_0_pp_1_9: std_logic;
+    signal mult_3x8_0_pp_0_9: std_logic;
+    signal rego_o_10: std_logic;
+    signal co_t_mult_3x8_0_0_4: std_logic;
+    signal mult_3x8_0_pp_0_2: std_logic;
+    signal mult_3x8_0_pp_0_1: std_logic;
+    signal mult_3x8_0_pp_0_4: std_logic;
+    signal mult_3x8_0_pp_0_3: std_logic;
+    signal mco: std_logic;
+    signal mult_3x8_0_pp_0_6: std_logic;
+    signal mult_3x8_0_pp_0_5: std_logic;
+    signal mco_1: std_logic;
+    signal mfco: std_logic;
+    signal mult_3x8_0_pp_0_8: std_logic;
+    signal mult_3x8_0_pp_0_7: std_logic;
+    signal mco_2: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component MULT2
+        port (A0: in  std_logic; A1: in  std_logic; A2: in  std_logic; 
+            A3: in  std_logic; B0: in  std_logic; B1: in  std_logic; 
+            B2: in  std_logic; B3: in  std_logic; CI: in  std_logic; 
+            P0: out  std_logic; P1: out  std_logic; CO: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    AND2_t8: AND2
+        port map (A=>DataB(0), B=>DataA(0), Z=>mult_3x8_0_pp_0_0);
+
+    AND2_t7: AND2
+        port map (A=>DataB(0), B=>DataA(2), Z=>mult_3x8_0_pp_1_2);
+
+    AND2_t6: AND2
+        port map (A=>DataB(1), B=>DataA(2), Z=>mult_3x8_0_pp_1_3);
+
+    AND2_t5: AND2
+        port map (A=>DataB(2), B=>DataA(2), Z=>mult_3x8_0_pp_1_4);
+
+    AND2_t4: AND2
+        port map (A=>DataB(3), B=>DataA(2), Z=>mult_3x8_0_pp_1_5);
+
+    AND2_t3: AND2
+        port map (A=>DataB(4), B=>DataA(2), Z=>mult_3x8_0_pp_1_6);
+
+    AND2_t2: AND2
+        port map (A=>DataB(5), B=>DataA(2), Z=>mult_3x8_0_pp_1_7);
+
+    AND2_t1: AND2
+        port map (A=>DataB(6), B=>DataA(2), Z=>mult_3x8_0_pp_1_8);
+
+    AND2_t0: AND2
+        port map (A=>DataB(7), B=>DataA(2), Z=>mult_3x8_0_pp_1_9);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_0, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(0));
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_1, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(1));
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_2, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(2));
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_3, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(3));
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_4, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(4));
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_5, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(5));
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_6, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(6));
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_7, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(7));
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_8, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(8));
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_9, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(9));
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rego_o_10, SP=>ClkEn, CK=>Clock, CD=>Aclr, 
+            Q=>Result(10));
+
+    mult_3x8_0_Cadd_0_4: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>mfco, COUT=>open, S0=>mult_3x8_0_pp_0_9, 
+            S1=>open);
+
+    t_mult_3x8_0_add_0_1: FADD2B
+        port map (A0=>mult_3x8_0_pp_0_2, A1=>mult_3x8_0_pp_0_3, 
+            B0=>mult_3x8_0_pp_1_2, B1=>mult_3x8_0_pp_1_3, CI=>scuba_vlo, 
+            COUT=>co_t_mult_3x8_0_0_1, S0=>rego_o_2, S1=>rego_o_3);
+
+    t_mult_3x8_0_add_0_2: FADD2B
+        port map (A0=>mult_3x8_0_pp_0_4, A1=>mult_3x8_0_pp_0_5, 
+            B0=>mult_3x8_0_pp_1_4, B1=>mult_3x8_0_pp_1_5, 
+            CI=>co_t_mult_3x8_0_0_1, COUT=>co_t_mult_3x8_0_0_2, 
+            S0=>rego_o_4, S1=>rego_o_5);
+
+    t_mult_3x8_0_add_0_3: FADD2B
+        port map (A0=>mult_3x8_0_pp_0_6, A1=>mult_3x8_0_pp_0_7, 
+            B0=>mult_3x8_0_pp_1_6, B1=>mult_3x8_0_pp_1_7, 
+            CI=>co_t_mult_3x8_0_0_2, COUT=>co_t_mult_3x8_0_0_3, 
+            S0=>rego_o_6, S1=>rego_o_7);
+
+    t_mult_3x8_0_add_0_4: FADD2B
+        port map (A0=>mult_3x8_0_pp_0_8, A1=>mult_3x8_0_pp_0_9, 
+            B0=>mult_3x8_0_pp_1_8, B1=>mult_3x8_0_pp_1_9, 
+            CI=>co_t_mult_3x8_0_0_3, COUT=>co_t_mult_3x8_0_0_4, 
+            S0=>rego_o_8, S1=>rego_o_9);
+
+    Cadd_t_mult_3x8_0_0_5: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co_t_mult_3x8_0_0_4, COUT=>open, 
+            S0=>rego_o_10, S1=>open);
+
+    mult_3x8_0_mult_0_0: MULT2
+        port map (A0=>DataB(0), A1=>DataB(1), A2=>DataB(1), A3=>DataB(2), 
+            B0=>DataA(1), B1=>DataA(0), B2=>DataA(1), B3=>DataA(0), 
+            CI=>scuba_vlo, P0=>mult_3x8_0_pp_0_1, P1=>mult_3x8_0_pp_0_2, 
+            CO=>mco);
+
+    mult_3x8_0_mult_0_1: MULT2
+        port map (A0=>DataB(2), A1=>DataB(3), A2=>DataB(3), A3=>DataB(4), 
+            B0=>DataA(1), B1=>DataA(0), B2=>DataA(1), B3=>DataA(0), 
+            CI=>mco, P0=>mult_3x8_0_pp_0_3, P1=>mult_3x8_0_pp_0_4, 
+            CO=>mco_1);
+
+    mult_3x8_0_mult_0_2: MULT2
+        port map (A0=>DataB(4), A1=>DataB(5), A2=>DataB(5), A3=>DataB(6), 
+            B0=>DataA(1), B1=>DataA(0), B2=>DataA(1), B3=>DataA(0), 
+            CI=>mco_1, P0=>mult_3x8_0_pp_0_5, P1=>mult_3x8_0_pp_0_6, 
+            CO=>mco_2);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    mult_3x8_0_mult_0_3: MULT2
+        port map (A0=>DataB(6), A1=>DataB(7), A2=>DataB(7), 
+            A3=>scuba_vlo, B0=>DataA(1), B1=>DataA(0), B2=>DataA(1), 
+            B3=>DataA(0), CI=>mco_2, P0=>mult_3x8_0_pp_0_7, 
+            P1=>mult_3x8_0_pp_0_8, CO=>mfco);
+
+    rego_o_0 <= mult_3x8_0_pp_0_0;
+    rego_o_1 <= mult_3x8_0_pp_0_1;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of mult_3x8 is
+    for Structure
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:MULT2 use entity ecp2m.MULT2(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/mult_3x8_generate.log b/src/mult_3x8_generate.log
new file mode 100644 (file)
index 0000000..a8615eb
--- /dev/null
@@ -0,0 +1,45 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Thu Oct 29 11:23:03 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n mult_3x8 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type dspmult -simple_portname -pfu_mult -widtha 3 -widthb 8 -widthp 11 -PL_stages 0 -output_reg -clk0 -ce0 -rst0 -e \r
+    Circuit name     : mult_3x8\r
+    Module type      : dspmult_a\r
+    Module Version   : 4.3\r
+    Ports            : \r
+       Inputs       : Clock, ClkEn, Aclr, DataA[2:0], DataB[7:0]\r
+       Outputs      : Result[10:0]\r
+    I/O buffer       : not inserted\r
+    EDIF output      : suppressed\r
+    VHDL output      : mult_3x8.vhd\r
+    VHDL template    : mult_3x8_tmpl.vhd\r
+    VHDL testbench   : tb_mult_3x8_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : mult_3x8.srp\r
+    Estimated Resource Usage:\r
+            LUT : 29\r
+            Reg : 11\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: ..\src\mult_3x8.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/mult_3x8_tmpl.vhd b/src/mult_3x8_tmpl.vhd
new file mode 100644 (file)
index 0000000..9c5c888
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 4.3
+-- Thu Oct 29 11:23:03 2009
+
+-- parameterized module component declaration
+component mult_3x8
+    port (Clock: in  std_logic; ClkEn: in  std_logic; 
+        Aclr: in  std_logic; DataA: in  std_logic_vector(2 downto 0); 
+        DataB: in  std_logic_vector(7 downto 0); 
+        Result: out  std_logic_vector(10 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : mult_3x8
+    port map (Clock=>__, ClkEn=>__, Aclr=>__, DataA(2 downto 0)=>__, 
+        DataB(7 downto 0)=>__, Result(10 downto 0)=>__);
diff --git a/src/my_sbuf.vhd b/src/my_sbuf.vhd
new file mode 100644 (file)
index 0000000..8fa6801
--- /dev/null
@@ -0,0 +1,165 @@
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_ARITH.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity my_sbuf is
+       port( CLK                                       : in    std_logic;
+                 RESET                                 : in    std_logic;
+                 CLK_EN                                : in    std_logic;
+                 -- connections to data source A
+                 COMB_DATAREADY_IN             : in    std_logic;
+                 COMB_NEXT_READ_OUT    : out   std_logic;
+                 COMB_READ_IN                  : in    std_logic;
+                 COMB_DATA_IN                  : in    std_logic_vector (18 downto 0);
+                 -- connections to data sink B
+                 SYN_DATAREADY_OUT             : out   std_logic;
+                 SYN_DATA_OUT                  : out   std_logic_vector (18 downto 0);
+                 SYN_READ_IN                   : in    std_logic;
+                 -- status signals
+                 DEBUG_OUT                             : out   std_logic_vector(31 downto 0);
+                 STAT_BUFFER                   : out   std_logic
+                );
+end my_sbuf;
+
+architecture my_sbuf_arch of my_sbuf is
+
+-- small DPRAM LUT based
+component dpram_8x19 is
+port( WRADDRESS        : in    std_logic_vector(3 downto 0); 
+         DATA          : in    std_logic_vector(18 downto 0); 
+         WRCLOCK       : in    std_logic; 
+         WE            : in    std_logic; 
+         WRCLOCKEN     : in    std_logic; 
+         RDADDRESS     : in    std_logic_vector(3 downto 0); 
+--       RDCLOCK       : in    std_logic; 
+--       RDCLOCKEN     : in    std_logic; 
+--       RESET         : in    std_logic; 
+         Q                     : out   std_logic_vector(18 downto 0)
+       );
+end component dpram_8x19;
+
+-- signals
+signal fifo_wr_data                            : std_logic_vector(18 downto 0);
+signal fifo_rd_data                            : std_logic_vector(18 downto 0);
+signal fifo_we                                 : std_logic;
+signal fifo_rd                                 : std_logic;
+signal wr_pointer                              : std_logic_vector(3 downto 0);
+signal comb_ce_wr_pointer              : std_logic;
+signal rd_pointer                              : std_logic_vector(3 downto 0);
+signal comb_ce_rd_pointer              : std_logic;
+signal lvl_counter                             : std_logic_vector(4 downto 0);
+signal free_counter                            : std_logic_vector(4 downto 0);
+signal comb_inc_free_counter   : std_logic;
+signal comb_dec_free_counter   : std_logic;
+
+signal debug                                   : std_logic_vector(31 downto 0);
+
+begin
+
+-------------------------------------------------------------
+-- debug signals
+-------------------------------------------------------------
+debug(31 downto 24) <= (others => '0');
+
+debug(23 downto 21) <= (others => '0');
+debug(20 downto 16) <= lvl_counter;
+debug(15 downto 13) <= (others => '0');
+debug(12 downto 8)  <= free_counter;
+debug(7 downto 4)   <= rd_pointer;
+debug(3 downto 0)   <= wr_pointer;
+-------------------------------------------------------------
+-- write pointer
+-------------------------------------------------------------
+comb_ce_wr_pointer <= fifo_we; -- BUG
+
+THE_WR_POINTER_PROC: process( clk )
+begin
+       if( rising_edge(clk) ) then
+               if   ( reset = '1' ) then
+                       wr_pointer <= (others => '0');
+               elsif( comb_ce_wr_pointer = '1' ) then
+                       wr_pointer <= wr_pointer + 1;
+               end if;
+       end if;
+end process THE_WR_POINTER_PROC;
+
+
+-------------------------------------------------------------
+-- read pointer
+-------------------------------------------------------------
+comb_ce_rd_pointer <= fifo_rd; -- BUG
+
+THE_RD_POINTER_PROC: process( clk )
+begin
+       if( rising_edge(clk) ) then
+               if   ( reset = '1' ) then
+                       rd_pointer <= (others => '0');
+               elsif( comb_ce_rd_pointer = '1' ) then
+                       rd_pointer <= rd_pointer + 1;
+               end if;
+       end if;
+end process THE_RD_POINTER_PROC;
+
+-------------------------------------------------------------
+-- free counter
+-------------------------------------------------------------
+comb_inc_free_counter <= fifo_rd; -- BUG
+comb_dec_free_counter <= fifo_we; -- BUG
+
+THE_FREE_COUNTER_PROC: process( clk )
+begin
+       if( rising_edge(clk) ) then
+               if   ( reset = '1' ) then
+                       free_counter <= b"1_0000";
+               elsif( (comb_inc_free_counter = '1') and (comb_dec_free_counter = '0') ) then
+                       free_counter <= free_counter + 1;
+               elsif( (comb_inc_free_counter = '0') and (comb_dec_free_counter = '1') ) then
+                       free_counter <= free_counter - 1;
+               end if;
+       end if;
+end process THE_FREE_COUNTER_PROC;
+
+THE_LVL_COUNTER_PROC: process( clk )
+begin
+       if( rising_edge(clk) ) then
+               if   ( reset = '1' ) then
+                       lvl_counter <= (others => '0');
+               elsif( (comb_inc_free_counter = '1') and (comb_dec_free_counter = '0') ) then
+                       lvl_counter <= lvl_counter - 1;
+               elsif( (comb_inc_free_counter = '0') and (comb_dec_free_counter = '1') ) then
+                       lvl_counter <= lvl_counter + 1;
+               end if;
+       end if;
+end process THE_LVL_COUNTER_PROC;
+
+-------------------------------------------------------------
+-- the buffer memory
+-------------------------------------------------------------
+fifo_we      <= comb_dataready_in and comb_read_in; -- BUG
+fifo_rd      <= syn_read_in; -- BUG
+fifo_wr_data <= comb_data_in;
+
+THE_BUFFER_DPRAM: dpram_8x19
+port map( WRADDRESS    => wr_pointer,
+                 DATA          => fifo_wr_data,
+                 WRCLOCK       => clk,
+                 WE            => fifo_we,
+                 WRCLOCKEN     => '1',
+                 RDADDRESS     => rd_pointer,
+--               RDCLOCK       => clk,
+--               RDCLOCKEN     => '1',
+--               RESET         => reset,
+                 Q                     => fifo_rd_data
+               );
+
+-------------------------------------------------------------
+-- output signals
+-------------------------------------------------------------
+debug_out          <= debug;
+comb_next_read_out <= '0';
+syn_dataready_out  <= '0';
+stat_buffer        <= '0';
+syn_data_out       <= fifo_rd_data;
+
+end architecture;
\ No newline at end of file
diff --git a/src/onewire_master.vhd b/src/onewire_master.vhd
new file mode 100644 (file)
index 0000000..5f1628b
--- /dev/null
@@ -0,0 +1,549 @@
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.std_logic_ARITH.ALL;
+USE IEEE.std_logic_UNSIGNED.ALL;
+
+library work;
+use work.trb_net_std.all;
+
+-- stolen from Jan Michel, was trb_net_onewire.vhd
+
+entity onewire_master is
+       generic( CLK_PERIOD             : integer := 10 ); -- clock perion in nanoseconds
+       port( CLK                               : in    std_logic;
+                 RESET                         : in    std_logic;
+                 READOUT_ENABLE_IN     : in    std_logic;
+                 -- connection to 1-wire interface (16 APV FEs)
+                 ONEWIRE                       : inout std_logic_vector(15 downto 0);
+                 BP_ONEWIRE            : inout std_logic;
+                 -- connection to external DPRAM for slow control readout
+                 BP_DATA_OUT           : out   std_logic_vector(15 downto 0);
+                 DATA_OUT                      : out   std_logic_vector(15 downto 0);
+                 ADDR_OUT                      : out   std_logic_vector(6 downto 0);
+                 WRITE_OUT                     : out   std_logic;
+                 BUSY_OUT                      : out   std_logic;
+                 -- debug
+                 BSM_OUT                       : out   std_logic_vector(7 downto 0);
+                 STAT                          : out   std_logic_vector(15 downto 0)
+                );
+end entity;
+
+architecture onewire_master_arch of onewire_master is
+
+       constant MAX_COUNTER : integer := 2**28-1;
+       type state_t is (START, IDLE, SEND_RESET, WAIT_AFTER_RESET, SEND_ROM_COMMAND, READ_WAIT,
+                                        WRITE_START, WRITE_WAIT, READ_BIT, READ_READ_ROM, SEND_CONV_TEMP,
+                                        READ_CONV_TEMP, SEND_READ_TEMP, READ_READ_TEMP, CHECK_PULSE);
+       signal STATE                            : state_t;
+       signal NEXT_STATE                       : state_t;
+       signal bsm                                      : std_logic_vector(7 downto 0);
+       signal timecounter                      : integer range 0 to MAX_COUNTER;
+       signal bitcounter                       : integer range 0 to 127;
+       signal bitcounter_vector        : std_logic_vector(6 downto 0);
+       signal inc_bitcounter           : std_logic;
+       signal reset_bitcounter         : std_logic;
+       signal reset_timecounter        : std_logic;
+       signal send_bit                         : std_logic;
+       signal next_send_bit            : std_logic;
+       signal recv_bit_ready           : std_logic;
+       signal next_recv_bit_ready      : std_logic;
+       signal ext_ram_addr                     : std_logic_vector(3 downto 0);
+       signal ram_addr                         : std_logic_vector(2 downto 0);
+       signal ram_wr                           : std_logic;
+
+       -- state machine auxiliary signals
+       signal wait_pulse                       : std_logic;
+       signal next_wait_pulse          : std_logic;
+       signal strong_pullup            : std_logic;
+       signal next_strong_pullup       : std_logic;
+       signal presence_reset           : std_logic;
+       signal next_presence_reset      : std_logic;
+       signal send_rom                         : std_logic;    -- read UniqueID
+       signal next_send_rom            : std_logic;
+       signal conv_temp                        : std_logic;    -- send CONV_TEMP
+       signal next_conv_temp           : std_logic;
+       signal reading_temp                     : std_logic;    -- readback of temperature
+       signal next_reading_temp        : std_logic;
+       signal skip_rom                         : std_logic;    -- send SKIP_ROM
+       signal next_skip_rom            : std_logic;
+       signal output_tmp                       : std_logic;    -- 1W output signal
+       signal next_output_tmp          : std_logic;
+       signal output                           : std_logic;
+       signal next_output                      : std_logic;
+
+       -- presence pulse detection
+       signal neg_edge                         : std_logic_vector(16 downto 0);        -- presence pulse edge detection
+       signal presence_found           : std_logic_vector(16 downto 0);        -- set signal for presence bits 
+       signal presence                         : std_logic_vector(16 downto 0);        -- presence bits
+
+       type input_t is array (0 to 16) of std_logic_vector(7 downto 0);
+       signal input                            : input_t;
+
+       type word_t is array (0 to 16) of std_logic_vector(15 downto 0);
+       signal word                                     : word_t;
+
+       signal recv_bit                         : std_logic_vector(16 downto 0);
+       signal next_recv_bit            : std_logic_vector(16 downto 0);
+       
+       signal comb_ext_addr_go         : std_logic;
+
+       -- output signals, delayed by one cycle 
+       signal mux_data                         : std_logic_vector(15 downto 0);
+       signal mux_addr                         : std_logic_vector(6 downto 0);
+       signal mux_wr                           : std_logic;
+       
+       signal onewire_tmp                      : std_logic_vector(16 downto 0);
+       
+       signal comb_busy                        : std_logic;
+       signal busy                                     : std_logic;
+       
+begin
+
+-- bidirectional connection
+IO_GEN: for i in 0 to 15 generate
+       onewire(i)     <= '0' when (output = '0') else '1' when (strong_pullup = '1') else 'Z';
+       onewire_tmp(i) <= '0' when onewire(i) = '0' else '1'; -- BUGBUGBUG
+end generate IO_GEN;
+
+-- We have one "special" connection for the backplane 1Wire ID
+bp_onewire      <= '0' when (output = '0') else '1' when (strong_pullup = '1') else 'Z';
+onewire_tmp(16) <= '0' when bp_onewire = '0' else '1'; -- BUGBUGBUG
+
+-- shift and sync register
+THE_SHIFT_PROC : process(clk)
+begin
+       if( rising_edge(clk) ) then
+               for i in 0 to 16 loop
+                       -- Shift registers
+                       input(i)(7 downto 1) <= input(i)(6 downto 0);
+                       input(i)(0)          <= onewire_tmp(i); -- BUGBUGBUG
+                       -- Edge detection
+                       neg_edge(i)          <= input(i)(7) and not input(i)(6) and not input(i)(5) and not input(i)(4) and not input(i)(3) and not input(i)(2);
+                       presence_found(i)    <= wait_pulse and neg_edge(i);
+                       -- presence registers
+                       if   ( presence_reset = '1') then
+                               presence(i) <= '0';
+                       elsif( presence_found(i) = '1' ) then
+                               presence(i) <= '1';
+                       end if;
+               end loop;
+               -- Synchronize signals
+       end if;
+end process THE_SHIFT_PROC;
+
+bitcounter_vector <= conv_std_logic_vector(bitcounter,7);
+
+--------------------------------------------------------------------------------------
+--------------------------------------------------------------------------------------
+--------------------------------------------------------------------------------------
+-- State machine registers
+THE_STATE_REGS_PROC: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               if( reset = '1' ) then
+                       STATE          <= START;
+                       send_bit       <= '0';
+                       output_tmp     <= '0';
+                       recv_bit       <= (others => '0');
+                       strong_pullup  <= '0';
+                       wait_pulse     <= '0';
+                       presence_reset <= '0';
+                       send_rom       <= '1';
+                       conv_temp      <= '0';
+                       reading_temp   <= '0';
+                       skip_rom       <= '0';
+                       busy           <= '0';
+               else
+                       recv_bit_ready <= next_recv_bit_ready;
+                       state          <= next_state;
+                       send_bit       <= next_send_bit;
+                       output         <= next_output;
+                       output_tmp     <= next_output_tmp;
+                       recv_bit       <= next_recv_bit;
+                       strong_pullup  <= next_strong_pullup;
+                       wait_pulse     <= next_wait_pulse;
+                       presence_reset <= next_presence_reset;
+                       send_rom       <= next_send_rom;
+                       conv_temp      <= next_conv_temp;
+                       reading_temp   <= next_reading_temp;
+                       skip_rom       <= next_skip_rom;
+                       busy           <= comb_busy;
+               end if;
+       end if;
+end process THE_STATE_REGS_PROC;
+
+comb_busy <= '0' when (STATE = START) else '1';
+
+-- State machine transitions
+THE_STATE_MACHINE: process( STATE, timecounter, bitcounter_vector, input, send_bit, output_tmp, 
+                                                       skip_rom, recv_bit, conv_temp, reading_temp, send_rom, readout_enable_in )
+begin
+       NEXT_STATE          <= STATE;
+       next_output         <= '1';
+       reset_timecounter   <= '0';
+       reset_bitcounter    <= '0';
+       next_output_tmp     <= output_tmp;
+       inc_bitcounter      <= '0';
+       next_send_bit       <= send_bit;
+       next_recv_bit       <= (others => '0');
+       next_recv_bit_ready <= '0';
+       next_send_rom       <= send_rom;
+       next_conv_temp      <= conv_temp;
+       next_reading_temp   <= reading_temp;
+       next_recv_bit       <= recv_bit;
+       next_skip_rom       <= skip_rom;
+       next_strong_pullup  <= '0';
+       next_wait_pulse     <= '0';
+       next_presence_reset <= '0';
+
+       case STATE is
+               -- 
+               when START =>
+                       if( readout_enable_in = '1' ) then
+                               NEXT_STATE          <= IDLE;
+                               reset_timecounter   <= '1';
+                       end if;
+
+               -- idle state for the DS1822
+               when IDLE =>
+                       if( is_time_reached(timecounter,640000,CLK_PERIOD) = '1' ) then
+                               NEXT_STATE        <= SEND_RESET;
+                               reset_timecounter <= '1';
+                       end if;
+
+               -- send the reset pulse
+               when SEND_RESET =>
+                       next_output <= '0';
+                       if( is_time_reached(timecounter,640000,CLK_PERIOD) = '1' ) then
+                               reset_timecounter   <= '1';
+                               next_presence_reset <= '1';
+                               NEXT_STATE          <= WAIT_AFTER_RESET;
+                       end if;
+
+               -- delay after RESET pulse (earliest presence pulse @15us)
+               when WAIT_AFTER_RESET =>
+                       if( is_time_reached(timecounter,10000,CLK_PERIOD) = '1' ) then
+                               reset_timecounter <= '1';
+                               NEXT_STATE        <= CHECK_PULSE; 
+                       end if;
+
+               -- check if the is a pulse
+               when CHECK_PULSE =>
+                       next_wait_pulse <= '1';
+                       if( is_time_reached(timecounter,320000,CLK_PERIOD) = '1' ) then
+                               next_wait_pulse   <= '0';
+                               reset_timecounter <= '1';
+                               NEXT_STATE        <= SEND_ROM_COMMAND;
+                       end if;
+
+               -- sending rom commands
+               when SEND_ROM_COMMAND =>
+                       next_skip_rom  <= not send_rom and not bitcounter_vector(3);
+                       inc_bitcounter <= '1';
+                       NEXT_STATE     <= WRITE_START;
+
+                       if( send_rom = '1' ) then
+                               next_send_bit <= not bitcounter_vector(1);      -- this is x33 (READ_ROM_COMMAND), lsb first
+                       else
+               next_send_bit <= bitcounter_vector(1);          -- this is xCC (SKIP_ROM_COMMAND), lsb first
+                       end if;
+
+                       if( bitcounter_vector(3) = '1' ) then  --send 8 bit
+                               if   ( send_rom = '1' ) then
+                                       NEXT_STATE <= READ_READ_ROM;
+                               elsif( conv_temp = '1' ) then
+                                       NEXT_STATE <= SEND_CONV_TEMP;
+                               else
+                                       NEXT_STATE <= SEND_READ_TEMP;
+                               end if;
+                               reset_bitcounter <= '1';
+                       end if;
+
+               --sending sensor commands
+               when SEND_CONV_TEMP =>
+                       next_send_bit <= bitcounter_vector(1) and not bitcounter_vector(0);
+                                                     --this is x44, lsb first
+                       inc_bitcounter <= '1';
+                       if( bitcounter_vector(3) = '1' ) then  --send 8 bit
+                               NEXT_STATE        <= READ_CONV_TEMP;
+                               reset_bitcounter  <= '1';
+                               reset_timecounter <= '1';
+                               next_recv_bit     <= (others => '0');
+                       else
+                               NEXT_STATE        <= WRITE_START;
+                       end if;
+
+               when SEND_READ_TEMP =>
+                       if( (bitcounter_vector(2 downto 0) = "000") or (bitcounter_vector(2 downto 0) = "110") ) then
+                               next_send_bit <= '0';                   --this is xBE, lsb first
+                       else
+                               next_send_bit <= '1';
+                       end if;
+
+                       inc_bitcounter <= '1';
+                       
+                       if( bitcounter_vector(3) = '1' ) then  --send 8 bit
+                               NEXT_STATE       <= READ_READ_TEMP;
+                               reset_bitcounter <= '1';
+                               next_recv_bit    <= (others => '0');
+                       else
+                               NEXT_STATE       <= WRITE_START;
+                       end if;
+
+               --reading rom answers
+               when READ_READ_ROM =>
+                       inc_bitcounter <= '1';
+                       if( bitcounter_vector(6) = '1' ) then --read 64 bit
+                               NEXT_STATE       <= IDLE;
+                               next_send_rom    <= '0';
+                               next_conv_temp   <= '1';
+                               reset_bitcounter <= '1';
+                       else
+                               NEXT_STATE <= READ_BIT;
+                       end if;
+
+               --reading sensor answers
+               when READ_CONV_TEMP => --waiting for end of conversion
+                       next_strong_pullup <= '1';
+                       if( is_time_reached(timecounter,1300000000,CLK_PERIOD) = '1' ) then -- reality is 1.3s delay
+--                     if( is_time_reached(timecounter,3000000,CLK_PERIOD) = '1' ) then -- simulation is 3ms delay
+                               NEXT_STATE        <= IDLE;
+                               reset_timecounter <= '1';
+                               next_conv_temp    <= '0';
+                               next_reading_temp <= '1';
+                       end if;
+
+               when READ_READ_TEMP =>
+                       inc_bitcounter <= '1';
+                       if( bitcounter_vector(3 downto 2) = "11" ) then --read 12 bit
+                               NEXT_STATE        <= START;
+                               next_send_rom     <= '1';
+                               next_reading_temp <= '0';
+                               reset_bitcounter  <= '1';
+                       else
+                               NEXT_STATE <= READ_BIT;
+                       end if;
+
+               --write cycle
+               when WRITE_START =>
+                       next_output <= output_tmp;
+                       if( is_time_reached(timecounter,1200,CLK_PERIOD) = '1' ) then
+                               next_output_tmp <= send_bit;
+                       end if;
+                       if( is_time_reached(timecounter,80000,CLK_PERIOD) = '1' ) then
+                               NEXT_STATE <= WRITE_WAIT;
+                               next_output_tmp <= '0';
+                               reset_timecounter <= '1';
+                       end if;
+                       
+               when WRITE_WAIT =>
+                       if( is_time_reached(timecounter,1200,CLK_PERIOD) = '1' ) then
+                               reset_timecounter <= '1';
+                               if( (send_rom = '1') or (skip_rom = '1') ) then
+                                       NEXT_STATE <= SEND_ROM_COMMAND;
+                               elsif( conv_temp = '1' ) then
+                                       NEXT_STATE <= SEND_CONV_TEMP;
+                               elsif( reading_temp = '1' ) then
+                                       NEXT_STATE <= SEND_READ_TEMP;
+                               end if;
+                       end if;
+
+               --read cycle
+               when READ_BIT =>
+                       next_output <= output_tmp;
+                       if( is_time_reached(timecounter,1200,CLK_PERIOD) = '1' ) then
+                               next_output_tmp <= '1';
+                       end if;
+                       if( is_time_reached(timecounter,10000,CLK_PERIOD) = '1' ) then
+                               for i in 0 to 16 loop
+                                       next_recv_bit(i)    <= input(i)(2);
+                               end loop;
+                               next_recv_bit_ready <= '1';
+                               NEXT_STATE          <= READ_WAIT;
+                       end if;
+                       
+               when READ_WAIT =>
+                       if( is_time_reached(timecounter,80000,CLK_PERIOD) = '1' ) then
+                               reset_timecounter <= '1';
+                               next_output_tmp <= '0';
+                               if   ( send_rom = '1' ) then
+                                       NEXT_STATE <= READ_READ_ROM;
+                               elsif( conv_temp = '1' ) then
+                                       NEXT_STATE <= READ_CONV_TEMP;
+                               else
+                                       NEXT_STATE <= READ_READ_TEMP;
+                               end if;
+                       end if;
+
+               when others =>
+                       NEXT_STATE <= START;
+       end case;
+end process THE_STATE_MACHINE;
+
+-- State machine decoding
+STATE_DECODE: process( STATE )
+begin
+       case STATE is
+               when START                              =>      bsm <= x"00";
+               when IDLE                               =>      bsm <= x"01";
+               when SEND_RESET                 =>      bsm <= x"02"; 
+               when WAIT_AFTER_RESET   =>      bsm <= x"03";
+               when CHECK_PULSE                =>      bsm <= x"0e";
+               when SEND_ROM_COMMAND   =>      bsm <= x"04";
+               when READ_WAIT                  =>      bsm <= x"05";
+               when WRITE_START                =>      bsm <= x"06";
+               when WRITE_WAIT                 =>      bsm <= x"07";
+               when READ_BIT                   =>      bsm <= x"08";
+               when READ_READ_ROM              =>      bsm <= x"09";
+               when SEND_CONV_TEMP             =>      bsm <= x"0a";
+               when READ_CONV_TEMP             =>      bsm <= x"0b";
+               when SEND_READ_TEMP             =>      bsm <= x"0c";
+               when READ_READ_TEMP             =>      bsm <= x"0d";
+               when others                             =>      bsm <= x"ff";
+       end case;
+end process STATE_DECODE;
+--------------------------------------------------------------------------------------
+--------------------------------------------------------------------------------------
+--------------------------------------------------------------------------------------
+
+-- Time counter for 1Wire bus accesses
+THE_TIME_COUNTER: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               if( reset_timecounter = '1' ) then
+                       timecounter <= 0;
+               else
+                       timecounter <= timecounter + 1;
+               end if;
+       end if;
+end process THE_TIME_COUNTER;
+
+-- Bit counter
+THE_BIT_COUNTER: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               if   ( reset_bitcounter = '1' ) then
+                       bitcounter <= 0;
+               elsif( inc_bitcounter = '1' ) then
+                       bitcounter <= bitcounter + 1;
+               end if;
+       end if;
+end process THE_BIT_COUNTER;
+
+-- Saving received data
+THE_DATA_SAVE_PROC: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               if( reset = '1' ) then
+                       ram_addr(1 downto 0) <= (others => '0');
+                       ram_wr               <= '0';
+--                     word(i)              <= (others => '0');
+               else
+                       ram_wr <= '0';
+                       -- Shift process for serial / parallel data conversion
+                       if( (recv_bit_ready = '1') and ((send_rom = '1') or (reading_temp = '1')) ) then
+                               ram_addr(1 downto 0) <= (bitcounter_vector(5 downto 4)) - 1;
+                               ram_addr(2)          <= '0';
+                               for i in 0 to 16 loop
+                                       word(i)(14 downto 0)    <= word(i)(15 downto 1);
+                                       word(i)(15)             <= recv_bit(i);
+                               end loop;
+                               -- UniqueID write process
+                               if( (bitcounter_vector(3 downto 0) = "0000") and (send_rom = '1') ) then
+                                       ram_wr <= '1';
+                               end if;
+                               -- temperature value copy process
+                               if( (bitcounter_vector(3 downto 0) = "1100") and (reading_temp = '1') ) then
+                                       ram_addr <= "100";
+                                       ram_wr   <= '1';
+                                       for i in 0 to 16 loop
+                                               word(i)(11)                             <= recv_bit(i);
+                                               word(i)(10 downto 0)    <= word(i)(15 downto 5);
+                                               word(i)(14 downto 12)   <= (others => '0');
+                                               word(i)(15)             <= presence(i);
+                                       end loop;
+                                       
+                               end if;
+                       end if;
+               end if;
+       end if;
+end process THE_DATA_SAVE_PROC;
+
+-- Data output multiplexer
+THE_EXT_ADDR_PROC: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               if( reset = '1' ) then
+                       ext_ram_addr <= (others => '0');
+               elsif( (comb_ext_addr_go = '1') ) then
+                       ext_ram_addr <= ext_ram_addr + 1;
+               end if;         
+       end if;
+end process THE_EXT_ADDR_PROC;
+
+comb_ext_addr_go <= '1' when ((ext_ram_addr /= "0000") or (ram_wr = '1')) else '0';
+
+-- Data multiplexer
+DATA_MUX_PROC: process(clk)
+begin
+       if( rising_edge(clk) ) then
+               case ext_ram_addr is
+                       when x"0"       => mux_data <= word(0);
+                       when x"1"       => mux_data <= word(1);
+                       when x"2"       => mux_data <= word(2);
+                       when x"3"       => mux_data <= word(3);
+                       when x"4"       => mux_data <= word(4);
+                       when x"5"       => mux_data <= word(5);
+                       when x"6"       => mux_data <= word(6);
+                       when x"7"       => mux_data <= word(7);
+                       when x"8"       => mux_data <= word(8);
+                       when x"9"       => mux_data <= word(9);
+                       when x"a"       => mux_data <= word(10);
+                       when x"b"       => mux_data <= word(11);
+                       when x"c"       => mux_data <= word(12);
+                       when x"d"       => mux_data <= word(13);
+                       when x"e"       => mux_data <= word(14);
+                       when x"f"       => mux_data <= word(15);
+                       when others     => mux_data <= x"dead";
+               end case;
+               mux_addr(2 downto 0) <= ram_addr;
+               mux_addr(6 downto 3) <= ext_ram_addr;
+               mux_wr               <= comb_ext_addr_go; -- really?
+       end if;
+end process DATA_MUX_PROC;
+
+-- Output signals
+bp_data_out   <= word(16);
+addr_out      <= mux_addr;
+data_out      <= mux_data;
+write_out     <= mux_wr;
+busy_out      <= busy;
+
+bsm_out   <= bsm;
+
+-- Status signals
+stat(0)  <= '0' when ( input(0)(7) = '0' ) else '1';
+stat(1)  <= ram_wr;
+stat(2)  <= send_rom;
+stat(3)  <= skip_rom;
+stat(4)  <= send_bit;
+stat(5)  <= recv_bit(0);
+stat(6)  <= recv_bit_ready;
+stat(7)  <= conv_temp;
+stat(8)  <= reading_temp;
+stat(9)  <= strong_pullup;
+stat(10) <= reset_bitcounter;
+stat(11) <= inc_bitcounter;
+stat(15 downto 12) <= bitcounter_vector(3 downto 0);
+
+
+end architecture;
+
+
+
+
+
+
+
+
+
diff --git a/src/onewire_spare_one.lpc b/src/onewire_spare_one.lpc
new file mode 100644 (file)
index 0000000..0e9df8e
--- /dev/null
@@ -0,0 +1,34 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Distributed_ROM\r
+CoreRevision=2.4\r
+ModuleName=onewire_spare_one\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/05/2009\r
+Time=15:51:35\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+Addresses=8\r
+Data=4\r
+LUT=0\r
+MemFile=\\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem\r
+MemFormat=orca\r
diff --git a/src/onewire_spare_one.srp b/src/onewire_spare_one.srp
new file mode 100644 (file)
index 0000000..b0b1cc6
--- /dev/null
@@ -0,0 +1,30 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Thu Nov 05 15:51:35 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n onewire_spare_one -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 3 -num_words 8 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem -memformat orca -e 
+    Circuit name     : onewire_spare_one
+    Module type      : rom
+    Module Version   : 2.4
+    Address width    : 3
+    Ports            : 
+       Inputs       : Address[2:0]
+       Outputs      : Q[3:0]
+    I/O buffer       : not inserted
+    Memory file      : \\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem
+    EDIF output      : suppressed
+    VHDL output      : onewire_spare_one.vhd
+    VHDL template    : onewire_spare_one_tmpl.vhd
+    VHDL testbench    : tb_onewire_spare_one_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : onewire_spare_one.srp
+    Element Usage    :
+        ROM16X1 : 4
+    Estimated Resource Usage:
+            LUT : 4
diff --git a/src/onewire_spare_one.vhd b/src/onewire_spare_one.vhd
new file mode 100644 (file)
index 0000000..87f6e74
--- /dev/null
@@ -0,0 +1,86 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type rom -addr_width 3 -num_rows 8 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem -memformat orca -e 
+
+-- Thu Nov 05 15:51:35 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity onewire_spare_one is
+    port (
+        Address: in  std_logic_vector(2 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end onewire_spare_one;
+
+architecture Structure of onewire_spare_one is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute initval of mem_0_3 : label is "0x00EA";
+    attribute initval of mem_0_2 : label is "0x00E7";
+    attribute initval of mem_0_1 : label is "0x00EC";
+    attribute initval of mem_0_0 : label is "0x00E0";
+
+begin
+    -- component instantiation statements
+    mem_0_3: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x00EA")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(3));
+
+    mem_0_2: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x00E7")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(2));
+
+    mem_0_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x00EC")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(1));
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    mem_0_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x00E0")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>Address(2), AD1=>Address(1), 
+            AD0=>Address(0), DO0=>Q(0));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of onewire_spare_one is
+    for Structure
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/onewire_spare_one_generate.log b/src/onewire_spare_one_generate.log
new file mode 100644 (file)
index 0000000..ff8c064
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Thu Nov 05 15:51:35 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n onewire_spare_one -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -dram -type romblk -addr_width 3 -num_words 8 -data_width 4 -outdata UNREGISTERED -memfile \\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem -memformat orca -e \r
+    Circuit name     : onewire_spare_one\r
+    Module type      : rom\r
+    Module Version   : 2.4\r
+    Address width    : 3\r
+    Data width       : 4\r
+    Ports            : \r
+       Inputs       : Address[2:0]\r
+       Outputs      : Q[3:0]\r
+    I/O buffer       : not inserted\r
+    Memory file      : \\home\mboehmer\vhdl_pro\adcmv3\src\spare_onewire_mapping.mem\r
+    EDIF output      : suppressed\r
+    VHDL output      : onewire_spare_one.vhd\r
+    VHDL template    : onewire_spare_one_tmpl.vhd\r
+    VHDL testbench   : tb_onewire_spare_one_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : onewire_spare_one.srp\r
+    Estimated Resource Usage:\r
+            LUT : 4\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: onewire_spare_one.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/onewire_spare_one_tmpl.vhd b/src/onewire_spare_one_tmpl.vhd
new file mode 100644 (file)
index 0000000..94ce4aa
--- /dev/null
@@ -0,0 +1,13 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 2.4
+-- Thu Nov 05 15:51:35 2009
+
+-- parameterized module component declaration
+component onewire_spare_one
+    port (Address: in  std_logic_vector(2 downto 0); 
+        Q: out  std_logic_vector(3 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : onewire_spare_one
+    port map (Address(2 downto 0)=>__, Q(3 downto 0)=>__);
diff --git a/src/ped_corr_ctrl.vhd b/src/ped_corr_ctrl.vhd
new file mode 100755 (executable)
index 0000000..4469014
--- /dev/null
@@ -0,0 +1,817 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- eds_data_in[35:32] = num_frames must be used for checking free space inside ipu_stage.vhd\r
+-- max_space = (num_frames * 128 + num_frames) = num_frames * 129\r
+\r
+entity ped_corr_ctrl is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz local clock\r
+                 RESET_IN                      : in    std_logic; -- synchronous reset\r
+                 -- Slow control registers\r
+                 -- EDS buffer -- back to previous source stage\r
+                 EDS_DATA_IN           : in    std_logic_vector(39 downto 0); \r
+                 EDS_AVAIL_IN          : in    std_logic;\r
+                 EDS_DONE_OUT          : out   std_logic;\r
+                 EVT_TYPE_IN           : in    std_logic_vector(2 downto 0);\r
+                 -- DHDR information -- to next stage\r
+                 DHDR_DATA_OUT         : out   std_logic_vector(31 downto 0);\r
+                 DHDR_LENGTH_OUT       : out   std_logic_vector(15 downto 0);\r
+                 DHDR_STORE_OUT        : out   std_logic;\r
+                 DHDR_BUF_FULL_IN      : in    std_logic;\r
+                 -- data buffers -- from raw_buf_stage\r
+                 BUF_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 BUF_DONE_OUT          : out   std_logic;\r
+                 BUF_TICK_IN           : in    std_logic_vector(15 downto 0);\r
+                 BUF_START_IN          : in    std_logic_vector(15 downto 0);\r
+                 -- raw data\r
+                 BUF_0_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_1_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_2_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_3_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_4_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_5_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_6_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_7_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_8_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_9_DATA_IN         : in    std_logic_vector(37 downto 0);\r
+                 BUF_10_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_11_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_12_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_13_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_14_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 BUF_15_DATA_IN        : in    std_logic_vector(37 downto 0);\r
+                 -- Pedestal data \r
+                 PED_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 PED_0_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_1_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_2_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_3_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_4_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_5_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_6_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_7_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_8_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_9_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 PED_10_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_11_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_12_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_13_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_14_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 PED_15_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 -- Threshold data\r
+                 THR_ADDR_OUT          : out   std_logic_vector(6 downto 0);\r
+                 THR_0_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_1_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_2_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_3_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_4_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_5_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_6_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_7_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_8_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_9_DATA_IN         : in    std_logic_vector(17 downto 0);\r
+                 THR_10_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_11_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_12_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_13_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_14_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 THR_15_DATA_IN        : in    std_logic_vector(17 downto 0);\r
+                 -- processed data\r
+                 FIFO_START_OUT        : out   std_logic;\r
+                 FIFO_0_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_1_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_2_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_3_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_4_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_5_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_6_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_7_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_8_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_9_DATA_OUT       : out   std_logic_vector(39 downto 0);\r
+                 FIFO_10_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_11_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_12_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_13_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_14_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_15_DATA_OUT      : out   std_logic_vector(39 downto 0);\r
+                 FIFO_WE_OUT           : out   std_logic_vector(15 downto 0);\r
+                 FIFO_DONE_OUT         : out   std_logic; -- write level information into small FIFOs\r
+                 -- Debug signals\r
+                 DBG_BSM_OUT           : out   std_logic_vector(7 downto 0);\r
+                 DBG_OUT                       : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of ped_corr_ctrl is\r
+\r
+       -- state machine definitions\r
+       type STATES is (SLEEP,LOADFC,DELFC,CHECK,FULL,DEL0,NBERR,EMPTY,CHKFC,FCERR,CHKRW,RWERR,CHKAE,AEERR,\r
+                                       FINIT,FLOAD,FZERO,FREAD,FDONE,FDEL,FDEC,WREDS,ACKEDS,WHDR,EHDR,CCNT,CDEL0,CDEL1,DEL1,DEL2);     \r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- signals\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+       signal bsm_x                    : std_logic_vector(7 downto 0);\r
+\r
+       -- status signals from TOCs\r
+       signal buf_gooddata             : std_logic_vector(15 downto 0);\r
+       signal buf_baddata              : std_logic_vector(15 downto 0);\r
+       signal buf_nodata               : std_logic_vector(15 downto 0);\r
+       signal buf_ready                : std_logic_vector(15 downto 0);\r
+\r
+       -- local frame counter\r
+       signal to_do_ctr                : std_logic_vector(3 downto 0);\r
+       signal done_ctr                 : std_logic_vector(3 downto 0);\r
+       signal loc_frm_ctr              : std_logic_vector(3 downto 0);\r
+       signal next_ld_frm_ctr  : std_logic;\r
+       signal ld_frm_ctr               : std_logic; -- load frame counter with EDS start value \r
+       signal next_ce_frm_ctr  : std_logic;\r
+       signal ce_frm_ctr               : std_logic; -- increment frame counter\r
+       signal next_last_frame  : std_logic;\r
+       signal last_frame               : std_logic; -- all frame buffers have been copied\r
+       signal next_cleaned_up  : std_logic;\r
+       signal cleaned_up               : std_logic; -- only relevant in case of errors\r
+       signal next_multi_frame : std_logic;\r
+       signal multi_frame              : std_logic; -- more than one frame requested\r
+       signal next_do_hdr              : std_logic;\r
+       signal do_hdr                   : std_logic; -- insert debug header (in case of common errors, in case of multiframe)\r
+       signal next_do_error    : std_logic;\r
+       signal do_error                 : std_logic; -- insert debug header (in case of broken buffer only) \r
+       signal next_do_start    : std_logic; \r
+       signal do_start                 : std_logic; -- start signal for one event processing\r
+       \r
+       -- buffer status signals, error signals from checkers\r
+       signal buffers_ready    : std_logic; -- all buffers are ready for data transport\r
+       signal buffers_valid    : std_logic; -- at least one buffer has valid data\r
+       signal frame_row_error  : std_logic; \r
+       signal frame_apv_error  : std_logic;\r
+       signal frame_ctr_error  : std_logic;\r
+       \r
+       signal frame_busy               : std_logic; -- from ALU\r
+       \r
+       -- Buffer read address counter, control signals\r
+       signal buf_addr                         : std_logic_vector(5 downto 0); -- buffer / pedestal read address\r
+       signal buf_half                         : std_logic;\r
+       signal next_buf_addr_ce         : std_logic;\r
+       signal buf_addr_ce                      : std_logic;\r
+       signal next_buf_addr_rst        : std_logic;\r
+       signal buf_addr_rst                     : std_logic;\r
+       signal next_buf_addr_init       : std_logic; -- needed for THR\r
+       signal buf_addr_init            : std_logic;\r
+       signal next_buf_addr_done       : std_logic;\r
+       signal buf_addr_done            : std_logic;\r
+       signal next_buf_done            : std_logic;\r
+       signal buf_done                         : std_logic;\r
+       signal next_frame_valid         : std_logic;\r
+       signal frame_valid                      : std_logic;\r
+       signal buf_frame_valid          : std_logic;\r
+       signal raw_addr                         : std_logic_vector(6 downto 0);\r
+       signal buf_raw_addr                     : std_logic_vector(6 downto 0);\r
+\r
+       signal thr_addr                         : std_logic_vector(6 downto 0); -- threshold read address\r
+       signal thr_addr_ce                      : std_logic;\r
+       signal thr_addr_rst                     : std_logic;\r
+       signal dly_thr_addr_ce          : std_logic_vector(7 downto 0);\r
+       signal dly_thr_addr_rst         : std_logic_vector(7 downto 0);\r
+\r
+--     signal ped_addr                         : std_logic_vector(6 downto 0); -- pedestal read address\r
+\r
+       -- statemachine signals\r
+       signal next_wait_frames         : std_logic;\r
+       signal wait_frames                      : std_logic; -- we are in the waiting phase for incoming frames\r
+       signal next_eds_wr                      : std_logic;\r
+       signal eds_wr                           : std_logic; -- copy current EDS into new buffer\r
+       signal next_eds_done            : std_logic;\r
+       signal eds_done                         : std_logic; -- acknowledge and release old EDS\r
+\r
+       -- generate needs arrays...\r
+       type raw_data_t is array (0 to 15) of std_logic_vector(37 downto 0);\r
+       signal raw_data                         : raw_data_t;\r
+       type fifo_data_t is array (0 to 15) of std_logic_vector(39 downto 0);\r
+       signal fifo_data                        : fifo_data_t;\r
+       type sc_data_t is array (0 to 15) of std_logic_vector(17 downto 0);\r
+       signal ped_data                         : sc_data_t;\r
+       signal thr_data                         : sc_data_t;\r
+\r
+       signal fifo_we                          : std_logic_vector(15 downto 0);\r
+\r
+       signal errors                           : std_logic_vector(3 downto 0);\r
+\r
+       -- for summing up\r
+       signal next_small_0_sum         : std_logic_vector(4 downto 0);\r
+       signal small_0_sum                      : std_logic_vector(4 downto 0);\r
+       signal next_small_1_sum         : std_logic_vector(4 downto 0);\r
+       signal small_1_sum                      : std_logic_vector(4 downto 0);\r
+       signal small_sum                        : std_logic_vector(15 downto 0);\r
+       signal total_sum                        : std_logic_vector(15 downto 0);\r
+       signal reset_sum                        : std_logic;\r
+\r
+\r
+begin\r
+\r
+---------------------------------------------------------------------------\r
+-- Aliasing the data streams\r
+---------------------------------------------------------------------------\r
+raw_data(0)  <= buf_0_data_in;\r
+raw_data(1)  <= buf_1_data_in;\r
+raw_data(2)  <= buf_2_data_in;\r
+raw_data(3)  <= buf_3_data_in;\r
+raw_data(4)  <= buf_4_data_in;\r
+raw_data(5)  <= buf_5_data_in;\r
+raw_data(6)  <= buf_6_data_in;\r
+raw_data(7)  <= buf_7_data_in;\r
+raw_data(8)  <= buf_8_data_in;\r
+raw_data(9)  <= buf_9_data_in;\r
+raw_data(10) <= buf_10_data_in;\r
+raw_data(11) <= buf_11_data_in;\r
+raw_data(12) <= buf_12_data_in;\r
+raw_data(13) <= buf_13_data_in;\r
+raw_data(14) <= buf_14_data_in;\r
+raw_data(15) <= buf_15_data_in;\r
+\r
+ped_data(0)  <= ped_0_data_in;\r
+ped_data(1)  <= ped_1_data_in;\r
+ped_data(2)  <= ped_2_data_in;\r
+ped_data(3)  <= ped_3_data_in;\r
+ped_data(4)  <= ped_4_data_in;\r
+ped_data(5)  <= ped_5_data_in;\r
+ped_data(6)  <= ped_6_data_in;\r
+ped_data(7)  <= ped_7_data_in;\r
+ped_data(8)  <= ped_8_data_in;\r
+ped_data(9)  <= ped_9_data_in;\r
+ped_data(10) <= ped_10_data_in;\r
+ped_data(11) <= ped_11_data_in;\r
+ped_data(12) <= ped_12_data_in;\r
+ped_data(13) <= ped_13_data_in;\r
+ped_data(14) <= ped_14_data_in;\r
+ped_data(15) <= ped_15_data_in;\r
+\r
+thr_data(0)  <= thr_0_data_in;\r
+thr_data(1)  <= thr_1_data_in;\r
+thr_data(2)  <= thr_2_data_in;\r
+thr_data(3)  <= thr_3_data_in;\r
+thr_data(4)  <= thr_4_data_in;\r
+thr_data(5)  <= thr_5_data_in;\r
+thr_data(6)  <= thr_6_data_in;\r
+thr_data(7)  <= thr_7_data_in;\r
+thr_data(8)  <= thr_8_data_in;\r
+thr_data(9)  <= thr_9_data_in;\r
+thr_data(10) <= thr_10_data_in;\r
+thr_data(11) <= thr_11_data_in;\r
+thr_data(12) <= thr_12_data_in;\r
+thr_data(13) <= thr_13_data_in;\r
+thr_data(14) <= thr_14_data_in;\r
+thr_data(15) <= thr_15_data_in;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- framecounter check, must be done once per frame\r
+---------------------------------------------------------------------------\r
+THE_FRMCTR_CHECK: frmctr_check\r
+port map( CLK_IN                       => clk_in,\r
+                 GOODDATA_IN           => buf_gooddata,\r
+                 FRAMECOUNTER_IN       => loc_frm_ctr,\r
+                 FRM_NR_0_IN           => raw_data(0)(17 downto 14),\r
+                 FRM_NR_1_IN           => raw_data(1)(17 downto 14),\r
+                 FRM_NR_2_IN           => raw_data(2)(17 downto 14),\r
+                 FRM_NR_3_IN           => raw_data(3)(17 downto 14),\r
+                 FRM_NR_4_IN           => raw_data(4)(17 downto 14),\r
+                 FRM_NR_5_IN           => raw_data(5)(17 downto 14),\r
+                 FRM_NR_6_IN           => raw_data(6)(17 downto 14),\r
+                 FRM_NR_7_IN           => raw_data(7)(17 downto 14),\r
+                 FRM_NR_8_IN           => raw_data(8)(17 downto 14),\r
+                 FRM_NR_9_IN           => raw_data(9)(17 downto 14),\r
+                 FRM_NR_10_IN          => raw_data(10)(17 downto 14),\r
+                 FRM_NR_11_IN          => raw_data(11)(17 downto 14),\r
+                 FRM_NR_12_IN          => raw_data(12)(17 downto 14),\r
+                 FRM_NR_13_IN          => raw_data(13)(17 downto 14),\r
+                 FRM_NR_14_IN          => raw_data(14)(17 downto 14),\r
+                 FRM_NR_15_IN          => raw_data(15)(17 downto 14),\r
+                 FRC_ERROR_OUT         => frame_ctr_error, -- BUG\r
+                 DBG_OUT                       => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- framewise ROW and ERROR checker\r
+---------------------------------------------------------------------------\r
+THE_REF_ROW_SEL: ref_row_sel\r
+port map( CLK_IN                               => clk_in,\r
+                 READY_IN                              => buf_ready,\r
+                 GOODDATA_IN                   => buf_gooddata,\r
+                 FRAME_0_IN                    => raw_data(0)(29 downto 18),\r
+                 FRAME_1_IN                    => raw_data(1)(29 downto 18),\r
+                 FRAME_2_IN                    => raw_data(2)(29 downto 18),\r
+                 FRAME_3_IN                    => raw_data(3)(29 downto 18),\r
+                 FRAME_4_IN                    => raw_data(4)(29 downto 18),\r
+                 FRAME_5_IN                    => raw_data(5)(29 downto 18),\r
+                 FRAME_6_IN                    => raw_data(6)(29 downto 18),\r
+                 FRAME_7_IN                    => raw_data(7)(29 downto 18),\r
+                 FRAME_8_IN                    => raw_data(8)(29 downto 18),\r
+                 FRAME_9_IN                    => raw_data(9)(29 downto 18),\r
+                 FRAME_10_IN                   => raw_data(10)(29 downto 18),\r
+                 FRAME_11_IN                   => raw_data(11)(29 downto 18),\r
+                 FRAME_12_IN                   => raw_data(12)(29 downto 18),\r
+                 FRAME_13_IN                   => raw_data(13)(29 downto 18),\r
+                 FRAME_14_IN                   => raw_data(14)(29 downto 18),\r
+                 FRAME_15_IN                   => raw_data(15)(29 downto 18),\r
+                 VALID_BUFS_OUT                => buffers_valid,\r
+                 READY_OUT                             => buffers_ready,\r
+                 ROW_ERROR_OUT                 => frame_row_error,\r
+                 APV_ERROR_OUT                 => frame_apv_error,\r
+                 APV_ERROR_BITS_OUT    => open, -- BUGBUGBUG\r
+                 REF_ROW_OUT                   => open, -- selected reference row\r
+                 DBG_OUT                               => open\r
+               );\r
+\r
+---------------------------------------------------------------------------\r
+-- Statemachine\r
+---------------------------------------------------------------------------\r
+\r
+-- state registers\r
+STATE_MEM: process( clk_in ) \r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE    <= SLEEP;\r
+                       wait_frames      <= '0';\r
+                       ld_frm_ctr       <= '0';\r
+                       ce_frm_ctr       <= '0';\r
+                       eds_done         <= '0';\r
+                       eds_wr           <= '0';\r
+                       buf_addr_rst     <= '0';\r
+                       buf_addr_init    <= '0';\r
+                       buf_addr_ce      <= '0';\r
+                       frame_valid      <= '0';\r
+                       do_hdr           <= '0';\r
+                       do_error         <= '0';\r
+                       do_start         <= '0';\r
+               else\r
+                       CURRENT_STATE    <= NEXT_STATE;\r
+                       wait_frames      <= next_wait_frames;\r
+                       ld_frm_ctr       <= next_ld_frm_ctr;\r
+                       ce_frm_ctr       <= next_ce_frm_ctr;\r
+                       buf_done         <= next_buf_done;\r
+                       eds_done         <= next_eds_done;\r
+                       eds_wr           <= next_eds_wr;\r
+                       buf_addr_rst     <= next_buf_addr_rst;\r
+                       buf_addr_init    <= next_buf_addr_init;\r
+                       buf_addr_ce      <= next_buf_addr_ce;\r
+                       frame_valid      <= next_frame_valid;\r
+                       do_hdr           <= next_do_hdr;\r
+                       do_error         <= next_do_error;\r
+                       do_start         <= next_do_start;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Error pattern\r
+errors(3) <= not buffers_valid;\r
+errors(2) <= frame_ctr_error;\r
+errors(1) <= frame_row_error;\r
+errors(0) <= frame_apv_error;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, eds_avail_in, dhdr_buf_full_in, last_frame, multi_frame, frame_busy, \r
+                                                 buffers_ready, buffers_valid, frame_ctr_error, frame_row_error, frame_apv_error, \r
+                                                 buf_addr_done, buf_half )\r
+begin\r
+       NEXT_STATE         <= SLEEP; -- avoid latches\r
+       next_wait_frames   <= '0';\r
+       next_ld_frm_ctr    <= '0';\r
+       next_ce_frm_ctr    <= '0';\r
+       next_buf_done      <= '0';\r
+       next_eds_done      <= '0';\r
+       next_eds_wr        <= '0';\r
+       next_buf_addr_rst  <= '0';\r
+       next_buf_addr_init <= '0';\r
+       next_buf_addr_ce   <= '0';\r
+       next_frame_valid   <= '0';\r
+       next_do_hdr        <= '0';\r
+       next_do_error      <= '0';\r
+       next_do_start      <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      if( (eds_avail_in = '1') and (dhdr_buf_full_in = '0') ) then\r
+                                                       NEXT_STATE   <= LOADFC;\r
+                                                       next_ld_frm_ctr <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= SLEEP;\r
+                                               end if;\r
+               when LOADFC     =>      NEXT_STATE    <= DELFC;\r
+                                               next_do_start <= '1';\r
+               when DELFC      =>      NEXT_STATE <= CHECK;\r
+               when CHECK      =>      if( last_frame = '0' ) then\r
+                                                       NEXT_STATE       <= FULL;\r
+                                                       next_wait_frames <= '1';\r
+                                               else\r
+                                                       NEXT_STATE    <= EMPTY;\r
+                                               end if;\r
+               when EMPTY      =>      NEXT_STATE  <= WREDS;\r
+                                               next_eds_wr <= '1';\r
+               when FULL       =>      if( buffers_ready = '1' ) then\r
+                                                       NEXT_STATE       <= DEL0;\r
+                                                       next_do_error    <= '1'; -- here broken channels deliver a "I DON'T FEEL GOOD" word...\r
+                                               else\r
+                                                       NEXT_STATE       <= FULL;\r
+                                                       next_wait_frames <= '1';\r
+                                               end if;\r
+               when DEL0       =>      if   ( buffers_valid = '1' ) then\r
+                                                       NEXT_STATE <= CHKFC;\r
+                                               else\r
+                                                       NEXT_STATE <= NBERR;\r
+                                               end if;\r
+               when CHKFC      =>      if( frame_ctr_error = '0' ) then\r
+                                                       NEXT_STATE <= CHKRW;\r
+                                               else\r
+                                                       NEXT_STATE <= FCERR;\r
+                                               end if;\r
+               when CHKRW      =>      if( frame_row_error = '0' ) then\r
+                                                       NEXT_STATE <= CHKAE;\r
+                                               else\r
+                                                       NEXT_STATE <= RWERR;\r
+                                               end if;\r
+               when CHKAE      =>      if   ( (frame_apv_error = '0') and (multi_frame = '1') ) then\r
+                                                       NEXT_STATE  <= WHDR;\r
+                                                       next_do_hdr <= '1';\r
+                                               elsif( (frame_apv_error = '0') and (multi_frame = '0') ) then\r
+                                                       NEXT_STATE        <= FINIT;\r
+                                                       next_buf_addr_rst <= '1';\r
+                                               else\r
+                                                       NEXT_STATE        <= AEERR;\r
+                                               end if;\r
+               when WHDR       =>      NEXT_STATE <= FINIT;\r
+                                               next_buf_addr_rst <= '1';\r
+               when FINIT      =>      NEXT_STATE        <= FLOAD; -- load address x"01";\r
+                                               next_buf_addr_ce  <= '1';\r
+               when FLOAD      =>      NEXT_STATE         <= FZERO; -- load address x"00";\r
+                                               next_buf_addr_rst  <= '1';\r
+                                               next_buf_addr_init <= not buf_half;\r
+               when FZERO      =>      NEXT_STATE       <= FREAD;\r
+                                               next_buf_addr_ce <= '1';\r
+               when FREAD      =>      if   ( (buf_addr_done = '1') and (buf_half = '1') ) then\r
+                                                       NEXT_STATE       <= FDONE;\r
+                                                       next_ce_frm_ctr  <= '1';\r
+                                                       next_buf_done    <= '1';\r
+                                                       next_frame_valid <= '1';\r
+                                               elsif( (buf_addr_done = '1') and (buf_half = '0') ) then\r
+                                                       NEXT_STATE       <= FINIT;\r
+                                                       next_frame_valid <= '1';\r
+                                               else\r
+                                                       NEXT_STATE       <= FREAD; -- read buffer completely\r
+                                                       next_buf_addr_ce <= '1';\r
+                                                       next_frame_valid <= '1';\r
+                                               end if;\r
+               when FDONE      =>      if( frame_busy = '1' ) then\r
+                                                       NEXT_STATE <= FDONE;\r
+                                               else\r
+                                                       NEXT_STATE <= FDEL;\r
+                                               end if;\r
+               when FDEL       =>      NEXT_STATE <= FDEC;\r
+               when FDEC       =>      if( last_frame = '1' ) then\r
+                                                       NEXT_STATE  <= WREDS; -- copy current EDS to new buffer\r
+                                                       next_eds_wr <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= DEL0; -- only for multiframe readout, will not work (needs headers!!!)\r
+                                               end if;\r
+               when WREDS      =>      NEXT_STATE    <= ACKEDS; -- release old EDS\r
+                                               next_eds_done <= '1';\r
+               when ACKEDS     =>      NEXT_STATE <= DEL1;\r
+               when DEL1       =>      NEXT_STATE <= DEL2;\r
+               when DEL2       =>      NEXT_STATE <= SLEEP;\r
+               \r
+               when NBERR      =>      NEXT_STATE  <= EHDR;\r
+                                               next_do_hdr <= '1';\r
+               when FCERR      =>      NEXT_STATE  <= EHDR;\r
+                                               next_do_hdr <= '1';\r
+               when RWERR      =>      NEXT_STATE  <= EHDR;\r
+                                               next_do_hdr <= '1';\r
+               when AEERR      =>      NEXT_STATE  <= EHDR;\r
+                                               next_do_hdr <= '1';\r
+               when EHDR       =>      if( last_frame = '1' ) then\r
+                                                       NEXT_STATE  <= WREDS;\r
+                                                       next_eds_wr <= '1';\r
+                                               else\r
+                                                       NEXT_STATE      <= CCNT;\r
+                                                       next_ce_frm_ctr <= '1';\r
+                                                       next_buf_done   <= '1';\r
+                                               end if;\r
+               when CCNT       =>      NEXT_STATE <= CDEL0;\r
+               when CDEL0      =>      NEXT_STATE <= CDEL1;\r
+               when CDEL1      =>      if( last_frame = '1' ) then\r
+                                                       NEXT_STATE  <= WREDS;\r
+                                                       next_eds_wr <= '1';\r
+                                               else\r
+                                                       NEXT_STATE  <= EHDR;\r
+                                                       next_do_hdr <= '1';\r
+                                               end if;\r
+               when others     =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process STATE_TRANSFORM;                                                   \r
+\r
+-- state decoding (ONLY FOR DEBUGGING!)\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_x <= x"00";\r
+               when LOADFC     =>      bsm_x <= x"01";\r
+               when DELFC      =>      bsm_x <= x"02";\r
+               when CHECK      =>      bsm_x <= x"03";\r
+               when FULL       =>      bsm_x <= x"04";\r
+               when EMPTY      =>      bsm_x <= x"05";\r
+               when NBERR      =>      bsm_x <= x"06";\r
+               when CHKFC      =>      bsm_x <= x"07";\r
+               when FCERR      =>      bsm_x <= x"08";\r
+               when CHKRW      =>      bsm_x <= x"09";\r
+               when RWERR      =>      bsm_x <= x"0a";\r
+               when CHKAE      =>      bsm_x <= x"0b";\r
+               when AEERR      =>      bsm_x <= x"0c";\r
+               when FINIT      =>      bsm_x <= x"0d";\r
+               when FLOAD      =>      bsm_x <= x"0e";\r
+               when FZERO      =>      bsm_x <= x"0f";\r
+               when FREAD      =>      bsm_x <= x"10";\r
+               when FDONE      =>      bsm_x <= x"11";\r
+               when FDEL       =>      bsm_x <= x"12";\r
+               when FDEC       =>      bsm_x <= x"13";\r
+               when WREDS      =>      bsm_x <= x"14";\r
+               when ACKEDS     =>      bsm_x <= x"15";\r
+               when EHDR       =>      bsm_x <= x"16";\r
+               when CDEL0      =>      bsm_x <= x"17";\r
+               when CDEL1      =>      bsm_x <= x"18";\r
+               when CCNT       =>      bsm_x <= x"19";\r
+               when DEL0       =>      bsm_x <= x"20";\r
+               when DEL1       =>      bsm_x <= x"21";\r
+               when DEL2       =>      bsm_x <= x"22";\r
+               when WHDR       =>      bsm_x <= x"23";\r
+               when others     =>      bsm_x <= x"ff";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+---------------------------------------------------------------------------\r
+-- Buffer address counter, fetches raw data and pedestal values from EBRs\r
+---------------------------------------------------------------------------\r
+THE_BUF_ADDR_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (buf_addr_rst = '1') or (reset_in = '1') ) then\r
+                       buf_addr <= (others => '0');\r
+               elsif( buf_addr_ce = '1' ) then\r
+                       buf_addr <= buf_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_BUF_ADDR_COUNTER_PROC;\r
+\r
+next_buf_addr_done <= '1' when ( buf_addr = "111110" ) else '0';\r
+\r
+THE_HALF_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (ld_frm_ctr = '1') or (reset_in = '1') ) then\r
+                       buf_half <= '0';\r
+               elsif( (buf_addr_done = '1') and (buf_half = '0') ) then\r
+                       buf_half <= '1';\r
+               elsif( (buf_addr_done = '1') and (buf_half = '1') ) then\r
+                       buf_half <= '0';\r
+               end if;\r
+       end if;\r
+end process THE_HALF_PROC;\r
+\r
+raw_addr <= buf_half & buf_addr;\r
+\r
+---------------------------------------------------------------------------\r
+-- threshold address counter\r
+---------------------------------------------------------------------------\r
+THE_THR_ADDR_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( (thr_addr_rst = '1') or (reset_in = '1') ) then\r
+                       thr_addr <= (others => '0');\r
+               elsif( thr_addr_ce = '1' ) then\r
+                       thr_addr <= thr_addr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_THR_ADDR_COUNTER_PROC;\r
+\r
+-- was '3'\r
+thr_addr_ce  <= dly_thr_addr_ce(2);\r
+thr_addr_rst <= dly_thr_addr_rst(2);\r
+\r
+---------------------------------------------------------------------------\r
+-- local frame counter, loaded / counted by SM for checking\r
+---------------------------------------------------------------------------\r
+THE_LOC_FRAME_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       loc_frm_ctr <= (others => '0');\r
+                       to_do_ctr   <= (others => '0');\r
+                       done_ctr    <= (others => '0');\r
+               elsif( ld_frm_ctr = '1' ) then\r
+                       loc_frm_ctr <= eds_data_in(39 downto 36);\r
+                       to_do_ctr   <= eds_data_in(35 downto 32);\r
+                       done_ctr    <= (others => '0');\r
+               elsif( ce_frm_ctr = '1' ) then\r
+                       loc_frm_ctr <= loc_frm_ctr + 1; -- local frame counter\r
+                       to_do_ctr   <= to_do_ctr   - 1; -- frames still to process\r
+                       done_ctr    <= done_ctr    + 1; -- frames already processed\r
+               end if;\r
+       end if;\r
+end process THE_LOC_FRAME_COUNTER_PROC;\r
+\r
+-- check if we have still buffers to copy\r
+next_last_frame <= '1' when ( to_do_ctr = x"0" ) else '0';\r
+\r
+-- check if we have clean up the mess in case of error\r
+next_cleaned_up <= '1' when ( done_ctr = x"0" ) else '0';\r
+\r
+-- insert administration words if more than one frame is requested (MULTIFRAME)\r
+next_multi_frame <= '1' when ( eds_data_in(35 downto 32) > x"1" ) else '0';\r
+\r
+---------------------------------------------------------------------------\r
+-- synchronizing process\r
+---------------------------------------------------------------------------\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               last_frame      <= next_last_frame;\r
+               multi_frame     <= next_multi_frame;\r
+               cleaned_up      <= next_cleaned_up;\r
+               buf_addr_done   <= next_buf_addr_done;\r
+               buf_frame_valid <= frame_valid;\r
+               buf_raw_addr    <= raw_addr;\r
+               small_0_sum     <= next_small_0_sum;\r
+               small_1_sum     <= next_small_1_sum;\r
+               dly_thr_addr_ce(7 downto 0)  <= dly_thr_addr_ce(6 downto 0)  & buf_addr_ce;\r
+               dly_thr_addr_rst(7 downto 0) <= dly_thr_addr_rst(6 downto 0) & buf_addr_init;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+---------------------------------------------------------------------------\r
+-- DHDR information assembly\r
+---------------------------------------------------------------------------\r
+dhdr_data_out(31 downto 29) <= "000"; -- reserved bits\r
+dhdr_data_out(28)           <= '1';   -- packbit\r
+dhdr_data_out(27 downto 24) <= eds_data_in(7 downto 4);\r
+dhdr_data_out(23 downto 16) <= eds_data_in(15 downto 8);\r
+dhdr_data_out(15 downto 0)  <= eds_data_in(31 downto 16);\r
+\r
+dhdr_length_out             <= total_sum;\r
+\r
+dhdr_store_out              <= eds_wr;\r
+\r
+--##########################################################################\r
+--##########################################################################\r
+\r
+-- generate TimeOutCounters for all 16 APVs\r
+GEN_TOC: for i in 0 to 15 generate\r
+       THE_BUF_TOC: buf_toc\r
+       port map( CLK_IN                        => clk_in,\r
+                         RESET_IN                      => reset_in,\r
+                         BUF_TICK_IN           => buf_tick_in(i),\r
+                         BUF_START_IN          => buf_start_in(i),\r
+                         WAITFRAME_IN          => wait_frames,\r
+                         FRAMES_REQD_IN        => eds_data_in(35 downto 32), -- always the same\r
+                         BUF_LVL_IN            => raw_data(i)(37 downto 30),\r
+                         GOODDATA_OUT          => buf_gooddata(i),\r
+                         BADDATA_OUT           => buf_baddata(i),\r
+                         NODATA_OUT            => buf_nodata(i),\r
+                         READY_OUT                     => buf_ready(i),\r
+                         BSM_OUT                       => open,\r
+                         DBG_OUT                       => open\r
+                       );\r
+end generate GEN_TOC;\r
+\r
+-- generate ALUs for all 16 APV data streams\r
+GEN_ALU: for i in 0 to 15 generate\r
+       THE_ALU: apv_pc_nc_alu\r
+       port map( CLK_IN                        => clk_in,\r
+                         RESET_IN                      => reset_in,\r
+                         START_IN                      => ld_frm_ctr,\r
+                         MAX_FRAMES_IN         => eds_data_in(35 downto 32),\r
+                         CURR_FRAME_IN         => done_ctr,\r
+                         LOC_FRM_CTR_IN        => loc_frm_ctr, -- DEBUG\r
+                         EDS_FRM_CTR_IN        => eds_data_in(39 downto 36), -- DEBUG\r
+                         BUF_GOOD_IN           => buf_gooddata(i),\r
+                         BUF_BAD_IN            => buf_baddata(i),\r
+                         BUF_IGNORE_IN         => buf_nodata(i),\r
+                         ERROR_IN                      => errors,\r
+                         DO_HEADER_IN          => do_hdr,\r
+                         DO_ERROR_IN           => do_error,\r
+                         EVT_TYPE_IN           => eds_data_in(6 downto 4), --evt_type_in, -- just a quick fix, does not work lateron!\r
+                         RAW_ADDR_IN           => buf_raw_addr, -- delayed by one cycle\r
+                         RAW_DATA_IN           => raw_data(i),\r
+                         PED_DATA_IN           => ped_data(i),\r
+                         THR_DATA_IN           => thr_data(i),\r
+                         FRAME_IN                      => buf_frame_valid, -- delayed by one cycle\r
+                         FIFO_DATA_OUT         => fifo_data(i)(26 downto 0),\r
+                         WE_OUT                        => fifo_we(i),\r
+                         COUNT_OUT                     => fifo_data(i)(36 downto 27),\r
+                         ANYDATA_OUT           => fifo_data(i)(37),\r
+                         DBG_OUT                       => open\r
+                       );\r
+               fifo_data(i)(39) <= '0';\r
+               fifo_data(i)(38) <= '0';\r
+end generate GEN_ALU;\r
+\r
+frame_busy       <= fifo_data(0)(26); -- WORKAROUND!\r
+\r
+--##################################################################################\r
+---------------------------------------------------------------------------\r
+-- Sum up all data words of one event\r
+---------------------------------------------------------------------------\r
+THE_DECODER_0: decoder_8bit\r
+port map( ADDRESS      => fifo_we(7 downto 0),\r
+                 Q                     => next_small_0_sum(3 downto 0)\r
+               );\r
+next_small_0_sum(4) <= '0';\r
+\r
+THE_DECODER_1: decoder_8bit\r
+port map( ADDRESS      => fifo_we(15 downto 8),\r
+                 Q                     => next_small_1_sum(3 downto 0)\r
+               );\r
+next_small_1_sum(4) <= '0';\r
+\r
+reset_sum <= reset_in or ld_frm_ctr;\r
+\r
+THE_FIRST_ADDER: adder_5bit\r
+port map( DATAA                => small_0_sum,\r
+                 DATAB         => small_1_sum,\r
+                 CLOCK         => clk_in, \r
+                 RESET         => reset_sum, -- BUG\r
+                 CLOCKEN       => '1', \r
+                 RESULT        => small_sum(4 downto 0)\r
+               );\r
+small_sum(15 downto 5) <= (others => '0');\r
+\r
+THE_ACCUMULATOR: adder_16bit\r
+port map( DATAA                => small_sum,\r
+                 DATAB         => total_sum,\r
+                 CLOCK         => clk_in, \r
+                 RESET         => reset_sum, -- BUG \r
+                 CLOCKEN       => '1',\r
+                 RESULT        => total_sum\r
+               );\r
+\r
+fifo_we_out    <= fifo_we;\r
+fifo_start_out <= do_start;\r
+fifo_done_out  <= eds_wr;\r
+--##################################################################################\r
+\r
+\r
+-- Aliasing the data output\r
+fifo_0_data_out  <= fifo_data(0);\r
+fifo_1_data_out  <= fifo_data(1);\r
+fifo_2_data_out  <= fifo_data(2);\r
+fifo_3_data_out  <= fifo_data(3);\r
+fifo_4_data_out  <= fifo_data(4);\r
+fifo_5_data_out  <= fifo_data(5);\r
+fifo_6_data_out  <= fifo_data(6);\r
+fifo_7_data_out  <= fifo_data(7);\r
+fifo_8_data_out  <= fifo_data(8);\r
+fifo_9_data_out  <= fifo_data(9);\r
+fifo_10_data_out <= fifo_data(10);\r
+fifo_11_data_out <= fifo_data(11);\r
+fifo_12_data_out <= fifo_data(12);\r
+fifo_13_data_out <= fifo_data(13);\r
+fifo_14_data_out <= fifo_data(14);\r
+fifo_15_data_out <= fifo_data(15);\r
+\r
+---------------------------------------------------------------------------\r
+---------------------------------------------------------------------------\r
+debug(15)            <= frame_valid;\r
+debug(14)            <= buf_frame_valid;\r
+debug(13 downto 0)   <= (others => '0');\r
+--debug(15)           <= last_frame;\r
+--debug(14)           <= cleaned_up;\r
+--debug(13 downto 12) <= (others => '0');\r
+--debug(11 downto 8)  <= loc_frm_ctr;\r
+--debug(7 downto 4)   <= to_do_ctr;\r
+--debug(3 downto 0)   <= done_ctr;\r
+---------------------------------------------------------------------------\r
+---------------------------------------------------------------------------\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Output signals\r
+---------------------------------------------------------------------------\r
+eds_done_out    <= eds_done;\r
+buf_done_out    <= buf_done;\r
+buf_addr_out    <= raw_addr;\r
+ped_addr_out    <= raw_addr;\r
+thr_addr_out    <= thr_addr;\r
+\r
+---------------------------------------------------------------------------\r
+-- DEBUG signals\r
+---------------------------------------------------------------------------\r
+dbg_bsm_out     <= bsm_x;\r
+dbg_out         <= debug;\r
+\r
+end behavioral;\r
+\r
+\r
+       \r
+\r
+\r
diff --git a/src/ped_thr_mem.mem b/src/ped_thr_mem.mem
new file mode 100644 (file)
index 0000000..68576c7
--- /dev/null
@@ -0,0 +1,22 @@
+#Format=AddrHex
+#Depth=1024
+#Width=18
+#AddrRadix=3
+#DataRadix=3
+#Data
+000: 00000 00000 00000 00000 00000 00000 00000 00000
+008: 00000 00000 00000 00000 00000 00000 00000 00000
+010: 00000 00000 00000 00000 00000 00000 00000 00000
+018: 00000 00000 00000 00000 00000 00000 00000 00000
+020: 00000 00000 00000 00000 00000 00000 00000 00000
+028: 00000 00000 00000 00000 00000 00000 00000 00000
+030: 00000 00000 00000 00000 00000 00000 00000 00000
+038: 00000 00000 00000 00000 00000 00000 00000 00000
+040: 00000 00000 00000 00000 00000 00000 00000 00000
+048: 00000 00000 00000 00000 00000 00000 00000 00000
+050: 00000 00000 00000 00000 00000 00000 00000 00000
+058: 00000 00000 00000 00000 00000 00000 00000 00000
+060: 00000 00000 00000 00000 00000 00000 00000 00000
+068: 00000 00000 00000 00000 00000 00000 00000 00000
+070: 00000 00000 00000 00000 00000 00000 00000 00000
+078: 00000 00000 00000 00000 00000 00000 00000 00000
diff --git a/src/ped_thr_true.lpc b/src/ped_thr_true.lpc
new file mode 100644 (file)
index 0000000..2464f40
--- /dev/null
@@ -0,0 +1,57 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=RAM_DP_TRUE\r
+CoreRevision=7.1\r
+ModuleName=ped_thr_true\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=09/14/2009\r
+Time=12:54:09\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+AAddress=128\r
+BAddress=128\r
+AData=18\r
+BData=18\r
+enByte=0\r
+ByteSize=9\r
+AadPipeline=0\r
+BadPipeline=0\r
+AinPipeline=0\r
+BinPipeline=0\r
+AoutPipeline=1\r
+BoutPipeline=1\r
+AMOR=0\r
+BMOR=0\r
+AInData=Registered\r
+BInData=Registered\r
+AAdControl=Registered\r
+BAdControl=Registered\r
+MemFile=\r
+MemFormat=bin\r
+Reset=Sync\r
+GSR=Enabled\r
+WriteA=Normal\r
+WriteB=Normal\r
+Pad=0\r
+EnECC=0\r
+Optimization=Speed\r
+Pipeline=0\r
diff --git a/src/ped_thr_true.srp b/src/ped_thr_true.srp
new file mode 100644 (file)
index 0000000..e67819a
--- /dev/null
@@ -0,0 +1,28 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Mon Sep 14 12:54:09 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n ped_thr_true -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ramdp -device LFE2M100E -aaddr_width 7 -widtha 18 -baddr_width 7 -widthb 18 -anum_words 128 -bnum_words 128 -outdataA REGISTERED -outdataB REGISTERED -writemodeA NORMAL -writemodeB NORMAL -resetmode SYNC -cascade -1 -e 
+    Circuit name     : ped_thr_true
+    Module type      : RAM_DP_TRUE
+    Module Version   : 7.1
+    Ports            : 
+       Inputs       : DataInA[17:0], DataInB[17:0], AddressA[6:0], AddressB[6:0], ClockA, ClockB, ClockEnA, ClockEnB, WrA, WrB, ResetA, ResetB
+       Outputs      : QA[17:0], QB[17:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : ped_thr_true.vhd
+    VHDL template    : ped_thr_true_tmpl.vhd
+    VHDL testbench    : tb_ped_thr_true_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : ped_thr_true.srp
+    Element Usage    :
+         DP16KB : 1
+    Estimated Resource Usage:
+            EBR : 1
diff --git a/src/ped_thr_true.vhd b/src/ped_thr_true.vhd
new file mode 100644 (file)
index 0000000..7fa636b
--- /dev/null
@@ -0,0 +1,199 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 7.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type bram -wp 11 -rp 1010 -data_width 18 -rdata_width 18 -num_rows 128 -outdataA REGISTERED -outdataB REGISTERED -writemodeA NORMAL -writemodeB NORMAL -resetmode SYNC -cascade -1 -e 
+
+-- Mon Sep 14 12:54:09 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity ped_thr_true is
+    port (
+        DataInA: in  std_logic_vector(17 downto 0); 
+        DataInB: in  std_logic_vector(17 downto 0); 
+        AddressA: in  std_logic_vector(6 downto 0); 
+        AddressB: in  std_logic_vector(6 downto 0); 
+        ClockA: in  std_logic; 
+        ClockB: in  std_logic; 
+        ClockEnA: in  std_logic; 
+        ClockEnB: in  std_logic; 
+        WrA: in  std_logic; 
+        WrB: in  std_logic; 
+        ResetA: in  std_logic; 
+        ResetB: in  std_logic; 
+        QA: out  std_logic_vector(17 downto 0); 
+        QB: out  std_logic_vector(17 downto 0));
+end ped_thr_true;
+
+architecture Structure of ped_thr_true is
+
+    -- internal signal declarations
+    signal scuba_vlo: std_logic;
+    signal scuba_vhi: std_logic;
+
+    -- local component declarations
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute GSR : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute MEM_LPC_FILE of ped_thr_true_0_0_0 : label is "ped_thr_true.lpc";
+    attribute MEM_INIT_FILE of ped_thr_true_0_0_0 : label is "";
+    attribute CSDECODE_B of ped_thr_true_0_0_0 : label is "0b000";
+    attribute CSDECODE_A of ped_thr_true_0_0_0 : label is "0b000";
+    attribute WRITEMODE_B of ped_thr_true_0_0_0 : label is "NORMAL";
+    attribute WRITEMODE_A of ped_thr_true_0_0_0 : label is "NORMAL";
+    attribute GSR of ped_thr_true_0_0_0 : label is "DISABLED";
+    attribute RESETMODE of ped_thr_true_0_0_0 : label is "SYNC";
+    attribute REGMODE_B of ped_thr_true_0_0_0 : label is "OUTREG";
+    attribute REGMODE_A of ped_thr_true_0_0_0 : label is "OUTREG";
+    attribute DATA_WIDTH_B of ped_thr_true_0_0_0 : label is "18";
+    attribute DATA_WIDTH_A of ped_thr_true_0_0_0 : label is "18";
+
+begin
+    -- component instantiation statements
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    ped_thr_true_0_0_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "SYNC", 
+        REGMODE_B=> "OUTREG", REGMODE_A=> "OUTREG", DATA_WIDTH_B=>  18, 
+        DATA_WIDTH_A=>  18)
+        -- synopsys translate_on
+        port map (DIA0=>DataInA(0), DIA1=>DataInA(1), DIA2=>DataInA(2), 
+            DIA3=>DataInA(3), DIA4=>DataInA(4), DIA5=>DataInA(5), 
+            DIA6=>DataInA(6), DIA7=>DataInA(7), DIA8=>DataInA(8), 
+            DIA9=>DataInA(9), DIA10=>DataInA(10), DIA11=>DataInA(11), 
+            DIA12=>DataInA(12), DIA13=>DataInA(13), DIA14=>DataInA(14), 
+            DIA15=>DataInA(15), DIA16=>DataInA(16), DIA17=>DataInA(17), 
+            ADA0=>scuba_vhi, ADA1=>scuba_vhi, ADA2=>scuba_vlo, 
+            ADA3=>scuba_vlo, ADA4=>AddressA(0), ADA5=>AddressA(1), 
+            ADA6=>AddressA(2), ADA7=>AddressA(3), ADA8=>AddressA(4), 
+            ADA9=>AddressA(5), ADA10=>AddressA(6), ADA11=>scuba_vlo, 
+            ADA12=>scuba_vlo, ADA13=>scuba_vlo, CEA=>ClockEnA, 
+            CLKA=>ClockA, WEA=>WrA, CSA0=>scuba_vlo, CSA1=>scuba_vlo, 
+            CSA2=>scuba_vlo, RSTA=>ResetA, DIB0=>DataInB(0), 
+            DIB1=>DataInB(1), DIB2=>DataInB(2), DIB3=>DataInB(3), 
+            DIB4=>DataInB(4), DIB5=>DataInB(5), DIB6=>DataInB(6), 
+            DIB7=>DataInB(7), DIB8=>DataInB(8), DIB9=>DataInB(9), 
+            DIB10=>DataInB(10), DIB11=>DataInB(11), DIB12=>DataInB(12), 
+            DIB13=>DataInB(13), DIB14=>DataInB(14), DIB15=>DataInB(15), 
+            DIB16=>DataInB(16), DIB17=>DataInB(17), ADB0=>scuba_vhi, 
+            ADB1=>scuba_vhi, ADB2=>scuba_vlo, ADB3=>scuba_vlo, 
+            ADB4=>AddressB(0), ADB5=>AddressB(1), ADB6=>AddressB(2), 
+            ADB7=>AddressB(3), ADB8=>AddressB(4), ADB9=>AddressB(5), 
+            ADB10=>AddressB(6), ADB11=>scuba_vlo, ADB12=>scuba_vlo, 
+            ADB13=>scuba_vlo, CEB=>ClockEnB, CLKB=>ClockB, WEB=>WrB, 
+            CSB0=>scuba_vlo, CSB1=>scuba_vlo, CSB2=>scuba_vlo, 
+            RSTB=>ResetB, DOA0=>QA(0), DOA1=>QA(1), DOA2=>QA(2), 
+            DOA3=>QA(3), DOA4=>QA(4), DOA5=>QA(5), DOA6=>QA(6), 
+            DOA7=>QA(7), DOA8=>QA(8), DOA9=>QA(9), DOA10=>QA(10), 
+            DOA11=>QA(11), DOA12=>QA(12), DOA13=>QA(13), DOA14=>QA(14), 
+            DOA15=>QA(15), DOA16=>QA(16), DOA17=>QA(17), DOB0=>QB(0), 
+            DOB1=>QB(1), DOB2=>QB(2), DOB3=>QB(3), DOB4=>QB(4), 
+            DOB5=>QB(5), DOB6=>QB(6), DOB7=>QB(7), DOB8=>QB(8), 
+            DOB9=>QB(9), DOB10=>QB(10), DOB11=>QB(11), DOB12=>QB(12), 
+            DOB13=>QB(13), DOB14=>QB(14), DOB15=>QB(15), DOB16=>QB(16), 
+            DOB17=>QB(17));
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of ped_thr_true is
+    for Structure
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/ped_thr_true_tmpl.vhd b/src/ped_thr_true_tmpl.vhd
new file mode 100644 (file)
index 0000000..53666ec
--- /dev/null
@@ -0,0 +1,23 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 7.1
+-- Mon Sep 14 12:54:09 2009
+
+-- parameterized module component declaration
+component ped_thr_true
+    port (DataInA: in  std_logic_vector(17 downto 0); 
+        DataInB: in  std_logic_vector(17 downto 0); 
+        AddressA: in  std_logic_vector(6 downto 0); 
+        AddressB: in  std_logic_vector(6 downto 0); 
+        ClockA: in  std_logic; ClockB: in  std_logic; 
+        ClockEnA: in  std_logic; ClockEnB: in  std_logic; 
+        WrA: in  std_logic; WrB: in  std_logic; ResetA: in  std_logic; 
+        ResetB: in  std_logic; QA: out  std_logic_vector(17 downto 0); 
+        QB: out  std_logic_vector(17 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : ped_thr_true
+    port map (DataInA(17 downto 0)=>__, DataInB(17 downto 0)=>__, 
+        AddressA(6 downto 0)=>__, AddressB(6 downto 0)=>__, ClockA=>__, 
+        ClockB=>__, ClockEnA=>__, ClockEnB=>__, WrA=>__, WrB=>__, ResetA=>__, 
+        ResetB=>__, QA(17 downto 0)=>__, QB(17 downto 0)=>__);
diff --git a/src/pll_40m.lpc b/src/pll_40m.lpc
new file mode 100644 (file)
index 0000000..46760a8
--- /dev/null
@@ -0,0 +1,56 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=PLL\r
+CoreRevision=4.2\r
+ModuleName=pll_40m\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=01/30/2009\r
+Time=10:01:30\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=None\r
+Order=None\r
+IO=0\r
+Type=ehxpllb\r
+mode=normal\r
+IFrq=100\r
+OFrq=40.000000\r
+KFrq=100.000000\r
+U_OFrq=40\r
+U_KFrq=50\r
+OP_Tol=0.0\r
+OK_Tol=0.0\r
+Div=5\r
+Mult=2\r
+Post=32\r
+SecD=2\r
+fb_mode=CLKOP\r
+PhaseDuty=Dynamic\r
+DelayControl=GPLL_NO_DELAY\r
+External=DISABLED\r
+PCDR=1\r
+ClkOPBp=0\r
+EnCLKOS=1\r
+ClkOSBp=0\r
+Phase=0.0\r
+Duty=8\r
+DPD=50% Duty\r
+EnCLKOK=0\r
+ClkOKBp=0\r
+ClkRst=0\r
diff --git a/src/pll_40m.vhd b/src/pll_40m.vhd
new file mode 100644 (file)
index 0000000..e8a3468
--- /dev/null
@@ -0,0 +1,137 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 4.2
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n pll_40m -lang vhdl -synth synplify -arch ep5m00 -type pll -fin 100 -phase_cntl DYNAMIC -fclkop 40 -fclkop_tol 0.0 -delay_cntl GPLL_NO_DELAY -fb_mode CLOCKTREE -extcap DISABLED -phaseadj 0.0 -duty 8 -duty50 -noclkok -use_rst -e 
+
+-- Fri Jan 30 10:01:31 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity pll_40m is
+    port (
+        CLK: in std_logic; 
+        RESET: in std_logic; 
+        DPAMODE: in std_logic; 
+        DPHASE0: in std_logic; 
+        DPHASE1: in std_logic; 
+        DPHASE2: in std_logic; 
+        DPHASE3: in std_logic; 
+        CLKOP: out std_logic; 
+        CLKOS: out std_logic; 
+        LOCK: out std_logic);
+ attribute dont_touch : string;
+ attribute dont_touch of pll_40m : entity is "true";
+end pll_40m;
+
+architecture Structure of pll_40m is
+
+    -- internal signal declarations
+    signal DPHASE3_inv: std_logic;
+    signal CLKOP_t: std_logic;
+    signal scuba_vlo: std_logic;
+    signal CLK_t: std_logic;
+
+    -- local component declarations
+    component INV
+        port (A: in std_logic; Z: out std_logic);
+    end component;
+    component VLO
+        port (Z: out std_logic);
+    end component;
+    component EPLLD
+    -- synopsys translate_off
+        generic (PLLCAP : in String; CLKOK_BYPASS : in String; 
+                CLKOS_BYPASS : in String; CLKOP_BYPASS : in String; 
+                DUTY : in Integer; PHASEADJ : in String; 
+                PHASE_CNTL : in String; CLKOK_DIV : in Integer; 
+                CLKFB_DIV : in Integer; CLKOP_DIV : in Integer; 
+                CLKI_DIV : in Integer);
+    -- synopsys translate_on
+        port (CLKI: in std_logic; CLKFB: in std_logic; RST: in std_logic; 
+            RSTK: in std_logic; DPAMODE: in std_logic; DRPAI3: in std_logic; 
+            DRPAI2: in std_logic; DRPAI1: in std_logic; DRPAI0: in std_logic; 
+            DFPAI3: in std_logic; DFPAI2: in std_logic; DFPAI1: in std_logic; 
+            DFPAI0: in std_logic; CLKOP: out std_logic; CLKOS: out std_logic; 
+            CLKOK: out std_logic; LOCK: out std_logic; CLKINTFB: out std_logic);
+    end component;
+    attribute PLLCAP : string; 
+    attribute PLLTYPE : string; 
+    attribute CLKOK_BYPASS : string; 
+    attribute FREQUENCY_PIN_CLKOK : string; 
+    attribute CLKOK_DIV : string; 
+    attribute CLKOS_BYPASS : string; 
+    attribute FREQUENCY_PIN_CLKOS : string; 
+    attribute FREQUENCY_PIN_CLKOP : string; 
+    attribute CLKOP_BYPASS : string; 
+    attribute PHASE_CNTL : string; 
+    attribute FDEL : string; 
+    attribute DUTY : string; 
+    attribute PHASEADJ : string; 
+    attribute FREQUENCY_PIN_CLKI : string; 
+    attribute CLKOP_DIV : string; 
+    attribute CLKFB_DIV : string; 
+    attribute CLKI_DIV : string; 
+    attribute FIN : string; 
+    attribute PLLCAP of PLLDInst_0 : label is "DISABLED";
+    attribute PLLTYPE of PLLDInst_0 : label is "GPLL";
+    attribute CLKOK_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute FREQUENCY_PIN_CLKOK of PLLDInst_0 : label is "50.000000";
+    attribute CLKOK_DIV of PLLDInst_0 : label is "2";
+    attribute CLKOS_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute FREQUENCY_PIN_CLKOS of PLLDInst_0 : label is "40.000000";
+    attribute FREQUENCY_PIN_CLKOP of PLLDInst_0 : label is "40.000000";
+    attribute CLKOP_BYPASS of PLLDInst_0 : label is "DISABLED";
+    attribute PHASE_CNTL of PLLDInst_0 : label is "DYNAMIC";
+    attribute FDEL of PLLDInst_0 : label is "0";
+    attribute DUTY of PLLDInst_0 : label is "8";
+    attribute PHASEADJ of PLLDInst_0 : label is "0.0";
+    attribute FREQUENCY_PIN_CLKI of PLLDInst_0 : label is "100.000000";
+    attribute CLKOP_DIV of PLLDInst_0 : label is "32";
+    attribute CLKFB_DIV of PLLDInst_0 : label is "2";
+    attribute CLKI_DIV of PLLDInst_0 : label is "5";
+    attribute FIN of PLLDInst_0 : label is "100.000000";
+    attribute syn_keep : boolean;
+    attribute syn_noprune : boolean;
+    attribute syn_noprune of Structure : architecture is true;
+
+begin
+    -- component instantiation statements
+    INV_0: INV
+        port map (A=>DPHASE3, Z=>DPHASE3_inv);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    PLLDInst_0: EPLLD
+        -- synopsys translate_off
+        generic map (PLLCAP=> "DISABLED", CLKOK_BYPASS=> "DISABLED", 
+        CLKOK_DIV=>  2, CLKOS_BYPASS=> "DISABLED", CLKOP_BYPASS=> "DISABLED", 
+        PHASE_CNTL=> "DYNAMIC", DUTY=>  8, PHASEADJ=> "0.0", CLKOP_DIV=>  32, 
+        CLKFB_DIV=>  2, CLKI_DIV=>  5)
+        -- synopsys translate_on
+        port map (CLKI=>CLK_t, CLKFB=>CLKOP_t, RST=>RESET, 
+            RSTK=>scuba_vlo, DPAMODE=>DPAMODE, DRPAI3=>DPHASE3, 
+            DRPAI2=>DPHASE2, DRPAI1=>DPHASE1, DRPAI0=>DPHASE0, 
+            DFPAI3=>DPHASE3_inv, DFPAI2=>DPHASE2, DFPAI1=>DPHASE1, 
+            DFPAI0=>DPHASE0, CLKOP=>CLKOP_t, CLKOS=>CLKOS, CLKOK=>open, 
+            LOCK=>LOCK, CLKINTFB=>open);
+
+    CLKOP <= CLKOP_t;
+    CLK_t <= CLK;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of pll_40m is
+    for Structure
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:EPLLD use entity ecp2m.EPLLD(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/pll_40m_tmpl.vhd b/src/pll_40m_tmpl.vhd
new file mode 100644 (file)
index 0000000..786a886
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_PROD_Build (44)
+-- Module  Version: 4.2
+-- Fri Jan 30 10:01:31 2009
+
+-- parameterized module component declaration
+component pll_40m
+    port (CLK: in std_logic; RESET: in std_logic; DPAMODE: in std_logic; 
+        DPHASE0: in std_logic; DPHASE1: in std_logic; DPHASE2: in std_logic; 
+        DPHASE3: in std_logic; CLKOP: out std_logic; CLKOS: out std_logic; 
+        LOCK: out std_logic);
+end component;
+
+-- parameterized module component instance
+__ : pll_40m
+    port map (CLK=>__, RESET=>__, DPAMODE=>__, DPHASE0=>__, DPHASE1=>__, 
+        DPHASE2=>__, DPHASE3=>__, CLKOP=>__, CLKOS=>__, LOCK=>__);
diff --git a/src/pulse_stretch.vhd b/src/pulse_stretch.vhd
new file mode 100644 (file)
index 0000000..df8b3a8
--- /dev/null
@@ -0,0 +1,62 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity pulse_stretch is\r
+       port( CLK_IN                    : in    std_logic;\r
+                 RESET_IN                      : in    std_logic;\r
+                 START_IN                      : in    std_logic;\r
+                 PULSE_OUT                     : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of pulse_stretch is\r
+\r
+       -- normal signals\r
+       signal pulse_cnt                : std_logic_vector(3 downto 0);\r
+       signal pulse_cnt_ce             : std_logic;\r
+       signal pulse_x                  : std_logic;\r
+       signal pulse                    : std_logic;\r
+       \r
+begin                                          \r
+\r
+-- Pulse length counter\r
+THE_PULSE_LENGTH_CTR: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       pulse_cnt    <= (others => '0');\r
+               elsif( pulse_cnt_ce = '1' ) then\r
+                       pulse_cnt    <= pulse_cnt + 1;\r
+               end if;\r
+       end if;\r
+end process THE_PULSE_LENGTH_CTR;\r
+\r
+pulse_cnt_ce <= '1' when ( (start_in = '1') or (pulse_cnt /= x"0") ) else '0';\r
+\r
+pulse_x      <= '1' when ( (pulse_cnt(2) = '1') or (pulse_cnt(3) = '1') ) else '0';\r
+\r
+-- Syanchronize it\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       pulse <= '0';\r
+               else\r
+                       pulse <= pulse_x;\r
+               end if;\r
+       end if; \r
+end process THE_SYNC_PROC;\r
+\r
+\r
+-- output signals\r
+pulse_out               <= pulse;\r
+debug_out(15 downto 4)  <= (others => '0');  \r
+debug_out(3 downto 0)   <= pulse_cnt;\r
+\r
+end behavioral;                                \r
diff --git a/src/pulse_sync.vhd b/src/pulse_sync.vhd
new file mode 100644 (file)
index 0000000..70164f6
--- /dev/null
@@ -0,0 +1,71 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity pulse_sync is\r
+       port( CLK_A_IN                  : in    std_logic;\r
+                 RESET_A_IN            : in    std_logic;\r
+                 PULSE_A_IN            : in    std_logic;\r
+                 CLK_B_IN                      : in    std_logic;\r
+                 RESET_B_IN            : in    std_logic;\r
+                 PULSE_B_OUT           : out   std_logic\r
+               );\r
+end;\r
+\r
+architecture behavioral of pulse_sync is\r
+\r
+       -- normal signals\r
+       signal toggle_ff                : std_logic;\r
+       signal sync_q                   : std_logic;\r
+       signal sync_qq                  : std_logic;\r
+       signal sync_qqq                 : std_logic;\r
+       signal pulse_b                  : std_logic;\r
+               \r
+begin\r
+\r
+-- toggle flip flop in clock domain A\r
+THE_TOGGLE_FF_PROC: process( clk_a_in )\r
+begin\r
+       if( rising_edge(clk_a_in) ) then\r
+               if   ( reset_a_in = '1' ) then\r
+                       toggle_ff <= '0';\r
+               elsif( pulse_a_in = '1' ) then\r
+                       toggle_ff <= not toggle_ff;\r
+               end if;\r
+       end if;\r
+end process THE_TOGGLE_FF_PROC;\r
+\r
+-- synchronizing stage for clock domain B\r
+THE_SYNC_STAGE_PROC: process( clk_b_in )\r
+begin\r
+       if( rising_edge(clk_b_in) ) then\r
+               if( reset_b_in = '1' ) then\r
+                       sync_q <= '0'; sync_qq <= '0'; sync_qqq <= '0';\r
+               else\r
+                       sync_qqq <= sync_qq;\r
+                       sync_qq  <= sync_q;\r
+                       sync_q   <= toggle_ff;\r
+               end if;\r
+       end if;\r
+end process THE_SYNC_STAGE_PROC;\r
+\r
+-- output pulse registering\r
+THE_OUTPUT_PULSE_PROC: process( clk_b_in )\r
+begin\r
+       if( rising_edge(clk_b_in) ) then\r
+               if( reset_b_in = '1' ) then\r
+                       pulse_b <= '0';\r
+               else\r
+                       pulse_b <= sync_qqq xor sync_qq;\r
+               end if;\r
+       end if;\r
+end process THE_OUTPUT_PULSE_PROC;\r
+\r
+-- output signals\r
+pulse_b_out   <= pulse_b;\r
+\r
+end behavioral;\r
diff --git a/src/raw_buf_stage_new.vhd b/src/raw_buf_stage_new.vhd
new file mode 100755 (executable)
index 0000000..bef706b
--- /dev/null
@@ -0,0 +1,410 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity raw_buf_stage_new is\r
+       port( CLK_IN                    : in    std_logic; -- 100MHz local clock\r
+                 CLK_APV_IN            : in    std_logic; -- 40MHz APV clock\r
+                 RESET_IN                      : in    std_logic; -- general reset (100MHz)\r
+                 -- trigger related signals\r
+                 APV_RESET_IN          : in    std_logic; -- APV reset signal (100MHz)\r
+                 APV_SYNC_IN           : in    std_logic; -- APV sync trigger has been sent (40MHz)\r
+                 APV_FRAME_REQD_IN     : in    std_logic; -- one APV frame has been requested (100MHz)\r
+                 -- ADC0 signals\r
+                 ADC0_VALID_IN         : in    std_logic; -- 40M reconstructed clock is valid\r
+                 ADC0_0_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 0\r
+                 ADC0_1_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 1\r
+                 ADC0_2_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 2\r
+                 ADC0_3_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 3\r
+                 ADC0_4_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 4\r
+                 ADC0_5_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 5\r
+                 ADC0_6_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 6\r
+                 ADC0_7_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC0 channel 7\r
+                 -- ADC1 signals\r
+                 ADC1_VALID_IN         : in    std_logic; -- 40M reconstructed clock is valid\r
+                 ADC1_0_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 0\r
+                 ADC1_1_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 1\r
+                 ADC1_2_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 2\r
+                 ADC1_3_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 3\r
+                 ADC1_4_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 4\r
+                 ADC1_5_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 5\r
+                 ADC1_6_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 6\r
+                 ADC1_7_DATA_IN        : in    std_logic_vector(11 downto 0); -- parallel data from ADC1 channel 7\r
+                 -- Slow control registers\r
+                 MAX_TRG_NUM_IN        : in    std_logic_vector(3 downto 0); -- maximum number of triggers / event\r
+                 BIT_LOW_IN            : in    std_logic_vector(11 downto 0); -- "bit low" threshold\r
+                 BIT_HIGH_IN           : in    std_logic_vector(11 downto 0); -- "bit high" threshold\r
+                 FL_LOW_IN                     : in    std_logic_vector(11 downto 0); -- "flatline low" threshold\r
+                 FL_HIGH_IN            : in    std_logic_vector(11 downto 0); -- "flatline high" threshold\r
+                 APV_ON_IN                     : in    std_logic_vector(15 downto 0); -- APV on/off bits from slow control\r
+                 -- 100MHZ synchronous interface\r
+                 BUF_FULL_OUT          : out   std_logic;\r
+                 BUF_ADDR_IN           : in    std_logic_vector(6 downto 0);\r
+                 BUF_DONE_IN           : in    std_logic;\r
+                 BUF_TICK_OUT          : out   std_logic_vector(15 downto 0);\r
+                 BUF_START_OUT         : out   std_logic_vector(15 downto 0);\r
+                 BUF_READY_OUT         : out   std_logic_vector(15 downto 0);\r
+                 BUF_0_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_1_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_2_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_3_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_4_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_5_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_6_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_7_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_8_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_9_DATA_OUT        : out   std_logic_vector(37 downto 0);\r
+                 BUF_10_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_11_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_12_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_13_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_14_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 BUF_15_DATA_OUT       : out   std_logic_vector(37 downto 0);\r
+                 -- Debug signals\r
+                 DEBUG_OUT                     : out   std_logic_vector(63 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of raw_buf_stage_new is\r
+\r
+       -- Reset signals, combinatorial and registered\r
+       signal next_reset_all                   : std_logic; \r
+       signal reset_all                                : std_logic; -- 40MHz clock domain\r
+       signal next_reset                               : std_logic; \r
+       signal reset                                    : std_logic; -- 100MHz clock domain \r
+\r
+       -- APV locker signals (arrays / vectors)\r
+       type adc_data_t is array (0 to 15) of std_logic_vector(11 downto 0);\r
+       signal adc_data                         : adc_data_t;\r
+       type apv_status_t is array (0 to 15) of std_logic_vector(7 downto 0);\r
+       signal apv_status                       : apv_status_t;\r
+       type apv_frame_t is array (0 to 15) of std_logic_vector(11 downto 0);\r
+       signal apv_frame                        : apv_frame_t;\r
+       type apv_channel_t is array (0 to 15) of std_logic_vector(6 downto 0); \r
+       signal apv_channel                      : apv_channel_t;\r
+       type apv_data_t is array (0 to 15) of std_logic_vector(17 downto 0);\r
+       signal apv_data                         : apv_data_t;\r
+\r
+       signal apv_analog                       : std_logic_vector(15 downto 0);\r
+       signal apv_start                        : std_logic_vector(15 downto 0);\r
+       signal apv_last                         : std_logic_vector(15 downto 0);\r
+\r
+       -- Buffer signals (arrays / vectors)\r
+       type buf_data_t is array (0 to 15) of std_logic_vector(17 downto 0);\r
+       signal buf_data                         : buf_data_t;\r
+       type buf_status_t is array (0 to 15) of std_logic_vector(7 downto 0);\r
+       signal buf_status                       : buf_status_t;\r
+       type buf_frame_t is array (0 to 15) of std_logic_vector(11 downto 0);\r
+       signal buf_frame                        : buf_frame_t;\r
+       type buf_level_t is array (0 to 15) of std_logic_vector(7 downto 0);\r
+       signal buf_level                        : buf_level_t;  \r
+\r
+       signal buf_tick                         : std_logic_vector(15 downto 0);\r
+       signal buf_start                        : std_logic_vector(15 downto 0);\r
+       signal buf_ready                        : std_logic_vector(15 downto 0);\r
+       signal buf_full                         : std_logic_vector(15 downto 0);        \r
+\r
+       signal next_raw_buf_full        : std_logic;\r
+       signal raw_buf_full                     : std_logic;\r
+\r
+       -- Debug\r
+       signal debug                            : std_logic_vector(63 downto 0);\r
+       \r
+begin\r
+\r
+---------------------------------------------------------------------------\r
+-- Debugging signals\r
+---------------------------------------------------------------------------\r
+--debug(31 downto 0) <= (others => '0');\r
+debug(63 downto 60)    <= apv_data(15)(17 downto 14);\r
+debug(59 downto 56)    <= apv_data(14)(17 downto 14);\r
+debug(55 downto 52)    <= apv_data(13)(17 downto 14);\r
+debug(51 downto 48)    <= apv_data(12)(17 downto 14);\r
+debug(47 downto 44)    <= apv_data(11)(17 downto 14);\r
+debug(43 downto 40)    <= apv_data(10)(17 downto 14);\r
+debug(39 downto 36)    <= apv_data(9)(17 downto 14);\r
+debug(35 downto 32)    <= apv_data(8)(17 downto 14);\r
+debug(31 downto 28)    <= apv_data(7)(17 downto 14);\r
+debug(27 downto 24)    <= apv_data(6)(17 downto 14);\r
+debug(23 downto 20)    <= apv_data(5)(17 downto 14);\r
+debug(19 downto 16)    <= apv_data(4)(17 downto 14);\r
+debug(15 downto 12)    <= apv_data(3)(17 downto 14);\r
+debug(11 downto 8)     <= apv_data(2)(17 downto 14);\r
+debug(7 downto 4)      <= apv_data(1)(17 downto 14);\r
+debug(3 downto 0)      <= apv_data(0)(17 downto 14);\r
+\r
+---------------------------------------------------------------------------\r
+-- Reset handling\r
+---------------------------------------------------------------------------\r
+next_reset_all <= (reset_in or apv_reset_in); -- 40MHz clock domain \r
+next_reset     <= (reset_in or apv_reset_in); -- 100MHz clock domain\r
+\r
+THE_RESET_SYNC: state_sync\r
+port map( STATE_A_IN           => next_reset_all,\r
+                 CLK_B_IN                      => clk_apv_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset_all\r
+               );\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Busy and reset handling\r
+---------------------------------------------------------------------------\r
+next_raw_buf_full   <= '1' when ( buf_full /= x"0000" ) else '0';\r
+\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               raw_buf_full  <= next_raw_buf_full;\r
+               reset         <= next_reset_all;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- ADC0: APV [7:0] lock handler, data separation, raw data buffer\r
+---------------------------------------------------------------------------\r
+\r
+-- Aliasing the inputs for the generator\r
+adc_data(7) <= adc0_7_data_in;\r
+adc_data(6) <= adc0_6_data_in;\r
+adc_data(5) <= adc0_5_data_in;\r
+adc_data(4) <= adc0_4_data_in;\r
+adc_data(3) <= adc0_3_data_in;\r
+adc_data(2) <= adc0_2_data_in;\r
+adc_data(1) <= adc0_1_data_in;\r
+adc_data(0) <= adc0_0_data_in;\r
+\r
+-- generate 8 identical blocks, one per APV connected to ADC0\r
+GEN_ADC0: for i in 0 to 7 generate\r
+\r
+       -- APV locker, handles synchronisation and all the other stuff\r
+       THE_APV_LOCKER: apv_locker\r
+       port map( CLK_APV_IN                    => clk_apv_in,\r
+                         RESET_IN                              => reset_all,\r
+                         SYNC_IN                               => apv_sync_in,\r
+                         ADC_RAW_IN                    => adc_data(i),\r
+                         ADC_VALID_IN                  => adc0_valid_in,\r
+                         APV_ON_IN                             => apv_on_in(i),\r
+                         BIT_LOW_IN                    => bit_low_in,\r
+                         BIT_HIGH_IN                   => bit_high_in,\r
+                         FL_LOW_IN                             => fl_low_in,\r
+                         FL_HIGH_IN                    => fl_high_in,\r
+                         STATUS_IGNORE_OUT             => apv_status(i)(1),\r
+                         STATUS_UNKNOWN_OUT    => apv_status(i)(6),\r
+                         STATUS_BADADC_OUT             => apv_status(i)(7),\r
+                         STATUS_LOCKED_OUT             => apv_status(i)(5),\r
+                         STATUS_LOST_OUT               => apv_status(i)(4),\r
+                         STATUS_NOSYNC_OUT             => apv_status(i)(3),\r
+                         STATUS_MISSING_OUT    => apv_status(i)(2),\r
+                         STATUS_TICKMARK_OUT   => apv_status(i)(0),\r
+                         FRAME_ROW_OUT                 => apv_frame(i)(7 downto 0),\r
+                         FRAME_ERROR_OUT               => apv_frame(i)(8), \r
+                         FRAME_OVF_OUT                 => apv_frame(i)(9),\r
+                         FRAME_UDF_OUT                 => apv_frame(i)(10),\r
+                         FRAME_FLAT_OUT                => apv_frame(i)(11),\r
+                         FRAME_CTR_OUT                 => apv_data(i)(17 downto 14),\r
+                         APV_CHANNEL_OUT               => apv_channel(i),\r
+                         APV_OVERFLOW_OUT              => apv_data(i)(13),\r
+                         APV_UNDERFLOW_OUT             => apv_data(i)(12),\r
+                         APV_RAW_OUT                   => apv_data(i)(11 downto 0),\r
+                         APV_ANALOG_OUT                => apv_analog(i),\r
+                         APV_START_OUT                 => apv_start(i),\r
+                         APV_LAST_OUT                  => apv_last(i),\r
+                         DEBUG_OUT                             => open\r
+                       );      \r
+       \r
+       -- raw buffer, stores frame data, all outputs are 100MHz synchronized\r
+       THE_APV_RAW_BUFFER: apv_raw_buffer\r
+       port map( CLK_APV_IN            => clk_apv_in,\r
+                         RESET_IN                      => reset_all,\r
+                         FRM_REQD_IN           => apv_frame_reqd_in,\r
+                         MAX_TRG_NUM_IN        => max_trg_num_in,\r
+                         ADC_ANALOG_IN         => apv_analog(i),\r
+                         ADC_START_IN          => apv_start(i),\r
+                         ADC_LAST_IN           => apv_last(i),\r
+                         ADC_CHANNEL_IN        => apv_channel(i),\r
+                         ADC_RAW_IN            => apv_data(i),\r
+                         ADC_STATUS_IN         => apv_status(i),\r
+                         ADC_FRAME_IN          => apv_frame(i),\r
+                         BUF_CLK_IN            => clk_in,\r
+                         BUF_RESET_IN          => reset,\r
+                         BUF_START_OUT         => buf_start(i),\r
+                         BUF_READY_OUT         => buf_ready(i),\r
+                         BUF_ADDR_IN           => buf_addr_in,\r
+                         BUF_DONE_IN           => buf_done_in, \r
+                         BUF_DATA_OUT          => buf_data(i),\r
+                         BUF_STATUS_OUT        => buf_status(i),\r
+                         BUF_FRAME_OUT         => buf_frame(i),\r
+                         BUF_GOOD_OUT          => buf_level(i)(7),\r
+                         BUF_BROKEN_OUT        => buf_level(i)(6),\r
+                         BUF_IGNORE_OUT        => buf_level(i)(5),\r
+                         BUF_LEVEL_OUT         => buf_level(i)(4 downto 0),\r
+                         BUF_TICKMARK_OUT      => buf_tick(i),\r
+                         BUF_FULL_OUT          => buf_full(i),\r
+                         DEBUG_OUT                     => open\r
+                       );\r
+\r
+end generate GEN_ADC0;\r
+\r
+---------------------------------------------------------------------------\r
+-- ADC1: APV [15:8] lock handler, data separation, raw data buffer\r
+---------------------------------------------------------------------------\r
+\r
+-- Aliasing the inputs for the generator\r
+adc_data(15) <= adc1_7_data_in;\r
+adc_data(14) <= adc1_6_data_in;\r
+adc_data(13) <= adc1_5_data_in;\r
+adc_data(12) <= adc1_4_data_in;\r
+adc_data(11) <= adc1_3_data_in;\r
+adc_data(10) <= adc1_2_data_in;\r
+adc_data(9)  <= adc1_1_data_in;\r
+adc_data(8)  <= adc1_0_data_in;\r
+\r
+-- generate 8 identical blocks, one per APV connected to ADC1\r
+GEN_ADC1: for i in 8 to 15 generate\r
+\r
+       -- APV locker, handles synchronisation and all the other stuff\r
+       THE_APV_LOCKER: apv_locker\r
+       port map( CLK_APV_IN                    => clk_apv_in,\r
+                         RESET_IN                              => reset_all,\r
+                         SYNC_IN                               => apv_sync_in,\r
+                         ADC_RAW_IN                    => adc_data(i),\r
+                         ADC_VALID_IN                  => adc1_valid_in,\r
+                         APV_ON_IN                             => apv_on_in(i),\r
+                         BIT_LOW_IN                    => bit_low_in,\r
+                         BIT_HIGH_IN                   => bit_high_in,\r
+                         FL_LOW_IN                             => fl_low_in,\r
+                         FL_HIGH_IN                    => fl_high_in,\r
+                         STATUS_IGNORE_OUT             => apv_status(i)(1),\r
+                         STATUS_UNKNOWN_OUT    => apv_status(i)(6),\r
+                         STATUS_BADADC_OUT             => apv_status(i)(7),\r
+                         STATUS_LOCKED_OUT             => apv_status(i)(5),\r
+                         STATUS_LOST_OUT               => apv_status(i)(4),\r
+                         STATUS_NOSYNC_OUT             => apv_status(i)(3),\r
+                         STATUS_MISSING_OUT    => apv_status(i)(2),\r
+                         STATUS_TICKMARK_OUT   => apv_status(i)(0),\r
+                         FRAME_ROW_OUT                 => apv_frame(i)(7 downto 0),\r
+                         FRAME_ERROR_OUT               => apv_frame(i)(8), \r
+                         FRAME_OVF_OUT                 => apv_frame(i)(9),\r
+                         FRAME_UDF_OUT                 => apv_frame(i)(10),\r
+                         FRAME_FLAT_OUT                => apv_frame(i)(11),\r
+                         FRAME_CTR_OUT                 => apv_data(i)(17 downto 14),\r
+                         APV_CHANNEL_OUT               => apv_channel(i),\r
+                         APV_OVERFLOW_OUT              => apv_data(i)(13),\r
+                         APV_UNDERFLOW_OUT             => apv_data(i)(12),\r
+                         APV_RAW_OUT                   => apv_data(i)(11 downto 0),\r
+                         APV_ANALOG_OUT                => apv_analog(i),\r
+                         APV_START_OUT                 => apv_start(i),\r
+                         APV_LAST_OUT                  => apv_last(i),\r
+                         DEBUG_OUT                             => open\r
+                       );      \r
+       \r
+       -- raw buffer, stores frame data, all outputs are 100MHz synchronized\r
+       THE_APV_RAW_BUFFER: apv_raw_buffer\r
+       port map( CLK_APV_IN            => clk_apv_in,\r
+                         RESET_IN                      => reset_all,\r
+                         FRM_REQD_IN           => apv_frame_reqd_in,\r
+                         MAX_TRG_NUM_IN        => max_trg_num_in,\r
+                         ADC_ANALOG_IN         => apv_analog(i),\r
+                         ADC_START_IN          => apv_start(i),\r
+                         ADC_LAST_IN           => apv_last(i),\r
+                         ADC_CHANNEL_IN        => apv_channel(i),\r
+                         ADC_RAW_IN            => apv_data(i),\r
+                         ADC_STATUS_IN         => apv_status(i),\r
+                         ADC_FRAME_IN          => apv_frame(i),\r
+                         BUF_CLK_IN            => clk_in,\r
+                         BUF_RESET_IN          => reset,\r
+                         BUF_START_OUT         => buf_start(i),\r
+                         BUF_READY_OUT         => buf_ready(i),\r
+                         BUF_ADDR_IN           => buf_addr_in,\r
+                         BUF_DONE_IN           => buf_done_in, \r
+                         BUF_DATA_OUT          => buf_data(i),\r
+                         BUF_STATUS_OUT        => buf_status(i),\r
+                         BUF_FRAME_OUT         => buf_frame(i),\r
+                         BUF_GOOD_OUT          => buf_level(i)(7),\r
+                         BUF_BROKEN_OUT        => buf_level(i)(6),\r
+                         BUF_IGNORE_OUT        => buf_level(i)(5),\r
+                         BUF_LEVEL_OUT         => buf_level(i)(4 downto 0),\r
+                         BUF_TICKMARK_OUT      => buf_tick(i),\r
+                         BUF_FULL_OUT          => buf_full(i),\r
+                         DEBUG_OUT                     => open\r
+                       );\r
+\r
+end generate GEN_ADC1;\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- Output signals\r
+---------------------------------------------------------------------------\r
+\r
+buf_full_out      <= raw_buf_full;\r
+buf_tick_out      <= buf_tick;         -- needed for TOCs\r
+buf_start_out     <= buf_start;                -- needed for TOCs\r
+buf_ready_out     <= buf_ready;                -- debug signal\r
+\r
+-- Alias the outputs from generator\r
+buf_0_data_out(17 downto 0)   <= buf_data(0);\r
+buf_0_data_out(29 downto 18)  <= buf_frame(0);\r
+buf_0_data_out(37 downto 30)  <= buf_level(0);\r
+buf_1_data_out(17 downto 0)   <= buf_data(1);\r
+buf_1_data_out(29 downto 18)  <= buf_frame(1);\r
+buf_1_data_out(37 downto 30)  <= buf_level(1);\r
+buf_2_data_out(17 downto 0)   <= buf_data(2);\r
+buf_2_data_out(29 downto 18)  <= buf_frame(2);\r
+buf_2_data_out(37 downto 30)  <= buf_level(2);\r
+buf_3_data_out(17 downto 0)   <= buf_data(3);\r
+buf_3_data_out(29 downto 18)  <= buf_frame(3);\r
+buf_3_data_out(37 downto 30)  <= buf_level(3);\r
+buf_4_data_out(17 downto 0)   <= buf_data(4);\r
+buf_4_data_out(29 downto 18)  <= buf_frame(4);\r
+buf_4_data_out(37 downto 30)  <= buf_level(4);\r
+buf_5_data_out(17 downto 0)   <= buf_data(5);\r
+buf_5_data_out(29 downto 18)  <= buf_frame(5);\r
+buf_5_data_out(37 downto 30)  <= buf_level(5);\r
+buf_6_data_out(17 downto 0)   <= buf_data(6);\r
+buf_6_data_out(29 downto 18)  <= buf_frame(6);\r
+buf_6_data_out(37 downto 30)  <= buf_level(6);\r
+buf_7_data_out(17 downto 0)   <= buf_data(7);\r
+buf_7_data_out(29 downto 18)  <= buf_frame(7);\r
+buf_7_data_out(37 downto 30)  <= buf_level(7);\r
+buf_8_data_out(17 downto 0)   <= buf_data(8);\r
+buf_8_data_out(29 downto 18)  <= buf_frame(8);\r
+buf_8_data_out(37 downto 30)  <= buf_level(8);\r
+buf_9_data_out(17 downto 0)   <= buf_data(9);\r
+buf_9_data_out(29 downto 18)  <= buf_frame(9);\r
+buf_9_data_out(37 downto 30)  <= buf_level(9);\r
+buf_10_data_out(17 downto 0)  <= buf_data(10);\r
+buf_10_data_out(29 downto 18) <= buf_frame(10);\r
+buf_10_data_out(37 downto 30) <= buf_level(10);\r
+buf_11_data_out(17 downto 0)  <= buf_data(11);\r
+buf_11_data_out(29 downto 18) <= buf_frame(11);\r
+buf_11_data_out(37 downto 30) <= buf_level(11);\r
+buf_12_data_out(17 downto 0)  <= buf_data(12);\r
+buf_12_data_out(29 downto 18) <= buf_frame(12);\r
+buf_12_data_out(37 downto 30) <= buf_level(12);\r
+buf_13_data_out(17 downto 0)  <= buf_data(13);\r
+buf_13_data_out(29 downto 18) <= buf_frame(13);\r
+buf_13_data_out(37 downto 30) <= buf_level(13);\r
+buf_14_data_out(17 downto 0)  <= buf_data(14);\r
+buf_14_data_out(29 downto 18) <= buf_frame(14);\r
+buf_14_data_out(37 downto 30) <= buf_level(14);\r
+buf_15_data_out(17 downto 0)  <= buf_data(15);\r
+buf_15_data_out(29 downto 18) <= buf_frame(15);\r
+buf_15_data_out(37 downto 30) <= buf_level(15);\r
+\r
+---------------------------------------------------------------------------\r
+-- DEBUG signals\r
+---------------------------------------------------------------------------\r
+debug_out        <= debug;\r
+\r
+end behavioral;\r
+\r
+\r
+       \r
+\r
+\r
diff --git a/src/real_trg_handler.vhd b/src/real_trg_handler.vhd
new file mode 100755 (executable)
index 0000000..bb7ed5c
--- /dev/null
@@ -0,0 +1,544 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- Comment: better than the first version, but still a lot of optimization possible.\r
+\r
+-- (1) no more compare tags here. some steps in the FSM can be taken out.\r
+-- (2) no more rst_lvl1_counter signal anymore in the CCR. to be replaced!\r
+\r
+entity real_trg_handler is\r
+       port( CLK_IN                            : in    std_logic; -- 100MHz master clock\r
+                 RESET_IN                              : in    std_logic; \r
+                 TIME_TRG_IN                   : in    std_logic_vector(3 downto 0); -- timing trigger inputs\r
+                 TRB_TRG_IN                    : in    std_logic_vector(3 downto 0); -- TRB trigger inputs\r
+                 APV_TRGDONE_IN                : in    std_logic; -- APV trigger statemachine finished (one pulse)\r
+                 TRG_3_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 3\r
+                 TRG_2_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 2\r
+                 TRG_1_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 1\r
+                 TRG_0_TODO_IN                 : in    std_logic_vector(3 downto 0); -- APV triggers on trigger 0\r
+                 TRG_SETUP_IN                  : in    std_logic_vector(7 downto 0); -- setup of external triggers\r
+                 TRG_FOUND_OUT                 : out   std_logic; -- single pulse for endpoint\r
+                 -- TRB LVL1 channel signals\r
+                 TRB_TTAG_IN                   : in    std_logic_vector(15 downto 0); -- LVL1 16bit trigger tag \r
+                 TRB_TRND_IN                   : in    std_logic_vector(7 downto 0); -- LVL1 8bit random number \r
+                 TRB_TTYPE_IN                  : in    std_logic_vector(3 downto 0); -- LVL1 trigger type\r
+                 TRB_TRGRCVD_IN                : in    std_logic; -- LVL1 trigger has been received on TRB\r
+                 TRB_MISSING_OUT               : out   std_logic; -- LVL1 trigger without timing trigger\r
+                 RST_LVL1_COUNTER_IN   : in    std_logic; -- reset LVL1 counter\r
+                 LVL1_COUNTER_OUT              : out   std_logic_vector(15 downto 0);\r
+                 BUSY_RELEASE_IN               : in    std_logic; -- common signal from busy calculator\r
+                 -- \r
+                 APV_TRGSEL_OUT                : out   std_logic_vector(3 downto 0); -- select one APV trigger state machine\r
+                 APV_TRGSTART_OUT              : out   std_logic; -- start an APV trigger state machine\r
+                 EDS_DATA_OUT                  : out   std_logic_vector(39 downto 0); -- EDS data\r
+                 EDS_WE_OUT                    : out   std_logic; -- EDS write enable (general interface)\r
+                 EDS_START_OUT                 : out   std_logic; -- separate increment signal for EDS buffer level\r
+                 EDS_READY_OUT                 : out   std_logic; -- APV trigger sequence done\r
+                 DBG_FRMCTR_OUT                : out   std_logic_vector(3 downto 0); -- framecounter itself\r
+                 BSM_OUT                               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT                             : out   std_logic_vector(63 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of real_trg_handler is\r
+\r
+       -- state machine signals\r
+       type STATES is (SLEEP, STORE, START, COUNT, RELAX, CHECK, WAPV, WLVL1, TRBS, COMP, CTAG, STAG,\r
+                                       DTAG, WEDS, WDEL0, WDEL1, WBUSY, DONE, CNTEVT, BADTRG);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- normal signals\r
+       signal trg_comb                         : std_logic_vector(3 downto 0); -- TRB or hardware inputs\r
+       signal trg_q                            : std_logic_vector(3 downto 0);\r
+       signal trg_qq                           : std_logic_vector(3 downto 0);\r
+       signal trg_qqq                          : std_logic_vector(3 downto 0);\r
+       signal trg_qqqq                         : std_logic_vector(3 downto 0);\r
+       signal trg_edge                         : std_logic_vector(3 downto 0); \r
+       signal decoded_trg                      : std_logic_vector(3 downto 0);\r
+       signal todo_start                       : std_logic_vector(3 downto 0);\r
+       signal trg_found                        : std_logic;\r
+       signal trg_pattern                      : std_logic_vector(3 downto 0);\r
+\r
+       signal evtctr                           : std_logic_vector(15 downto 0); -- event counter\r
+       signal ce_evtctr                        : std_logic;\r
+       signal ce_evtctr_x                      : std_logic;\r
+       signal frmctr                           : std_logic_vector(3 downto 0); -- frame counter\r
+       signal ce_frmctr                        : std_logic;\r
+       signal ce_frmctr_x                      : std_logic;\r
+       signal todo_ctr                         : std_logic_vector(3 downto 0);\r
+       signal todo_done_x                      : std_logic;\r
+       signal todo_done                        : std_logic;\r
+       signal apv_trgstart_x           : std_logic;\r
+       signal apv_trgstart                     : std_logic;\r
+       signal eds_data                         : std_logic_vector(39 downto 0);\r
+       signal eds_start                        : std_logic;\r
+       signal eds_start_x                      : std_logic;\r
+       signal eds_we                           : std_logic;\r
+       signal eds_we_x                         : std_logic;\r
+       signal eds_ready_x                      : std_logic;  \r
+       signal eds_ready                        : std_logic; -- end signal, release busy by sending TERM and clean up misc stuff\r
+       signal apv_trg_finished         : std_logic;\r
+       signal accept_x                         : std_logic; -- we can accept a trigger\r
+       signal accept                           : std_logic; \r
+       signal missed_trg_x                     : std_logic;\r
+       signal missed_trg                       : std_logic;\r
+       signal missing_trg                      : std_logic;\r
+       signal rst_status_x                     : std_logic;\r
+       signal rst_status                       : std_logic;\r
+\r
+       signal time_trg                         : std_logic_vector(3 downto 0);\r
+\r
+       -- Information to be collected for the EDS\r
+       signal trb_ttag_reg                     : std_logic_vector(15 downto 0); -- TRB LVL1 trigger tag (16bit)\r
+       signal trb_trnd_reg                     : std_logic_vector(7 downto 0);  -- TRB LVL1 random byte (8bit)\r
+       signal trb_ttype_reg            : std_logic_vector(3 downto 0);  -- TRB LVL1 trigger type (4bit) \r
+       signal trg_pattern_reg          : std_logic_vector(3 downto 0);  -- timing trigger input pattern (4bit)\r
+       signal trg_dectrg_reg           : std_logic_vector(3 downto 0);  -- priority encoded timing trigger (4bit)\r
+       signal trg_frmctr_reg           : std_logic_vector(3 downto 0);  -- frame counter start value (4bit)\r
+       signal trg_frmnum_reg           : std_logic_vector(3 downto 0);  -- number of frames in this event (4bit)\r
+\r
+       signal store_local_x            : std_logic;\r
+       signal store_local                      : std_logic;\r
+       signal store_remote_x           : std_logic;\r
+       signal store_remote                     : std_logic;\r
+\r
+       signal time_trg_on                      : std_logic_vector(3 downto 0);\r
+       signal time_trg_inv                     : std_logic_vector(3 downto 0);\r
+       \r
+       signal bsm_x                : std_logic_vector(7 downto 0);\r
+\r
+begin\r
+\r
+-- Aliasing the control bits\r
+time_trg_on(3)  <= trg_setup_in(7);\r
+time_trg_inv(3) <= trg_setup_in(3);\r
+time_trg_on(2)  <= trg_setup_in(6);\r
+time_trg_inv(2) <= trg_setup_in(2);\r
+time_trg_on(1)  <= trg_setup_in(5);\r
+time_trg_inv(1) <= trg_setup_in(1);\r
+time_trg_on(0)  <= trg_setup_in(4);\r
+time_trg_inv(0) <= trg_setup_in(0);\r
+\r
+------------------------------------------------------------\r
+-- Synchronize the external trigger inputs\r
+THE_TIME_TRG_3_SYNC: state_sync\r
+port map( STATE_A_IN           => time_trg_in(3),\r
+                 CLK_B_IN                      => clk_in,\r
+                 RESET_B_IN            => reset_in,\r
+                 STATE_B_OUT           => time_trg(3)\r
+               );\r
+THE_TIME_TRG_2_SYNC: state_sync\r
+port map( STATE_A_IN           => time_trg_in(2),\r
+                 CLK_B_IN                      => clk_in,\r
+                 RESET_B_IN            => reset_in,\r
+                 STATE_B_OUT           => time_trg(2)\r
+               );\r
+THE_TIME_TRG_1_SYNC: state_sync\r
+port map( STATE_A_IN           => time_trg_in(1),\r
+                 CLK_B_IN                      => clk_in,\r
+                 RESET_B_IN            => reset_in,\r
+                 STATE_B_OUT           => time_trg(1)\r
+               );\r
+THE_TIME_TRG_0_SYNC: state_sync\r
+port map( STATE_A_IN           => time_trg_in(0),\r
+                 CLK_B_IN                      => clk_in,\r
+                 RESET_B_IN            => reset_in,\r
+                 STATE_B_OUT           => time_trg(0)\r
+               );\r
+------------------------------------------------------------\r
+\r
+-- For all four possible hardware triggers we combine hardware and TRB inputs\r
+-- TRB slow control trigger inputs are already synchronized to SYSCLK.\r
+--trg_comb <= time_trg or trb_trg_in;\r
+\r
+trg_comb(3) <= ((time_trg(3) xor time_trg_inv(3)) and time_trg_on(3)) or trb_trg_in(3);\r
+trg_comb(2) <= ((time_trg(2) xor time_trg_inv(2)) and time_trg_on(2)) or trb_trg_in(2);\r
+trg_comb(1) <= ((time_trg(1) xor time_trg_inv(1)) and time_trg_on(1)) or trb_trg_in(1);\r
+trg_comb(0) <= ((time_trg(0) xor time_trg_inv(0)) and time_trg_on(0)) or trb_trg_in(0);\r
+\r
+-- Now we shift the synced signals into shift registers with four FF in a row.\r
+-- This gives us a 16bit pattern in total to decide which trigger input was active.\r
+THE_TRG_LENGTH_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       trg_qqqq <= (others => '0');\r
+                       trg_qqq  <= (others => '0');\r
+                       trg_qq   <= (others => '0');\r
+                       trg_q    <= (others => '0');\r
+               else\r
+                       trg_qqqq <= trg_qqq;\r
+                       trg_qqq  <= trg_qq;\r
+                       trg_qq   <= trg_q;\r
+                       trg_q    <= trg_comb;\r
+               end if;\r
+       end if;\r
+end process THE_TRG_LENGTH_PROC;\r
+\r
+-- Check for rising edges in the signals, with a long steady state signal following.\r
+-- We accept only signals of three clock cycles minimum length (as sent by the TRB_TRG).\r
+THE_RISING_EDGES_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       trg_edge <= (others => '0');\r
+               else\r
+                       trg_edge(3) <= not trg_qqqq(3) and trg_qqq(3) and trg_qq(3) and trg_q(3);\r
+                       trg_edge(2) <= not trg_qqqq(2) and trg_qqq(2) and trg_qq(2) and trg_q(2);\r
+                       trg_edge(1) <= not trg_qqqq(1) and trg_qqq(1) and trg_qq(1) and trg_q(1);\r
+                       trg_edge(0) <= not trg_qqqq(0) and trg_qqq(0) and trg_qq(0) and trg_q(0);\r
+               end if;\r
+       end if;\r
+end process THE_RISING_EDGES_PROC;\r
+\r
+-- Now we are almost done. \r
+-- The detected edges are priorized.\r
+THE_TRG_PRIORITY_PROC: process( clk_in ) \r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       decoded_trg   <= (others => '0');\r
+                       todo_start    <= (others => '0');\r
+                       trg_found     <= '0';\r
+               else\r
+                       if( trg_edge(3) = '1' ) then\r
+                               decoded_trg <= "1000";\r
+                               todo_start  <= trg_3_todo_in;\r
+                               trg_found   <= '1';\r
+                       elsif( trg_edge(3 downto 2) = "01" ) then\r
+                               decoded_trg <= "0100";\r
+                               todo_start  <= trg_2_todo_in;\r
+                               trg_found   <= '1';\r
+                       elsif( trg_edge(3 downto 1) = "001" ) then\r
+                               decoded_trg <= "0010";\r
+                               todo_start  <= trg_1_todo_in;\r
+                               trg_found   <= '1';\r
+                       elsif( trg_edge(3 downto 0) = "0001" ) then\r
+                               decoded_trg <= "0001";\r
+                               todo_start  <= trg_0_todo_in;\r
+                               trg_found   <= '1';\r
+                       else\r
+                               decoded_trg <= "0000";\r
+                               todo_start  <= "0000";\r
+                               trg_found   <= '0';\r
+                       end if;\r
+               end if;\r
+       end if;\r
+end process THE_TRG_PRIORITY_PROC;\r
+\r
+-- We need to store some information for the EDS... from local counters\r
+-- NB: after one cycle this information set is reset to zero!\r
+--     needed for missing timing trigger handling.\r
+THE_LOCALSTORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (eds_we = '1') ) then\r
+                       trg_pattern_reg <= (others => '0');\r
+                       trg_frmctr_reg  <= (others => '0');\r
+                       trg_frmnum_reg  <= (others => '0');\r
+                       trg_dectrg_reg  <= (others => '0');\r
+               elsif( (accept = '1') and (trg_found = '1') ) then -- the clock cycle before local_store pulse\r
+                       trg_pattern_reg <= trg_pattern; -- BUGBUGBUG\r
+                       trg_frmctr_reg  <= frmctr;\r
+                       trg_frmnum_reg  <= todo_start;\r
+                       trg_dectrg_reg  <= decoded_trg;\r
+               end if;\r
+       end if;\r
+end process THE_LOCALSTORE_PROC;\r
+\r
+-- The ToDo counter: is loaded with the number of APV triggers, and counts down.\r
+THE_TODO_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       todo_ctr  <= (others => '0');\r
+               elsif( store_local = '1' ) then\r
+                       todo_ctr <= trg_frmnum_reg; --todo_start;\r
+               elsif( ce_frmctr = '1' ) then\r
+                       todo_ctr <= todo_ctr - 1;\r
+               end if;\r
+       end if;\r
+end process THE_TODO_COUNTER_PROC;\r
+todo_done_x <= '1' when (todo_ctr = x"0") else '0';\r
+\r
+-- We need to store some information for the EDS... from TRBnet LVL1 trigger endpoint\r
+THE_REMOTESTORE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       trb_ttag_reg  <= (others => '0');\r
+                       trb_trnd_reg  <= (others => '0');\r
+                       trb_ttype_reg <= (others => '0'); \r
+               elsif( store_remote = '1' ) then\r
+                       trb_ttag_reg  <= trb_ttag_in;\r
+                       trb_trnd_reg  <= trb_trnd_in;\r
+                       trb_ttype_reg <= trb_ttype_in;\r
+               end if;\r
+       end if;\r
+end process THE_REMOTESTORE_PROC;\r
+\r
+-------------------------------------------------\r
+-------------------------------------------------\r
+-------------------------------------------------\r
+\r
+THE_TRG_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       trg_pattern       <= (others => '0');\r
+                       todo_done         <= '0';\r
+               else\r
+                       trg_pattern       <= trg_edge;\r
+                       todo_done         <= todo_done_x;\r
+               end if;\r
+       end if;\r
+end process THE_TRG_SYNC_PROC;\r
+\r
+-- We store the end pulse from the APV trigger handler, as we need to wait for\r
+-- LVL1 in any case before we can take care of this signal.\r
+THE_TRGDONE_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       apv_trg_finished <= '0';\r
+               elsif( apv_trgdone_in = '1' ) then\r
+                       apv_trg_finished <= '1';\r
+               elsif( eds_ready = '1' ) then\r
+                       apv_trg_finished <= '0';\r
+               end if;\r
+       end if;\r
+end process THE_TRGDONE_PROC;\r
+\r
+-- A statemachine handles all actions for filling out the trigger information sheet\r
+-- state registers\r
+STATE_MEM: process( clk_in ) \r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE  <= SLEEP;\r
+                       ce_evtctr      <= '0';\r
+                       ce_frmctr      <= '0';\r
+                       eds_ready      <= '0';\r
+                       eds_we         <= '0';\r
+                       eds_start      <= '0';\r
+                       store_local    <= '0';\r
+                       store_remote   <= '0';\r
+                       apv_trgstart   <= '0';\r
+                       accept         <= '1';\r
+                       missed_trg     <= '0';\r
+                       rst_status     <= '0';\r
+               else\r
+                       CURRENT_STATE  <= NEXT_STATE;\r
+                       ce_evtctr      <= ce_evtctr_x;\r
+                       ce_frmctr      <= ce_frmctr_x;\r
+                       eds_ready      <= eds_ready_x;\r
+                       eds_we         <= eds_we_x;\r
+                       eds_start      <= eds_start_x;\r
+                       store_local    <= store_local_x;\r
+                       store_remote   <= store_remote_x;\r
+                       apv_trgstart   <= apv_trgstart_x;\r
+                       accept         <= accept_x;\r
+                       missed_trg     <= missed_trg_x;\r
+                       rst_status     <= rst_status_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- state transitions\r
+STATE_TRANSFORM: process( CURRENT_STATE, trg_found, todo_done, trb_trgrcvd_in, apv_trg_finished, busy_release_in, missing_trg )\r
+begin\r
+       NEXT_STATE     <= SLEEP; -- avoid latches\r
+       ce_evtctr_x    <= '0'; \r
+       ce_frmctr_x    <= '0';\r
+       eds_ready_x    <= '0';\r
+       eds_we_x       <= '0';\r
+       eds_start_x    <= '0';\r
+       store_local_x  <= '0';\r
+       store_remote_x <= '0';\r
+       apv_trgstart_x <= '0';\r
+       accept_x       <= '0';\r
+       missed_trg_x   <= '0';\r
+       rst_status_x   <= '0';\r
+       case CURRENT_STATE is\r
+               -- not good. if no timing trigger was received but a trb trigger arrives, we must do something!\r
+               when SLEEP      =>      if   ( trg_found = '1' ) then\r
+                                                       -- normal way: timing trigger found\r
+                                                       NEXT_STATE     <= STORE;\r
+                                                       store_local_x  <= '1';\r
+                                                       eds_start_x    <= '1';\r
+                                               elsif( (trg_found = '0') and (trb_trgrcvd_in = '1') ) then\r
+                                                       -- bad way: missing timing trigger\r
+                                                       NEXT_STATE     <= BADTRG;\r
+                                                       missed_trg_x   <= '1';\r
+                                               else\r
+                                                       NEXT_STATE     <= SLEEP;\r
+                                                       accept_x       <= '1';\r
+                                               end if;\r
+               when BADTRG     =>      NEXT_STATE     <= TRBS;\r
+                                               store_remote_x <= '1';\r
+               when STORE      =>      NEXT_STATE     <= START;\r
+                                               apv_trgstart_x <= '1';\r
+               when START      =>      NEXT_STATE <= CHECK;\r
+               when CHECK      =>      if( todo_done = '1' ) then\r
+                                                       NEXT_STATE <= WAPV;\r
+                                               else\r
+                                                       NEXT_STATE  <= COUNT;\r
+                                                       ce_frmctr_x <= '1';\r
+                                               end if;\r
+               when COUNT      =>      NEXT_STATE <= RELAX;\r
+               when RELAX      =>      NEXT_STATE <= CHECK;\r
+               when WAPV       =>      if( apv_trg_finished = '1' ) then\r
+                                                       NEXT_STATE <= WLVL1;\r
+                                               else\r
+                                                       NEXT_STATE <= WAPV;\r
+                                               end if;\r
+               when WLVL1      =>      if( trb_trgrcvd_in = '1' ) then\r
+                                                       NEXT_STATE     <= TRBS;\r
+                                                       store_remote_x <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WLVL1;\r
+                                               end if;\r
+               when TRBS       =>      NEXT_STATE  <= CTAG;\r
+               when CTAG       =>      NEXT_STATE  <= STAG;\r
+               when STAG       =>      NEXT_STATE  <= DTAG;\r
+               when DTAG       =>      if( missing_trg = '0' ) then\r
+                                                       -- everything is fine\r
+                                                       NEXT_STATE  <= WEDS;\r
+                                                       eds_we_x    <= '1';\r
+                                               else\r
+                                                       -- we missed a timing trigger, so no EDS was created\r
+                                                       NEXT_STATE  <= CNTEVT;\r
+                                                       ce_evtctr_x <= '1';\r
+                                               end if;\r
+               when WEDS       =>      NEXT_STATE  <= CNTEVT;\r
+                                               ce_evtctr_x <= '1';\r
+               when CNTEVT     =>      NEXT_STATE      <= WDEL0;\r
+               when WDEL0      =>      NEXT_STATE  <= WDEL1;\r
+               when WDEL1      =>      NEXT_STATE  <= WBUSY;\r
+               when WBUSY      =>      if( busy_release_in = '1' ) then\r
+                                                       NEXT_STATE  <= DONE;\r
+                                                       eds_ready_x <= '1';\r
+                                               else\r
+                                                       NEXT_STATE <= WBUSY;\r
+                                               end if;\r
+               when DONE       =>      if( trb_trgrcvd_in = '0' ) then -- mind the state synchronizer delay!!!\r
+                                                       NEXT_STATE   <= SLEEP;\r
+                                                       accept_x     <= '1';\r
+                                                       rst_status_x <= '1';\r
+                                               else\r
+                                                       NEXT_STATE   <= DONE;\r
+                                               end if;\r
+               when others     =>      NEXT_STATE   <= SLEEP;\r
+                                               accept_x     <= '1';\r
+       end case;\r
+end process STATE_TRANSFORM;\r
+\r
+-- state decoding\r
+STATE_DECODE: process( CURRENT_STATE )\r
+begin\r
+       case CURRENT_STATE is\r
+               when SLEEP      =>      bsm_x <= x"00";\r
+               when STORE      =>      bsm_x <= x"01"; \r
+               when START      =>      bsm_x <= x"02";\r
+               when CHECK      =>      bsm_x <= x"03";\r
+               when COUNT      =>      bsm_x <= x"04";\r
+               when RELAX      =>      bsm_x <= x"14";\r
+               when WAPV       =>      bsm_x <= x"05";\r
+               when WLVL1      =>      bsm_x <= x"06";\r
+               when TRBS       =>      bsm_x <= x"07";\r
+               when CTAG       =>      bsm_x <= x"08";\r
+               when STAG       =>      bsm_x <= x"09";\r
+               when DTAG       =>      bsm_x <= x"0a";\r
+               when WEDS       =>      bsm_x <= x"0b";\r
+               when WDEL0      =>      bsm_x <= x"0c";\r
+               when WDEL1      =>      bsm_x <= x"0d";\r
+               when WBUSY      =>      bsm_x <= x"0e";\r
+               when DONE       =>      bsm_x <= x"0f";\r
+               when CNTEVT     =>      bsm_x <= x"10";\r
+               when BADTRG     =>      bsm_x <= x"11";\r
+               when others     =>      bsm_x <= x"ff";\r
+       end case;\r
+end process STATE_DECODE;\r
+\r
+\r
+-- The event counter: is incremented with each accepted trigger\r
+THE_EVENT_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (rst_lvl1_counter_in = '1') ) then\r
+                       evtctr <= (others => '0');\r
+               elsif( ce_evtctr = '1' ) then\r
+                       evtctr <= evtctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_EVENT_COUNTER_PROC;\r
+\r
+-- The frame counter: is incremented with each 1-0-0 trigger sent to APV\r
+THE_FRAME_COUNTER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       frmctr <= (others => '0');\r
+               elsif( ce_frmctr = '1' ) then\r
+                       frmctr <= frmctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_FRAME_COUNTER_PROC;\r
+\r
+-- If a timing trigger was missing, we simply ignore this LVL1 trigger\r
+THE_MISSED_TRG_REG: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( (reset_in = '1') or (rst_status = '1') ) then\r
+                       missing_trg <= '0';\r
+               elsif( missed_trg = '1' ) then\r
+                       missing_trg <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_MISSED_TRG_REG;\r
+\r
+-- EDS bits:\r
+eds_data(39 downto 36) <= trg_frmctr_reg;\r
+eds_data(35 downto 32) <= trg_frmnum_reg;\r
+eds_data(31 downto 16) <= trb_ttag_reg;\r
+eds_data(15 downto 8)  <= trb_trnd_reg;\r
+eds_data(7 downto 4)   <= trb_ttype_reg;\r
+eds_data(3 downto 0)   <= trg_pattern_reg;\r
+\r
+-- output signals\r
+apv_trgstart_out  <= apv_trgstart;\r
+apv_trgsel_out    <= trg_dectrg_reg;\r
+\r
+eds_data_out      <= eds_data;\r
+eds_start_out     <= eds_start;\r
+eds_we_out        <= eds_we;\r
+eds_ready_out     <= eds_ready;\r
+trb_missing_out   <= missing_trg;\r
+lvl1_counter_out  <= evtctr;\r
+trg_found_out     <= trg_found;\r
+\r
+-- Debug signals\r
+bsm_out           <= bsm_x;\r
+\r
+debug_out(63 downto 32) <= (others => '0');\r
+debug_out(31 downto 24) <= evtctr(7 downto 0);\r
+debug_out(23 downto 16) <= trb_ttag_reg(7 downto 0);\r
+debug_out(15)           <= ce_evtctr;\r
+debug_out(14)           <= '0';\r
+debug_out(13)           <= missing_trg;\r
+debug_out(12)           <= accept;\r
+debug_out(11)           <= '0';\r
+debug_out(10)           <= '0';\r
+debug_out(9)            <= trb_trgrcvd_in;\r
+debug_out(8)            <= trg_found;\r
+debug_out(7 downto 0)   <= bsm_x;\r
+\r
+dbg_frmctr_out    <= frmctr;\r
+\r
+end behavioral;\r
+\r
diff --git a/src/reboot_handler.vhd b/src/reboot_handler.vhd
new file mode 100644 (file)
index 0000000..bfb7059
--- /dev/null
@@ -0,0 +1,61 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity reboot_handler is\r
+       port( RESET_IN                  : in    std_logic;\r
+                 CLK_IN                        : in    std_logic;\r
+                 START_IN                      : in    std_logic;\r
+                 REBOOT_OUT            : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of reboot_handler is\r
+\r
+       -- normal signals                          \r
+       signal reboot_counter   : std_logic_vector(15 downto 0);\r
+       signal reboot_ce                : std_logic;\r
+       signal reboot_x                 : std_logic;\r
+       signal reboot                   : std_logic;\r
+       \r
+begin                                          \r
+\r
+-- Latch the start pulse\r
+THE_START_PULSE: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reboot_ce <= '0';\r
+               elsif( start_in = '1' ) then\r
+                       reboot_ce <= '1';\r
+               end if;\r
+       end if;\r
+end process THE_START_PULSE;\r
+\r
+-- Reboot counter\r
+THE_REBOOT_COUNTER: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reboot_counter <= (others => '0');\r
+                       reboot         <= '0';\r
+               elsif( reboot_ce = '1' ) then\r
+                       reboot_counter <= reboot_counter + 1;\r
+               end if;\r
+               reboot <= reboot_x;\r
+       end if;\r
+end process THE_REBOOT_COUNTER;\r
+\r
+reboot_x <= reboot_counter(15) and reboot_counter(14) and reboot_counter(13);\r
+\r
+-- output signals\r
+reboot_out <= reboot;\r
+\r
+debug_out(15 downto 0)  <= reboot_counter;  \r
+\r
+end behavioral;                                \r
diff --git a/src/ref_row_sel.vhd b/src/ref_row_sel.vhd
new file mode 100755 (executable)
index 0000000..3cf165d
--- /dev/null
@@ -0,0 +1,252 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+-- This module takes ROW and ERROR information from all sixteen raw buffers, and \r
+-- checks if the APVs with "good data" buffers are OK.\r
+-- APV frame errors are sensed, as well as APV row errors.\r
+-- The row error recognition is based somehow on the old RICH RC logic, as it takes\r
+-- one APV as reference row by prioritiy encoding, and checks all other APVs against\r
+-- this reference row.\r
+\r
+entity ref_row_sel is\r
+       port( CLK_IN                            : in    std_logic;\r
+                 READY_IN                              : in    std_logic_vector(15 downto 0); -- buffer ready signals (data or timeout)\r
+                 GOODDATA_IN                   : in    std_logic_vector(15 downto 0); -- buffer data good signals\r
+                 FRAME_0_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_1_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_2_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_3_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_4_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_5_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_6_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_7_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_8_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_9_IN                    : in    std_logic_vector(11 downto 0);\r
+                 FRAME_10_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_11_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_12_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_13_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_14_IN                   : in    std_logic_vector(11 downto 0);\r
+                 FRAME_15_IN                   : in    std_logic_vector(11 downto 0);\r
+                 READY_OUT                             : out   std_logic; -- all buffers reported being ready for data transport\r
+                 VALID_BUFS_OUT                : out   std_logic; -- at least one APV raw buffer has data to fetch \r
+                 ROW_ERROR_OUT                 : out   std_logic; -- at least one row number is wrong\r
+                 APV_ERROR_OUT                 : out   std_logic; -- at least one APV sent ERROR bit\r
+                 APV_ERROR_BITS_OUT    : out   std_logic_vector(15 downto 0);\r
+                 REF_ROW_OUT                   : out   std_logic_vector(7 downto 0); -- selected reference row\r
+                 DBG_OUT                               : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of ref_row_sel is\r
+\r
+       -- normal signals\r
+       signal debug_x                          : std_logic_vector(15 downto 0);\r
+                                       \r
+       signal next_sel_ref_row         : std_logic_vector(3 downto 0);\r
+       signal sel_ref_row                      : std_logic_vector(3 downto 0);\r
+       signal next_valid_bufs          : std_logic;\r
+       signal valid_bufs                       : std_logic;\r
+       signal next_all_ready           : std_logic;\r
+       signal all_ready                        : std_logic;\r
+                                       \r
+       signal ref_row                          : std_logic_vector(7 downto 0); -- selected reference row number\r
+                                       \r
+       signal next_row_match           : std_logic_vector(15 downto 0);\r
+       signal row_match                        : std_logic_vector(15 downto 0); -- APV frame row matches reference number\r
+                               \r
+       signal next_apv_error           : std_logic_vector(15 downto 0);\r
+       signal apv_error                        : std_logic_vector(15 downto 0); -- APV frame error is set\r
+       \r
+       signal next_frame_row_err       : std_logic;\r
+       signal frame_row_err            : std_logic;\r
+       signal next_frame_apv_err       : std_logic;\r
+       signal frame_apv_err            : std_logic;\r
+\r
+       \r
+begin\r
+\r
+-- Sync process\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               sel_ref_row    <= next_sel_ref_row;\r
+               valid_bufs     <= next_valid_bufs;\r
+               apv_error      <= next_apv_error;\r
+               row_match      <= next_row_match;\r
+               frame_row_err  <= next_frame_row_err;\r
+               frame_apv_err  <= next_frame_apv_err;\r
+               all_ready      <= next_all_ready;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+-- All channels ready?\r
+next_all_ready  <= '1' when ( ready_in = x"ffff" ) else '0';\r
+\r
+-- If no gooddata channel is available then we have no reference row\r
+next_valid_bufs <= '1' when ( gooddata_in /= x"0000" ) else '0';\r
+\r
+-- Do a priority encoding to select the reference row\r
+THE_PRI_ENCODER_PROC: process( gooddata_in )\r
+begin\r
+       if   ( gooddata_in(15 downto 15) = "1" ) then\r
+               next_sel_ref_row <= "1111";\r
+       elsif( gooddata_in(15 downto 14) = "01" ) then\r
+               next_sel_ref_row <= "1110";\r
+       elsif( gooddata_in(15 downto 13) = "001" ) then\r
+               next_sel_ref_row <= "1101";\r
+       elsif( gooddata_in(15 downto 12) = "0001" ) then\r
+               next_sel_ref_row <= "1100";\r
+       elsif( gooddata_in(15 downto 11) = "00001" ) then\r
+               next_sel_ref_row <= "1011";\r
+       elsif( gooddata_in(15 downto 10) = "000001" ) then\r
+               next_sel_ref_row <= "1010";\r
+       elsif( gooddata_in(15 downto 9)  = "0000001" ) then\r
+               next_sel_ref_row <= "1001";\r
+       elsif( gooddata_in(15 downto 8)  = "00000001" ) then\r
+               next_sel_ref_row <= "1000";\r
+       elsif( gooddata_in(15 downto 7)  = "000000001" ) then\r
+               next_sel_ref_row <= "0111";\r
+       elsif( gooddata_in(15 downto 6)  = "0000000001" ) then\r
+               next_sel_ref_row <= "0110";\r
+       elsif( gooddata_in(15 downto 5)  = "00000000001" ) then\r
+               next_sel_ref_row <= "0101";\r
+       elsif( gooddata_in(15 downto 4)  = "000000000001" ) then\r
+               next_sel_ref_row <= "0100";\r
+       elsif( gooddata_in(15 downto 3)  = "0000000000001" ) then\r
+               next_sel_ref_row <= "0011";\r
+       elsif( gooddata_in(15 downto 2)  = "00000000000001" ) then\r
+               next_sel_ref_row <= "0010";\r
+       elsif( gooddata_in(15 downto 1)  = "000000000000001" ) then\r
+               next_sel_ref_row <= "0001";\r
+       elsif( gooddata_in(15 downto 0)  = "0000000000000001" ) then\r
+               next_sel_ref_row <= "0000";\r
+       else\r
+               next_sel_ref_row <= "0000";\r
+       end if;\r
+end process THE_PRI_ENCODER_PROC;\r
+\r
+-- Select one reference row, and store it\r
+THE_REF_ROW_SELECT_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case sel_ref_row is\r
+                       when "0000"     =>      ref_row <= frame_0_in(7 downto 0);\r
+                       when "0001"     =>      ref_row <= frame_1_in(7 downto 0);\r
+                       when "0010"     =>      ref_row <= frame_2_in(7 downto 0);\r
+                       when "0011"     =>      ref_row <= frame_3_in(7 downto 0);\r
+                       when "0100"     =>      ref_row <= frame_4_in(7 downto 0);\r
+                       when "0101"     =>      ref_row <= frame_5_in(7 downto 0);\r
+                       when "0110"     =>      ref_row <= frame_6_in(7 downto 0);\r
+                       when "0111"     =>      ref_row <= frame_7_in(7 downto 0);\r
+                       when "1000"     =>      ref_row <= frame_8_in(7 downto 0);\r
+                       when "1001"     =>      ref_row <= frame_9_in(7 downto 0);\r
+                       when "1010"     =>      ref_row <= frame_10_in(7 downto 0);\r
+                       when "1011"     =>      ref_row <= frame_11_in(7 downto 0);\r
+                       when "1100"     =>      ref_row <= frame_12_in(7 downto 0);\r
+                       when "1101"     =>      ref_row <= frame_13_in(7 downto 0);\r
+                       when "1110"     =>      ref_row <= frame_14_in(7 downto 0);\r
+                       when "1111"     =>      ref_row <= frame_15_in(7 downto 0);\r
+                       when others     =>      ref_row <= x"ee"; -- will not be used... all cases are covered.\r
+               end case;\r
+       end if;\r
+end process THE_REF_ROW_SELECT_PROC;\r
+\r
+-- Check all rows against the reference\r
+-- Only channels with GOODDATA are to be taken into account; if the channel is invalid, we ignore it.\r
+\r
+next_row_match(0)  <= '1' when (  (gooddata_in(0) = '0') or\r
+                                                                ((gooddata_in(0) = '1') and (frame_0_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(1)  <= '1' when (  (gooddata_in(1) = '0') or\r
+                                                                ((gooddata_in(1) = '1') and (frame_1_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(2)  <= '1' when (  (gooddata_in(2) = '0') or\r
+                                                                ((gooddata_in(2) = '1') and (frame_2_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(3)  <= '1' when (  (gooddata_in(3) = '0') or\r
+                                                                ((gooddata_in(3) = '1') and (frame_3_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(4)  <= '1' when (  (gooddata_in(4) = '0') or\r
+                                                                ((gooddata_in(4) = '1') and (frame_4_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(5)  <= '1' when (  (gooddata_in(5) = '0') or\r
+                                                                ((gooddata_in(5) = '1') and (frame_5_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(6)  <= '1' when (  (gooddata_in(6) = '0') or\r
+                                                                ((gooddata_in(6) = '1') and (frame_6_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(7)  <= '1' when (  (gooddata_in(7) = '0') or\r
+                                                                ((gooddata_in(7) = '1') and (frame_7_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(8)  <= '1' when (  (gooddata_in(8) = '0') or\r
+                                                                ((gooddata_in(8) = '1') and (frame_8_in(7 downto 0) = ref_row) ) ) \r
+                                                else '0';\r
+next_row_match(9)  <= '1' when (  (gooddata_in(9) = '0') or\r
+                                                                ((gooddata_in(9) = '1') and (frame_9_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(10) <= '1' when (  (gooddata_in(10) = '0') or\r
+                                                                ((gooddata_in(10) = '1') and (frame_10_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(11) <= '1' when (  (gooddata_in(11) = '0') or\r
+                                                                ((gooddata_in(11) = '1') and (frame_11_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(12) <= '1' when (  (gooddata_in(12) = '0') or\r
+                                                                ((gooddata_in(12) = '1') and (frame_12_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(13) <= '1' when (  (gooddata_in(13) = '0') or\r
+                                                                ((gooddata_in(13) = '1') and (frame_13_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(14) <= '1' when (  (gooddata_in(14) = '0') or\r
+                                                                ((gooddata_in(14) = '1') and (frame_14_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+next_row_match(15) <= '1' when (  (gooddata_in(15) = '0') or\r
+                                                                ((gooddata_in(15) = '1') and (frame_15_in(7 downto 0) = ref_row) ) ) \r
+                                                 else '0';\r
+\r
+-- APV error recognition - same issue.\r
+next_apv_error(0)  <= '1' when ( (gooddata_in(0) = '1')  and (frame_0_in(8) = '1') )  else '0';\r
+next_apv_error(1)  <= '1' when ( (gooddata_in(1) = '1')  and (frame_1_in(8) = '1') )  else '0';\r
+next_apv_error(2)  <= '1' when ( (gooddata_in(2) = '1')  and (frame_2_in(8) = '1') )  else '0';\r
+next_apv_error(3)  <= '1' when ( (gooddata_in(3) = '1')  and (frame_3_in(8) = '1') )  else '0';\r
+next_apv_error(4)  <= '1' when ( (gooddata_in(4) = '1')  and (frame_4_in(8) = '1') )  else '0';\r
+next_apv_error(5)  <= '1' when ( (gooddata_in(5) = '1')  and (frame_5_in(8) = '1') )  else '0';\r
+next_apv_error(6)  <= '1' when ( (gooddata_in(6) = '1')  and (frame_6_in(8) = '1') )  else '0';\r
+next_apv_error(7)  <= '1' when ( (gooddata_in(7) = '1')  and (frame_7_in(8) = '1') )  else '0';\r
+next_apv_error(8)  <= '1' when ( (gooddata_in(8) = '1')  and (frame_8_in(8) = '1') )  else '0';\r
+next_apv_error(9)  <= '1' when ( (gooddata_in(9) = '1')  and (frame_9_in(8) = '1') )  else '0';\r
+next_apv_error(10) <= '1' when ( (gooddata_in(10) = '1') and (frame_10_in(8) = '1') ) else '0';\r
+next_apv_error(11) <= '1' when ( (gooddata_in(11) = '1') and (frame_11_in(8) = '1') ) else '0';\r
+next_apv_error(12) <= '1' when ( (gooddata_in(12) = '1') and (frame_12_in(8) = '1') ) else '0';\r
+next_apv_error(13) <= '1' when ( (gooddata_in(13) = '1') and (frame_13_in(8) = '1') ) else '0';\r
+next_apv_error(14) <= '1' when ( (gooddata_in(14) = '1') and (frame_14_in(8) = '1') ) else '0';\r
+next_apv_error(15) <= '1' when ( (gooddata_in(15) = '1') and (frame_15_in(8) = '1') ) else '0';\r
+\r
+-- Now we must "condense" the information\r
+next_frame_row_err <= '1' when ( row_match /= x"ffff" ) else '0';\r
+next_frame_apv_err <= '1' when ( apv_error /= x"0000" ) else '0';\r
+\r
+-- output signals\r
+valid_bufs_out     <= valid_bufs; \r
+ready_out          <= all_ready;\r
+row_error_out      <= frame_row_err;\r
+apv_error_out      <= frame_apv_err;\r
+ref_row_out        <= ref_row;\r
+apv_error_bits_out <= apv_error;\r
+\r
+-- debug signals\r
+debug_x(15)           <= '0';\r
+debug_x(14)           <= frame_apv_err;\r
+debug_x(13)           <= frame_row_err;\r
+debug_x(12)           <= valid_bufs;\r
+debug_x(11 downto 8)  <= sel_ref_row;\r
+debug_x(7 downto 0)   <= ref_row;\r
+\r
+dbg_out       <= debug_x;\r
+\r
+end behavioral;\r
diff --git a/src/replacement.vhd b/src/replacement.vhd
new file mode 100755 (executable)
index 0000000..cd899dd
--- /dev/null
@@ -0,0 +1,244 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+\r
+entity replacement is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(9 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         ADC_SEL_OUT   : out   std_logic_vector(2 downto 0);   -- selects the ADC channel to snoop from\r
+         ADC_CLK_IN    : in    std_logic;                                              -- ADC reconstructed clock\r
+         ADC_DATA_IN   : in    std_logic_vector(11 downto 0);  -- ADC selected channel data\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of replacement is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SLEEP,RD_RDY,RD_DEL0,RD_DEL1,WR_DEL0,WR_DEL1,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal arm_x                    : std_logic;\r
+       signal trg_x                    : std_logic;\r
+\r
+       signal ctrl_reg                 : std_logic_vector(15 downto 0);\r
+       signal status_reg               : std_logic_vector(31 downto 0);\r
+\r
+       signal rd_data                  : std_logic_vector(15 downto 0);\r
+\r
+       -- 40MHz clock domain!!!\r
+       signal wr_data                  : std_logic_vector(15 downto 0);\r
+       signal wr_addr                  : std_logic_vector(9 downto 0);\r
+       signal wr_we                    : std_logic;\r
+       signal reset_40mhz              : std_logic;\r
+       signal arm_40mhz                : std_logic;\r
+       signal trg_40mhz                : std_logic;\r
+\r
+       signal sm_clear                 : std_logic;\r
+       signal sm_run                   : std_logic;\r
+       signal sm_sample                : std_logic;\r
+       signal sm_ready                 : std_logic;\r
+       signal sm_last                  : std_logic;\r
+       signal sm_bsm                   : std_logic_vector(3 downto 0);\r
+       \r
+begin\r
+\r
+-- Fake\r
+stat(31 downto 25) <= (others => '0');\r
+stat(24)           <= sm_last;\r
+stat(23)           <= sm_ready;\r
+stat(22)           <= sm_sample;\r
+stat(21)           <= sm_run;\r
+stat(20)           <= sm_clear;\r
+stat(19 downto 16) <= sm_bsm;\r
+stat(15 downto 0)  <= ctrl_reg;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_DEL0;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_DEL0;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_DEL0    =>      NEXT_STATE <= RD_DEL1;\r
+               when RD_DEL1    =>      NEXT_STATE <= RD_RDY;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_DEL0    =>      NEXT_STATE <= WR_DEL1;\r
+               when WR_DEL1    =>      NEXT_STATE <= WR_RDY;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+THE_RST_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset_40mhz\r
+               );\r
+\r
+arm_x <= slv_data_in(30) and store_wr;\r
+\r
+THE_ARM_PULSE_SYNC: pulse_sync\r
+port map( CLK_A_IN                     => clk_in,\r
+                 RESET_A_IN            => reset_in,\r
+                 PULSE_A_IN            => arm_x,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset_40mhz,\r
+                 PULSE_B_OUT           => arm_40mhz\r
+               );\r
+\r
+trg_x <= slv_data_in(31) and store_wr;\r
+\r
+THE_TRG_PULSE_SYNC: pulse_sync\r
+port map( CLK_A_IN                     => clk_in,\r
+                 RESET_A_IN            => reset_in,\r
+                 PULSE_A_IN            => trg_x,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset_40mhz,\r
+                 PULSE_B_OUT           => trg_40mhz\r
+               );\r
+\r
+THE_LOGIC_ANALYZER: logic_analyzer\r
+port map( CLK_IN               => adc_clk_in,\r
+                 RESET_IN              => reset_40mhz,\r
+                 -- control signals\r
+                 ARM_IN                => arm_40mhz, -- BUGBUGBUG\r
+                 TRG_IN                => trg_40mhz, -- BUGBUGBUG\r
+                 MAX_SAMPLE_IN => ctrl_reg(9 downto 0),\r
+                 -- status signals\r
+                 SM_ADDR_OUT   => wr_addr,\r
+                 SM_CE_OUT             => open,\r
+                 SM_WE_OUT             => wr_we,\r
+                 CLEAR_OUT             => sm_clear,\r
+                 RUN_OUT               => sm_run,\r
+                 SAMPLE_OUT    => sm_sample,\r
+                 READY_OUT             => sm_ready,\r
+                 LAST_OUT              => sm_last,\r
+                 -- Status lines\r
+                 BSM_OUT               => sm_bsm,\r
+                 STAT                  => open\r
+               );\r
+\r
+wr_data(15) <= sm_clear;\r
+wr_data(14) <= sm_run;\r
+wr_data(13) <= sm_sample;\r
+wr_data(12) <= sm_last;\r
+wr_data(11 downto 0) <= adc_data_in;\r
+\r
+THE_ADC0_SNOOP_MEM: adc_snoop_mem\r
+port map( WRADDRESS            => wr_addr,\r
+                 DATA                  => wr_data,\r
+                 WE                    => wr_we,\r
+                 WRCLOCK               => adc_clk_in,\r
+                 WRCLOCKEN             => '1',\r
+                 RDADDRESS             => slv_addr_in, \r
+                 RDCLOCK               => clk_in,\r
+                 RDCLOCKEN             => '1',\r
+                 RESET                 => reset_in,\r
+                 Q                             => rd_data\r
+               );\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       ctrl_reg <= (others => '0');\r
+               elsif( store_wr = '1' ) then\r
+                       ctrl_reg <= slv_data_in(15 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       status_reg <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       status_reg <= b"0000_00" & wr_addr & rd_data;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= status_reg;\r
+\r
+adc_sel_out  <= ctrl_reg(14 downto 12);\r
+\r
+end Behavioral;\r
diff --git a/src/reset_handler.vhd b/src/reset_handler.vhd
new file mode 100644 (file)
index 0000000..8cc8bc5
--- /dev/null
@@ -0,0 +1,75 @@
+library ieee; \r
+use ieee.std_logic_1164.all; \r
+use ieee.std_logic_arith.all; \r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity reset_handler is\r
+       port( CLEAR_IN                  : in    std_logic; -- async reset from outside, if available (otherwise '0')\r
+                 RESET_IN                      : in    std_logic; -- for testing, if not needed, set to '0'\r
+                 CLK_IN                        : in    std_logic;\r
+                 TRB_RESET_IN          : in    std_logic;\r
+                 RESET_OUT                     : out   std_logic;\r
+                 DEBUG_OUT                     : out   std_logic_vector(15 downto 0)\r
+               );\r
+end;\r
+\r
+architecture behavioral of reset_handler is\r
+\r
+-- normal signals\r
+       signal async_sampler    : std_logic_vector(7 downto 0);\r
+       signal async_pulse_x    : std_logic;\r
+       signal async_pulse              : std_logic;\r
+       signal reset_cnt                : std_logic_vector(15 downto 0);\r
+       signal debug                    : std_logic_vector(15 downto 0);\r
+       signal reset                    : std_logic;\r
+\r
+       attribute syn_preserve : boolean;\r
+       attribute syn_preserve of async_sampler : signal  is true;\r
+       attribute syn_preserve of async_pulse : signal  is true;\r
+       attribute syn_preserve of reset : signal  is true;\r
+       attribute syn_preserve of reset_cnt : signal  is true;\r
+               \r
+begin                                          \r
+\r
+-- sample the async reset line and react only on a long pulse\r
+THE_ASYNC_SAMPLER_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               async_sampler(7 downto 0) <= async_sampler(6 downto 0) & clear_in;\r
+               async_pulse               <= async_pulse_x;\r
+       end if;\r
+end process THE_ASYNC_SAMPLER_PROC;\r
+\r
+async_pulse_x <= '1' when ( async_sampler = x"ff" ) else '0';\r
+\r
+-- one global reset counter\r
+THE_GLOBAL_RESET_PROC: process( clk_in )\r
+begin\r
+    if( rising_edge(clk_in) ) then\r
+       if( (async_pulse = '1') or (reset_in = '1') or (trb_reset_in = '1') ) then\r
+               reset_cnt <= (others => '0');\r
+               reset     <= '1';\r
+       else\r
+               reset_cnt <= reset_cnt + 1;\r
+               reset     <= '1';\r
+               if( reset_cnt = x"001F" ) then\r
+                   reset     <= '0';\r
+                   reset_cnt <= x"001F";\r
+                       end if;\r
+               end if;\r
+    end if;\r
+end process THE_GLOBAL_RESET_PROC;\r
+\r
+\r
+-- Debug signals\r
+debug <= reset_cnt;\r
+\r
+-- Output signals\r
+debug_out <= debug;\r
+reset_out <= reset;\r
+                                               \r
+end behavioral;                                \r
+                                              
\ No newline at end of file
diff --git a/src/rich_trb.vhd b/src/rich_trb.vhd
new file mode 100755 (executable)
index 0000000..c21020e
--- /dev/null
@@ -0,0 +1,305 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use IEEE.numeric_std.ALL;
+use IEEE.std_logic_UNSIGNED.ALL;
+
+library work;
+use work.version.all;
+use work.trb_net_std.all;
+use work.trb_net_components.all;
+use work.adcmv3_components.all;
+
+entity rich_trb is
+port( CLK100M_IN                : in    std_logic; -- SerDes exclusive clock
+         SYSCLK_IN                                     : in    std_logic; -- fabric clock
+         RESET_IN                                      : in    std_logic; -- synchronous reset
+      -- SFP connections
+      SD_RXD_P_IN               : in    std_logic;
+      SD_RXD_N_IN               : in    std_logic;
+      SD_TXD_P_OUT              : out   std_logic;
+      SD_TXD_N_OUT              : out   std_logic;
+      SD_PRESENT_IN             : in    std_logic;
+      SD_TXDIS_OUT              : out   std_logic;
+      SD_LOS_IN                 : in    std_logic;
+      ONEWIRE_INOUT             : inout std_logic;
+         -- common regIO status / control registers
+      COMMON_STAT_REG_IN               : in    std_logic_vector(std_COMSTATREG*c_REGIO_REGISTER_WIDTH-1 downto 0); -- common status register, bit definitions like in WIKI
+      COMMON_CTRL_REG_OUT              : out   std_logic_vector(std_COMCTRLREG*c_REGIO_REGISTER_WIDTH-1 downto 0); -- common control register, bit definitions like in WIKI
+      -- status register input to regIO / control register output from regIO
+      CONTROL_OUT                              : out   std_logic_vector(63 downto 0);
+      STATUS_IN                 : in    std_logic_vector(127 downto 0); 
+      -- LVL1 signals
+      LVL1_TRG_TYPE_OUT         : out   std_logic_vector(3 downto 0);
+      LVL1_TRG_RECEIVED_OUT     : out   std_logic;
+      LVL1_TRG_NUMBER_OUT       : out   std_logic_vector(15 downto 0);
+      LVL1_TRG_CODE_OUT         : out   std_logic_vector(7 downto 0);
+      LVL1_TRG_INFORMATION_OUT  : out   std_logic_vector(23 downto 0);
+      LVL1_ERROR_PATTERN_IN     : in    std_logic_vector(31 downto 0);
+      LVL1_TRG_RELEASE_IN       : in    std_logic;
+      TIMING_TRG_FOUND_IN              : in    std_logic;
+         -- IPU data channel signals (yes, we will use ComputeNodes (tm) (R) (C) one day... :-)
+         IPU_NUMBER_OUT                        : out   std_logic_vector(15 downto 0); -- trigger tag
+         IPU_INFORMATION_OUT           : out   std_logic_vector(7 downto 0); -- trigger information
+         IPU_START_READOUT_OUT         : out   std_logic; -- gimme data!
+         IPU_DATA_IN                           : in    std_logic_vector(31 downto 0); -- detector data, equipped with DHDR
+         IPU_DATAREADY_IN                      : in    std_logic; -- data is valid
+         IPU_READOUT_FINISHED_IN       : in    std_logic; -- no more data, end transfer, send TRM
+         IPU_READ_OUT                          : out   std_logic; -- read strobe, low every second cycle 
+         IPU_LENGTH_IN                         : in    std_logic_vector(15 downto 0); -- length of data packet (32bit words) (?)
+         IPU_ERROR_PATTERN_IN          : in    std_logic_vector(31 downto 0); -- error pattern
+      -- regIO bus
+      REGIO_ADDR_OUT            : out   std_logic_vector(c_REGIO_ADDRESS_WIDTH-1 downto 0);
+      REGIO_READ_ENABLE_OUT     : out   std_logic;
+      REGIO_WRITE_ENABLE_OUT    : out   std_logic;
+      REGIO_DATA_OUT            : out   std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);
+      REGIO_DATA_IN             : in    std_logic_vector(c_REGIO_REGISTER_WIDTH-1 downto 0);
+      REGIO_DATAREADY_IN        : in    std_logic;
+      REGIO_NO_MORE_DATA_IN     : in    std_logic;
+      REGIO_WRITE_ACK_IN        : in    std_logic;
+      REGIO_UNKNOWN_ADDR_IN     : in    std_logic;
+      REGIO_TIMEOUT_OUT         : out   std_logic;
+      -- status LEDs
+      LED_LINK_STAT             : out   std_logic;
+      LED_LINK_TXD              : out   std_logic;
+      LED_LINK_RXD              : out   std_logic;
+      LINK_BSM_OUT                             : out   std_logic_vector(3 downto 0);
+      RESET_OUT                                        : out   std_logic;
+      -- Debug
+      DEBUG                     : out   std_logic_vector(63 downto 0)
+    );
+end entity;
+
+architecture rich_arch of rich_trb is
+
+    -- Placer Directives
+    attribute HGROUP : string;
+    -- for whole architecture
+    attribute HGROUP of rich_arch : architecture  is "RICH_TRB_group";
+
+       -- Signals
+    signal clk_en                   : std_logic;
+    signal med_data_in              : std_logic_vector(c_DATA_WIDTH-1 downto 0);
+    signal med_packet_num_in        : std_logic_vector(c_NUM_WIDTH-1 downto 0);
+    signal med_dataready_in         : std_logic;
+    signal med_read_out             : std_logic;
+    signal med_data_out             : std_logic_vector(c_DATA_WIDTH-1 downto 0);
+    signal med_packet_num_out       : std_logic_vector(c_NUM_WIDTH-1 downto 0);
+    signal med_dataready_out        : std_logic;
+    signal med_read_in              : std_logic;
+    signal med_stat_debug           : std_logic_vector(63 downto 0);
+    signal med_ctrl_op              : std_logic_vector(15 downto 0);
+    signal med_stat_op              : std_logic_vector(15 downto 0);
+
+    -- general purpose control and status registers in regIO
+    signal regio_ctrl_regs          : std_logic_vector(32*2-1 downto 0);
+    signal regio_stat_regs          : std_logic_vector(32*4-1 downto 0);
+    
+    signal common_stat_reg          : std_logic_vector(std_COMSTATREG*c_REGIO_REGISTER_WIDTH-1 downto 0);
+    signal common_ctrl_reg          : std_logic_vector(std_COMCTRLREG*c_REGIO_REGISTER_WIDTH-1 downto 0);
+    
+    signal debug_x                  : std_logic_vector(63 downto 0);
+       
+       signal stat_debug_1                             : std_logic_vector(31 downto 0);
+
+begin
+
+--#######################################################################
+
+--#######################################################################
+
+-- Debug
+debug <= debug_x;
+    
+-- Clock assignment. We don't use CLK_EN really in our designs.
+clk_en      <= '1';
+
+-------------------------------------------------------------
+-- Serdes
+-------------------------------------------------------------
+THE_MEDIA_INTERFACE : trb_net16_med_ecp_sfp_gbe
+generic map( SERDES_NUM => 2 )
+port map( CLK                   => clk100m_in,
+                 SYSCLK                                => sysclk_in,
+          RESET                 => reset_in,
+          CLK_EN                => clk_en,
+          --Internal Connection
+          MED_DATA_IN           => med_data_out,
+          MED_PACKET_NUM_IN     => med_packet_num_out,
+          MED_DATAREADY_IN      => med_dataready_out,
+          MED_READ_OUT          => med_read_in,
+          MED_DATA_OUT          => med_data_in,
+          MED_PACKET_NUM_OUT    => med_packet_num_in,
+          MED_DATAREADY_OUT     => med_dataready_in,
+          MED_READ_IN           => med_read_out,
+          REFCLK2CORE_OUT       => open,
+          --SFP Connection
+          SD_RXD_P_IN           => sd_rxd_p_in,
+          SD_RXD_N_IN           => sd_rxd_n_in,
+          SD_TXD_P_OUT          => sd_txd_p_out,
+          SD_TXD_N_OUT          => sd_txd_n_out,
+          SD_REFCLK_P_IN        => '1',
+          SD_REFCLK_N_IN        => '0',
+          SD_PRSNT_N_IN         => sd_present_in,
+          SD_LOS_IN             => sd_los_in,
+          SD_TXDIS_OUT                 => sd_txdis_out,
+          -- Status and control port
+          STAT_OP               => med_stat_op,
+          CTRL_OP               => med_ctrl_op, -- input
+          STAT_DEBUG            => med_stat_debug,
+          CTRL_DEBUG            => (others => '0')
+        );
+
+--debug_x <= med_stat_debug;
+
+debug_x(63 downto 42) <= (others => '0');
+debug_x(41)           <= med_read_out;       -- MED_READ_IN
+debug_x(40)           <= med_dataready_in;   -- MED_DATAREADY_OUT
+debug_x(39 downto 37) <= med_packet_num_in;  -- MED_PACKET_NUM_OUT
+debug_x(36 downto 21) <= med_data_in;        -- MED_DATA_OUT
+debug_x(20)           <= med_read_in;        -- MED_READ_OUT
+debug_x(19)           <= med_dataready_out;  -- MED_DATAREADY_IN
+debug_x(18 downto 16) <= med_packet_num_out; -- MED_PACKET_NUM_IN
+debug_x(15 downto 0)  <= med_data_out;       -- MED_DATA_IN
+
+--  16  MED_DATA_IN        : in  std_logic_vector(15 downto 0);
+--   3  MED_PACKET_NUM_IN  : in  std_logic_vector(2 downto 0);
+--   1  MED_DATAREADY_IN   : in  std_logic;
+--   1  MED_READ_OUT       : out std_logic;
+--  16  MED_DATA_OUT       : out std_logic_vector(15 downto 0);
+--   3  MED_PACKET_NUM_OUT : out std_logic_vector(2 downto 0);
+--   1  MED_DATAREADY_OUT  : out std_logic;
+--   1  MED_READ_IN        : in  std_logic;
+--  42    
+    
+ ------------------------------------------------------------
+-- Full featured HADES endpoint
+-------------------------------------------------------------
+THE_UNIFIED_ENDPOINT: trb_net16_endpoint_hades_full
+generic map( USE_CHANNEL                    => (c_YES,c_YES,c_NO,c_YES),
+             INIT_CAN_SEND_DATA             => (c_NO,c_NO,c_NO,c_NO), -- was c_YES before?
+             REPLY_CAN_SEND_DATA            => (c_YES,c_YES,c_YES,c_YES),
+             REPLY_CAN_RECEIVE_DATA         => (c_NO,c_NO,c_NO,c_NO),
+             BROADCAST_BITMASK              => x"FB", -- RICH uses 0xfffb as subnet mask for broadcasts
+             REGIO_NUM_STAT_REGS            => 2, -- minimum number: 32 * 2^0 - 1 = 31  => D[31:0]
+             REGIO_NUM_CTRL_REGS            => 1, -- minimum number: 32 * 2^0 - 1 = 31  => D[31:0]
+             --standard values for output registers
+             REGIO_INIT_CTRL_REGS           => x"00000000_00000000_00000000_00000000" &
+                                               x"00000000_00000000_00000000_00000000",
+             --set to 0 for unused ctrl registers to save resources
+             REGIO_USED_CTRL_REGS           =>  "00000001",
+             --set to 0 for each unused bit in a register
+             REGIO_USED_CTRL_BITMASK        => x"FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF" &
+                                               x"FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF",
+             REGIO_USE_DAT_PORT             => c_YES,
+             REGIO_INIT_ADDRESS             => x"fb00",
+             REGIO_INIT_UNIQUE_ID           => x"dead_beef_affe_d00f",
+             REGIO_INIT_BOARD_INFO          => x"5aa5_3cc3",
+             REGIO_INIT_ENDPOINT_ID         => x"0001",
+             REGIO_COMPILE_TIME             => VERSION_NUMBER_TIME,
+             REGIO_COMPILE_VERSION          => x"0003",
+             REGIO_HARDWARE_VERSION         => x"0002_0000",
+             REGIO_USE_1WIRE_INTERFACE      => c_YES,
+             CLOCK_FREQUENCY                => 100
+           )
+port map( CLK                       => sysclk_in,
+          RESET                     => reset_in,
+          CLK_EN                    => clk_en,
+          --  Media direction port
+          MED_DATAREADY_OUT         => med_dataready_out,
+          MED_DATA_OUT              => med_data_out,
+          MED_PACKET_NUM_OUT        => med_packet_num_out,
+          MED_READ_IN               => med_read_in,
+          MED_DATAREADY_IN          => med_dataready_in,
+          MED_DATA_IN               => med_data_in,
+          MED_PACKET_NUM_IN         => med_packet_num_in,
+          MED_READ_OUT              => med_read_out,
+          MED_STAT_OP_IN            => med_stat_op,
+          MED_CTRL_OP_OUT           => med_ctrl_op,
+          -- LVL1 trigger APL
+          LVL1_TRG_TYPE_OUT         => lvl1_trg_type_out,
+          LVL1_TRG_RECEIVED_OUT     => lvl1_trg_received_out,
+          LVL1_TRG_NUMBER_OUT       => lvl1_trg_number_out,
+          LVL1_TRG_CODE_OUT         => lvl1_trg_code_out,
+          LVL1_TRG_INFORMATION_OUT  => lvl1_trg_information_out,
+          LVL1_ERROR_PATTERN_IN     => lvl1_error_pattern_in,
+          LVL1_TRG_RELEASE_IN       => lvl1_trg_release_in,
+          LVL1_INT_TRG_NUMBER_OUT   => open, -- unknown!!!
+          -- IPU Port
+          IPU_NUMBER_OUT            => ipu_number_out,
+                 IPU_READOUT_TYPE_OUT          => open, -- 4bit readout type
+                 IPU_INFORMATION_OUT       => ipu_information_out,
+          IPU_START_READOUT_OUT     => ipu_start_readout_out,
+          IPU_DATA_IN               => ipu_data_in,
+          IPU_DATAREADY_IN          => ipu_dataready_in,
+          IPU_READOUT_FINISHED_IN   => ipu_readout_finished_in,
+          IPU_READ_OUT              => ipu_read_out,
+          IPU_LENGTH_IN             => ipu_length_in,
+          IPU_ERROR_PATTERN_IN      => ipu_error_pattern_in,
+          -- Slow Control Data Port
+          REGIO_COMMON_STAT_REG_IN  => common_stat_reg,
+          REGIO_COMMON_CTRL_REG_OUT => common_ctrl_reg,
+          REGIO_REGISTERS_IN        => regio_stat_regs,
+          REGIO_REGISTERS_OUT       => regio_ctrl_regs,
+          COMMON_STAT_REG_STROBE    => open, --: out std_logic_vector(std_COMSTATREG-1 downto 0);
+          COMMON_CTRL_REG_STROBE    => open, --: out std_logic_vector(std_COMCTRLREG-1 downto 0);
+          STAT_REG_STROBE           => open, --: out std_logic_vector(2**(REGIO_NUM_STAT_REGS)-1 downto 0);
+          CTRL_REG_STROBE           => open, --: out std_logic_vector(2**(REGIO_NUM_CTRL_REGS)-1 downto 0);
+          --following ports only used when using internal data port
+          REGIO_ADDR_OUT            => regio_addr_out,
+          REGIO_READ_ENABLE_OUT     => regio_read_enable_out,
+          REGIO_WRITE_ENABLE_OUT    => regio_write_enable_out,
+          REGIO_DATA_OUT            => regio_data_out,
+          REGIO_DATA_IN             => regio_data_in,
+          REGIO_DATAREADY_IN        => regio_dataready_in,
+          REGIO_NO_MORE_DATA_IN     => regio_no_more_data_in,
+          REGIO_WRITE_ACK_IN        => regio_write_ack_in,
+          REGIO_UNKNOWN_ADDR_IN     => regio_unknown_addr_in,
+          REGIO_TIMEOUT_OUT         => regio_timeout_out,
+          --IDRAM is used if no 1-wire interface, onewire used otherwise
+          REGIO_IDRAM_DATA_IN       => x"0000", -- not used
+          REGIO_IDRAM_DATA_OUT      => open, -- not used
+          REGIO_IDRAM_ADDR_IN       => "000", -- not used
+          REGIO_IDRAM_WR_IN         => '0', -- not used
+          REGIO_ONEWIRE_INOUT       => onewire_inout,
+          REGIO_ONEWIRE_MONITOR_IN  => '1', -- not used
+          REGIO_ONEWIRE_MONITOR_OUT => open, -- not used
+          -- New stuff?!?
+                 TRIGGER_MONITOR_IN            => timing_trg_found_in,
+                 GLOBAL_TIME_OUT                       => open,
+                 LOCAL_TIME_OUT                        => open,
+                 TIME_SINCE_LAST_TRG_OUT       => open,
+                 TIMER_US_TICK_OUT                     => open,
+          -- Status and debug 
+          STAT_DEBUG_IPU            => open,
+          STAT_DEBUG_1              => stat_debug_1, --open,
+          STAT_DEBUG_2              => open,
+          MED_STAT_OP               => open,
+          CTRL_MPLEX                => x"00000000",
+          IOBUF_CTRL_GEN            => x"00000000_00000000_00000000_00000000",
+          STAT_ONEWIRE              => open,
+          STAT_ADDR_DEBUG           => open
+        );
+
+-- Control register assignment
+
+-- Common status register
+common_stat_reg(COMMON_STAT_REG'left downto 32) <= common_stat_reg_in(63 downto 32); --(others => '0');
+common_stat_reg(31 downto 20)                   <= (others => '0'); -- already taken by TEMP of 1WID
+common_stat_reg(19 downto 0)                    <= common_stat_reg_in(19 downto 0); --(others => '0');
+
+-- Common control register
+common_ctrl_reg_out <= common_ctrl_reg;
+
+-- User status register
+regio_stat_regs <= status_in;
+control_out     <= regio_ctrl_regs;
+
+-- FPGA LEDs
+led_link_stat <= not med_stat_op(9);       -- link status
+led_link_rxd  <= not med_stat_op(10);      -- not med_packet_num_in(2); -- data receive  
+led_link_txd  <= not med_stat_op(11);      -- data transmit
+link_bsm_out  <= med_stat_op(7 downto 4);  -- LSM state bits
+reset_out     <= med_stat_op(13);          -- TRB generated reset
+
+end architecture;
+                               
\ No newline at end of file
diff --git a/src/slave_bus.vhd b/src/slave_bus.vhd
new file mode 100644 (file)
index 0000000..1560432
--- /dev/null
@@ -0,0 +1,818 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.trb_net_std.all;\r
+use work.trb_net_components.all;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity slave_bus is\r
+port( CLK_IN                                   : in    std_logic;\r
+         RESET_IN                                      : in    std_logic;\r
+         -- RegIO signals\r
+         REGIO_ADDR_IN                         : in    std_logic_vector(15 downto 0); -- address bus \r
+         REGIO_DATA_IN                         : in    std_logic_vector(31 downto 0); -- data from TRB endpoint\r
+         REGIO_DATA_OUT                        : out   std_logic_vector(31 downto 0); -- data to TRB endpoint\r
+         REGIO_READ_ENABLE_IN          : in    std_logic; -- read pulse\r
+         REGIO_WRITE_ENABLE_IN         : in    std_logic; -- write pulse\r
+         REGIO_TIMEOUT_IN                      : in    std_logic; -- access timed out\r
+         REGIO_DATAREADY_OUT           : out   std_logic; -- your data, master, as requested\r
+         REGIO_WRITE_ACK_OUT           : out   std_logic; -- data accepted\r
+         REGIO_NO_MORE_DATA_OUT        : out   std_logic; -- don't disturb me now\r
+         REGIO_UNKNOWN_ADDR_OUT        : out   std_logic; -- noone here to answer your request\r
+         -- I2C connections\r
+         SDA_IN                                        : in    std_logic;\r
+         SDA_OUT                                       : out   std_logic;\r
+         SCL_IN                                        : in    std_logic;\r
+         SCL_OUT                                       : out   std_logic;\r
+         -- 1Wire connections\r
+         ONEWIRE_START_IN                      : in    std_logic; -- start 1Wire scan (pulse)\r
+         ONEWIRE_INOUT                         : inout std_logic_vector(15 downto 0);\r
+         BP_ONEWIRE_INOUT                      : inout std_logic; -- 1Wire ID on backplane\r
+         -- SPI connections\r
+         SPI_CS_OUT                            : out   std_logic;\r
+         SPI_SCK_OUT                           : out   std_logic;\r
+         SPI_SDI_IN                            : in    std_logic;\r
+         SPI_SDO_OUT                           : out   std_logic;\r
+         -- ADC 0 SPI connections\r
+         SPI_ADC0_CS_OUT                       : out   std_logic;\r
+         SPI_ADC0_SCK_OUT                      : out   std_logic;\r
+         SPI_ADC0_SDO_OUT                      : out   std_logic;\r
+         ADC0_PLL_LOCKED_IN            : in    std_logic;\r
+         ADC0_PD_OUT                           : out   std_logic;\r
+         ADC0_RST_OUT                          : out   std_logic;\r
+         ADC0_DEL_OUT                          : out   std_logic_vector(3 downto 0);\r
+         ADC0_CLK_IN                           : in    std_logic;\r
+         ADC0_DATA_IN                          : in    std_logic_vector(11 downto 0);\r
+         ADC0_SEL_OUT                          : out   std_logic_vector(2 downto 0);\r
+         APV0_RST_OUT                          : out   std_logic;\r
+         -- ADC 1 SPI connections\r
+         SPI_ADC1_CS_OUT                       : out   std_logic;\r
+         SPI_ADC1_SCK_OUT                      : out   std_logic;\r
+         SPI_ADC1_SDO_OUT                      : out   std_logic;\r
+         ADC1_PLL_LOCKED_IN            : in    std_logic;\r
+         ADC1_PD_OUT                           : out   std_logic;\r
+         ADC1_RST_OUT                          : out   std_logic;\r
+         ADC1_DEL_OUT                          : out   std_logic_vector(3 downto 0);\r
+         ADC1_CLK_IN                           : in    std_logic;\r
+         ADC1_DATA_IN                          : in    std_logic_vector(11 downto 0);\r
+         ADC1_SEL_OUT                          : out   std_logic_vector(2 downto 0);\r
+         APV1_RST_OUT                          : out   std_logic;\r
+         -- User specific inputs / outputs\r
+         BACKPLANE_IN                          : in    std_logic_vector(2 downto 0);\r
+         -- pedestal interface\r
+         PED_ADDR_IN                           : in    std_logic_vector(6 downto 0); -- pedestal addressing from data handlers\r
+         PED_DATA_0_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_1_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_2_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_3_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_4_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_5_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_6_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_7_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_8_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_9_OUT                        : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_10_OUT                       : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_11_OUT                       : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_12_OUT                       : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_13_OUT                       : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_14_OUT                       : out   std_logic_vector(17 downto 0);\r
+         PED_DATA_15_OUT                       : out   std_logic_vector(17 downto 0);\r
+         -- threshold interface\r
+         THR_ADDR_IN                           : in    std_logic_vector(6 downto 0); -- threshold addressing from data handlers\r
+         THR_DATA_0_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_1_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_2_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_3_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_4_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_5_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_6_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_7_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_8_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_9_OUT                        : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_10_OUT                       : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_11_OUT                       : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_12_OUT                       : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_13_OUT                       : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_14_OUT                       : out   std_logic_vector(17 downto 0);\r
+         THR_DATA_15_OUT                       : out   std_logic_vector(17 downto 0);\r
+         -- APV control / status\r
+         CTRL_0_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_1_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_2_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_3_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_4_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_5_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_6_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_7_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_8_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_9_OUT                            : out   std_logic_vector(15 downto 0);\r
+         CTRL_10_OUT                           : out   std_logic_vector(15 downto 0);\r
+         CTRL_11_OUT                           : out   std_logic_vector(15 downto 0);\r
+         CTRL_12_OUT                           : out   std_logic_vector(15 downto 0);\r
+         CTRL_13_OUT                           : out   std_logic_vector(15 downto 0);\r
+         CTRL_14_OUT                           : out   std_logic_vector(15 downto 0);\r
+         CTRL_15_OUT                           : out   std_logic_vector(15 downto 0);\r
+         STAT_0_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_1_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_2_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_3_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_4_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_5_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_6_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_7_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_8_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_9_IN                                     : in    std_logic_vector(15 downto 0);\r
+         STAT_10_IN                            : in    std_logic_vector(15 downto 0);\r
+         STAT_11_IN                            : in    std_logic_vector(15 downto 0);\r
+         STAT_12_IN                            : in    std_logic_vector(15 downto 0);\r
+         STAT_13_IN                            : in    std_logic_vector(15 downto 0);\r
+         STAT_14_IN                            : in    std_logic_vector(15 downto 0);\r
+         STAT_15_IN                            : in    std_logic_vector(15 downto 0);\r
+         -- some control signals\r
+         CTRL_LVL_OUT                          : out   std_logic_vector(31 downto 0);\r
+         CTRL_TRG_OUT                          : out   std_logic_vector(31 downto 0);\r
+         CTRL_PLL_OUT                          : out   std_logic_vector(15 downto 0);\r
+         STATUS_PLL_IN                         : in    std_logic_vector(15 downto 0);\r
+         -- temporary stuff\r
+         TEST_REG_IN                           : in    std_logic_vector(31 downto 0); -- just for testing!\r
+         TEST_REG_OUT                          : out   std_logic_vector(31 downto 0); -- just for testing!\r
+         -- Debug\r
+         DEBUG_OUT                                     : out   std_logic_vector(63 downto 0);\r
+         STAT                                          : out   std_logic_vector(31 downto 0)\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slave_bus is\r
+\r
+       -- Signals\r
+       signal slv_read                         : std_logic_vector(15-1 downto 0);\r
+       signal slv_write                        : std_logic_vector(15-1 downto 0);\r
+       signal slv_busy                         : std_logic_vector(15-1 downto 0);\r
+       signal slv_ack                          : std_logic_vector(15-1 downto 0);\r
+       signal slv_addr                         : std_logic_vector(15*16-1 downto 0);\r
+       signal slv_data_rd                      : std_logic_vector(15*32-1 downto 0);\r
+       signal slv_data_wr                      : std_logic_vector(15*32-1 downto 0);\r
+       \r
+       -- SPI controller BRAM lines\r
+       signal spi_bram_addr            : std_logic_vector(7 downto 0);\r
+       signal spi_bram_wr_d            : std_logic_vector(7 downto 0);\r
+       signal spi_bram_rd_d            : std_logic_vector(7 downto 0);\r
+       signal spi_bram_we                      : std_logic;\r
+       \r
+       signal spi_cs                           : std_logic;\r
+       signal spi_sck                          : std_logic;\r
+       signal spi_sdi                          : std_logic;\r
+       signal spi_sdo                          : std_logic;\r
+       signal spi_debug                        : std_logic_vector(31 downto 0);\r
+       \r
+       signal ctrl_lvl                         : std_logic_vector(31 downto 0);\r
+       signal ctrl_trg                         : std_logic_vector(31 downto 0);\r
+       signal ctrl_pll                         : std_logic_vector(15 downto 0);\r
+       \r
+       signal debug                            : std_logic_vector(63 downto 0);\r
+       signal onewire_debug            : std_logic_vector(63 downto 0);\r
+       \r
+begin\r
+\r
+-- Bus handler: acts as bridge between RegIO and the FPGA internal slave bus\r
+THE_BUS_HANDLER: trb_net16_regio_bus_handler\r
+generic map( PORT_NUMBER               => 15,\r
+                        PORT_ADDRESSES         => ( 0 => x"a000", -- pedestal memories  \r
+                                                                        1 => x"a800", -- threshold memories\r
+                                                                        2 => x"8040", -- I2C master\r
+                                                                        3 => x"c000", -- 1Wire master + memory\r
+                                                                        4 => x"d000", -- SPI master\r
+                                                                        5 => x"d100", -- SPI data memory \r
+                                                                        6 => x"d010", -- ADC0 SPI \r
+                                                                        7 => x"d020", -- ADC1 SPI\r
+                                                                        8 => x"b000", -- APV control / status\r
+                                                9 => x"b010", -- ADC level settings\r
+                                               10 => x"b020", -- trigger settings\r
+                                               11 => x"b030", -- PLL settings\r
+                                               12 => x"f000", -- ADC 0 snooper\r
+                                               13 => x"f800", -- ADC 1 snooper\r
+                                               14 => x"8000", -- test register (busy)\r
+                                               others => x"0000"),                     \r
+                        PORT_ADDR_MASK         => ( 0 => 11, -- pedestal memories\r
+                                                                        1 => 11, -- threshold memories\r
+                                                                        2 => 0,  -- I2C master\r
+                                                                        3 => 6,  -- 1Wire master + memory\r
+                                                                        4 => 1,  -- SPI master\r
+                                                                        5 => 6,  -- SPI data memory\r
+                                                                        6 => 0,  -- ADC0 SPI\r
+                                                7 => 0,  -- ADC1 SPI\r
+                                                8 => 4,  -- APV control / status \r
+                                                9 => 0,  -- ADC level settings\r
+                                               10 => 0,  -- trigger settings\r
+                                               11 => 0,  -- PLL settings\r
+                                               12 => 10, -- ADC 0 snooper\r
+                                               13 => 10, -- ADC 1 snooper\r
+                                               14 => 0,  -- test register (normal)\r
+                                               others => 0)\r
+                 )\r
+port map( CLK                                  => clk_in,\r
+                 RESET                                 => reset_in,\r
+                 DAT_ADDR_IN                   => regio_addr_in,\r
+                 DAT_DATA_IN                   => regio_data_in,\r
+                 DAT_DATA_OUT                  => regio_data_out,\r
+                 DAT_READ_ENABLE_IN    => regio_read_enable_in,\r
+                 DAT_WRITE_ENABLE_IN   => regio_write_enable_in,\r
+                 DAT_TIMEOUT_IN                => regio_timeout_in,\r
+                 DAT_DATAREADY_OUT             => regio_dataready_out,\r
+                 DAT_WRITE_ACK_OUT             => regio_write_ack_out,\r
+                 DAT_NO_MORE_DATA_OUT  => regio_no_more_data_out,\r
+                 DAT_UNKNOWN_ADDR_OUT  => regio_unknown_addr_out,\r
+                 -- pedestal memories\r
+                 BUS_READ_ENABLE_OUT(0)                                => slv_read(0),\r
+                 BUS_WRITE_ENABLE_OUT(0)                               => slv_write(0),\r
+                 BUS_DATA_OUT(0*32+31 downto 0*32)             => slv_data_wr(0*32+31 downto 0*32),\r
+                 BUS_DATA_IN(0*32+31 downto 0*32)              => slv_data_rd(0*32+31 downto 0*32),  \r
+                 BUS_ADDR_OUT(0*16+15 downto 0*16)             => slv_addr(0*16+15 downto 0*16),\r
+                 BUS_TIMEOUT_OUT(0)                                    => open,\r
+                 BUS_DATAREADY_IN(0)                                   => slv_ack(0),\r
+                 BUS_WRITE_ACK_IN(0)                                   => slv_ack(0),\r
+                 BUS_NO_MORE_DATA_IN(0)                                => slv_busy(0),\r
+                 BUS_UNKNOWN_ADDR_IN(0)                                => '0',\r
+                 -- threshold memories\r
+                 BUS_READ_ENABLE_OUT(1)                                => slv_read(1),\r
+                 BUS_WRITE_ENABLE_OUT(1)                               => slv_write(1),\r
+                 BUS_DATA_OUT(1*32+31 downto 1*32)             => slv_data_wr(1*32+31 downto 1*32),\r
+                 BUS_DATA_IN(1*32+31 downto 1*32)              => slv_data_rd(1*32+31 downto 1*32),  \r
+                 BUS_ADDR_OUT(1*16+15 downto 1*16)             => slv_addr(1*16+15 downto 1*16),\r
+                 BUS_TIMEOUT_OUT(1)                                    => open,\r
+                 BUS_DATAREADY_IN(1)                                   => slv_ack(1),\r
+                 BUS_WRITE_ACK_IN(1)                                   => slv_ack(1),\r
+                 BUS_NO_MORE_DATA_IN(1)                                => slv_busy(1),\r
+                 BUS_UNKNOWN_ADDR_IN(1)                                => '0',\r
+                 -- I2C master\r
+                 BUS_READ_ENABLE_OUT(2)                                => slv_read(2),\r
+                 BUS_WRITE_ENABLE_OUT(2)                               => slv_write(2),\r
+                 BUS_DATA_OUT(2*32+31 downto 2*32)             => slv_data_wr(2*32+31 downto 2*32),\r
+                 BUS_DATA_IN(2*32+31 downto 2*32)              => slv_data_rd(2*32+31 downto 2*32),  \r
+                 BUS_ADDR_OUT(2*16+15 downto 2*16)             => open,\r
+                 BUS_TIMEOUT_OUT(2)                                    => open,\r
+                 BUS_DATAREADY_IN(2)                                   => slv_ack(2),\r
+                 BUS_WRITE_ACK_IN(2)                                   => slv_ack(2),\r
+                 BUS_NO_MORE_DATA_IN(2)                                => slv_busy(2),\r
+                 BUS_UNKNOWN_ADDR_IN(2)                                => '0',\r
+                 -- OneWire master\r
+                 BUS_READ_ENABLE_OUT(3)                                => slv_read(3),\r
+                 BUS_WRITE_ENABLE_OUT(3)                               => slv_write(3),\r
+                 BUS_DATA_OUT(3*32+31 downto 3*32)             => slv_data_wr(3*32+31 downto 3*32),\r
+                 BUS_DATA_IN(3*32+31 downto 3*32)              => slv_data_rd(3*32+31 downto 3*32),  \r
+                 BUS_ADDR_OUT(3*16+15 downto 3*16)             => slv_addr(3*16+15 downto 3*16),\r
+                 BUS_TIMEOUT_OUT(3)                                    => open,\r
+                 BUS_DATAREADY_IN(3)                                   => slv_ack(3),\r
+                 BUS_WRITE_ACK_IN(3)                                   => slv_ack(3),\r
+                 BUS_NO_MORE_DATA_IN(3)                                => slv_busy(3),\r
+                 BUS_UNKNOWN_ADDR_IN(3)                                => '0',\r
+                 -- SPI control registers\r
+                 BUS_READ_ENABLE_OUT(4)                                => slv_read(4),\r
+                 BUS_WRITE_ENABLE_OUT(4)                               => slv_write(4),\r
+                 BUS_DATA_OUT(4*32+31 downto 4*32)             => slv_data_wr(4*32+31 downto 4*32),\r
+                 BUS_DATA_IN(4*32+31 downto 4*32)              => slv_data_rd(4*32+31 downto 4*32),  \r
+                 BUS_ADDR_OUT(4*16+15 downto 4*16)             => slv_addr(4*16+15 downto 4*16),\r
+                 BUS_TIMEOUT_OUT(4)                                    => open,\r
+                 BUS_DATAREADY_IN(4)                                   => slv_ack(4),\r
+                 BUS_WRITE_ACK_IN(4)                                   => slv_ack(4),\r
+                 BUS_NO_MORE_DATA_IN(4)                                => slv_busy(4),\r
+                 BUS_UNKNOWN_ADDR_IN(4)                                => '0',\r
+                 -- SPI data memory\r
+                 BUS_READ_ENABLE_OUT(5)                                => slv_read(5),\r
+                 BUS_WRITE_ENABLE_OUT(5)                               => slv_write(5),\r
+                 BUS_DATA_OUT(5*32+31 downto 5*32)             => slv_data_wr(5*32+31 downto 5*32),\r
+                 BUS_DATA_IN(5*32+31 downto 5*32)              => slv_data_rd(5*32+31 downto 5*32),  \r
+                 BUS_ADDR_OUT(5*16+15 downto 5*16)             => slv_addr(5*16+15 downto 5*16),\r
+                 BUS_TIMEOUT_OUT(5)                                    => open,\r
+                 BUS_DATAREADY_IN(5)                                   => slv_ack(5),\r
+                 BUS_WRITE_ACK_IN(5)                                   => slv_ack(5),\r
+                 BUS_NO_MORE_DATA_IN(5)                                => slv_busy(5),\r
+                 BUS_UNKNOWN_ADDR_IN(5)                                => '0',\r
+                 -- ADC 0 SPI control registers\r
+                 BUS_READ_ENABLE_OUT(6)                                => slv_read(6),\r
+                 BUS_WRITE_ENABLE_OUT(6)                               => slv_write(6),\r
+                 BUS_DATA_OUT(6*32+31 downto 6*32)             => slv_data_wr(6*32+31 downto 6*32),\r
+                 BUS_DATA_IN(6*32+31 downto 6*32)              => slv_data_rd(6*32+31 downto 6*32),  \r
+                 BUS_ADDR_OUT(6*16+15 downto 6*16)             => open,\r
+                 BUS_TIMEOUT_OUT(6)                                    => open,\r
+                 BUS_DATAREADY_IN(6)                                   => slv_ack(6),\r
+                 BUS_WRITE_ACK_IN(6)                                   => slv_ack(6),\r
+                 BUS_NO_MORE_DATA_IN(6)                                => slv_busy(6),\r
+                 BUS_UNKNOWN_ADDR_IN(6)                                => '0',\r
+                 -- ADC 1 SPI control registers\r
+                 BUS_READ_ENABLE_OUT(7)                                => slv_read(7),\r
+                 BUS_WRITE_ENABLE_OUT(7)                               => slv_write(7),\r
+                 BUS_DATA_OUT(7*32+31 downto 7*32)             => slv_data_wr(7*32+31 downto 7*32),\r
+                 BUS_DATA_IN(7*32+31 downto 7*32)              => slv_data_rd(7*32+31 downto 7*32),  \r
+                 BUS_ADDR_OUT(7*16+15 downto 7*16)             => open,\r
+                 BUS_TIMEOUT_OUT(7)                                    => open,\r
+                 BUS_DATAREADY_IN(7)                                   => slv_ack(7),\r
+                 BUS_WRITE_ACK_IN(7)                                   => slv_ack(7),\r
+                 BUS_NO_MORE_DATA_IN(7)                                => slv_busy(7),\r
+                 BUS_UNKNOWN_ADDR_IN(7)                                => '0',\r
+                 -- APV control / status registers\r
+                 BUS_READ_ENABLE_OUT(8)                                => slv_read(8),\r
+                 BUS_WRITE_ENABLE_OUT(8)                               => slv_write(8),\r
+                 BUS_DATA_OUT(8*32+31 downto 8*32)             => slv_data_wr(8*32+31 downto 8*32),\r
+                 BUS_DATA_IN(8*32+31 downto 8*32)              => slv_data_rd(8*32+31 downto 8*32),  \r
+                 BUS_ADDR_OUT(8*16+15 downto 8*16)             => slv_addr(8*16+15 downto 8*16),\r
+                 BUS_TIMEOUT_OUT(8)                                    => open,\r
+                 BUS_DATAREADY_IN(8)                                   => slv_ack(8),\r
+                 BUS_WRITE_ACK_IN(8)                                   => slv_ack(8),\r
+                 BUS_NO_MORE_DATA_IN(8)                                => slv_busy(8),\r
+                 BUS_UNKNOWN_ADDR_IN(8)                                => '0',\r
+                 -- ADC / PLL / trigger ctrl register\r
+                 BUS_READ_ENABLE_OUT(11 downto 9)              => slv_read(11 downto 9),\r
+                 BUS_WRITE_ENABLE_OUT(11 downto 9)             => slv_write(11 downto 9),\r
+                 BUS_DATA_OUT(11*32+31 downto 9*32)    => slv_data_wr(11*32+31 downto 9*32),\r
+                 BUS_DATA_IN(11*32+31 downto 9*32)             => slv_data_rd(11*32+31 downto 9*32),  \r
+                 BUS_ADDR_OUT(11*16+15 downto 9*16)    => open,\r
+                 BUS_TIMEOUT_OUT(11 downto 9)                  => open,\r
+                 BUS_DATAREADY_IN(11 downto 9)                 => slv_ack(11 downto 9),\r
+                 BUS_WRITE_ACK_IN(11 downto 9)                 => slv_ack(11 downto 9),\r
+                 BUS_NO_MORE_DATA_IN(11 downto 9)              => slv_busy(11 downto 9),\r
+                 BUS_UNKNOWN_ADDR_IN(11 downto 9)              => (others => '0'),\r
+                 -- ADC0 snooper\r
+                 BUS_READ_ENABLE_OUT(12)                               => slv_read(12),\r
+                 BUS_WRITE_ENABLE_OUT(12)                              => slv_write(12),\r
+                 BUS_DATA_OUT(12*32+31 downto 12*32)   => slv_data_wr(12*32+31 downto 12*32),\r
+                 BUS_DATA_IN(12*32+31 downto 12*32)    => slv_data_rd(12*32+31 downto 12*32),  \r
+                 BUS_ADDR_OUT(12*16+15 downto 12*16)   => slv_addr(12*16+15 downto 12*16),\r
+                 BUS_TIMEOUT_OUT(12)                                   => open,\r
+                 BUS_DATAREADY_IN(12)                                  => slv_ack(12),\r
+                 BUS_WRITE_ACK_IN(12)                                  => slv_ack(12),\r
+                 BUS_NO_MORE_DATA_IN(12)                               => slv_busy(12),\r
+                 BUS_UNKNOWN_ADDR_IN(12)                               => '0',\r
+                 -- ADC1 snooper\r
+                 BUS_READ_ENABLE_OUT(13)                               => slv_read(13),\r
+                 BUS_WRITE_ENABLE_OUT(13)                              => slv_write(13),\r
+                 BUS_DATA_OUT(13*32+31 downto 13*32)   => slv_data_wr(13*32+31 downto 13*32),\r
+                 BUS_DATA_IN(13*32+31 downto 13*32)    => slv_data_rd(13*32+31 downto 13*32),  \r
+                 BUS_ADDR_OUT(13*16+15 downto 13*16)   => slv_addr(13*16+15 downto 13*16),\r
+                 BUS_TIMEOUT_OUT(13)                                   => open,\r
+                 BUS_DATAREADY_IN(13)                                  => slv_ack(13),\r
+                 BUS_WRITE_ACK_IN(13)                                  => slv_ack(13),\r
+                 BUS_NO_MORE_DATA_IN(13)                               => slv_busy(13),\r
+                 BUS_UNKNOWN_ADDR_IN(13)                               => '0',\r
+                 -- Test register\r
+                 BUS_READ_ENABLE_OUT(14)                               => slv_read(14),\r
+                 BUS_WRITE_ENABLE_OUT(14)                              => slv_write(14),\r
+                 BUS_DATA_OUT(14*32+31 downto 14*32)   => slv_data_wr(14*32+31 downto 14*32),\r
+                 BUS_DATA_IN(14*32+31 downto 14*32)    => slv_data_rd(14*32+31 downto 14*32),  \r
+                 BUS_ADDR_OUT(14*16+15 downto 14*16)   => open,\r
+                 BUS_TIMEOUT_OUT(14)                                   => open,\r
+                 BUS_DATAREADY_IN(14)                                  => slv_ack(14),\r
+                 BUS_WRITE_ACK_IN(14)                                  => slv_ack(14),\r
+                 BUS_NO_MORE_DATA_IN(14)                               => slv_busy(14),\r
+                 BUS_UNKNOWN_ADDR_IN(14)                               => '0',\r
+                 -- debug\r
+                 STAT_DEBUG                    => stat\r
+           );\r
+\r
+\r
+------------------------------------------------------------------------------------\r
+-- pedestal memories (16x128 = 2048, 18bit)\r
+------------------------------------------------------------------------------------\r
+THE_PED_MEM: slv_ped_thr_mem\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   => slv_addr(0*16+10 downto 0*16),\r
+                 SLV_READ_IN   => slv_read(0),\r
+                 SLV_WRITE_IN  => slv_write(0),\r
+                 SLV_ACK_OUT   => slv_ack(0),\r
+                 SLV_DATA_IN   => slv_data_wr(0*32+31 downto 0*32),\r
+                 SLV_DATA_OUT  => slv_data_rd(0*32+31 downto 0*32),\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN  => backplane_in,\r
+                 -- I/O to the backend\r
+                 MEM_CLK_IN    => clk_in,\r
+                 MEM_ADDR_IN   => ped_addr_in,\r
+                 MEM_0_D_OUT   => ped_data_0_out,\r
+                 MEM_1_D_OUT   => ped_data_1_out,\r
+                 MEM_2_D_OUT   => ped_data_2_out,\r
+                 MEM_3_D_OUT   => ped_data_3_out,\r
+                 MEM_4_D_OUT   => ped_data_4_out,\r
+                 MEM_5_D_OUT   => ped_data_5_out,\r
+                 MEM_6_D_OUT   => ped_data_6_out,\r
+                 MEM_7_D_OUT   => ped_data_7_out,\r
+                 MEM_8_D_OUT   => ped_data_8_out,\r
+                 MEM_9_D_OUT   => ped_data_9_out,\r
+                 MEM_10_D_OUT  => ped_data_10_out,\r
+                 MEM_11_D_OUT  => ped_data_11_out,\r
+                 MEM_12_D_OUT  => ped_data_12_out,\r
+                 MEM_13_D_OUT  => ped_data_13_out,\r
+                 MEM_14_D_OUT  => ped_data_14_out,\r
+                 MEM_15_D_OUT  => ped_data_15_out,\r
+                 -- Status lines\r
+                 STAT                  => open\r
+               );\r
+slv_busy(0) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- threshold memories (16x128 = 2048, 18bit)\r
+------------------------------------------------------------------------------------\r
+THE_THR_MEM: slv_ped_thr_mem\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   => slv_addr(1*16+10 downto 1*16),\r
+                 SLV_READ_IN   => slv_read(1),\r
+                 SLV_WRITE_IN  => slv_write(1),\r
+                 SLV_ACK_OUT   => slv_ack(1),\r
+                 SLV_DATA_IN   => slv_data_wr(1*32+31 downto 1*32),\r
+                 SLV_DATA_OUT  => slv_data_rd(1*32+31 downto 1*32),\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN  => backplane_in,\r
+                 -- I/O to the backend\r
+                 MEM_CLK_IN    => clk_in,\r
+                 MEM_ADDR_IN   => thr_addr_in,\r
+                 MEM_0_D_OUT   => thr_data_0_out,\r
+                 MEM_1_D_OUT   => thr_data_1_out,\r
+                 MEM_2_D_OUT   => thr_data_2_out,\r
+                 MEM_3_D_OUT   => thr_data_3_out,\r
+                 MEM_4_D_OUT   => thr_data_4_out,\r
+                 MEM_5_D_OUT   => thr_data_5_out,\r
+                 MEM_6_D_OUT   => thr_data_6_out,\r
+                 MEM_7_D_OUT   => thr_data_7_out,\r
+                 MEM_8_D_OUT   => thr_data_8_out,\r
+                 MEM_9_D_OUT   => thr_data_9_out,\r
+                 MEM_10_D_OUT  => thr_data_10_out,\r
+                 MEM_11_D_OUT  => thr_data_11_out,\r
+                 MEM_12_D_OUT  => thr_data_12_out,\r
+                 MEM_13_D_OUT  => thr_data_13_out,\r
+                 MEM_14_D_OUT  => thr_data_14_out,\r
+                 MEM_15_D_OUT  => thr_data_15_out,\r
+                 -- Status lines\r
+                 STAT                  => open\r
+               );\r
+slv_busy(1) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- I2C master block for accessing APVs\r
+------------------------------------------------------------------------------------\r
+THE_I2C_MASTER: i2c_master\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- Slave bus\r
+                 SLV_READ_IN   => slv_read(2),\r
+                 SLV_WRITE_IN  => slv_write(2),\r
+                 SLV_BUSY_OUT  => slv_busy(2),\r
+                 SLV_ACK_OUT   => slv_ack(2),\r
+                 SLV_DATA_IN   => slv_data_wr(2*32+31 downto 2*32),\r
+                 SLV_DATA_OUT  => slv_data_rd(2*32+31 downto 2*32),\r
+                 -- I2C connections\r
+                 SDA_IN                => sda_in,\r
+                 SDA_OUT               => sda_out,\r
+                 SCL_IN                => scl_in,\r
+                 SCL_OUT               => scl_out,\r
+                 -- Status lines\r
+                 STAT                  => open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- 1Wire master including status memory\r
+------------------------------------------------------------------------------------\r
+THE_ONEWIRE_MEMORY: slv_onewire_memory\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN           => slv_addr(3*16+5 downto 3*16),\r
+                 SLV_READ_IN           => slv_read(3),\r
+                 SLV_WRITE_IN          => slv_write(3),\r
+                 SLV_ACK_OUT           => slv_ack(3),\r
+                 SLV_BUSY_OUT          => open, \r
+                 SLV_DATA_OUT          => slv_data_rd(3*32+31 downto 3*32),\r
+                 -- backplane identifier\r
+                 BACKPLANE_IN  => backplane_in,\r
+                 -- 1Wire lines\r
+                 ONEWIRE_START_IN      => onewire_start_in, -- not used yet\r
+                 ONEWIRE_INOUT         => onewire_inout,\r
+                 BP_ONEWIRE_INOUT      => bp_onewire_inout,\r
+                 -- Status lines\r
+                 STAT                          => onewire_debug --open\r
+               );\r
+slv_busy(3) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- SPI master\r
+------------------------------------------------------------------------------------\r
+THE_SPI_MASTER: spi_master\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- Slave bus\r
+                 BUS_READ_IN   => slv_read(4),\r
+                 BUS_WRITE_IN  => slv_write(4),\r
+                 BUS_BUSY_OUT  => slv_busy(4),\r
+                 BUS_ACK_OUT   => slv_ack(4),\r
+                 BUS_ADDR_IN   => slv_addr(4*16+0 downto 4*16),\r
+                 BUS_DATA_IN   => slv_data_wr(4*32+31 downto 4*32),\r
+                 BUS_DATA_OUT  => slv_data_rd(4*32+31 downto 4*32),\r
+                 -- SPI connections\r
+                 SPI_CS_OUT    => spi_cs,\r
+                 SPI_SDI_IN    => spi_sdi,\r
+                 SPI_SDO_OUT   => spi_sdo,\r
+                 SPI_SCK_OUT   => spi_sck,\r
+                 -- BRAM for read/write data\r
+                 BRAM_A_OUT    => spi_bram_addr,\r
+                 BRAM_WR_D_IN  => spi_bram_wr_d,\r
+                 BRAM_RD_D_OUT => spi_bram_rd_d,\r
+                 BRAM_WE_OUT   => spi_bram_we,\r
+                 -- Status lines\r
+                 STAT                  => spi_debug --open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- data memory for SPI accesses\r
+------------------------------------------------------------------------------------\r
+THE_SPI_MEMORY: spi_databus_memory\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 BUS_ADDR_IN           => slv_addr(5*16+5 downto 5*16),\r
+                 BUS_READ_IN           => slv_read(5),\r
+                 BUS_WRITE_IN          => slv_write(5),\r
+                 BUS_ACK_OUT           => slv_ack(5),\r
+                 BUS_DATA_IN           => slv_data_wr(5*32+31 downto 5*32),\r
+                 BUS_DATA_OUT          => slv_data_rd(5*32+31 downto 5*32),\r
+                 -- state machine connections\r
+                 BRAM_ADDR_IN          => spi_bram_addr,\r
+                 BRAM_WR_D_OUT         => spi_bram_wr_d,\r
+                 BRAM_RD_D_IN          => spi_bram_rd_d,\r
+                 BRAM_WE_IN            => spi_bram_we, \r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+slv_busy(5) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- ADC0 SPI master\r
+------------------------------------------------------------------------------------\r
+THE_SPI_ADC0_MASTER: spi_adc_master\r
+generic map( RESET_VALUE_CTRL  => x"60" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(6),\r
+                 SLV_WRITE_IN          => slv_write(6),\r
+                 SLV_BUSY_OUT          => slv_busy(6),\r
+                 SLV_ACK_OUT           => slv_ack(6),\r
+                 SLV_DATA_IN           => slv_data_wr(6*32+31 downto 6*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(6*32+31 downto 6*32),\r
+                 -- SPI connections\r
+                 SPI_CS_OUT            => spi_adc0_cs_out,\r
+                 SPI_SDO_OUT           => spi_adc0_sdo_out,\r
+                 SPI_SCK_OUT           => spi_adc0_sck_out,\r
+                 -- ADC connections\r
+                 ADC_LOCKED_IN         => adc0_pll_locked_in,\r
+                 ADC_PD_OUT            => adc0_pd_out,\r
+                 ADC_RST_OUT           => adc0_rst_out,\r
+                 ADC_DEL_OUT           => adc0_del_out,\r
+                 -- APV connections\r
+                 APV_RST_OUT           => apv0_rst_out,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- ADC1 SPI master\r
+------------------------------------------------------------------------------------\r
+THE_SPI_ADC1_MASTER: spi_adc_master\r
+generic map( RESET_VALUE_CTRL  => x"60" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(7),\r
+                 SLV_WRITE_IN          => slv_write(7),\r
+                 SLV_BUSY_OUT          => slv_busy(7),\r
+                 SLV_ACK_OUT           => slv_ack(7),\r
+                 SLV_DATA_IN           => slv_data_wr(7*32+31 downto 7*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(7*32+31 downto 7*32),\r
+                 -- SPI connections\r
+                 SPI_CS_OUT            => spi_adc1_cs_out,\r
+                 SPI_SDO_OUT           => spi_adc1_sdo_out,\r
+                 SPI_SCK_OUT           => spi_adc1_sck_out,\r
+                 -- ADC connections\r
+                 ADC_LOCKED_IN         => adc1_pll_locked_in,\r
+                 ADC_PD_OUT            => adc1_pd_out,\r
+                 ADC_RST_OUT           => adc1_rst_out,\r
+                 ADC_DEL_OUT           => adc1_del_out,\r
+                 -- APV connections\r
+                 APV_RST_OUT           => apv1_rst_out,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- APV control / status registers\r
+------------------------------------------------------------------------------------\r
+THE_SLV_REGISTER_BANK: slv_register_bank\r
+generic map( RESET_VALUE       => x"0001" )\r
+port map( CLK_IN               => clk_in,\r
+                 RESET_IN              => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN   => slv_addr(8*16+3 downto 8*16),\r
+                 SLV_READ_IN   => slv_read(8),\r
+                 SLV_WRITE_IN  => slv_write(8),\r
+                 SLV_ACK_OUT   => slv_ack(8),\r
+                 SLV_DATA_IN   => slv_data_wr(8*32+31 downto 8*32),\r
+                 SLV_DATA_OUT  => slv_data_rd(8*32+31 downto 8*32),\r
+                 -- I/O to the backend\r
+                 BACKPLANE_IN  => backplane_in,\r
+                 CTRL_0_OUT    => ctrl_0_out,\r
+                 CTRL_1_OUT    => ctrl_1_out,\r
+                 CTRL_2_OUT    => ctrl_2_out,\r
+                 CTRL_3_OUT    => ctrl_3_out,\r
+                 CTRL_4_OUT    => ctrl_4_out,\r
+                 CTRL_5_OUT    => ctrl_5_out,\r
+                 CTRL_6_OUT    => ctrl_6_out,\r
+                 CTRL_7_OUT    => ctrl_7_out,\r
+                 CTRL_8_OUT    => ctrl_8_out,\r
+                 CTRL_9_OUT    => ctrl_9_out,\r
+                 CTRL_10_OUT   => ctrl_10_out,\r
+                 CTRL_11_OUT   => ctrl_11_out,\r
+                 CTRL_12_OUT   => ctrl_12_out,\r
+                 CTRL_13_OUT   => ctrl_13_out,\r
+                 CTRL_14_OUT   => ctrl_14_out,\r
+                 CTRL_15_OUT   => ctrl_15_out,\r
+                 STAT_0_IN             => stat_0_in,\r
+                 STAT_1_IN             => stat_1_in,\r
+                 STAT_2_IN             => stat_2_in,\r
+                 STAT_3_IN             => stat_3_in,\r
+                 STAT_4_IN             => stat_4_in,\r
+                 STAT_5_IN             => stat_5_in,\r
+                 STAT_6_IN             => stat_6_in,\r
+                 STAT_7_IN             => stat_7_in,\r
+                 STAT_8_IN             => stat_8_in,\r
+                 STAT_9_IN             => stat_9_in,\r
+                 STAT_10_IN    => stat_10_in,\r
+                 STAT_11_IN    => stat_11_in,\r
+                 STAT_12_IN    => stat_12_in,\r
+                 STAT_13_IN    => stat_13_in,\r
+                 STAT_14_IN    => stat_14_in,\r
+                 STAT_15_IN    => stat_15_in,\r
+                 -- Status lines\r
+                 STAT                  => open\r
+               );\r
+slv_busy(8) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- ADC level register\r
+------------------------------------------------------------------------------------\r
+THE_ADC_LVL_REG: slv_register\r
+generic map( RESET_VALUE       => x"d0_20_78_88" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in, -- general reset\r
+                 BUSY_IN                       => '0',\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(9),\r
+                 SLV_WRITE_IN          => slv_write(9),\r
+                 SLV_BUSY_OUT          => slv_busy(9),\r
+                 SLV_ACK_OUT           => slv_ack(9),\r
+                 SLV_DATA_IN           => slv_data_wr(9*32+31 downto 9*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(9*32+31 downto 9*32),\r
+                 -- I/O to the backend\r
+                 REG_DATA_IN           => ctrl_lvl,\r
+                 REG_DATA_OUT          => ctrl_lvl,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- trigger control register\r
+------------------------------------------------------------------------------------\r
+THE_TRG_CTRL_REG: slv_register\r
+generic map( RESET_VALUE       => x"10_10_10_10" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in, -- general reset\r
+                 BUSY_IN                       => '0',\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(10),\r
+                 SLV_WRITE_IN          => slv_write(10),\r
+                 SLV_BUSY_OUT          => slv_busy(10),\r
+                 SLV_ACK_OUT           => slv_ack(10),\r
+                 SLV_DATA_IN           => slv_data_wr(10*32+31 downto 10*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(10*32+31 downto 10*32),\r
+                 -- I/O to the backend\r
+                 REG_DATA_IN           => ctrl_trg,\r
+                 REG_DATA_OUT          => ctrl_trg,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+\r
+------------------------------------------------------------------------------------\r
+-- PLL control register\r
+------------------------------------------------------------------------------------\r
+THE_PLL_CTRL_REG: slv_half_register\r
+generic map( RESET_VALUE       => x"00_02" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in, -- general reset\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(11),\r
+                 SLV_WRITE_IN          => slv_write(11),\r
+                 SLV_ACK_OUT           => slv_ack(11),\r
+                 SLV_DATA_IN           => slv_data_wr(11*32+31 downto 11*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(11*32+31 downto 11*32),\r
+                 -- I/O to the backend\r
+                 STATUS_REG_IN         => status_pll_in,\r
+                 CTRL_REG_OUT          => ctrl_pll,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+slv_busy(11) <= '0';\r
+\r
+------------------------------------------------------------------------------------\r
+-- ADC0 snooper\r
+------------------------------------------------------------------------------------\r
+THE_ADC0_SNOOPER: slv_adc_snoop\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN           => slv_addr(12*16+9 downto 12*16),\r
+                 SLV_READ_IN           => slv_read(12),\r
+                 SLV_WRITE_IN          => slv_write(12),\r
+                 SLV_ACK_OUT           => slv_ack(12),\r
+                 SLV_DATA_IN           => slv_data_wr(12*32+31 downto 12*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(12*32+31 downto 12*32),\r
+                 -- I/O to the backend\r
+                 ADC_SEL_OUT           => adc0_sel_out,\r
+                 ADC_CLK_IN            => adc0_clk_in,\r
+                 ADC_DATA_IN           => adc0_data_in,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+slv_busy(12) <= '0';\r
+\r
+\r
+------------------------------------------------------------------------------------\r
+-- ADC1 snooper\r
+------------------------------------------------------------------------------------\r
+THE_ADC1_SNOOPER: slv_adc_snoop\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in,\r
+                 -- Slave bus\r
+                 SLV_ADDR_IN           => slv_addr(13*16+9 downto 13*16),\r
+                 SLV_READ_IN           => slv_read(13),\r
+                 SLV_WRITE_IN          => slv_write(13),\r
+                 SLV_ACK_OUT           => slv_ack(13),\r
+                 SLV_DATA_IN           => slv_data_wr(13*32+31 downto 13*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(13*32+31 downto 13*32),\r
+                 -- I/O to the backend\r
+                 ADC_SEL_OUT           => adc1_sel_out,\r
+                 ADC_CLK_IN            => adc1_clk_in,\r
+                 ADC_DATA_IN           => adc1_data_in,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+slv_busy(13) <= '0';\r
+\r
+       \r
+------------------------------------------------------------------------------------\r
+-- test register (normal)\r
+------------------------------------------------------------------------------------\r
+THE_GOOD_TEST_REG: slv_register\r
+generic map( RESET_VALUE       => x"dead_beef" )\r
+port map( CLK_IN                       => clk_in,\r
+                 RESET_IN                      => reset_in, -- general reset\r
+                 BUSY_IN                       => '0',\r
+                 -- Slave bus\r
+                 SLV_READ_IN           => slv_read(14),\r
+                 SLV_WRITE_IN          => slv_write(14),\r
+                 SLV_BUSY_OUT          => slv_busy(14),\r
+                 SLV_ACK_OUT           => slv_ack(14),\r
+                 SLV_DATA_IN           => slv_data_wr(14*32+31 downto 14*32),\r
+                 SLV_DATA_OUT          => slv_data_rd(14*32+31 downto 14*32),\r
+                 -- I/O to the backend\r
+                 REG_DATA_IN           => test_reg_in, --x"5a3c_87e1",\r
+                 REG_DATA_OUT          => test_reg_out,\r
+                 -- Status lines\r
+                 STAT                          => open\r
+               );\r
+\r
+\r
+\r
+\r
+-- unusable pins\r
+debug(63 downto 43) <= (others => '0');\r
+-- connected pins\r
+debug(42 downto 0)  <= (others => '0');\r
+\r
+-- input signals\r
+spi_sdi       <= spi_sdi_in;\r
+\r
+-- Output signals\r
+spi_cs_out    <= spi_cs;\r
+spi_sck_out   <= spi_sck;\r
+spi_sdo_out   <= spi_sdo;\r
+\r
+ctrl_lvl_out  <= ctrl_lvl;\r
+ctrl_trg_out  <= ctrl_trg;\r
+ctrl_pll_out  <= ctrl_pll;\r
+\r
+debug_out     <= debug;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_adc_la.vhd b/src/slv_adc_la.vhd
new file mode 100644 (file)
index 0000000..ba109d2
--- /dev/null
@@ -0,0 +1,246 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity slv_adc_la is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(9 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         ADC_SEL_OUT   : out   std_logic_vector(2 downto 0);   -- selects the ADC channel to snoop from\r
+         ADC_CLK_IN    : in    std_logic;                                              -- ADC reconstructed clock\r
+         ADC_DATA_IN   : in    std_logic_vector(11 downto 0);  -- ADC selected channel data\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_adc_la is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SLEEP,RD_RDY,RD_DEL0,RD_DEL1,WR_DEL0,WR_DEL1,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal arm_x                    : std_logic;\r
+       signal trg_x                    : std_logic;\r
+\r
+       signal ctrl_reg                 : std_logic_vector(15 downto 0);\r
+       signal status_reg               : std_logic_vector(31 downto 0);\r
+\r
+       signal rd_data                  : std_logic_vector(15 downto 0);\r
+\r
+       -- 40MHz clock domain!!!\r
+       signal wr_data                  : std_logic_vector(15 downto 0);\r
+       signal wr_addr                  : std_logic_vector(9 downto 0);\r
+       signal wr_we                    : std_logic;\r
+       signal reset_40mhz              : std_logic;\r
+       signal arm_40mhz                : std_logic;\r
+       signal trg_40mhz                : std_logic;\r
+\r
+       signal sm_clear                 : std_logic;\r
+       signal sm_run                   : std_logic;\r
+       signal sm_sample                : std_logic;\r
+       signal sm_ready                 : std_logic;\r
+       signal sm_last                  : std_logic;\r
+       signal sm_bsm                   : std_logic_vector(3 downto 0);\r
+       \r
+begin\r
+\r
+-- Fake\r
+stat(31 downto 25) <= (others => '0');\r
+stat(24)           <= sm_last;\r
+stat(23)           <= sm_ready;\r
+stat(22)           <= sm_sample;\r
+stat(21)           <= sm_run;\r
+stat(20)           <= sm_clear;\r
+stat(19 downto 16) <= sm_bsm;\r
+stat(15 downto 0)  <= ctrl_reg;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_DEL0;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_DEL0;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_DEL0    =>      NEXT_STATE <= RD_DEL1;\r
+               when RD_DEL1    =>      NEXT_STATE <= RD_RDY;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_DEL0    =>      NEXT_STATE <= WR_DEL1;\r
+               when WR_DEL1    =>      NEXT_STATE <= WR_RDY;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+THE_RST_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset_40mhz\r
+               );\r
+\r
+arm_x <= slv_data_in(30) and store_wr;\r
+\r
+THE_ARM_PULSE_SYNC: pulse_sync\r
+port map( CLK_A_IN                     => clk_in,\r
+                 RESET_A_IN            => reset_in,\r
+                 PULSE_A_IN            => arm_x,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset_40mhz,\r
+                 PULSE_B_OUT           => arm_40mhz\r
+               );\r
+\r
+trg_x <= slv_data_in(31) and store_wr;\r
+\r
+THE_TRG_PULSE_SYNC: pulse_sync\r
+port map( CLK_A_IN                     => clk_in,\r
+                 RESET_A_IN            => reset_in,\r
+                 PULSE_A_IN            => trg_x,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset_40mhz,\r
+                 PULSE_B_OUT           => trg_40mhz\r
+               );\r
+\r
+THE_LOGIC_ANALYZER: logic_analyzer\r
+port map( CLK_IN               => adc_clk_in,\r
+                 RESET_IN              => reset_40mhz,\r
+                 -- control signals\r
+                 ARM_IN                => arm_40mhz, -- BUGBUGBUG\r
+                 TRG_IN                => trg_40mhz, -- BUGBUGBUG\r
+                 MAX_SAMPLE_IN => ctrl_reg(9 downto 0),\r
+                 -- status signals\r
+                 SM_ADDR_OUT   => wr_addr,\r
+                 SM_CE_OUT             => open,\r
+                 SM_WE_OUT             => wr_we,\r
+                 CLEAR_OUT             => sm_clear,\r
+                 RUN_OUT               => sm_run,\r
+                 SAMPLE_OUT    => sm_sample,\r
+                 READY_OUT             => sm_ready,\r
+                 LAST_OUT              => sm_last,\r
+                 -- Status lines\r
+                 BSM_OUT               => sm_bsm,\r
+                 STAT                  => open\r
+               );\r
+\r
+wr_data(15) <= sm_clear;\r
+wr_data(14) <= sm_run;\r
+wr_data(13) <= sm_sample;\r
+wr_data(12) <= sm_last;\r
+wr_data(11 downto 0) <= adc_data_in;\r
+\r
+THE_ADC0_SNOOP_MEM: adc_snoop_mem\r
+port map( WRADDRESS            => wr_addr,\r
+                 DATA                  => wr_data,\r
+                 WE                    => wr_we,\r
+                 WRCLOCK               => adc_clk_in,\r
+                 WRCLOCKEN             => '1',\r
+                 RDADDRESS             => slv_addr_in, \r
+                 RDCLOCK               => clk_in,\r
+                 RDCLOCKEN             => '1',\r
+                 RESET                 => reset_in,\r
+                 Q                             => rd_data\r
+               );\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       ctrl_reg <= (others => '0');\r
+               elsif( store_wr = '1' ) then\r
+                       ctrl_reg <= slv_data_in(15 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       status_reg <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       status_reg <= b"0000_00" & wr_addr & rd_data;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= status_reg;\r
+\r
+adc_sel_out  <= ctrl_reg(14 downto 12);\r
+\r
+end Behavioral;\r
diff --git a/src/slv_adc_snoop.vhd b/src/slv_adc_snoop.vhd
new file mode 100644 (file)
index 0000000..d130d70
--- /dev/null
@@ -0,0 +1,209 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity slv_adc_snoop is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(9 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         ADC_SEL_OUT   : out   std_logic_vector(2 downto 0);   -- selects the ADC channel to snoop from\r
+         ADC_CLK_IN    : in    std_logic;                                              -- ADC reconstructed clock\r
+         ADC_DATA_IN   : in    std_logic_vector(11 downto 0);  -- ADC selected channel data\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_adc_snoop is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SLEEP,RD_RDY,RD_DEL0,RD_DEL1,WR_DEL0,WR_DEL1,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal ctrl_reg                 : std_logic_vector(15 downto 0);\r
+       signal status_reg               : std_logic_vector(31 downto 0);\r
+\r
+       signal rd_data                  : std_logic_vector(15 downto 0);\r
+\r
+       -- 40MHz clock domain!!!\r
+       signal wr_data                  : std_logic_vector(15 downto 0);\r
+       signal wr_ctr                   : std_logic_vector(9 downto 0);\r
+       signal rst_wr_ctr               : std_logic;\r
+       signal ce_wr_ctr                : std_logic;\r
+       signal reset                    : std_logic;\r
+\r
+begin\r
+\r
+-- Fake\r
+stat(31 downto 18) <= (others => '0');\r
+stat(17)           <= rst_wr_ctr;\r
+stat(16)           <= ce_wr_ctr;\r
+stat(15 downto 0)  <= ctrl_reg;\r
+       \r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_DEL0;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_DEL0;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_DEL0    =>      NEXT_STATE <= RD_DEL1;\r
+               when RD_DEL1    =>      NEXT_STATE <= RD_RDY;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_DEL0    =>      NEXT_STATE <= WR_DEL1;\r
+               when WR_DEL1    =>      NEXT_STATE <= WR_RDY;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+THE_RESET_SYNC: state_sync\r
+port map( STATE_A_IN           => reset_in,\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => '0',\r
+                 STATE_B_OUT           => reset\r
+               );\r
+\r
+THE_RST_SYNC: state_sync\r
+port map( STATE_A_IN           => ctrl_reg(15),\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset,\r
+                 STATE_B_OUT           => rst_wr_ctr\r
+               );\r
+\r
+THE_CE_SYNC: state_sync\r
+port map( STATE_A_IN           => ctrl_reg(14),\r
+                 CLK_B_IN                      => adc_clk_in,\r
+                 RESET_B_IN            => reset,\r
+                 STATE_B_OUT           => ce_wr_ctr\r
+               );\r
+\r
+THE_WR_CTR_PROC: process( adc_clk_in )\r
+begin\r
+       if( rising_edge(adc_clk_in) ) then\r
+               if   ( (reset = '1') or (rst_wr_ctr = '1') ) then\r
+                       wr_ctr <= (others => '0');\r
+               elsif( ce_wr_ctr = '1' ) then\r
+                       wr_ctr <= wr_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process THE_WR_CTR_PROC;\r
+\r
+wr_data <= x"0" & adc_data_in;\r
+\r
+THE_ADC0_SNOOP_MEM: adc_snoop_mem\r
+port map( WRADDRESS            => wr_ctr,\r
+                 DATA                  => wr_data,\r
+                 WE                    => ce_wr_ctr,\r
+                 WRCLOCK               => adc_clk_in,\r
+                 WRCLOCKEN             => '1',\r
+                 RDADDRESS             => slv_addr_in, \r
+                 RDCLOCK               => clk_in,\r
+                 RDCLOCKEN             => '1',\r
+                 RESET                 => reset_in,\r
+                 Q                             => rd_data\r
+               );\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       ctrl_reg <= (others => '0');\r
+               elsif( store_wr = '1' ) then\r
+                       ctrl_reg <= slv_data_in(15 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       status_reg <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       status_reg <= b"0000_00" & wr_ctr & rd_data;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= status_reg;\r
+\r
+adc_sel_out  <= ctrl_reg(2 downto 0);\r
+\r
+end Behavioral;\r
diff --git a/src/slv_half_register.vhd b/src/slv_half_register.vhd
new file mode 100644 (file)
index 0000000..a4a1723
--- /dev/null
@@ -0,0 +1,150 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity slv_half_register is\r
+generic( RESET_VALUE   : std_logic_vector(15 downto 0) := x"0000" );\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         STATUS_REG_IN : in    std_logic_vector(15 downto 0);\r
+         CTRL_REG_OUT  : out   std_logic_vector(15 downto 0);\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_half_register is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SLEEP,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal ctrl_reg                 : std_logic_vector(15 downto 0);\r
+\r
+       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- read back data\r
+\r
+begin\r
+\r
+-- Fake\r
+stat <= (others => '0');\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       ctrl_reg <= (others => '0');\r
+               elsif( store_wr = '1' ) then\r
+                       ctrl_reg <= slv_data_in(15 downto 0);\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_out <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       reg_slv_data_out <= status_reg_in & ctrl_reg;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= reg_slv_data_out;\r
+\r
+---------------------------------------------------------\r
+-- signals to backend                                  --\r
+---------------------------------------------------------\r
+\r
+ctrl_reg_out <= ctrl_reg;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_memory_true.vhd b/src/slv_memory_true.vhd
new file mode 100644 (file)
index 0000000..2d4037b
--- /dev/null
@@ -0,0 +1,175 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity slv_memory_true is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         BUSY_IN               : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(8 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_BUSY_OUT  : out   std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         MEM_CLK_IN    : in    std_logic;\r
+         MEM_ADDR_IN   : in    std_logic_vector(7 downto 0);\r
+         MEM_DATA_OUT  : out   std_logic_vector(17 downto 0);\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_memory_true is\r
+\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_busy_x               : std_logic;\r
+       signal slv_busy                 : std_logic;\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal wr_addr                  : std_logic_vector(9 downto 0); -- some bits are masked\r
+       signal mem_data                 : std_logic_vector(17 downto 0);\r
+       signal rd_addr                  : std_logic_vector(9 downto 0); -- some bits are masked\r
+       signal readback_data    : std_logic_vector(17 downto 0);\r
+\r
+       signal reg_busy                 : std_logic;\r
+\r
+begin\r
+\r
+-- Fake\r
+reg_busy <= busy_in;\r
+stat <= (others => '0');\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_busy      <= '0';\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_busy      <= slv_busy_x;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, reg_busy )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_busy_x <= '0';\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( (reg_busy = '0') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( (reg_busy = '0') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       elsif( (reg_busy = '1') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                       elsif( (reg_busy = '1') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when RD_BSY             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when WR_BSY             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+wr_addr <= b"00" & slv_addr_in(7 downto 0);\r
+rd_addr <= b"00" & mem_addr_in(7 downto 0);\r
+\r
+-- one EBR used for one APV (A: TRBnet side, B: statemachines)\r
+THE_PED_THR_MEM: ped_thr_mem_true\r
+port map( DATAINA      => slv_data_in(17 downto 0),\r
+                 ADDRESSA      => wr_addr,\r
+                 CLOCKA        => clk_in,\r
+                 CLOCKENA      => '1', \r
+                 WRA           => store_wr, \r
+                 RESETA        => reset_in,\r
+                 QA            => readback_data,\r
+                 DATAINB       => b"00_0000_0000_0000_0000", -- not used!\r
+                 ADDRESSB      => rd_addr, \r
+                 CLOCKB        => mem_clk_in, \r
+                 CLOCKENB      => '1', \r
+                 WRB           => '0', -- no write by statemachines!\r
+                 RESETB        => reset_in, \r
+                 QB            => mem_data\r
+               );\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_busy_out <= slv_busy;\r
+slv_data_out <= b"0000_0000_0000_00" & readback_data;\r
+\r
+---------------------------------------------------------\r
+-- signals to backend                                  --\r
+---------------------------------------------------------\r
+\r
+mem_data_out <= mem_data;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_onewire_dpram.lpc b/src/slv_onewire_dpram.lpc
new file mode 100644 (file)
index 0000000..91cdd37
--- /dev/null
@@ -0,0 +1,50 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=RAM_DP\r
+CoreRevision=6.1\r
+ModuleName=slv_onewire_dpram\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=08/11/2009\r
+Time=14:48:40\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+RAddress=64\r
+RData=32\r
+WAddress=128\r
+WData=16\r
+enByte=0\r
+ByteSize=9\r
+adPipeline=0\r
+inPipeline=0\r
+outPipeline=0\r
+MOR=0\r
+InData=Registered\r
+AdControl=Registered\r
+MemFile=\r
+MemFormat=bin\r
+Reset=Sync\r
+GSR=Enabled\r
+Pad=0\r
+EnECC=0\r
+Optimization=Speed\r
+EnSleep=ENABLED\r
+Pipeline=0\r
diff --git a/src/slv_onewire_dpram.srp b/src/slv_onewire_dpram.srp
new file mode 100644 (file)
index 0000000..28e8aa5
--- /dev/null
@@ -0,0 +1,28 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Tue Aug 11 14:48:40 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n slv_onewire_dpram -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 6 -rwidth 32 -waddr_width 7 -wwidth 16 -rnum_words 64 -wnum_words 128 -resetmode SYNC -cascade -1 -e 
+    Circuit name     : slv_onewire_dpram
+    Module type      : RAM_DP
+    Module Version   : 6.1
+    Ports            : 
+       Inputs       : WrAddress[6:0], RdAddress[5:0], Data[15:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn
+       Outputs      : Q[31:0]
+    I/O buffer       : not inserted
+    EDIF output      : suppressed
+    VHDL output      : slv_onewire_dpram.vhd
+    VHDL template    : slv_onewire_dpram_tmpl.vhd
+    VHDL testbench    : tb_slv_onewire_dpram_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : slv_onewire_dpram.srp
+    Element Usage    :
+         DP16KB : 1
+    Estimated Resource Usage:
+            EBR : 1
diff --git a/src/slv_onewire_dpram.vhd b/src/slv_onewire_dpram.vhd
new file mode 100644 (file)
index 0000000..b3f879c
--- /dev/null
@@ -0,0 +1,194 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type bram -wp 10 -rp 0011 -rdata_width 32 -data_width 16 -num_rows 128 -resetmode SYNC -cascade -1 -e 
+
+-- Tue Aug 11 14:48:40 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity slv_onewire_dpram is
+    port (
+        WrAddress: in  std_logic_vector(6 downto 0); 
+        RdAddress: in  std_logic_vector(5 downto 0); 
+        Data: in  std_logic_vector(15 downto 0); 
+        WE: in  std_logic; 
+        RdClock: in  std_logic; 
+        RdClockEn: in  std_logic; 
+        Reset: in  std_logic; 
+        WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; 
+        Q: out  std_logic_vector(31 downto 0));
+end slv_onewire_dpram;
+
+architecture Structure of slv_onewire_dpram is
+
+    -- internal signal declarations
+    signal scuba_vhi: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute GSR : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute MEM_LPC_FILE of slv_onewire_dpram_0_0_0 : label is "slv_onewire_dpram.lpc";
+    attribute MEM_INIT_FILE of slv_onewire_dpram_0_0_0 : label is "";
+    attribute CSDECODE_B of slv_onewire_dpram_0_0_0 : label is "0b000";
+    attribute CSDECODE_A of slv_onewire_dpram_0_0_0 : label is "0b000";
+    attribute WRITEMODE_B of slv_onewire_dpram_0_0_0 : label is "NORMAL";
+    attribute WRITEMODE_A of slv_onewire_dpram_0_0_0 : label is "NORMAL";
+    attribute GSR of slv_onewire_dpram_0_0_0 : label is "DISABLED";
+    attribute RESETMODE of slv_onewire_dpram_0_0_0 : label is "SYNC";
+    attribute REGMODE_B of slv_onewire_dpram_0_0_0 : label is "NOREG";
+    attribute REGMODE_A of slv_onewire_dpram_0_0_0 : label is "NOREG";
+    attribute DATA_WIDTH_B of slv_onewire_dpram_0_0_0 : label is "36";
+    attribute DATA_WIDTH_A of slv_onewire_dpram_0_0_0 : label is "18";
+
+begin
+    -- component instantiation statements
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    slv_onewire_dpram_0_0_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "SYNC", 
+        REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=>  36, 
+        DATA_WIDTH_A=>  18)
+        -- synopsys translate_on
+        port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), 
+            DIA3=>Data(3), DIA4=>Data(4), DIA5=>Data(5), DIA6=>Data(6), 
+            DIA7=>Data(7), DIA8=>Data(8), DIA9=>Data(9), DIA10=>Data(10), 
+            DIA11=>Data(11), DIA12=>Data(12), DIA13=>Data(13), 
+            DIA14=>Data(14), DIA15=>Data(15), DIA16=>scuba_vlo, 
+            DIA17=>scuba_vlo, ADA0=>scuba_vhi, ADA1=>scuba_vhi, 
+            ADA2=>scuba_vlo, ADA3=>scuba_vlo, ADA4=>WrAddress(0), 
+            ADA5=>WrAddress(1), ADA6=>WrAddress(2), ADA7=>WrAddress(3), 
+            ADA8=>WrAddress(4), ADA9=>WrAddress(5), ADA10=>WrAddress(6), 
+            ADA11=>scuba_vlo, ADA12=>scuba_vlo, ADA13=>scuba_vlo, 
+            CEA=>WrClockEn, CLKA=>WrClock, WEA=>WE, CSA0=>scuba_vlo, 
+            CSA1=>scuba_vlo, CSA2=>scuba_vlo, RSTA=>Reset, 
+            DIB0=>scuba_vlo, DIB1=>scuba_vlo, DIB2=>scuba_vlo, 
+            DIB3=>scuba_vlo, DIB4=>scuba_vlo, DIB5=>scuba_vlo, 
+            DIB6=>scuba_vlo, DIB7=>scuba_vlo, DIB8=>scuba_vlo, 
+            DIB9=>scuba_vlo, DIB10=>scuba_vlo, DIB11=>scuba_vlo, 
+            DIB12=>scuba_vlo, DIB13=>scuba_vlo, DIB14=>scuba_vlo, 
+            DIB15=>scuba_vlo, DIB16=>scuba_vlo, DIB17=>scuba_vlo, 
+            ADB0=>scuba_vlo, ADB1=>scuba_vlo, ADB2=>scuba_vlo, 
+            ADB3=>scuba_vlo, ADB4=>scuba_vlo, ADB5=>RdAddress(0), 
+            ADB6=>RdAddress(1), ADB7=>RdAddress(2), ADB8=>RdAddress(3), 
+            ADB9=>RdAddress(4), ADB10=>RdAddress(5), ADB11=>scuba_vlo, 
+            ADB12=>scuba_vlo, ADB13=>scuba_vlo, CEB=>RdClockEn, 
+            CLKB=>RdClock, WEB=>scuba_vlo, CSB0=>scuba_vlo, 
+            CSB1=>scuba_vlo, CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>Q(0), 
+            DOA1=>Q(1), DOA2=>Q(2), DOA3=>Q(3), DOA4=>Q(4), DOA5=>Q(5), 
+            DOA6=>Q(6), DOA7=>Q(7), DOA8=>Q(8), DOA9=>Q(9), DOA10=>Q(10), 
+            DOA11=>Q(11), DOA12=>Q(12), DOA13=>Q(13), DOA14=>Q(14), 
+            DOA15=>Q(15), DOA16=>open, DOA17=>open, DOB0=>Q(16), 
+            DOB1=>Q(17), DOB2=>Q(18), DOB3=>Q(19), DOB4=>Q(20), 
+            DOB5=>Q(21), DOB6=>Q(22), DOB7=>Q(23), DOB8=>Q(24), 
+            DOB9=>Q(25), DOB10=>Q(26), DOB11=>Q(27), DOB12=>Q(28), 
+            DOB13=>Q(29), DOB14=>Q(30), DOB15=>Q(31), DOB16=>open, 
+            DOB17=>open);
+
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of slv_onewire_dpram is
+    for Structure
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/slv_onewire_dpram_generate.log b/src/slv_onewire_dpram_generate.log
new file mode 100644 (file)
index 0000000..8173499
--- /dev/null
@@ -0,0 +1,44 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Tue Aug 11 14:48:40 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n slv_onewire_dpram -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -device LFE2M100E -type ramdps -raddr_width 6 -rwidth 32 -waddr_width 7 -wwidth 16 -rnum_words 64 -wnum_words 128 -resetmode SYNC -cascade -1 -e \r
+    Circuit name     : slv_onewire_dpram\r
+    Module type      : RAM_DP\r
+    Module Version   : 6.1\r
+    Ports            : \r
+       Inputs       : WrAddress[6:0], RdAddress[5:0], Data[15:0], WE, RdClock, RdClockEn, Reset, WrClock, WrClockEn\r
+       Outputs      : Q[31:0]\r
+    I/O buffer       : not inserted\r
+    EDIF output      : suppressed\r
+    VHDL output      : slv_onewire_dpram.vhd\r
+    VHDL template    : slv_onewire_dpram_tmpl.vhd\r
+    VHDL testbench   : tb_slv_onewire_dpram_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : slv_onewire_dpram.srp\r
+    Estimated Resource Usage:\r
+            EBR : 1\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: slv_onewire_dpram.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/slv_onewire_dpram_tmpl.vhd b/src/slv_onewire_dpram_tmpl.vhd
new file mode 100644 (file)
index 0000000..7abb4e2
--- /dev/null
@@ -0,0 +1,19 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 6.1
+-- Tue Aug 11 14:48:40 2009
+
+-- parameterized module component declaration
+component slv_onewire_dpram
+    port (WrAddress: in  std_logic_vector(6 downto 0); 
+        RdAddress: in  std_logic_vector(5 downto 0); 
+        Data: in  std_logic_vector(15 downto 0); WE: in  std_logic; 
+        RdClock: in  std_logic; RdClockEn: in  std_logic; 
+        Reset: in  std_logic; WrClock: in  std_logic; 
+        WrClockEn: in  std_logic; Q: out  std_logic_vector(31 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : slv_onewire_dpram
+    port map (WrAddress(6 downto 0)=>__, RdAddress(5 downto 0)=>__, Data(15 downto 0)=>__, 
+        WE=>__, RdClock=>__, RdClockEn=>__, Reset=>__, WrClock=>__, 
+        WrClockEn=>__, Q(31 downto 0)=>__);
diff --git a/src/slv_onewire_memory.vhd b/src/slv_onewire_memory.vhd
new file mode 100644 (file)
index 0000000..2c23121
--- /dev/null
@@ -0,0 +1,221 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity slv_onewire_memory is\r
+port( CLK_IN                   : in    std_logic;\r
+         RESET_IN                      : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN           : in    std_logic_vector(5 downto 0);\r
+         SLV_READ_IN           : in    std_logic;\r
+         SLV_WRITE_IN          : in    std_logic;\r
+         SLV_ACK_OUT           : out   std_logic;\r
+         SLV_BUSY_OUT          : out   std_logic;\r
+         SLV_DATA_OUT          : out   std_logic_vector(31 downto 0);\r
+         -- backplane identifier\r
+         BACKPLANE_IN          : in    std_logic_vector(2 downto 0);\r
+         -- 1Wire lines\r
+         ONEWIRE_START_IN      : in    std_logic;\r
+         ONEWIRE_INOUT         : inout std_logic_vector(15 downto 0);\r
+         BP_ONEWIRE_INOUT      : inout std_logic;\r
+         -- Status lines\r
+         STAT                          : out   std_logic_vector(63 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_onewire_memory is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal slv_busy                 : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       -- for replacing the lost FE with BP data\r
+       signal wr_addr_q                : std_logic_vector(6 downto 0); -- some bits are masked\r
+       signal wr_data_q                : std_logic_vector(15 downto 0);\r
+       signal wr_we_q                  : std_logic;\r
+\r
+       signal wr_addr                  : std_logic_vector(6 downto 0); -- some bits are masked\r
+       signal wr_bp_data               : std_logic_vector(15 downto 0);\r
+       signal wr_data                  : std_logic_vector(15 downto 0);\r
+       signal wr_we                    : std_logic;\r
+       signal buf_slv_data_out : std_logic_vector(31 downto 0);\r
+\r
+       signal read_address             : std_logic_vector(5 downto 0);\r
+       signal missing_one              : std_logic_vector(3 downto 0); -- missing APV FE <-> backplane\r
+       signal overlay                  : std_logic;\r
+\r
+       signal onewire_bsm              : std_logic_vector(7 downto 0);\r
+\r
+begin\r
+\r
+-- Fake\r
+stat(63 downto 40) <= (others => '0');\r
+\r
+stat(39 downto 32) <= buf_slv_data_out(7 downto 0);\r
+stat(31 downto 26) <= slv_addr_in;\r
+stat(25)           <= slv_write_in;\r
+stat(24)           <= slv_read_in;\r
+stat(23)           <= store_wr;\r
+stat(22)           <= store_rd;\r
+stat(21)           <= slv_ack;\r
+stat(20)           <= slv_busy;\r
+stat(19)           <= wr_we;\r
+stat(18 downto 12) <= wr_addr;\r
+stat(11 downto 4)  <= wr_data(7 downto 0);\r
+stat(3 downto 0)   <= onewire_bsm(3 downto 0);\r
+\r
+-- Remap the 1Wire chips to Luigi's world\r
+THE_ADC_ONEWIRE_MAP_MEM: adc_onewire_map_mem\r
+port map( ADDRESS(6 downto 4)  => backplane_in,\r
+                 ADDRESS(3 downto 0)   => slv_addr_in(5 downto 2),\r
+                 Q                                             => read_address(5 downto 2)\r
+               );\r
+read_address(1 downto 0) <= slv_addr_in(1 downto 0);\r
+\r
+-- One APV FE connector is missing ("Roman's FE"), and replace the \r
+-- 1Wire ID by the backplane\r
+THE_ONEWIRE_SPARE_ONE: onewire_spare_one\r
+port map( ADDRESS      => backplane_in,\r
+                 Q                     => missing_one\r
+               );\r
+\r
+-- Check if we need to replace data\r
+overlay <= '1' when (wr_addr(6 downto 3) = missing_one) else '0';\r
+\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+\r
+---------------------------------------------------------\r
+-- 1 Wire master                                       --\r
+---------------------------------------------------------\r
+THE_ONEWIRE_MASTER: onewire_master\r
+generic map( CLK_PERIOD                => 10 )\r
+port map( CLK                          => clk_in,\r
+                 RESET                         => reset_in,\r
+                 READOUT_ENABLE_IN     => store_wr,\r
+                 -- connection to 1-wire interface (16 APV FEs)\r
+                 ONEWIRE                       => onewire_inout,\r
+                 BP_ONEWIRE            => bp_onewire_inout,\r
+                 -- connection to external DPRAM for slow control readout\r
+                 BP_DATA_OUT           => wr_bp_data, \r
+                 DATA_OUT                      => wr_data,\r
+                 ADDR_OUT                      => wr_addr,\r
+                 WRITE_OUT                     => wr_we,\r
+                 BUSY_OUT                      => slv_busy, -- could be used...\r
+                 -- debug\r
+                 BSM_OUT                       => onewire_bsm,\r
+                 STAT                          => open\r
+                );\r
+\r
+---------------------------------------------------------\r
+-- data replacing                                      --\r
+---------------------------------------------------------\r
+THE_DATA_REPLACE_PROC: process(clk_in)\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               wr_addr_q <= wr_addr;\r
+               wr_we_q   <= wr_we;\r
+               if( overlay = '1' ) then\r
+                       wr_data_q <= wr_bp_data;\r
+               else\r
+                       wr_data_q <= wr_data;\r
+               end if;\r
+       end if;\r
+end process THE_DATA_REPLACE_PROC;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+THE_SLV_ONEWIRE_DPRAM: slv_onewire_dpram\r
+port map( WRADDRESS    => wr_addr_q,\r
+                 RDADDRESS     => read_address,\r
+                 DATA          => wr_data_q,\r
+                 WE            => wr_we_q,\r
+                 RDCLOCK       => clk_in,\r
+                 RDCLOCKEN     => '1',\r
+                 RESET         => reset_in,\r
+                 WRCLOCK       => clk_in,\r
+                 WRCLOCKEN     => '1',\r
+                 Q                     => buf_slv_data_out\r
+                );\r
+\r
+\r
+\r
+-- output signals\r
+slv_data_out <= buf_slv_data_out;\r
+slv_ack_out  <= slv_ack;\r
+slv_busy_out <= slv_busy;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_ped_thr_mem.vhd b/src/slv_ped_thr_mem.vhd
new file mode 100644 (file)
index 0000000..12c2e3c
--- /dev/null
@@ -0,0 +1,249 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity slv_ped_thr_mem is\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(10 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- backplane identifier\r
+         BACKPLANE_IN  : in    std_logic_vector(2 downto 0);\r
+         -- I/O to the backend\r
+         MEM_CLK_IN    : in    std_logic;\r
+         MEM_ADDR_IN   : in    std_logic_vector(6 downto 0);\r
+         MEM_0_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_1_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_2_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_3_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_4_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_5_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_6_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_7_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_8_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_9_D_OUT   : out   std_logic_vector(17 downto 0);\r
+         MEM_10_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         MEM_11_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         MEM_12_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         MEM_13_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         MEM_14_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         MEM_15_D_OUT  : out   std_logic_vector(17 downto 0);\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_ped_thr_mem is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_RDY,RD_DEL0,RD_DEL1,WR_DEL0,WR_DEL1,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- statemachine signals\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal block_addr               : std_logic_vector(3 downto 0);\r
+\r
+       type ped_data_t is array (0 to 15) of std_logic_vector(17 downto 0);\r
+       signal ped_data                         : ped_data_t;\r
+       signal mem_data                         : ped_data_t;\r
+\r
+       signal mem_wr_x                         : std_logic_vector(15 downto 0);\r
+       signal mem_wr                           : std_logic_vector(15 downto 0);\r
+       signal mem_sel                          : std_logic_vector(15 downto 0);\r
+\r
+       signal rdback_data                      : std_logic_vector(17 downto 0);\r
+       \r
+begin\r
+\r
+---------------------------------------------------------\r
+-- Mapping of backplanes                               --\r
+---------------------------------------------------------\r
+THE_APV_ADC_MAP_MEM: apv_adc_map_mem\r
+port map( ADDRESS(6 downto 4)  => backplane_in,\r
+                 ADDRESS(3 downto 0)   => slv_addr_in(10 downto 7),\r
+                 Q                                             => block_addr\r
+                );\r
+\r
+THE_MEM_SEL_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case block_addr is\r
+                       when x"0"       =>      mem_sel     <= b"0000_0000_0000_0001";\r
+                                                       rdback_data <= mem_data(0);\r
+                       when x"1"       =>      mem_sel     <= b"0000_0000_0000_0010";\r
+                                                       rdback_data <= mem_data(1);\r
+                       when x"2"       =>      mem_sel     <= b"0000_0000_0000_0100";\r
+                                                       rdback_data <= mem_data(2);\r
+                       when x"3"       =>      mem_sel     <= b"0000_0000_0000_1000";\r
+                                                       rdback_data <= mem_data(3);\r
+                       when x"4"       =>      mem_sel     <= b"0000_0000_0001_0000";\r
+                                                       rdback_data <= mem_data(4);\r
+                       when x"5"       =>      mem_sel     <= b"0000_0000_0010_0000";\r
+                                                       rdback_data <= mem_data(5);\r
+                       when x"6"       =>      mem_sel     <= b"0000_0000_0100_0000";\r
+                                                       rdback_data <= mem_data(6);\r
+                       when x"7"       =>      mem_sel     <= b"0000_0000_1000_0000";\r
+                                                       rdback_data <= mem_data(7);\r
+                       when x"8"       =>      mem_sel     <= b"0000_0001_0000_0000";\r
+                                                       rdback_data <= mem_data(8);\r
+                       when x"9"       =>      mem_sel     <= b"0000_0010_0000_0000";\r
+                                                       rdback_data <= mem_data(9);\r
+                       when x"a"       =>      mem_sel     <= b"0000_0100_0000_0000";\r
+                                                       rdback_data <= mem_data(10);\r
+                       when x"b"       =>      mem_sel     <= b"0000_1000_0000_0000";\r
+                                                       rdback_data <= mem_data(11);\r
+                       when x"c"       =>      mem_sel     <= b"0001_0000_0000_0000";\r
+                                                       rdback_data <= mem_data(12);\r
+                       when x"d"       =>      mem_sel     <= b"0010_0000_0000_0000";\r
+                                                       rdback_data <= mem_data(13);\r
+                       when x"e"       =>      mem_sel     <= b"0100_0000_0000_0000";\r
+                                                       rdback_data <= mem_data(14);\r
+                       when x"f"       =>      mem_sel     <= b"1000_0000_0000_0000";\r
+                                                       rdback_data <= mem_data(15);\r
+                       when others     =>      mem_sel     <= b"0000_0000_0000_0000"; -- never used\r
+                                                       rdback_data <= (others => '0');\r
+               end case;\r
+       end if;\r
+end process THE_MEM_SEL_PROC;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_DEL0;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_DEL0;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_DEL0    =>      NEXT_STATE <= RD_DEL1;\r
+               when RD_DEL1    =>      NEXT_STATE <= RD_RDY;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_DEL0    =>      NEXT_STATE <= WR_DEL1;\r
+               when WR_DEL1    =>      NEXT_STATE <= WR_RDY;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- block memories                                      --\r
+---------------------------------------------------------\r
+GEN_PED_MEM: for i in 0 to 15 generate         \r
+       -- Port A: SLV_BUS\r
+       -- Port B: state machine\r
+       THE_PED_MEM: ped_thr_true \r
+       port map( DATAINA       => slv_data_in(17 downto 0), \r
+                         DATAINB       => b"00_0000_0000_0000_0000",\r
+                         ADDRESSA      => slv_addr_in(6 downto 0),\r
+                         ADDRESSB      => mem_addr_in,\r
+                         CLOCKA        => clk_in,\r
+                         CLOCKB        => mem_clk_in,\r
+                         CLOCKENA      => '1',\r
+                         CLOCKENB      => '1',\r
+                         WRA           => mem_wr(i), -- BUGBUGBUG\r
+                         WRB           => '0', -- state machine never writes!\r
+                         RESETA        => reset_in,\r
+                         RESETB        => reset_in,\r
+                         QA            => mem_data(i),\r
+                         QB            => ped_data(i)\r
+                       );\r
+       -- Write signals\r
+       mem_wr_x(i) <= '1' when ( (mem_sel(i) = '1') and (store_wr = '1') ) else '0';\r
+end generate GEN_PED_MEM;\r
+\r
+-- Synchronize\r
+THE_SYNC_PROC: process(clk_in)\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               mem_wr <= mem_wr_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+---------------------------------------------------------\r
+-- output signals                                      --\r
+---------------------------------------------------------\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= b"0000_0000_0000_00" & rdback_data;\r
+\r
+mem_0_d_out  <= ped_data(0);\r
+mem_1_d_out  <= ped_data(1);\r
+mem_2_d_out  <= ped_data(2);\r
+mem_3_d_out  <= ped_data(3);\r
+mem_4_d_out  <= ped_data(4);\r
+mem_5_d_out  <= ped_data(5);\r
+mem_6_d_out  <= ped_data(6);\r
+mem_7_d_out  <= ped_data(7);\r
+mem_8_d_out  <= ped_data(8);\r
+mem_9_d_out  <= ped_data(9);\r
+mem_10_d_out <= ped_data(10);\r
+mem_11_d_out <= ped_data(11);\r
+mem_12_d_out <= ped_data(12);\r
+mem_13_d_out <= ped_data(13);\r
+mem_14_d_out <= ped_data(14);\r
+mem_15_d_out <= ped_data(15);\r
+\r
+stat(31 downto 20) <= (others => '0');\r
+stat(19 downto 16) <= block_addr;\r
+stat(15 downto 0)  <= mem_sel;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_register.vhd b/src/slv_register.vhd
new file mode 100644 (file)
index 0000000..f851ca7
--- /dev/null
@@ -0,0 +1,177 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity slv_register is\r
+generic( RESET_VALUE   : std_logic_vector(31 downto 0) := x"0000_0000" );\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         BUSY_IN               : in    std_logic;\r
+         -- Slave bus\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_BUSY_OUT  : out   std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         REG_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         REG_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_register is\r
+\r
+-- Signals\r
+\r
+       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       -- slave bus signals\r
+       signal slv_busy_x               : std_logic;\r
+       signal slv_busy                 : std_logic;\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal reg_slv_data_in  : std_logic_vector(31 downto 0); -- registered data input\r
+       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- read back data\r
+       signal reg_busy                 : std_logic;\r
+\r
+begin\r
+\r
+-- Fake\r
+reg_busy <= busy_in;\r
+stat <= (others => '0');\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_busy      <= '0';\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_busy      <= slv_busy_x;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, reg_busy )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_busy_x <= '0';\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( (reg_busy = '0') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( (reg_busy = '0') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       elsif( (reg_busy = '1') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1'; -- added 23022009\r
+                                                       elsif( (reg_busy = '1') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1'; -- added 23022009\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when RD_BSY             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when WR_BSY             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_in <= RESET_VALUE;\r
+               elsif( store_wr = '1' ) then\r
+                       reg_slv_data_in <= slv_data_in;\r
+               end if;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_out <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       reg_slv_data_out <= reg_data_in;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- output signals\r
+slv_ack_out  <= slv_ack;\r
+slv_busy_out <= slv_busy;\r
+slv_data_out <= reg_slv_data_out;\r
+\r
+---------------------------------------------------------\r
+-- signals to backend                                  --\r
+---------------------------------------------------------\r
+\r
+reg_data_out <= reg_slv_data_in;\r
+\r
+end Behavioral;\r
diff --git a/src/slv_register_bank.vhd b/src/slv_register_bank.vhd
new file mode 100644 (file)
index 0000000..5baa67d
--- /dev/null
@@ -0,0 +1,253 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity slv_register_bank is\r
+generic( RESET_VALUE   : std_logic_vector(15 downto 0) := x"0001" );\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_ADDR_IN   : in    std_logic_vector(3 downto 0);\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- I/O to the backend\r
+         BACKPLANE_IN  : in    std_logic_vector(2 downto 0);\r
+         CTRL_0_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_1_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_2_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_3_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_4_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_5_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_6_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_7_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_8_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_9_OUT    : out   std_logic_vector(15 downto 0);\r
+         CTRL_10_OUT   : out   std_logic_vector(15 downto 0);\r
+         CTRL_11_OUT   : out   std_logic_vector(15 downto 0);\r
+         CTRL_12_OUT   : out   std_logic_vector(15 downto 0);\r
+         CTRL_13_OUT   : out   std_logic_vector(15 downto 0);\r
+         CTRL_14_OUT   : out   std_logic_vector(15 downto 0);\r
+         CTRL_15_OUT   : out   std_logic_vector(15 downto 0);\r
+         STAT_0_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_1_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_2_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_3_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_4_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_5_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_6_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_7_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_8_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_9_IN             : in    std_logic_vector(15 downto 0);\r
+         STAT_10_IN    : in    std_logic_vector(15 downto 0);\r
+         STAT_11_IN    : in    std_logic_vector(15 downto 0);\r
+         STAT_12_IN    : in    std_logic_vector(15 downto 0);\r
+         STAT_13_IN    : in    std_logic_vector(15 downto 0);\r
+         STAT_14_IN    : in    std_logic_vector(15 downto 0);\r
+         STAT_15_IN    : in    std_logic_vector(15 downto 0);\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of slv_register_bank is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_RDY,RD_DEL0,RD_DEL1,WR_DEL0,WR_DEL1,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+       signal adc_addr                 : std_logic_vector(3 downto 0);  -- ADC address after mapping\r
+       signal reg_sel                  : std_logic_vector(15 downto 0);\r
+       signal reg_wr                   : std_logic_vector(15 downto 0);\r
+       signal reg_wr_x                 : std_logic_vector(15 downto 0);\r
+\r
+       type ctrl_reg_t is array (0 to 15) of std_logic_vector(15 downto 0);\r
+       signal ctrl_reg                 : ctrl_reg_t;\r
+\r
+       signal rdback_data              : std_logic_vector(31 downto 0);\r
+       \r
+begin\r
+\r
+-- Fake\r
+stat <= (others => '0');\r
+\r
+---------------------------------------------------------\r
+-- Mapping of backplanes                               --\r
+---------------------------------------------------------\r
+THE_APV_ADC_MAP_MEM: apv_adc_map_mem\r
+port map( ADDRESS(6 downto 4)  => backplane_in,\r
+                 ADDRESS(3 downto 0)   => slv_addr_in,\r
+                 Q                                             => adc_addr\r
+                );\r
+\r
+THE_REG_SEL_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case adc_addr is\r
+                       when x"0"       =>      reg_sel     <= b"0000_0000_0000_0001";\r
+                                                       rdback_data <= stat_0_in  & ctrl_reg(0);\r
+                       when x"1"       =>      reg_sel     <= b"0000_0000_0000_0010";\r
+                                                       rdback_data <= stat_1_in  & ctrl_reg(1);\r
+                       when x"2"       =>      reg_sel     <= b"0000_0000_0000_0100";\r
+                                                       rdback_data <= stat_2_in  & ctrl_reg(2);\r
+                       when x"3"       =>      reg_sel     <= b"0000_0000_0000_1000";\r
+                                                       rdback_data <= stat_3_in  & ctrl_reg(3);\r
+                       when x"4"       =>      reg_sel     <= b"0000_0000_0001_0000";\r
+                                                       rdback_data <= stat_4_in  & ctrl_reg(4);\r
+                       when x"5"       =>      reg_sel     <= b"0000_0000_0010_0000";\r
+                                                       rdback_data <= stat_5_in  & ctrl_reg(5);\r
+                       when x"6"       =>      reg_sel     <= b"0000_0000_0100_0000";\r
+                                                       rdback_data <= stat_6_in  & ctrl_reg(6);\r
+                       when x"7"       =>      reg_sel     <= b"0000_0000_1000_0000";\r
+                                                       rdback_data <= stat_7_in  & ctrl_reg(7);\r
+                       when x"8"       =>      reg_sel     <= b"0000_0001_0000_0000";\r
+                                                       rdback_data <= stat_8_in  & ctrl_reg(8);\r
+                       when x"9"       =>      reg_sel     <= b"0000_0010_0000_0000";\r
+                                                       rdback_data <= stat_9_in  & ctrl_reg(9);\r
+                       when x"a"       =>      reg_sel     <= b"0000_0100_0000_0000";\r
+                                                       rdback_data <= stat_10_in & ctrl_reg(10);\r
+                       when x"b"       =>      reg_sel     <= b"0000_1000_0000_0000";\r
+                                                       rdback_data <= stat_11_in & ctrl_reg(11);\r
+                       when x"c"       =>      reg_sel     <= b"0001_0000_0000_0000";\r
+                                                       rdback_data <= stat_12_in & ctrl_reg(12);\r
+                       when x"d"       =>      reg_sel     <= b"0010_0000_0000_0000";\r
+                                                       rdback_data <= stat_13_in & ctrl_reg(13);\r
+                       when x"e"       =>      reg_sel     <= b"0100_0000_0000_0000";\r
+                                                       rdback_data <= stat_14_in & ctrl_reg(14);\r
+                       when x"f"       =>      reg_sel     <= b"1000_0000_0000_0000";\r
+                                                       rdback_data <= stat_15_in & ctrl_reg(15);\r
+                       when others     =>      reg_sel     <= b"0000_0000_0000_0000"; -- never used\r
+                                                       rdback_data <= x"0000_0000";\r
+               end case;\r
+       end if;\r
+end process THE_REG_SEL_PROC;\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process( CURRENT_STATE, slv_read_in, slv_write_in )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( slv_read_in = '1' ) then\r
+                                                               NEXT_STATE <= RD_DEL0;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( slv_write_in = '1' ) then\r
+                                                               NEXT_STATE <= WR_DEL0;\r
+                                                               store_wr_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_DEL0    =>      NEXT_STATE <= RD_DEL1;\r
+               when RD_DEL1    =>      NEXT_STATE <= RD_RDY;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_DEL0    =>      NEXT_STATE <= WR_DEL1;\r
+               when WR_DEL1    =>      NEXT_STATE <= WR_RDY;\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+-- register write\r
+GEN_CTRL_REG: for i in 0 to 15 generate        \r
+       THE_WR_REG_PROC: process( clk_in )\r
+       begin\r
+               if( rising_edge(clk_in) ) then\r
+                       if   ( reset_in = '1' ) then\r
+                               ctrl_reg(i) <= RESET_VALUE;\r
+                       elsif( reg_wr(i) = '1' ) then\r
+                               ctrl_reg(i) <= slv_data_in(15 downto 0);\r
+                       end if;\r
+               end if;\r
+       end process THE_WR_REG_PROC;\r
+       reg_wr_x(i) <= '1' when ( (reg_sel(i) = '1') and (store_wr = '1') ) else '0';\r
+end generate GEN_CTRL_REG;\r
+\r
+THE_SYNC_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               reg_wr <= reg_wr_x;\r
+       end if;\r
+end process THE_SYNC_PROC;\r
+\r
+---------------------------------------------------------\r
+-- output signals                                      --\r
+---------------------------------------------------------\r
+ctrl_0_out   <= ctrl_reg(0);\r
+ctrl_1_out   <= ctrl_reg(1);\r
+ctrl_2_out   <= ctrl_reg(2);\r
+ctrl_3_out   <= ctrl_reg(3);\r
+ctrl_4_out   <= ctrl_reg(4);\r
+ctrl_5_out   <= ctrl_reg(5);\r
+ctrl_6_out   <= ctrl_reg(6);\r
+ctrl_7_out   <= ctrl_reg(7);\r
+ctrl_8_out   <= ctrl_reg(8);\r
+ctrl_9_out   <= ctrl_reg(9);\r
+ctrl_10_out  <= ctrl_reg(10);\r
+ctrl_11_out  <= ctrl_reg(11);\r
+ctrl_12_out  <= ctrl_reg(12);\r
+ctrl_13_out  <= ctrl_reg(13);\r
+ctrl_14_out  <= ctrl_reg(14);\r
+ctrl_15_out  <= ctrl_reg(15);\r
+\r
+slv_ack_out  <= slv_ack;\r
+slv_data_out <= rdback_data;\r
+\r
+stat         <= (others => '0');\r
+\r
+end Behavioral;\r
diff --git a/src/spare_onewire_mapping.mem b/src/spare_onewire_mapping.mem
new file mode 100644 (file)
index 0000000..830138b
--- /dev/null
@@ -0,0 +1,20 @@
+#Format=Address-Hex\r
+#Depth=8\r
+#DataWidth=4\r
+#AddrRadix=3\r
+#DataRadix=3\r
+\r
+# This mapping memory denotes the "spare" 1Wire port, which is connected to Roman's APV.\r
+# This information can be used to replace the 1Wire ID of the non-existing APV-FE by the \r
+# backplane 1Wire ID.\r
+\r
+# IMPORTANT: KEEP IN SYNC WITH adc_onewire_mapping.mem!!!\r
+\r
+00: 4\r
+01: c\r
+02: 6\r
+03: a\r
+04: 0\r
+05: f\r
+06: f\r
+07: f\r
diff --git a/src/spi_adc_master.vhd b/src/spi_adc_master.vhd
new file mode 100644 (file)
index 0000000..92ed5c9
--- /dev/null
@@ -0,0 +1,215 @@
+library IEEE;\r
+use IEEE.STD_LOGIC_1164.ALL;\r
+use IEEE.STD_LOGIC_ARITH.ALL;\r
+use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity spi_adc_master is\r
+generic( RESET_VALUE_CTRL      : std_logic_vector(7 downto 0) := x"60" );\r
+port( CLK_IN           : in    std_logic;\r
+         RESET_IN              : in    std_logic;\r
+         -- Slave bus\r
+         SLV_READ_IN   : in    std_logic;\r
+         SLV_WRITE_IN  : in    std_logic;\r
+         SLV_BUSY_OUT  : out   std_logic;\r
+         SLV_ACK_OUT   : out   std_logic;\r
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
+         -- SPI connections\r
+         SPI_CS_OUT    : out   std_logic;\r
+         SPI_SDO_OUT   : out   std_logic;\r
+         SPI_SCK_OUT   : out   std_logic;\r
+         -- ADC connections\r
+         ADC_LOCKED_IN : in    std_logic;\r
+         ADC_PD_OUT    : out   std_logic;\r
+         ADC_RST_OUT   : out   std_logic;\r
+         ADC_DEL_OUT   : out   std_logic_vector(3 downto 0);\r
+         -- APV connections\r
+         APV_RST_OUT   : out   std_logic;\r
+         -- Status lines\r
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
+       );\r
+end entity;\r
+\r
+architecture Behavioral of spi_adc_master is\r
+\r
+-- Signals\r
+       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
+       signal CURRENT_STATE, NEXT_STATE: STATES;\r
+\r
+       signal status_data              : std_logic_vector(31 downto 0);\r
+       signal spi_busy                 : std_logic;\r
+       \r
+       signal reg_ctrl_data    : std_logic_vector(7 downto 0); \r
+       signal adc_ctrl_data    : std_logic_vector(7 downto 0); \r
+       \r
+       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- readback\r
+       \r
+       signal spi_start_x              : std_logic;\r
+       signal spi_start                : std_logic;\r
+       \r
+       -- State machine signals\r
+       signal slv_busy_x               : std_logic;\r
+       signal slv_busy                 : std_logic;\r
+       signal slv_ack_x                : std_logic;\r
+       signal slv_ack                  : std_logic;\r
+       signal store_wr_x               : std_logic;\r
+       signal store_wr                 : std_logic;\r
+       signal store_rd_x               : std_logic;\r
+       signal store_rd                 : std_logic;\r
+\r
+begin\r
+\r
+---------------------------------------------------------\r
+-- SPI master                                          --\r
+---------------------------------------------------------\r
+\r
+THE_SPI_REAL_SLIM: spi_real_slim\r
+port map( SYSCLK               => clk_in,\r
+                 RESET                 => reset_in,\r
+                 -- Command interface\r
+                 START_IN              => spi_start,\r
+                 BUSY_OUT              => spi_busy,\r
+                 CMD_IN                => reg_ctrl_data,\r
+                 -- SPI interface\r
+                 SPI_SCK_OUT   => spi_sck_out,\r
+                 SPI_CS_OUT    => spi_cs_out,\r
+                 SPI_SDO_OUT   => spi_sdo_out,\r
+                 -- DEBUG\r
+                 CLK_EN_OUT    => open,\r
+                 BSM_OUT               => open,\r
+                 DEBUG_OUT             => open\r
+               );\r
+\r
+---------------------------------------------------------\r
+-- Statemachine                                        --\r
+---------------------------------------------------------\r
+-- State memory process\r
+STATE_MEM: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if( reset_in = '1' ) then\r
+                       CURRENT_STATE <= SLEEP;\r
+                       slv_busy      <= '0';\r
+                       slv_ack       <= '0';\r
+                       store_wr      <= '0';\r
+                       store_rd      <= '0';\r
+               else\r
+                       CURRENT_STATE <= NEXT_STATE;\r
+                       slv_busy      <= slv_busy_x;\r
+                       slv_ack       <= slv_ack_x;\r
+                       store_wr      <= store_wr_x;\r
+                       store_rd      <= store_rd_x;\r
+               end if;\r
+       end if;\r
+end process STATE_MEM;\r
+\r
+-- Transition matrix\r
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, spi_busy )\r
+begin\r
+       NEXT_STATE <= SLEEP;\r
+       slv_busy_x <= '0';\r
+       slv_ack_x  <= '0';\r
+       store_wr_x <= '0';\r
+       store_rd_x <= '0';\r
+       case CURRENT_STATE is\r
+               when SLEEP              =>      if   ( (spi_busy = '0') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_RDY;\r
+                                                               store_rd_x <= '1';\r
+                                                       elsif( (spi_busy = '0') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_RDY;\r
+                                                               store_wr_x <= '1';\r
+                                                       elsif( (spi_busy = '1') and (slv_read_in = '1') ) then\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       elsif( (spi_busy = '1') and (slv_write_in = '1') ) then\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       else    \r
+                                                               NEXT_STATE <= SLEEP;\r
+                                                       end if;\r
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
+                                                       slv_ack_x  <= '1';\r
+               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_ACK;\r
+                                                               slv_ack_x  <= '1';\r
+                                                       end if;\r
+               when RD_BSY             =>      if( slv_read_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= RD_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when WR_BSY             =>      if( slv_write_in = '0' ) then\r
+                                                               NEXT_STATE <= DONE;\r
+                                                       else\r
+                                                               NEXT_STATE <= WR_BSY;\r
+                                                               slv_busy_x <= '1';\r
+                                                       end if;\r
+               when DONE               =>      NEXT_STATE <= SLEEP;\r
+                       \r
+               when others             =>      NEXT_STATE <= SLEEP;\r
+       end case;\r
+end process TRANSFORM;\r
+\r
+---------------------------------------------------------\r
+-- data handling                                       --\r
+---------------------------------------------------------\r
+\r
+-- register write\r
+THE_WRITE_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_ctrl_data   <= (others => '0');\r
+                       adc_ctrl_data   <= RESET_VALUE_CTRL;\r
+                       spi_start       <= '0';\r
+               elsif( store_wr = '1' ) then\r
+                       reg_ctrl_data   <= slv_data_in(31 downto 24);\r
+                       adc_ctrl_data   <= slv_data_in(7 downto 0);\r
+               end if;\r
+               spi_start <= spi_start_x;\r
+       end if;\r
+end process THE_WRITE_REG_PROC;\r
+\r
+spi_start_x <= '1' when ( (store_wr = '1') and (slv_data_in(3) = '1') ) else '0';\r
+\r
+-- register read\r
+THE_READ_REG_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               if   ( reset_in = '1' ) then\r
+                       reg_slv_data_out <= (others => '0');\r
+               elsif( store_rd = '1' ) then\r
+                       reg_slv_data_out <= reg_ctrl_data & x"000" & b"000" & adc_locked_in & adc_ctrl_data;\r
+               end if;\r
+       end if;\r
+end process THE_READ_REG_PROC;\r
+\r
+-- debug signals\r
+status_data(31 downto 0)  <= (others => '0');\r
+\r
+-- output signals\r
+adc_del_out  <= adc_ctrl_data(7 downto 4);\r
+apv_rst_out  <= adc_ctrl_data(2);\r
+adc_pd_out   <= adc_ctrl_data(1);\r
+adc_rst_out  <= not adc_ctrl_data(0);\r
+\r
+stat         <= status_data;\r
+slv_ack_out  <= slv_ack;\r
+slv_busy_out <= slv_busy;\r
+slv_data_out <= reg_slv_data_out;\r
+\r
+end Behavioral;\r
diff --git a/src/spi_real_slim.vhd b/src/spi_real_slim.vhd
new file mode 100644 (file)
index 0000000..4b83c1e
--- /dev/null
@@ -0,0 +1,242 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+\r
+entity spi_real_slim is\r
+       port( SYSCLK            : in    std_logic; -- 100MHz sysclock\r
+                 RESET                 : in    std_logic; -- synchronous reset\r
+                 -- Command interface\r
+                 START_IN              : in    std_logic; -- one start pulse\r
+                 BUSY_OUT              : out   std_logic; -- SPI transactions are ongoing\r
+                 CMD_IN                : in    std_logic_vector(7 downto 0); -- SPI command byte\r
+                 -- SPI interface\r
+                 SPI_SCK_OUT   : out   std_logic;\r
+                 SPI_CS_OUT    : out   std_logic;\r
+                 SPI_SDO_OUT   : out   std_logic;\r
+                 -- DEBUG\r
+                 CLK_EN_OUT    : out   std_logic;\r
+                 BSM_OUT               : out   std_logic_vector(7 downto 0);\r
+                 DEBUG_OUT             : out   std_logic_vector(31 downto 0)\r
+               );\r
+end spi_real_slim;\r
+\r
+architecture Behavioral of spi_real_slim is\r
+\r
+-- new clock divider\r
+signal div_counter             : std_logic_vector(1 downto 0);\r
+signal div_done_x              : std_logic;\r
+signal div_done                        : std_logic; -- same as clk_en\r
+signal clk_en                  : std_logic; -- same as div_done\r
+\r
+-- Statemachine signals\r
+type state_t is (IDLE,CSL,TXCMD,CSH);\r
+signal STATE, NEXT_STATE       : state_t;\r
+\r
+signal tx_ena_x                        : std_logic;\r
+signal tx_ena                  : std_logic;\r
+signal busy_x                  : std_logic;\r
+signal busy                            : std_logic;\r
+signal spi_cs_x                        : std_logic; -- SPI chip select (low active)\r
+signal spi_cs                  : std_logic;\r
+signal spi_sck_x               : std_logic; -- SPI clock (rising edge active, from counter)\r
+signal spi_sck                 : std_logic;\r
+signal tx_load_x               : std_logic; -- load TX shift register\r
+signal tx_load                 : std_logic;\r
+\r
+signal last_tx_bit_x   : std_logic;\r
+signal last_tx_bit             : std_logic;\r
+\r
+-- debug signals\r
+signal bsm_x                   : std_logic_vector(7 downto 0);\r
+signal debug_x                 : std_logic_vector(31 downto 0);\r
+\r
+signal start                   : std_logic; -- buffered start_in signal, as we have a clocked down state machine\r
+signal cmd_int                 : std_logic_vector(7 downto 0); -- internal command and address bytes\r
+\r
+-- transmitter\r
+signal tx_sreg                 : std_logic_vector(7 downto 0);\r
+signal tx_reg_comb             : std_logic_vector(7 downto 0); -- multiplexer\r
+signal tx_bit_cnt              : std_logic_vector(3 downto 0);\r
+\r
+begin\r
+\r
+-----------------------------------------------------------\r
+-- Debug signals\r
+-----------------------------------------------------------\r
+debug_x(31 downto 24) <= tx_sreg; --(others => '0');\r
+debug_x(23 downto 20) <= tx_bit_cnt; --(others => '0');\r
+debug_x(19 downto 16) <= (others => '0');\r
+debug_x(15)           <= '0';\r
+debug_x(14)           <= '0';\r
+debug_x(13)           <= '0';\r
+debug_x(12)           <= '0';\r
+debug_x(11)           <= last_tx_bit;\r
+debug_x(10)           <= '0';\r
+debug_x(9)            <= '0';\r
+debug_x(8)            <= '0';\r
+debug_x(7)            <= '0';\r
+debug_x(6)            <= '0';\r
+debug_x(5)            <= tx_load;\r
+debug_x(4)            <= tx_ena;\r
+debug_x(3)            <= '0'; \r
+debug_x(2 downto 0)   <= (others => '0');\r
+\r
+\r
+-----------------------------------------------------------\r
+-- SPI clock generator\r
+-----------------------------------------------------------\r
+THE_CLOCK_DIVIDER: process( sysclk )\r
+begin\r
+       if( rising_edge(sysclk) ) then\r
+               if( reset = '1' ) then\r
+                       div_counter <= (others => '0');\r
+                       div_done    <= '0';\r
+                       spi_sck     <= '0';\r
+               else\r
+                       div_counter <= div_counter + 1;\r
+                       div_done    <= div_done_x;\r
+                       spi_sck     <= spi_sck_x;\r
+               end if;\r
+       end if;\r
+end process THE_CLOCK_DIVIDER;\r
+\r
+div_done_x <= '1' when ( div_counter = b"00" ) else '0';\r
+\r
+spi_sck_x  <= '1' when ( ((div_counter = b"11") or (div_counter = b"00")) and\r
+                                                (tx_ena = '1') ) else '0';\r
+\r
+clk_en <= div_done;\r
+\r
+-----------------------------------------------------------\r
+-- start signal and local register sets for CMD and ADR\r
+-----------------------------------------------------------\r
+THE_START_PROC: process( sysclk )\r
+begin\r
+       if( rising_edge(sysclk) ) then\r
+               if   ( reset = '1' ) then\r
+                       start   <= '0';\r
+                       cmd_int <= (others => '0');\r
+               elsif( (start_in = '1') and (busy = '0') ) then\r
+                       start <= '1';\r
+                       cmd_int <= cmd_in;\r
+               elsif( busy = '1' ) then\r
+                       start <= '0';\r
+               end if;\r
+       end if;\r
+end process THE_START_PROC;\r
+\r
+-----------------------------------------------------------\r
+-- statemachine: clocked process\r
+-----------------------------------------------------------\r
+THE_STATEMACHINE: process( sysclk )\r
+begin\r
+       if( rising_edge(sysclk) ) then\r
+               if   ( reset = '1' ) then\r
+                       STATE      <= IDLE;\r
+                       tx_ena     <= '0';\r
+                       busy       <= '0';\r
+                       spi_cs     <= '1';\r
+                       tx_load    <= '0';\r
+               elsif( clk_en = '1' ) then\r
+                       STATE    <= NEXT_STATE;\r
+                       tx_ena   <= tx_ena_x;\r
+                       busy     <= busy_x;\r
+                       spi_cs   <= spi_cs_x;\r
+                       tx_load  <= tx_load_x;\r
+               end if;\r
+       end if;\r
+end process THE_STATEMACHINE;\r
+\r
+-----------------------------------------------------------\r
+-- state machine transition table\r
+-----------------------------------------------------------\r
+THE_STATE_TRANSITIONS: process( STATE, start, tx_bit_cnt )\r
+begin\r
+       tx_ena_x   <= '0';\r
+       busy_x     <= '1';\r
+       spi_cs_x   <= '1';\r
+       tx_load_x  <= '0';\r
+       case STATE is\r
+               when IDLE =>\r
+                       if( start = '1' ) then\r
+                               NEXT_STATE <= CSL;\r
+                               spi_cs_x   <= '0';\r
+                               tx_load_x  <= '1';\r
+                       else\r
+                               NEXT_STATE <= IDLE;\r
+                               busy_x     <= '0';\r
+                       end if;\r
+\r
+               when CSL =>\r
+                       NEXT_STATE <= TXCMD;\r
+                       tx_ena_x   <= '1';\r
+                       spi_cs_x   <= '0';\r
+\r
+               when TXCMD =>\r
+                       if( tx_bit_cnt < x"7" ) then\r
+                               NEXT_STATE <= TXCMD;\r
+                               tx_ena_x   <= '1';\r
+                               spi_cs_x   <= '0';\r
+                       else\r
+                               NEXT_STATE <= CSH;\r
+                               spi_cs_x   <= '0';\r
+                       end if;\r
+\r
+               when CSH =>\r
+                       NEXT_STATE <= IDLE;\r
+                       busy_x     <= '0';\r
+\r
+               when others =>\r
+                       NEXT_STATE <= IDLE;\r
+\r
+       end case;\r
+end process THE_STATE_TRANSITIONS;\r
+\r
+-- state machine output table\r
+THE_STATEMACHINE_OUT: process( STATE )\r
+begin\r
+       case STATE is\r
+               when IDLE               =>      bsm_x                   <= x"00";\r
+               when CSL                =>      bsm_x                   <= x"01";\r
+               when TXCMD              =>      bsm_x                   <= x"02";\r
+               when CSH                =>      bsm_x                   <= x"03";\r
+               when others             =>      bsm_x                   <= x"ff";\r
+       end case;\r
+end process THE_STATEMACHINE_OUT;\r
+\r
+-- We only use one CMD byte\r
+tx_reg_comb <= cmd_int;\r
+\r
+-- TXData shift register and bit counter\r
+THE_TX_SHIFT_AND_BITCOUNT: process( sysclk )\r
+begin\r
+       if( rising_edge(sysclk) ) then\r
+               if   ( (clk_en = '1' ) and (tx_load = '1') ) then\r
+                       tx_bit_cnt <= (others => '0');\r
+                       tx_sreg    <= tx_reg_comb;\r
+               elsif( (clk_en = '1') and (tx_ena = '1') ) then\r
+                       tx_bit_cnt <= tx_bit_cnt + 1;\r
+                       tx_sreg    <= tx_sreg (6 downto 0) & '0';\r
+               end if;\r
+               last_tx_bit <= last_tx_bit_x;\r
+       end if;\r
+end process THE_TX_SHIFT_AND_BITCOUNT;\r
+\r
+last_tx_bit_x <= '1' when ( tx_bit_cnt = x"7" ) else '0';\r
+\r
+-- output signals\r
+spi_cs_out   <= spi_cs;\r
+spi_sck_out  <= spi_sck;\r
+spi_sdo_out  <= tx_sreg(7);\r
+busy_out     <= busy;\r
+\r
+clk_en_out   <= clk_en;\r
+bsm_out      <= bsm_x;\r
+debug_out    <= debug_x;\r
+\r
+\r
+end Behavioral;\r
diff --git a/src/state_sync.vhd b/src/state_sync.vhd
new file mode 100644 (file)
index 0000000..a00cd2f
--- /dev/null
@@ -0,0 +1,41 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.std_logic_arith.all;\r
+use ieee.std_logic_unsigned.all;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+entity state_sync is\r
+       port( STATE_A_IN                : in    std_logic;\r
+                 RESET_B_IN            : in    std_logic;\r
+                 CLK_B_IN                      : in    std_logic;\r
+                 STATE_B_OUT           : out   std_logic\r
+               );\r
+end;\r
+\r
+architecture behavioral of state_sync is\r
+\r
+       -- normal signals\r
+       signal sync_q                   : std_logic;\r
+       signal sync_qq                  : std_logic;\r
+               \r
+begin\r
+\r
+-- synchronizing stage for clock domain B\r
+THE_SYNC_STAGE_PROC: process( clk_b_in )\r
+begin\r
+       if( rising_edge(clk_b_in) ) then\r
+               if( reset_b_in = '1' ) then\r
+                       sync_q <= '0'; sync_qq <= '0';\r
+               else\r
+                       sync_qq  <= sync_q;\r
+                       sync_q   <= state_a_in;\r
+               end if;\r
+       end if;\r
+end process THE_SYNC_STAGE_PROC;\r
+\r
+-- output signals\r
+state_b_out   <= sync_qq;\r
+\r
+end behavioral;\r
diff --git a/src/suber_12bit.lpc b/src/suber_12bit.lpc
new file mode 100644 (file)
index 0000000..a7aa216
--- /dev/null
@@ -0,0 +1,36 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=Subtractor\r
+CoreRevision=3.1\r
+ModuleName=suber_12bit\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=10/27/2009\r
+Time=16:54:01\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+InputWidth=12\r
+Representation=Unsigned\r
+UseCIport=0\r
+COport=None\r
+OutReg=1\r
+Complex=0\r
+Stage=0\r
diff --git a/src/suber_12bit.srp b/src/suber_12bit.srp
new file mode 100644 (file)
index 0000000..657e061
--- /dev/null
@@ -0,0 +1,32 @@
+SCUBA, Version ispLever_v72_SP2_Build (23)
+Tue Oct 27 16:54:01 2009
+
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
+Copyright (c) 1995 AT&T Corp.   All rights reserved.
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.
+Copyright (c) 2001 Agere Systems   All rights reserved.
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.
+
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n suber_12bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type mgaddsub -direction sub -width 12 -unsigned -output_reg -enable -pipeline 0 -e 
+    Circuit name     : suber_12bit
+    Module type      : sub
+    Module Version   : 3.1
+    Width            : 12
+    Ports            : 
+       Inputs       : DataA[11:0], DataB[11:0], Clock, Reset, ClockEn
+       Outputs      : Result[11:0]
+    I/O buffer       : not inserted
+    Representation   : unsigned number
+    EDIF output      : suppressed
+    VHDL output      : suber_12bit.vhd
+    VHDL template    : suber_12bit_tmpl.vhd
+    VHDL testbench    : tb_suber_12bit_tmpl.vhd
+    VHDL purpose     : for synthesis and simulation
+    Bus notation     : big endian
+    Report output    : suber_12bit.srp
+    Element Usage    :
+         FSUB2B : 7
+        FD1P3DX : 12
+    Estimated Resource Usage:
+            LUT : 14
+            Reg : 12
diff --git a/src/suber_12bit.vhd b/src/suber_12bit.vhd
new file mode 100644 (file)
index 0000000..c582ff2
--- /dev/null
@@ -0,0 +1,239 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.1
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type sub -width 12 -unsigned -output_reg -enable -pipeline 0 -e 
+
+-- Tue Oct 27 16:54:01 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity suber_12bit is
+    port (
+        DataA: in  std_logic_vector(11 downto 0); 
+        DataB: in  std_logic_vector(11 downto 0); 
+        Clock: in  std_logic; 
+        Reset: in  std_logic; 
+        ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(11 downto 0));
+end suber_12bit;
+
+architecture Structure of suber_12bit is
+
+    -- internal signal declarations
+    signal r0_diff11: std_logic;
+    signal r0_diff10: std_logic;
+    signal r0_diff9: std_logic;
+    signal r0_diff8: std_logic;
+    signal r0_diff7: std_logic;
+    signal r0_diff6: std_logic;
+    signal r0_diff5: std_logic;
+    signal r0_diff4: std_logic;
+    signal r0_diff3: std_logic;
+    signal r0_diff2: std_logic;
+    signal r0_diff1: std_logic;
+    signal r0_diff0: std_logic;
+    signal tdiff0: std_logic;
+    signal scuba_vhi: std_logic;
+    signal tdiff1: std_logic;
+    signal tdiff2: std_logic;
+    signal co0: std_logic;
+    signal tdiff3: std_logic;
+    signal tdiff4: std_logic;
+    signal co1: std_logic;
+    signal tdiff5: std_logic;
+    signal tdiff6: std_logic;
+    signal co2: std_logic;
+    signal tdiff7: std_logic;
+    signal tdiff8: std_logic;
+    signal co3: std_logic;
+    signal tdiff9: std_logic;
+    signal tdiff10: std_logic;
+    signal co4: std_logic;
+    signal tdiff11: std_logic;
+    signal co5: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component FSUB2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; BI: in  std_logic; BOUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    attribute GSR : string; 
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff11, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff11);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff10, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff10);
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff9, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff9);
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff8, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff8);
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff7, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff7);
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff6, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff6);
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff5, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff5);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff4, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff4);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff3, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff3);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff2, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff2);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff1, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff1);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>tdiff0, SP=>ClockEn, CK=>Clock, CD=>Reset, 
+            Q=>r0_diff0);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    addsub_0: FSUB2B
+        port map (A0=>scuba_vhi, A1=>DataA(0), B0=>scuba_vlo, 
+            B1=>DataB(0), BI=>scuba_vlo, BOUT=>co0, S0=>open, S1=>tdiff0);
+
+    addsub_1: FSUB2B
+        port map (A0=>DataA(1), A1=>DataA(2), B0=>DataB(1), B1=>DataB(2), 
+            BI=>co0, BOUT=>co1, S0=>tdiff1, S1=>tdiff2);
+
+    addsub_2: FSUB2B
+        port map (A0=>DataA(3), A1=>DataA(4), B0=>DataB(3), B1=>DataB(4), 
+            BI=>co1, BOUT=>co2, S0=>tdiff3, S1=>tdiff4);
+
+    addsub_3: FSUB2B
+        port map (A0=>DataA(5), A1=>DataA(6), B0=>DataB(5), B1=>DataB(6), 
+            BI=>co2, BOUT=>co3, S0=>tdiff5, S1=>tdiff6);
+
+    addsub_4: FSUB2B
+        port map (A0=>DataA(7), A1=>DataA(8), B0=>DataB(7), B1=>DataB(8), 
+            BI=>co3, BOUT=>co4, S0=>tdiff7, S1=>tdiff8);
+
+    addsub_5: FSUB2B
+        port map (A0=>DataA(9), A1=>DataA(10), B0=>DataB(9), 
+            B1=>DataB(10), BI=>co4, BOUT=>co5, S0=>tdiff9, S1=>tdiff10);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    addsub_6: FSUB2B
+        port map (A0=>DataA(11), A1=>scuba_vlo, B0=>DataB(11), 
+            B1=>scuba_vlo, BI=>co5, BOUT=>open, S0=>tdiff11, S1=>open);
+
+    Result(11) <= r0_diff11;
+    Result(10) <= r0_diff10;
+    Result(9) <= r0_diff9;
+    Result(8) <= r0_diff8;
+    Result(7) <= r0_diff7;
+    Result(6) <= r0_diff6;
+    Result(5) <= r0_diff5;
+    Result(4) <= r0_diff4;
+    Result(3) <= r0_diff3;
+    Result(2) <= r0_diff2;
+    Result(1) <= r0_diff1;
+    Result(0) <= r0_diff0;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of suber_12bit is
+    for Structure
+        for all:FSUB2B use entity ecp2m.FSUB2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/suber_12bit_generate.log b/src/suber_12bit_generate.log
new file mode 100644 (file)
index 0000000..dafc99f
--- /dev/null
@@ -0,0 +1,47 @@
+Starting process: \r
+\r
+SCUBA, Version ispLever_v72_SP2_Build (23)\r
+Tue Oct 27 16:54:01 2009\r
+\r
+Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.\r
+Copyright (c) 1995 AT&T Corp.   All rights reserved.\r
+Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights reserved.\r
+Copyright (c) 2001 Agere Systems   All rights reserved.\r
+Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All rights reserved.\r
+\r
+BEGIN SCUBA Module Synthesis\r
+\r
+    Issued command   : X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -n suber_12bit -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type mgaddsub -direction sub -width 12 -unsigned -output_reg -enable -pipeline 0 -e \r
+    Circuit name     : suber_12bit\r
+    Module type      : sub\r
+    Module Version   : 3.1\r
+    Width            : 12\r
+    Ports            : \r
+       Inputs       : DataA[11:0], DataB[11:0], Clock, Reset, ClockEn\r
+       Outputs      : Result[11:0]\r
+    I/O buffer       : not inserted\r
+    Representation   : unsigned number\r
+    EDIF output      : suppressed\r
+    VHDL output      : suber_12bit.vhd\r
+    VHDL template    : suber_12bit_tmpl.vhd\r
+    VHDL testbench   : tb_suber_12bit_tmpl.vhd\r
+    VHDL purpose     : for synthesis and simulation\r
+    Bus notation     : big endian\r
+    Report output    : suber_12bit.srp\r
+    Estimated Resource Usage:\r
+            LUT : 14\r
+            Reg : 12\r
+\r
+END   SCUBA Module Synthesis\r
+\r
+File: suber_12bit.lpc created.\r
+\r
+\r
+End process: completed successfully.\r
+\r
+\r
+Total Warnings:  0\r
+\r
+Total Errors:  0\r
+\r
+\r
diff --git a/src/suber_12bit_tmpl.vhd b/src/suber_12bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..6c4f816
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 3.1
+-- Tue Oct 27 16:54:01 2009
+
+-- parameterized module component declaration
+component suber_12bit
+    port (DataA: in  std_logic_vector(11 downto 0); 
+        DataB: in  std_logic_vector(11 downto 0); Clock: in  std_logic; 
+        Reset: in  std_logic; ClockEn: in  std_logic; 
+        Result: out  std_logic_vector(11 downto 0));
+end component;
+
+-- parameterized module component instance
+__ : suber_12bit
+    port map (DataA(11 downto 0)=>__, DataB(11 downto 0)=>__, Clock=>__, 
+        Reset=>__, ClockEn=>__, Result(11 downto 0)=>__);
diff --git a/src/tb_adc_apv_map_mem_tmpl.vhd b/src/tb_adc_apv_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..73cba33
--- /dev/null
@@ -0,0 +1,38 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component adc_apv_map_mem
+        port (Address : in std_logic_vector(6 downto 0); 
+        Q : out std_logic_vector(3 downto 0)
+    );
+    end component;
+
+    signal Address : std_logic_vector(6 downto 0) := (others => '0');
+    signal Q : std_logic_vector(3 downto 0);
+begin
+    u1 : adc_apv_map_mem
+        port map (Address => Address, Q => Q
+        );
+
+    process
+
+    begin
+      Address <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 131 loop
+        wait for 10 ns;
+        Address <= Address + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_adc_cross.vhd b/src/tb_adc_cross.vhd
new file mode 100644 (file)
index 0000000..fb24ad3
--- /dev/null
@@ -0,0 +1,231 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT adc_data_handler\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               RESET_PLL_IN : IN std_logic;\r
+               ADC_LCLK_IN : IN std_logic;\r
+               ADC_ADCLK_IN : IN std_logic;\r
+               ADC_CHNL_IN : IN std_logic_vector(7 downto 0);\r
+               PLL_CTRL_IN : IN std_logic_vector(3 downto 0);          \r
+               PLL_LOCK_OUT : OUT std_logic;\r
+               CLK40M_OUT : OUT std_logic;\r
+               ADC_ADCLK_OUT : OUT std_logic;\r
+               ADC_DATA7_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA6_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA5_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA4_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA3_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA2_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA1_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA0_OUT : OUT std_logic_vector(11 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       COMPONENT adc_crossover\r
+       PORT(\r
+               CLK_APV_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               ADC_CLK_IN : IN std_logic;\r
+               ADC_CE_IN : IN std_logic;\r
+               ADC_PLL_LOCKED_IN : IN std_logic;\r
+               ADC_DATA_0_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_1_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_2_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_3_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_4_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_5_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_6_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_7_IN : IN std_logic_vector(11 downto 0);          \r
+               LEVEL_WR_OUT : OUT std_logic_vector(4 downto 0);\r
+               APV_DATA_0_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_1_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_2_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_3_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_4_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_5_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_6_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_7_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_VALID_OUT : OUT std_logic;\r
+               LEVEL_RD_OUT : OUT std_logic_vector(4 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_APV_IN :  std_logic;\r
+       SIGNAL ADC_CE_IN :  std_logic;\r
+       SIGNAL LEVEL_WR_OUT :  std_logic_vector(4 downto 0);\r
+       SIGNAL LEVEL_RD_OUT :  std_logic_vector(4 downto 0);\r
+       SIGNAL APV_DATA_0_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_1_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_2_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_3_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_4_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_5_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_6_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_7_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_VALID_OUT :  std_logic;\r
+       SIGNAL DEBUG2_OUT :  std_logic_vector(31 downto 0);\r
+\r
+       SIGNAL CLK40M_INT :  std_logic;\r
+       SIGNAL PLL_LOCK_INT :  std_logic;\r
+       SIGNAL ADC_DATA_7_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_6_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_5_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_4_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_3_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_2_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_1_INT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_0_INT :  std_logic_vector(11 downto 0);\r
+       \r
+       \r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL RESET_PLL_IN :  std_logic;\r
+       SIGNAL ADC_LCLK_IN :  std_logic;\r
+       SIGNAL ADC_ADCLK_IN :  std_logic;\r
+       SIGNAL ADC_CHNL_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL PLL_CTRL_IN :  std_logic_vector(3 downto 0);\r
+--     SIGNAL ADC_ADCLK_OUT :  std_logic;\r
+       SIGNAL DEBUG1_OUT :  std_logic_vector(15 downto 0);\r
+\r
+       signal adc_0_real : std_logic_vector(11 downto 0);\r
+       signal adc_7_real : std_logic_vector(11 downto 0);\r
+\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut1: adc_data_handler PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               RESET_PLL_IN => RESET_PLL_IN,\r
+               ADC_LCLK_IN => ADC_LCLK_IN,\r
+               ADC_ADCLK_IN => ADC_ADCLK_IN,\r
+               ADC_CHNL_IN => ADC_CHNL_IN,\r
+               PLL_CTRL_IN => PLL_CTRL_IN,\r
+               PLL_LOCK_OUT => PLL_LOCK_INT,\r
+               CLK40M_OUT => CLK40M_INT,\r
+               ADC_ADCLK_OUT => ADC_CE_IN, --open,\r
+               ADC_DATA7_OUT => ADC_DATA_7_INT,\r
+               ADC_DATA6_OUT => ADC_DATA_6_INT,\r
+               ADC_DATA5_OUT => ADC_DATA_5_INT,\r
+               ADC_DATA4_OUT => ADC_DATA_4_INT,\r
+               ADC_DATA3_OUT => ADC_DATA_3_INT,\r
+               ADC_DATA2_OUT => ADC_DATA_2_INT,\r
+               ADC_DATA1_OUT => ADC_DATA_1_INT,\r
+               ADC_DATA0_OUT => ADC_DATA_0_INT,\r
+               DEBUG_OUT => DEBUG1_OUT\r
+       );\r
+\r
+       uut2: adc_crossover PORT MAP(\r
+               CLK_APV_IN => CLK_APV_IN,\r
+               RESET_IN => RESET_IN,\r
+               ADC_CLK_IN => ADC_LCLK_IN, --CLK40M_INT,\r
+               ADC_CE_IN => ADC_CE_IN,\r
+               ADC_PLL_LOCKED_IN => PLL_LOCK_INT,\r
+               ADC_DATA_0_IN => ADC_DATA_0_INT,\r
+               ADC_DATA_1_IN => ADC_DATA_1_INT,\r
+               ADC_DATA_2_IN => ADC_DATA_2_INT,\r
+               ADC_DATA_3_IN => ADC_DATA_3_INT,\r
+               ADC_DATA_4_IN => ADC_DATA_4_INT,\r
+               ADC_DATA_5_IN => ADC_DATA_5_INT,\r
+               ADC_DATA_6_IN => ADC_DATA_6_INT,\r
+               ADC_DATA_7_IN => ADC_DATA_7_INT,\r
+               LEVEL_WR_OUT => LEVEL_WR_OUT,\r
+               APV_DATA_0_OUT => APV_DATA_0_OUT,\r
+               APV_DATA_1_OUT => APV_DATA_1_OUT,\r
+               APV_DATA_2_OUT => APV_DATA_2_OUT,\r
+               APV_DATA_3_OUT => APV_DATA_3_OUT,\r
+               APV_DATA_4_OUT => APV_DATA_4_OUT,\r
+               APV_DATA_5_OUT => APV_DATA_5_OUT,\r
+               APV_DATA_6_OUT => APV_DATA_6_OUT,\r
+               APV_DATA_7_OUT => APV_DATA_7_OUT,\r
+               APV_DATA_VALID_OUT => APV_DATA_VALID_OUT,\r
+               LEVEL_RD_OUT => LEVEL_RD_OUT,\r
+               DEBUG_OUT => DEBUG2_OUT\r
+       );\r
+\r
+APV_CLK_GEN: process\r
+begin\r
+       clk_apv_in <= '1'; wait for 12.50 ns;\r
+       clk_apv_in <= '0'; wait for 12.50 ns;\r
+end process APV_CLK_GEN;\r
+\r
+-- 240MHz DDR clock from ADC, aka bit clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       adc_lclk_in <= '1'; wait for 2.08 ns;\r
+       adc_lclk_in <= '0'; wait for 2.08 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- test data generator\r
+BLA: process\r
+variable adc_0_data : unsigned(11 downto 0) := x"000";\r
+variable adc_7_data : unsigned(11 downto 0) := x"fff";\r
+variable my_bit : integer := 0;\r
+begin\r
+       \r
+       my_bit := 0;\r
+       adc_0_real <= std_logic_vector(adc_0_data);\r
+       adc_7_real <= std_logic_vector(adc_7_data);\r
+       \r
+       BIT_LOOP: for I in 0 to 5 loop\r
+\r
+               wait until rising_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               if( I < 3 ) then\r
+                       adc_adclk_in <= '1'; \r
+               else\r
+                       adc_adclk_in <= '0'; -- second half\r
+               end if;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+               wait until falling_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+       \r
+       end loop BIT_LOOP;\r
+       \r
+       adc_7_data := adc_7_data - 1;\r
+       adc_0_data := adc_0_data + 1;\r
+\r
+end process BLA;\r
+\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       reset_pll_in <= '0';\r
+       pll_ctrl_in <= x"6";\r
+--     adc_ce_in <= '1';\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Tests may start now\r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
diff --git a/src/tb_adc_crossover.vhd b/src/tb_adc_crossover.vhd
new file mode 100644 (file)
index 0000000..5bfa026
--- /dev/null
@@ -0,0 +1,237 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT adc_crossover\r
+       PORT(\r
+               CLK_APV_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               ADC_CLK_IN : IN std_logic;\r
+               ADC_CE_IN : IN std_logic;\r
+               ADC_PLL_LOCKED_IN : IN std_logic;\r
+               ADC_DATA_0_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_1_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_2_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_3_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_4_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_5_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_6_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_DATA_7_IN : IN std_logic_vector(11 downto 0);          \r
+               LEVEL_WR_OUT : OUT std_logic_vector(4 downto 0);\r
+               APV_DATA_0_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_1_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_2_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_3_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_4_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_5_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_6_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_7_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_DATA_VALID_OUT : OUT std_logic;\r
+               LEVEL_RD_OUT : OUT std_logic_vector(4 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_APV_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL ADC_CLK_IN :  std_logic;\r
+       SIGNAL ADC_CE_IN :  std_logic;\r
+       SIGNAL ADC_PLL_LOCKED_IN :  std_logic;\r
+       SIGNAL ADC_DATA_0_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_1_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_2_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_3_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_4_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_5_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_6_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA_7_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL LEVEL_WR_OUT :  std_logic_vector(4 downto 0);\r
+       SIGNAL APV_DATA_0_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_1_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_2_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_3_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_4_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_5_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_6_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_7_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_DATA_VALID_OUT :  std_logic;\r
+       SIGNAL LEVEL_RD_OUT :  std_logic_vector(4 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: adc_crossover PORT MAP(\r
+               CLK_APV_IN => CLK_APV_IN,\r
+               RESET_IN => RESET_IN,\r
+               ADC_CLK_IN => ADC_CLK_IN,\r
+               ADC_CE_IN => ADC_CE_IN,\r
+               ADC_PLL_LOCKED_IN => ADC_PLL_LOCKED_IN,\r
+               ADC_DATA_0_IN => ADC_DATA_0_IN,\r
+               ADC_DATA_1_IN => ADC_DATA_1_IN,\r
+               ADC_DATA_2_IN => ADC_DATA_2_IN,\r
+               ADC_DATA_3_IN => ADC_DATA_3_IN,\r
+               ADC_DATA_4_IN => ADC_DATA_4_IN,\r
+               ADC_DATA_5_IN => ADC_DATA_5_IN,\r
+               ADC_DATA_6_IN => ADC_DATA_6_IN,\r
+               ADC_DATA_7_IN => ADC_DATA_7_IN,\r
+               LEVEL_WR_OUT => LEVEL_WR_OUT,\r
+               APV_DATA_0_OUT => APV_DATA_0_OUT,\r
+               APV_DATA_1_OUT => APV_DATA_1_OUT,\r
+               APV_DATA_2_OUT => APV_DATA_2_OUT,\r
+               APV_DATA_3_OUT => APV_DATA_3_OUT,\r
+               APV_DATA_4_OUT => APV_DATA_4_OUT,\r
+               APV_DATA_5_OUT => APV_DATA_5_OUT,\r
+               APV_DATA_6_OUT => APV_DATA_6_OUT,\r
+               APV_DATA_7_OUT => APV_DATA_7_OUT,\r
+               APV_DATA_VALID_OUT => APV_DATA_VALID_OUT,\r
+               LEVEL_RD_OUT => LEVEL_RD_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+RDCLOCK_GEN: process\r
+begin\r
+       clk_apv_in <= '1'; wait for 12.50 ns;\r
+       clk_apv_in <= '0'; wait for 12.50 ns;\r
+end process RDCLOCK_GEN;\r
+\r
+--WRCLOCK_GEN: process\r
+--begin\r
+--     adc_clk_in <= '1'; wait for 12.45 ns;\r
+--     adc_clk_in <= '0'; wait for 12.45 ns;\r
+--end process WRCLOCK_GEN;\r
+\r
+WRCLOCK_GEN: process\r
+begin\r
+       wait until rising_edge(clk_apv_in);  wait for 3.33 ns; adc_clk_in <= '1';\r
+       wait until falling_edge(clk_apv_in); wait for 3.33 ns; adc_clk_in <= '0';\r
+end process WRCLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       adc_ce_in <= '1';\r
+       adc_data_0_in <= x"000";\r
+       adc_data_1_in <= x"000";\r
+       adc_data_2_in <= x"000";\r
+       adc_data_3_in <= x"000";\r
+       adc_data_4_in <= x"000";\r
+       adc_data_5_in <= x"000";\r
+       adc_data_6_in <= x"000";\r
+       adc_data_7_in <= x"000";\r
+       adc_pll_locked_in <= '0';\r
+       reset_in <= '0';\r
+\r
+       -- Reset all\r
+       reset_in <= '1'; wait for 50 ns;\r
+       reset_in <= '0'; wait for 50 ns;\r
+\r
+       -- Tests may start here\r
+       wait for 101 ns;\r
+       adc_pll_locked_in <= '1';\r
+       wait for 55 ns;\r
+\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"ffe";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"001";\r
+\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"ffd";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"002";\r
+\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"ffc";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"003";\r
+\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"ffb";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_0_in <= x"004";\r
+\r
+\r
+       -- Stay a while, stay forever.\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;\r
+       \r
+END;\r
diff --git a/src/tb_adc_handler.vhd b/src/tb_adc_handler.vhd
new file mode 100644 (file)
index 0000000..dbeafa8
--- /dev/null
@@ -0,0 +1,149 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT adc_data_handler\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               RESET_PLL_IN : IN std_logic;\r
+               ADC_LCLK_IN : IN std_logic;\r
+               ADC_ADCLK_IN : IN std_logic;\r
+               ADC_CHNL_IN : IN std_logic_vector(7 downto 0);\r
+               PLL_CTRL_IN : IN std_logic_vector(3 downto 0);          \r
+               PLL_LOCK_OUT : OUT std_logic;\r
+               CLK40M_OUT : OUT std_logic;\r
+               ADC_ADCLK_OUT : OUT std_logic;\r
+               ADC_DATA7_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA6_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA5_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA4_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA3_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA2_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA1_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA0_OUT : OUT std_logic_vector(11 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL RESET_PLL_IN :  std_logic;\r
+       SIGNAL ADC_LCLK_IN :  std_logic;\r
+       SIGNAL ADC_ADCLK_IN :  std_logic;\r
+       SIGNAL ADC_CHNL_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL PLL_CTRL_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL PLL_LOCK_OUT :  std_logic;\r
+       SIGNAL CLK40M_OUT :  std_logic;\r
+       SIGNAL ADC_ADCLK_OUT :  std_logic;\r
+       SIGNAL ADC_DATA7_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA6_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA5_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA4_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA3_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA2_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA1_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA0_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+       signal adc_0_real : std_logic_vector(11 downto 0);\r
+       signal adc_7_real : std_logic_vector(11 downto 0);\r
+\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: adc_data_handler PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               RESET_PLL_IN => RESET_PLL_IN,\r
+               ADC_LCLK_IN => ADC_LCLK_IN,\r
+               ADC_ADCLK_IN => ADC_ADCLK_IN,\r
+               ADC_CHNL_IN => ADC_CHNL_IN,\r
+               PLL_CTRL_IN => PLL_CTRL_IN,\r
+               PLL_LOCK_OUT => PLL_LOCK_OUT,\r
+               CLK40M_OUT => CLK40M_OUT,\r
+               ADC_ADCLK_OUT => ADC_ADCLK_OUT,\r
+               ADC_DATA7_OUT => ADC_DATA7_OUT,\r
+               ADC_DATA6_OUT => ADC_DATA6_OUT,\r
+               ADC_DATA5_OUT => ADC_DATA5_OUT,\r
+               ADC_DATA4_OUT => ADC_DATA4_OUT,\r
+               ADC_DATA3_OUT => ADC_DATA3_OUT,\r
+               ADC_DATA2_OUT => ADC_DATA2_OUT,\r
+               ADC_DATA1_OUT => ADC_DATA1_OUT,\r
+               ADC_DATA0_OUT => ADC_DATA0_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+-- 240MHz DDR clock from ADC, aka bit clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       adc_lclk_in <= '1'; wait for 2.08 ns;\r
+       adc_lclk_in <= '0'; wait for 2.08 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- test data generator\r
+BLA: process\r
+variable adc_0_data : unsigned(11 downto 0) := x"000";\r
+variable adc_7_data : unsigned(11 downto 0) := x"fff";\r
+variable my_bit : integer := 0;\r
+begin\r
+       \r
+       my_bit := 0;\r
+       adc_0_real <= std_logic_vector(adc_0_data);\r
+       adc_7_real <= std_logic_vector(adc_7_data);\r
+       \r
+       BIT_LOOP: for I in 0 to 5 loop\r
+\r
+               wait until rising_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               if( I < 3 ) then\r
+                       adc_adclk_in <= '1'; \r
+               else\r
+                       adc_adclk_in <= '0'; -- second half\r
+               end if;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+               wait until falling_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+       \r
+       end loop BIT_LOOP;\r
+       \r
+       adc_7_data := adc_7_data - 1;\r
+       adc_0_data := adc_0_data + 1;\r
+\r
+end process BLA;\r
+\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       reset_pll_in <= '0';\r
+       pll_ctrl_in <= x"6";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Tests may start now\r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
diff --git a/src/tb_adc_handler_OLD.vhd b/src/tb_adc_handler_OLD.vhd
new file mode 100644 (file)
index 0000000..6bf34cb
--- /dev/null
@@ -0,0 +1,187 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT adc_data_handler\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               RESET_PLL_IN : IN std_logic;\r
+               ADC_LCLK_IN : IN std_logic;\r
+               ADC_ADCLK_IN : IN std_logic;\r
+               ADC_CHNL_IN : IN std_logic_vector(7 downto 0);\r
+               PLL_CTRL_IN : IN std_logic_vector(3 downto 0);          \r
+               PLL_LOCK_OUT : OUT std_logic;\r
+               CLK40M_OUT : OUT std_logic;\r
+               ADC_ADCLK_OUT : OUT std_logic;\r
+               ADC_DATA7_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA6_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA5_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA4_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA3_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA2_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA1_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA0_OUT : OUT std_logic_vector(11 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL RESET_PLL_IN :  std_logic;\r
+       SIGNAL ADC_LCLK_IN :  std_logic;\r
+       SIGNAL ADC_ADCLK_IN :  std_logic;\r
+       SIGNAL ADC_CHNL_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL PLL_CTRL_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL PLL_LOCK_OUT :  std_logic;\r
+       SIGNAL CLK40M_OUT :  std_logic;\r
+       SIGNAL ADC_ADCLK_OUT :  std_logic;\r
+       SIGNAL ADC_DATA7_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA6_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA5_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA4_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA3_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA2_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA1_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA0_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+       signal adc_0_real : std_logic_vector(11 downto 0);\r
+       signal adc_7_real : std_logic_vector(11 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: adc_data_handler PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               RESET_PLL_IN => RESET_PLL_IN,\r
+               ADC_LCLK_IN => ADC_LCLK_IN,\r
+               ADC_ADCLK_IN => ADC_ADCLK_IN,\r
+               ADC_CHNL_IN => ADC_CHNL_IN,\r
+               PLL_CTRL_IN => PLL_CTRL_IN,\r
+               PLL_LOCK_OUT => PLL_LOCK_OUT,\r
+               CLK40M_OUT => CLK40M_OUT,\r
+               ADC_ADCLK_OUT => ADC_ADCLK_OUT,\r
+               ADC_DATA7_OUT => ADC_DATA7_OUT,\r
+               ADC_DATA6_OUT => ADC_DATA6_OUT,\r
+               ADC_DATA5_OUT => ADC_DATA5_OUT,\r
+               ADC_DATA4_OUT => ADC_DATA4_OUT,\r
+               ADC_DATA3_OUT => ADC_DATA3_OUT,\r
+               ADC_DATA2_OUT => ADC_DATA2_OUT,\r
+               ADC_DATA1_OUT => ADC_DATA1_OUT,\r
+               ADC_DATA0_OUT => ADC_DATA0_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       adc_lclk_in <= '1'; wait for 4.16 ns;\r
+       adc_lclk_in <= '0'; wait for 4.16 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+BLA: process\r
+variable adc_0_data : unsigned(11 downto 0) := x"000";\r
+variable adc_7_data : unsigned(11 downto 0) := x"fff";\r
+variable my_bit : integer := 0;\r
+begin\r
+       \r
+       my_bit := 0;\r
+       adc_0_real <= std_logic_vector(adc_0_data);\r
+       adc_7_real <= std_logic_vector(adc_7_data);\r
+       \r
+       BIT_LOOP: for I in 0 to 5 loop\r
+\r
+               wait until rising_edge(adc_lclk_in);\r
+               wait for 2.08 ns;\r
+               if( I < 3 ) then\r
+                       adc_adclk_in <= '1'; \r
+               else\r
+                       adc_adclk_in <= '0'; -- second half\r
+               end if;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+               wait until falling_edge(adc_lclk_in);\r
+               wait for 2.08 ns;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+       \r
+       end loop BIT_LOOP;\r
+       \r
+       adc_7_data := adc_7_data - 1;\r
+       adc_0_data := adc_0_data + 1;\r
+\r
+end process BLA;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       reset_pll_in <= '0';\r
+       pll_ctrl_in <= x"6";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Tests may start now\r
+\r
+\r
+\r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
+\r
+\r
+--     -- ADCLK = '1' => first half of data word\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"0000_0000"; -- Bit D0\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"1111_1111"; -- Bit D1\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"0000_0000"; -- Bit D2\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"1111_1111"; -- Bit D3\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"0000_0000"; -- Bit D4\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '1'; adc_chnl_in <= b"1111_1111"; -- Bit D5\r
+--     -- ADCLK = '0' => second half of data word\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"0000_0000"; -- Bit D6\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"1111_1111"; -- Bit D7\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"0000_0000"; -- Bit D8\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"1111_1111"; -- Bit D9\r
+--     wait until rising_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"0000_0000"; -- Bit D10\r
+--     wait until falling_edge(adc_lclk_in);\r
+--     wait for 2.08 ns;\r
+--     adc_adclk_in <= '0'; adc_chnl_in <= b"1111_1111"; -- Bit D11\r
diff --git a/src/tb_adc_handler_new.vhd b/src/tb_adc_handler_new.vhd
new file mode 100644 (file)
index 0000000..c585817
--- /dev/null
@@ -0,0 +1,142 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT adc_data_handler_new\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               ADC_LCLK_IN : IN std_logic;\r
+               ADC_ADCLK_IN : IN std_logic;\r
+               ADC_CHNL_IN : IN std_logic_vector(7 downto 0);\r
+               PLL_CTRL_IN : IN std_logic_vector(3 downto 0);          \r
+               ADC_DATA7_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA6_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA5_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA4_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA3_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA2_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA1_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_DATA0_OUT : OUT std_logic_vector(11 downto 0);\r
+               ADC_CE_OUT : OUT std_logic;\r
+               ADC_VALID_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL ADC_LCLK_IN :  std_logic;\r
+       SIGNAL ADC_ADCLK_IN :  std_logic;\r
+       SIGNAL ADC_CHNL_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL PLL_CTRL_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL ADC_DATA7_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA6_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA5_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA4_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA3_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA2_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA1_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_DATA0_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_CE_OUT :  std_logic;\r
+       SIGNAL ADC_VALID_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+       signal adc_0_real : std_logic_vector(11 downto 0);\r
+       signal adc_7_real : std_logic_vector(11 downto 0);\r
+\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: adc_data_handler_new PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               ADC_LCLK_IN => ADC_LCLK_IN,\r
+               ADC_ADCLK_IN => ADC_ADCLK_IN,\r
+               ADC_CHNL_IN => ADC_CHNL_IN,\r
+               PLL_CTRL_IN => PLL_CTRL_IN,\r
+               ADC_DATA7_OUT => ADC_DATA7_OUT,\r
+               ADC_DATA6_OUT => ADC_DATA6_OUT,\r
+               ADC_DATA5_OUT => ADC_DATA5_OUT,\r
+               ADC_DATA4_OUT => ADC_DATA4_OUT,\r
+               ADC_DATA3_OUT => ADC_DATA3_OUT,\r
+               ADC_DATA2_OUT => ADC_DATA2_OUT,\r
+               ADC_DATA1_OUT => ADC_DATA1_OUT,\r
+               ADC_DATA0_OUT => ADC_DATA0_OUT,\r
+               ADC_CE_OUT => ADC_CE_OUT,\r
+               ADC_VALID_OUT => ADC_VALID_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+-- 240MHz DDR clock from ADC, aka bit clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       adc_lclk_in <= '1'; wait for 2.08 ns;\r
+       adc_lclk_in <= '0'; wait for 2.08 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- test data generator\r
+BLA: process\r
+variable adc_0_data : unsigned(11 downto 0) := x"000";\r
+variable adc_7_data : unsigned(11 downto 0) := x"fff";\r
+variable my_bit : integer := 0;\r
+begin\r
+       \r
+       my_bit := 0;\r
+       adc_0_real <= std_logic_vector(adc_0_data);\r
+       adc_7_real <= std_logic_vector(adc_7_data);\r
+       \r
+       BIT_LOOP: for I in 0 to 5 loop\r
+\r
+               wait until rising_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               if( I < 3 ) then\r
+                       adc_adclk_in <= '1'; \r
+               else\r
+                       adc_adclk_in <= '0'; -- second half\r
+               end if;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+               wait until falling_edge(adc_lclk_in);\r
+               wait for 1.04 ns;\r
+               adc_chnl_in(7)          <= adc_7_data(my_bit);\r
+               adc_chnl_in(6 downto 1) <= (others => '0');\r
+               adc_chnl_in(0)          <= adc_0_data(my_bit);\r
+               my_bit := my_bit + 1;\r
+       \r
+       end loop BIT_LOOP;\r
+       \r
+       adc_7_data := adc_7_data - 1;\r
+       adc_0_data := adc_0_data + 1;\r
+\r
+end process BLA;\r
+\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       pll_ctrl_in <= x"6";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Tests may start now\r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
diff --git a/src/tb_adc_onewire_map_mem_tmpl.vhd b/src/tb_adc_onewire_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..c38f34b
--- /dev/null
@@ -0,0 +1,38 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component adc_onewire_map_mem
+        port (Address : in std_logic_vector(6 downto 0); 
+        Q : out std_logic_vector(3 downto 0)
+    );
+    end component;
+
+    signal Address : std_logic_vector(6 downto 0) := (others => '0');
+    signal Q : std_logic_vector(3 downto 0);
+begin
+    u1 : adc_onewire_map_mem
+        port map (Address => Address, Q => Q
+        );
+
+    process
+
+    begin
+      Address <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 131 loop
+        wait for 10 ns;
+        Address <= Address + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_apv_adc_map_mem_tmpl.vhd b/src/tb_apv_adc_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..d66043c
--- /dev/null
@@ -0,0 +1,38 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component apv_adc_map_mem
+        port (Address : in std_logic_vector(6 downto 0); 
+        Q : out std_logic_vector(3 downto 0)
+    );
+    end component;
+
+    signal Address : std_logic_vector(6 downto 0) := (others => '0');
+    signal Q : std_logic_vector(3 downto 0);
+begin
+    u1 : apv_adc_map_mem
+        port map (Address => Address, Q => Q
+        );
+
+    process
+
+    begin
+      Address <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 131 loop
+        wait for 10 ns;
+        Address <= Address + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_apv_locker.vhd b/src/tb_apv_locker.vhd
new file mode 100755 (executable)
index 0000000..81a88ba
--- /dev/null
@@ -0,0 +1,193 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT apv_locker\r
+       PORT(\r
+               CLK_APV_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SYNC_IN : IN std_logic;\r
+               ADC_RAW_IN : IN std_logic_vector(11 downto 0);\r
+               ADC_VALID_IN : IN std_logic;\r
+               APV_ON_IN : IN std_logic;\r
+               BIT_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               BIT_HIGH_IN : IN std_logic_vector(11 downto 0);\r
+               FL_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               FL_HIGH_IN : IN std_logic_vector(11 downto 0);          \r
+               STATUS_IGNORE_OUT : OUT std_logic;\r
+               STATUS_UNKNOWN_OUT : OUT std_logic;\r
+               STATUS_BADADC_OUT : OUT std_logic;\r
+               STATUS_LOCKED_OUT : OUT std_logic;\r
+               STATUS_LOST_OUT : OUT std_logic;\r
+               STATUS_NOSYNC_OUT : OUT std_logic;\r
+               STATUS_MISSING_OUT : OUT std_logic;\r
+               STATUS_TICKMARK_OUT : OUT std_logic;\r
+               FRAME_ROW_OUT : OUT std_logic_vector(7 downto 0);\r
+               FRAME_ERROR_OUT : OUT std_logic;\r
+               FRAME_FLAT_OUT : OUT std_logic;\r
+               FRAME_OVF_OUT : OUT std_logic;\r
+               FRAME_UDF_OUT : OUT std_logic;\r
+               FRAME_CTR_OUT : OUT std_logic_vector(3 downto 0);\r
+               APV_CHANNEL_OUT : OUT std_logic_vector(6 downto 0);\r
+               APV_OVERFLOW_OUT : OUT std_logic;\r
+               APV_UNDERFLOW_OUT : OUT std_logic;\r
+               APV_RAW_OUT : OUT std_logic_vector(11 downto 0);\r
+               APV_ANALOG_OUT : OUT std_logic;\r
+               APV_START_OUT : OUT std_logic;\r
+               APV_LAST_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_APV_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SYNC_IN :  std_logic;\r
+       SIGNAL ADC_RAW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC_VALID_IN :  std_logic;\r
+       SIGNAL APV_ON_IN :  std_logic;\r
+       SIGNAL BIT_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL BIT_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL STATUS_IGNORE_OUT :  std_logic;\r
+       SIGNAL STATUS_UNKNOWN_OUT :  std_logic;\r
+       SIGNAL STATUS_BADADC_OUT :  std_logic;\r
+       SIGNAL STATUS_LOCKED_OUT :  std_logic;\r
+       SIGNAL STATUS_LOST_OUT :  std_logic;\r
+       SIGNAL STATUS_NOSYNC_OUT :  std_logic;\r
+       SIGNAL STATUS_MISSING_OUT :  std_logic;\r
+       SIGNAL STATUS_TICKMARK_OUT :  std_logic;\r
+       SIGNAL FRAME_ROW_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL FRAME_ERROR_OUT :  std_logic;\r
+       SIGNAL FRAME_FLAT_OUT :  std_logic;\r
+       SIGNAL FRAME_OVF_OUT :  std_logic;\r
+       SIGNAL FRAME_UDF_OUT :  std_logic;\r
+       SIGNAL FRAME_CTR_OUT :  std_logic_vector(3 downto 0);\r
+       SIGNAL APV_CHANNEL_OUT :  std_logic_vector(6 downto 0);\r
+       SIGNAL APV_OVERFLOW_OUT :  std_logic;\r
+       SIGNAL APV_UNDERFLOW_OUT :  std_logic;\r
+       SIGNAL APV_RAW_OUT :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_ANALOG_OUT :  std_logic;\r
+       SIGNAL APV_START_OUT :  std_logic;\r
+       SIGNAL APV_LAST_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: apv_locker PORT MAP(\r
+               CLK_APV_IN => CLK_APV_IN,\r
+               RESET_IN => RESET_IN,\r
+               SYNC_IN => SYNC_IN,\r
+               ADC_RAW_IN => ADC_RAW_IN,\r
+               ADC_VALID_IN => ADC_VALID_IN,\r
+               APV_ON_IN => APV_ON_IN,\r
+               BIT_LOW_IN => BIT_LOW_IN,\r
+               BIT_HIGH_IN => BIT_HIGH_IN,\r
+               FL_LOW_IN => FL_LOW_IN,\r
+               FL_HIGH_IN => FL_HIGH_IN,\r
+               STATUS_IGNORE_OUT => STATUS_IGNORE_OUT,\r
+               STATUS_UNKNOWN_OUT => STATUS_UNKNOWN_OUT,\r
+               STATUS_BADADC_OUT => STATUS_BADADC_OUT,\r
+               STATUS_LOCKED_OUT => STATUS_LOCKED_OUT,\r
+               STATUS_LOST_OUT => STATUS_LOST_OUT,\r
+               STATUS_NOSYNC_OUT => STATUS_NOSYNC_OUT,\r
+               STATUS_MISSING_OUT => STATUS_MISSING_OUT,\r
+               STATUS_TICKMARK_OUT => STATUS_TICKMARK_OUT,\r
+               FRAME_ROW_OUT => FRAME_ROW_OUT,\r
+               FRAME_ERROR_OUT => FRAME_ERROR_OUT,\r
+               FRAME_FLAT_OUT => FRAME_FLAT_OUT,\r
+               FRAME_OVF_OUT => FRAME_OVF_OUT,\r
+               FRAME_UDF_OUT => FRAME_UDF_OUT,\r
+               FRAME_CTR_OUT => FRAME_CTR_OUT,\r
+               APV_CHANNEL_OUT => APV_CHANNEL_OUT,\r
+               APV_OVERFLOW_OUT => APV_OVERFLOW_OUT,\r
+               APV_UNDERFLOW_OUT => APV_UNDERFLOW_OUT,\r
+               APV_RAW_OUT => APV_RAW_OUT,\r
+               APV_ANALOG_OUT => APV_ANALOG_OUT,\r
+               APV_START_OUT => APV_START_OUT,\r
+               APV_LAST_OUT => APV_LAST_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_ADC_CLOCK_GEN: process\r
+begin\r
+       clk_apv_in <= '1'; wait for 12.5 ns;\r
+       clk_apv_in <= '0'; wait for 12.5 ns;\r
+end process THE_ADC_CLOCK_GEN;\r
+\r
+THE_APV_SIM_PROC: process\r
+begin\r
+       LOOP_IT: for J in 0 to 32 loop\r
+               wait until rising_edge(clk_apv_in);\r
+               adc_raw_in <= x"e00";\r
+               wait until rising_edge(clk_apv_in);\r
+               adc_raw_in <= x"100";\r
+               ONE_LOOP: for I in 0 to 32 loop\r
+                       wait until rising_edge(clk_apv_in);\r
+               end loop ONE_LOOP;\r
+       end loop LOOP_IT;\r
+\r
+       wait until rising_edge(clk_apv_in);\r
+       adc_raw_in <= x"fff";\r
+       wait until rising_edge(clk_apv_in);\r
+       adc_raw_in <= x"fff";\r
+       wait until rising_edge(clk_apv_in);\r
+       adc_raw_in <= x"fff";\r
+       HEADER_LOOP: for L in 0 to 8 loop\r
+               wait until rising_edge(clk_apv_in);\r
+               adc_raw_in <= x"eee";\r
+       end loop HEADER_LOOP;\r
+       DATA_LOOP: for L in 0 to 127 loop\r
+               wait until rising_edge(clk_apv_in);\r
+               adc_raw_in <= x"222";\r
+       end loop DATA_LOOP;\r
+       \r
+end process THE_APV_SIM_PROC;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       sync_in <= '0';\r
+       adc_valid_in <= '0';\r
+       apv_on_in <= '1';\r
+       bit_low_in <= x"200";\r
+       bit_high_in <= x"d00";\r
+       fl_low_in <= x"780";\r
+       fl_high_in <= x"880";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 100 ns;\r
+       adc_valid_in <= '1';\r
+       wait for 100 ns;\r
+\r
+       -- Tests may start now\r
+       -- send a SYNC sequence b"101"\r
+       wait until rising_edge(clk_apv_in);\r
+       sync_in <= '1';\r
+       wait until rising_edge(clk_apv_in);\r
+       sync_in <= '0';\r
+\r
+       -- wait until sync'ed\r
+--     wait until rising_edge(status_locked_out);\r
+--     wait for 300 ns;\r
+       \r
+       \r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_apv_map_mem_tmpl.vhd b/src/tb_apv_map_mem_tmpl.vhd
new file mode 100644 (file)
index 0000000..9e06c81
--- /dev/null
@@ -0,0 +1,38 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component apv_map_mem
+        port (Address : in std_logic_vector(6 downto 0); 
+        Q : out std_logic_vector(3 downto 0)
+    );
+    end component;
+
+    signal Address : std_logic_vector(6 downto 0) := (others => '0');
+    signal Q : std_logic_vector(3 downto 0);
+begin
+    u1 : apv_map_mem
+        port map (Address => Address, Q => Q
+        );
+
+    process
+
+    begin
+      Address <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 131 loop
+        wait for 10 ns;
+        Address <= Address + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_apv_trgctrl.vhd b/src/tb_apv_trgctrl.vhd
new file mode 100755 (executable)
index 0000000..ec21ace
--- /dev/null
@@ -0,0 +1,257 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT apv_trgctrl\r
+       PORT(\r
+               CLK_APV_IN : IN std_logic;\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SYNC_TRG_IN : IN std_logic;\r
+               TIME_TRG_IN : IN std_logic_vector(3 downto 0);\r
+               TRB_TRG_IN : IN std_logic_vector(3 downto 0);\r
+               STILL_BUSY_IN : IN std_logic;\r
+               TRG_3_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_3_DELAY_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_2_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_2_DELAY_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_1_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_1_DELAY_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_0_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_0_DELAY_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_SETUP_IN : IN std_logic_vector(7 downto 0);\r
+               TRB_TTAG_IN : IN std_logic_vector(15 downto 0);\r
+               TRB_TRND_IN : IN std_logic_vector(7 downto 0);\r
+               TRB_TTYPE_IN : IN std_logic_vector(3 downto 0);\r
+               TRB_TRGRCVD_IN : IN std_logic;\r
+               TRB_RST_COUNTER_IN : IN std_logic;\r
+               EDS_DONE_IN : IN std_logic;          \r
+               TRG_FOUND_OUT : OUT std_logic;\r
+               TRB_MISSING_OUT : OUT std_logic;\r
+               TRB_RELEASE_OUT : OUT std_logic;\r
+               TRB_COUNTER_OUT : OUT std_logic_vector(15 downto 0);\r
+               EDS_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               EDS_AVAIL_OUT : OUT std_logic;\r
+               EDS_FULL_OUT : OUT std_logic;\r
+               EDS_LEVEL_OUT : OUT std_logic_vector(4 downto 0);\r
+               FRM_REQD_OUT : OUT std_logic;\r
+               APV_TRG_OUT : OUT std_logic;\r
+               APV_SYNC_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(63 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_APV_IN :  std_logic;\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SYNC_TRG_IN :  std_logic;\r
+       SIGNAL TIME_TRG_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRB_TRG_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL STILL_BUSY_IN :  std_logic;\r
+       SIGNAL TRG_FOUND_OUT :  std_logic;\r
+       SIGNAL TRG_3_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_3_DELAY_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_2_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_2_DELAY_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_1_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_1_DELAY_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_0_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_0_DELAY_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_SETUP_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL TRB_TTAG_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL TRB_TRND_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL TRB_TTYPE_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRB_TRGRCVD_IN :  std_logic;\r
+       SIGNAL TRB_MISSING_OUT :  std_logic;\r
+       SIGNAL TRB_RELEASE_OUT :  std_logic;\r
+       SIGNAL TRB_RST_COUNTER_IN :  std_logic;\r
+       SIGNAL TRB_COUNTER_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL EDS_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL EDS_AVAIL_OUT :  std_logic;\r
+       SIGNAL EDS_DONE_IN :  std_logic;\r
+       SIGNAL EDS_FULL_OUT :  std_logic;\r
+       SIGNAL EDS_LEVEL_OUT :  std_logic_vector(4 downto 0);\r
+       SIGNAL FRM_REQD_OUT :  std_logic;\r
+       SIGNAL APV_TRG_OUT :  std_logic;\r
+       SIGNAL APV_SYNC_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(63 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: apv_trgctrl PORT MAP(\r
+               CLK_APV_IN => CLK_APV_IN,\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SYNC_TRG_IN => SYNC_TRG_IN,\r
+               TIME_TRG_IN => TIME_TRG_IN,\r
+               TRB_TRG_IN => TRB_TRG_IN,\r
+               STILL_BUSY_IN => STILL_BUSY_IN,\r
+               TRG_FOUND_OUT => TRG_FOUND_OUT,\r
+               TRG_3_TODO_IN => TRG_3_TODO_IN,\r
+               TRG_3_DELAY_IN => TRG_3_DELAY_IN,\r
+               TRG_2_TODO_IN => TRG_2_TODO_IN,\r
+               TRG_2_DELAY_IN => TRG_2_DELAY_IN,\r
+               TRG_1_TODO_IN => TRG_1_TODO_IN,\r
+               TRG_1_DELAY_IN => TRG_1_DELAY_IN,\r
+               TRG_0_TODO_IN => TRG_0_TODO_IN,\r
+               TRG_0_DELAY_IN => TRG_0_DELAY_IN,\r
+               TRG_SETUP_IN => TRG_SETUP_IN,\r
+               TRB_TTAG_IN => TRB_TTAG_IN,\r
+               TRB_TRND_IN => TRB_TRND_IN,\r
+               TRB_TTYPE_IN => TRB_TTYPE_IN,\r
+               TRB_TRGRCVD_IN => TRB_TRGRCVD_IN,\r
+               TRB_MISSING_OUT => TRB_MISSING_OUT,\r
+               TRB_RELEASE_OUT => TRB_RELEASE_OUT,\r
+               TRB_RST_COUNTER_IN => TRB_RST_COUNTER_IN,\r
+               TRB_COUNTER_OUT => TRB_COUNTER_OUT,\r
+               EDS_DATA_OUT => EDS_DATA_OUT,\r
+               EDS_AVAIL_OUT => EDS_AVAIL_OUT,\r
+               EDS_DONE_IN => EDS_DONE_IN,\r
+               EDS_FULL_OUT => EDS_FULL_OUT,\r
+               EDS_LEVEL_OUT => EDS_LEVEL_OUT,\r
+               FRM_REQD_OUT => FRM_REQD_OUT,\r
+               APV_TRG_OUT => APV_TRG_OUT,\r
+               APV_SYNC_OUT => APV_SYNC_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+-- Generate the clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '0'; wait for 5 ns;\r
+       clk_in <= '1'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_APV_CLOCK_GEN: process\r
+begin\r
+       clk_apv_in <= '0'; wait for 12.5 ns;\r
+       clk_apv_in <= '1'; wait for 12.5 ns;\r
+end process THE_APV_CLOCK_GEN;\r
+\r
+-- The real testbench\r
+THE_TESTBENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       sync_trg_in <= '0';\r
+       time_trg_in <= x"0";\r
+       trb_trg_in <= x"0";\r
+       still_busy_in <= '0';\r
+       trg_3_todo_in <= x"1";\r
+       trg_3_delay_in <= x"0";\r
+       trg_2_todo_in <= x"1";\r
+       trg_2_delay_in <= x"0";\r
+       trg_1_todo_in <= x"1";\r
+       trg_1_delay_in <= x"0";\r
+       trg_0_todo_in <= x"1";\r
+       trg_0_delay_in <= x"0";\r
+       trg_setup_in <= x"10"; -- TRG0 is active, non-inverted\r
+       trb_ttag_in <= x"0000";\r
+       trb_trnd_in <= x"00";\r
+       trb_ttype_in <= x"0";\r
+       trb_trgrcvd_in <= '0';\r
+       trb_rst_counter_in <= '0';\r
+       eds_done_in <= '0';\r
+       \r
+       wait for 20 ns;\r
+       \r
+       -- Do a reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       wait for 100 ns;\r
+       \r
+       -- test may start here\r
+       \r
+       wait until rising_edge(clk_in);\r
+       sync_trg_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       sync_trg_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 1 us;\r
+       \r
+       -- first trigger\r
+       -- send in one timing trigger\r
+       wait for 77.7 ns;\r
+       time_trg_in <= x"1";    \r
+       wait for 222.2 ns;\r
+       time_trg_in <= x"0";\r
+       \r
+       -- send TRB trigger infos\r
+       wait for 2.3 us;\r
+       wait until rising_edge(clk_in);\r
+       trb_ttype_in <= x"1";\r
+       trb_ttag_in <= x"abcd";\r
+       trb_trnd_in <= x"ef";\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '1';\r
+\r
+       -- release trigger\r
+       wait until rising_edge(trb_release_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 1.22 us;\r
+\r
+       -- next trigger\r
+       -- send in one timing trigger\r
+       wait for 77.7 ns;\r
+       time_trg_in <= x"1";    \r
+       wait for 222.2 ns;\r
+       time_trg_in <= x"0";\r
+       \r
+       -- send TRB trigger infos\r
+       wait for 2.3 us;\r
+       wait until rising_edge(clk_in);\r
+       trb_ttype_in <= x"2";\r
+       trb_ttag_in <= x"dead";\r
+       trb_trnd_in <= x"42";\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '1';\r
+\r
+       -- release trigger\r
+       wait until rising_edge(trb_release_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 1.11 us;\r
+       \r
+       -- release one EDS\r
+       wait until rising_edge(clk_in);\r
+       eds_done_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       eds_done_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 200 ns;\r
+\r
+       -- release one EDS\r
+       wait until rising_edge(clk_in);\r
+       eds_done_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       eds_done_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       -- Stay a while, stay forever.... wuhahahahaha\r
+       wait;\r
+end process THE_TESTBENCH_PROC;\r
+\r
+\r
+END;\r
diff --git a/src/tb_comp4bit_tmpl.vhd b/src/tb_comp4bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..69fe6ee
--- /dev/null
@@ -0,0 +1,48 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component comp4bit
+        port (DataA : in std_logic_vector(3 downto 0); 
+        DataB : in std_logic_vector(3 downto 0); AGTB: out std_logic
+    );
+    end component;
+
+    signal DataA : std_logic_vector(3 downto 0) := (others => '0');
+    signal DataB : std_logic_vector(3 downto 0) := (others => '0');
+    signal AGTB: std_logic;
+begin
+    u1 : comp4bit
+        port map (DataA => DataA, DataB => DataB, AGTB => AGTB
+        );
+
+    process
+
+    begin
+      DataA <= (others => '0') ;
+      for i in 0 to 200 loop
+        wait for 10 ns;
+        DataA <= DataA + '1' ;
+      end loop;
+      wait;
+    end process;
+
+    process
+
+    begin
+      DataB <= (others => '0') ;
+      for i in 0 to 100 loop
+        wait for 10 ns;
+        DataB <= DataB + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_crossfifo.vhd b/src/tb_crossfifo.vhd
new file mode 100644 (file)
index 0000000..5dda828
--- /dev/null
@@ -0,0 +1,260 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       component crossfifo is\r
+       port( DATA                      : in    std_logic_vector(95 downto 0); \r
+                 WRCLOCK               : in    std_logic; \r
+                 RDCLOCK               : in    std_logic; \r
+                 WREN                  : in    std_logic; \r
+                 RDEN                  : in    std_logic; \r
+                 RESET                 : in    std_logic; \r
+                 RPRESET               : in    std_logic; \r
+                 Q                             : out   std_logic_vector(95 downto 0); \r
+                 EMPTY                 : out   std_logic; \r
+                 FULL                  : out   std_logic; \r
+                 ALMOSTEMPTY   : out   std_logic\r
+               );\r
+       end component;\r
+\r
+       signal DATA                     : std_logic_vector(95 downto 0); \r
+       signal WRCLOCK          : std_logic; \r
+       signal RDCLOCK          : std_logic; \r
+       signal WREN                     : std_logic; \r
+       signal RDEN                     : std_logic; \r
+       signal RESET            : std_logic; \r
+       signal RPRESET          : std_logic; \r
+       signal Q                        : std_logic_vector(95 downto 0); \r
+       signal EMPTY            : std_logic; \r
+       signal FULL                     : std_logic; \r
+       signal ALMOSTEMPTY      : std_logic;\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: crossfifo PORT MAP(\r
+               DATA => DATA,\r
+               WRCLOCK => WRCLOCK,\r
+               RDCLOCK => RDCLOCK,\r
+               WREN => WREN,\r
+               RDEN => RDEN,\r
+               RESET => RESET,\r
+               RPRESET => RPRESET,\r
+               Q => Q,\r
+               EMPTY => EMPTY,\r
+               FULL => FULL,\r
+               ALMOSTEMPTY => ALMOSTEMPTY\r
+          );\r
+          \r
+RDCLOCK_GEN: process\r
+begin\r
+       rdclock <= '1'; wait for 12.5 ns;\r
+       rdclock <= '0'; wait for 12.5 ns;\r
+end process RDCLOCK_GEN;\r
+\r
+WRCLOCK_GEN: process\r
+begin\r
+       wait until rising_edge(rdclock);  wait for 3.33 ns; wrclock <= '1';\r
+       wait until falling_edge(rdclock); wait for 3.33 ns; wrclock <= '0';\r
+end process WRCLOCK_GEN;\r
+\r
+RDEN_GEN: process\r
+begin\r
+       rden <= '0';\r
+       wait until falling_edge(reset);\r
+       wait until falling_edge(almostempty); \r
+       rden <= '1';\r
+end process RDEN_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       data <= x"000_000_000_000_000_000_000_000";\r
+       wren <= '0';\r
+       --rden <= '0';\r
+       reset <= '0';\r
+       rpreset <= '0';\r
+\r
+       -- Reset all\r
+       reset <= '1'; wait for 50 ns;\r
+       reset <= '0'; wait for 50 ns;\r
+\r
+       -- Tests may start here\r
+\r
+       wait until rising_edge(wrclock);\r
+       wren <= '1';\r
+       data(95 downto 84) <= x"001";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"002";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"003";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"004";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"005";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"006";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"007";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"008";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"009";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"00f";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"010";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"011";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"012";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"013";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"014";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"015";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"016";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"017";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"018";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"019";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"01f";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"020";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"021";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"022";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"023";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"024";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"025";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"026";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"027";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"028";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"029";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"02f";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"030";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"031";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"032";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"033";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"034";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"035";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"036";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"037";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"038";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"039";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"03f";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"040";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"041";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"042";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"043";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"044";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"045";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"046";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"047";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"048";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"049";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"04f";\r
+       wait until rising_edge(wrclock);\r
+\r
+\r
+       -- Stay a while, stay forever.\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_crossfifo_tmpl.vhd b/src/tb_crossfifo_tmpl.vhd
new file mode 100644 (file)
index 0000000..405d101
--- /dev/null
@@ -0,0 +1,103 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component crossfifo
+        port (Data : in std_logic_vector(95 downto 0); 
+        WrClock: in std_logic; RdClock: in std_logic; WrEn: in std_logic; 
+        RdEn: in std_logic; Reset: in std_logic; RPReset: in std_logic; 
+        Q : out std_logic_vector(95 downto 0); Empty: out std_logic; 
+        Full: out std_logic; AlmostEmpty: out std_logic
+    );
+    end component;
+
+    signal Data : std_logic_vector(95 downto 0) := (others => '0');
+    signal WrClock: std_logic := '0';
+    signal RdClock: std_logic := '0';
+    signal WrEn: std_logic := '0';
+    signal RdEn: std_logic := '0';
+    signal Reset: std_logic := '0';
+    signal RPReset: std_logic := '0';
+    signal Q : std_logic_vector(95 downto 0);
+    signal Empty: std_logic;
+    signal Full: std_logic;
+    signal AlmostEmpty: std_logic;
+begin
+    u1 : crossfifo
+        port map (Data => Data, WrClock => WrClock, RdClock => RdClock, 
+            WrEn => WrEn, RdEn => RdEn, Reset => Reset, RPReset => RPReset, 
+            Q => Q, Empty => Empty, Full => Full, AlmostEmpty => AlmostEmpty
+        );
+
+    process
+
+    begin
+      Data <= (others => '0') ;
+      wait for 100 ns;
+      wait until Reset = '0';
+      for i in 0 to 259 loop
+        wait until WrClock'event and WrClock = '1';
+        Data <= Data + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    WrClock <= not WrClock after 5.00 ns;
+
+    RdClock <= not RdClock after 5.00 ns;
+
+    process
+
+    begin
+      WrEn <= '0' ;
+      wait for 100 ns;
+      wait until Reset = '0';
+      for i in 0 to 259 loop
+        wait until WrClock'event and WrClock = '1';
+        WrEn <= '1' after 1 ns;
+      end loop;
+      WrEn <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      RdEn <= '0' ;
+      wait until Reset = '0';
+      wait until WrEn = '1';
+      wait until WrEn = '0';
+      for i in 0 to 259 loop
+        wait until RdClock'event and RdClock = '1';
+        RdEn <= '1' after 1 ns;
+      end loop;
+      RdEn <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      Reset <= '1' ;
+      wait for 100 ns;
+      Reset <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      RPReset <= '1' ;
+      wait for 100 ns;
+      RPReset <= '0' ;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_crossover.vhd b/src/tb_crossover.vhd
new file mode 100644 (file)
index 0000000..87ec08e
--- /dev/null
@@ -0,0 +1,161 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       component crossover is\r
+       port( DATA                      : in    std_logic_vector(95 downto 0); \r
+                 WRCLOCK               : in    std_logic; \r
+                 RDCLOCK               : in    std_logic; \r
+                 WREN                  : in    std_logic; \r
+                 RDEN                  : in    std_logic; \r
+                 RESET                 : in    std_logic; \r
+                 RPRESET               : in    std_logic; \r
+                 Q                             : out   std_logic_vector(95 downto 0); \r
+                 WCNT                  : out   std_logic_vector(4 downto 0); \r
+                 RCNT                  : out   std_logic_vector(4 downto 0); \r
+                 EMPTY                 : out   std_logic; \r
+                 FULL                  : out   std_logic\r
+               );\r
+       end component;\r
+               \r
+       signal DATA                     : std_logic_vector(95 downto 0); \r
+       signal WRCLOCK          : std_logic; \r
+       signal RDCLOCK          : std_logic; \r
+       signal WREN                     : std_logic; \r
+       signal RDEN                     : std_logic; \r
+       signal RESET            : std_logic; \r
+       signal RPRESET          : std_logic; \r
+       signal Q                        : std_logic_vector(95 downto 0); \r
+       signal WCNT                     : std_logic_vector(4 downto 0); \r
+       signal RCNT                     : std_logic_vector(4 downto 0); \r
+       signal EMPTY            : std_logic; \r
+       signal FULL                     : std_logic; \r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: crossover PORT MAP(\r
+               DATA => DATA,\r
+               WRCLOCK => WRCLOCK,\r
+               RDCLOCK => RDCLOCK,\r
+               WREN => WREN,\r
+               RDEN => RDEN,\r
+               RESET => RESET,\r
+               RPRESET => RPRESET,\r
+               Q => Q,\r
+               RCNT => RCNT,\r
+               WCNT => WCNT,\r
+               EMPTY => EMPTY,\r
+               FULL => FULL\r
+          );\r
+          \r
+RDCLOCK_GEN: process\r
+begin\r
+       rdclock <= '1'; wait for 12.5 ns;\r
+       rdclock <= '0'; wait for 12.5 ns;\r
+end process RDCLOCK_GEN;\r
+\r
+WRCLOCK_GEN: process\r
+begin\r
+       wait until rising_edge(rdclock);  wait for 3.33 ns; wrclock <= '1';\r
+       wait until falling_edge(rdclock); wait for 3.33 ns; wrclock <= '0';\r
+end process WRCLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       data <= x"000_000_000_000_000_000_000_000";\r
+       wren <= '0';\r
+       rden <= '0';\r
+       reset <= '0';\r
+       rpreset <= '0';\r
+\r
+       -- Reset all\r
+       reset <= '1'; wait for 50 ns;\r
+       reset <= '0'; wait for 50 ns;\r
+\r
+       -- Tests may start here\r
+\r
+       wait until rising_edge(wrclock);\r
+       wren <= '1';\r
+       data(95 downto 84) <= x"100";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"101";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"102";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"103";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"104";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"105";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"106";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"107";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"108";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"109";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10a";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10b";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10c";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10d";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10e";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"10f";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"110";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"111";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"112";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"113";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"114";\r
+       wait until rising_edge(wrclock);\r
+       data(95 downto 84) <= x"115";\r
+       wait until rising_edge(wrclock);\r
+       wren <= '0';\r
+\r
+       wait until rising_edge(rdclock);\r
+       rden <= '1';\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+       \r
+       wait until rising_edge(rdclock);\r
+       wait until rising_edge(rdclock);\r
+\r
+       -- Stay a while, stay forever.\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_crossover_tmpl.vhd b/src/tb_crossover_tmpl.vhd
new file mode 100644 (file)
index 0000000..ca6cbbf
--- /dev/null
@@ -0,0 +1,106 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_PROD_Build (44)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component crossover
+        port (Data : in std_logic_vector(95 downto 0); 
+        WrClock: in std_logic; RdClock: in std_logic; WrEn: in std_logic; 
+        RdEn: in std_logic; Reset: in std_logic; RPReset: in std_logic; 
+        Q : out std_logic_vector(95 downto 0); 
+        WCNT : out std_logic_vector(4 downto 0); 
+        RCNT : out std_logic_vector(4 downto 0); Empty: out std_logic; 
+        Full: out std_logic
+    );
+    end component;
+
+    signal Data : std_logic_vector(95 downto 0) := (others => '0');
+    signal WrClock: std_logic := '0';
+    signal RdClock: std_logic := '0';
+    signal WrEn: std_logic := '0';
+    signal RdEn: std_logic := '0';
+    signal Reset: std_logic := '0';
+    signal RPReset: std_logic := '0';
+    signal Q : std_logic_vector(95 downto 0);
+    signal WCNT : std_logic_vector(4 downto 0);
+    signal RCNT : std_logic_vector(4 downto 0);
+    signal Empty: std_logic;
+    signal Full: std_logic;
+begin
+    u1 : crossover
+        port map (Data => Data, WrClock => WrClock, RdClock => RdClock, 
+            WrEn => WrEn, RdEn => RdEn, Reset => Reset, RPReset => RPReset, 
+            Q => Q, WCNT => WCNT, RCNT => RCNT, Empty => Empty, Full => Full
+        );
+
+    process
+
+    begin
+      Data <= (others => '0') ;
+      wait for 100 ns;
+      wait until Reset = '0';
+      for i in 0 to 19 loop
+        wait until WrClock'event and WrClock = '1';
+        Data <= Data + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    WrClock <= not WrClock after 5.00 ns;
+
+    RdClock <= not RdClock after 5.00 ns;
+
+    process
+
+    begin
+      WrEn <= '0' ;
+      wait for 100 ns;
+      wait until Reset = '0';
+      for i in 0 to 19 loop
+        wait until WrClock'event and WrClock = '1';
+        WrEn <= '1' after 1 ns;
+      end loop;
+      WrEn <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      RdEn <= '0' ;
+      wait until Reset = '0';
+      wait until WrEn = '1';
+      wait until WrEn = '0';
+      for i in 0 to 19 loop
+        wait until RdClock'event and RdClock = '1';
+        RdEn <= '1' after 1 ns;
+      end loop;
+      RdEn <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      Reset <= '1' ;
+      wait for 100 ns;
+      Reset <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      RPReset <= '1' ;
+      wait for 100 ns;
+      RPReset <= '0' ;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_dpram_8x19_tmpl.vhd b/src/tb_dpram_8x19_tmpl.vhd
new file mode 100644 (file)
index 0000000..08ccad6
--- /dev/null
@@ -0,0 +1,98 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_PROD_Build (44)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component dpram_8x19
+        port (WrAddress : in std_logic_vector(3 downto 0); 
+        Data : in std_logic_vector(18 downto 0); WrClock: in std_logic; 
+        WE: in std_logic; WrClockEn: in std_logic; 
+        RdAddress : in std_logic_vector(3 downto 0); 
+        Q : out std_logic_vector(18 downto 0)
+    );
+    end component;
+
+    signal WrAddress : std_logic_vector(3 downto 0) := (others => '0');
+    signal Data : std_logic_vector(18 downto 0) := (others => '0');
+    signal WrClock: std_logic := '0';
+    signal WE: std_logic := '0';
+    signal WrClockEn: std_logic := '0';
+    signal RdAddress : std_logic_vector(3 downto 0) := (others => '0');
+    signal Q : std_logic_vector(18 downto 0);
+begin
+    u1 : dpram_8x19
+        port map (WrAddress => WrAddress, Data => Data, WrClock => WrClock, 
+            WE => WE, WrClockEn => WrClockEn, RdAddress => RdAddress, Q => Q
+        );
+
+    process
+
+    begin
+      WrAddress <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 38 loop
+        wait until WrClock'event and WrClock = '1';
+        WrAddress <= WrAddress + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    process
+
+    begin
+      Data <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 19 loop
+        wait until WrClock'event and WrClock = '1';
+        Data <= Data + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    WrClock <= not WrClock after 5.00 ns;
+
+    process
+
+    begin
+      WE <= '0' ;
+      wait for 10 ns;
+      for i in 0 to 19 loop
+        wait until WrClock'event and WrClock = '1';
+        WE <= '1' after 1 ns;
+      end loop;
+      WE <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      WrClockEn <= '0' ;
+      wait for 100 ns;
+      wait for 10 ns;
+      WrClockEn <= '1' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      RdAddress <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 38 loop
+        wait for 10 ns;
+        RdAddress <= RdAddress + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_ipu_fifo_stage.vhd b/src/tb_ipu_fifo_stage.vhd
new file mode 100644 (file)
index 0000000..c1d3d3a
--- /dev/null
@@ -0,0 +1,359 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT ipu_fifo_stage\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SECTOR_IN : IN std_logic_vector(2 downto 0);\r
+               MODULE_IN : IN std_logic_vector(2 downto 0);\r
+               IPU_NUMBER_IN : IN std_logic_vector(15 downto 0);\r
+               IPU_INFORMATION_IN : IN std_logic_vector(7 downto 0);\r
+               IPU_START_READOUT_IN : IN std_logic;\r
+               IPU_READ_IN : IN std_logic;\r
+               DHDR_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               DHDR_LENGTH_IN : IN std_logic_vector(15 downto 0);\r
+               DHDR_STORE_IN : IN std_logic;\r
+               FIFO_START_IN : IN std_logic;\r
+               FIFO_0_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_1_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_2_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_3_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_4_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_5_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_6_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_7_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_8_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_9_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_10_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_11_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_12_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_13_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_14_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_15_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_WE_IN : IN std_logic_vector(15 downto 0);\r
+               FIFO_DONE_IN : IN std_logic;          \r
+               IPU_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               IPU_DATAREADY_OUT : OUT std_logic;\r
+               IPU_READOUT_FINISHED_OUT : OUT std_logic;\r
+               IPU_LENGTH_OUT : OUT std_logic_vector(15 downto 0);\r
+               IPU_ERROR_PATTERN_OUT : OUT std_logic_vector(31 downto 0);\r
+               DBG_BSM_OUT : OUT std_logic_vector(7 downto 0);\r
+               DBG_OUT : OUT std_logic_vector(63 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SECTOR_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL MODULE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL IPU_NUMBER_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL IPU_INFORMATION_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL IPU_START_READOUT_IN :  std_logic;\r
+       SIGNAL IPU_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL IPU_DATAREADY_OUT :  std_logic;\r
+       SIGNAL IPU_READOUT_FINISHED_OUT :  std_logic;\r
+       SIGNAL IPU_READ_IN :  std_logic;\r
+       SIGNAL IPU_LENGTH_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL IPU_ERROR_PATTERN_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL DHDR_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL DHDR_LENGTH_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL DHDR_STORE_IN :  std_logic;\r
+       SIGNAL FIFO_START_IN :  std_logic;\r
+       SIGNAL FIFO_0_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_1_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_2_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_3_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_4_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_5_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_6_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_7_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_8_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_9_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_10_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_11_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_12_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_13_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_14_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_15_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_WE_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL FIFO_DONE_IN :  std_logic;\r
+       SIGNAL DBG_BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL DBG_OUT :  std_logic_vector(63 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: ipu_fifo_stage PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SECTOR_IN => SECTOR_IN,\r
+               MODULE_IN => MODULE_IN,\r
+               IPU_NUMBER_IN => IPU_NUMBER_IN,\r
+               IPU_INFORMATION_IN => IPU_INFORMATION_IN,\r
+               IPU_START_READOUT_IN => IPU_START_READOUT_IN,\r
+               IPU_DATA_OUT => IPU_DATA_OUT,\r
+               IPU_DATAREADY_OUT => IPU_DATAREADY_OUT,\r
+               IPU_READOUT_FINISHED_OUT => IPU_READOUT_FINISHED_OUT,\r
+               IPU_READ_IN => IPU_READ_IN,\r
+               IPU_LENGTH_OUT => IPU_LENGTH_OUT,\r
+               IPU_ERROR_PATTERN_OUT => IPU_ERROR_PATTERN_OUT,\r
+               DHDR_DATA_IN => DHDR_DATA_IN,\r
+               DHDR_LENGTH_IN => DHDR_LENGTH_IN,\r
+               DHDR_STORE_IN => DHDR_STORE_IN,\r
+               FIFO_START_IN => FIFO_START_IN,\r
+               FIFO_0_DATA_IN => FIFO_0_DATA_IN,\r
+               FIFO_1_DATA_IN => FIFO_1_DATA_IN,\r
+               FIFO_2_DATA_IN => FIFO_2_DATA_IN,\r
+               FIFO_3_DATA_IN => FIFO_3_DATA_IN,\r
+               FIFO_4_DATA_IN => FIFO_4_DATA_IN,\r
+               FIFO_5_DATA_IN => FIFO_5_DATA_IN,\r
+               FIFO_6_DATA_IN => FIFO_6_DATA_IN,\r
+               FIFO_7_DATA_IN => FIFO_7_DATA_IN,\r
+               FIFO_8_DATA_IN => FIFO_8_DATA_IN,\r
+               FIFO_9_DATA_IN => FIFO_9_DATA_IN,\r
+               FIFO_10_DATA_IN => FIFO_10_DATA_IN,\r
+               FIFO_11_DATA_IN => FIFO_11_DATA_IN,\r
+               FIFO_12_DATA_IN => FIFO_12_DATA_IN,\r
+               FIFO_13_DATA_IN => FIFO_13_DATA_IN,\r
+               FIFO_14_DATA_IN => FIFO_14_DATA_IN,\r
+               FIFO_15_DATA_IN => FIFO_15_DATA_IN,\r
+               FIFO_WE_IN => FIFO_WE_IN,\r
+               FIFO_DONE_IN => FIFO_DONE_IN,\r
+               DBG_BSM_OUT => DBG_BSM_OUT,\r
+               DBG_OUT => DBG_OUT\r
+       );\r
+\r
+-- Generate the clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '0'; wait for 5 ns;\r
+       clk_in <= '1'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- The real testbench\r
+THE_TESTBENCH_PROC: process\r
+variable LOOP_I: integer;\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       module_in <= "000";\r
+       sector_in <= "111";\r
+       ipu_number_in <= x"0000";\r
+       ipu_information_in <= x"00";\r
+       ipu_start_readout_in <= '0';\r
+       ipu_read_in <= '0';\r
+       dhdr_data_in <= x"01234567";\r
+       dhdr_length_in <= x"0000";\r
+       dhdr_store_in <= '0';\r
+       fifo_start_in <= '0';\r
+       fifo_we_in <= x"0000";\r
+       fifo_done_in <= '0';\r
+       fifo_0_data_in <= (others => '0');\r
+       fifo_1_data_in <= (others => '0');\r
+       fifo_2_data_in <= (others => '0');\r
+       fifo_3_data_in <= (others => '0');\r
+       fifo_4_data_in <= (others => '0');\r
+       fifo_5_data_in <= (others => '0');\r
+       fifo_6_data_in <= (others => '0');\r
+       fifo_7_data_in <= (others => '0');\r
+       fifo_8_data_in <= (others => '0');\r
+       fifo_9_data_in <= (others => '0');\r
+       fifo_10_data_in <= (others => '0');\r
+       fifo_11_data_in <= (others => '0');\r
+       fifo_12_data_in <= (others => '0');\r
+       fifo_13_data_in <= (others => '0');\r
+       fifo_14_data_in <= (others => '0');\r
+       fifo_15_data_in <= (others => '0');\r
+       \r
+       wait for 20 ns;\r
+       \r
+       -- Do a reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- test may start here\r
+\r
+       -- Data is coming from processing stage\r
+       -- Start of event\r
+       wait until rising_edge(clk_in);\r
+       fifo_start_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       fifo_start_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Fill data buffers\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in <= b"1111_1111_1111_1111";\r
+       fifo_0_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0000_1111";\r
+       fifo_1_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0001_1110";\r
+       fifo_2_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0010_1101";\r
+       fifo_3_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0011_1100";\r
+       fifo_4_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0100_1011";\r
+       fifo_5_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0101_1010";\r
+       fifo_6_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0110_1001";\r
+       fifo_7_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_0111_1000";\r
+       fifo_8_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_1000_0111";\r
+       fifo_9_data_in(26 downto 0)  <= b"000_00_00_0000_0000_0000_1001_0110";\r
+       fifo_10_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1010_0101";\r
+       fifo_11_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1011_0100";\r
+       fifo_12_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1100_0011";\r
+       fifo_13_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1101_0010";\r
+       fifo_14_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1110_0001";\r
+       fifo_15_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_1111_0000";\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(26 downto 0) <= b"000_00_00_0000_0000_0000_0000_0000";\r
+       fifo_we_in(0) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Final stage, counter values setting\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(37 downto 27)  <= "10000000001"; -- "10000000011"; -- 3\r
+       fifo_1_data_in(37 downto 27)  <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_2_data_in(37 downto 27)  <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_3_data_in(37 downto 27)  <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_4_data_in(37 downto 27)  <= "10000000001"; -- "10000000101"; -- 5\r
+       fifo_5_data_in(37 downto 27)  <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_6_data_in(37 downto 27)  <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_7_data_in(37 downto 27)  <= "10000000001"; -- "10000000111"; -- 7\r
+       fifo_8_data_in(37 downto 27)  <= "10000000001"; -- "10000000001"; -- 1\r
+       fifo_9_data_in(37 downto 27)  <= "10000000001"; -- "10000000010"; -- 2\r
+       fifo_10_data_in(37 downto 27) <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_11_data_in(37 downto 27) <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_12_data_in(37 downto 27) <= "10000000001"; -- "00000000000"; -- invalid\r
+       fifo_13_data_in(37 downto 27) <= "10000000001"; -- "10000001000"; -- 8\r
+       fifo_14_data_in(37 downto 27) <= "10000000001"; -- "10000000111"; -- 7\r
+       fifo_15_data_in(37 downto 27) <= "10000000001"; -- "00000000000"; -- invalid\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Event (0) DHDR\r
+       wait until rising_edge(clk_in);\r
+       dhdr_data_in <= x"1abbcccc";\r
+       dhdr_length_in <= x"0010";\r
+       dhdr_store_in <= '1';\r
+       fifo_done_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       dhdr_store_in <= '0';\r
+       fifo_done_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       -- IPU request\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       ipu_number_in <= x"cccc";\r
+       ipu_information_in <= x"ff";\r
+       ipu_start_readout_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+       -- wait for statemachine to react       \r
+       -- transfer DHDR\r
+       wait until rising_edge(ipu_dataready_out);\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(ipu_readout_finished_out);\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       ipu_start_readout_in <= '0';\r
+       \r
+       wait;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+       ------------------------------------------------------------------------\r
+       ------------------------------------------------------------------------\r
+\r
+       -- wait for statemachine to react       \r
+       -- DHDR\r
+       wait until rising_edge(ipu_dataready_out);\r
+--     wait until rising_edge(clk_in);\r
+--     wait until rising_edge(clk_in);\r
+--     wait until rising_edge(clk_in);\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+\r
+       DATA_LOOP: for LOOP_I in 34 downto 0 loop\r
+               -- one data word\r
+               wait until rising_edge(ipu_dataready_out);\r
+--             wait until rising_edge(clk_in);\r
+--             wait until rising_edge(clk_in);\r
+--             wait until rising_edge(clk_in);\r
+               ipu_read_in <= '1';\r
+               wait until rising_edge(clk_in);\r
+               ipu_read_in <= '0';\r
+       end loop DATA_LOOP;\r
+\r
+\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Stay a while, stay forever.... wuhahahahaha\r
+       wait;\r
+end process THE_TESTBENCH_PROC;\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_ipu_fifo_stage_OLD.vhd b/src/tb_ipu_fifo_stage_OLD.vhd
new file mode 100644 (file)
index 0000000..3d3aa2e
--- /dev/null
@@ -0,0 +1,449 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT ipu_fifo_stage\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SECTOR_IN : IN std_logic_vector(2 downto 0);\r
+               MODULE_IN : IN std_logic_vector(2 downto 0);\r
+               IPU_NUMBER_IN : IN std_logic_vector(15 downto 0);\r
+               IPU_INFORMATION_IN : IN std_logic_vector(7 downto 0);\r
+               IPU_START_READOUT_IN : IN std_logic;\r
+               IPU_READ_IN : IN std_logic;\r
+               DHDR_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               DHDR_LENGTH_IN : IN std_logic_vector(15 downto 0);\r
+               DHDR_STORE_IN : IN std_logic;\r
+               FIFO_START_IN : IN std_logic;\r
+               FIFO_0_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_1_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_2_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_3_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_4_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_5_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_6_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_7_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_8_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_9_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_10_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_11_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_12_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_13_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_14_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_15_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               FIFO_WE_IN : IN std_logic_vector(15 downto 0);\r
+               FIFO_DONE_IN : IN std_logic;          \r
+               IPU_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               IPU_DATAREADY_OUT : OUT std_logic;\r
+               IPU_READOUT_FINISHED_OUT : OUT std_logic;\r
+               IPU_LENGTH_OUT : OUT std_logic_vector(15 downto 0);\r
+               IPU_ERROR_PATTERN_OUT : OUT std_logic_vector(31 downto 0);\r
+               DBG_BSM_OUT : OUT std_logic_vector(7 downto 0);\r
+               DBG_OUT : OUT std_logic_vector(63 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SECTOR_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL MODULE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL IPU_NUMBER_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL IPU_INFORMATION_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL IPU_START_READOUT_IN :  std_logic;\r
+       SIGNAL IPU_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL IPU_DATAREADY_OUT :  std_logic;\r
+       SIGNAL IPU_READOUT_FINISHED_OUT :  std_logic;\r
+       SIGNAL IPU_READ_IN :  std_logic;\r
+       SIGNAL IPU_LENGTH_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL IPU_ERROR_PATTERN_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL DHDR_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL DHDR_LENGTH_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL DHDR_STORE_IN :  std_logic;\r
+       SIGNAL FIFO_START_IN :  std_logic;\r
+       SIGNAL FIFO_0_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_1_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_2_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_3_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_4_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_5_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_6_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_7_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_8_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_9_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_10_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_11_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_12_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_13_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_14_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_15_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_WE_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL FIFO_DONE_IN :  std_logic;\r
+       SIGNAL DBG_BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL DBG_OUT :  std_logic_vector(63 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: ipu_fifo_stage PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SECTOR_IN => SECTOR_IN,\r
+               MODULE_IN => MODULE_IN,\r
+               IPU_NUMBER_IN => IPU_NUMBER_IN,\r
+               IPU_INFORMATION_IN => IPU_INFORMATION_IN,\r
+               IPU_START_READOUT_IN => IPU_START_READOUT_IN,\r
+               IPU_DATA_OUT => IPU_DATA_OUT,\r
+               IPU_DATAREADY_OUT => IPU_DATAREADY_OUT,\r
+               IPU_READOUT_FINISHED_OUT => IPU_READOUT_FINISHED_OUT,\r
+               IPU_READ_IN => IPU_READ_IN,\r
+               IPU_LENGTH_OUT => IPU_LENGTH_OUT,\r
+               IPU_ERROR_PATTERN_OUT => IPU_ERROR_PATTERN_OUT,\r
+               DHDR_DATA_IN => DHDR_DATA_IN,\r
+               DHDR_LENGTH_IN => DHDR_LENGTH_IN,\r
+               DHDR_STORE_IN => DHDR_STORE_IN,\r
+               FIFO_START_IN => FIFO_START_IN,\r
+               FIFO_0_DATA_IN => FIFO_0_DATA_IN,\r
+               FIFO_1_DATA_IN => FIFO_1_DATA_IN,\r
+               FIFO_2_DATA_IN => FIFO_2_DATA_IN,\r
+               FIFO_3_DATA_IN => FIFO_3_DATA_IN,\r
+               FIFO_4_DATA_IN => FIFO_4_DATA_IN,\r
+               FIFO_5_DATA_IN => FIFO_5_DATA_IN,\r
+               FIFO_6_DATA_IN => FIFO_6_DATA_IN,\r
+               FIFO_7_DATA_IN => FIFO_7_DATA_IN,\r
+               FIFO_8_DATA_IN => FIFO_8_DATA_IN,\r
+               FIFO_9_DATA_IN => FIFO_9_DATA_IN,\r
+               FIFO_10_DATA_IN => FIFO_10_DATA_IN,\r
+               FIFO_11_DATA_IN => FIFO_11_DATA_IN,\r
+               FIFO_12_DATA_IN => FIFO_12_DATA_IN,\r
+               FIFO_13_DATA_IN => FIFO_13_DATA_IN,\r
+               FIFO_14_DATA_IN => FIFO_14_DATA_IN,\r
+               FIFO_15_DATA_IN => FIFO_15_DATA_IN,\r
+               FIFO_WE_IN => FIFO_WE_IN,\r
+               FIFO_DONE_IN => FIFO_DONE_IN,\r
+               DBG_BSM_OUT => DBG_BSM_OUT,\r
+               DBG_OUT => DBG_OUT\r
+       );\r
+\r
+-- Generate the clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '0'; wait for 5 ns;\r
+       clk_in <= '1'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- The real testbench\r
+THE_TESTBENCH_PROC: process\r
+variable LOOP_I: integer;\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       module_in <= "000";\r
+       sector_in <= "111";\r
+       ipu_number_in <= x"0000";\r
+       ipu_information_in <= x"00";\r
+       ipu_start_readout_in <= '0';\r
+       ipu_read_in <= '0';\r
+       dhdr_data_in <= x"01234567";\r
+       dhdr_length_in <= x"0000";\r
+       dhdr_store_in <= '0';\r
+       fifo_start_in <= '0';\r
+       fifo_we_in <= x"0000";\r
+       fifo_done_in <= '0';\r
+       fifo_0_data_in <= (others => '0');\r
+       fifo_1_data_in <= (others => '0');\r
+       fifo_2_data_in <= (others => '0');\r
+       fifo_3_data_in <= (others => '0');\r
+       fifo_4_data_in <= (others => '0');\r
+       fifo_5_data_in <= (others => '0');\r
+       fifo_6_data_in <= (others => '0');\r
+       fifo_7_data_in <= (others => '0');\r
+       fifo_8_data_in <= (others => '0');\r
+       fifo_9_data_in <= (others => '0');\r
+       fifo_10_data_in <= (others => '0');\r
+       fifo_11_data_in <= (others => '0');\r
+       fifo_12_data_in <= (others => '0');\r
+       fifo_13_data_in <= (others => '0');\r
+       fifo_14_data_in <= (others => '0');\r
+       fifo_15_data_in <= (others => '0');\r
+       \r
+       wait for 20 ns;\r
+       \r
+       -- Do a reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- test may start here\r
+\r
+       -- Data is coming from processing stage\r
+       -- Start of event\r
+       wait until rising_edge(clk_in);\r
+       fifo_start_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       fifo_start_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Fill data buffers\r
+       -- FIFO 0 - 3 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(0) <= '1';\r
+       fifo_0_data_in(26 downto 0) <= b"111_111_0000000_00_0000_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(26 downto 0) <= b"111_111_0000001_00_0000_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(26 downto 0) <= b"111_111_0000010_00_0000_0011_0011";\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(0) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- FIFO 4 - 5 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(4) <= '1';\r
+       fifo_4_data_in(26 downto 0) <= b"111_111_0000000_00_0100_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_4_data_in(26 downto 0) <= b"111_111_0000001_00_0100_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_4_data_in(26 downto 0) <= b"111_111_0000010_00_0100_0011_0011";\r
+       wait until rising_edge(clk_in);\r
+       fifo_4_data_in(26 downto 0) <= b"111_111_0000011_00_0100_0100_0100";\r
+       wait until rising_edge(clk_in);\r
+       fifo_4_data_in(26 downto 0) <= b"111_111_0000100_00_0100_0101_0101";\r
+       wait until rising_edge(clk_in);\r
+       fifo_4_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(4) <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- FIFO 7 - 7 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(7) <= '1';\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000000_00_0111_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000001_00_0111_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000010_00_0111_0011_0011";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000011_00_0111_0100_0100";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000100_00_0111_0101_0101";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000101_00_0111_0110_0110";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"111_111_0000110_00_0111_0111_0111";\r
+       wait until rising_edge(clk_in);\r
+       fifo_7_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(7) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- FIFO 8 - 1 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(8) <= '1';\r
+       fifo_8_data_in(26 downto 0) <= b"111_111_0000000_00_1000_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_8_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(8) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- FIFO 9 - 2 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(9) <= '1';\r
+       fifo_9_data_in(26 downto 0) <= b"111_111_0000000_00_1001_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_9_data_in(26 downto 0) <= b"111_111_0000001_00_1001_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_9_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(9) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- FIFO 13 - 8 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(13) <= '1';\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000000_00_1101_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000001_00_1101_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000010_00_1101_0011_0011";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000011_00_1101_0100_0100";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000100_00_1101_0101_0101";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000101_00_1101_0110_0110";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000110_00_1101_0111_0111";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"111_111_0000111_00_1101_1000_1000";\r
+       wait until rising_edge(clk_in);\r
+       fifo_13_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(13) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- FIFO 14 - 7 data words\r
+       wait until rising_edge(clk_in);\r
+       fifo_we_in(14) <= '1';\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000000_00_1110_0001_0001";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000001_00_1110_0010_0010";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000010_00_1110_0011_0011";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000011_00_1110_0100_0100";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000100_00_1110_0101_0101";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000101_00_1110_0110_0110";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"111_111_0000110_00_1110_0111_0111";\r
+       wait until rising_edge(clk_in);\r
+       fifo_14_data_in(26 downto 0) <= b"000_000_0000000_00_0000_0000_0000";\r
+       fifo_we_in(14) <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Final stage, counter values setting\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       fifo_0_data_in(37 downto 27)  <= "10000000010"; -- "10000000011"; -- 3\r
+       fifo_1_data_in(37 downto 27)  <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_2_data_in(37 downto 27)  <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_3_data_in(37 downto 27)  <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_4_data_in(37 downto 27)  <= "10000000100"; -- "10000000101"; -- 5\r
+       fifo_5_data_in(37 downto 27)  <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_6_data_in(37 downto 27)  <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_7_data_in(37 downto 27)  <= "10000000110"; -- "10000000111"; -- 7\r
+       fifo_8_data_in(37 downto 27)  <= "10000000000"; -- "10000000001"; -- 1\r
+       fifo_9_data_in(37 downto 27)  <= "10000000001"; -- "10000000010"; -- 2\r
+       fifo_10_data_in(37 downto 27) <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_11_data_in(37 downto 27) <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_12_data_in(37 downto 27) <= "00000000000"; -- "00000000000"; -- invalid\r
+       fifo_13_data_in(37 downto 27) <= "10000000111"; -- "10000001000"; -- 8\r
+       fifo_14_data_in(37 downto 27) <= "10000000110"; -- "10000000111"; -- 7\r
+       fifo_15_data_in(37 downto 27) <= "00000000000"; -- "00000000000"; -- invalid\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Event (0) DHDR\r
+       wait until rising_edge(clk_in);\r
+       dhdr_data_in <= x"1abbcccc";\r
+       dhdr_length_in <= x"0021";\r
+       dhdr_store_in <= '1';\r
+       fifo_done_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       dhdr_store_in <= '0';\r
+       fifo_done_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       -- IPU request\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       ipu_number_in <= x"cccc";\r
+       ipu_information_in <= x"ff";\r
+       ipu_start_readout_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+       -- wait for statemachine to react       \r
+       -- transfer DHDR\r
+       wait until rising_edge(ipu_dataready_out);\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(ipu_readout_finished_out);\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       ipu_start_readout_in <= '0';\r
+       \r
+       wait;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+       ------------------------------------------------------------------------\r
+       ------------------------------------------------------------------------\r
+\r
+       -- wait for statemachine to react       \r
+       -- DHDR\r
+       wait until rising_edge(ipu_dataready_out);\r
+--     wait until rising_edge(clk_in);\r
+--     wait until rising_edge(clk_in);\r
+--     wait until rising_edge(clk_in);\r
+       ipu_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       ipu_read_in <= '0';\r
+\r
+       DATA_LOOP: for LOOP_I in 34 downto 0 loop\r
+               -- one data word\r
+               wait until rising_edge(ipu_dataready_out);\r
+--             wait until rising_edge(clk_in);\r
+--             wait until rising_edge(clk_in);\r
+--             wait until rising_edge(clk_in);\r
+               ipu_read_in <= '1';\r
+               wait until rising_edge(clk_in);\r
+               ipu_read_in <= '0';\r
+       end loop DATA_LOOP;\r
+\r
+\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Stay a while, stay forever.... wuhahahahaha\r
+       wait;\r
+end process THE_TESTBENCH_PROC;\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_logic_analyzer.vhd b/src/tb_logic_analyzer.vhd
new file mode 100644 (file)
index 0000000..a76bcc4
--- /dev/null
@@ -0,0 +1,148 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT logic_analyzer\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               ARM_IN : IN std_logic;\r
+               TRG_IN : IN std_logic;\r
+               MAX_SAMPLE_IN : IN std_logic_vector(9 downto 0);          \r
+               SM_ADDR_OUT : OUT std_logic_vector(9 downto 0);\r
+               SM_CE_OUT : OUT std_logic;\r
+               SM_WE_OUT : OUT std_logic;\r
+               CLEAR_OUT : OUT std_logic;\r
+               RUN_OUT : OUT std_logic;\r
+               SAMPLE_OUT : OUT std_logic;\r
+               READY_OUT : OUT std_logic;\r
+               LAST_OUT : OUT std_logic;\r
+               BSM_OUT : OUT std_logic_vector(3 downto 0);\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL ARM_IN :  std_logic;\r
+       SIGNAL TRG_IN :  std_logic;\r
+       SIGNAL MAX_SAMPLE_IN :  std_logic_vector(9 downto 0);\r
+       SIGNAL SM_ADDR_OUT :  std_logic_vector(9 downto 0);\r
+       SIGNAL SM_CE_OUT :  std_logic;\r
+       SIGNAL SM_WE_OUT :  std_logic;\r
+       SIGNAL CLEAR_OUT :  std_logic;\r
+       SIGNAL RUN_OUT :  std_logic;\r
+       SIGNAL SAMPLE_OUT :  std_logic;\r
+       SIGNAL READY_OUT :  std_logic;\r
+       SIGNAL LAST_OUT :  std_logic;\r
+       SIGNAL BSM_OUT :  std_logic_vector(3 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: logic_analyzer PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               ARM_IN => ARM_IN,\r
+               TRG_IN => TRG_IN,\r
+               MAX_SAMPLE_IN => MAX_SAMPLE_IN,\r
+               SM_ADDR_OUT => SM_ADDR_OUT,\r
+               SM_CE_OUT => SM_CE_OUT,\r
+               SM_WE_OUT => SM_WE_OUT,\r
+               CLEAR_OUT => CLEAR_OUT,\r
+               RUN_OUT => RUN_OUT,\r
+               SAMPLE_OUT => SAMPLE_OUT,\r
+               READY_OUT => READY_OUT,\r
+               LAST_OUT => LAST_OUT,\r
+               BSM_OUT => BSM_OUT,\r
+               STAT => STAT\r
+       );\r
+\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       trg_in <= '0';\r
+       arm_in <= '0';\r
+       max_sample_in <= b"00_0000_1000";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 400 ns;\r
+\r
+       -- Tests may start now\r
+       -- arm the machine\r
+       wait until rising_edge(clk_in);\r
+       arm_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       arm_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- wait for memory clear\r
+       wait until rising_edge(run_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- trigger it\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trg_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       trg_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- wait for end of cycle\r
+       wait until rising_edge(last_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 200 ns;\r
+\r
+       -- retrigger\r
+       max_sample_in <= b"00_0000_1111";\r
+       wait until rising_edge(clk_in);\r
+       arm_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       arm_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- wait for memory clear\r
+       wait until rising_edge(run_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- trigger it\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trg_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       trg_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       -- Stay a while, stay forever!\r
+       wait;\r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_max_data.vhd b/src/tb_max_data.vhd
new file mode 100644 (file)
index 0000000..70c93e7
--- /dev/null
@@ -0,0 +1,88 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT max_data\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               TODO_3_IN : IN std_logic_vector(3 downto 0);\r
+               TODO_2_IN : IN std_logic_vector(3 downto 0);\r
+               TODO_1_IN : IN std_logic_vector(3 downto 0);\r
+               TODO_0_IN : IN std_logic_vector(3 downto 0);          \r
+               TODO_MAX_OUT : OUT std_logic_vector(3 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL TODO_3_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TODO_2_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TODO_1_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TODO_0_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TODO_MAX_OUT :  std_logic_vector(3 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: max_data PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               TODO_3_IN => TODO_3_IN,\r
+               TODO_2_IN => TODO_2_IN,\r
+               TODO_1_IN => TODO_1_IN,\r
+               TODO_0_IN => TODO_0_IN,\r
+               TODO_MAX_OUT => TODO_MAX_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       todo_3_in <= x"0";\r
+       todo_2_in <= x"5";\r
+       todo_1_in <= x"0";\r
+       todo_0_in <= x"7";\r
+       \r
+       -- Sync reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 140 ns;\r
+       \r
+       -- Tests may start now\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       todo_3_in <= x"0";\r
+       todo_2_in <= x"1";\r
+       todo_1_in <= x"f";\r
+       todo_0_in <= x"c";\r
+\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+\r
+END;\r
diff --git a/src/tb_mult_3x8.vhd b/src/tb_mult_3x8.vhd
new file mode 100644 (file)
index 0000000..b9ad321
--- /dev/null
@@ -0,0 +1,125 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+library work;\r
+use work.adcmv3_components.all;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT mult_3x8 is\r
+       PORT( CLOCK             : in    std_logic; \r
+                 CLKEN         : in    std_logic; \r
+                 ACLR          : in    std_logic; \r
+                 DATAA         : in    std_logic_vector(2 downto 0); \r
+                 DATAB         : in    std_logic_vector(7 downto 0); \r
+                 RESULT        : out   std_logic_vector(10 downto 0)\r
+        );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLOCK :  std_logic;\r
+       SIGNAL CLKEN :  std_logic;\r
+       SIGNAL ACLR :  std_logic;\r
+       SIGNAL DATAA :  std_logic_vector(2 downto 0);\r
+       SIGNAL DATAB :  std_logic_vector(7 downto 0);\r
+       SIGNAL RESULT :  std_logic_vector(10 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: mult_3x8 PORT MAP(\r
+               CLOCK => CLOCK,\r
+               CLKEN => CLKEN,\r
+               ACLR => ACLR,\r
+               DATAA => DATAA,\r
+               DATAB => DATAB,\r
+               RESULT => RESULT\r
+       );\r
+\r
+-- Generate the clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clock <= '0'; wait for 5 ns;\r
+       clock <= '1'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- The real testbench\r
+THE_TESTBENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       aclr <= '0';\r
+       clken <= '1';\r
+       dataa <= b"000";\r
+       datab <= b"0000_0000";\r
+       \r
+       wait for 20 ns;\r
+       \r
+       -- Do a reset\r
+       wait until rising_edge(clock);\r
+       aclr <= '1';\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+       aclr <= '0';\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+       \r
+       -- test may start here\r
+       wait until rising_edge(clock);\r
+       dataa <= b"000";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"001";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"010";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+       \r
+       wait until rising_edge(clock);\r
+       dataa <= b"011";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"100";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"101";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"110";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       wait until rising_edge(clock);\r
+       dataa <= b"111";\r
+       datab <= x"81";\r
+       wait until rising_edge(clock);\r
+       wait until rising_edge(clock);\r
+\r
+       -- Stay a while, stay forever.... wuhahahahaha\r
+       wait;\r
+end process THE_TESTBENCH_PROC;\r
+\r
+\r
+END;\r
+\r
+\r
diff --git a/src/tb_mult_3x8_tmpl.vhd b/src/tb_mult_3x8_tmpl.vhd
new file mode 100644 (file)
index 0000000..4e92e9b
--- /dev/null
@@ -0,0 +1,72 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component mult_3x8
+        port (Clock: in std_logic; ClkEn: in std_logic; 
+        Aclr: in std_logic; DataA : in std_logic_vector(2 downto 0); 
+        DataB : in std_logic_vector(7 downto 0); 
+        Result : out std_logic_vector(10 downto 0)
+    );
+    end component;
+
+    signal Clock: std_logic := '0';
+    signal ClkEn: std_logic := '0';
+    signal Aclr: std_logic := '0';
+    signal DataA : std_logic_vector(2 downto 0) := (others => '0');
+    signal DataB : std_logic_vector(7 downto 0) := (others => '0');
+    signal Result : std_logic_vector(10 downto 0);
+begin
+    u1 : mult_3x8
+        port map (Clock => Clock, ClkEn => ClkEn, Aclr => Aclr, DataA => DataA, 
+            DataB => DataB, Result => Result
+        );
+
+    Clock <= not Clock after 5.00 ns;
+
+    process
+
+    begin
+      ClkEn <= '1' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      Aclr <= '1' ;
+      wait for 100 ns;
+      Aclr <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      DataA <= (others => '0') ;
+      for i in 0 to 200 loop
+        wait until Clock'event and Clock = '1';
+        DataA <= DataA + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    process
+
+    begin
+      DataB <= (others => '0') ;
+      for i in 0 to 200 loop
+        wait until Clock'event and Clock = '1';
+        DataB <= DataB + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_my_sbuf.vhd b/src/tb_my_sbuf.vhd
new file mode 100644 (file)
index 0000000..35e5255
--- /dev/null
@@ -0,0 +1,112 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT my_sbuf\r
+       PORT(\r
+               CLK : IN std_logic;\r
+               RESET : IN std_logic;\r
+               CLK_EN : IN std_logic;\r
+               COMB_DATAREADY_IN : IN std_logic;\r
+               COMB_READ_IN : IN std_logic;\r
+               COMB_DATA_IN : IN std_logic_vector(18 downto 0);\r
+               SYN_READ_IN : IN std_logic;          \r
+               COMB_NEXT_READ_OUT : OUT std_logic;\r
+               SYN_DATAREADY_OUT : OUT std_logic;\r
+               SYN_DATA_OUT : OUT std_logic_vector(18 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0);\r
+               STAT_BUFFER : OUT std_logic\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK :  std_logic;\r
+       SIGNAL RESET :  std_logic;\r
+       SIGNAL CLK_EN :  std_logic;\r
+       SIGNAL COMB_DATAREADY_IN :  std_logic;\r
+       SIGNAL COMB_NEXT_READ_OUT :  std_logic;\r
+       SIGNAL COMB_READ_IN :  std_logic;\r
+       SIGNAL COMB_DATA_IN :  std_logic_vector(18 downto 0);\r
+       SIGNAL SYN_DATAREADY_OUT :  std_logic;\r
+       SIGNAL SYN_DATA_OUT :  std_logic_vector(18 downto 0);\r
+       SIGNAL SYN_READ_IN :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL STAT_BUFFER :  std_logic;\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: my_sbuf PORT MAP(\r
+               CLK => CLK,\r
+               RESET => RESET,\r
+               CLK_EN => CLK_EN,\r
+               COMB_DATAREADY_IN => COMB_DATAREADY_IN,\r
+               COMB_NEXT_READ_OUT => COMB_NEXT_READ_OUT,\r
+               COMB_READ_IN => COMB_READ_IN,\r
+               COMB_DATA_IN => COMB_DATA_IN,\r
+               SYN_DATAREADY_OUT => SYN_DATAREADY_OUT,\r
+               SYN_DATA_OUT => SYN_DATA_OUT,\r
+               SYN_READ_IN => SYN_READ_IN,\r
+               DEBUG_OUT => DEBUG_OUT,\r
+               STAT_BUFFER => STAT_BUFFER\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk <= '1'; wait for 5.0 ns;\r
+       clk <= '0'; wait for 5.0 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TESTBENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       reset <= '0';\r
+       clk_en <= '1';\r
+       comb_dataready_in <= '0';\r
+       comb_read_in <= '0';\r
+       comb_data_in <= b"000_0000_0000_0000_0000";\r
+       syn_read_in <= '0';\r
+       \r
+       -- Reset the whole stuff\r
+       wait until rising_edge(clk);\r
+       reset <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       reset <= '0';\r
+       wait until rising_edge(clk);\r
+       \r
+       -- Tests may begin now\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '1';\r
+       comb_read_in <= '1';\r
+       comb_data_in <= b"100_0000_0000_0000_0000";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0001";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0010";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0011";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0100";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0101";\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '0';\r
+       comb_read_in <= '0';\r
+\r
+       wait until rising_edge(clk);\r
+       syn_read_in <= '1';     \r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       syn_read_in <= '0';\r
+\r
+       -- Stay a while... stay FOREVER!!! MUHAHAHAHA!\r
+       wait;\r
+\r
+end process THE_TESTBENCH_PROC;\r
+\r
+END;\r
diff --git a/src/tb_onewire_master.vhd b/src/tb_onewire_master.vhd
new file mode 100644 (file)
index 0000000..ecdc96a
--- /dev/null
@@ -0,0 +1,658 @@
+LIBRARY ieee;                                                                         \r
+USE ieee.std_logic_1164.ALL;                                                          \r
+USE ieee.numeric_std.ALL;                                                             \r
+\r
+library work;\r
+use work.trb_net_std.all;\r
+                                                                                 \r
+ENTITY testbench IS                                                                   \r
+END testbench;                                                                        \r
+                                                                                      \r
+ARCHITECTURE behavior OF testbench IS                                                 \r
+                                                                                      \r
+       COMPONENT onewire_master     \r
+       GENERIC(\r
+               CLK_PERIOD                                      : integer := 10  --clk period in ns\r
+               );\r
+       PORT(                                                                             \r
+               CLK : IN std_logic;                                                           \r
+               RESET : IN std_logic;       \r
+               READOUT_ENABLE_IN : IN std_logic;                                                  \r
+               ONEWIRE : INOUT std_logic_vector(15 downto 0);                                                    \r
+               BP_ONEWIRE : INOUT std_logic;                                                    \r
+               BP_DATA_OUT : OUT std_logic_vector(15 downto 0);                                 \r
+               DATA_OUT : OUT std_logic_vector(15 downto 0);                                 \r
+               ADDR_OUT : OUT std_logic_vector(6 downto 0);                                  \r
+               WRITE_OUT : OUT std_logic;\r
+               BUSY_OUT : OUT std_logic;\r
+               BSM_OUT : OUT std_logic_vector(7 downto 0);                                 \r
+               STAT : OUT std_logic_vector(15 downto 0)                                      \r
+               );                                                                            \r
+       END COMPONENT;                                                                    \r
+                                                                                      \r
+       SIGNAL CLK :  std_logic;\r
+       SIGNAL RESET :  std_logic;\r
+       SIGNAL READOUT_ENABLE_IN :  std_logic;\r
+       SIGNAL ONEWIRE :  std_logic_vector(15 downto 0);\r
+       SIGNAL BP_ONEWIRE :  std_logic;\r
+       SIGNAL BP_DATA_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL DATA_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL ADDR_OUT :  std_logic_vector(6 downto 0);\r
+       SIGNAL WRITE_OUT :  std_logic;\r
+       SIGNAL BUSY_OUT :  std_logic;\r
+       SIGNAL BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(15 downto 0);\r
+                                                                                      \r
+BEGIN                                                                                 \r
+                                                                                      \r
+-- Please check and add your generic clause manually                                  \r
+       uut: onewire_master \r
+       GENERIC MAP(\r
+               CLK_PERIOD => 10\r
+               )\r
+       PORT MAP(                                                     \r
+               CLK => CLK,\r
+               RESET => RESET,\r
+               READOUT_ENABLE_IN => READOUT_ENABLE_IN,\r
+               ONEWIRE => ONEWIRE,\r
+               BP_ONEWIRE => BP_ONEWIRE,\r
+               BP_DATA_OUT => BP_DATA_OUT,\r
+               DATA_OUT => DATA_OUT,\r
+               ADDR_OUT => ADDR_OUT,\r
+               WRITE_OUT => WRITE_OUT,\r
+               BUSY_OUT => BUSY_OUT,\r
+               BSM_OUT => BSM_OUT,                                                    \r
+               STAT => STAT                                                                  \r
+       );                                                                                \r
+                                                                                      \r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk <= '1'; wait for 5 ns;\r
+       clk <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       readout_enable_in <= '0';\r
+       reset <= '0';\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- Reset all\r
+       wait for 10 ns;\r
+       reset <= '1';\r
+       wait for 200 ns;\r
+       reset <= '0';\r
+       \r
+       -- Tests may start now\r
+       wait for 1 us;\r
+       wait until rising_edge(clk);\r
+       readout_enable_in <= '1';\r
+       wait until rising_edge(clk);\r
+       readout_enable_in <= '0';\r
+       wait until rising_edge(clk);\r
+\r
+       -- wait for reset pulse (READ_ID)\r
+       wait until falling_edge(onewire(0));\r
+       wait until rising_edge(onewire(0));\r
+       wait for 30 us;\r
+       onewire <= b"0000_0000_0000_0000";\r
+       bp_onewire <= '0';\r
+       wait for 120 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+\r
+       -- serial number\r
+       -- bit 0\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fe80";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 1\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ef71";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 2\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"d062";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 3\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"c153";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 4\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"b244";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 5\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"a335";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 6\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"9426";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 7\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"8517";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 8\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"7608";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 9\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"67f9";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 10\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"58ea";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 11\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"49db";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 12\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"3acc";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 13\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"2bbd";\r
+       bp_onewire <= '0';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 14\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"1cae";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 15\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"0d9f";\r
+       bp_onewire <= '1';\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- bit 16\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"dead";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 17\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"beef";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 18\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"affe";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 19\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"d00f";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 20\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"facc";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 21\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"0123";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 22\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"4567";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 23\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"89ab";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 24\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"cdef";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 25\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"aaaa";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 26\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"5555";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 27\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"6271";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 28\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"4711";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 29\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"0666";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 30\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"7550";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 31\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"bacc";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- bit 32\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"0123";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 33\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"4567";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 34\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"89ab";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 35\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"cdef";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 36\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"0f1e";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 37\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"2d3c";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 38\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"4b5a";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 39\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"6978";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 40\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"8796";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 41\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"a5b4";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 42\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"c3d2";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 43\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"e1f0";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 44\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fedc";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 45\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ba98";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 46\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"7654";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 47\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"3210";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- bit 48\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fffe";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 49\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fffd";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 50\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fffb";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 51\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fff7";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 52\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ffef";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 53\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ffdf";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 54\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ffbf";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 55\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"ff7f";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 56\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"feff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 57\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fdff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 58\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"fbff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 59\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"f7ff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 60\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"efff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 61\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"dfff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 62\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"bfff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 63\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"7fff";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- wait for reset pulse (CONV_TEMP)\r
+       wait until falling_edge(onewire(0));\r
+       wait until rising_edge(onewire(0));\r
+       wait for 30 us;\r
+       onewire <= b"0000_0000_0000_0000";\r
+       bp_onewire <= '0';\r
+       wait for 120 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+\r
+       -- wait for reset pulse (READ_TEMP)\r
+       wait until falling_edge(onewire(0));\r
+       wait until rising_edge(onewire(0));\r
+       wait for 30 us;\r
+       onewire <= b"0000_0000_0000_0000";\r
+       bp_onewire <= '0';\r
+       wait for 120 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+       wait until falling_edge(onewire(0));\r
+\r
+       -- temparature\r
+       -- bit 0\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"4001";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 1\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"5002";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 2\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"6004";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 3\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"7008";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 4\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"8010";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 5\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"9020";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 6\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"a040";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 7\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"b080";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 8\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"c100";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 9\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"d200";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 10\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"e400";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+       -- bit 11\r
+       wait until falling_edge(onewire(0));\r
+       onewire <= x"f800";\r
+       wait for 30 us;\r
+       onewire <= (others => 'H');\r
+       bp_onewire <= 'H';\r
+\r
+       -- Stay a while, stay forever.\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;                                                                                     \r
+                                \r
+                                                                                      \r
+END;                                                                                  
\ No newline at end of file
diff --git a/src/tb_onewire_spare_one_tmpl.vhd b/src/tb_onewire_spare_one_tmpl.vhd
new file mode 100644 (file)
index 0000000..8a91575
--- /dev/null
@@ -0,0 +1,38 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component onewire_spare_one
+        port (Address : in std_logic_vector(2 downto 0); 
+        Q : out std_logic_vector(3 downto 0)
+    );
+    end component;
+
+    signal Address : std_logic_vector(2 downto 0) := (others => '0');
+    signal Q : std_logic_vector(3 downto 0);
+begin
+    u1 : onewire_spare_one
+        port map (Address => Address, Q => Q
+        );
+
+    process
+
+    begin
+      Address <= (others => '0') ;
+      wait for 100 ns;
+      wait for 10 ns;
+      for i in 0 to 11 loop
+        wait for 10 ns;
+        Address <= Address + '1' ;
+      end loop;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_ped_corr_ctrl.vhd b/src/tb_ped_corr_ctrl.vhd
new file mode 100644 (file)
index 0000000..f968586
--- /dev/null
@@ -0,0 +1,1236 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT ped_corr_ctrl\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               EDS_DATA_IN : IN std_logic_vector(39 downto 0);\r
+               EDS_AVAIL_IN : IN std_logic;\r
+               EVT_TYPE_IN : IN std_logic_vector(2 downto 0);\r
+               BUF_TICK_IN : IN std_logic_vector(15 downto 0);\r
+               BUF_START_IN : IN std_logic_vector(15 downto 0);\r
+               BUF_0_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_1_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_2_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_3_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_4_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_5_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_6_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_7_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_8_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_9_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_10_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_11_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_12_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_13_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_14_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               BUF_15_DATA_IN : IN std_logic_vector(37 downto 0);\r
+               PED_0_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_1_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_2_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_3_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_4_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_5_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_6_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_7_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_8_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_9_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_10_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_11_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_12_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_13_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_14_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               PED_15_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_0_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_1_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_2_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_3_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_4_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_5_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_6_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_7_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_8_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_9_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_10_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_11_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_12_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_13_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_14_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               THR_15_DATA_IN : IN std_logic_vector(17 downto 0);\r
+               EDS_DONE_OUT : OUT std_logic;\r
+               DHDR_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               DHDR_LENGTH_OUT : OUT std_logic_vector(15 downto 0);\r
+               DHDR_STORE_OUT : OUT std_logic;\r
+               PED_ADDR_OUT : OUT std_logic_vector(6 downto 0);\r
+               THR_ADDR_OUT : OUT std_logic_vector(6 downto 0);\r
+               BUF_ADDR_OUT : OUT std_logic_vector(6 downto 0);\r
+               BUF_DONE_OUT : OUT std_logic;\r
+               FIFO_START_OUT : OUT std_logic;\r
+               FIFO_0_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_1_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_2_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_3_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_4_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_5_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_6_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_7_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_8_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_9_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_10_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_11_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_12_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_13_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_14_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_15_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               FIFO_WE_OUT : OUT std_logic_vector(15 downto 0);\r
+               FIFO_DONE_OUT : OUT std_logic;\r
+               DBG_BSM_OUT : OUT std_logic_vector(7 downto 0);\r
+               DBG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL EDS_DATA_IN :  std_logic_vector(39 downto 0);\r
+       SIGNAL EDS_AVAIL_IN :  std_logic;\r
+       SIGNAL EDS_DONE_OUT :  std_logic;\r
+       SIGNAL DHDR_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL DHDR_LENGTH_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL DHDR_STORE_OUT :  std_logic;\r
+       SIGNAL EVT_TYPE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL BUF_ADDR_OUT :  std_logic_vector(6 downto 0);\r
+       SIGNAL BUF_DONE_OUT :  std_logic;\r
+       SIGNAL BUF_TICK_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_START_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_0_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_1_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_2_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_3_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_4_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_5_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_6_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_7_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_8_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_9_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_10_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_11_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_12_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_13_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_14_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_15_DATA_IN :  std_logic_vector(37 downto 0);\r
+       SIGNAL THR_ADDR_OUT :  std_logic_vector(6 downto 0);\r
+       SIGNAL THR_0_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_1_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_2_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_3_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_4_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_5_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_6_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_7_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_8_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_9_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_10_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_11_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_12_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_13_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_14_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL THR_15_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_ADDR_OUT :  std_logic_vector(6 downto 0);\r
+       SIGNAL PED_0_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_1_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_2_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_3_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_4_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_5_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_6_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_7_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_8_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_9_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_10_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_11_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_12_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_13_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_14_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL PED_15_DATA_IN :  std_logic_vector(17 downto 0);\r
+       SIGNAL FIFO_START_OUT :  std_logic;\r
+       SIGNAL FIFO_0_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_1_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_2_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_3_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_4_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_5_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_6_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_7_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_8_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_9_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_10_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_11_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_12_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_13_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_14_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_15_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL FIFO_WE_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL FIFO_DONE_OUT :  std_logic;\r
+       SIGNAL DBG_BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL DBG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+\r
+       SIGNAL BUF_ADDR :  std_logic_vector(6 downto 0);\r
+       SIGNAL PED_ADDR :  std_logic_vector(6 downto 0);\r
+       SIGNAL THR_ADDR :  std_logic_vector(6 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: ped_corr_ctrl PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               EDS_DATA_IN => EDS_DATA_IN,\r
+               EDS_AVAIL_IN => EDS_AVAIL_IN,\r
+               EDS_DONE_OUT => EDS_DONE_OUT,\r
+               DHDR_DATA_OUT => DHDR_DATA_OUT,\r
+               DHDR_LENGTH_OUT => DHDR_LENGTH_OUT,\r
+               DHDR_STORE_OUT => DHDR_STORE_OUT,\r
+               EVT_TYPE_IN => EVT_TYPE_IN,\r
+               BUF_ADDR_OUT => BUF_ADDR_OUT,\r
+               BUF_DONE_OUT => BUF_DONE_OUT,\r
+               BUF_TICK_IN => BUF_TICK_IN,\r
+               BUF_START_IN => BUF_START_IN,\r
+               BUF_0_DATA_IN => BUF_0_DATA_IN,\r
+               BUF_1_DATA_IN => BUF_1_DATA_IN,\r
+               BUF_2_DATA_IN => BUF_2_DATA_IN,\r
+               BUF_3_DATA_IN => BUF_3_DATA_IN,\r
+               BUF_4_DATA_IN => BUF_4_DATA_IN,\r
+               BUF_5_DATA_IN => BUF_5_DATA_IN,\r
+               BUF_6_DATA_IN => BUF_6_DATA_IN,\r
+               BUF_7_DATA_IN => BUF_7_DATA_IN,\r
+               BUF_8_DATA_IN => BUF_8_DATA_IN,\r
+               BUF_9_DATA_IN => BUF_9_DATA_IN,\r
+               BUF_10_DATA_IN => BUF_10_DATA_IN,\r
+               BUF_11_DATA_IN => BUF_11_DATA_IN,\r
+               BUF_12_DATA_IN => BUF_12_DATA_IN,\r
+               BUF_13_DATA_IN => BUF_13_DATA_IN,\r
+               BUF_14_DATA_IN => BUF_14_DATA_IN,\r
+               BUF_15_DATA_IN => BUF_15_DATA_IN,\r
+               PED_ADDR_OUT => PED_ADDR_OUT,\r
+               PED_0_DATA_IN => PED_0_DATA_IN,\r
+               PED_1_DATA_IN => PED_1_DATA_IN,\r
+               PED_2_DATA_IN => PED_2_DATA_IN,\r
+               PED_3_DATA_IN => PED_3_DATA_IN,\r
+               PED_4_DATA_IN => PED_4_DATA_IN,\r
+               PED_5_DATA_IN => PED_5_DATA_IN,\r
+               PED_6_DATA_IN => PED_6_DATA_IN,\r
+               PED_7_DATA_IN => PED_7_DATA_IN,\r
+               PED_8_DATA_IN => PED_8_DATA_IN,\r
+               PED_9_DATA_IN => PED_9_DATA_IN,\r
+               PED_10_DATA_IN => PED_10_DATA_IN,\r
+               PED_11_DATA_IN => PED_11_DATA_IN,\r
+               PED_12_DATA_IN => PED_12_DATA_IN,\r
+               PED_13_DATA_IN => PED_13_DATA_IN,\r
+               PED_14_DATA_IN => PED_14_DATA_IN,\r
+               PED_15_DATA_IN => PED_15_DATA_IN,\r
+               THR_ADDR_OUT => THR_ADDR_OUT,\r
+               THR_0_DATA_IN => THR_0_DATA_IN,\r
+               THR_1_DATA_IN => THR_1_DATA_IN,\r
+               THR_2_DATA_IN => THR_2_DATA_IN,\r
+               THR_3_DATA_IN => THR_3_DATA_IN,\r
+               THR_4_DATA_IN => THR_4_DATA_IN,\r
+               THR_5_DATA_IN => THR_5_DATA_IN,\r
+               THR_6_DATA_IN => THR_6_DATA_IN,\r
+               THR_7_DATA_IN => THR_7_DATA_IN,\r
+               THR_8_DATA_IN => THR_8_DATA_IN,\r
+               THR_9_DATA_IN => THR_9_DATA_IN,\r
+               THR_10_DATA_IN => THR_10_DATA_IN,\r
+               THR_11_DATA_IN => THR_11_DATA_IN,\r
+               THR_12_DATA_IN => THR_12_DATA_IN,\r
+               THR_13_DATA_IN => THR_13_DATA_IN,\r
+               THR_14_DATA_IN => THR_14_DATA_IN,\r
+               THR_15_DATA_IN => THR_15_DATA_IN,\r
+               FIFO_START_OUT => FIFO_START_OUT,\r
+               FIFO_0_DATA_OUT => FIFO_0_DATA_OUT,\r
+               FIFO_1_DATA_OUT => FIFO_1_DATA_OUT,\r
+               FIFO_2_DATA_OUT => FIFO_2_DATA_OUT,\r
+               FIFO_3_DATA_OUT => FIFO_3_DATA_OUT,\r
+               FIFO_4_DATA_OUT => FIFO_4_DATA_OUT,\r
+               FIFO_5_DATA_OUT => FIFO_5_DATA_OUT,\r
+               FIFO_6_DATA_OUT => FIFO_6_DATA_OUT,\r
+               FIFO_7_DATA_OUT => FIFO_7_DATA_OUT,\r
+               FIFO_8_DATA_OUT => FIFO_8_DATA_OUT,\r
+               FIFO_9_DATA_OUT => FIFO_9_DATA_OUT,\r
+               FIFO_10_DATA_OUT => FIFO_10_DATA_OUT,\r
+               FIFO_11_DATA_OUT => FIFO_11_DATA_OUT,\r
+               FIFO_12_DATA_OUT => FIFO_12_DATA_OUT,\r
+               FIFO_13_DATA_OUT => FIFO_13_DATA_OUT,\r
+               FIFO_14_DATA_OUT => FIFO_14_DATA_OUT,\r
+               FIFO_15_DATA_OUT => FIFO_15_DATA_OUT,\r
+               FIFO_WE_OUT => FIFO_WE_OUT,\r
+               FIFO_DONE_OUT => FIFO_DONE_OUT,\r
+               DBG_BSM_OUT => DBG_BSM_OUT,\r
+               DBG_OUT => DBG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+-- Delay the BUF and PED address reaction\r
+THE_ADDR_DELAY: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               buf_addr <= buf_addr_out;\r
+               thr_addr <= thr_addr_out;\r
+               ped_addr <= ped_addr_out;\r
+       end if;\r
+end process THE_ADDR_DELAY;\r
+\r
+\r
+-- The real testbench\r
+TESTBENCH: process\r
+begin\r
+       -- Setup signal\r
+       reset_in <= '0';\r
+       eds_data_in <= (others => '0'); \r
+       eds_avail_in <= '0';\r
+       evt_type_in <= "000";\r
+       buf_start_in <= (others => '0'); \r
+       buf_tick_in <= (others => '0');\r
+       -- Buffer level information: 7 -> good, 6 -> broken, 5 -> ignore, rest LEVEL\r
+       buf_0_data_in(37 downto 30)  <= x"80"; -- good\r
+       buf_1_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_2_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_3_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_4_data_in(37 downto 30)  <= x"40"; -- broken!!!\r
+       buf_5_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_6_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_7_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_8_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_9_data_in(37 downto 30)  <= x"20"; -- ignore\r
+       buf_10_data_in(37 downto 30) <= x"20"; -- ignore\r
+       buf_11_data_in(37 downto 30) <= x"20"; -- ignore\r
+       buf_12_data_in(37 downto 30) <= x"20"; -- ignore\r
+       buf_13_data_in(37 downto 30) <= x"20"; -- ignore\r
+       buf_14_data_in(37 downto 30) <= x"20"; -- ignore\r
+       buf_15_data_in(37 downto 30) <= x"20"; -- ignore\r
+       -- Buffer frame information: 8 -> APV error, [7:0] row\r
+       buf_0_data_in(29 downto 18)  <= x"011"; -- row 0x11, no error\r
+       buf_1_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_2_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_3_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_4_data_in(29 downto 18)  <= x"0aa"; --\r
+       buf_5_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_6_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_7_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_8_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_9_data_in(29 downto 18)  <= x"0ee"; --\r
+       buf_10_data_in(29 downto 18) <= x"0ee"; --\r
+       buf_11_data_in(29 downto 18) <= x"0ee"; --\r
+       buf_12_data_in(29 downto 18) <= x"0ee"; --\r
+       buf_13_data_in(29 downto 18) <= x"0ee"; --\r
+       buf_14_data_in(29 downto 18) <= x"0ee"; --\r
+       buf_15_data_in(29 downto 18) <= x"0ee"; --\r
+       -- Buffer data\r
+       buf_0_data_in(17 downto 14)  <= x"0";\r
+       buf_1_data_in(17 downto 14)  <= x"0"; buf_1_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_2_data_in(17 downto 14)  <= x"0"; buf_2_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_3_data_in(17 downto 14)  <= x"0"; buf_3_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_4_data_in(17 downto 14)  <= x"0"; buf_4_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_5_data_in(17 downto 14)  <= x"0"; buf_5_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_6_data_in(17 downto 14)  <= x"0"; buf_6_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_7_data_in(17 downto 14)  <= x"0"; buf_7_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_8_data_in(17 downto 14)  <= x"0"; buf_8_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_9_data_in(17 downto 14)  <= x"0"; buf_9_data_in(13 downto 0)  <= "00000000000000";\r
+       buf_10_data_in(17 downto 14) <= x"0"; buf_10_data_in(13 downto 0) <= "00000000000000";\r
+       buf_11_data_in(17 downto 14) <= x"0"; buf_11_data_in(13 downto 0) <= "00000000000000";\r
+       buf_12_data_in(17 downto 14) <= x"0"; buf_12_data_in(13 downto 0) <= "00000000000000";\r
+       buf_13_data_in(17 downto 14) <= x"0"; buf_13_data_in(13 downto 0) <= "00000000000000";\r
+       buf_14_data_in(17 downto 14) <= x"0"; buf_14_data_in(13 downto 0) <= "00000000000000";\r
+       buf_15_data_in(17 downto 14) <= x"0"; buf_15_data_in(13 downto 0) <= "00000000000000";\r
+       -- Pedestal data\r
+--     ped_0_data_in  <= "00" & x"0000";\r
+       ped_1_data_in  <= "00" & x"0000";\r
+       ped_2_data_in  <= "00" & x"0000";\r
+       ped_3_data_in  <= "00" & x"0000";\r
+       ped_4_data_in  <= "00" & x"0000";\r
+       ped_5_data_in  <= "00" & x"0000";\r
+       ped_6_data_in  <= "00" & x"0000";\r
+       ped_7_data_in  <= "00" & x"0000";\r
+       ped_8_data_in  <= "00" & x"0000";\r
+       ped_9_data_in  <= "00" & x"0000";\r
+       ped_10_data_in <= "00" & x"0000";\r
+       ped_11_data_in <= "00" & x"0000";\r
+       ped_12_data_in <= "00" & x"0000";\r
+       ped_13_data_in <= "00" & x"0000";\r
+       ped_14_data_in <= "00" & x"0000";\r
+       ped_15_data_in <= "00" & x"0000";\r
+       -- Threshold data\r
+--     thr_0_data_in  <= "00" & x"0000";\r
+       thr_1_data_in  <= "00" & x"0000";\r
+       thr_2_data_in  <= "00" & x"0000";\r
+       thr_3_data_in  <= "00" & x"0000";\r
+       thr_4_data_in  <= "00" & x"0000";\r
+       thr_5_data_in  <= "00" & x"0000";\r
+       thr_6_data_in  <= "00" & x"0000";\r
+       thr_7_data_in  <= "00" & x"0000";\r
+       thr_8_data_in  <= "00" & x"0000";\r
+       thr_9_data_in  <= "00" & x"0000";\r
+       thr_10_data_in <= "00" & x"0000";\r
+       thr_11_data_in <= "00" & x"0000";\r
+       thr_12_data_in <= "00" & x"0000";\r
+       thr_13_data_in <= "00" & x"0000";\r
+       thr_14_data_in <= "00" & x"0000";\r
+       thr_15_data_in <= "00" & x"0000";\r
+\r
+       -- Reset\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+\r
+       ----------------------------------------------------------------\r
+       -- "000" -> RAW128\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "000";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"82";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"83";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+       ----------------------------------------------------------------\r
+       -- "001" -> PED128\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "001";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee11";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"82";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"83";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "010" -> PED128THR\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "010";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee21";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"82";   \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"83";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+       ----------------------------------------------------------------------------------------\r
+       wait;   \r
+\r
+       -- Tests may start now\r
+       ----------------------------------------------------------------\r
+       -- "000" -> RAW128\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "000";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "001" -> PED128\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "001";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "010" -> PED128THR\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "010";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "100" -> NC64PED64\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "100";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "101" -> NC64\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "101";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "110" -> NC64GOOD\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "110";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       ----------------------------------------------------------------\r
+       -- "111" -> NC64THR\r
+       ----------------------------------------------------------------\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       evt_type_in <= "111";\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 55 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- EDS comes in\r
+       eds_data_in <= x"01abcdee01";\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       eds_avail_in <= '0';    \r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Buffer 0 becomes ready\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       buf_0_data_in(37 downto 30) <= x"81";   \r
+       \r
+       -- wait for first buffer        \r
+       wait until rising_edge(buf_done_out);\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+\r
+\r
+\r
+       \r
+       -- stay a while, stay forever!\r
+       wait;           \r
+end process TESTBENCH;         \r
+\r
+-- Data faker for "APV 0"...\r
+BUF_0_DATA_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case buf_addr is\r
+                       when "0000000"  => buf_0_data_in(13 downto 0) <= "00" & x"44b";\r
+                       when "0000001"  => buf_0_data_in(13 downto 0) <= "00" & x"474"; \r
+                       when "0000010"  => buf_0_data_in(13 downto 0) <= "00" & x"462"; \r
+                       when "0000011"  => buf_0_data_in(13 downto 0) <= "00" & x"45f"; \r
+--                     when "0000100"  => buf_0_data_in(13 downto 0) <= "00" & x"44c";\r
+                       when "0000100"  => buf_0_data_in(13 downto 0) <= "01" & x"111"; -- physical UNDERFLOW\r
+                       when "0000101"  => buf_0_data_in(13 downto 0) <= "00" & x"457"; \r
+                       when "0000110"  => buf_0_data_in(13 downto 0) <= "00" & x"476"; \r
+                       when "0000111"  => buf_0_data_in(13 downto 0) <= "00" & x"456"; \r
+                       when "0001000"  => buf_0_data_in(13 downto 0) <= "00" & x"450"; \r
+                       when "0001001"  => buf_0_data_in(13 downto 0) <= "00" & x"45c"; \r
+--                     when "0001010"  => buf_0_data_in(13 downto 0) <= "00" & x"46b"; \r
+                       when "0001010"  => buf_0_data_in(13 downto 0) <= "10" & x"eee"; -- physical OVERFLOW\r
+                       when "0001011"  => buf_0_data_in(13 downto 0) <= "00" & x"461"; \r
+                       when "0001100"  => buf_0_data_in(13 downto 0) <= "00" & x"466"; \r
+                       when "0001101"  => buf_0_data_in(13 downto 0) <= "00" & x"449"; \r
+                       when "0001110"  => buf_0_data_in(13 downto 0) <= "00" & x"450"; \r
+                       when "0001111"  => buf_0_data_in(13 downto 0) <= "00" & x"451"; \r
+                       when "0010000"  => buf_0_data_in(13 downto 0) <= "00" & x"432"; \r
+--                     when "0010001"  => buf_0_data_in(13 downto 0) <= "00" & x"459"; \r
+                       when "0010001"  => buf_0_data_in(13 downto 0) <= "01" & x"111"; -- correction UNDERFLOW \r
+                       when "0010010"  => buf_0_data_in(13 downto 0) <= "00" & x"45c"; \r
+                       when "0010011"  => buf_0_data_in(13 downto 0) <= "00" & x"430"; \r
+                       when "0010100"  => buf_0_data_in(13 downto 0) <= "00" & x"42f"; \r
+                       when "0010101"  => buf_0_data_in(13 downto 0) <= "00" & x"452"; \r
+                       when "0010110"  => buf_0_data_in(13 downto 0) <= "00" & x"43a"; \r
+--                     when "0010111"  => buf_0_data_in(13 downto 0) <= "00" & x"431"; \r
+                       when "0010111"  => buf_0_data_in(13 downto 0) <= "10" & x"eee"; -- correction OVERFLOW\r
+                       when "0011000"  => buf_0_data_in(13 downto 0) <= "00" & x"42b"; \r
+                       when "0011001"  => buf_0_data_in(13 downto 0) <= "00" & x"443"; \r
+                       when "0011010"  => buf_0_data_in(13 downto 0) <= "00" & x"424"; \r
+                       when "0011011"  => buf_0_data_in(13 downto 0) <= "00" & x"436"; \r
+                       when "0011100"  => buf_0_data_in(13 downto 0) <= "00" & x"45e"; \r
+                       when "0011101"  => buf_0_data_in(13 downto 0) <= "00" & x"453"; \r
+                       when "0011110"  => buf_0_data_in(13 downto 0) <= "00" & x"44c"; \r
+                       when "0011111"  => buf_0_data_in(13 downto 0) <= "00" & x"449"; \r
+                       when "0100000"  => buf_0_data_in(13 downto 0) <= "00" & x"40a"; \r
+                       when "0100001"  => buf_0_data_in(13 downto 0) <= "00" & x"43f"; \r
+--                     when "0100010"  => buf_0_data_in(13 downto 0) <= "00" & x"411"; \r
+                       when "0100010"  => buf_0_data_in(13 downto 0) <= "00" & x"411"; -- physical OFF \r
+                       when "0100011"  => buf_0_data_in(13 downto 0) <= "00" & x"455"; \r
+                       when "0100100"  => buf_0_data_in(13 downto 0) <= "00" & x"44b"; \r
+                       when "0100101"  => buf_0_data_in(13 downto 0) <= "00" & x"431"; \r
+                       when "0100110"  => buf_0_data_in(13 downto 0) <= "00" & x"425"; \r
+                       when "0100111"  => buf_0_data_in(13 downto 0) <= "00" & x"44a"; \r
+                       when "0101000"  => buf_0_data_in(13 downto 0) <= "00" & x"442"; \r
+                       when "0101001"  => buf_0_data_in(13 downto 0) <= "00" & x"446"; \r
+                       when "0101010"  => buf_0_data_in(13 downto 0) <= "00" & x"43e"; \r
+                       when "0101011"  => buf_0_data_in(13 downto 0) <= "00" & x"441"; \r
+                       when "0101100"  => buf_0_data_in(13 downto 0) <= "00" & x"45b"; \r
+                       when "0101101"  => buf_0_data_in(13 downto 0) <= "00" & x"44e"; \r
+                       when "0101110"  => buf_0_data_in(13 downto 0) <= "00" & x"452"; \r
+--                     when "0101111"  => buf_0_data_in(13 downto 0) <= "00" & x"469"; \r
+                       when "0101111"  => buf_0_data_in(13 downto 0) <= "00" & x"469"; -- correction OFF\r
+                       when "0110000"  => buf_0_data_in(13 downto 0) <= "00" & x"456"; \r
+                       when "0110001"  => buf_0_data_in(13 downto 0) <= "00" & x"45b"; \r
+                       when "0110010"  => buf_0_data_in(13 downto 0) <= "00" & x"482"; \r
+                       when "0110011"  => buf_0_data_in(13 downto 0) <= "00" & x"461"; \r
+                       when "0110100"  => buf_0_data_in(13 downto 0) <= "00" & x"444"; \r
+                       when "0110101"  => buf_0_data_in(13 downto 0) <= "00" & x"458"; \r
+                       when "0110110"  => buf_0_data_in(13 downto 0) <= "00" & x"446"; \r
+                       when "0110111"  => buf_0_data_in(13 downto 0) <= "00" & x"475"; \r
+                       when "0111000"  => buf_0_data_in(13 downto 0) <= "00" & x"447"; \r
+                       when "0111001"  => buf_0_data_in(13 downto 0) <= "00" & x"44f"; \r
+                       when "0111010"  => buf_0_data_in(13 downto 0) <= "00" & x"433"; \r
+                       when "0111011"  => buf_0_data_in(13 downto 0) <= "00" & x"470"; \r
+                       when "0111100"  => buf_0_data_in(13 downto 0) <= "00" & x"46d"; \r
+                       when "0111101"  => buf_0_data_in(13 downto 0) <= "00" & x"45e"; \r
+                       when "0111110"  => buf_0_data_in(13 downto 0) <= "00" & x"439"; \r
+                       when "0111111"  => buf_0_data_in(13 downto 0) <= "00" & x"45a"; \r
+                       when "1000000"  => buf_0_data_in(13 downto 0) <= "00" & x"43b"; \r
+                       when "1000001"  => buf_0_data_in(13 downto 0) <= "00" & x"42a"; \r
+                       when "1000010"  => buf_0_data_in(13 downto 0) <= "00" & x"430"; \r
+                       when "1000011"  => buf_0_data_in(13 downto 0) <= "00" & x"444"; \r
+                       when "1000100"  => buf_0_data_in(13 downto 0) <= "00" & x"42b"; \r
+                       when "1000101"  => buf_0_data_in(13 downto 0) <= "00" & x"42b"; \r
+                       when "1000110"  => buf_0_data_in(13 downto 0) <= "00" & x"403"; \r
+                       when "1000111"  => buf_0_data_in(13 downto 0) <= "00" & x"429"; \r
+                       when "1001000"  => buf_0_data_in(13 downto 0) <= "00" & x"3f4"; \r
+                       when "1001001"  => buf_0_data_in(13 downto 0) <= "00" & x"41b"; \r
+                       when "1001010"  => buf_0_data_in(13 downto 0) <= "00" & x"42f"; \r
+                       when "1001011"  => buf_0_data_in(13 downto 0) <= "00" & x"434"; \r
+                       when "1001100"  => buf_0_data_in(13 downto 0) <= "00" & x"40a"; \r
+                       when "1001101"  => buf_0_data_in(13 downto 0) <= "00" & x"416"; \r
+                       when "1001110"  => buf_0_data_in(13 downto 0) <= "00" & x"412"; \r
+                       when "1001111"  => buf_0_data_in(13 downto 0) <= "00" & x"418"; \r
+                       when "1010000"  => buf_0_data_in(13 downto 0) <= "00" & x"411"; \r
+                       when "1010001"  => buf_0_data_in(13 downto 0) <= "00" & x"40e"; \r
+                       when "1010010"  => buf_0_data_in(13 downto 0) <= "00" & x"4d6"; \r
+                       when "1010011"  => buf_0_data_in(13 downto 0) <= "00" & x"40d"; \r
+                       when "1010100"  => buf_0_data_in(13 downto 0) <= "00" & x"3ec"; \r
+                       when "1010101"  => buf_0_data_in(13 downto 0) <= "00" & x"40e"; \r
+                       when "1010110"  => buf_0_data_in(13 downto 0) <= "00" & x"419"; \r
+                       when "1010111"  => buf_0_data_in(13 downto 0) <= "00" & x"40d"; \r
+                       when "1011000"  => buf_0_data_in(13 downto 0) <= "00" & x"3f1"; \r
+                       when "1011001"  => buf_0_data_in(13 downto 0) <= "00" & x"3fa"; \r
+                       when "1011010"  => buf_0_data_in(13 downto 0) <= "00" & x"40e"; \r
+                       when "1011011"  => buf_0_data_in(13 downto 0) <= "00" & x"408"; \r
+                       when "1011100"  => buf_0_data_in(13 downto 0) <= "00" & x"3ee"; \r
+                       when "1011101"  => buf_0_data_in(13 downto 0) <= "00" & x"3fd"; \r
+                       when "1011110"  => buf_0_data_in(13 downto 0) <= "00" & x"41b"; \r
+                       when "1011111"  => buf_0_data_in(13 downto 0) <= "00" & x"3f3"; \r
+                       when "1100000"  => buf_0_data_in(13 downto 0) <= "00" & x"3b2"; \r
+                       when "1100001"  => buf_0_data_in(13 downto 0) <= "00" & x"3d6"; \r
+                       when "1100010"  => buf_0_data_in(13 downto 0) <= "00" & x"3f2"; \r
+                       when "1100011"  => buf_0_data_in(13 downto 0) <= "00" & x"3f2"; \r
+                       when "1100100"  => buf_0_data_in(13 downto 0) <= "00" & x"40d"; \r
+                       when "1100101"  => buf_0_data_in(13 downto 0) <= "00" & x"3e4"; \r
+                       when "1100110"  => buf_0_data_in(13 downto 0) <= "00" & x"902"; \r
+                       when "1100111"  => buf_0_data_in(13 downto 0) <= "00" & x"40e"; \r
+                       when "1101000"  => buf_0_data_in(13 downto 0) <= "00" & x"3d2"; \r
+                       when "1101001"  => buf_0_data_in(13 downto 0) <= "00" & x"3ef"; \r
+                       when "1101010"  => buf_0_data_in(13 downto 0) <= "00" & x"490"; \r
+                       when "1101011"  => buf_0_data_in(13 downto 0) <= "00" & x"402"; \r
+                       when "1101100"  => buf_0_data_in(13 downto 0) <= "00" & x"3bd"; \r
+                       when "1101101"  => buf_0_data_in(13 downto 0) <= "00" & x"3d1"; \r
+                       when "1101110"  => buf_0_data_in(13 downto 0) <= "00" & x"497"; \r
+                       when "1101111"  => buf_0_data_in(13 downto 0) <= "00" & x"3d2"; \r
+                       when "1110000"  => buf_0_data_in(13 downto 0) <= "00" & x"3b7"; \r
+                       when "1110001"  => buf_0_data_in(13 downto 0) <= "00" & x"3da"; \r
+                       when "1110010"  => buf_0_data_in(13 downto 0) <= "00" & x"4bd"; \r
+                       when "1110011"  => buf_0_data_in(13 downto 0) <= "00" & x"3c9"; \r
+                       when "1110100"  => buf_0_data_in(13 downto 0) <= "00" & x"3ba"; \r
+                       when "1110101"  => buf_0_data_in(13 downto 0) <= "00" & x"3c9"; \r
+                       when "1110110"  => buf_0_data_in(13 downto 0) <= "00" & x"4e9"; \r
+                       when "1110111"  => buf_0_data_in(13 downto 0) <= "00" & x"3cc"; \r
+                       when "1111000"  => buf_0_data_in(13 downto 0) <= "00" & x"3e4"; \r
+                       when "1111001"  => buf_0_data_in(13 downto 0) <= "00" & x"3b2"; \r
+                       when "1111010"  => buf_0_data_in(13 downto 0) <= "10" & x"edc"; -- real physical OVERFLOW\r
+                       when "1111011"  => buf_0_data_in(13 downto 0) <= "00" & x"3c4"; \r
+                       when "1111100"  => buf_0_data_in(13 downto 0) <= "00" & x"3e6"; \r
+                       when "1111101"  => buf_0_data_in(13 downto 0) <= "00" & x"3f0"; \r
+                       when "1111110"  => buf_0_data_in(13 downto 0) <= "00" & x"896"; \r
+                       when "1111111"  => buf_0_data_in(13 downto 0) <= "00" & x"402"; \r
+                       when others             => buf_0_data_in(13 downto 0) <= "00" & x"fff";                 \r
+               end case;\r
+       end if;\r
+end process BUF_0_DATA_PROC;\r
+\r
+\r
+BUF_0_PED_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case ped_addr is\r
+                       when "0000000"  => ped_0_data_in <= "00" & x"0485";\r
+                       when "0000001"  => ped_0_data_in <= "00" & x"148b"; \r
+                       when "0000010"  => ped_0_data_in <= "00" & x"2466"; \r
+                       when "0000011"  => ped_0_data_in <= "00" & x"3479"; \r
+--                     when "0000100"  => ped_0_data_in <= "00" & x"446e";\r
+                       when "0000100"  => ped_0_data_in <= "00" & x"446e"; -- physical UNDERFLOW\r
+                       when "0000101"  => ped_0_data_in <= "00" & x"5470"; \r
+                       when "0000110"  => ped_0_data_in <= "00" & x"647c"; \r
+                       when "0000111"  => ped_0_data_in <= "00" & x"7472"; \r
+                       when "0001000"  => ped_0_data_in <= "00" & x"0472"; \r
+                       when "0001001"  => ped_0_data_in <= "00" & x"1478"; \r
+--                     when "0001010"  => ped_0_data_in <= "00" & x"247f"; \r
+                       when "0001010"  => ped_0_data_in <= "00" & x"247f"; -- physical OVERFLOW\r
+                       when "0001011"  => ped_0_data_in <= "00" & x"3480"; \r
+                       when "0001100"  => ped_0_data_in <= "00" & x"4479"; \r
+                       when "0001101"  => ped_0_data_in <= "00" & x"5464"; \r
+                       when "0001110"  => ped_0_data_in <= "00" & x"645c"; \r
+                       when "0001111"  => ped_0_data_in <= "00" & x"7464"; \r
+                       when "0010000"  => ped_0_data_in <= "00" & x"045a"; \r
+--                     when "0010001"  => ped_0_data_in <= "00" & x"146f"; \r
+                       when "0010001"  => ped_0_data_in <= "00" & x"146f"; -- correction UNDERFLOW \r
+                       when "0010010"  => ped_0_data_in <= "00" & x"245c"; \r
+                       when "0010011"  => ped_0_data_in <= "00" & x"3445"; \r
+                       when "0010100"  => ped_0_data_in <= "00" & x"4448"; \r
+                       when "0010101"  => ped_0_data_in <= "00" & x"546e"; \r
+                       when "0010110"  => ped_0_data_in <= "00" & x"6450"; \r
+--                     when "0010111"  => ped_0_data_in <= "00" & x"7448"; \r
+                       when "0010111"  => ped_0_data_in <= "00" & x"7448"; -- correction OVERFLOW\r
+                       when "0011000"  => ped_0_data_in <= "00" & x"044d"; \r
+                       when "0011001"  => ped_0_data_in <= "00" & x"145c"; \r
+                       when "0011010"  => ped_0_data_in <= "00" & x"243b"; \r
+                       when "0011011"  => ped_0_data_in <= "00" & x"345a"; \r
+                       when "0011100"  => ped_0_data_in <= "00" & x"4469"; \r
+                       when "0011101"  => ped_0_data_in <= "00" & x"546f"; \r
+                       when "0011110"  => ped_0_data_in <= "00" & x"6455"; \r
+                       when "0011111"  => ped_0_data_in <= "00" & x"7463"; \r
+                       when "0100000"  => ped_0_data_in <= "00" & x"0429"; \r
+                       when "0100001"  => ped_0_data_in <= "00" & x"145b"; \r
+--                     when "0100010"  => ped_0_data_in <= "00" & x"2435"; \r
+                       when "0100010"  => ped_0_data_in <= "01" & x"2435"; -- physical OFF \r
+                       when "0100011"  => ped_0_data_in <= "00" & x"346f"; \r
+                       when "0100100"  => ped_0_data_in <= "00" & x"4463"; \r
+                       when "0100101"  => ped_0_data_in <= "00" & x"5454"; \r
+                       when "0100110"  => ped_0_data_in <= "00" & x"6452"; \r
+                       when "0100111"  => ped_0_data_in <= "00" & x"746e"; \r
+                       when "0101000"  => ped_0_data_in <= "00" & x"0469"; \r
+                       when "0101001"  => ped_0_data_in <= "00" & x"1462"; \r
+                       when "0101010"  => ped_0_data_in <= "00" & x"2464"; \r
+                       when "0101011"  => ped_0_data_in <= "00" & x"345e"; \r
+                       when "0101100"  => ped_0_data_in <= "00" & x"4469"; \r
+                       when "0101101"  => ped_0_data_in <= "00" & x"5469"; \r
+                       when "0101110"  => ped_0_data_in <= "00" & x"646d"; \r
+--                     when "0101111"  => ped_0_data_in <= "00" & x"7485"; \r
+                       when "0101111"  => ped_0_data_in <= "01" & x"7485"; -- correction OFF\r
+                       when "0110000"  => ped_0_data_in <= "00" & x"0478"; \r
+                       when "0110001"  => ped_0_data_in <= "00" & x"147d"; \r
+                       when "0110010"  => ped_0_data_in <= "00" & x"2468"; \r
+                       when "0110011"  => ped_0_data_in <= "00" & x"3480"; \r
+                       when "0110100"  => ped_0_data_in <= "00" & x"447d"; \r
+                       when "0110101"  => ped_0_data_in <= "00" & x"5480"; \r
+                       when "0110110"  => ped_0_data_in <= "00" & x"6468"; \r
+                       when "0110111"  => ped_0_data_in <= "00" & x"7496"; \r
+                       when "0111000"  => ped_0_data_in <= "00" & x"0471"; \r
+                       when "0111001"  => ped_0_data_in <= "00" & x"1474"; \r
+                       when "0111010"  => ped_0_data_in <= "00" & x"246b"; \r
+                       when "0111011"  => ped_0_data_in <= "00" & x"349b"; \r
+                       when "0111100"  => ped_0_data_in <= "00" & x"4499"; \r
+                       when "0111101"  => ped_0_data_in <= "00" & x"5484"; \r
+                       when "0111110"  => ped_0_data_in <= "00" & x"646d"; \r
+                       when "0111111"  => ped_0_data_in <= "00" & x"7486"; \r
+                       when "1000000"  => ped_0_data_in <= "00" & x"048e"; \r
+                       when "1000001"  => ped_0_data_in <= "00" & x"146e"; \r
+                       when "1000010"  => ped_0_data_in <= "00" & x"2488"; \r
+                       when "1000011"  => ped_0_data_in <= "00" & x"3491"; \r
+                       when "1000100"  => ped_0_data_in <= "00" & x"4487"; \r
+                       when "1000101"  => ped_0_data_in <= "00" & x"5476"; \r
+                       when "1000110"  => ped_0_data_in <= "00" & x"6453"; \r
+                       when "1000111"  => ped_0_data_in <= "00" & x"7484"; \r
+                       when "1001000"  => ped_0_data_in <= "00" & x"0452"; \r
+                       when "1001001"  => ped_0_data_in <= "00" & x"146f"; \r
+                       when "1001010"  => ped_0_data_in <= "00" & x"248d"; \r
+                       when "1001011"  => ped_0_data_in <= "00" & x"3486"; \r
+                       when "1001100"  => ped_0_data_in <= "00" & x"445c"; \r
+                       when "1001101"  => ped_0_data_in <= "00" & x"5475"; \r
+                       when "1001110"  => ped_0_data_in <= "00" & x"6476"; \r
+                       when "1001111"  => ped_0_data_in <= "00" & x"7475"; \r
+                       when "1010000"  => ped_0_data_in <= "00" & x"0472"; \r
+                       when "1010001"  => ped_0_data_in <= "00" & x"146f"; \r
+                       when "1010010"  => ped_0_data_in <= "00" & x"244c"; \r
+                       when "1010011"  => ped_0_data_in <= "00" & x"3479"; \r
+                       when "1010100"  => ped_0_data_in <= "00" & x"4469"; \r
+                       when "1010101"  => ped_0_data_in <= "00" & x"547f"; \r
+                       when "1010110"  => ped_0_data_in <= "00" & x"6478"; \r
+                       when "1010111"  => ped_0_data_in <= "00" & x"7478"; \r
+                       when "1011000"  => ped_0_data_in <= "00" & x"0472"; \r
+                       when "1011001"  => ped_0_data_in <= "00" & x"146c"; \r
+                       when "1011010"  => ped_0_data_in <= "00" & x"2478"; \r
+                       when "1011011"  => ped_0_data_in <= "00" & x"3481"; \r
+                       when "1011100"  => ped_0_data_in <= "00" & x"447a"; \r
+                       when "1011101"  => ped_0_data_in <= "00" & x"547f"; \r
+                       when "1011110"  => ped_0_data_in <= "00" & x"649f"; \r
+                       when "1011111"  => ped_0_data_in <= "00" & x"746f"; \r
+                       when "1100000"  => ped_0_data_in <= "00" & x"0443"; \r
+                       when "1100001"  => ped_0_data_in <= "00" & x"145d"; \r
+                       when "1100010"  => ped_0_data_in <= "00" & x"246f"; \r
+                       when "1100011"  => ped_0_data_in <= "00" & x"3482"; \r
+                       when "1100100"  => ped_0_data_in <= "00" & x"4498"; \r
+                       when "1100101"  => ped_0_data_in <= "00" & x"5483"; \r
+                       when "1100110"  => ped_0_data_in <= "00" & x"649b"; \r
+                       when "1100111"  => ped_0_data_in <= "00" & x"74a9"; \r
+                       when "1101000"  => ped_0_data_in <= "00" & x"0471"; \r
+                       when "1101001"  => ped_0_data_in <= "00" & x"1488"; \r
+                       when "1101010"  => ped_0_data_in <= "00" & x"249a"; \r
+                       when "1101011"  => ped_0_data_in <= "00" & x"349f"; \r
+                       when "1101100"  => ped_0_data_in <= "00" & x"4473"; \r
+                       when "1101101"  => ped_0_data_in <= "00" & x"5479"; \r
+                       when "1101110"  => ped_0_data_in <= "00" & x"648b"; \r
+                       when "1101111"  => ped_0_data_in <= "00" & x"747e"; \r
+                       when "1110000"  => ped_0_data_in <= "00" & x"0480"; \r
+                       when "1110001"  => ped_0_data_in <= "00" & x"1492"; \r
+                       when "1110010"  => ped_0_data_in <= "00" & x"2482"; \r
+                       when "1110011"  => ped_0_data_in <= "00" & x"3483"; \r
+                       when "1110100"  => ped_0_data_in <= "00" & x"447a"; \r
+                       when "1110101"  => ped_0_data_in <= "00" & x"548a"; \r
+                       when "1110110"  => ped_0_data_in <= "00" & x"6493"; \r
+                       when "1110111"  => ped_0_data_in <= "00" & x"7496"; \r
+                       when "1111000"  => ped_0_data_in <= "00" & x"0495"; \r
+                       when "1111001"  => ped_0_data_in <= "00" & x"1493"; \r
+                       when "1111010"  => ped_0_data_in <= "00" & x"2487"; -- real physical OVERFLOW\r
+                       when "1111011"  => ped_0_data_in <= "00" & x"3496"; \r
+                       when "1111100"  => ped_0_data_in <= "00" & x"449d"; \r
+                       when "1111101"  => ped_0_data_in <= "00" & x"54cb"; \r
+                       when "1111110"  => ped_0_data_in <= "00" & x"64b9"; \r
+                       when "1111111"  => ped_0_data_in <= "00" & x"74df"; \r
+                       when others             => ped_0_data_in <= "00" & x"ffff";                     \r
+               end case;\r
+       end if;\r
+end process BUF_0_PED_PROC;\r
+\r
+\r
+-- Data faker for "APV 0"...\r
+BUF_0_THR_PROC: process( clk_in )\r
+begin\r
+       if( rising_edge(clk_in) ) then\r
+               case thr_addr is\r
+                       when "0000000"  => thr_0_data_in <= "00" & x"001e";\r
+                       when "0000001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0000010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "0000011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0000100"  => thr_0_data_in <= "00" & x"401e"; \r
+                       when "0000101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0000110"  => thr_0_data_in <= "00" & x"601b"; \r
+                       when "0000111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0001000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "0001001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0001010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "0001011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0001100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "0001101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0001110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "0001111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0010000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "0010001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0010010"  => thr_0_data_in <= "00" & x"2021"; \r
+                       when "0010011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0010100"  => thr_0_data_in <= "00" & x"402d"; \r
+                       when "0010101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0010110"  => thr_0_data_in <= "00" & x"602a"; \r
+                       when "0010111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0011000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "0011001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0011010"  => thr_0_data_in <= "00" & x"2021"; \r
+                       when "0011011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0011100"  => thr_0_data_in <= "00" & x"401e"; \r
+                       when "0011101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0011110"  => thr_0_data_in <= "00" & x"601b"; \r
+                       when "0011111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0100000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "0100001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0100010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "0100011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0100100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "0100101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0100110"  => thr_0_data_in <= "00" & x"601b"; \r
+                       when "0100111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0101000"  => thr_0_data_in <= "00" & x"001b"; \r
+                       when "0101001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0101010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "0101011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0101100"  => thr_0_data_in <= "00" & x"401e"; \r
+                       when "0101101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0101110"  => thr_0_data_in <= "00" & x"601b"; \r
+                       when "0101111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0110000"  => thr_0_data_in <= "00" & x"000f"; \r
+                       when "0110001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0110010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "0110011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0110100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "0110101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0110110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "0110111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "0111000"  => thr_0_data_in <= "00" & x"0021"; \r
+                       when "0111001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "0111010"  => thr_0_data_in <= "00" & x"2027"; \r
+                       when "0111011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "0111100"  => thr_0_data_in <= "00" & x"400f"; \r
+                       when "0111101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "0111110"  => thr_0_data_in <= "00" & x"6048"; \r
+                       when "0111111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1000000"  => thr_0_data_in <= "00" & x"0024"; \r
+                       when "1000001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1000010"  => thr_0_data_in <= "00" & x"2024"; \r
+                       when "1000011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1000100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1000101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1000110"  => thr_0_data_in <= "00" & x"6021"; \r
+                       when "1000111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1001000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "1001001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1001010"  => thr_0_data_in <= "00" & x"2021"; \r
+                       when "1001011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1001100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1001101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1001110"  => thr_0_data_in <= "00" & x"601b"; \r
+                       when "1001111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1010000"  => thr_0_data_in <= "00" & x"001b"; \r
+                       when "1010001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1010010"  => thr_0_data_in <= "00" & x"201e"; \r
+                       when "1010011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1010100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1010101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1010110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "1010111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1011000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "1011001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1011010"  => thr_0_data_in <= "00" & x"2021"; \r
+                       when "1011011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1011100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1011101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1011110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "1011111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1100000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "1100001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1100010"  => thr_0_data_in <= "00" & x"2021"; \r
+                       when "1100011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1100100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1100101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1100110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "1100111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1101000"  => thr_0_data_in <= "00" & x"0021"; \r
+                       when "1101001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1101010"  => thr_0_data_in <= "00" & x"2027"; \r
+                       when "1101011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1101100"  => thr_0_data_in <= "00" & x"4024"; \r
+                       when "1101101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1101110"  => thr_0_data_in <= "00" & x"6021"; \r
+                       when "1101111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1110000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "1110001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1110010"  => thr_0_data_in <= "00" & x"2024"; \r
+                       when "1110011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1110100"  => thr_0_data_in <= "00" & x"400f"; \r
+                       when "1110101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1110110"  => thr_0_data_in <= "00" & x"601e"; \r
+                       when "1110111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when "1111000"  => thr_0_data_in <= "00" & x"001e"; \r
+                       when "1111001"  => thr_0_data_in <= "00" & x"100f"; \r
+                       when "1111010"  => thr_0_data_in <= "00" & x"2024"; \r
+                       when "1111011"  => thr_0_data_in <= "00" & x"300f"; \r
+                       when "1111100"  => thr_0_data_in <= "00" & x"4021"; \r
+                       when "1111101"  => thr_0_data_in <= "00" & x"500f"; \r
+                       when "1111110"  => thr_0_data_in <= "00" & x"6021"; \r
+                       when "1111111"  => thr_0_data_in <= "00" & x"700f"; \r
+                       when others             => thr_0_data_in <= "00" & x"ffff";                     \r
+               end case;\r
+       end if;\r
+end process BUF_0_THR_PROC;\r
+\r
+END;\r
diff --git a/src/tb_pulse_stretch.vhd b/src/tb_pulse_stretch.vhd
new file mode 100644 (file)
index 0000000..c68635f
--- /dev/null
@@ -0,0 +1,70 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT pulse_stretch\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               CLK_IN : IN std_logic;\r
+               START_IN : IN std_logic;          \r
+               PULSE_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL START_IN :  std_logic;\r
+       SIGNAL PULSE_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: pulse_stretch PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               CLK_IN => CLK_IN,\r
+               START_IN => START_IN,\r
+               PULSE_OUT => PULSE_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       start_in <= '0';\r
+       \r
+       -- Sync reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 140 ns;\r
+       \r
+       -- Tests may start now\r
+       wait until rising_edge(clk_in);\r
+       start_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       start_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+END;\r
diff --git a/src/tb_raw_buf_stage.vhd b/src/tb_raw_buf_stage.vhd
new file mode 100644 (file)
index 0000000..9197bfc
--- /dev/null
@@ -0,0 +1,260 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT raw_buf_stage\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_APV_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               APV_SYNC_IN : IN std_logic;\r
+               APV_FRAME_REQD_IN : IN std_logic;\r
+               ADC0_PLL_LOCK_IN : IN std_logic;\r
+               ADC0_CLK40M_IN : IN std_logic;\r
+               ADC0_0_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_1_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_2_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_3_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_4_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_5_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_6_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_7_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_PLL_LOCK_IN : IN std_logic;\r
+               ADC1_CLK40M_IN : IN std_logic;\r
+               ADC1_0_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_1_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_2_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_3_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_4_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_5_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_6_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_7_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               MAX_TRG_NUM_IN : IN std_logic_vector(3 downto 0);\r
+               BIT_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               BIT_HIGH_IN : IN std_logic_vector(11 downto 0);\r
+               FL_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               FL_HIGH_IN : IN std_logic_vector(11 downto 0);\r
+               APV_ON_IN : IN std_logic_vector(15 downto 0);\r
+               BUF_ADDR_IN : IN std_logic_vector(6 downto 0);\r
+               BUF_DONE_IN : IN std_logic;          \r
+               BUF_FULL_OUT : OUT std_logic;\r
+               BUF_TICK_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_START_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_READY_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_0_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_1_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_2_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_3_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_4_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_5_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_6_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_7_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_8_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_9_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_10_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_11_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_12_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_13_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_14_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_15_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_APV_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL APV_SYNC_IN :  std_logic;\r
+       SIGNAL APV_FRAME_REQD_IN :  std_logic;\r
+       SIGNAL ADC0_PLL_LOCK_IN :  std_logic;\r
+       SIGNAL ADC0_CLK40M_IN :  std_logic;\r
+       SIGNAL ADC0_0_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_1_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_2_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_3_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_4_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_5_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_6_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_7_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_PLL_LOCK_IN :  std_logic;\r
+       SIGNAL ADC1_CLK40M_IN :  std_logic;\r
+       SIGNAL ADC1_0_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_1_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_2_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_3_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_4_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_5_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_6_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_7_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL MAX_TRG_NUM_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL BIT_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL BIT_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_ON_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_FULL_OUT :  std_logic;\r
+       SIGNAL BUF_ADDR_IN :  std_logic_vector(6 downto 0);\r
+       SIGNAL BUF_DONE_IN :  std_logic;\r
+       SIGNAL BUF_TICK_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_START_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_READY_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_0_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_1_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_2_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_3_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_4_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_5_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_6_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_7_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_8_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_9_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_10_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_11_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_12_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_13_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_14_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_15_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: raw_buf_stage PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_APV_IN => RESET_APV_IN,\r
+               RESET_IN => RESET_IN,\r
+               APV_SYNC_IN => APV_SYNC_IN,\r
+               APV_FRAME_REQD_IN => APV_FRAME_REQD_IN,\r
+               ADC0_PLL_LOCK_IN => ADC0_PLL_LOCK_IN,\r
+               ADC0_CLK40M_IN => ADC0_CLK40M_IN,\r
+               ADC0_0_DATA_IN => ADC0_0_DATA_IN,\r
+               ADC0_1_DATA_IN => ADC0_1_DATA_IN,\r
+               ADC0_2_DATA_IN => ADC0_2_DATA_IN,\r
+               ADC0_3_DATA_IN => ADC0_3_DATA_IN,\r
+               ADC0_4_DATA_IN => ADC0_4_DATA_IN,\r
+               ADC0_5_DATA_IN => ADC0_5_DATA_IN,\r
+               ADC0_6_DATA_IN => ADC0_6_DATA_IN,\r
+               ADC0_7_DATA_IN => ADC0_7_DATA_IN,\r
+               ADC1_PLL_LOCK_IN => ADC1_PLL_LOCK_IN,\r
+               ADC1_CLK40M_IN => ADC1_CLK40M_IN,\r
+               ADC1_0_DATA_IN => ADC1_0_DATA_IN,\r
+               ADC1_1_DATA_IN => ADC1_1_DATA_IN,\r
+               ADC1_2_DATA_IN => ADC1_2_DATA_IN,\r
+               ADC1_3_DATA_IN => ADC1_3_DATA_IN,\r
+               ADC1_4_DATA_IN => ADC1_4_DATA_IN,\r
+               ADC1_5_DATA_IN => ADC1_5_DATA_IN,\r
+               ADC1_6_DATA_IN => ADC1_6_DATA_IN,\r
+               ADC1_7_DATA_IN => ADC1_7_DATA_IN,\r
+               MAX_TRG_NUM_IN => MAX_TRG_NUM_IN,\r
+               BIT_LOW_IN => BIT_LOW_IN,\r
+               BIT_HIGH_IN => BIT_HIGH_IN,\r
+               FL_LOW_IN => FL_LOW_IN,\r
+               FL_HIGH_IN => FL_HIGH_IN,\r
+               APV_ON_IN => APV_ON_IN,\r
+               BUF_FULL_OUT => BUF_FULL_OUT,\r
+               BUF_ADDR_IN => BUF_ADDR_IN,\r
+               BUF_DONE_IN => BUF_DONE_IN,\r
+               BUF_TICK_OUT => BUF_TICK_OUT,\r
+               BUF_START_OUT => BUF_START_OUT,\r
+               BUF_READY_OUT => BUF_READY_OUT,\r
+               BUF_0_DATA_OUT => BUF_0_DATA_OUT,\r
+               BUF_1_DATA_OUT => BUF_1_DATA_OUT,\r
+               BUF_2_DATA_OUT => BUF_2_DATA_OUT,\r
+               BUF_3_DATA_OUT => BUF_3_DATA_OUT,\r
+               BUF_4_DATA_OUT => BUF_4_DATA_OUT,\r
+               BUF_5_DATA_OUT => BUF_5_DATA_OUT,\r
+               BUF_6_DATA_OUT => BUF_6_DATA_OUT,\r
+               BUF_7_DATA_OUT => BUF_7_DATA_OUT,\r
+               BUF_8_DATA_OUT => BUF_8_DATA_OUT,\r
+               BUF_9_DATA_OUT => BUF_9_DATA_OUT,\r
+               BUF_10_DATA_OUT => BUF_10_DATA_OUT,\r
+               BUF_11_DATA_OUT => BUF_11_DATA_OUT,\r
+               BUF_12_DATA_OUT => BUF_12_DATA_OUT,\r
+               BUF_13_DATA_OUT => BUF_13_DATA_OUT,\r
+               BUF_14_DATA_OUT => BUF_14_DATA_OUT,\r
+               BUF_15_DATA_OUT => BUF_15_DATA_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+-- ADC0 and ADC1 40MHz clock\r
+THE_ADC_CLOCK_GEN: process\r
+begin\r
+       adc0_clk40m_in <= '1'; adc1_clk40m_in <= '1'; wait for 12.5 ns;\r
+       adc0_clk40m_in <= '0'; adc1_clk40m_in <= '0'; wait for 12.5 ns;\r
+end process THE_ADC_CLOCK_GEN;\r
+\r
+-- 100MHz system clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0'; \r
+       reset_apv_in <= '0';\r
+       apv_sync_in <= '0';\r
+       apv_frame_reqd_in <= '0';\r
+       adc0_pll_lock_in <= '0';\r
+       adc0_0_data_in <= x"000";\r
+       adc0_1_data_in <= x"800";\r
+       adc0_2_data_in <= x"800";\r
+       adc0_3_data_in <= x"800";\r
+       adc0_4_data_in <= x"800";\r
+       adc0_5_data_in <= x"800";\r
+       adc0_6_data_in <= x"800";\r
+       adc0_7_data_in <= x"800";\r
+       adc1_pll_lock_in <= '0';\r
+       adc1_0_data_in <= x"800";\r
+       adc1_1_data_in <= x"800";\r
+       adc1_2_data_in <= x"800";\r
+       adc1_3_data_in <= x"800";\r
+       adc1_4_data_in <= x"800";\r
+       adc1_5_data_in <= x"800";\r
+       adc1_6_data_in <= x"800";\r
+       adc1_7_data_in <= x"800";\r
+       max_trg_num_in <= x"1";\r
+       bit_low_in <= x"200";   \r
+       bit_high_in <= x"e00";  \r
+       fl_low_in <= x"780";    \r
+       fl_high_in <= x"880";   \r
+       apv_on_in <= x"0001";\r
+       buf_addr_in <= (others => '0');\r
+       buf_done_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       reset_apv_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       reset_apv_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       wait until rising_edge(clk_in);\r
+       adc0_pll_lock_in <= '1';\r
+       adc1_pll_lock_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Tests may start now\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       \r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_raw_buf_stage_new.vhd b/src/tb_raw_buf_stage_new.vhd
new file mode 100755 (executable)
index 0000000..771f30f
--- /dev/null
@@ -0,0 +1,260 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT raw_buf_stage_new\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_APV_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               APV_SYNC_IN : IN std_logic;\r
+               APV_FRAME_REQD_IN : IN std_logic;\r
+               ADC0_PLL_LOCK_IN : IN std_logic;\r
+               ADC0_CLK40M_IN : IN std_logic;\r
+               ADC0_0_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_1_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_2_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_3_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_4_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_5_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_6_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC0_7_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_PLL_LOCK_IN : IN std_logic;\r
+               ADC1_CLK40M_IN : IN std_logic;\r
+               ADC1_0_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_1_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_2_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_3_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_4_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_5_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_6_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               ADC1_7_DATA_IN : IN std_logic_vector(11 downto 0);\r
+               MAX_TRG_NUM_IN : IN std_logic_vector(3 downto 0);\r
+               BIT_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               BIT_HIGH_IN : IN std_logic_vector(11 downto 0);\r
+               FL_LOW_IN : IN std_logic_vector(11 downto 0);\r
+               FL_HIGH_IN : IN std_logic_vector(11 downto 0);\r
+               APV_ON_IN : IN std_logic_vector(15 downto 0);\r
+               BUF_ADDR_IN : IN std_logic_vector(6 downto 0);\r
+               BUF_DONE_IN : IN std_logic;          \r
+               BUF_FULL_OUT : OUT std_logic;\r
+               BUF_TICK_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_START_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_READY_OUT : OUT std_logic_vector(15 downto 0);\r
+               BUF_0_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_1_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_2_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_3_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_4_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_5_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_6_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_7_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_8_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_9_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_10_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_11_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_12_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_13_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_14_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               BUF_15_DATA_OUT : OUT std_logic_vector(37 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_APV_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL APV_SYNC_IN :  std_logic;\r
+       SIGNAL APV_FRAME_REQD_IN :  std_logic;\r
+       SIGNAL ADC0_PLL_LOCK_IN :  std_logic;\r
+       SIGNAL ADC0_CLK40M_IN :  std_logic;\r
+       SIGNAL ADC0_0_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_1_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_2_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_3_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_4_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_5_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_6_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC0_7_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_PLL_LOCK_IN :  std_logic;\r
+       SIGNAL ADC1_CLK40M_IN :  std_logic;\r
+       SIGNAL ADC1_0_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_1_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_2_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_3_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_4_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_5_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_6_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL ADC1_7_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL MAX_TRG_NUM_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL BIT_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL BIT_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_LOW_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL FL_HIGH_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL APV_ON_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_FULL_OUT :  std_logic;\r
+       SIGNAL BUF_ADDR_IN :  std_logic_vector(6 downto 0);\r
+       SIGNAL BUF_DONE_IN :  std_logic;\r
+       SIGNAL BUF_TICK_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_START_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_READY_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUF_0_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_1_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_2_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_3_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_4_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_5_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_6_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_7_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_8_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_9_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_10_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_11_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_12_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_13_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_14_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL BUF_15_DATA_OUT :  std_logic_vector(37 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: raw_buf_stage_new PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_APV_IN => RESET_APV_IN,\r
+               RESET_IN => RESET_IN,\r
+               APV_SYNC_IN => APV_SYNC_IN,\r
+               APV_FRAME_REQD_IN => APV_FRAME_REQD_IN,\r
+               ADC0_PLL_LOCK_IN => ADC0_PLL_LOCK_IN,\r
+               ADC0_CLK40M_IN => ADC0_CLK40M_IN,\r
+               ADC0_0_DATA_IN => ADC0_0_DATA_IN,\r
+               ADC0_1_DATA_IN => ADC0_1_DATA_IN,\r
+               ADC0_2_DATA_IN => ADC0_2_DATA_IN,\r
+               ADC0_3_DATA_IN => ADC0_3_DATA_IN,\r
+               ADC0_4_DATA_IN => ADC0_4_DATA_IN,\r
+               ADC0_5_DATA_IN => ADC0_5_DATA_IN,\r
+               ADC0_6_DATA_IN => ADC0_6_DATA_IN,\r
+               ADC0_7_DATA_IN => ADC0_7_DATA_IN,\r
+               ADC1_PLL_LOCK_IN => ADC1_PLL_LOCK_IN,\r
+               ADC1_CLK40M_IN => ADC1_CLK40M_IN,\r
+               ADC1_0_DATA_IN => ADC1_0_DATA_IN,\r
+               ADC1_1_DATA_IN => ADC1_1_DATA_IN,\r
+               ADC1_2_DATA_IN => ADC1_2_DATA_IN,\r
+               ADC1_3_DATA_IN => ADC1_3_DATA_IN,\r
+               ADC1_4_DATA_IN => ADC1_4_DATA_IN,\r
+               ADC1_5_DATA_IN => ADC1_5_DATA_IN,\r
+               ADC1_6_DATA_IN => ADC1_6_DATA_IN,\r
+               ADC1_7_DATA_IN => ADC1_7_DATA_IN,\r
+               MAX_TRG_NUM_IN => MAX_TRG_NUM_IN,\r
+               BIT_LOW_IN => BIT_LOW_IN,\r
+               BIT_HIGH_IN => BIT_HIGH_IN,\r
+               FL_LOW_IN => FL_LOW_IN,\r
+               FL_HIGH_IN => FL_HIGH_IN,\r
+               APV_ON_IN => APV_ON_IN,\r
+               BUF_FULL_OUT => BUF_FULL_OUT,\r
+               BUF_ADDR_IN => BUF_ADDR_IN,\r
+               BUF_DONE_IN => BUF_DONE_IN,\r
+               BUF_TICK_OUT => BUF_TICK_OUT,\r
+               BUF_START_OUT => BUF_START_OUT,\r
+               BUF_READY_OUT => BUF_READY_OUT,\r
+               BUF_0_DATA_OUT => BUF_0_DATA_OUT,\r
+               BUF_1_DATA_OUT => BUF_1_DATA_OUT,\r
+               BUF_2_DATA_OUT => BUF_2_DATA_OUT,\r
+               BUF_3_DATA_OUT => BUF_3_DATA_OUT,\r
+               BUF_4_DATA_OUT => BUF_4_DATA_OUT,\r
+               BUF_5_DATA_OUT => BUF_5_DATA_OUT,\r
+               BUF_6_DATA_OUT => BUF_6_DATA_OUT,\r
+               BUF_7_DATA_OUT => BUF_7_DATA_OUT,\r
+               BUF_8_DATA_OUT => BUF_8_DATA_OUT,\r
+               BUF_9_DATA_OUT => BUF_9_DATA_OUT,\r
+               BUF_10_DATA_OUT => BUF_10_DATA_OUT,\r
+               BUF_11_DATA_OUT => BUF_11_DATA_OUT,\r
+               BUF_12_DATA_OUT => BUF_12_DATA_OUT,\r
+               BUF_13_DATA_OUT => BUF_13_DATA_OUT,\r
+               BUF_14_DATA_OUT => BUF_14_DATA_OUT,\r
+               BUF_15_DATA_OUT => BUF_15_DATA_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+-- ADC0 and ADC1 40MHz clock\r
+THE_ADC_CLOCK_GEN: process\r
+begin\r
+       adc0_clk40m_in <= '1'; adc1_clk40m_in <= '1'; wait for 12.5 ns;\r
+       adc0_clk40m_in <= '0'; adc1_clk40m_in <= '0'; wait for 12.5 ns;\r
+end process THE_ADC_CLOCK_GEN;\r
+\r
+-- 100MHz system clock\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0'; \r
+       reset_apv_in <= '0';\r
+       apv_sync_in <= '0';\r
+       apv_frame_reqd_in <= '0';\r
+       adc0_pll_lock_in <= '0';\r
+       adc0_0_data_in <= x"000";\r
+       adc0_1_data_in <= x"800";\r
+       adc0_2_data_in <= x"800";\r
+       adc0_3_data_in <= x"800";\r
+       adc0_4_data_in <= x"800";\r
+       adc0_5_data_in <= x"800";\r
+       adc0_6_data_in <= x"800";\r
+       adc0_7_data_in <= x"800";\r
+       adc1_pll_lock_in <= '0';\r
+       adc1_0_data_in <= x"800";\r
+       adc1_1_data_in <= x"800";\r
+       adc1_2_data_in <= x"800";\r
+       adc1_3_data_in <= x"800";\r
+       adc1_4_data_in <= x"800";\r
+       adc1_5_data_in <= x"800";\r
+       adc1_6_data_in <= x"800";\r
+       adc1_7_data_in <= x"800";\r
+       max_trg_num_in <= x"1";\r
+       bit_low_in <= x"200";   \r
+       bit_high_in <= x"e00";  \r
+       fl_low_in <= x"780";    \r
+       fl_high_in <= x"880";   \r
+       apv_on_in <= x"0001";\r
+       buf_addr_in <= (others => '0');\r
+       buf_done_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       reset_apv_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       reset_apv_in <= '0';\r
+       wait for 100 ns;\r
+\r
+       wait until rising_edge(clk_in);\r
+       adc0_pll_lock_in <= '1';\r
+       adc1_pll_lock_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Tests may start now\r
+       wait until rising_edge(clk_in);\r
+\r
+       \r
+       \r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_real_trg_handler.vhd b/src/tb_real_trg_handler.vhd
new file mode 100644 (file)
index 0000000..3250152
--- /dev/null
@@ -0,0 +1,245 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT real_trg_handler\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               CLEAR_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               TIME_TRG_IN : IN std_logic_vector(3 downto 0);\r
+               TRB_TRG_IN : IN std_logic_vector(3 downto 0);\r
+               APV_TRGDONE_IN : IN std_logic;\r
+               TRG_3_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_2_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_1_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRG_0_TODO_IN : IN std_logic_vector(3 downto 0);\r
+               TRB_TTAG_IN : IN std_logic_vector(15 downto 0);\r
+               TRB_TRND_IN : IN std_logic_vector(7 downto 0);\r
+               TRB_TTYPE_IN : IN std_logic_vector(3 downto 0);\r
+               TRB_TRGRCVD_IN : IN std_logic;\r
+               BUSY_RELEASE_IN : IN std_logic;          \r
+               TRB_MISMATCH_OUT : OUT std_logic;\r
+               LVL1_COUNTER_OUT : OUT std_logic_vector(15 downto 0);\r
+               APV_TRGSEL_OUT : OUT std_logic_vector(3 downto 0);\r
+               APV_TRGSTART_OUT : OUT std_logic;\r
+               EDS_DATA_OUT : OUT std_logic_vector(39 downto 0);\r
+               EDS_WE_OUT : OUT std_logic;\r
+               EDS_START_OUT : OUT std_logic;\r
+               EDS_READY_OUT : OUT std_logic;\r
+               DBG_FRMCTR_OUT : OUT std_logic_vector(3 downto 0);\r
+               BSM_OUT : OUT std_logic_vector(7 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL CLEAR_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL TIME_TRG_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRB_TRG_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL APV_TRGDONE_IN :  std_logic;\r
+       SIGNAL TRG_3_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_2_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_1_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRG_0_TODO_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRB_TTAG_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL TRB_TRND_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL TRB_TTYPE_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL TRB_TRGRCVD_IN :  std_logic;\r
+       SIGNAL TRB_MISMATCH_OUT :  std_logic;\r
+       SIGNAL LVL1_COUNTER_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BUSY_RELEASE_IN :  std_logic;\r
+       SIGNAL APV_TRGSEL_OUT :  std_logic_vector(3 downto 0);\r
+       SIGNAL APV_TRGSTART_OUT :  std_logic;\r
+       SIGNAL EDS_DATA_OUT :  std_logic_vector(39 downto 0);\r
+       SIGNAL EDS_WE_OUT :  std_logic;\r
+       SIGNAL EDS_START_OUT :  std_logic;\r
+       SIGNAL EDS_READY_OUT :  std_logic;\r
+       SIGNAL DBG_FRMCTR_OUT :  std_logic_vector(3 downto 0);\r
+       SIGNAL BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: real_trg_handler PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               CLEAR_IN => CLEAR_IN,\r
+               RESET_IN => RESET_IN,\r
+               TIME_TRG_IN => TIME_TRG_IN,\r
+               TRB_TRG_IN => TRB_TRG_IN,\r
+               APV_TRGDONE_IN => APV_TRGDONE_IN,\r
+               TRG_3_TODO_IN => TRG_3_TODO_IN,\r
+               TRG_2_TODO_IN => TRG_2_TODO_IN,\r
+               TRG_1_TODO_IN => TRG_1_TODO_IN,\r
+               TRG_0_TODO_IN => TRG_0_TODO_IN,\r
+               TRB_TTAG_IN => TRB_TTAG_IN,\r
+               TRB_TRND_IN => TRB_TRND_IN,\r
+               TRB_TTYPE_IN => TRB_TTYPE_IN,\r
+               TRB_TRGRCVD_IN => TRB_TRGRCVD_IN,\r
+               TRB_MISMATCH_OUT => TRB_MISMATCH_OUT,\r
+               LVL1_COUNTER_OUT => LVL1_COUNTER_OUT,\r
+               BUSY_RELEASE_IN => BUSY_RELEASE_IN,\r
+               APV_TRGSEL_OUT => APV_TRGSEL_OUT,\r
+               APV_TRGSTART_OUT => APV_TRGSTART_OUT,\r
+               EDS_DATA_OUT => EDS_DATA_OUT,\r
+               EDS_WE_OUT => EDS_WE_OUT,\r
+               EDS_START_OUT => EDS_START_OUT,\r
+               EDS_READY_OUT => EDS_READY_OUT,\r
+               DBG_FRMCTR_OUT => DBG_FRMCTR_OUT,\r
+               BSM_OUT => BSM_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       clear_in <= '0'; \r
+       reset_in <= '0';\r
+       time_trg_in <= x"0"; \r
+       trb_trg_in <= x"0";\r
+       apv_trgdone_in <= '0';\r
+       trg_3_todo_in <= x"0";\r
+       trg_2_todo_in <= x"3";\r
+       trg_1_todo_in <= x"2";\r
+       trg_0_todo_in <= x"1";\r
+       trb_ttag_in <= x"dead";\r
+       trb_trnd_in <= x"fc";\r
+       trb_ttype_in <= x"1";\r
+       trb_trgrcvd_in <= '0';\r
+       busy_release_in <= '0';\r
+       -- Reset all\r
+       clear_in <= '1'; wait for 50 ns;\r
+       clear_in <= '0'; wait for 50 ns;\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       -- Tests may start here\r
+\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+       -- First sync trigger\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"8";\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"0";\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 155 ns;\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 200 ns;\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 100 ns;\r
+\r
+       -- Second trigger\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"1";\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"0";\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 155 ns;\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 200 ns;\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 100 ns;\r
+\r
+       -- Check it\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"c";\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       trb_trg_in <= x"0";\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 155 ns;\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       apv_trgdone_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 200 ns;\r
+       wait until rising_edge(clk_in);\r
+       trb_trgrcvd_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       busy_release_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+       -- Stay a while, stay forever.\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_reboot_handler.vhd b/src/tb_reboot_handler.vhd
new file mode 100644 (file)
index 0000000..851a58b
--- /dev/null
@@ -0,0 +1,71 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT reboot_handler\r
+       PORT(\r
+               RESET_IN : IN std_logic;\r
+               CLK_IN : IN std_logic;\r
+               START_IN : IN std_logic;          \r
+               REBOOT_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL START_IN :  std_logic;\r
+       SIGNAL REBOOT_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: reboot_handler PORT MAP(\r
+               RESET_IN => RESET_IN,\r
+               CLK_IN => CLK_IN,\r
+               START_IN => START_IN,\r
+               REBOOT_OUT => REBOOT_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       start_in <= '0';\r
+       \r
+       -- Sync reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 140 ns;\r
+       \r
+       -- Tests may start now\r
+       wait until rising_edge(clk_in);\r
+       start_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       start_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+END;\r
+\r
diff --git a/src/tb_reset_handler.vhd b/src/tb_reset_handler.vhd
new file mode 100644 (file)
index 0000000..82ff279
--- /dev/null
@@ -0,0 +1,76 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT reset_handler\r
+       PORT(\r
+               CLEAR_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               CLK_IN : IN std_logic;\r
+               TRB_RESET_IN : IN std_logic;          \r
+               RESET_OUT : OUT std_logic;\r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLEAR_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL TRB_RESET_IN :  std_logic;\r
+       SIGNAL RESET_OUT :  std_logic;\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: reset_handler PORT MAP(\r
+               CLEAR_IN => CLEAR_IN,\r
+               RESET_IN => RESET_IN,\r
+               CLK_IN => CLK_IN,\r
+               TRB_RESET_IN => TRB_RESET_IN,\r
+               RESET_OUT => RESET_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       clear_in <= '1';\r
+       reset_in <= '0';\r
+       trb_reset_in <= '0';\r
+       \r
+       \r
+       -- Tests may start now\r
+       wait for 300 ns;\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 3.33 ns;\r
+       clear_in <= '0';        \r
+\r
+       wait for 2 us;\r
+\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+\r
+       wait for 2 us;\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+END;\r
+\r
diff --git a/src/tb_slv_adc_la.vhd b/src/tb_slv_adc_la.vhd
new file mode 100644 (file)
index 0000000..4429969
--- /dev/null
@@ -0,0 +1,94 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT slv_adc_la\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SLV_ADDR_IN : IN std_logic_vector(9 downto 0);\r
+               SLV_READ_IN : IN std_logic;\r
+               SLV_WRITE_IN : IN std_logic;\r
+               SLV_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               ADC_CLK_IN : IN std_logic;\r
+               ADC_DATA_IN : IN std_logic_vector(11 downto 0);          \r
+               SLV_ACK_OUT : OUT std_logic;\r
+               SLV_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               ADC_SEL_OUT : OUT std_logic_vector(2 downto 0);\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SLV_ADDR_IN :  std_logic_vector(9 downto 0);\r
+       SIGNAL SLV_READ_IN :  std_logic;\r
+       SIGNAL SLV_WRITE_IN :  std_logic;\r
+       SIGNAL SLV_ACK_OUT :  std_logic;\r
+       SIGNAL SLV_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL SLV_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL ADC_SEL_OUT :  std_logic_vector(2 downto 0);\r
+       SIGNAL ADC_CLK_IN :  std_logic;\r
+       SIGNAL ADC_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: slv_adc_la PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SLV_ADDR_IN => SLV_ADDR_IN,\r
+               SLV_READ_IN => SLV_READ_IN,\r
+               SLV_WRITE_IN => SLV_WRITE_IN,\r
+               SLV_ACK_OUT => SLV_ACK_OUT,\r
+               SLV_DATA_IN => SLV_DATA_IN,\r
+               SLV_DATA_OUT => SLV_DATA_OUT,\r
+               ADC_SEL_OUT => ADC_SEL_OUT,\r
+               ADC_CLK_IN => ADC_CLK_IN,\r
+               ADC_DATA_IN => ADC_DATA_IN,\r
+               STAT => STAT\r
+       );\r
+\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_ADC_CLOCK_GEN: process\r
+begin\r
+       adc_clk_in <= '1'; wait for 12.5 ns;\r
+       adc_clk_in <= '0'; wait for 12.5 ns;\r
+end process THE_ADC_CLOCK_GEN;\r
+\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '0';\r
+       slv_write_in <= '0';\r
+       slv_data_in <= x"0000_0000";\r
+       wait for 100 ns;\r
+\r
+       -- Reset all\r
+       reset_in <= '1';\r
+       wait for 100 ns;\r
+       reset_in <= '0';\r
+       wait for 400 ns;\r
+\r
+       -- Tests may start now\r
+       \r
+       -- stay a while.... stay forever!!!\r
+       wait;\r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_slv_adc_snoop.vhd b/src/tb_slv_adc_snoop.vhd
new file mode 100644 (file)
index 0000000..9c3012c
--- /dev/null
@@ -0,0 +1,243 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT slv_adc_snoop\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SLV_ADDR_IN : IN std_logic_vector(9 downto 0);\r
+               SLV_READ_IN : IN std_logic;\r
+               SLV_WRITE_IN : IN std_logic;\r
+               SLV_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               ADC_CLK_IN : IN std_logic;\r
+               ADC_DATA_IN : IN std_logic_vector(11 downto 0);          \r
+               SLV_ACK_OUT : OUT std_logic;\r
+               SLV_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               ADC_SEL_OUT : OUT std_logic_vector(2 downto 0);\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SLV_ADDR_IN :  std_logic_vector(9 downto 0);\r
+       SIGNAL SLV_READ_IN :  std_logic;\r
+       SIGNAL SLV_WRITE_IN :  std_logic;\r
+       SIGNAL SLV_ACK_OUT :  std_logic;\r
+       SIGNAL SLV_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL SLV_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL ADC_SEL_OUT :  std_logic_vector(2 downto 0);\r
+       SIGNAL ADC_CLK_IN :  std_logic;\r
+       SIGNAL ADC_DATA_IN :  std_logic_vector(11 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+       signal adc_real :  std_logic_vector(11 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: slv_adc_snoop PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SLV_ADDR_IN => SLV_ADDR_IN,\r
+               SLV_READ_IN => SLV_READ_IN,\r
+               SLV_WRITE_IN => SLV_WRITE_IN,\r
+               SLV_ACK_OUT => SLV_ACK_OUT,\r
+               SLV_DATA_IN => SLV_DATA_IN,\r
+               SLV_DATA_OUT => SLV_DATA_OUT,\r
+               ADC_SEL_OUT => ADC_SEL_OUT,\r
+               ADC_CLK_IN => ADC_CLK_IN,\r
+               ADC_DATA_IN => ADC_DATA_IN,\r
+               STAT => STAT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_ADC_CLK_GEN: process\r
+begin\r
+       adc_clk_in <= '1'; wait for 12 ns;\r
+       adc_clk_in <= '0'; wait for 12 ns;\r
+end process THE_ADC_CLK_GEN;\r
+\r
+BLA: process\r
+variable adc_data : unsigned(11 downto 0) := x"000";\r
+begin\r
+       adc_real <= std_logic_vector(adc_data);\r
+       wait until rising_edge(adc_clk_in);\r
+       adc_data_in <= adc_real;\r
+       adc_data := adc_data + 1;\r
+end process BLA;\r
+\r
+THE_TEST_BENCH: process\r
+variable addr : unsigned(9 downto 0) := b"00_0000_0000";\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       slv_read_in <= '0';\r
+       slv_write_in <= '0';\r
+       slv_data_in <= x"0000_0000";\r
+       slv_addr_in <= b"00_0000_0000";\r
+\r
+       -- Reset the whole bunch\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+               \r
+       -- Tests may start now\r
+\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_data_in <= x"0000_4000";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       wait for 500 ns;\r
+\r
+       -- Stop the sampling\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_data_in <= x"0000_0000";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- get last written address\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+\r
+       addr := unsigned(slv_data_out(25 downto 16));\r
+       addr := addr + 1;\r
+       \r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read back the whole stuff\r
+       READ_LOOP: for I in 0 to 1023 loop\r
+               -- One read access\r
+               wait until rising_edge(clk_in);\r
+               slv_addr_in <= std_logic_vector(addr); --b"00_0000_0000";\r
+               slv_read_in <= '1';\r
+               wait until rising_edge(clk_in);\r
+               slv_read_in <= '0';\r
+               wait until rising_edge(slv_ack_out);\r
+               wait until rising_edge(clk_in);\r
+               wait until rising_edge(clk_in);\r
+               addr := addr + 1;\r
+       end loop READ_LOOP;\r
+\r
+\r
+       -- Stay a while, stay forever!\r
+       wait;\r
+end process THE_TEST_BENCH;\r
+\r
+\r
+END;\r
diff --git a/src/tb_slv_onewire_memory.vhd b/src/tb_slv_onewire_memory.vhd
new file mode 100644 (file)
index 0000000..5a86454
--- /dev/null
@@ -0,0 +1,958 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT slv_onewire_memory\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SLV_ADDR_IN : IN std_logic_vector(5 downto 0);\r
+               SLV_READ_IN : IN std_logic;\r
+               SLV_WRITE_IN : IN std_logic;\r
+               BACKPLANE_IN : IN std_logic_vector(2 downto 0);\r
+               ONEWIRE_START_IN : IN std_logic;    \r
+               ONEWIRE_INOUT : INOUT std_logic_vector(15 downto 0);      \r
+               BP_ONEWIRE_INOUT : INOUT std_logic;    \r
+               SLV_ACK_OUT : OUT std_logic;\r
+               SLV_BUSY_OUT : OUT std_logic;\r
+               SLV_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               STAT : OUT std_logic_vector(63 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SLV_ADDR_IN :  std_logic_vector(5 downto 0);\r
+       SIGNAL SLV_READ_IN :  std_logic;\r
+       SIGNAL SLV_WRITE_IN :  std_logic;\r
+       SIGNAL BACKPLANE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL SLV_ACK_OUT :  std_logic;\r
+       SIGNAL SLV_BUSY_OUT :  std_logic;\r
+       SIGNAL SLV_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL ONEWIRE_START_IN :  std_logic;\r
+       SIGNAL ONEWIRE_INOUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL BP_ONEWIRE_INOUT :  std_logic;    \r
+       SIGNAL STAT :  std_logic_vector(63 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: slv_onewire_memory PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SLV_ADDR_IN => SLV_ADDR_IN,\r
+               SLV_READ_IN => SLV_READ_IN,\r
+               SLV_WRITE_IN => SLV_WRITE_IN,\r
+               BACKPLANE_IN => BACKPLANE_IN,\r
+               SLV_ACK_OUT => SLV_ACK_OUT,\r
+               SLV_DATA_OUT => SLV_DATA_OUT,\r
+               SLV_BUSY_OUT => SLV_BUSY_OUT,\r
+               ONEWIRE_START_IN => ONEWIRE_START_IN,\r
+               ONEWIRE_INOUT => ONEWIRE_INOUT,\r
+               BP_ONEWIRE_INOUT => BP_ONEWIRE_INOUT,\r
+               STAT => STAT\r
+       );\r
+\r
+CLK_GEN_PROC: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process CLK_GEN_PROC;\r
+\r
+THE_TESTBENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       slv_addr_in <= (others => '0');\r
+       backplane_in <= b"000";\r
+       slv_read_in <= '0';\r
+       slv_write_in <= '0';\r
+       onewire_start_in <= '0';\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       \r
+       -- Do a reset\r
+       wait for 50 ns;\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Tests may start here\r
+\r
+       -- Start one cycle\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- 1Wire access\r
+       -- wait for reset pulse (READ_ID)\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until rising_edge(onewire_inout(0));\r
+       wait for 30 us;\r
+       onewire_inout <= b"0000_0000_0000_0000";\r
+       bp_onewire_inout <= '0';\r
+       wait for 120 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+\r
+       -- serial number\r
+       -- bit 0\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fe80";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 1\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ef71";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 2\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"d062";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 3\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"c153";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 4\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"b244";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 5\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"a335";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 6\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"9426";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 7\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"8517";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 8\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"7608";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 9\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"67f9";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 10\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"58ea";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 11\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"49db";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 12\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"3acc";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 13\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"2bbd";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 14\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"1cae";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 15\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"0d9f";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- bit 16\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"dead";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 17\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"beef";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 18\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"affe";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 19\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"d00f";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 20\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"facc";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 21\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"0123";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 22\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"4567";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 23\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"89ab";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 24\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"cdef";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 25\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"aaaa";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 26\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"5555";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 27\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"6271";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 28\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"4711";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 29\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"0666";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 30\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"7550";\r
+       bp_onewire_inout <= '0';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 31\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"bacc";\r
+       bp_onewire_inout <= '1';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- bit 32\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"0123";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 33\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"4567";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 34\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"89ab";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 35\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"cdef";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 36\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"0f1e";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 37\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"2d3c";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 38\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"4b5a";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 39\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"6978";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 40\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"8796";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 41\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"a5b4";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 42\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"c3d2";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 43\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"e1f0";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 44\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fedc";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 45\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ba98";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 46\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"7654";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 47\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"3210";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- bit 48\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fffe";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 49\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fffd";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 50\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fffb";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 51\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fff7";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 52\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ffef";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 53\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ffdf";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 54\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ffbf";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 55\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"ff7f";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 56\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"feff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 57\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fdff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 58\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"fbff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 59\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"f7ff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 60\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"efff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 61\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"dfff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 62\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"bfff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 63\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"7fff";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- wait for reset pulse (CONV_TEMP)\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until rising_edge(onewire_inout(0));\r
+       wait for 30 us;\r
+       onewire_inout <= b"0000_0000_0000_0000";\r
+       bp_onewire_inout <= '0';\r
+       wait for 120 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+\r
+       -- wait for reset pulse (READ_TEMP)\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until rising_edge(onewire_inout(0));\r
+       wait for 30 us;\r
+       onewire_inout <= b"0000_0000_0000_0000";\r
+       bp_onewire_inout <= '0';\r
+       wait for 120 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+       -- skip the command sequence\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+       wait until falling_edge(onewire_inout(0));\r
+\r
+       -- temparature\r
+       -- bit 0\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"4001";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 1\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"5002";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 2\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"6004";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 3\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"7008";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 4\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"8010";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 5\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"9020";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 6\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"a040";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 7\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"b080";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 8\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"c100";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 9\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"d200";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 10\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"e400";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+       -- bit 11\r
+       wait until falling_edge(onewire_inout(0));\r
+       onewire_inout <= x"f800";\r
+       bp_onewire_inout <= 'H';\r
+       wait for 30 us;\r
+       onewire_inout <= (others => 'H');\r
+       bp_onewire_inout <= 'H';\r
+\r
+\r
+       -- wait for end of 1Wire access\r
+       wait until falling_edge(slv_busy_out);\r
+       wait for 100 ns;\r
+\r
+       -- 1Wire 0\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0000";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0001";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0010";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0011";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- 1Wire 1\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0100";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0101";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0110";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_0111";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- 1Wire 1\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1000";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1001";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1010";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1011";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- 1Wire 3\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1100";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1101";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1110";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"00_1111";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+\r
+\r
+       -- 1Wire 15\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"11_1100";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"11_1101";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"11_1110";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- read one address\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"11_1111";\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Do a write\r
+       \r
+       -- Stay a while, stay forever!\r
+       wait;\r
+end process THE_TESTBENCH;\r
+\r
+\r
+\r
+END;\r
+\r
diff --git a/src/tb_slv_ped_thr_mem.vhd b/src/tb_slv_ped_thr_mem.vhd
new file mode 100644 (file)
index 0000000..f46fcf5
--- /dev/null
@@ -0,0 +1,225 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT slv_ped_thr_mem\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SLV_ADDR_IN : IN std_logic_vector(10 downto 0);\r
+               SLV_READ_IN : IN std_logic;\r
+               SLV_WRITE_IN : IN std_logic;\r
+               SLV_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               BACKPLANE_IN : IN std_logic_vector(2 downto 0);\r
+               MEM_CLK_IN : IN std_logic;\r
+               MEM_ADDR_IN : IN std_logic_vector(6 downto 0);          \r
+               SLV_ACK_OUT : OUT std_logic;\r
+               SLV_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               MEM_0_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_1_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_2_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_3_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_4_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_5_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_6_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_7_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_8_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_9_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_10_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_11_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_12_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_13_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_14_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               MEM_15_D_OUT : OUT std_logic_vector(17 downto 0);\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SLV_ADDR_IN :  std_logic_vector(10 downto 0);\r
+       SIGNAL SLV_READ_IN :  std_logic;\r
+       SIGNAL SLV_WRITE_IN :  std_logic;\r
+       SIGNAL SLV_ACK_OUT :  std_logic;\r
+       SIGNAL SLV_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL SLV_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL BACKPLANE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL MEM_CLK_IN :  std_logic;\r
+       SIGNAL MEM_ADDR_IN :  std_logic_vector(6 downto 0);\r
+       SIGNAL MEM_0_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_1_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_2_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_3_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_4_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_5_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_6_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_7_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_8_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_9_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_10_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_11_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_12_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_13_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_14_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL MEM_15_D_OUT :  std_logic_vector(17 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: slv_ped_thr_mem PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SLV_ADDR_IN => SLV_ADDR_IN,\r
+               SLV_READ_IN => SLV_READ_IN,\r
+               SLV_WRITE_IN => SLV_WRITE_IN,\r
+               SLV_ACK_OUT => SLV_ACK_OUT,\r
+               SLV_DATA_IN => SLV_DATA_IN,\r
+               SLV_DATA_OUT => SLV_DATA_OUT,\r
+               BACKPLANE_IN => BACKPLANE_IN,\r
+               MEM_CLK_IN => MEM_CLK_IN,\r
+               MEM_ADDR_IN => MEM_ADDR_IN,\r
+               MEM_0_D_OUT => MEM_0_D_OUT,\r
+               MEM_1_D_OUT => MEM_1_D_OUT,\r
+               MEM_2_D_OUT => MEM_2_D_OUT,\r
+               MEM_3_D_OUT => MEM_3_D_OUT,\r
+               MEM_4_D_OUT => MEM_4_D_OUT,\r
+               MEM_5_D_OUT => MEM_5_D_OUT,\r
+               MEM_6_D_OUT => MEM_6_D_OUT,\r
+               MEM_7_D_OUT => MEM_7_D_OUT,\r
+               MEM_8_D_OUT => MEM_8_D_OUT,\r
+               MEM_9_D_OUT => MEM_9_D_OUT,\r
+               MEM_10_D_OUT => MEM_10_D_OUT,\r
+               MEM_11_D_OUT => MEM_11_D_OUT,\r
+               MEM_12_D_OUT => MEM_12_D_OUT,\r
+               MEM_13_D_OUT => MEM_13_D_OUT,\r
+               MEM_14_D_OUT => MEM_14_D_OUT,\r
+               MEM_15_D_OUT => MEM_15_D_OUT,\r
+               STAT => STAT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; mem_clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; mem_clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       slv_read_in <= '0';\r
+       slv_write_in <= '0';\r
+       slv_data_in <= x"0000_0000";\r
+       slv_addr_in <= b"111_1111_1111";\r
+       backplane_in <= b"001";\r
+       mem_addr_in <= b"000_0000";\r
+\r
+       -- Reset the whole bunch\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+       \r
+       -- Tests may start now\r
+\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0000";\r
+       slv_data_in <= x"0000_dead";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0001";\r
+       slv_data_in <= x"0000_beef";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0010";\r
+       slv_data_in <= x"0000_affe";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0011";\r
+       slv_data_in <= x"0000_d00f";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0000";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0001";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0010";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= b"000_0000_0011";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+END;\r
+\r
diff --git a/src/tb_slv_register_bank.vhd b/src/tb_slv_register_bank.vhd
new file mode 100644 (file)
index 0000000..1b2c86b
--- /dev/null
@@ -0,0 +1,565 @@
+\r
+-- VHDL Test Bench Created from source file slv_register_bank.vhd -- 07-MAY-2008 01:09:40\r
+--\r
+-- Notes: \r
+-- 1) This testbench template has been automatically generated using types\r
+-- std_logic and std_logic_vector for the ports of the unit under test.\r
+-- Lattice recommends that these types always be used for the top-level\r
+-- I/O of a design in order to guarantee that the testbench will bind\r
+-- correctly to the timing (post-route) simulation model.\r
+-- 2) To use this template as your testbench, change the filename to any\r
+-- name of your choice with the extension .vhd, and use the "source->import"\r
+-- menu in the ispLEVER Project Navigator to import the testbench.\r
+-- Then edit the user defined section below, adding code to generate the \r
+-- stimulus for your design.\r
+-- 3) VHDL simulations will produce errors if there are Lattice FPGA library \r
+-- elements in your design that require the instantiation of GSR, PUR, and\r
+-- TSALL and they are not present in the testbench. For more information see\r
+-- the How To section of online help.  \r
+--\r
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT slv_register_bank\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               SLV_ADDR_IN : IN std_logic_vector(3 downto 0);\r
+               SLV_READ_IN : IN std_logic;\r
+               SLV_WRITE_IN : IN std_logic;\r
+               SLV_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               BACKPLANE_IN : IN std_logic_vector(2 downto 0);\r
+               STAT_0_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_1_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_2_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_3_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_4_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_5_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_6_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_7_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_8_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_9_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_10_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_11_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_12_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_13_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_14_IN : IN std_logic_vector(15 downto 0);\r
+               STAT_15_IN : IN std_logic_vector(15 downto 0);          \r
+               SLV_ACK_OUT : OUT std_logic;\r
+               SLV_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               CTRL_0_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_1_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_2_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_3_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_4_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_5_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_6_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_7_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_8_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_9_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_10_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_11_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_12_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_13_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_14_OUT : OUT std_logic_vector(15 downto 0);\r
+               CTRL_15_OUT : OUT std_logic_vector(15 downto 0);\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL SLV_ADDR_IN :  std_logic_vector(3 downto 0);\r
+       SIGNAL SLV_READ_IN :  std_logic;\r
+       SIGNAL SLV_WRITE_IN :  std_logic;\r
+       SIGNAL SLV_ACK_OUT :  std_logic;\r
+       SIGNAL SLV_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL SLV_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL BACKPLANE_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL CTRL_0_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_1_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_2_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_3_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_4_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_5_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_6_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_7_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_8_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_9_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_10_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_11_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_12_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_13_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_14_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL CTRL_15_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_0_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_1_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_2_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_3_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_4_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_5_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_6_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_7_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_8_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_9_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_10_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_11_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_12_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_13_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_14_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT_15_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: slv_register_bank PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               SLV_ADDR_IN => SLV_ADDR_IN,\r
+               SLV_READ_IN => SLV_READ_IN,\r
+               SLV_WRITE_IN => SLV_WRITE_IN,\r
+               SLV_ACK_OUT => SLV_ACK_OUT,\r
+               SLV_DATA_IN => SLV_DATA_IN,\r
+               SLV_DATA_OUT => SLV_DATA_OUT,\r
+               BACKPLANE_IN => BACKPLANE_IN,\r
+               CTRL_0_OUT => CTRL_0_OUT,\r
+               CTRL_1_OUT => CTRL_1_OUT,\r
+               CTRL_2_OUT => CTRL_2_OUT,\r
+               CTRL_3_OUT => CTRL_3_OUT,\r
+               CTRL_4_OUT => CTRL_4_OUT,\r
+               CTRL_5_OUT => CTRL_5_OUT,\r
+               CTRL_6_OUT => CTRL_6_OUT,\r
+               CTRL_7_OUT => CTRL_7_OUT,\r
+               CTRL_8_OUT => CTRL_8_OUT,\r
+               CTRL_9_OUT => CTRL_9_OUT,\r
+               CTRL_10_OUT => CTRL_10_OUT,\r
+               CTRL_11_OUT => CTRL_11_OUT,\r
+               CTRL_12_OUT => CTRL_12_OUT,\r
+               CTRL_13_OUT => CTRL_13_OUT,\r
+               CTRL_14_OUT => CTRL_14_OUT,\r
+               CTRL_15_OUT => CTRL_15_OUT,\r
+               STAT_0_IN => STAT_0_IN,\r
+               STAT_1_IN => STAT_1_IN,\r
+               STAT_2_IN => STAT_2_IN,\r
+               STAT_3_IN => STAT_3_IN,\r
+               STAT_4_IN => STAT_4_IN,\r
+               STAT_5_IN => STAT_5_IN,\r
+               STAT_6_IN => STAT_6_IN,\r
+               STAT_7_IN => STAT_7_IN,\r
+               STAT_8_IN => STAT_8_IN,\r
+               STAT_9_IN => STAT_9_IN,\r
+               STAT_10_IN => STAT_10_IN,\r
+               STAT_11_IN => STAT_11_IN,\r
+               STAT_12_IN => STAT_12_IN,\r
+               STAT_13_IN => STAT_13_IN,\r
+               STAT_14_IN => STAT_14_IN,\r
+               STAT_15_IN => STAT_15_IN,\r
+               STAT => STAT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       slv_read_in <= '0';\r
+       slv_write_in <= '0';\r
+       slv_data_in <= x"0000_0000";\r
+       slv_addr_in <= b"0000";\r
+       backplane_in <= b"000";\r
+       stat_0_in <= x"aa00";\r
+       stat_1_in <= x"aa01";\r
+       stat_2_in <= x"aa02";\r
+       stat_3_in <= x"aa03";\r
+       stat_4_in <= x"aa04";\r
+       stat_5_in <= x"aa05";\r
+       stat_6_in <= x"aa06";\r
+       stat_7_in <= x"aa07";\r
+       stat_8_in <= x"aa08";\r
+       stat_9_in <= x"aa09";\r
+       stat_10_in <= x"aa0a";\r
+       stat_11_in <= x"aa0b";\r
+       stat_12_in <= x"aa0c";\r
+       stat_13_in <= x"aa0d";\r
+       stat_14_in <= x"aa0e";\r
+       stat_15_in <= x"aa0f";\r
+\r
+       -- Reset the whole bunch\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       \r
+       \r
+       -- Tests may start now\r
\r
+       -- One write access (APV0)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"0";\r
+       slv_data_in <= x"0000_ff00";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV1)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"1";\r
+       slv_data_in <= x"0000_ff01";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV2)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"2";\r
+       slv_data_in <= x"0000_ff02";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV3)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"3";\r
+       slv_data_in <= x"0000_ff03";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV4)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"4";\r
+       slv_data_in <= x"0000_ff04";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV5)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"5";\r
+       slv_data_in <= x"0000_ff05";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV6)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"6";\r
+       slv_data_in <= x"0000_ff06";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV7)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"7";\r
+       slv_data_in <= x"0000_ff07";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV8)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"8";\r
+       slv_data_in <= x"0000_ff08";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV9)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"9";\r
+       slv_data_in <= x"0000_ff09";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV10)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"a";\r
+       slv_data_in <= x"0000_ff0a";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV11)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"b";\r
+       slv_data_in <= x"0000_ff0b";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV12)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"c";\r
+       slv_data_in <= x"0000_ff0c";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV13)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"d";\r
+       slv_data_in <= x"0000_ff0d";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV14)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"e";\r
+       slv_data_in <= x"0000_ff0e";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One write access (APV15)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"f";\r
+       slv_data_in <= x"0000_ff0f";\r
+       slv_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_write_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+\r
+\r
+\r
+       -- One read access (APV0)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"0";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV1)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"1";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV2)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"2";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV3)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"3";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV4)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"4";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV5)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"5";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV6)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"6";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV7)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"7";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV8)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"8";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV9)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"9";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV10)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"a";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV11)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"b";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV12)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"c";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV13)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"d";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV14)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"e";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- One read access (APV15)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"f";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       stat_7_in <= x"dead";\r
+       -- One read access (APV15)\r
+       wait until rising_edge(clk_in);\r
+       slv_addr_in <= x"f";\r
+       slv_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       slv_read_in <= '0';\r
+       wait until rising_edge(slv_ack_out);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Stay a while, stay forever....\r
+       wait;\r
+end process THE_TEST_BENCH;    \r
+\r
+END;\r
+\r
diff --git a/src/tb_spi_master.vhd b/src/tb_spi_master.vhd
new file mode 100644 (file)
index 0000000..f567858
--- /dev/null
@@ -0,0 +1,160 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT spi_master\r
+       PORT(\r
+               CLK_IN : IN std_logic;\r
+               RESET_IN : IN std_logic;\r
+               BUS_READ_IN : IN std_logic;\r
+               BUS_WRITE_IN : IN std_logic;\r
+               BUS_ADDR_IN : IN std_logic_vector(0 to 0);\r
+               BUS_DATA_IN : IN std_logic_vector(31 downto 0);\r
+               SPI_SDI_IN : IN std_logic;\r
+               BRAM_WR_D_IN : IN std_logic_vector(7 downto 0);          \r
+               BUS_BUSY_OUT : OUT std_logic;\r
+               BUS_ACK_OUT : OUT std_logic;\r
+               BUS_DATA_OUT : OUT std_logic_vector(31 downto 0);\r
+               SPI_CS_OUT : OUT std_logic;\r
+               SPI_SDO_OUT : OUT std_logic;\r
+               SPI_SCK_OUT : OUT std_logic;\r
+               BRAM_A_OUT : OUT std_logic_vector(7 downto 0);\r
+               BRAM_RD_D_OUT : OUT std_logic_vector(7 downto 0);\r
+               BRAM_WE_OUT : OUT std_logic;\r
+               STAT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK_IN :  std_logic;\r
+       SIGNAL RESET_IN :  std_logic;\r
+       SIGNAL BUS_READ_IN :  std_logic;\r
+       SIGNAL BUS_WRITE_IN :  std_logic;\r
+       SIGNAL BUS_BUSY_OUT :  std_logic;\r
+       SIGNAL BUS_ACK_OUT :  std_logic;\r
+       SIGNAL BUS_ADDR_IN :  std_logic_vector(0 to 0);\r
+       SIGNAL BUS_DATA_IN :  std_logic_vector(31 downto 0);\r
+       SIGNAL BUS_DATA_OUT :  std_logic_vector(31 downto 0);\r
+       SIGNAL SPI_CS_OUT :  std_logic;\r
+       SIGNAL SPI_SDI_IN :  std_logic;\r
+       SIGNAL SPI_SDO_OUT :  std_logic;\r
+       SIGNAL SPI_SCK_OUT :  std_logic;\r
+       SIGNAL BRAM_A_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL BRAM_WR_D_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL BRAM_RD_D_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL BRAM_WE_OUT :  std_logic;\r
+       SIGNAL STAT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: spi_master PORT MAP(\r
+               CLK_IN => CLK_IN,\r
+               RESET_IN => RESET_IN,\r
+               BUS_READ_IN => BUS_READ_IN,\r
+               BUS_WRITE_IN => BUS_WRITE_IN,\r
+               BUS_BUSY_OUT => BUS_BUSY_OUT,\r
+               BUS_ACK_OUT => BUS_ACK_OUT,\r
+               BUS_ADDR_IN => BUS_ADDR_IN,\r
+               BUS_DATA_IN => BUS_DATA_IN,\r
+               BUS_DATA_OUT => BUS_DATA_OUT,\r
+               SPI_CS_OUT => SPI_CS_OUT,\r
+               SPI_SDI_IN => SPI_SDI_IN,\r
+               SPI_SDO_OUT => SPI_SDO_OUT,\r
+               SPI_SCK_OUT => SPI_SCK_OUT,\r
+               BRAM_A_OUT => BRAM_A_OUT,\r
+               BRAM_WR_D_IN => BRAM_WR_D_IN,\r
+               BRAM_RD_D_OUT => BRAM_RD_D_OUT,\r
+               BRAM_WE_OUT => BRAM_WE_OUT,\r
+               STAT => STAT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       clk_in <= '1'; wait for 5 ns;\r
+       clk_in <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       reset_in <= '0';\r
+       spi_sdi_in <= '0';\r
+       bus_read_in <= '0';\r
+       bus_write_in <= '0';\r
+       bus_addr_in <= b"0";\r
+       bus_data_in <= x"0000_0000";\r
+       bram_wr_d_in <= x"00";\r
+       \r
+       -- Sync reset\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       reset_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       wait for 140 ns;\r
+       \r
+       -- Tests may start now\r
+       \r
+       -- Set MAX to 0x03 = 4 bytes\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"1";\r
+       bus_data_in <= x"03_00_00_00";\r
+       wait until rising_edge(clk_in);\r
+       bus_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       bus_write_in <= '0';\r
+       wait until falling_edge(bus_ack_out);\r
+       bus_data_in <= x"0000_0000";\r
+       bus_addr_in <= b"0";\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- Start SPI access (ReadManId)\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"0";\r
+       bus_data_in <= x"9f_aa_bb_cc";\r
+       wait until rising_edge(clk_in);\r
+       bus_write_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       bus_write_in <= '0';\r
+       wait until falling_edge(bus_ack_out);\r
+       bus_data_in <= x"0000_0000";\r
+       bus_addr_in <= b"0";\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- SPI is busy now...\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"0";\r
+       wait until rising_edge(clk_in);\r
+       bus_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       bus_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"0";\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+\r
+       -- SPI is busy now...\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"1";\r
+       wait until rising_edge(clk_in);\r
+       bus_read_in <= '1';\r
+       wait until rising_edge(clk_in);\r
+       bus_read_in <= '0';\r
+       wait until rising_edge(clk_in);\r
+       bus_addr_in <= b"0";\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       wait until rising_edge(clk_in);\r
+       \r
+       -- Stay a while... stay forever!!!\r
+       wait;\r
+       \r
+end process THE_TEST_BENCH;\r
+END;\r
+\r
diff --git a/src/tb_spi_real_slim.vhd b/src/tb_spi_real_slim.vhd
new file mode 100644 (file)
index 0000000..d437357
--- /dev/null
@@ -0,0 +1,140 @@
+\r
+-- VHDL Test Bench Created from source file spi_real_slim.vhd -- 07-MAY-2008 01:09:40\r
+--\r
+-- Notes: \r
+-- 1) This testbench template has been automatically generated using types\r
+-- std_logic and std_logic_vector for the ports of the unit under test.\r
+-- Lattice recommends that these types always be used for the top-level\r
+-- I/O of a design in order to guarantee that the testbench will bind\r
+-- correctly to the timing (post-route) simulation model.\r
+-- 2) To use this template as your testbench, change the filename to any\r
+-- name of your choice with the extension .vhd, and use the "source->import"\r
+-- menu in the ispLEVER Project Navigator to import the testbench.\r
+-- Then edit the user defined section below, adding code to generate the \r
+-- stimulus for your design.\r
+-- 3) VHDL simulations will produce errors if there are Lattice FPGA library \r
+-- elements in your design that require the instantiation of GSR, PUR, and\r
+-- TSALL and they are not present in the testbench. For more information see\r
+-- the How To section of online help.  \r
+--\r
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT spi_real_slim\r
+       PORT(\r
+               SYSCLK : IN std_logic;\r
+               CLEAR : IN std_logic;\r
+               RESET : IN std_logic;\r
+               START_IN : IN std_logic;\r
+               CMD_IN : IN std_logic_vector(7 downto 0);\r
+               BUSY_OUT : OUT std_logic;\r
+               SPI_SCK_OUT : OUT std_logic;\r
+               SPI_CS_OUT : OUT std_logic;\r
+               SPI_SDO_OUT : OUT std_logic;\r
+               CLK_EN_OUT : OUT std_logic;\r
+               BSM_OUT : OUT std_logic_vector(7 downto 0);\r
+               DEBUG_OUT : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL SYSCLK :  std_logic;\r
+       SIGNAL CLEAR :  std_logic;\r
+       SIGNAL RESET :  std_logic;\r
+       SIGNAL START_IN :  std_logic;\r
+       SIGNAL BUSY_OUT :  std_logic;\r
+       SIGNAL CMD_IN :  std_logic_vector(7 downto 0);\r
+       SIGNAL SPI_SCK_OUT :  std_logic;\r
+       SIGNAL SPI_CS_OUT :  std_logic;\r
+       SIGNAL SPI_SDO_OUT :  std_logic;\r
+       SIGNAL CLK_EN_OUT :  std_logic;\r
+       SIGNAL BSM_OUT :  std_logic_vector(7 downto 0);\r
+       SIGNAL DEBUG_OUT :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: spi_real_slim PORT MAP(\r
+               SYSCLK => SYSCLK,\r
+               CLEAR => CLEAR,\r
+               RESET => RESET,\r
+               START_IN => START_IN,\r
+               BUSY_OUT => BUSY_OUT,\r
+               CMD_IN => CMD_IN,\r
+               SPI_SCK_OUT => SPI_SCK_OUT,\r
+               SPI_CS_OUT => SPI_CS_OUT,\r
+               SPI_SDO_OUT => SPI_SDO_OUT,\r
+               CLK_EN_OUT => CLK_EN_OUT,\r
+               BSM_OUT => BSM_OUT,\r
+               DEBUG_OUT => DEBUG_OUT\r
+       );\r
+\r
+THE_CLOCK_GEN: process\r
+begin\r
+       sysclk <= '1'; wait for 5 ns;\r
+       sysclk <= '0'; wait for 5 ns;\r
+end process THE_CLOCK_GEN;\r
+\r
+THE_TEST_BENCH: process\r
+begin\r
+       -- Setup signals\r
+       clear <= '0';\r
+       reset <= '0';\r
+       start_in <= '0';\r
+       cmd_in <= x"00";\r
+       \r
+       -- Reset all\r
+       wait for 10 ns;\r
+       clear <= '1';\r
+       wait for 10 ns;\r
+       clear <= '0';\r
+       wait for 150 ns;\r
+               \r
+       -- Sync reset\r
+       wait until rising_edge(sysclk);\r
+       reset <= '1';\r
+       wait until rising_edge(sysclk);\r
+       reset <= '0';\r
+       wait until rising_edge(sysclk);\r
+       wait for 140 ns;\r
+       \r
+       \r
+       -- Tests may start now\r
+\r
+       -- check any command\r
+       wait until rising_edge(sysclk);\r
+       cmd_in <= x"a1";\r
+       start_in <= '1';\r
+       wait until rising_edge(sysclk);\r
+       start_in <= '0';\r
+       cmd_in <= x"00";\r
+       wait until rising_edge(busy_out);\r
+       -- Mission accomplished\r
+       wait until falling_edge(busy_out);\r
+       wait for 500 ns;\r
+\r
+       -- check any command\r
+       wait until rising_edge(sysclk);\r
+       cmd_in <= x"c2";\r
+       start_in <= '1';\r
+       wait until rising_edge(sysclk);\r
+       start_in <= '0';\r
+       cmd_in <= x"00";\r
+       wait until rising_edge(busy_out);\r
+       -- Mission accomplished\r
+       wait until falling_edge(busy_out);\r
+       wait for 500 ns;\r
+\r
+       -----------------------------------------------\r
+       -- Stay a while, stay forever... muahahahaha!\r
+       -----------------------------------------------\r
+       wait;\r
+\r
+end process THE_TEST_BENCH;\r
+\r
+END;\r
diff --git a/src/tb_suber_12bit_tmpl.vhd b/src/tb_suber_12bit_tmpl.vhd
new file mode 100644 (file)
index 0000000..f4afdf6
--- /dev/null
@@ -0,0 +1,72 @@
+-- VHDL testbench template generated by SCUBA ispLever_v72_SP2_Build (23)
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+
+entity tb is
+end entity tb;
+
+
+architecture test of tb is 
+
+    component suber_12bit
+        port (DataA : in std_logic_vector(11 downto 0); 
+        DataB : in std_logic_vector(11 downto 0); Clock: in std_logic; 
+        Reset: in std_logic; ClockEn: in std_logic; 
+        Result : out std_logic_vector(11 downto 0)
+    );
+    end component;
+
+    signal DataA : std_logic_vector(11 downto 0) := (others => '0');
+    signal DataB : std_logic_vector(11 downto 0) := (others => '0');
+    signal Clock: std_logic := '0';
+    signal Reset: std_logic := '0';
+    signal ClockEn: std_logic := '0';
+    signal Result : std_logic_vector(11 downto 0);
+begin
+    u1 : suber_12bit
+        port map (DataA => DataA, DataB => DataB, Clock => Clock, Reset => Reset, 
+            ClockEn => ClockEn, Result => Result
+        );
+
+    process
+
+    begin
+      DataA <= (others => '0') ;
+      for i in 0 to 200 loop
+        wait until Clock'event and Clock = '1';
+        DataA <= DataA + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    process
+
+    begin
+      DataB <= (others => '0') ;
+      for i in 0 to 200 loop
+        wait until Clock'event and Clock = '1';
+        DataB <= DataB + '1' after 1 ns;
+      end loop;
+      wait;
+    end process;
+
+    Clock <= not Clock after 5.00 ns;
+
+    process
+
+    begin
+      Reset <= '1' ;
+      wait for 100 ns;
+      Reset <= '0' ;
+      wait;
+    end process;
+
+    process
+
+    begin
+      ClockEn <= '1' ;
+      wait;
+    end process;
+
+end architecture test;
diff --git a/src/tb_trb_net16_ibuf2.vhd b/src/tb_trb_net16_ibuf2.vhd
new file mode 100755 (executable)
index 0000000..856e797
--- /dev/null
@@ -0,0 +1,254 @@
+LIBRARY ieee;\r
+USE ieee.std_logic_1164.ALL;\r
+USE ieee.numeric_std.ALL;\r
+\r
+ENTITY testbench IS\r
+END testbench;\r
+\r
+ARCHITECTURE behavior OF testbench IS \r
+\r
+       COMPONENT trb_net16_ibuf2\r
+       PORT(\r
+               CLK : IN std_logic;\r
+               RESET : IN std_logic;\r
+               CLK_EN : IN std_logic;\r
+               MED_DATAREADY_IN : IN std_logic;\r
+               MED_DATA_IN : IN std_logic_vector(15 downto 0);\r
+               MED_PACKET_NUM_IN : IN std_logic_vector(2 downto 0);\r
+               MED_ERROR_IN : IN std_logic_vector(2 downto 0);\r
+               INT_INIT_READ_IN : IN std_logic;\r
+               INT_REPLY_READ_IN : IN std_logic;          \r
+               MED_READ_OUT : OUT std_logic;\r
+               INT_INIT_DATA_OUT : OUT std_logic_vector(15 downto 0);\r
+               INT_INIT_PACKET_NUM_OUT : OUT std_logic_vector(2 downto 0);\r
+               INT_INIT_DATAREADY_OUT : OUT std_logic;\r
+               INT_REPLY_DATA_OUT : OUT std_logic_vector(15 downto 0);\r
+               INT_REPLY_PACKET_NUM_OUT : OUT std_logic_vector(2 downto 0);\r
+               INT_REPLY_DATAREADY_OUT : OUT std_logic;\r
+               INT_ERROR_OUT : OUT std_logic_vector(2 downto 0);\r
+               STAT_BUFFER_COUNTER : OUT std_logic_vector(31 downto 0);\r
+               STAT_BUFFER : OUT std_logic_vector(31 downto 0)\r
+               );\r
+       END COMPONENT;\r
+\r
+       SIGNAL CLK :  std_logic;\r
+       SIGNAL RESET :  std_logic;\r
+       SIGNAL CLK_EN :  std_logic;\r
+       SIGNAL MED_DATAREADY_IN :  std_logic;\r
+       SIGNAL MED_DATA_IN :  std_logic_vector(15 downto 0);\r
+       SIGNAL MED_PACKET_NUM_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL MED_READ_OUT :  std_logic;\r
+       SIGNAL MED_ERROR_IN :  std_logic_vector(2 downto 0);\r
+       SIGNAL INT_INIT_DATA_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL INT_INIT_PACKET_NUM_OUT :  std_logic_vector(2 downto 0);\r
+       SIGNAL INT_INIT_DATAREADY_OUT :  std_logic;\r
+       SIGNAL INT_INIT_READ_IN :  std_logic;\r
+       SIGNAL INT_REPLY_DATA_OUT :  std_logic_vector(15 downto 0);\r
+       SIGNAL INT_REPLY_PACKET_NUM_OUT :  std_logic_vector(2 downto 0);\r
+       SIGNAL INT_REPLY_DATAREADY_OUT :  std_logic;\r
+       SIGNAL INT_REPLY_READ_IN :  std_logic;\r
+       SIGNAL INT_ERROR_OUT :  std_logic_vector(2 downto 0);\r
+       SIGNAL STAT_BUFFER_COUNTER :  std_logic_vector(31 downto 0);\r
+       SIGNAL STAT_BUFFER :  std_logic_vector(31 downto 0);\r
+\r
+BEGIN\r
+\r
+-- Please check and add your generic clause manually\r
+       uut: trb_net16_ibuf2 \r
+       PORT MAP(\r
+               CLK => CLK,\r
+               RESET => RESET,\r
+               CLK_EN => CLK_EN,\r
+               MED_DATAREADY_IN => MED_DATAREADY_IN,\r
+               MED_DATA_IN => MED_DATA_IN,\r
+               MED_PACKET_NUM_IN => MED_PACKET_NUM_IN,\r
+               MED_READ_OUT => MED_READ_OUT,\r
+               MED_ERROR_IN => MED_ERROR_IN,\r
+               INT_INIT_DATA_OUT => INT_INIT_DATA_OUT,\r
+               INT_INIT_PACKET_NUM_OUT => INT_INIT_PACKET_NUM_OUT,\r
+               INT_INIT_DATAREADY_OUT => INT_INIT_DATAREADY_OUT,\r
+               INT_INIT_READ_IN => INT_INIT_READ_IN,\r
+               INT_REPLY_DATA_OUT => INT_REPLY_DATA_OUT,\r
+               INT_REPLY_PACKET_NUM_OUT => INT_REPLY_PACKET_NUM_OUT,\r
+               INT_REPLY_DATAREADY_OUT => INT_REPLY_DATAREADY_OUT,\r
+               INT_REPLY_READ_IN => INT_REPLY_READ_IN,\r
+               INT_ERROR_OUT => INT_ERROR_OUT,\r
+               STAT_BUFFER_COUNTER => STAT_BUFFER_COUNTER,\r
+               STAT_BUFFER => STAT_BUFFER\r
+       );\r
+\r
+CLOCK_GEN_PROC: process\r
+begin\r
+       clk <= '1'; wait for 5.0 ns;\r
+       clk <= '0'; wait for 5.0 ns;    \r
+end process CLOCK_GEN_PROC;\r
+\r
+THE_TESTBENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       reset <= '0';\r
+       clk_en <= '1';\r
+       med_dataready_in <= '0';\r
+       med_data_in <= x"0000";\r
+       med_packet_num_in <= b"000";    \r
+       med_error_in <= b"000";\r
+       int_init_read_in <= '0';\r
+       int_reply_read_in <= '0';\r
+       wait for 33 ns;\r
+                       \r
+       -- Reset the whole stuff\r
+       wait until rising_edge(clk);\r
+       reset <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       reset <= '0';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       \r
+       -- Tests may start here\r
+\r
+       -- First packet\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"0001";\r
+       med_packet_num_in <= b"100";\r
+       med_dataready_in <= '1';\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"dead";\r
+       med_packet_num_in <= b"000";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"beef";\r
+       med_packet_num_in <= b"001";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"affe";\r
+       med_packet_num_in <= b"010";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"d00f";\r
+       med_packet_num_in <= b"011";\r
+       wait until rising_edge(clk);\r
+       med_dataready_in <= '0';        \r
+\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       int_init_read_in <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+\r
+       -- Second packet\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"0001";\r
+       med_packet_num_in <= b"100";\r
+       med_dataready_in <= '1';\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"dead";\r
+       med_packet_num_in <= b"000";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"beef";\r
+       med_packet_num_in <= b"001";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"affe";\r
+       med_packet_num_in <= b"010";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"d00f";\r
+       med_packet_num_in <= b"011";\r
+       wait until rising_edge(clk);\r
+       med_dataready_in <= '0';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+\r
+\r
+\r
+       -- Third packet\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"0001";\r
+       med_packet_num_in <= b"100";\r
+       med_dataready_in <= '1';\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"dead";\r
+       med_packet_num_in <= b"000";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"beef";\r
+       med_packet_num_in <= b"001";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"affe";\r
+       med_packet_num_in <= b"010";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"d00f";\r
+       med_packet_num_in <= b"011";\r
+       wait until rising_edge(clk);\r
+       med_dataready_in <= '0';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+\r
+       -- Fourth packet\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"0009";\r
+       med_packet_num_in <= b"100";\r
+       med_dataready_in <= '1';\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"dead";\r
+       med_packet_num_in <= b"000";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"beef";\r
+       med_packet_num_in <= b"001";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"affe";\r
+       med_packet_num_in <= b"010";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"d00f";\r
+       med_packet_num_in <= b"011";\r
+       wait until rising_edge(clk);\r
+       med_dataready_in <= '0';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       int_reply_read_in <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+\r
+       -- Fifth packet\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"0009";\r
+       med_packet_num_in <= b"100";\r
+       med_dataready_in <= '1';\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"dead";\r
+       med_packet_num_in <= b"000";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"beef";\r
+       med_packet_num_in <= b"001";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"affe";\r
+       med_packet_num_in <= b"010";\r
+       wait until rising_edge(clk);\r
+       med_data_in <= x"d00f";\r
+       med_packet_num_in <= b"011";\r
+       wait until rising_edge(clk);\r
+       med_dataready_in <= '0';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+       -- Stay a while... stay forever!!! Muhahaha!!!!\r
+       wait;\r
+       \r
+end process THE_TESTBENCH_PROC;\r
+\r
+\r
+END;\r
diff --git a/src/tb_trb_net_sbuf2.vhd b/src/tb_trb_net_sbuf2.vhd
new file mode 100644 (file)
index 0000000..6684ad5
--- /dev/null
@@ -0,0 +1,119 @@
+LIBRARY ieee;                                                                        \r
+USE ieee.std_logic_1164.ALL;                                                         \r
+USE ieee.numeric_std.ALL;                                                            \r
+                                                                                     \r
+ENTITY testbench IS                                                                  \r
+END testbench;                                                                       \r
+                                                                                     \r
+ARCHITECTURE behavior OF testbench IS                                                \r
+                                                                                     \r
+       COMPONENT trb_net_sbuf2                                                          \r
+       PORT(                                                                            \r
+               CLK : IN std_logic;                                                          \r
+               RESET : IN std_logic;                                                        \r
+               CLK_EN : IN std_logic;                                                       \r
+               COMB_DATAREADY_IN : IN std_logic;                                            \r
+               COMB_READ_IN : IN std_logic;                                                 \r
+               COMB_DATA_IN : IN std_logic_vector(18 downto 0);                             \r
+               SYN_READ_IN : IN std_logic;                                                  \r
+               COMB_NEXT_READ_OUT : OUT std_logic;                                          \r
+               SYN_DATAREADY_OUT : OUT std_logic;                                           \r
+               SYN_DATA_OUT : OUT std_logic_vector(18 downto 0);       \r
+               FIFO_WR_OUT : OUT std_logic;\r
+               FIFO_RD_OUT : OUT std_logic;                     \r
+               STAT_BUFFER : OUT std_logic                                                  \r
+               );                                                                           \r
+       END COMPONENT;                                                                   \r
+                                                                                     \r
+       SIGNAL CLK :  std_logic;                                                         \r
+       SIGNAL RESET :  std_logic;                                                       \r
+       SIGNAL CLK_EN :  std_logic;                                                      \r
+       SIGNAL COMB_DATAREADY_IN :  std_logic;                                           \r
+       SIGNAL COMB_NEXT_READ_OUT :  std_logic;                                          \r
+       SIGNAL COMB_READ_IN :  std_logic;                                                \r
+       SIGNAL COMB_DATA_IN :  std_logic_vector(18 downto 0);                            \r
+       SIGNAL SYN_DATAREADY_OUT :  std_logic;                                           \r
+       SIGNAL SYN_DATA_OUT :  std_logic_vector(18 downto 0);                            \r
+       SIGNAL SYN_READ_IN :  std_logic;                                                 \r
+       signal FIFO_WR_OUT :  std_logic;\r
+       signal FIFO_RD_OUT :  std_logic;                     \r
+       SIGNAL STAT_BUFFER :  std_logic;                                                 \r
+                                                                                     \r
+BEGIN                                                                                \r
+                                                                                     \r
+-- Please check and add your generic clause manually                                 \r
+       uut: trb_net_sbuf2 PORT MAP(                                                     \r
+               CLK => CLK,                                                                  \r
+               RESET => RESET,                                                              \r
+               CLK_EN => CLK_EN,                                                            \r
+               COMB_DATAREADY_IN => COMB_DATAREADY_IN,                                      \r
+               COMB_NEXT_READ_OUT => COMB_NEXT_READ_OUT,                                    \r
+               COMB_READ_IN => COMB_READ_IN,                                                \r
+               COMB_DATA_IN => COMB_DATA_IN,                                                \r
+               SYN_DATAREADY_OUT => SYN_DATAREADY_OUT,                                      \r
+               SYN_DATA_OUT => SYN_DATA_OUT,                                                \r
+               SYN_READ_IN => SYN_READ_IN,\r
+               FIFO_WR_OUT => FIFO_WR_OUT,\r
+               FIFO_RD_OUT => FIFO_RD_OUT,\r
+               STAT_BUFFER => STAT_BUFFER                                                   \r
+       );                                                                               \r
+                                                                                     \r
+CLOCK_GEN_PROC: process\r
+begin\r
+       clk <= '1'; wait for 5.0 ns;\r
+       clk <= '0'; wait for 5.0 ns;\r
+end process CLOCK_GEN_PROC;                                                                                     \r
+                             \r
+THE_TEST_BENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       reset <= '0';\r
+       clk_en <= '1';\r
+       comb_dataready_in <= '0';\r
+       comb_read_in <= '0';\r
+       comb_data_in <= (others => '0');\r
+       syn_read_in <= '0';\r
+\r
+       -- Reset the whole stuff\r
+       wait until rising_edge(clk);\r
+       reset <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       reset <= '0';\r
+       wait until rising_edge(clk);\r
+       \r
+       -- Tests may start now...\r
+       -- see what happens if nothing is in the SBUF\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+       -- now write some data in\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '1'; \r
+       comb_read_in <= '1';\r
+       comb_data_in <= b"100_0000_0000_0000_0000";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0001";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0010";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0011";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0100";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0101";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0110";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"100_0000_0000_0000_0111";\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '0';\r
+       \r
+       -- Stay a while... stay forever! Muhahaha!!!\r
+       wait;\r
+\r
+end process THE_TEST_BENCH_PROC;\r
+                                                        \r
+END;                                                                                 
\ No newline at end of file
diff --git a/src/tb_trb_net_sbuf3.vhd b/src/tb_trb_net_sbuf3.vhd
new file mode 100755 (executable)
index 0000000..5f76c13
--- /dev/null
@@ -0,0 +1,119 @@
+LIBRARY ieee;                                                                        \r
+USE ieee.std_logic_1164.ALL;                                                         \r
+USE ieee.numeric_std.ALL;                                                            \r
+                                                                                     \r
+ENTITY testbench IS                                                                  \r
+END testbench;                                                                       \r
+                                                                                     \r
+ARCHITECTURE behavior OF testbench IS                                                \r
+                                                                                     \r
+       COMPONENT trb_net_sbuf3                                                          \r
+       GENERIC(\r
+               DATA_WIDTH : integer := 18\r
+       );\r
+       PORT(                                                                            \r
+               CLK : IN std_logic;                                                          \r
+               RESET : IN std_logic;                                                        \r
+               CLK_EN : IN std_logic;                                                       \r
+               COMB_DATAREADY_IN : IN std_logic;                                            \r
+               COMB_READ_IN : IN std_logic;                                                 \r
+               COMB_DATA_IN : IN std_logic_vector(17 downto 0);                             \r
+               SYN_READ_IN : IN std_logic;                                                  \r
+               COMB_NEXT_READ_OUT : OUT std_logic;                                          \r
+               SYN_DATAREADY_OUT : OUT std_logic;\r
+               SYN_DATA_OUT : OUT std_logic_vector(17 downto 0);       \r
+               DEBUG_OUT : OUT std_logic_vector(15 downto 0);       \r
+               STAT_BUFFER : OUT std_logic                                                  \r
+               );                                                                           \r
+       END COMPONENT;                                                                   \r
+\r
+       SIGNAL CLK :  std_logic;                                                         \r
+       SIGNAL RESET :  std_logic;                                                       \r
+       SIGNAL CLK_EN :  std_logic;                                                      \r
+       SIGNAL COMB_DATAREADY_IN :  std_logic;                                           \r
+       SIGNAL COMB_NEXT_READ_OUT :  std_logic;                                          \r
+       SIGNAL COMB_READ_IN :  std_logic;                                                \r
+       SIGNAL COMB_DATA_IN :  std_logic_vector(17 downto 0);                            \r
+       SIGNAL SYN_DATAREADY_OUT :  std_logic;                                           \r
+       SIGNAL SYN_DATA_OUT :  std_logic_vector(17 downto 0);                            \r
+       SIGNAL SYN_READ_IN :  std_logic;                                                 \r
+       SIGNAL STAT_BUFFER :  std_logic;                                                 \r
+       SIGNAL DEBUG_OUT :  std_logic_vector(15 downto 0);                            \r
+                                                                                     \r
+BEGIN                                                                                \r
+                                                                                     \r
+-- Please check and add your generic clause manually                                 \r
+       uut: trb_net_sbuf3 PORT MAP(                                                     \r
+               CLK => CLK,                                                                  \r
+               RESET => RESET,                                                              \r
+               CLK_EN => CLK_EN,                                                            \r
+               COMB_DATAREADY_IN => COMB_DATAREADY_IN,                                      \r
+               COMB_NEXT_READ_OUT => COMB_NEXT_READ_OUT,                                    \r
+               COMB_READ_IN => COMB_READ_IN,                                                \r
+               COMB_DATA_IN => COMB_DATA_IN,                                                \r
+               SYN_DATAREADY_OUT => SYN_DATAREADY_OUT,                                      \r
+               SYN_DATA_OUT => SYN_DATA_OUT,                                                \r
+               SYN_READ_IN => SYN_READ_IN,\r
+               DEBUG_OUT => DEBUG_OUT,\r
+               STAT_BUFFER => STAT_BUFFER                                                   \r
+       );                                                                               \r
+                                                                                     \r
+CLOCK_GEN_PROC: process\r
+begin\r
+       clk <= '1'; wait for 5.0 ns;\r
+       clk <= '0'; wait for 5.0 ns;\r
+end process CLOCK_GEN_PROC;                                                                                     \r
+                             \r
+THE_TEST_BENCH_PROC: process\r
+begin\r
+       -- Setup signals\r
+       reset <= '0';\r
+       clk_en <= '1';\r
+       comb_dataready_in <= '0';\r
+       comb_read_in <= '0';\r
+       comb_data_in <= (others => '0');\r
+       syn_read_in <= '0';\r
+\r
+       -- Reset the whole stuff\r
+       wait until rising_edge(clk);\r
+       reset <= '1';\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       reset <= '0';\r
+       wait until rising_edge(clk);\r
+       \r
+       -- Tests may start now...\r
+       -- see what happens if nothing is in the SBUF\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+       wait until rising_edge(clk);\r
+\r
+       -- now write some data in\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '1'; \r
+       comb_read_in <= '1';\r
+       comb_data_in <= b"10_0000_0000_0000_0000";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0001";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0010";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0011";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0100";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0101";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0110";\r
+       wait until rising_edge(clk);\r
+       comb_data_in <= b"10_0000_0000_0000_0111";\r
+       wait until rising_edge(clk);\r
+       comb_dataready_in <= '0';\r
+       \r
+       -- Stay a while... stay forever! Muhahaha!!!\r
+       wait;\r
+\r
+end process THE_TEST_BENCH_PROC;\r
+                                                        \r
+END;                                                                                 
\ No newline at end of file
diff --git a/src/test_fifo.lpc b/src/test_fifo.lpc
new file mode 100755 (executable)
index 0000000..e316e34
--- /dev/null
@@ -0,0 +1,44 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=FIFO\r
+CoreRevision=4.7\r
+ModuleName=test_fifo\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=12/14/2009\r
+Time=14:54:15\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+FIFOImp=EBR Based\r
+Depth=1024\r
+Width=18\r
+regout=0\r
+CtrlByRdEn=0\r
+EmpFlg=0\r
+PeMode=Static - Dual Threshold\r
+PeAssert=10\r
+PeDeassert=12\r
+FullFlg=0\r
+PfMode=Static - Dual Threshold\r
+PfAssert=508\r
+PfDeassert=506\r
+RDataCount=0\r
+EnECC=0\r
diff --git a/src/test_fifo.vhd b/src/test_fifo.vhd
new file mode 100755 (executable)
index 0000000..cc85678
--- /dev/null
@@ -0,0 +1,853 @@
+-- VHDL netlist generated by SCUBA ispLever_v8.0_PROD_Build (41)
+-- Module  Version: 4.7
+--X:\Programme\ispTOOLS_80\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ebfifo -depth 1024 -width 18 -depth 1024 -no_enable -pe -1 -pf -1 -e 
+
+-- Mon Dec 14 14:54:16 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity test_fifo is
+    port (
+        Data: in  std_logic_vector(17 downto 0); 
+        Clock: in  std_logic; 
+        WrEn: in  std_logic; 
+        RdEn: in  std_logic; 
+        Reset: in  std_logic; 
+        Q: out  std_logic_vector(17 downto 0); 
+        Empty: out  std_logic; 
+        Full: out  std_logic);
+end test_fifo;
+
+architecture Structure of test_fifo is
+
+    -- internal signal declarations
+    signal invout_1: std_logic;
+    signal invout_0: std_logic;
+    signal rden_i_inv: std_logic;
+    signal fcnt_en: std_logic;
+    signal empty_i: std_logic;
+    signal empty_d: std_logic;
+    signal full_i: std_logic;
+    signal full_d: std_logic;
+    signal ifcount_0: std_logic;
+    signal ifcount_1: std_logic;
+    signal bdcnt_bctr_ci: std_logic;
+    signal ifcount_2: std_logic;
+    signal ifcount_3: std_logic;
+    signal co0: std_logic;
+    signal ifcount_4: std_logic;
+    signal ifcount_5: std_logic;
+    signal co1: std_logic;
+    signal ifcount_6: std_logic;
+    signal ifcount_7: std_logic;
+    signal co2: std_logic;
+    signal ifcount_8: std_logic;
+    signal ifcount_9: std_logic;
+    signal co3: std_logic;
+    signal ifcount_10: std_logic;
+    signal co5: std_logic;
+    signal cnt_con: std_logic;
+    signal co4: std_logic;
+    signal cmp_ci: std_logic;
+    signal rden_i: std_logic;
+    signal co0_1: std_logic;
+    signal co1_1: std_logic;
+    signal co2_1: std_logic;
+    signal co3_1: std_logic;
+    signal co4_1: std_logic;
+    signal cmp_le_1: std_logic;
+    signal cmp_le_1_c: std_logic;
+    signal cmp_ci_1: std_logic;
+    signal fcount_0: std_logic;
+    signal fcount_1: std_logic;
+    signal co0_2: std_logic;
+    signal fcount_2: std_logic;
+    signal fcount_3: std_logic;
+    signal co1_2: std_logic;
+    signal fcount_4: std_logic;
+    signal fcount_5: std_logic;
+    signal co2_2: std_logic;
+    signal fcount_6: std_logic;
+    signal fcount_7: std_logic;
+    signal co3_2: std_logic;
+    signal wren_i: std_logic;
+    signal fcount_8: std_logic;
+    signal fcount_9: std_logic;
+    signal co4_2: std_logic;
+    signal wren_i_inv: std_logic;
+    signal fcount_10: std_logic;
+    signal cmp_ge_d1: std_logic;
+    signal cmp_ge_d1_c: std_logic;
+    signal iwcount_0: std_logic;
+    signal iwcount_1: std_logic;
+    signal wcount_0: std_logic;
+    signal wcount_1: std_logic;
+    signal w_ctr_ci: std_logic;
+    signal iwcount_2: std_logic;
+    signal iwcount_3: std_logic;
+    signal wcount_2: std_logic;
+    signal wcount_3: std_logic;
+    signal co0_3: std_logic;
+    signal iwcount_4: std_logic;
+    signal iwcount_5: std_logic;
+    signal wcount_4: std_logic;
+    signal wcount_5: std_logic;
+    signal co1_3: std_logic;
+    signal iwcount_6: std_logic;
+    signal iwcount_7: std_logic;
+    signal wcount_6: std_logic;
+    signal wcount_7: std_logic;
+    signal co2_3: std_logic;
+    signal iwcount_8: std_logic;
+    signal iwcount_9: std_logic;
+    signal wcount_8: std_logic;
+    signal wcount_9: std_logic;
+    signal co3_3: std_logic;
+    signal iwcount_10: std_logic;
+    signal co5_1: std_logic;
+    signal wcount_10: std_logic;
+    signal co4_3: std_logic;
+    signal scuba_vhi: std_logic;
+    signal ircount_0: std_logic;
+    signal ircount_1: std_logic;
+    signal rcount_0: std_logic;
+    signal rcount_1: std_logic;
+    signal r_ctr_ci: std_logic;
+    signal ircount_2: std_logic;
+    signal ircount_3: std_logic;
+    signal rcount_2: std_logic;
+    signal rcount_3: std_logic;
+    signal co0_4: std_logic;
+    signal ircount_4: std_logic;
+    signal ircount_5: std_logic;
+    signal rcount_4: std_logic;
+    signal rcount_5: std_logic;
+    signal co1_4: std_logic;
+    signal ircount_6: std_logic;
+    signal ircount_7: std_logic;
+    signal rcount_6: std_logic;
+    signal rcount_7: std_logic;
+    signal co2_4: std_logic;
+    signal ircount_8: std_logic;
+    signal ircount_9: std_logic;
+    signal rcount_8: std_logic;
+    signal rcount_9: std_logic;
+    signal co3_4: std_logic;
+    signal ircount_10: std_logic;
+    signal co5_2: std_logic;
+    signal rcount_10: std_logic;
+    signal scuba_vlo: std_logic;
+    signal co4_4: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component ALEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; LE: out  std_logic);
+    end component;
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component CU2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CO: out  std_logic; NC0: out  std_logic; NC1: out  std_logic);
+    end component;
+    component CB2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CON: in  std_logic; CO: out  std_logic; NC0: out  std_logic; 
+            NC1: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1S3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; PD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component FD1S3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; CD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component XOR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component DP16KB
+    -- synopsys translate_off
+        generic (GSR : in String; WRITEMODE_B : in String; 
+                CSDECODE_B : in std_logic_vector(2 downto 0); 
+                CSDECODE_A : in std_logic_vector(2 downto 0); 
+                WRITEMODE_A : in String; RESETMODE : in String; 
+                REGMODE_B : in String; REGMODE_A : in String; 
+                DATA_WIDTH_B : in Integer; DATA_WIDTH_A : in Integer);
+    -- synopsys translate_on
+        port (DIA0: in  std_logic; DIA1: in  std_logic; 
+            DIA2: in  std_logic; DIA3: in  std_logic; 
+            DIA4: in  std_logic; DIA5: in  std_logic; 
+            DIA6: in  std_logic; DIA7: in  std_logic; 
+            DIA8: in  std_logic; DIA9: in  std_logic; 
+            DIA10: in  std_logic; DIA11: in  std_logic; 
+            DIA12: in  std_logic; DIA13: in  std_logic; 
+            DIA14: in  std_logic; DIA15: in  std_logic; 
+            DIA16: in  std_logic; DIA17: in  std_logic; 
+            ADA0: in  std_logic; ADA1: in  std_logic; 
+            ADA2: in  std_logic; ADA3: in  std_logic; 
+            ADA4: in  std_logic; ADA5: in  std_logic; 
+            ADA6: in  std_logic; ADA7: in  std_logic; 
+            ADA8: in  std_logic; ADA9: in  std_logic; 
+            ADA10: in  std_logic; ADA11: in  std_logic; 
+            ADA12: in  std_logic; ADA13: in  std_logic; 
+            CEA: in  std_logic; CLKA: in  std_logic; WEA: in  std_logic; 
+            CSA0: in  std_logic; CSA1: in  std_logic; 
+            CSA2: in  std_logic; RSTA: in  std_logic; 
+            DIB0: in  std_logic; DIB1: in  std_logic; 
+            DIB2: in  std_logic; DIB3: in  std_logic; 
+            DIB4: in  std_logic; DIB5: in  std_logic; 
+            DIB6: in  std_logic; DIB7: in  std_logic; 
+            DIB8: in  std_logic; DIB9: in  std_logic; 
+            DIB10: in  std_logic; DIB11: in  std_logic; 
+            DIB12: in  std_logic; DIB13: in  std_logic; 
+            DIB14: in  std_logic; DIB15: in  std_logic; 
+            DIB16: in  std_logic; DIB17: in  std_logic; 
+            ADB0: in  std_logic; ADB1: in  std_logic; 
+            ADB2: in  std_logic; ADB3: in  std_logic; 
+            ADB4: in  std_logic; ADB5: in  std_logic; 
+            ADB6: in  std_logic; ADB7: in  std_logic; 
+            ADB8: in  std_logic; ADB9: in  std_logic; 
+            ADB10: in  std_logic; ADB11: in  std_logic; 
+            ADB12: in  std_logic; ADB13: in  std_logic; 
+            CEB: in  std_logic; CLKB: in  std_logic; WEB: in  std_logic; 
+            CSB0: in  std_logic; CSB1: in  std_logic; 
+            CSB2: in  std_logic; RSTB: in  std_logic; 
+            DOA0: out  std_logic; DOA1: out  std_logic; 
+            DOA2: out  std_logic; DOA3: out  std_logic; 
+            DOA4: out  std_logic; DOA5: out  std_logic; 
+            DOA6: out  std_logic; DOA7: out  std_logic; 
+            DOA8: out  std_logic; DOA9: out  std_logic; 
+            DOA10: out  std_logic; DOA11: out  std_logic; 
+            DOA12: out  std_logic; DOA13: out  std_logic; 
+            DOA14: out  std_logic; DOA15: out  std_logic; 
+            DOA16: out  std_logic; DOA17: out  std_logic; 
+            DOB0: out  std_logic; DOB1: out  std_logic; 
+            DOB2: out  std_logic; DOB3: out  std_logic; 
+            DOB4: out  std_logic; DOB5: out  std_logic; 
+            DOB6: out  std_logic; DOB7: out  std_logic; 
+            DOB8: out  std_logic; DOB9: out  std_logic; 
+            DOB10: out  std_logic; DOB11: out  std_logic; 
+            DOB12: out  std_logic; DOB13: out  std_logic; 
+            DOB14: out  std_logic; DOB15: out  std_logic; 
+            DOB16: out  std_logic; DOB17: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_B : string; 
+    attribute CSDECODE_A : string; 
+    attribute WRITEMODE_B : string; 
+    attribute WRITEMODE_A : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE_B : string; 
+    attribute REGMODE_A : string; 
+    attribute DATA_WIDTH_B : string; 
+    attribute DATA_WIDTH_A : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_1 : label is "0x3232";
+    attribute initval of LUT4_0 : label is "0x3232";
+    attribute MEM_LPC_FILE of pdp_ram_0_0_0 : label is "test_fifo.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_0_0 : label is "";
+    attribute CSDECODE_B of pdp_ram_0_0_0 : label is "0b000";
+    attribute CSDECODE_A of pdp_ram_0_0_0 : label is "0b000";
+    attribute WRITEMODE_B of pdp_ram_0_0_0 : label is "NORMAL";
+    attribute WRITEMODE_A of pdp_ram_0_0_0 : label is "NORMAL";
+    attribute GSR of pdp_ram_0_0_0 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_0_0 : label is "ASYNC";
+    attribute REGMODE_B of pdp_ram_0_0_0 : label is "NOREG";
+    attribute REGMODE_A of pdp_ram_0_0_0 : label is "NOREG";
+    attribute DATA_WIDTH_B of pdp_ram_0_0_0 : label is "18";
+    attribute DATA_WIDTH_A of pdp_ram_0_0_0 : label is "18";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    AND2_t3: AND2
+        port map (A=>WrEn, B=>invout_1, Z=>wren_i);
+
+    INV_3: INV
+        port map (A=>full_i, Z=>invout_1);
+
+    AND2_t2: AND2
+        port map (A=>RdEn, B=>invout_0, Z=>rden_i);
+
+    INV_2: INV
+        port map (A=>empty_i, Z=>invout_0);
+
+    AND2_t1: AND2
+        port map (A=>wren_i, B=>rden_i_inv, Z=>cnt_con);
+
+    XOR2_t0: XOR2
+        port map (A=>wren_i, B=>rden_i, Z=>fcnt_en);
+
+    INV_1: INV
+        port map (A=>rden_i, Z=>rden_i_inv);
+
+    INV_0: INV
+        port map (A=>wren_i, Z=>wren_i_inv);
+
+    LUT4_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_le_1, AD1=>wren_i, 
+            AD0=>empty_i, DO0=>empty_d);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x3232")
+        -- synopsys translate_on
+        port map (AD3=>scuba_vlo, AD2=>cmp_ge_d1, AD1=>rden_i, 
+            AD0=>full_i, DO0=>full_d);
+
+    pdp_ram_0_0_0: DP16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_B=> "000", CSDECODE_A=> "000", WRITEMODE_B=> "NORMAL", 
+        WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", RESETMODE=> "ASYNC", 
+        REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=>  18, 
+        DATA_WIDTH_A=>  18)
+        -- synopsys translate_on
+        port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), 
+            DIA3=>Data(3), DIA4=>Data(4), DIA5=>Data(5), DIA6=>Data(6), 
+            DIA7=>Data(7), DIA8=>Data(8), DIA9=>Data(9), DIA10=>Data(10), 
+            DIA11=>Data(11), DIA12=>Data(12), DIA13=>Data(13), 
+            DIA14=>Data(14), DIA15=>Data(15), DIA16=>Data(16), 
+            DIA17=>Data(17), ADA0=>scuba_vhi, ADA1=>scuba_vhi, 
+            ADA2=>scuba_vlo, ADA3=>scuba_vlo, ADA4=>wcount_0, 
+            ADA5=>wcount_1, ADA6=>wcount_2, ADA7=>wcount_3, 
+            ADA8=>wcount_4, ADA9=>wcount_5, ADA10=>wcount_6, 
+            ADA11=>wcount_7, ADA12=>wcount_8, ADA13=>wcount_9, 
+            CEA=>wren_i, CLKA=>Clock, WEA=>scuba_vhi, CSA0=>scuba_vlo, 
+            CSA1=>scuba_vlo, CSA2=>scuba_vlo, RSTA=>Reset, 
+            DIB0=>scuba_vlo, DIB1=>scuba_vlo, DIB2=>scuba_vlo, 
+            DIB3=>scuba_vlo, DIB4=>scuba_vlo, DIB5=>scuba_vlo, 
+            DIB6=>scuba_vlo, DIB7=>scuba_vlo, DIB8=>scuba_vlo, 
+            DIB9=>scuba_vlo, DIB10=>scuba_vlo, DIB11=>scuba_vlo, 
+            DIB12=>scuba_vlo, DIB13=>scuba_vlo, DIB14=>scuba_vlo, 
+            DIB15=>scuba_vlo, DIB16=>scuba_vlo, DIB17=>scuba_vlo, 
+            ADB0=>scuba_vlo, ADB1=>scuba_vlo, ADB2=>scuba_vlo, 
+            ADB3=>scuba_vlo, ADB4=>rcount_0, ADB5=>rcount_1, 
+            ADB6=>rcount_2, ADB7=>rcount_3, ADB8=>rcount_4, 
+            ADB9=>rcount_5, ADB10=>rcount_6, ADB11=>rcount_7, 
+            ADB12=>rcount_8, ADB13=>rcount_9, CEB=>rden_i, CLKB=>Clock, 
+            WEB=>scuba_vlo, CSB0=>scuba_vlo, CSB1=>scuba_vlo, 
+            CSB2=>scuba_vlo, RSTB=>Reset, DOA0=>open, DOA1=>open, 
+            DOA2=>open, DOA3=>open, DOA4=>open, DOA5=>open, DOA6=>open, 
+            DOA7=>open, DOA8=>open, DOA9=>open, DOA10=>open, DOA11=>open, 
+            DOA12=>open, DOA13=>open, DOA14=>open, DOA15=>open, 
+            DOA16=>open, DOA17=>open, DOB0=>Q(0), DOB1=>Q(1), DOB2=>Q(2), 
+            DOB3=>Q(3), DOB4=>Q(4), DOB5=>Q(5), DOB6=>Q(6), DOB7=>Q(7), 
+            DOB8=>Q(8), DOB9=>Q(9), DOB10=>Q(10), DOB11=>Q(11), 
+            DOB12=>Q(12), DOB13=>Q(13), DOB14=>Q(14), DOB15=>Q(15), 
+            DOB16=>Q(16), DOB17=>Q(17));
+
+    FF_34: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_0, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_0);
+
+    FF_33: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_1, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_1);
+
+    FF_32: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_2, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_2);
+
+    FF_31: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_3, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_3);
+
+    FF_30: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_4, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_4);
+
+    FF_29: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_5, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_5);
+
+    FF_28: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_6, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_6);
+
+    FF_27: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_7, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_7);
+
+    FF_26: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_8, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_8);
+
+    FF_25: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_9, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_9);
+
+    FF_24: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ifcount_10, SP=>fcnt_en, CK=>Clock, CD=>Reset, 
+            Q=>fcount_10);
+
+    FF_23: FD1S3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>empty_d, CK=>Clock, PD=>Reset, Q=>empty_i);
+
+    FF_22: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>full_d, CK=>Clock, CD=>Reset, Q=>full_i);
+
+    FF_21: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_0, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_0);
+
+    FF_20: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_1, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_1);
+
+    FF_19: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_2, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_2);
+
+    FF_18: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_3, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_3);
+
+    FF_17: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_4, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_4);
+
+    FF_16: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_5, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_5);
+
+    FF_15: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_6, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_6);
+
+    FF_14: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_7, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_7);
+
+    FF_13: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_8, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_8);
+
+    FF_12: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_9, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_9);
+
+    FF_11: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_10, SP=>wren_i, CK=>Clock, CD=>Reset, 
+            Q=>wcount_10);
+
+    FF_10: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_0, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_0);
+
+    FF_9: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_1, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_1);
+
+    FF_8: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_2, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_2);
+
+    FF_7: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_3, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_3);
+
+    FF_6: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_4, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_4);
+
+    FF_5: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_5, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_5);
+
+    FF_4: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_6, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_6);
+
+    FF_3: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_7, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_7);
+
+    FF_2: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_8, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_8);
+
+    FF_1: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_9, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_9);
+
+    FF_0: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_10, SP=>rden_i, CK=>Clock, CD=>Reset, 
+            Q=>rcount_10);
+
+    bdcnt_bctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>cnt_con, B0=>scuba_vlo, B1=>cnt_con, 
+            CI=>scuba_vlo, COUT=>bdcnt_bctr_ci, S0=>open, S1=>open);
+
+    bdcnt_bctr_0: CB2
+        port map (CI=>bdcnt_bctr_ci, PC0=>fcount_0, PC1=>fcount_1, 
+            CON=>cnt_con, CO=>co0, NC0=>ifcount_0, NC1=>ifcount_1);
+
+    bdcnt_bctr_1: CB2
+        port map (CI=>co0, PC0=>fcount_2, PC1=>fcount_3, CON=>cnt_con, 
+            CO=>co1, NC0=>ifcount_2, NC1=>ifcount_3);
+
+    bdcnt_bctr_2: CB2
+        port map (CI=>co1, PC0=>fcount_4, PC1=>fcount_5, CON=>cnt_con, 
+            CO=>co2, NC0=>ifcount_4, NC1=>ifcount_5);
+
+    bdcnt_bctr_3: CB2
+        port map (CI=>co2, PC0=>fcount_6, PC1=>fcount_7, CON=>cnt_con, 
+            CO=>co3, NC0=>ifcount_6, NC1=>ifcount_7);
+
+    bdcnt_bctr_4: CB2
+        port map (CI=>co3, PC0=>fcount_8, PC1=>fcount_9, CON=>cnt_con, 
+            CO=>co4, NC0=>ifcount_8, NC1=>ifcount_9);
+
+    bdcnt_bctr_5: CB2
+        port map (CI=>co4, PC0=>fcount_10, PC1=>scuba_vlo, CON=>cnt_con, 
+            CO=>co5, NC0=>ifcount_10, NC1=>open);
+
+    e_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, 
+            S1=>open);
+
+    e_cmp_0: ALEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>rden_i, B1=>scuba_vlo, 
+            CI=>cmp_ci, LE=>co0_1);
+
+    e_cmp_1: ALEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co0_1, LE=>co1_1);
+
+    e_cmp_2: ALEB2
+        port map (A0=>fcount_4, A1=>fcount_5, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co1_1, LE=>co2_1);
+
+    e_cmp_3: ALEB2
+        port map (A0=>fcount_6, A1=>fcount_7, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co2_1, LE=>co3_1);
+
+    e_cmp_4: ALEB2
+        port map (A0=>fcount_8, A1=>fcount_9, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co3_1, LE=>co4_1);
+
+    e_cmp_5: ALEB2
+        port map (A0=>fcount_10, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>co4_1, LE=>cmp_le_1_c);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_le_1_c, COUT=>open, S0=>cmp_le_1, 
+            S1=>open);
+
+    g_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vhi, A1=>scuba_vhi, B0=>scuba_vhi, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>cmp_ci_1, S0=>open, 
+            S1=>open);
+
+    g_cmp_0: AGEB2
+        port map (A0=>fcount_0, A1=>fcount_1, B0=>wren_i, B1=>wren_i, 
+            CI=>cmp_ci_1, GE=>co0_2);
+
+    g_cmp_1: AGEB2
+        port map (A0=>fcount_2, A1=>fcount_3, B0=>wren_i, B1=>wren_i, 
+            CI=>co0_2, GE=>co1_2);
+
+    g_cmp_2: AGEB2
+        port map (A0=>fcount_4, A1=>fcount_5, B0=>wren_i, B1=>wren_i, 
+            CI=>co1_2, GE=>co2_2);
+
+    g_cmp_3: AGEB2
+        port map (A0=>fcount_6, A1=>fcount_7, B0=>wren_i, B1=>wren_i, 
+            CI=>co2_2, GE=>co3_2);
+
+    g_cmp_4: AGEB2
+        port map (A0=>fcount_8, A1=>fcount_9, B0=>wren_i, B1=>wren_i, 
+            CI=>co3_2, GE=>co4_2);
+
+    g_cmp_5: AGEB2
+        port map (A0=>fcount_10, A1=>scuba_vlo, B0=>wren_i_inv, 
+            B1=>scuba_vlo, CI=>co4_2, GE=>cmp_ge_d1_c);
+
+    a1: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>cmp_ge_d1_c, COUT=>open, S0=>cmp_ge_d1, 
+            S1=>open);
+
+    w_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>w_ctr_ci, S0=>open, 
+            S1=>open);
+
+    w_ctr_0: CU2
+        port map (CI=>w_ctr_ci, PC0=>wcount_0, PC1=>wcount_1, CO=>co0_3, 
+            NC0=>iwcount_0, NC1=>iwcount_1);
+
+    w_ctr_1: CU2
+        port map (CI=>co0_3, PC0=>wcount_2, PC1=>wcount_3, CO=>co1_3, 
+            NC0=>iwcount_2, NC1=>iwcount_3);
+
+    w_ctr_2: CU2
+        port map (CI=>co1_3, PC0=>wcount_4, PC1=>wcount_5, CO=>co2_3, 
+            NC0=>iwcount_4, NC1=>iwcount_5);
+
+    w_ctr_3: CU2
+        port map (CI=>co2_3, PC0=>wcount_6, PC1=>wcount_7, CO=>co3_3, 
+            NC0=>iwcount_6, NC1=>iwcount_7);
+
+    w_ctr_4: CU2
+        port map (CI=>co3_3, PC0=>wcount_8, PC1=>wcount_9, CO=>co4_3, 
+            NC0=>iwcount_8, NC1=>iwcount_9);
+
+    w_ctr_5: CU2
+        port map (CI=>co4_3, PC0=>wcount_10, PC1=>scuba_vlo, CO=>co5_1, 
+            NC0=>iwcount_10, NC1=>open);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    r_ctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>r_ctr_ci, S0=>open, 
+            S1=>open);
+
+    r_ctr_0: CU2
+        port map (CI=>r_ctr_ci, PC0=>rcount_0, PC1=>rcount_1, CO=>co0_4, 
+            NC0=>ircount_0, NC1=>ircount_1);
+
+    r_ctr_1: CU2
+        port map (CI=>co0_4, PC0=>rcount_2, PC1=>rcount_3, CO=>co1_4, 
+            NC0=>ircount_2, NC1=>ircount_3);
+
+    r_ctr_2: CU2
+        port map (CI=>co1_4, PC0=>rcount_4, PC1=>rcount_5, CO=>co2_4, 
+            NC0=>ircount_4, NC1=>ircount_5);
+
+    r_ctr_3: CU2
+        port map (CI=>co2_4, PC0=>rcount_6, PC1=>rcount_7, CO=>co3_4, 
+            NC0=>ircount_6, NC1=>ircount_7);
+
+    r_ctr_4: CU2
+        port map (CI=>co3_4, PC0=>rcount_8, PC1=>rcount_9, CO=>co4_4, 
+            NC0=>ircount_8, NC1=>ircount_9);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    r_ctr_5: CU2
+        port map (CI=>co4_4, PC0=>rcount_10, PC1=>scuba_vlo, CO=>co5_2, 
+            NC0=>ircount_10, NC1=>open);
+
+    Empty <= empty_i;
+    Full <= full_i;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of test_fifo is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:ALEB2 use entity ecp2m.ALEB2(V); end for;
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:CU2 use entity ecp2m.CU2(V); end for;
+        for all:CB2 use entity ecp2m.CB2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:FD1S3BX use entity ecp2m.FD1S3BX(V); end for;
+        for all:FD1S3DX use entity ecp2m.FD1S3DX(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:XOR2 use entity ecp2m.XOR2(V); end for;
+        for all:DP16KB use entity ecp2m.DP16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/test_fifo_tmpl.vhd b/src/test_fifo_tmpl.vhd
new file mode 100755 (executable)
index 0000000..aada74f
--- /dev/null
@@ -0,0 +1,16 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v8.0_PROD_Build (41)
+-- Module  Version: 4.7
+-- Mon Dec 14 14:54:16 2009
+
+-- parameterized module component declaration
+component test_fifo
+    port (Data: in  std_logic_vector(17 downto 0); Clock: in  std_logic; 
+        WrEn: in  std_logic; RdEn: in  std_logic; Reset: in  std_logic; 
+        Q: out  std_logic_vector(17 downto 0); Empty: out  std_logic; 
+        Full: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : test_fifo
+    port map (Data(17 downto 0)=>__, Clock=>__, WrEn=>__, RdEn=>__, 
+        Reset=>__, Q(17 downto 0)=>__, Empty=>__, Full=>__);
diff --git a/src/testfifo.lpc b/src/testfifo.lpc
new file mode 100644 (file)
index 0000000..01bf25a
--- /dev/null
@@ -0,0 +1,47 @@
+[Device]\r
+Family=latticeecp2m\r
+PartType=LFE2M100E\r
+PartName=LFE2M100E-6F900C\r
+SpeedGrade=-6\r
+Package=FPBGA900\r
+OperatingCondition=COM\r
+Status=P\r
+\r
+[IP]\r
+VendorName=Lattice Semiconductor Corporation\r
+CoreType=LPM\r
+CoreStatus=Demo\r
+CoreName=FIFO_DC\r
+CoreRevision=5.2\r
+ModuleName=testfifo\r
+SourceFormat=VHDL\r
+ParameterFileVersion=1.0\r
+Date=11/18/2009\r
+Time=17:17:38\r
+\r
+[Parameters]\r
+Verilog=0\r
+VHDL=1\r
+EDIF=1\r
+Destination=Synplicity\r
+Expression=BusA(0 to 7)\r
+Order=Big Endian [MSB:LSB]\r
+IO=0\r
+FIFOImp=EBR Based\r
+Depth=256\r
+Width=96\r
+RDepth=256\r
+RWidth=96\r
+regout=0\r
+CtrlByRdEn=0\r
+EmpFlg=0\r
+PeMode=Static - Dual Threshold\r
+PeAssert=10\r
+PeDeassert=12\r
+FullFlg=0\r
+PfMode=Static - Dual Threshold\r
+PfAssert=508\r
+PfDeassert=506\r
+RDataCount=0\r
+WDataCount=0\r
+EnECC=0\r
diff --git a/src/testfifo.vhd b/src/testfifo.vhd
new file mode 100644 (file)
index 0000000..a30d87a
--- /dev/null
@@ -0,0 +1,1584 @@
+-- VHDL netlist generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 5.2
+--X:\Programme\ispTOOLS_72\ispfpga\bin\nt\scuba.exe -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5m00 -type ebfifo -depth 256 -width 96 -depth 256 -rdata_width 96 -no_enable -pe -1 -pf -1 -e 
+
+-- Wed Nov 18 17:17:38 2009
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- synopsys translate_off
+library ecp2m;
+use ecp2m.components.all;
+-- synopsys translate_on
+
+entity testfifo is
+    port (
+        Data: in  std_logic_vector(95 downto 0); 
+        WrClock: in  std_logic; 
+        RdClock: in  std_logic; 
+        WrEn: in  std_logic; 
+        RdEn: in  std_logic; 
+        Reset: in  std_logic; 
+        RPReset: in  std_logic; 
+        Q: out  std_logic_vector(95 downto 0); 
+        Empty: out  std_logic; 
+        Full: out  std_logic);
+end testfifo;
+
+architecture Structure of testfifo is
+
+    -- internal signal declarations
+    signal invout_1: std_logic;
+    signal invout_0: std_logic;
+    signal w_g2b_xor_cluster_1: std_logic;
+    signal r_g2b_xor_cluster_1: std_logic;
+    signal w_gdata_0: std_logic;
+    signal w_gdata_1: std_logic;
+    signal w_gdata_2: std_logic;
+    signal w_gdata_3: std_logic;
+    signal w_gdata_4: std_logic;
+    signal w_gdata_5: std_logic;
+    signal w_gdata_6: std_logic;
+    signal w_gdata_7: std_logic;
+    signal wptr_0: std_logic;
+    signal wptr_1: std_logic;
+    signal wptr_2: std_logic;
+    signal wptr_3: std_logic;
+    signal wptr_4: std_logic;
+    signal wptr_5: std_logic;
+    signal wptr_6: std_logic;
+    signal wptr_7: std_logic;
+    signal wptr_8: std_logic;
+    signal r_gdata_0: std_logic;
+    signal r_gdata_1: std_logic;
+    signal r_gdata_2: std_logic;
+    signal r_gdata_3: std_logic;
+    signal r_gdata_4: std_logic;
+    signal r_gdata_5: std_logic;
+    signal r_gdata_6: std_logic;
+    signal r_gdata_7: std_logic;
+    signal rptr_0: std_logic;
+    signal rptr_1: std_logic;
+    signal rptr_2: std_logic;
+    signal rptr_3: std_logic;
+    signal rptr_4: std_logic;
+    signal rptr_5: std_logic;
+    signal rptr_6: std_logic;
+    signal rptr_7: std_logic;
+    signal rptr_8: std_logic;
+    signal w_gcount_0: std_logic;
+    signal w_gcount_1: std_logic;
+    signal w_gcount_2: std_logic;
+    signal w_gcount_3: std_logic;
+    signal w_gcount_4: std_logic;
+    signal w_gcount_5: std_logic;
+    signal w_gcount_6: std_logic;
+    signal w_gcount_7: std_logic;
+    signal w_gcount_8: std_logic;
+    signal r_gcount_0: std_logic;
+    signal r_gcount_1: std_logic;
+    signal r_gcount_2: std_logic;
+    signal r_gcount_3: std_logic;
+    signal r_gcount_4: std_logic;
+    signal r_gcount_5: std_logic;
+    signal r_gcount_6: std_logic;
+    signal r_gcount_7: std_logic;
+    signal r_gcount_8: std_logic;
+    signal w_gcount_r20: std_logic;
+    signal w_gcount_r0: std_logic;
+    signal w_gcount_r21: std_logic;
+    signal w_gcount_r1: std_logic;
+    signal w_gcount_r22: std_logic;
+    signal w_gcount_r2: std_logic;
+    signal w_gcount_r23: std_logic;
+    signal w_gcount_r3: std_logic;
+    signal w_gcount_r24: std_logic;
+    signal w_gcount_r4: std_logic;
+    signal w_gcount_r25: std_logic;
+    signal w_gcount_r5: std_logic;
+    signal w_gcount_r26: std_logic;
+    signal w_gcount_r6: std_logic;
+    signal w_gcount_r27: std_logic;
+    signal w_gcount_r7: std_logic;
+    signal w_gcount_r28: std_logic;
+    signal w_gcount_r8: std_logic;
+    signal r_gcount_w20: std_logic;
+    signal r_gcount_w0: std_logic;
+    signal r_gcount_w21: std_logic;
+    signal r_gcount_w1: std_logic;
+    signal r_gcount_w22: std_logic;
+    signal r_gcount_w2: std_logic;
+    signal r_gcount_w23: std_logic;
+    signal r_gcount_w3: std_logic;
+    signal r_gcount_w24: std_logic;
+    signal r_gcount_w4: std_logic;
+    signal r_gcount_w25: std_logic;
+    signal r_gcount_w5: std_logic;
+    signal r_gcount_w26: std_logic;
+    signal r_gcount_w6: std_logic;
+    signal r_gcount_w27: std_logic;
+    signal r_gcount_w7: std_logic;
+    signal r_gcount_w28: std_logic;
+    signal r_gcount_w8: std_logic;
+    signal empty_i: std_logic;
+    signal rRst: std_logic;
+    signal full_i: std_logic;
+    signal iwcount_0: std_logic;
+    signal iwcount_1: std_logic;
+    signal w_gctr_ci: std_logic;
+    signal iwcount_2: std_logic;
+    signal iwcount_3: std_logic;
+    signal co0: std_logic;
+    signal iwcount_4: std_logic;
+    signal iwcount_5: std_logic;
+    signal co1: std_logic;
+    signal iwcount_6: std_logic;
+    signal iwcount_7: std_logic;
+    signal co2: std_logic;
+    signal iwcount_8: std_logic;
+    signal co4: std_logic;
+    signal wcount_8: std_logic;
+    signal co3: std_logic;
+    signal scuba_vhi: std_logic;
+    signal ircount_0: std_logic;
+    signal ircount_1: std_logic;
+    signal r_gctr_ci: std_logic;
+    signal ircount_2: std_logic;
+    signal ircount_3: std_logic;
+    signal co0_1: std_logic;
+    signal ircount_4: std_logic;
+    signal ircount_5: std_logic;
+    signal co1_1: std_logic;
+    signal ircount_6: std_logic;
+    signal ircount_7: std_logic;
+    signal co2_1: std_logic;
+    signal ircount_8: std_logic;
+    signal co4_1: std_logic;
+    signal rcount_8: std_logic;
+    signal co3_1: std_logic;
+    signal rden_i: std_logic;
+    signal cmp_ci: std_logic;
+    signal wcount_r0: std_logic;
+    signal wcount_r1: std_logic;
+    signal rcount_0: std_logic;
+    signal rcount_1: std_logic;
+    signal co0_2: std_logic;
+    signal wcount_r2: std_logic;
+    signal wcount_r3: std_logic;
+    signal rcount_2: std_logic;
+    signal rcount_3: std_logic;
+    signal co1_2: std_logic;
+    signal wcount_r4: std_logic;
+    signal w_g2b_xor_cluster_0: std_logic;
+    signal rcount_4: std_logic;
+    signal rcount_5: std_logic;
+    signal co2_2: std_logic;
+    signal wcount_r6: std_logic;
+    signal wcount_r7: std_logic;
+    signal rcount_6: std_logic;
+    signal rcount_7: std_logic;
+    signal co3_2: std_logic;
+    signal empty_cmp_clr: std_logic;
+    signal empty_cmp_set: std_logic;
+    signal empty_d: std_logic;
+    signal empty_d_c: std_logic;
+    signal wren_i: std_logic;
+    signal cmp_ci_1: std_logic;
+    signal rcount_w0: std_logic;
+    signal rcount_w1: std_logic;
+    signal wcount_0: std_logic;
+    signal wcount_1: std_logic;
+    signal co0_3: std_logic;
+    signal rcount_w2: std_logic;
+    signal rcount_w3: std_logic;
+    signal wcount_2: std_logic;
+    signal wcount_3: std_logic;
+    signal co1_3: std_logic;
+    signal rcount_w4: std_logic;
+    signal r_g2b_xor_cluster_0: std_logic;
+    signal wcount_4: std_logic;
+    signal wcount_5: std_logic;
+    signal co2_3: std_logic;
+    signal rcount_w6: std_logic;
+    signal rcount_w7: std_logic;
+    signal wcount_6: std_logic;
+    signal wcount_7: std_logic;
+    signal co3_3: std_logic;
+    signal full_cmp_clr: std_logic;
+    signal full_cmp_set: std_logic;
+    signal full_d: std_logic;
+    signal full_d_c: std_logic;
+    signal scuba_vlo: std_logic;
+
+    -- local component declarations
+    component AGEB2
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; GE: out  std_logic);
+    end component;
+    component AND2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component CU2
+        port (CI: in  std_logic; PC0: in  std_logic; PC1: in  std_logic; 
+            CO: out  std_logic; NC0: out  std_logic; NC1: out  std_logic);
+    end component;
+    component FADD2B
+        port (A0: in  std_logic; A1: in  std_logic; B0: in  std_logic; 
+            B1: in  std_logic; CI: in  std_logic; COUT: out  std_logic; 
+            S0: out  std_logic; S1: out  std_logic);
+    end component;
+    component FD1P3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            PD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1P3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; SP: in  std_logic; CK: in  std_logic; 
+            CD: in  std_logic; Q: out  std_logic);
+    end component;
+    component FD1S3BX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; PD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component FD1S3DX
+    -- synopsys translate_off
+        generic (GSR : in String);
+    -- synopsys translate_on
+        port (D: in  std_logic; CK: in  std_logic; CD: in  std_logic; 
+            Q: out  std_logic);
+    end component;
+    component INV
+        port (A: in  std_logic; Z: out  std_logic);
+    end component;
+    component OR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component ROM16X1
+    -- synopsys translate_off
+        generic (initval : in String);
+    -- synopsys translate_on
+        port (AD3: in  std_logic; AD2: in  std_logic; AD1: in  std_logic; 
+            AD0: in  std_logic; DO0: out  std_logic);
+    end component;
+    component VHI
+        port (Z: out  std_logic);
+    end component;
+    component VLO
+        port (Z: out  std_logic);
+    end component;
+    component XOR2
+        port (A: in  std_logic; B: in  std_logic; Z: out  std_logic);
+    end component;
+    component PDPW16KB
+    -- synopsys translate_off
+        generic (CSDECODE_R : in std_logic_vector(2 downto 0); 
+                CSDECODE_W : in std_logic_vector(2 downto 0); 
+                GSR : in String; RESETMODE : in String; 
+                REGMODE : in String; DATA_WIDTH_R : in Integer; 
+                DATA_WIDTH_W : in Integer);
+    -- synopsys translate_on
+        port (DI0: in  std_logic; DI1: in  std_logic; DI2: in  std_logic; 
+            DI3: in  std_logic; DI4: in  std_logic; DI5: in  std_logic; 
+            DI6: in  std_logic; DI7: in  std_logic; DI8: in  std_logic; 
+            DI9: in  std_logic; DI10: in  std_logic; DI11: in  std_logic; 
+            DI12: in  std_logic; DI13: in  std_logic; 
+            DI14: in  std_logic; DI15: in  std_logic; 
+            DI16: in  std_logic; DI17: in  std_logic; 
+            DI18: in  std_logic; DI19: in  std_logic; 
+            DI20: in  std_logic; DI21: in  std_logic; 
+            DI22: in  std_logic; DI23: in  std_logic; 
+            DI24: in  std_logic; DI25: in  std_logic; 
+            DI26: in  std_logic; DI27: in  std_logic; 
+            DI28: in  std_logic; DI29: in  std_logic; 
+            DI30: in  std_logic; DI31: in  std_logic; 
+            DI32: in  std_logic; DI33: in  std_logic; 
+            DI34: in  std_logic; DI35: in  std_logic; 
+            ADW0: in  std_logic; ADW1: in  std_logic; 
+            ADW2: in  std_logic; ADW3: in  std_logic; 
+            ADW4: in  std_logic; ADW5: in  std_logic; 
+            ADW6: in  std_logic; ADW7: in  std_logic; 
+            ADW8: in  std_logic; BE0: in  std_logic; BE1: in  std_logic; 
+            BE2: in  std_logic; BE3: in  std_logic; CEW: in  std_logic; 
+            CLKW: in  std_logic; CSW0: in  std_logic; 
+            CSW1: in  std_logic; CSW2: in  std_logic; 
+            ADR0: in  std_logic; ADR1: in  std_logic; 
+            ADR2: in  std_logic; ADR3: in  std_logic; 
+            ADR4: in  std_logic; ADR5: in  std_logic; 
+            ADR6: in  std_logic; ADR7: in  std_logic; 
+            ADR8: in  std_logic; ADR9: in  std_logic; 
+            ADR10: in  std_logic; ADR11: in  std_logic; 
+            ADR12: in  std_logic; ADR13: in  std_logic; 
+            CER: in  std_logic; CLKR: in  std_logic; CSR0: in  std_logic; 
+            CSR1: in  std_logic; CSR2: in  std_logic; RST: in  std_logic; 
+            DO0: out  std_logic; DO1: out  std_logic; 
+            DO2: out  std_logic; DO3: out  std_logic; 
+            DO4: out  std_logic; DO5: out  std_logic; 
+            DO6: out  std_logic; DO7: out  std_logic; 
+            DO8: out  std_logic; DO9: out  std_logic; 
+            DO10: out  std_logic; DO11: out  std_logic; 
+            DO12: out  std_logic; DO13: out  std_logic; 
+            DO14: out  std_logic; DO15: out  std_logic; 
+            DO16: out  std_logic; DO17: out  std_logic; 
+            DO18: out  std_logic; DO19: out  std_logic; 
+            DO20: out  std_logic; DO21: out  std_logic; 
+            DO22: out  std_logic; DO23: out  std_logic; 
+            DO24: out  std_logic; DO25: out  std_logic; 
+            DO26: out  std_logic; DO27: out  std_logic; 
+            DO28: out  std_logic; DO29: out  std_logic; 
+            DO30: out  std_logic; DO31: out  std_logic; 
+            DO32: out  std_logic; DO33: out  std_logic; 
+            DO34: out  std_logic; DO35: out  std_logic);
+    end component;
+    attribute initval : string; 
+    attribute MEM_LPC_FILE : string; 
+    attribute MEM_INIT_FILE : string; 
+    attribute CSDECODE_R : string; 
+    attribute CSDECODE_W : string; 
+    attribute RESETMODE : string; 
+    attribute REGMODE : string; 
+    attribute DATA_WIDTH_R : string; 
+    attribute DATA_WIDTH_W : string; 
+    attribute GSR : string; 
+    attribute initval of LUT4_21 : label is "0x6996";
+    attribute initval of LUT4_20 : label is "0x6996";
+    attribute initval of LUT4_19 : label is "0x6996";
+    attribute initval of LUT4_18 : label is "0x6996";
+    attribute initval of LUT4_17 : label is "0x6996";
+    attribute initval of LUT4_16 : label is "0x6996";
+    attribute initval of LUT4_15 : label is "0x6996";
+    attribute initval of LUT4_14 : label is "0x6996";
+    attribute initval of LUT4_13 : label is "0x6996";
+    attribute initval of LUT4_12 : label is "0x6996";
+    attribute initval of LUT4_11 : label is "0x6996";
+    attribute initval of LUT4_10 : label is "0x6996";
+    attribute initval of LUT4_9 : label is "0x6996";
+    attribute initval of LUT4_8 : label is "0x6996";
+    attribute initval of LUT4_7 : label is "0x6996";
+    attribute initval of LUT4_6 : label is "0x6996";
+    attribute initval of LUT4_5 : label is "0x6996";
+    attribute initval of LUT4_4 : label is "0x6996";
+    attribute initval of LUT4_3 : label is "0x0410";
+    attribute initval of LUT4_2 : label is "0x1004";
+    attribute initval of LUT4_1 : label is "0x0140";
+    attribute initval of LUT4_0 : label is "0x4001";
+    attribute MEM_LPC_FILE of pdp_ram_0_0_2 : label is "testfifo.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_0_2 : label is "";
+    attribute CSDECODE_R of pdp_ram_0_0_2 : label is "0b000";
+    attribute CSDECODE_W of pdp_ram_0_0_2 : label is "0b001";
+    attribute GSR of pdp_ram_0_0_2 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_0_2 : label is "ASYNC";
+    attribute REGMODE of pdp_ram_0_0_2 : label is "NOREG";
+    attribute DATA_WIDTH_R of pdp_ram_0_0_2 : label is "36";
+    attribute DATA_WIDTH_W of pdp_ram_0_0_2 : label is "36";
+    attribute MEM_LPC_FILE of pdp_ram_0_1_1 : label is "testfifo.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_1_1 : label is "";
+    attribute CSDECODE_R of pdp_ram_0_1_1 : label is "0b000";
+    attribute CSDECODE_W of pdp_ram_0_1_1 : label is "0b001";
+    attribute GSR of pdp_ram_0_1_1 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_1_1 : label is "ASYNC";
+    attribute REGMODE of pdp_ram_0_1_1 : label is "NOREG";
+    attribute DATA_WIDTH_R of pdp_ram_0_1_1 : label is "36";
+    attribute DATA_WIDTH_W of pdp_ram_0_1_1 : label is "36";
+    attribute MEM_LPC_FILE of pdp_ram_0_2_0 : label is "testfifo.lpc";
+    attribute MEM_INIT_FILE of pdp_ram_0_2_0 : label is "";
+    attribute CSDECODE_R of pdp_ram_0_2_0 : label is "0b000";
+    attribute CSDECODE_W of pdp_ram_0_2_0 : label is "0b001";
+    attribute GSR of pdp_ram_0_2_0 : label is "DISABLED";
+    attribute RESETMODE of pdp_ram_0_2_0 : label is "ASYNC";
+    attribute REGMODE of pdp_ram_0_2_0 : label is "NOREG";
+    attribute DATA_WIDTH_R of pdp_ram_0_2_0 : label is "36";
+    attribute DATA_WIDTH_W of pdp_ram_0_2_0 : label is "36";
+    attribute GSR of FF_91 : label is "ENABLED";
+    attribute GSR of FF_90 : label is "ENABLED";
+    attribute GSR of FF_89 : label is "ENABLED";
+    attribute GSR of FF_88 : label is "ENABLED";
+    attribute GSR of FF_87 : label is "ENABLED";
+    attribute GSR of FF_86 : label is "ENABLED";
+    attribute GSR of FF_85 : label is "ENABLED";
+    attribute GSR of FF_84 : label is "ENABLED";
+    attribute GSR of FF_83 : label is "ENABLED";
+    attribute GSR of FF_82 : label is "ENABLED";
+    attribute GSR of FF_81 : label is "ENABLED";
+    attribute GSR of FF_80 : label is "ENABLED";
+    attribute GSR of FF_79 : label is "ENABLED";
+    attribute GSR of FF_78 : label is "ENABLED";
+    attribute GSR of FF_77 : label is "ENABLED";
+    attribute GSR of FF_76 : label is "ENABLED";
+    attribute GSR of FF_75 : label is "ENABLED";
+    attribute GSR of FF_74 : label is "ENABLED";
+    attribute GSR of FF_73 : label is "ENABLED";
+    attribute GSR of FF_72 : label is "ENABLED";
+    attribute GSR of FF_71 : label is "ENABLED";
+    attribute GSR of FF_70 : label is "ENABLED";
+    attribute GSR of FF_69 : label is "ENABLED";
+    attribute GSR of FF_68 : label is "ENABLED";
+    attribute GSR of FF_67 : label is "ENABLED";
+    attribute GSR of FF_66 : label is "ENABLED";
+    attribute GSR of FF_65 : label is "ENABLED";
+    attribute GSR of FF_64 : label is "ENABLED";
+    attribute GSR of FF_63 : label is "ENABLED";
+    attribute GSR of FF_62 : label is "ENABLED";
+    attribute GSR of FF_61 : label is "ENABLED";
+    attribute GSR of FF_60 : label is "ENABLED";
+    attribute GSR of FF_59 : label is "ENABLED";
+    attribute GSR of FF_58 : label is "ENABLED";
+    attribute GSR of FF_57 : label is "ENABLED";
+    attribute GSR of FF_56 : label is "ENABLED";
+    attribute GSR of FF_55 : label is "ENABLED";
+    attribute GSR of FF_54 : label is "ENABLED";
+    attribute GSR of FF_53 : label is "ENABLED";
+    attribute GSR of FF_52 : label is "ENABLED";
+    attribute GSR of FF_51 : label is "ENABLED";
+    attribute GSR of FF_50 : label is "ENABLED";
+    attribute GSR of FF_49 : label is "ENABLED";
+    attribute GSR of FF_48 : label is "ENABLED";
+    attribute GSR of FF_47 : label is "ENABLED";
+    attribute GSR of FF_46 : label is "ENABLED";
+    attribute GSR of FF_45 : label is "ENABLED";
+    attribute GSR of FF_44 : label is "ENABLED";
+    attribute GSR of FF_43 : label is "ENABLED";
+    attribute GSR of FF_42 : label is "ENABLED";
+    attribute GSR of FF_41 : label is "ENABLED";
+    attribute GSR of FF_40 : label is "ENABLED";
+    attribute GSR of FF_39 : label is "ENABLED";
+    attribute GSR of FF_38 : label is "ENABLED";
+    attribute GSR of FF_37 : label is "ENABLED";
+    attribute GSR of FF_36 : label is "ENABLED";
+    attribute GSR of FF_35 : label is "ENABLED";
+    attribute GSR of FF_34 : label is "ENABLED";
+    attribute GSR of FF_33 : label is "ENABLED";
+    attribute GSR of FF_32 : label is "ENABLED";
+    attribute GSR of FF_31 : label is "ENABLED";
+    attribute GSR of FF_30 : label is "ENABLED";
+    attribute GSR of FF_29 : label is "ENABLED";
+    attribute GSR of FF_28 : label is "ENABLED";
+    attribute GSR of FF_27 : label is "ENABLED";
+    attribute GSR of FF_26 : label is "ENABLED";
+    attribute GSR of FF_25 : label is "ENABLED";
+    attribute GSR of FF_24 : label is "ENABLED";
+    attribute GSR of FF_23 : label is "ENABLED";
+    attribute GSR of FF_22 : label is "ENABLED";
+    attribute GSR of FF_21 : label is "ENABLED";
+    attribute GSR of FF_20 : label is "ENABLED";
+    attribute GSR of FF_19 : label is "ENABLED";
+    attribute GSR of FF_18 : label is "ENABLED";
+    attribute GSR of FF_17 : label is "ENABLED";
+    attribute GSR of FF_16 : label is "ENABLED";
+    attribute GSR of FF_15 : label is "ENABLED";
+    attribute GSR of FF_14 : label is "ENABLED";
+    attribute GSR of FF_13 : label is "ENABLED";
+    attribute GSR of FF_12 : label is "ENABLED";
+    attribute GSR of FF_11 : label is "ENABLED";
+    attribute GSR of FF_10 : label is "ENABLED";
+    attribute GSR of FF_9 : label is "ENABLED";
+    attribute GSR of FF_8 : label is "ENABLED";
+    attribute GSR of FF_7 : label is "ENABLED";
+    attribute GSR of FF_6 : label is "ENABLED";
+    attribute GSR of FF_5 : label is "ENABLED";
+    attribute GSR of FF_4 : label is "ENABLED";
+    attribute GSR of FF_3 : label is "ENABLED";
+    attribute GSR of FF_2 : label is "ENABLED";
+    attribute GSR of FF_1 : label is "ENABLED";
+    attribute GSR of FF_0 : label is "ENABLED";
+    attribute syn_keep : boolean;
+
+begin
+    -- component instantiation statements
+    AND2_t18: AND2
+        port map (A=>WrEn, B=>invout_1, Z=>wren_i);
+
+    INV_1: INV
+        port map (A=>full_i, Z=>invout_1);
+
+    AND2_t17: AND2
+        port map (A=>RdEn, B=>invout_0, Z=>rden_i);
+
+    INV_0: INV
+        port map (A=>empty_i, Z=>invout_0);
+
+    OR2_t16: OR2
+        port map (A=>Reset, B=>RPReset, Z=>rRst);
+
+    XOR2_t15: XOR2
+        port map (A=>wcount_0, B=>wcount_1, Z=>w_gdata_0);
+
+    XOR2_t14: XOR2
+        port map (A=>wcount_1, B=>wcount_2, Z=>w_gdata_1);
+
+    XOR2_t13: XOR2
+        port map (A=>wcount_2, B=>wcount_3, Z=>w_gdata_2);
+
+    XOR2_t12: XOR2
+        port map (A=>wcount_3, B=>wcount_4, Z=>w_gdata_3);
+
+    XOR2_t11: XOR2
+        port map (A=>wcount_4, B=>wcount_5, Z=>w_gdata_4);
+
+    XOR2_t10: XOR2
+        port map (A=>wcount_5, B=>wcount_6, Z=>w_gdata_5);
+
+    XOR2_t9: XOR2
+        port map (A=>wcount_6, B=>wcount_7, Z=>w_gdata_6);
+
+    XOR2_t8: XOR2
+        port map (A=>wcount_7, B=>wcount_8, Z=>w_gdata_7);
+
+    XOR2_t7: XOR2
+        port map (A=>rcount_0, B=>rcount_1, Z=>r_gdata_0);
+
+    XOR2_t6: XOR2
+        port map (A=>rcount_1, B=>rcount_2, Z=>r_gdata_1);
+
+    XOR2_t5: XOR2
+        port map (A=>rcount_2, B=>rcount_3, Z=>r_gdata_2);
+
+    XOR2_t4: XOR2
+        port map (A=>rcount_3, B=>rcount_4, Z=>r_gdata_3);
+
+    XOR2_t3: XOR2
+        port map (A=>rcount_4, B=>rcount_5, Z=>r_gdata_4);
+
+    XOR2_t2: XOR2
+        port map (A=>rcount_5, B=>rcount_6, Z=>r_gdata_5);
+
+    XOR2_t1: XOR2
+        port map (A=>rcount_6, B=>rcount_7, Z=>r_gdata_6);
+
+    XOR2_t0: XOR2
+        port map (A=>rcount_7, B=>rcount_8, Z=>r_gdata_7);
+
+    LUT4_21: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r25, AD2=>w_gcount_r26, 
+            AD1=>w_gcount_r27, AD0=>w_gcount_r28, 
+            DO0=>w_g2b_xor_cluster_0);
+
+    LUT4_20: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r21, AD2=>w_gcount_r22, 
+            AD1=>w_gcount_r23, AD0=>w_gcount_r24, 
+            DO0=>w_g2b_xor_cluster_1);
+
+    LUT4_19: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r27, AD2=>w_gcount_r28, AD1=>scuba_vlo, 
+            AD0=>scuba_vlo, DO0=>wcount_r7);
+
+    LUT4_18: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r26, AD2=>w_gcount_r27, 
+            AD1=>w_gcount_r28, AD0=>scuba_vlo, DO0=>wcount_r6);
+
+    LUT4_17: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r24, AD2=>w_gcount_r25, 
+            AD1=>w_gcount_r26, AD0=>wcount_r7, DO0=>wcount_r4);
+
+    LUT4_16: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r23, AD2=>w_gcount_r24, 
+            AD1=>w_gcount_r25, AD0=>wcount_r6, DO0=>wcount_r3);
+
+    LUT4_15: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_gcount_r22, AD2=>w_gcount_r23, 
+            AD1=>w_gcount_r24, AD0=>w_g2b_xor_cluster_0, DO0=>wcount_r2);
+
+    LUT4_14: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, 
+            AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>wcount_r1);
+
+    LUT4_13: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, 
+            AD1=>w_gcount_r20, AD0=>scuba_vlo, DO0=>wcount_r0);
+
+    LUT4_12: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w25, AD2=>r_gcount_w26, 
+            AD1=>r_gcount_w27, AD0=>r_gcount_w28, 
+            DO0=>r_g2b_xor_cluster_0);
+
+    LUT4_11: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w21, AD2=>r_gcount_w22, 
+            AD1=>r_gcount_w23, AD0=>r_gcount_w24, 
+            DO0=>r_g2b_xor_cluster_1);
+
+    LUT4_10: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w27, AD2=>r_gcount_w28, AD1=>scuba_vlo, 
+            AD0=>scuba_vlo, DO0=>rcount_w7);
+
+    LUT4_9: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w26, AD2=>r_gcount_w27, 
+            AD1=>r_gcount_w28, AD0=>scuba_vlo, DO0=>rcount_w6);
+
+    LUT4_8: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w24, AD2=>r_gcount_w25, 
+            AD1=>r_gcount_w26, AD0=>rcount_w7, DO0=>rcount_w4);
+
+    LUT4_7: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w23, AD2=>r_gcount_w24, 
+            AD1=>r_gcount_w25, AD0=>rcount_w6, DO0=>rcount_w3);
+
+    LUT4_6: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_gcount_w22, AD2=>r_gcount_w23, 
+            AD1=>r_gcount_w24, AD0=>r_g2b_xor_cluster_0, DO0=>rcount_w2);
+
+    LUT4_5: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, 
+            AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>rcount_w1);
+
+    LUT4_4: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x6996")
+        -- synopsys translate_on
+        port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, 
+            AD1=>r_gcount_w20, AD0=>scuba_vlo, DO0=>rcount_w0);
+
+    LUT4_3: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x0410")
+        -- synopsys translate_on
+        port map (AD3=>rptr_8, AD2=>rcount_8, AD1=>w_gcount_r28, 
+            AD0=>scuba_vlo, DO0=>empty_cmp_set);
+
+    LUT4_2: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x1004")
+        -- synopsys translate_on
+        port map (AD3=>rptr_8, AD2=>rcount_8, AD1=>w_gcount_r28, 
+            AD0=>scuba_vlo, DO0=>empty_cmp_clr);
+
+    LUT4_1: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x0140")
+        -- synopsys translate_on
+        port map (AD3=>wptr_8, AD2=>wcount_8, AD1=>r_gcount_w28, 
+            AD0=>scuba_vlo, DO0=>full_cmp_set);
+
+    LUT4_0: ROM16X1
+        -- synopsys translate_off
+        generic map (initval=> "0x4001")
+        -- synopsys translate_on
+        port map (AD3=>wptr_8, AD2=>wcount_8, AD1=>r_gcount_w28, 
+            AD0=>scuba_vlo, DO0=>full_cmp_clr);
+
+    pdp_ram_0_0_2: PDPW16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_R=> "000", CSDECODE_W=> "001", GSR=> "DISABLED", 
+        RESETMODE=> "ASYNC", REGMODE=> "NOREG", DATA_WIDTH_R=>  36, 
+        DATA_WIDTH_W=>  36)
+        -- synopsys translate_on
+        port map (DI0=>Data(0), DI1=>Data(1), DI2=>Data(2), DI3=>Data(3), 
+            DI4=>Data(4), DI5=>Data(5), DI6=>Data(6), DI7=>Data(7), 
+            DI8=>Data(8), DI9=>Data(9), DI10=>Data(10), DI11=>Data(11), 
+            DI12=>Data(12), DI13=>Data(13), DI14=>Data(14), 
+            DI15=>Data(15), DI16=>Data(16), DI17=>Data(17), 
+            DI18=>Data(18), DI19=>Data(19), DI20=>Data(20), 
+            DI21=>Data(21), DI22=>Data(22), DI23=>Data(23), 
+            DI24=>Data(24), DI25=>Data(25), DI26=>Data(26), 
+            DI27=>Data(27), DI28=>Data(28), DI29=>Data(29), 
+            DI30=>Data(30), DI31=>Data(31), DI32=>Data(32), 
+            DI33=>Data(33), DI34=>Data(34), DI35=>Data(35), ADW0=>wptr_0, 
+            ADW1=>wptr_1, ADW2=>wptr_2, ADW3=>wptr_3, ADW4=>wptr_4, 
+            ADW5=>wptr_5, ADW6=>wptr_6, ADW7=>wptr_7, ADW8=>scuba_vlo, 
+            BE0=>scuba_vhi, BE1=>scuba_vhi, BE2=>scuba_vhi, 
+            BE3=>scuba_vhi, CEW=>wren_i, CLKW=>WrClock, CSW0=>scuba_vhi, 
+            CSW1=>scuba_vlo, CSW2=>scuba_vlo, ADR0=>scuba_vlo, 
+            ADR1=>scuba_vlo, ADR2=>scuba_vlo, ADR3=>scuba_vlo, 
+            ADR4=>scuba_vlo, ADR5=>rptr_0, ADR6=>rptr_1, ADR7=>rptr_2, 
+            ADR8=>rptr_3, ADR9=>rptr_4, ADR10=>rptr_5, ADR11=>rptr_6, 
+            ADR12=>rptr_7, ADR13=>scuba_vlo, CER=>rden_i, CLKR=>RdClock, 
+            CSR0=>scuba_vlo, CSR1=>scuba_vlo, CSR2=>scuba_vlo, 
+            RST=>Reset, DO0=>Q(18), DO1=>Q(19), DO2=>Q(20), DO3=>Q(21), 
+            DO4=>Q(22), DO5=>Q(23), DO6=>Q(24), DO7=>Q(25), DO8=>Q(26), 
+            DO9=>Q(27), DO10=>Q(28), DO11=>Q(29), DO12=>Q(30), 
+            DO13=>Q(31), DO14=>Q(32), DO15=>Q(33), DO16=>Q(34), 
+            DO17=>Q(35), DO18=>Q(0), DO19=>Q(1), DO20=>Q(2), DO21=>Q(3), 
+            DO22=>Q(4), DO23=>Q(5), DO24=>Q(6), DO25=>Q(7), DO26=>Q(8), 
+            DO27=>Q(9), DO28=>Q(10), DO29=>Q(11), DO30=>Q(12), 
+            DO31=>Q(13), DO32=>Q(14), DO33=>Q(15), DO34=>Q(16), 
+            DO35=>Q(17));
+
+    pdp_ram_0_1_1: PDPW16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_R=> "000", CSDECODE_W=> "001", GSR=> "DISABLED", 
+        RESETMODE=> "ASYNC", REGMODE=> "NOREG", DATA_WIDTH_R=>  36, 
+        DATA_WIDTH_W=>  36)
+        -- synopsys translate_on
+        port map (DI0=>Data(36), DI1=>Data(37), DI2=>Data(38), 
+            DI3=>Data(39), DI4=>Data(40), DI5=>Data(41), DI6=>Data(42), 
+            DI7=>Data(43), DI8=>Data(44), DI9=>Data(45), DI10=>Data(46), 
+            DI11=>Data(47), DI12=>Data(48), DI13=>Data(49), 
+            DI14=>Data(50), DI15=>Data(51), DI16=>Data(52), 
+            DI17=>Data(53), DI18=>Data(54), DI19=>Data(55), 
+            DI20=>Data(56), DI21=>Data(57), DI22=>Data(58), 
+            DI23=>Data(59), DI24=>Data(60), DI25=>Data(61), 
+            DI26=>Data(62), DI27=>Data(63), DI28=>Data(64), 
+            DI29=>Data(65), DI30=>Data(66), DI31=>Data(67), 
+            DI32=>Data(68), DI33=>Data(69), DI34=>Data(70), 
+            DI35=>Data(71), ADW0=>wptr_0, ADW1=>wptr_1, ADW2=>wptr_2, 
+            ADW3=>wptr_3, ADW4=>wptr_4, ADW5=>wptr_5, ADW6=>wptr_6, 
+            ADW7=>wptr_7, ADW8=>scuba_vlo, BE0=>scuba_vhi, 
+            BE1=>scuba_vhi, BE2=>scuba_vhi, BE3=>scuba_vhi, CEW=>wren_i, 
+            CLKW=>WrClock, CSW0=>scuba_vhi, CSW1=>scuba_vlo, 
+            CSW2=>scuba_vlo, ADR0=>scuba_vlo, ADR1=>scuba_vlo, 
+            ADR2=>scuba_vlo, ADR3=>scuba_vlo, ADR4=>scuba_vlo, 
+            ADR5=>rptr_0, ADR6=>rptr_1, ADR7=>rptr_2, ADR8=>rptr_3, 
+            ADR9=>rptr_4, ADR10=>rptr_5, ADR11=>rptr_6, ADR12=>rptr_7, 
+            ADR13=>scuba_vlo, CER=>rden_i, CLKR=>RdClock, 
+            CSR0=>scuba_vlo, CSR1=>scuba_vlo, CSR2=>scuba_vlo, 
+            RST=>Reset, DO0=>Q(54), DO1=>Q(55), DO2=>Q(56), DO3=>Q(57), 
+            DO4=>Q(58), DO5=>Q(59), DO6=>Q(60), DO7=>Q(61), DO8=>Q(62), 
+            DO9=>Q(63), DO10=>Q(64), DO11=>Q(65), DO12=>Q(66), 
+            DO13=>Q(67), DO14=>Q(68), DO15=>Q(69), DO16=>Q(70), 
+            DO17=>Q(71), DO18=>Q(36), DO19=>Q(37), DO20=>Q(38), 
+            DO21=>Q(39), DO22=>Q(40), DO23=>Q(41), DO24=>Q(42), 
+            DO25=>Q(43), DO26=>Q(44), DO27=>Q(45), DO28=>Q(46), 
+            DO29=>Q(47), DO30=>Q(48), DO31=>Q(49), DO32=>Q(50), 
+            DO33=>Q(51), DO34=>Q(52), DO35=>Q(53));
+
+    pdp_ram_0_2_0: PDPW16KB
+        -- synopsys translate_off
+        generic map (CSDECODE_R=> "000", CSDECODE_W=> "001", GSR=> "DISABLED", 
+        RESETMODE=> "ASYNC", REGMODE=> "NOREG", DATA_WIDTH_R=>  36, 
+        DATA_WIDTH_W=>  36)
+        -- synopsys translate_on
+        port map (DI0=>Data(72), DI1=>Data(73), DI2=>Data(74), 
+            DI3=>Data(75), DI4=>Data(76), DI5=>Data(77), DI6=>Data(78), 
+            DI7=>Data(79), DI8=>Data(80), DI9=>Data(81), DI10=>Data(82), 
+            DI11=>Data(83), DI12=>Data(84), DI13=>Data(85), 
+            DI14=>Data(86), DI15=>Data(87), DI16=>Data(88), 
+            DI17=>Data(89), DI18=>Data(90), DI19=>Data(91), 
+            DI20=>Data(92), DI21=>Data(93), DI22=>Data(94), 
+            DI23=>Data(95), DI24=>scuba_vlo, DI25=>scuba_vlo, 
+            DI26=>scuba_vlo, DI27=>scuba_vlo, DI28=>scuba_vlo, 
+            DI29=>scuba_vlo, DI30=>scuba_vlo, DI31=>scuba_vlo, 
+            DI32=>scuba_vlo, DI33=>scuba_vlo, DI34=>scuba_vlo, 
+            DI35=>scuba_vlo, ADW0=>wptr_0, ADW1=>wptr_1, ADW2=>wptr_2, 
+            ADW3=>wptr_3, ADW4=>wptr_4, ADW5=>wptr_5, ADW6=>wptr_6, 
+            ADW7=>wptr_7, ADW8=>scuba_vlo, BE0=>scuba_vhi, 
+            BE1=>scuba_vhi, BE2=>scuba_vhi, BE3=>scuba_vhi, CEW=>wren_i, 
+            CLKW=>WrClock, CSW0=>scuba_vhi, CSW1=>scuba_vlo, 
+            CSW2=>scuba_vlo, ADR0=>scuba_vlo, ADR1=>scuba_vlo, 
+            ADR2=>scuba_vlo, ADR3=>scuba_vlo, ADR4=>scuba_vlo, 
+            ADR5=>rptr_0, ADR6=>rptr_1, ADR7=>rptr_2, ADR8=>rptr_3, 
+            ADR9=>rptr_4, ADR10=>rptr_5, ADR11=>rptr_6, ADR12=>rptr_7, 
+            ADR13=>scuba_vlo, CER=>rden_i, CLKR=>RdClock, 
+            CSR0=>scuba_vlo, CSR1=>scuba_vlo, CSR2=>scuba_vlo, 
+            RST=>Reset, DO0=>Q(90), DO1=>Q(91), DO2=>Q(92), DO3=>Q(93), 
+            DO4=>Q(94), DO5=>Q(95), DO6=>open, DO7=>open, DO8=>open, 
+            DO9=>open, DO10=>open, DO11=>open, DO12=>open, DO13=>open, 
+            DO14=>open, DO15=>open, DO16=>open, DO17=>open, DO18=>Q(72), 
+            DO19=>Q(73), DO20=>Q(74), DO21=>Q(75), DO22=>Q(76), 
+            DO23=>Q(77), DO24=>Q(78), DO25=>Q(79), DO26=>Q(80), 
+            DO27=>Q(81), DO28=>Q(82), DO29=>Q(83), DO30=>Q(84), 
+            DO31=>Q(85), DO32=>Q(86), DO33=>Q(87), DO34=>Q(88), 
+            DO35=>Q(89));
+
+    FF_91: FD1P3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_0, SP=>wren_i, CK=>WrClock, PD=>Reset, 
+            Q=>wcount_0);
+
+    FF_90: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_1);
+
+    FF_89: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_2);
+
+    FF_88: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_3);
+
+    FF_87: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_4);
+
+    FF_86: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_5);
+
+    FF_85: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_6);
+
+    FF_84: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_7);
+
+    FF_83: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>iwcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wcount_8);
+
+    FF_82: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_0, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_0);
+
+    FF_81: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_1);
+
+    FF_80: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_2);
+
+    FF_79: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_3);
+
+    FF_78: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_4);
+
+    FF_77: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_5, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_5);
+
+    FF_76: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_6, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_6);
+
+    FF_75: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gdata_7, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_7);
+
+    FF_74: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>w_gcount_8);
+
+    FF_73: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_0, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_0);
+
+    FF_72: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_1);
+
+    FF_71: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_2);
+
+    FF_70: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_3);
+
+    FF_69: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_4);
+
+    FF_68: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_5);
+
+    FF_67: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_6);
+
+    FF_66: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_7);
+
+    FF_65: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>wcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, 
+            Q=>wptr_8);
+
+    FF_64: FD1P3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_0, SP=>rden_i, CK=>RdClock, PD=>rRst, 
+            Q=>rcount_0);
+
+    FF_63: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_1);
+
+    FF_62: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_2);
+
+    FF_61: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_3);
+
+    FF_60: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_4);
+
+    FF_59: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_5);
+
+    FF_58: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_6);
+
+    FF_57: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_7);
+
+    FF_56: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>ircount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rcount_8);
+
+    FF_55: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_0, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_0);
+
+    FF_54: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_1);
+
+    FF_53: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_2);
+
+    FF_52: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_3);
+
+    FF_51: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_4);
+
+    FF_50: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_5, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_5);
+
+    FF_49: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_6, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_6);
+
+    FF_48: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gdata_7, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_7);
+
+    FF_47: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>r_gcount_8);
+
+    FF_46: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_0, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_0);
+
+    FF_45: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_1);
+
+    FF_44: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_2);
+
+    FF_43: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_3);
+
+    FF_42: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_4);
+
+    FF_41: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_5);
+
+    FF_40: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_6);
+
+    FF_39: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_7);
+
+    FF_38: FD1P3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>rcount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, 
+            Q=>rptr_8);
+
+    FF_37: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_0, CK=>RdClock, CD=>Reset, Q=>w_gcount_r0);
+
+    FF_36: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_1, CK=>RdClock, CD=>Reset, Q=>w_gcount_r1);
+
+    FF_35: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_2, CK=>RdClock, CD=>Reset, Q=>w_gcount_r2);
+
+    FF_34: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_3, CK=>RdClock, CD=>Reset, Q=>w_gcount_r3);
+
+    FF_33: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_4, CK=>RdClock, CD=>Reset, Q=>w_gcount_r4);
+
+    FF_32: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_5, CK=>RdClock, CD=>Reset, Q=>w_gcount_r5);
+
+    FF_31: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_6, CK=>RdClock, CD=>Reset, Q=>w_gcount_r6);
+
+    FF_30: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_7, CK=>RdClock, CD=>Reset, Q=>w_gcount_r7);
+
+    FF_29: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_8, CK=>RdClock, CD=>Reset, Q=>w_gcount_r8);
+
+    FF_28: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w0);
+
+    FF_27: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w1);
+
+    FF_26: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w2);
+
+    FF_25: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w3);
+
+    FF_24: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w4);
+
+    FF_23: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w5);
+
+    FF_22: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w6);
+
+    FF_21: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w7);
+
+    FF_20: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w8);
+
+    FF_19: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r0, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r20);
+
+    FF_18: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r1, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r21);
+
+    FF_17: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r2, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r22);
+
+    FF_16: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r3, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r23);
+
+    FF_15: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r4, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r24);
+
+    FF_14: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r5, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r25);
+
+    FF_13: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r6, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r26);
+
+    FF_12: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r7, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r27);
+
+    FF_11: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>w_gcount_r8, CK=>RdClock, CD=>Reset, 
+            Q=>w_gcount_r28);
+
+    FF_10: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w20);
+
+    FF_9: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w21);
+
+    FF_8: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w22);
+
+    FF_7: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w23);
+
+    FF_6: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w24);
+
+    FF_5: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w25);
+
+    FF_4: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w26);
+
+    FF_3: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w27);
+
+    FF_2: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>r_gcount_w8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w28);
+
+    FF_1: FD1S3BX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>empty_d, CK=>RdClock, PD=>rRst, Q=>empty_i);
+
+    FF_0: FD1S3DX
+        -- synopsys translate_off
+        generic map (GSR=> "ENABLED")
+        -- synopsys translate_on
+        port map (D=>full_d, CK=>WrClock, CD=>Reset, Q=>full_i);
+
+    w_gctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>w_gctr_ci, S0=>open, 
+            S1=>open);
+
+    w_gctr_0: CU2
+        port map (CI=>w_gctr_ci, PC0=>wcount_0, PC1=>wcount_1, CO=>co0, 
+            NC0=>iwcount_0, NC1=>iwcount_1);
+
+    w_gctr_1: CU2
+        port map (CI=>co0, PC0=>wcount_2, PC1=>wcount_3, CO=>co1, 
+            NC0=>iwcount_2, NC1=>iwcount_3);
+
+    w_gctr_2: CU2
+        port map (CI=>co1, PC0=>wcount_4, PC1=>wcount_5, CO=>co2, 
+            NC0=>iwcount_4, NC1=>iwcount_5);
+
+    w_gctr_3: CU2
+        port map (CI=>co2, PC0=>wcount_6, PC1=>wcount_7, CO=>co3, 
+            NC0=>iwcount_6, NC1=>iwcount_7);
+
+    w_gctr_4: CU2
+        port map (CI=>co3, PC0=>wcount_8, PC1=>scuba_vlo, CO=>co4, 
+            NC0=>iwcount_8, NC1=>open);
+
+    scuba_vhi_inst: VHI
+        port map (Z=>scuba_vhi);
+
+    r_gctr_cia: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vhi, B0=>scuba_vlo, 
+            B1=>scuba_vhi, CI=>scuba_vlo, COUT=>r_gctr_ci, S0=>open, 
+            S1=>open);
+
+    r_gctr_0: CU2
+        port map (CI=>r_gctr_ci, PC0=>rcount_0, PC1=>rcount_1, CO=>co0_1, 
+            NC0=>ircount_0, NC1=>ircount_1);
+
+    r_gctr_1: CU2
+        port map (CI=>co0_1, PC0=>rcount_2, PC1=>rcount_3, CO=>co1_1, 
+            NC0=>ircount_2, NC1=>ircount_3);
+
+    r_gctr_2: CU2
+        port map (CI=>co1_1, PC0=>rcount_4, PC1=>rcount_5, CO=>co2_1, 
+            NC0=>ircount_4, NC1=>ircount_5);
+
+    r_gctr_3: CU2
+        port map (CI=>co2_1, PC0=>rcount_6, PC1=>rcount_7, CO=>co3_1, 
+            NC0=>ircount_6, NC1=>ircount_7);
+
+    r_gctr_4: CU2
+        port map (CI=>co3_1, PC0=>rcount_8, PC1=>scuba_vlo, CO=>co4_1, 
+            NC0=>ircount_8, NC1=>open);
+
+    empty_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vlo, A1=>rden_i, B0=>scuba_vlo, B1=>rden_i, 
+            CI=>scuba_vlo, COUT=>cmp_ci, S0=>open, S1=>open);
+
+    empty_cmp_0: AGEB2
+        port map (A0=>rcount_0, A1=>rcount_1, B0=>wcount_r0, 
+            B1=>wcount_r1, CI=>cmp_ci, GE=>co0_2);
+
+    empty_cmp_1: AGEB2
+        port map (A0=>rcount_2, A1=>rcount_3, B0=>wcount_r2, 
+            B1=>wcount_r3, CI=>co0_2, GE=>co1_2);
+
+    empty_cmp_2: AGEB2
+        port map (A0=>rcount_4, A1=>rcount_5, B0=>wcount_r4, 
+            B1=>w_g2b_xor_cluster_0, CI=>co1_2, GE=>co2_2);
+
+    empty_cmp_3: AGEB2
+        port map (A0=>rcount_6, A1=>rcount_7, B0=>wcount_r6, 
+            B1=>wcount_r7, CI=>co2_2, GE=>co3_2);
+
+    empty_cmp_4: AGEB2
+        port map (A0=>empty_cmp_set, A1=>scuba_vlo, B0=>empty_cmp_clr, 
+            B1=>scuba_vlo, CI=>co3_2, GE=>empty_d_c);
+
+    a0: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>empty_d_c, COUT=>open, S0=>empty_d, 
+            S1=>open);
+
+    full_cmp_ci_a: FADD2B
+        port map (A0=>scuba_vlo, A1=>wren_i, B0=>scuba_vlo, B1=>wren_i, 
+            CI=>scuba_vlo, COUT=>cmp_ci_1, S0=>open, S1=>open);
+
+    full_cmp_0: AGEB2
+        port map (A0=>wcount_0, A1=>wcount_1, B0=>rcount_w0, 
+            B1=>rcount_w1, CI=>cmp_ci_1, GE=>co0_3);
+
+    full_cmp_1: AGEB2
+        port map (A0=>wcount_2, A1=>wcount_3, B0=>rcount_w2, 
+            B1=>rcount_w3, CI=>co0_3, GE=>co1_3);
+
+    full_cmp_2: AGEB2
+        port map (A0=>wcount_4, A1=>wcount_5, B0=>rcount_w4, 
+            B1=>r_g2b_xor_cluster_0, CI=>co1_3, GE=>co2_3);
+
+    full_cmp_3: AGEB2
+        port map (A0=>wcount_6, A1=>wcount_7, B0=>rcount_w6, 
+            B1=>rcount_w7, CI=>co2_3, GE=>co3_3);
+
+    full_cmp_4: AGEB2
+        port map (A0=>full_cmp_set, A1=>scuba_vlo, B0=>full_cmp_clr, 
+            B1=>scuba_vlo, CI=>co3_3, GE=>full_d_c);
+
+    scuba_vlo_inst: VLO
+        port map (Z=>scuba_vlo);
+
+    a1: FADD2B
+        port map (A0=>scuba_vlo, A1=>scuba_vlo, B0=>scuba_vlo, 
+            B1=>scuba_vlo, CI=>full_d_c, COUT=>open, S0=>full_d, 
+            S1=>open);
+
+    Empty <= empty_i;
+    Full <= full_i;
+end Structure;
+
+-- synopsys translate_off
+library ecp2m;
+configuration Structure_CON of testfifo is
+    for Structure
+        for all:AGEB2 use entity ecp2m.AGEB2(V); end for;
+        for all:AND2 use entity ecp2m.AND2(V); end for;
+        for all:CU2 use entity ecp2m.CU2(V); end for;
+        for all:FADD2B use entity ecp2m.FADD2B(V); end for;
+        for all:FD1P3BX use entity ecp2m.FD1P3BX(V); end for;
+        for all:FD1P3DX use entity ecp2m.FD1P3DX(V); end for;
+        for all:FD1S3BX use entity ecp2m.FD1S3BX(V); end for;
+        for all:FD1S3DX use entity ecp2m.FD1S3DX(V); end for;
+        for all:INV use entity ecp2m.INV(V); end for;
+        for all:OR2 use entity ecp2m.OR2(V); end for;
+        for all:ROM16X1 use entity ecp2m.ROM16X1(V); end for;
+        for all:VHI use entity ecp2m.VHI(V); end for;
+        for all:VLO use entity ecp2m.VLO(V); end for;
+        for all:XOR2 use entity ecp2m.XOR2(V); end for;
+        for all:PDPW16KB use entity ecp2m.PDPW16KB(V); end for;
+    end for;
+end Structure_CON;
+
+-- synopsys translate_on
diff --git a/src/testfifo_tmpl.vhd b/src/testfifo_tmpl.vhd
new file mode 100644 (file)
index 0000000..c802148
--- /dev/null
@@ -0,0 +1,18 @@
+-- VHDL module instantiation generated by SCUBA ispLever_v72_SP2_Build (23)
+-- Module  Version: 5.2
+-- Wed Nov 18 17:17:38 2009
+
+-- parameterized module component declaration
+component testfifo
+    port (Data: in  std_logic_vector(95 downto 0); 
+        WrClock: in  std_logic; RdClock: in  std_logic; 
+        WrEn: in  std_logic; RdEn: in  std_logic; Reset: in  std_logic; 
+        RPReset: in  std_logic; Q: out  std_logic_vector(95 downto 0); 
+        Empty: out  std_logic; Full: out  std_logic);
+end component;
+
+-- parameterized module component instance
+__ : testfifo
+    port map (Data(95 downto 0)=>__, WrClock=>__, RdClock=>__, WrEn=>__, 
+        RdEn=>__, Reset=>__, RPReset=>__, Q(95 downto 0)=>__, Empty=>__, 
+        Full=>__);
diff --git a/src/trb_net_sbuf2.vhd b/src/trb_net_sbuf2.vhd
new file mode 100644 (file)
index 0000000..cfe04f8
--- /dev/null
@@ -0,0 +1,129 @@
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_ARITH.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+--library work;
+--use work.trb_net_std.all;
+
+entity trb_net_sbuf2 is
+       generic( DATA_WIDTH     : integer := 19;
+                        VERSION        : integer := 0
+                  );
+       port( CLK                                       : in    std_logic;
+                 RESET                                 : in    std_logic;
+                 CLK_EN                                : in    std_logic;
+                 -- connections to data source A
+                 COMB_DATAREADY_IN             : in    std_logic;
+                 COMB_NEXT_READ_OUT    : out   std_logic;
+                 COMB_READ_IN                  : in    std_logic;
+                 COMB_DATA_IN                  : in    std_logic_vector (DATA_WIDTH-1 downto 0);
+                 -- connections to data sink B
+                 SYN_DATAREADY_OUT             : out   std_logic;
+                 SYN_DATA_OUT                  : out   std_logic_vector (DATA_WIDTH-1 downto 0);
+                 SYN_READ_IN                   : in    std_logic;
+                 -- status signals
+                 FIFO_WR_OUT                   : out   std_logic;
+                 FIFO_RD_OUT                   : out   std_logic;
+                 STAT_BUFFER                   : out   std_logic
+                );
+end trb_net_sbuf2;
+
+architecture trb_net_sbuf_arch of trb_net_sbuf2 is
+
+       component fifo_sbuf is
+       port( Data                      : in    std_logic_vector(18 downto 0);
+                 Clock                 : in    std_logic;
+                 WrEn                  : in    std_logic;
+                 RdEn                  : in    std_logic;
+                 Reset                 : in    std_logic;
+                 Q                             : out   std_logic_vector(18 downto 0);
+                 Empty                 : out   std_logic;
+                 Full                  : out   std_logic;
+                 AlmostFull    : out   std_logic
+               );
+       end component;
+
+       signal fifo_data_in                     : std_logic_vector(18 downto 0);
+       signal fifo_data_out            : std_logic_vector(18 downto 0);
+       signal reg_fifo_data_out        : std_logic_vector(18 downto 0);
+       signal fifo_wr_en                       : std_logic;
+       signal fifo_rd_en                       : std_logic;
+       signal fifo_empty                       : std_logic;
+       signal fifo_full                        : std_logic;
+       signal fifo_almost_full         : std_logic;
+       signal fifo_read_before         : std_logic;
+       signal next_last_fifo_read      : std_logic;
+       signal last_fifo_read           : std_logic;
+       signal comb_next_read           : std_logic;
+
+begin
+
+-- write to fifo if fifo is not full and data is available
+fifo_data_in    <= comb_data_in;
+fifo_wr_en      <= comb_dataready_in and comb_read_in and not fifo_full;
+comb_next_read  <= not fifo_almost_full;
+
+-- fifo read signal
+--fifo_rd_en      <= syn_read_in or not fifo_read_before;
+fifo_rd_en      <= syn_read_in or (not next_last_fifo_read and not fifo_read_before);
+
+-- the fifo
+THE_BUFFER : fifo_sbuf
+port map( Data                 => fifo_data_in,
+                 Clock                 => clk,
+                 WrEn                  => fifo_wr_en,
+                 RdEn                  => fifo_rd_en,
+                 Reset                 => reset,
+                 Q                             => fifo_data_out,
+                 Empty                 => fifo_empty,
+                 Full                  => fifo_full,
+                 AlmostFull    => fifo_almost_full
+                );
+
+-- is data on output valid?
+PROC_DETECT_VALID_READS : process( clk )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( reset = '1' ) then
+                       fifo_read_before <= '0';
+               elsif( clk_en = '1' ) then
+                       if   ( next_last_fifo_read = '1' ) then
+                               fifo_read_before <= '1';
+                       elsif( syn_read_in = '1' ) then
+                               fifo_read_before <= '0';
+                       end if;
+               end if;
+       end if;
+end process PROC_DETECT_VALID_READS;
+
+-- keep track of fifo read operations
+PROC_LAST_FIFO_READ : process( clk )
+begin
+       if( rising_edge(clk) ) then
+               next_last_fifo_read <= fifo_rd_en and not fifo_empty;
+               last_fifo_read      <= next_last_fifo_read and not RESET;
+       end if;
+end process PROC_LAST_FIFO_READ;
+
+-- register on fifo outputs
+PROC_SYNC_FIFO_OUTPUTS: process( clk )
+begin
+       if( rising_edge(clk) )then
+               if( next_last_fifo_read = '1' ) then
+                       reg_fifo_data_out <= fifo_data_out;
+               end if;
+       end if;
+end process PROC_SYNC_FIFO_OUTPUTS;
+
+-- connect to outputs
+syn_dataready_out   <= fifo_read_before;
+syn_data_out        <= reg_fifo_data_out;
+comb_next_read_out  <= comb_next_read;
+
+fifo_wr_out         <= fifo_wr_en;
+fifo_rd_out                    <= fifo_rd_en;
+
+stat_buffer         <= fifo_full;
+
+end architecture;
\ No newline at end of file
diff --git a/src/trb_net_sbuf3.vhd b/src/trb_net_sbuf3.vhd
new file mode 100755 (executable)
index 0000000..0936bd3
--- /dev/null
@@ -0,0 +1,213 @@
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.STD_LOGIC_ARITH.ALL;
+USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+library work;
+use work.trb_net_std.all;
+
+entity trb_net_sbuf3 is
+       generic( DATA_WIDTH : integer := 18 );  
+       port( --  Misc
+                 CLK                                   : in    std_logic;
+                 RESET                                 : in    std_logic;
+                 CLK_EN                                : in    std_logic;
+                 --  port to combinatorial logic
+                 COMB_DATAREADY_IN             : in    std_logic;  --comb logic provides data word
+                 COMB_next_READ_OUT    : out   std_logic;  --sbuf can read in NEXT cycle
+                 COMB_READ_IN                  : in    std_logic;  --comb logic IS reading
+                 -- the COMB_next_READ_OUT should be connected via comb. logic to a register
+                 -- to provide COMB_READ_IN (feedback path with 1 cycle delay)
+                 COMB_DATA_IN                  : in    std_logic_vector(DATA_WIDTH-1 downto 0); -- Data word
+                 -- Port to synchronous output.
+                 SYN_DATAREADY_OUT             : out   std_logic;
+                 SYN_DATA_OUT                  : out   std_logic_vector(DATA_WIDTH-1 downto 0); -- Data word
+                 SYN_READ_IN                   : in    std_logic;
+                 -- Status and control port
+                 DEBUG_OUT                             : out   std_logic_vector(15 downto 0);
+                 STAT_BUFFER                   : out   std_logic
+               );
+end entity;
+
+architecture trb_net_sbuf3_arch of trb_net_sbuf3 is
+
+signal current_b0_buffer : std_logic_vector (DATA_WIDTH-1 downto 0);
+signal current_b1_buffer : std_logic_vector (DATA_WIDTH-1 downto 0);
+signal current_b2_buffer : std_logic_vector (DATA_WIDTH-1 downto 0);
+
+signal next_next_READ_OUT                      : std_logic;
+signal current_next_READ_OUT           : std_logic;
+signal next_SYN_DATAREADY_OUT          : std_logic;
+signal current_SYN_DATAREADY_OUT       : std_logic;
+
+type BUFFER_STATE is (BUFFER_EMPTY, BUFFER_B2_FULL, BUFFER_B1_FULL,BUFFER_B0_FULL);
+signal current_buffer_state                    : BUFFER_STATE;
+signal next_buffer_state                       : BUFFER_STATE;
+signal current_buffer_state_int                : std_logic_vector(1 downto 0);
+
+signal current_got_overflow                    : std_logic;
+signal next_got_overflow                       : std_logic;
+signal combined_COMB_DATAREADY_IN      : std_logic;
+
+signal move_b1_b2                                      : std_logic;
+signal move_b0_b1                                      : std_logic;
+
+signal load_b2                                         : std_logic;
+signal load_b1                                         : std_logic;
+signal load_b0                                         : std_logic;
+
+signal debug                                           : std_logic_vector(15 downto 0);
+
+attribute syn_preserve : boolean;
+attribute syn_keep : boolean;
+attribute syn_preserve of current_SYN_DATAREADY_OUT : signal is true;
+attribute syn_keep of current_SYN_DATAREADY_OUT : signal is true;
+attribute syn_preserve of current_next_READ_OUT : signal is true;
+attribute syn_keep of current_next_READ_OUT : signal is true;
+attribute syn_hier : string;
+attribute syn_hier of trb_net_sbuf3_arch : architecture is "flatten, firm";
+
+
+begin
+
+SYN_DATA_OUT           <= current_b2_buffer;
+SYN_DATAREADY_OUT      <= current_SYN_DATAREADY_OUT;
+COMB_next_READ_OUT     <= current_next_READ_OUT;
+
+STAT_BUFFER                    <= current_got_overflow;
+
+combined_COMB_DATAREADY_IN <= (COMB_DATAREADY_IN and COMB_READ_IN);
+
+THE_FSM: process(current_buffer_state, SYN_READ_IN,
+                                current_SYN_DATAREADY_OUT, current_got_overflow,
+                                combined_COMB_DATAREADY_IN)
+begin  -- process COMB
+       next_buffer_state      <= current_buffer_state;
+       next_next_READ_OUT     <= '1';
+       load_b0                <= '0';
+       load_b1                <= '0';
+       load_b2                <= '0';
+       move_b1_b2             <= '0';
+       move_b0_b1             <= '0';
+       next_SYN_DATAREADY_OUT <= current_SYN_DATAREADY_OUT;
+       next_got_overflow      <= current_got_overflow;
+
+       case current_buffer_state is
+
+               when BUFFER_EMPTY =>
+                       current_buffer_state_int <= "00";
+                       if( combined_COMB_DATAREADY_IN = '1' ) then
+                               next_buffer_state      <= BUFFER_B2_FULL;
+                               load_b2                <= '1';
+                               next_SYN_DATAREADY_OUT <= '1';
+                       end if;
+
+               when BUFFER_B2_FULL =>
+                       current_buffer_state_int <= "01";
+                       next_SYN_DATAREADY_OUT <= '1';
+                       if   ( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '1') ) then
+                               load_b2                <= '1';
+                       elsif( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '0') ) then
+                               next_buffer_state      <= BUFFER_B1_FULL;
+                               next_next_READ_OUT     <= '0';
+                               load_b1                <= '1';
+                       elsif( (combined_COMB_DATAREADY_IN = '0') and (SYN_READ_IN = '1') ) then
+                               next_buffer_state      <= BUFFER_EMPTY;
+                               next_SYN_DATAREADY_OUT <= '0';
+                       end if;
+
+               when BUFFER_B1_FULL =>
+                       current_buffer_state_int <= "10";
+                       next_SYN_DATAREADY_OUT <= '1';
+                       next_next_READ_OUT <= '0';
+                       if   ( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '1') ) then
+                               load_b1    <= '1';
+                               move_b1_b2 <= '1';
+                       elsif( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '0') ) then
+                               next_buffer_state  <= BUFFER_B0_FULL;
+                               load_b0            <= '1';
+                       elsif( (combined_COMB_DATAREADY_IN = '0') and (SYN_READ_IN = '1') ) then
+                               next_buffer_state  <= BUFFER_B2_FULL;
+                               next_next_READ_OUT <= '1';
+                               move_b1_b2         <= '1';
+                       end if;
+
+       when BUFFER_B0_FULL =>
+               current_buffer_state_int <= "11";
+               next_SYN_DATAREADY_OUT <= '1';
+               next_next_READ_OUT  <= '0';
+               if   ( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '0') ) then
+                       next_got_overflow <= '1';
+               elsif( (combined_COMB_DATAREADY_IN = '0') and (SYN_READ_IN = '1') ) then
+                       move_b1_b2        <= '1';
+                       move_b0_b1        <= '1';
+                       next_buffer_state <= BUFFER_B1_FULL;
+               elsif( (combined_COMB_DATAREADY_IN = '1') and (SYN_READ_IN = '1') ) then
+                       move_b1_b2        <= '1';
+                       move_b0_b1        <= '1';
+                       load_b0           <= '1';
+               end if;
+
+       end case;
+end process;
+
+PROC_FSM_REG : process(CLK)
+begin
+       if( rising_edge(CLK) ) then
+               if   ( RESET = '1' ) then
+                       current_buffer_state      <= BUFFER_EMPTY;
+                       current_got_overflow      <= '0';
+                       current_SYN_DATAREADY_OUT <= '0';
+                       current_next_READ_OUT     <= '0';
+               elsif( CLK_EN = '1' ) then
+                       current_buffer_state      <= next_buffer_state;
+                       current_got_overflow      <= next_got_overflow;
+                       current_SYN_DATAREADY_OUT <= next_SYN_DATAREADY_OUT;
+                       current_next_READ_OUT     <= next_next_READ_OUT;
+               end if;
+       end if;
+end process;
+
+
+PROC_REG_BUFFERS : process(CLK)
+begin
+       if( rising_edge(CLK) ) then
+               if move_b1_b2 = '1' then
+                       current_b2_buffer <= current_b1_buffer;
+               end if;
+               
+               if move_b0_b1 = '1' then
+                       current_b1_buffer <= current_b0_buffer;
+               end if;
+               
+               if load_b2 = '1' then
+                       current_b2_buffer <= COMB_DATA_IN;
+               end if;
+               
+               if load_b1 = '1' then
+                       current_b1_buffer <= COMB_DATA_IN;
+               end if;
+               
+               if load_b0 = '1' then
+                       current_b0_buffer <= COMB_DATA_IN;
+               end if;
+         end if;
+end process;
+
+-- Debug signals
+debug(15 downto 14) <= current_buffer_state_int;
+
+debug(13 downto 6)  <= (others => '0');
+
+debug(5)            <= move_b1_b2;
+debug(4)            <= move_b0_b1;
+debug(3)            <= '0';
+debug(2)            <= load_b2;
+debug(1)            <= load_b1;
+debug(0)            <= load_b0;
+
+debug_out <= debug;
+
+end architecture;
+
diff --git a/src/version.vhd b/src/version.vhd
new file mode 100644 (file)
index 0000000..45d398a
--- /dev/null
@@ -0,0 +1,14 @@
+
+--## attention, automatically generated. Don't change by hand.
+library ieee;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.std_logic_ARITH.ALL;
+USE IEEE.std_logic_UNSIGNED.ALL;
+use ieee.numeric_std.all;
+
+package version is
+    
+    constant VERSION_NUMBER_TIME  : std_logic_vector(31 downto 0)  := CONV_STD_LOGIC_VECTOR(1264600226,32);
+
+end package version;
+