From a041e49b64f99bc8e824b0299712bb8f715ba69a Mon Sep 17 00:00:00 2001 From: Andreas Neiser Date: Tue, 8 Oct 2013 13:21:11 +0200 Subject: [PATCH] Revert all changes in master made by Greg for the new GbE interface. The development should continue in branch "newGBE". Revert "Merge branch 'master' of jspc29.x-matter.uni-frankfurt.de:trbnet" This reverts commit eea8481624631a96eae3e873f108d2e443aa2654, reversing changes made to fb786152e952982ff9fd8484fd6c9379de227ab0. Revert "added missing .ngo files" This reverts commit 26a2c1d87026de6a425462939778b83f575d5eab. Revert "added new fifos and .ngo" This reverts commit a2f4c7bdd52a59bf35110be2eebcb5c3bbb017ff. Revert "first upload after refactoring" This reverts commit e645181a1fb396e18d8f9b6f10b9f3c9e2b26758. --- gbe2_ecp3/ipcores_ecp3/fifo_4kx18x9.vhd | 1573 ------------ gbe2_ecp3/ipcores_ecp3/fifo_4kx8_ecp3.vhd | 1559 ------------ gbe2_ecp3/ipcores_ecp3/fifo_512x32x8.vhd | 1298 ---------- ..._ram_dpEbnonessdn208256208256p13732cfe.ngo | Bin 11309 -> 0 bytes .../pmi_ram_dpEbnonessdn96649664p132b6db5.ngo | Bin 8874 -> 0 bytes gbe2_ecp3/ipcores_ecp3/sgmii_gbe_pcs36.ngo | Bin 447536 -> 0 bytes gbe2_ecp3/ipcores_ecp3/tsmac36.ngo | Bin 962984 -> 0 bytes gbe2_ecp3/tb_gbe_buf.vhd | 4 +- gbe2_ecp3/trb_net16_gbe_buf.vhd | 329 ++- gbe2_ecp3/trb_net16_gbe_event_constr.vhd | 689 ------ gbe2_ecp3/trb_net16_gbe_frame_constr.vhd | 103 +- gbe2_ecp3/trb_net16_gbe_frame_receiver.vhd | 152 +- gbe2_ecp3/trb_net16_gbe_frame_trans.vhd | 21 +- .../trb_net16_gbe_ipu2gbe_simple_sender.vhd | 4 +- gbe2_ecp3/trb_net16_gbe_ipu_interface.vhd | 686 ------ gbe2_ecp3/trb_net16_gbe_mac_control.vhd | 281 ++- gbe2_ecp3/trb_net16_gbe_main_control.vhd | 575 ++--- gbe2_ecp3/trb_net16_gbe_packet_constr.vhd | 2137 +++++++++-------- .../trb_net16_gbe_protocol_prioritizer.vhd | 8 +- gbe2_ecp3/trb_net16_gbe_protocol_selector.vhd | 721 +++--- gbe2_ecp3/trb_net16_gbe_receive_control.vhd | 75 +- ...trb_net16_gbe_response_constructor_ARP.vhd | 372 ++- ...rb_net16_gbe_response_constructor_DHCP.vhd | 431 ++-- ...net16_gbe_response_constructor_Forward.vhd | 1 + ...rb_net16_gbe_response_constructor_Ping.vhd | 355 +-- ...16_gbe_response_constructor_PseudoPing.vhd | 389 --- ...b_net16_gbe_response_constructor_SCTRL.vhd | 762 +++--- ...b_net16_gbe_response_constructor_Trash.vhd | 12 +- ...16_gbe_response_constructor_TrbNetData.vhd | 372 --- gbe2_ecp3/trb_net16_gbe_setup.vhd | 333 ++- gbe2_ecp3/trb_net16_gbe_transmit_control.vhd | 392 ++- gbe2_ecp3/trb_net16_gbe_transmit_control2.vhd | 295 --- gbe2_ecp3/trb_net16_gbe_type_validator.vhd | 71 +- gbe2_ecp3/trb_net16_ipu2gbe.vhd | 355 +-- gbe2_ecp3/trb_net16_med_ecp_sfp_gbe_8b.vhd | 4 +- gbe2_ecp3/trb_net_gbe_components.vhd | 409 +--- gbe2_ecp3/trb_net_gbe_protocols.vhd | 188 +- 37 files changed, 3950 insertions(+), 11006 deletions(-) delete mode 100644 gbe2_ecp3/ipcores_ecp3/fifo_4kx18x9.vhd delete mode 100644 gbe2_ecp3/ipcores_ecp3/fifo_4kx8_ecp3.vhd delete mode 100644 gbe2_ecp3/ipcores_ecp3/fifo_512x32x8.vhd delete mode 100644 gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn208256208256p13732cfe.ngo delete mode 100644 gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn96649664p132b6db5.ngo delete mode 100644 gbe2_ecp3/ipcores_ecp3/sgmii_gbe_pcs36.ngo delete mode 100644 gbe2_ecp3/ipcores_ecp3/tsmac36.ngo delete mode 100644 gbe2_ecp3/trb_net16_gbe_event_constr.vhd delete mode 100644 gbe2_ecp3/trb_net16_gbe_ipu_interface.vhd delete mode 100644 gbe2_ecp3/trb_net16_gbe_response_constructor_PseudoPing.vhd delete mode 100644 gbe2_ecp3/trb_net16_gbe_response_constructor_TrbNetData.vhd delete mode 100644 gbe2_ecp3/trb_net16_gbe_transmit_control2.vhd diff --git a/gbe2_ecp3/ipcores_ecp3/fifo_4kx18x9.vhd b/gbe2_ecp3/ipcores_ecp3/fifo_4kx18x9.vhd deleted file mode 100644 index 73df06a..0000000 --- a/gbe2_ecp3/ipcores_ecp3/fifo_4kx18x9.vhd +++ /dev/null @@ -1,1573 +0,0 @@ --- VHDL netlist generated by SCUBA Diamond_2.2_Production (99) --- Module Version: 5.5 ---/home/soft/lattice/diamond/2.2_x64/ispfpga/bin/lin64/scuba -w -n fifo_4kx18x9 -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5c00 -type ebfifo -depth 2048 -width 18 -depth 2048 -rdata_width 9 -no_enable -pe -1 -pf -1 -e - --- Wed Jun 26 14:33:30 2013 - -library IEEE; -use IEEE.std_logic_1164.all; --- synopsys translate_off -library ecp3; -use ecp3.components.all; --- synopsys translate_on - -entity fifo_4kx18x9 is - port ( - Data: in std_logic_vector(17 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(8 downto 0); - Empty: out std_logic; - Full: out std_logic); -end fifo_4kx18x9; - -architecture Structure of fifo_4kx18x9 is - - -- internal signal declarations - signal invout_1: std_logic; - signal invout_0: std_logic; - signal w_g2b_xor_cluster_2_1: std_logic; - signal w_g2b_xor_cluster_2: std_logic; - signal w_g2b_xor_cluster_1: std_logic; - signal r_g2b_xor_cluster_2_1: std_logic; - signal rcount_w0: std_logic; - signal r_g2b_xor_cluster_2: 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 w_gdata_8: std_logic; - signal w_gdata_9: std_logic; - signal w_gdata_10: 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 wptr_9: std_logic; - signal wptr_10: std_logic; - signal wptr_11: 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 r_gdata_8: std_logic; - signal r_gdata_9: std_logic; - signal r_gdata_10: std_logic; - signal r_gdata_11: 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 rptr_9: std_logic; - signal rptr_10: std_logic; - signal rptr_12: std_logic; - signal rptr_11: 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 w_gcount_9: std_logic; - signal w_gcount_10: std_logic; - signal w_gcount_11: 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 r_gcount_9: std_logic; - signal r_gcount_10: std_logic; - signal r_gcount_11: std_logic; - signal r_gcount_12: 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 w_gcount_r29: std_logic; - signal w_gcount_r9: std_logic; - signal w_gcount_r210: std_logic; - signal w_gcount_r10: std_logic; - signal w_gcount_r211: std_logic; - signal w_gcount_r11: 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 r_gcount_w29: std_logic; - signal r_gcount_w9: std_logic; - signal r_gcount_w210: std_logic; - signal r_gcount_w10: std_logic; - signal r_gcount_w211: std_logic; - signal r_gcount_w11: std_logic; - signal r_gcount_w212: std_logic; - signal r_gcount_w12: 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 iwcount_9: std_logic; - signal co3: std_logic; - signal iwcount_10: std_logic; - signal iwcount_11: std_logic; - signal co5: std_logic; - signal co4: std_logic; - signal wcount_11: 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 ircount_9: std_logic; - signal co3_1: std_logic; - signal ircount_10: std_logic; - signal ircount_11: std_logic; - signal co4_1: std_logic; - signal ircount_12: std_logic; - signal co6: std_logic; - signal co5_1: std_logic; - signal rcount_12: std_logic; - signal mdout1_1_0: std_logic; - signal mdout1_0_0: std_logic; - signal mdout1_1_1: std_logic; - signal mdout1_0_1: std_logic; - signal mdout1_1_2: std_logic; - signal mdout1_0_2: std_logic; - signal mdout1_1_3: std_logic; - signal mdout1_0_3: std_logic; - signal mdout1_1_4: std_logic; - signal mdout1_0_4: std_logic; - signal mdout1_1_5: std_logic; - signal mdout1_0_5: std_logic; - signal mdout1_1_6: std_logic; - signal mdout1_0_6: std_logic; - signal mdout1_1_7: std_logic; - signal mdout1_0_7: std_logic; - signal rptr_11_ff: std_logic; - signal mdout1_1_8: std_logic; - signal mdout1_0_8: std_logic; - signal rden_i: std_logic; - signal cmp_ci: std_logic; - signal wcount_r0: std_logic; - signal rcount_0: std_logic; - signal rcount_1: std_logic; - signal co0_2: std_logic; - signal wcount_r1: std_logic; - signal wcount_r2: std_logic; - signal rcount_2: std_logic; - signal rcount_3: std_logic; - signal co1_2: std_logic; - signal wcount_r3: std_logic; - signal wcount_r4: std_logic; - signal rcount_4: std_logic; - signal rcount_5: std_logic; - signal co2_2: std_logic; - signal wcount_r5: std_logic; - signal wcount_r6: std_logic; - signal rcount_6: std_logic; - signal rcount_7: std_logic; - signal co3_2: std_logic; - signal wcount_r7: std_logic; - signal w_g2b_xor_cluster_0: std_logic; - signal rcount_8: std_logic; - signal rcount_9: std_logic; - signal co4_2: std_logic; - signal wcount_r9: std_logic; - signal wcount_r10: std_logic; - signal rcount_10: std_logic; - signal rcount_11: std_logic; - signal co5_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_w1: std_logic; - signal rcount_w2: std_logic; - signal wcount_0: std_logic; - signal wcount_1: std_logic; - signal co0_3: std_logic; - signal rcount_w3: std_logic; - signal rcount_w4: std_logic; - signal wcount_2: std_logic; - signal wcount_3: std_logic; - signal co1_3: std_logic; - signal rcount_w5: std_logic; - signal rcount_w6: std_logic; - signal wcount_4: std_logic; - signal wcount_5: std_logic; - signal co2_3: std_logic; - signal rcount_w7: std_logic; - signal rcount_w8: std_logic; - signal wcount_6: std_logic; - signal wcount_7: std_logic; - signal co3_3: std_logic; - signal r_g2b_xor_cluster_0: std_logic; - signal rcount_w10: std_logic; - signal wcount_8: std_logic; - signal wcount_9: std_logic; - signal co4_3: std_logic; - signal rcount_w11: std_logic; - signal full_cmp_clr: std_logic; - signal wcount_10: 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 - 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 - 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 - port (D: in std_logic; CK: in std_logic; PD: in std_logic; - Q: out std_logic); - end component; - component FD1S3DX - 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 MUX21 - port (D0: in std_logic; D1: in std_logic; SD: 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 ROM16X1A - generic (INITVAL : in std_logic_vector(15 downto 0)); - 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 DP16KC - generic (GSR : in String; WRITEMODE_B : in String; - WRITEMODE_A : in String; CSDECODE_B : in String; - CSDECODE_A : in String; REGMODE_B : in String; - REGMODE_A : in String; DATA_WIDTH_B : in Integer; - DATA_WIDTH_A : in Integer); - 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; OCEA: 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; OCEB: 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 RESETMODE : string; - attribute GSR : string; - attribute MEM_LPC_FILE of pdp_ram_0_0_1 : label is "fifo_4kx18x9.lpc"; - attribute MEM_INIT_FILE of pdp_ram_0_0_1 : label is ""; - attribute RESETMODE of pdp_ram_0_0_1 : label is "SYNC"; - attribute MEM_LPC_FILE of pdp_ram_1_0_0 : label is "fifo_4kx18x9.lpc"; - attribute MEM_INIT_FILE of pdp_ram_1_0_0 : label is ""; - attribute RESETMODE of pdp_ram_1_0_0 : label is "SYNC"; - 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; - attribute NGD_DRC_MASK : integer; - attribute NGD_DRC_MASK of Structure : architecture is 1; - -begin - -- component instantiation statements - AND2_t25: AND2 - port map (A=>WrEn, B=>invout_1, Z=>wren_i); - - INV_1: INV - port map (A=>full_i, Z=>invout_1); - - AND2_t24: AND2 - port map (A=>RdEn, B=>invout_0, Z=>rden_i); - - INV_0: INV - port map (A=>empty_i, Z=>invout_0); - - OR2_t23: OR2 - port map (A=>Reset, B=>RPReset, Z=>rRst); - - XOR2_t22: XOR2 - port map (A=>wcount_0, B=>wcount_1, Z=>w_gdata_0); - - XOR2_t21: XOR2 - port map (A=>wcount_1, B=>wcount_2, Z=>w_gdata_1); - - XOR2_t20: XOR2 - port map (A=>wcount_2, B=>wcount_3, Z=>w_gdata_2); - - XOR2_t19: XOR2 - port map (A=>wcount_3, B=>wcount_4, Z=>w_gdata_3); - - XOR2_t18: XOR2 - port map (A=>wcount_4, B=>wcount_5, Z=>w_gdata_4); - - XOR2_t17: XOR2 - port map (A=>wcount_5, B=>wcount_6, Z=>w_gdata_5); - - XOR2_t16: XOR2 - port map (A=>wcount_6, B=>wcount_7, Z=>w_gdata_6); - - XOR2_t15: XOR2 - port map (A=>wcount_7, B=>wcount_8, Z=>w_gdata_7); - - XOR2_t14: XOR2 - port map (A=>wcount_8, B=>wcount_9, Z=>w_gdata_8); - - XOR2_t13: XOR2 - port map (A=>wcount_9, B=>wcount_10, Z=>w_gdata_9); - - XOR2_t12: XOR2 - port map (A=>wcount_10, B=>wcount_11, Z=>w_gdata_10); - - XOR2_t11: XOR2 - port map (A=>rcount_0, B=>rcount_1, Z=>r_gdata_0); - - XOR2_t10: XOR2 - port map (A=>rcount_1, B=>rcount_2, Z=>r_gdata_1); - - XOR2_t9: XOR2 - port map (A=>rcount_2, B=>rcount_3, Z=>r_gdata_2); - - XOR2_t8: XOR2 - port map (A=>rcount_3, B=>rcount_4, Z=>r_gdata_3); - - XOR2_t7: XOR2 - port map (A=>rcount_4, B=>rcount_5, Z=>r_gdata_4); - - XOR2_t6: XOR2 - port map (A=>rcount_5, B=>rcount_6, Z=>r_gdata_5); - - XOR2_t5: XOR2 - port map (A=>rcount_6, B=>rcount_7, Z=>r_gdata_6); - - XOR2_t4: XOR2 - port map (A=>rcount_7, B=>rcount_8, Z=>r_gdata_7); - - XOR2_t3: XOR2 - port map (A=>rcount_8, B=>rcount_9, Z=>r_gdata_8); - - XOR2_t2: XOR2 - port map (A=>rcount_9, B=>rcount_10, Z=>r_gdata_9); - - XOR2_t1: XOR2 - port map (A=>rcount_10, B=>rcount_11, Z=>r_gdata_10); - - XOR2_t0: XOR2 - port map (A=>rcount_11, B=>rcount_12, Z=>r_gdata_11); - - LUT4_32: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r28, AD2=>w_gcount_r29, - AD1=>w_gcount_r210, AD0=>w_gcount_r211, - DO0=>w_g2b_xor_cluster_0); - - LUT4_31: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r24, AD2=>w_gcount_r25, - AD1=>w_gcount_r26, AD0=>w_gcount_r27, - DO0=>w_g2b_xor_cluster_1); - - LUT4_30: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r20, AD2=>w_gcount_r21, - AD1=>w_gcount_r22, AD0=>w_gcount_r23, - DO0=>w_g2b_xor_cluster_2); - - LUT4_29: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r210, AD2=>w_gcount_r211, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>wcount_r10); - - LUT4_28: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r29, AD2=>w_gcount_r210, - AD1=>w_gcount_r211, AD0=>scuba_vlo, DO0=>wcount_r9); - - LUT4_27: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r27, AD2=>w_gcount_r28, - AD1=>w_gcount_r29, AD0=>wcount_r10, DO0=>wcount_r7); - - LUT4_26: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r26, AD2=>w_gcount_r27, - AD1=>w_gcount_r28, AD0=>wcount_r9, DO0=>wcount_r6); - - LUT4_25: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r25, AD2=>w_gcount_r26, - AD1=>w_gcount_r27, AD0=>w_g2b_xor_cluster_0, DO0=>wcount_r5); - - LUT4_24: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>wcount_r4); - - LUT4_23: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r23, AD0=>scuba_vlo, DO0=>wcount_r3); - - LUT4_22: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r22, AD0=>w_gcount_r23, DO0=>wcount_r2); - - LUT4_21: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r21, AD2=>w_gcount_r22, - AD1=>w_gcount_r23, AD0=>scuba_vlo, - DO0=>w_g2b_xor_cluster_2_1); - - LUT4_20: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_g2b_xor_cluster_2_1, AD0=>scuba_vlo, DO0=>wcount_r1); - - LUT4_19: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_g2b_xor_cluster_2, AD0=>scuba_vlo, DO0=>wcount_r0); - - LUT4_18: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w29, AD2=>r_gcount_w210, - AD1=>r_gcount_w211, AD0=>r_gcount_w212, - DO0=>r_g2b_xor_cluster_0); - - LUT4_17: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w25, AD2=>r_gcount_w26, - AD1=>r_gcount_w27, AD0=>r_gcount_w28, - DO0=>r_g2b_xor_cluster_1); - - LUT4_16: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w21, AD2=>r_gcount_w22, - AD1=>r_gcount_w23, AD0=>r_gcount_w24, - DO0=>r_g2b_xor_cluster_2); - - LUT4_15: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w211, AD2=>r_gcount_w212, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>rcount_w11); - - LUT4_14: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w210, AD2=>r_gcount_w211, - AD1=>r_gcount_w212, AD0=>scuba_vlo, DO0=>rcount_w10); - - LUT4_13: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w28, AD2=>r_gcount_w29, - AD1=>r_gcount_w210, AD0=>rcount_w11, DO0=>rcount_w8); - - LUT4_12: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w27, AD2=>r_gcount_w28, - AD1=>r_gcount_w29, AD0=>rcount_w10, DO0=>rcount_w7); - - LUT4_11: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w26, AD2=>r_gcount_w27, - AD1=>r_gcount_w28, AD0=>r_g2b_xor_cluster_0, DO0=>rcount_w6); - - LUT4_10: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>rcount_w5); - - LUT4_9: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w24, AD0=>scuba_vlo, DO0=>rcount_w4); - - LUT4_8: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w23, AD0=>r_gcount_w24, DO0=>rcount_w3); - - LUT4_7: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w22, AD2=>r_gcount_w23, - AD1=>r_gcount_w24, AD0=>scuba_vlo, - DO0=>r_g2b_xor_cluster_2_1); - - LUT4_6: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2_1, AD0=>scuba_vlo, DO0=>rcount_w2); - - LUT4_5: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2, AD0=>scuba_vlo, DO0=>rcount_w1); - - LUT4_4: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2, AD0=>r_gcount_w20, DO0=>rcount_w0); - - LUT4_3: ROM16X1A - generic map (initval=> X"0410") - port map (AD3=>rptr_12, AD2=>rcount_12, AD1=>w_gcount_r211, - AD0=>scuba_vlo, DO0=>empty_cmp_set); - - LUT4_2: ROM16X1A - generic map (initval=> X"1004") - port map (AD3=>rptr_12, AD2=>rcount_12, AD1=>w_gcount_r211, - AD0=>scuba_vlo, DO0=>empty_cmp_clr); - - LUT4_1: ROM16X1A - generic map (initval=> X"0140") - port map (AD3=>wptr_11, AD2=>wcount_11, AD1=>r_gcount_w212, - AD0=>scuba_vlo, DO0=>full_cmp_set); - - LUT4_0: ROM16X1A - generic map (initval=> X"4001") - port map (AD3=>wptr_11, AD2=>wcount_11, AD1=>r_gcount_w212, - AD0=>scuba_vlo, DO0=>full_cmp_clr); - - pdp_ram_0_0_1: DP16KC - generic map (CSDECODE_B=> "0b000", CSDECODE_A=> "0b000", - WRITEMODE_B=> "NORMAL", WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", - REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=> 9, - DATA_WIDTH_A=> 18) - 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=>wptr_0, ADA5=>wptr_1, - ADA6=>wptr_2, ADA7=>wptr_3, ADA8=>wptr_4, ADA9=>wptr_5, - ADA10=>wptr_6, ADA11=>wptr_7, ADA12=>wptr_8, ADA13=>wptr_9, - CEA=>wren_i, CLKA=>WrClock, OCEA=>wren_i, WEA=>scuba_vhi, - CSA0=>wptr_10, 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=>rptr_0, ADB4=>rptr_1, ADB5=>rptr_2, ADB6=>rptr_3, - ADB7=>rptr_4, ADB8=>rptr_5, ADB9=>rptr_6, ADB10=>rptr_7, - ADB11=>rptr_8, ADB12=>rptr_9, ADB13=>rptr_10, CEB=>rden_i, - CLKB=>RdClock, OCEB=>rden_i, WEB=>scuba_vlo, CSB0=>rptr_11, - 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=>mdout1_0_0, - DOB1=>mdout1_0_1, DOB2=>mdout1_0_2, DOB3=>mdout1_0_3, - DOB4=>mdout1_0_4, DOB5=>mdout1_0_5, DOB6=>mdout1_0_6, - DOB7=>mdout1_0_7, DOB8=>mdout1_0_8, DOB9=>open, DOB10=>open, - DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, - DOB15=>open, DOB16=>open, DOB17=>open); - - pdp_ram_1_0_0: DP16KC - generic map (CSDECODE_B=> "0b001", CSDECODE_A=> "0b001", - WRITEMODE_B=> "NORMAL", WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", - REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=> 9, - DATA_WIDTH_A=> 18) - 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=>wptr_0, ADA5=>wptr_1, - ADA6=>wptr_2, ADA7=>wptr_3, ADA8=>wptr_4, ADA9=>wptr_5, - ADA10=>wptr_6, ADA11=>wptr_7, ADA12=>wptr_8, ADA13=>wptr_9, - CEA=>wren_i, CLKA=>WrClock, OCEA=>wren_i, WEA=>scuba_vhi, - CSA0=>wptr_10, 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=>rptr_0, ADB4=>rptr_1, ADB5=>rptr_2, ADB6=>rptr_3, - ADB7=>rptr_4, ADB8=>rptr_5, ADB9=>rptr_6, ADB10=>rptr_7, - ADB11=>rptr_8, ADB12=>rptr_9, ADB13=>rptr_10, CEB=>rden_i, - CLKB=>RdClock, OCEB=>rden_i, WEB=>scuba_vlo, CSB0=>rptr_11, - 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=>mdout1_1_0, - DOB1=>mdout1_1_1, DOB2=>mdout1_1_2, DOB3=>mdout1_1_3, - DOB4=>mdout1_1_4, DOB5=>mdout1_1_5, DOB6=>mdout1_1_6, - DOB7=>mdout1_1_7, DOB8=>mdout1_1_8, DOB9=>open, DOB10=>open, - DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, - DOB15=>open, DOB16=>open, DOB17=>open); - - FF_127: FD1P3BX - port map (D=>iwcount_0, SP=>wren_i, CK=>WrClock, PD=>Reset, - Q=>wcount_0); - - FF_126: FD1P3DX - port map (D=>iwcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_1); - - FF_125: FD1P3DX - port map (D=>iwcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_2); - - FF_124: FD1P3DX - port map (D=>iwcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_3); - - FF_123: FD1P3DX - port map (D=>iwcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_4); - - FF_122: FD1P3DX - port map (D=>iwcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_5); - - FF_121: FD1P3DX - port map (D=>iwcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_6); - - FF_120: FD1P3DX - port map (D=>iwcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_7); - - FF_119: FD1P3DX - port map (D=>iwcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_8); - - FF_118: FD1P3DX - port map (D=>iwcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_9); - - FF_117: FD1P3DX - port map (D=>iwcount_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_10); - - FF_116: FD1P3DX - port map (D=>iwcount_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_11); - - FF_115: FD1P3DX - port map (D=>w_gdata_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_0); - - FF_114: FD1P3DX - port map (D=>w_gdata_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_1); - - FF_113: FD1P3DX - port map (D=>w_gdata_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_2); - - FF_112: FD1P3DX - port map (D=>w_gdata_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_3); - - FF_111: FD1P3DX - port map (D=>w_gdata_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_4); - - FF_110: FD1P3DX - port map (D=>w_gdata_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_5); - - FF_109: FD1P3DX - port map (D=>w_gdata_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_6); - - FF_108: FD1P3DX - port map (D=>w_gdata_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_7); - - FF_107: FD1P3DX - port map (D=>w_gdata_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_8); - - FF_106: FD1P3DX - port map (D=>w_gdata_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_9); - - FF_105: FD1P3DX - port map (D=>w_gdata_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_10); - - FF_104: FD1P3DX - port map (D=>wcount_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_11); - - FF_103: FD1P3DX - port map (D=>wcount_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_0); - - FF_102: FD1P3DX - port map (D=>wcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_1); - - FF_101: FD1P3DX - port map (D=>wcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_2); - - FF_100: FD1P3DX - port map (D=>wcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_3); - - FF_99: FD1P3DX - port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_4); - - FF_98: FD1P3DX - port map (D=>wcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_5); - - FF_97: FD1P3DX - port map (D=>wcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_6); - - FF_96: FD1P3DX - port map (D=>wcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_7); - - FF_95: FD1P3DX - port map (D=>wcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_8); - - FF_94: FD1P3DX - port map (D=>wcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_9); - - FF_93: FD1P3DX - port map (D=>wcount_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_10); - - FF_92: FD1P3DX - port map (D=>wcount_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_11); - - FF_91: FD1P3BX - port map (D=>ircount_0, SP=>rden_i, CK=>RdClock, PD=>rRst, - Q=>rcount_0); - - FF_90: FD1P3DX - port map (D=>ircount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_1); - - FF_89: FD1P3DX - port map (D=>ircount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_2); - - FF_88: FD1P3DX - port map (D=>ircount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_3); - - FF_87: FD1P3DX - port map (D=>ircount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_4); - - FF_86: FD1P3DX - port map (D=>ircount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_5); - - FF_85: FD1P3DX - port map (D=>ircount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_6); - - FF_84: FD1P3DX - port map (D=>ircount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_7); - - FF_83: FD1P3DX - port map (D=>ircount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_8); - - FF_82: FD1P3DX - port map (D=>ircount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_9); - - FF_81: FD1P3DX - port map (D=>ircount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_10); - - FF_80: FD1P3DX - port map (D=>ircount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_11); - - FF_79: FD1P3DX - port map (D=>ircount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_12); - - FF_78: FD1P3DX - port map (D=>r_gdata_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_0); - - FF_77: FD1P3DX - port map (D=>r_gdata_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_1); - - FF_76: FD1P3DX - port map (D=>r_gdata_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_2); - - FF_75: FD1P3DX - port map (D=>r_gdata_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_3); - - FF_74: FD1P3DX - port map (D=>r_gdata_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_4); - - FF_73: FD1P3DX - port map (D=>r_gdata_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_5); - - FF_72: FD1P3DX - port map (D=>r_gdata_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_6); - - FF_71: FD1P3DX - port map (D=>r_gdata_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_7); - - FF_70: FD1P3DX - port map (D=>r_gdata_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_8); - - FF_69: FD1P3DX - port map (D=>r_gdata_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_9); - - FF_68: FD1P3DX - port map (D=>r_gdata_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_10); - - FF_67: FD1P3DX - port map (D=>r_gdata_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_11); - - FF_66: FD1P3DX - port map (D=>rcount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_12); - - FF_65: FD1P3DX - port map (D=>rcount_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_0); - - FF_64: FD1P3DX - port map (D=>rcount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_1); - - FF_63: FD1P3DX - port map (D=>rcount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_2); - - FF_62: FD1P3DX - port map (D=>rcount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_3); - - FF_61: FD1P3DX - port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_4); - - FF_60: FD1P3DX - port map (D=>rcount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_5); - - FF_59: FD1P3DX - port map (D=>rcount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_6); - - FF_58: FD1P3DX - port map (D=>rcount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_7); - - FF_57: FD1P3DX - port map (D=>rcount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_8); - - FF_56: FD1P3DX - port map (D=>rcount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_9); - - FF_55: FD1P3DX - port map (D=>rcount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_10); - - FF_54: FD1P3DX - port map (D=>rcount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_11); - - FF_53: FD1P3DX - port map (D=>rcount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_12); - - FF_52: FD1P3DX - port map (D=>rptr_11, SP=>rden_i, CK=>RdClock, CD=>scuba_vlo, - Q=>rptr_11_ff); - - FF_51: FD1S3DX - port map (D=>w_gcount_0, CK=>RdClock, CD=>Reset, Q=>w_gcount_r0); - - FF_50: FD1S3DX - port map (D=>w_gcount_1, CK=>RdClock, CD=>Reset, Q=>w_gcount_r1); - - FF_49: FD1S3DX - port map (D=>w_gcount_2, CK=>RdClock, CD=>Reset, Q=>w_gcount_r2); - - FF_48: FD1S3DX - port map (D=>w_gcount_3, CK=>RdClock, CD=>Reset, Q=>w_gcount_r3); - - FF_47: FD1S3DX - port map (D=>w_gcount_4, CK=>RdClock, CD=>Reset, Q=>w_gcount_r4); - - FF_46: FD1S3DX - port map (D=>w_gcount_5, CK=>RdClock, CD=>Reset, Q=>w_gcount_r5); - - FF_45: FD1S3DX - port map (D=>w_gcount_6, CK=>RdClock, CD=>Reset, Q=>w_gcount_r6); - - FF_44: FD1S3DX - port map (D=>w_gcount_7, CK=>RdClock, CD=>Reset, Q=>w_gcount_r7); - - FF_43: FD1S3DX - port map (D=>w_gcount_8, CK=>RdClock, CD=>Reset, Q=>w_gcount_r8); - - FF_42: FD1S3DX - port map (D=>w_gcount_9, CK=>RdClock, CD=>Reset, Q=>w_gcount_r9); - - FF_41: FD1S3DX - port map (D=>w_gcount_10, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r10); - - FF_40: FD1S3DX - port map (D=>w_gcount_11, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r11); - - FF_39: FD1S3DX - port map (D=>r_gcount_0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w0); - - FF_38: FD1S3DX - port map (D=>r_gcount_1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w1); - - FF_37: FD1S3DX - port map (D=>r_gcount_2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w2); - - FF_36: FD1S3DX - port map (D=>r_gcount_3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w3); - - FF_35: FD1S3DX - port map (D=>r_gcount_4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w4); - - FF_34: FD1S3DX - port map (D=>r_gcount_5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w5); - - FF_33: FD1S3DX - port map (D=>r_gcount_6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w6); - - FF_32: FD1S3DX - port map (D=>r_gcount_7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w7); - - FF_31: FD1S3DX - port map (D=>r_gcount_8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w8); - - FF_30: FD1S3DX - port map (D=>r_gcount_9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w9); - - FF_29: FD1S3DX - port map (D=>r_gcount_10, CK=>WrClock, CD=>rRst, Q=>r_gcount_w10); - - FF_28: FD1S3DX - port map (D=>r_gcount_11, CK=>WrClock, CD=>rRst, Q=>r_gcount_w11); - - FF_27: FD1S3DX - port map (D=>r_gcount_12, CK=>WrClock, CD=>rRst, Q=>r_gcount_w12); - - FF_26: FD1S3DX - port map (D=>w_gcount_r0, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r20); - - FF_25: FD1S3DX - port map (D=>w_gcount_r1, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r21); - - FF_24: FD1S3DX - port map (D=>w_gcount_r2, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r22); - - FF_23: FD1S3DX - port map (D=>w_gcount_r3, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r23); - - FF_22: FD1S3DX - port map (D=>w_gcount_r4, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r24); - - FF_21: FD1S3DX - port map (D=>w_gcount_r5, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r25); - - FF_20: FD1S3DX - port map (D=>w_gcount_r6, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r26); - - FF_19: FD1S3DX - port map (D=>w_gcount_r7, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r27); - - FF_18: FD1S3DX - port map (D=>w_gcount_r8, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r28); - - FF_17: FD1S3DX - port map (D=>w_gcount_r9, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r29); - - FF_16: FD1S3DX - port map (D=>w_gcount_r10, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r210); - - FF_15: FD1S3DX - port map (D=>w_gcount_r11, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r211); - - FF_14: FD1S3DX - port map (D=>r_gcount_w0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w20); - - FF_13: FD1S3DX - port map (D=>r_gcount_w1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w21); - - FF_12: FD1S3DX - port map (D=>r_gcount_w2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w22); - - FF_11: FD1S3DX - port map (D=>r_gcount_w3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w23); - - FF_10: FD1S3DX - port map (D=>r_gcount_w4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w24); - - FF_9: FD1S3DX - port map (D=>r_gcount_w5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w25); - - FF_8: FD1S3DX - port map (D=>r_gcount_w6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w26); - - FF_7: FD1S3DX - port map (D=>r_gcount_w7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w27); - - FF_6: FD1S3DX - port map (D=>r_gcount_w8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w28); - - FF_5: FD1S3DX - port map (D=>r_gcount_w9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w29); - - FF_4: FD1S3DX - port map (D=>r_gcount_w10, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w210); - - FF_3: FD1S3DX - port map (D=>r_gcount_w11, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w211); - - FF_2: FD1S3DX - port map (D=>r_gcount_w12, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w212); - - FF_1: FD1S3BX - port map (D=>empty_d, CK=>RdClock, PD=>rRst, Q=>empty_i); - - FF_0: FD1S3DX - 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=>wcount_9, CO=>co4, - NC0=>iwcount_8, NC1=>iwcount_9); - - w_gctr_5: CU2 - port map (CI=>co4, PC0=>wcount_10, PC1=>wcount_11, CO=>co5, - NC0=>iwcount_10, NC1=>iwcount_11); - - 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=>rcount_9, CO=>co4_1, - NC0=>ircount_8, NC1=>ircount_9); - - r_gctr_5: CU2 - port map (CI=>co4_1, PC0=>rcount_10, PC1=>rcount_11, CO=>co5_1, - NC0=>ircount_10, NC1=>ircount_11); - - r_gctr_6: CU2 - port map (CI=>co5_1, PC0=>rcount_12, PC1=>scuba_vlo, CO=>co6, - NC0=>ircount_12, NC1=>open); - - mux_8: MUX21 - port map (D0=>mdout1_0_0, D1=>mdout1_1_0, SD=>rptr_11_ff, - Z=>Q(0)); - - mux_7: MUX21 - port map (D0=>mdout1_0_1, D1=>mdout1_1_1, SD=>rptr_11_ff, - Z=>Q(1)); - - mux_6: MUX21 - port map (D0=>mdout1_0_2, D1=>mdout1_1_2, SD=>rptr_11_ff, - Z=>Q(2)); - - mux_5: MUX21 - port map (D0=>mdout1_0_3, D1=>mdout1_1_3, SD=>rptr_11_ff, - Z=>Q(3)); - - mux_4: MUX21 - port map (D0=>mdout1_0_4, D1=>mdout1_1_4, SD=>rptr_11_ff, - Z=>Q(4)); - - mux_3: MUX21 - port map (D0=>mdout1_0_5, D1=>mdout1_1_5, SD=>rptr_11_ff, - Z=>Q(5)); - - mux_2: MUX21 - port map (D0=>mdout1_0_6, D1=>mdout1_1_6, SD=>rptr_11_ff, - Z=>Q(6)); - - mux_1: MUX21 - port map (D0=>mdout1_0_7, D1=>mdout1_1_7, SD=>rptr_11_ff, - Z=>Q(7)); - - mux_0: MUX21 - port map (D0=>mdout1_0_8, D1=>mdout1_1_8, SD=>rptr_11_ff, - Z=>Q(8)); - - 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=>scuba_vlo, - B1=>wcount_r0, CI=>cmp_ci, GE=>co0_2); - - empty_cmp_1: AGEB2 - port map (A0=>rcount_2, A1=>rcount_3, B0=>wcount_r1, - B1=>wcount_r2, CI=>co0_2, GE=>co1_2); - - empty_cmp_2: AGEB2 - port map (A0=>rcount_4, A1=>rcount_5, B0=>wcount_r3, - B1=>wcount_r4, CI=>co1_2, GE=>co2_2); - - empty_cmp_3: AGEB2 - port map (A0=>rcount_6, A1=>rcount_7, B0=>wcount_r5, - B1=>wcount_r6, CI=>co2_2, GE=>co3_2); - - empty_cmp_4: AGEB2 - port map (A0=>rcount_8, A1=>rcount_9, B0=>wcount_r7, - B1=>w_g2b_xor_cluster_0, CI=>co3_2, GE=>co4_2); - - empty_cmp_5: AGEB2 - port map (A0=>rcount_10, A1=>rcount_11, B0=>wcount_r9, - B1=>wcount_r10, CI=>co4_2, GE=>co5_2); - - empty_cmp_6: AGEB2 - port map (A0=>empty_cmp_set, A1=>scuba_vlo, B0=>empty_cmp_clr, - B1=>scuba_vlo, CI=>co5_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_w1, - B1=>rcount_w2, CI=>cmp_ci_1, GE=>co0_3); - - full_cmp_1: AGEB2 - port map (A0=>wcount_2, A1=>wcount_3, B0=>rcount_w3, - B1=>rcount_w4, CI=>co0_3, GE=>co1_3); - - full_cmp_2: AGEB2 - port map (A0=>wcount_4, A1=>wcount_5, B0=>rcount_w5, - B1=>rcount_w6, CI=>co1_3, GE=>co2_3); - - full_cmp_3: AGEB2 - port map (A0=>wcount_6, A1=>wcount_7, B0=>rcount_w7, - B1=>rcount_w8, CI=>co2_3, GE=>co3_3); - - full_cmp_4: AGEB2 - port map (A0=>wcount_8, A1=>wcount_9, B0=>r_g2b_xor_cluster_0, - B1=>rcount_w10, CI=>co3_3, GE=>co4_3); - - full_cmp_5: AGEB2 - port map (A0=>wcount_10, A1=>full_cmp_set, B0=>rcount_w11, - B1=>full_cmp_clr, CI=>co4_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 ecp3; -configuration Structure_CON of fifo_4kx18x9 is - for Structure - for all:AGEB2 use entity ecp3.AGEB2(V); end for; - for all:AND2 use entity ecp3.AND2(V); end for; - for all:CU2 use entity ecp3.CU2(V); end for; - for all:FADD2B use entity ecp3.FADD2B(V); end for; - for all:FD1P3BX use entity ecp3.FD1P3BX(V); end for; - for all:FD1P3DX use entity ecp3.FD1P3DX(V); end for; - for all:FD1S3BX use entity ecp3.FD1S3BX(V); end for; - for all:FD1S3DX use entity ecp3.FD1S3DX(V); end for; - for all:INV use entity ecp3.INV(V); end for; - for all:MUX21 use entity ecp3.MUX21(V); end for; - for all:OR2 use entity ecp3.OR2(V); end for; - for all:ROM16X1A use entity ecp3.ROM16X1A(V); end for; - for all:VHI use entity ecp3.VHI(V); end for; - for all:VLO use entity ecp3.VLO(V); end for; - for all:XOR2 use entity ecp3.XOR2(V); end for; - for all:DP16KC use entity ecp3.DP16KC(V); end for; - end for; -end Structure_CON; - --- synopsys translate_on diff --git a/gbe2_ecp3/ipcores_ecp3/fifo_4kx8_ecp3.vhd b/gbe2_ecp3/ipcores_ecp3/fifo_4kx8_ecp3.vhd deleted file mode 100644 index f282f7a..0000000 --- a/gbe2_ecp3/ipcores_ecp3/fifo_4kx8_ecp3.vhd +++ /dev/null @@ -1,1559 +0,0 @@ --- VHDL netlist generated by SCUBA Diamond_2.1_Production (100) --- Module Version: 5.4 ---/home/soft/lattice/diamond/2.1_x64/ispfpga/bin/lin64/scuba -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5c00 -type ebfifo -depth 4096 -width 8 -depth 4096 -rdata_width 8 -no_enable -pe -1 -pf -1 -e - --- Tue Apr 23 14:34:09 2013 - -library IEEE; -use IEEE.std_logic_1164.all; --- synopsys translate_off -library ecp3; -use ecp3.components.all; --- synopsys translate_on - -entity fifo_4kx8_ecp3 is - port ( - Data: in std_logic_vector(7 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(7 downto 0); - Empty: out std_logic; - Full: out std_logic); -end fifo_4kx8_ecp3; - -architecture Structure of fifo_4kx8_ecp3 is - - -- internal signal declarations - signal invout_1: std_logic; - signal invout_0: std_logic; - signal w_g2b_xor_cluster_2_1: std_logic; - signal w_g2b_xor_cluster_2: std_logic; - signal w_g2b_xor_cluster_1: std_logic; - signal r_g2b_xor_cluster_2_1: std_logic; - signal r_g2b_xor_cluster_2: 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 w_gdata_8: std_logic; - signal w_gdata_9: std_logic; - signal w_gdata_10: std_logic; - signal w_gdata_11: 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 wptr_9: std_logic; - signal wptr_10: std_logic; - signal wptr_11: std_logic; - signal wptr_12: 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 r_gdata_8: std_logic; - signal r_gdata_9: std_logic; - signal r_gdata_10: std_logic; - signal r_gdata_11: 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 rptr_9: std_logic; - signal rptr_10: std_logic; - signal rptr_11: std_logic; - signal rptr_12: 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 w_gcount_9: std_logic; - signal w_gcount_10: std_logic; - signal w_gcount_11: std_logic; - signal w_gcount_12: 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 r_gcount_9: std_logic; - signal r_gcount_10: std_logic; - signal r_gcount_11: std_logic; - signal r_gcount_12: 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 w_gcount_r29: std_logic; - signal w_gcount_r9: std_logic; - signal w_gcount_r210: std_logic; - signal w_gcount_r10: std_logic; - signal w_gcount_r211: std_logic; - signal w_gcount_r11: std_logic; - signal w_gcount_r212: std_logic; - signal w_gcount_r12: 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 r_gcount_w29: std_logic; - signal r_gcount_w9: std_logic; - signal r_gcount_w210: std_logic; - signal r_gcount_w10: std_logic; - signal r_gcount_w211: std_logic; - signal r_gcount_w11: std_logic; - signal r_gcount_w212: std_logic; - signal r_gcount_w12: 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 iwcount_9: std_logic; - signal co3: std_logic; - signal iwcount_10: std_logic; - signal iwcount_11: std_logic; - signal co4: std_logic; - signal iwcount_12: std_logic; - signal co6: std_logic; - signal wcount_12: std_logic; - signal co5: 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 ircount_9: std_logic; - signal co3_1: std_logic; - signal ircount_10: std_logic; - signal ircount_11: std_logic; - signal co4_1: std_logic; - signal ircount_12: std_logic; - signal co6_1: std_logic; - signal rcount_12: std_logic; - signal co5_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 wcount_r5: 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 wcount_r8: std_logic; - signal w_g2b_xor_cluster_0: std_logic; - signal rcount_8: std_logic; - signal rcount_9: std_logic; - signal co4_2: std_logic; - signal wcount_r10: std_logic; - signal wcount_r11: std_logic; - signal rcount_10: std_logic; - signal rcount_11: std_logic; - signal co5_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 rcount_w5: 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 rcount_w8: std_logic; - signal r_g2b_xor_cluster_0: std_logic; - signal wcount_8: std_logic; - signal wcount_9: std_logic; - signal co4_3: std_logic; - signal rcount_w10: std_logic; - signal rcount_w11: std_logic; - signal wcount_10: std_logic; - signal wcount_11: std_logic; - signal co5_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 - 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 - 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 - port (D: in std_logic; CK: in std_logic; PD: in std_logic; - Q: out std_logic); - end component; - component FD1S3DX - 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 ROM16X1A - generic (INITVAL : in std_logic_vector(15 downto 0)); - 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 DP16KC - generic (GSR : in String; WRITEMODE_B : in String; - WRITEMODE_A : in String; CSDECODE_B : in String; - CSDECODE_A : in String; REGMODE_B : in String; - REGMODE_A : in String; DATA_WIDTH_B : in Integer; - DATA_WIDTH_A : in Integer); - 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; OCEA: 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; OCEB: 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 RESETMODE : string; - attribute GSR : string; - attribute MEM_LPC_FILE of pdp_ram_0_0_1 : label is "fifo_4kx8_ecp3.lpc"; - attribute MEM_INIT_FILE of pdp_ram_0_0_1 : label is ""; - attribute RESETMODE of pdp_ram_0_0_1 : label is "SYNC"; - attribute MEM_LPC_FILE of pdp_ram_0_1_0 : label is "fifo_4kx8_ecp3.lpc"; - attribute MEM_INIT_FILE of pdp_ram_0_1_0 : label is ""; - attribute RESETMODE of pdp_ram_0_1_0 : label is "SYNC"; - 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; - attribute NGD_DRC_MASK : integer; - attribute NGD_DRC_MASK of Structure : architecture is 1; - -begin - -- component instantiation statements - AND2_t26: AND2 - port map (A=>WrEn, B=>invout_1, Z=>wren_i); - - INV_1: INV - port map (A=>full_i, Z=>invout_1); - - AND2_t25: AND2 - port map (A=>RdEn, B=>invout_0, Z=>rden_i); - - INV_0: INV - port map (A=>empty_i, Z=>invout_0); - - OR2_t24: OR2 - port map (A=>Reset, B=>RPReset, Z=>rRst); - - XOR2_t23: XOR2 - port map (A=>wcount_0, B=>wcount_1, Z=>w_gdata_0); - - XOR2_t22: XOR2 - port map (A=>wcount_1, B=>wcount_2, Z=>w_gdata_1); - - XOR2_t21: XOR2 - port map (A=>wcount_2, B=>wcount_3, Z=>w_gdata_2); - - XOR2_t20: XOR2 - port map (A=>wcount_3, B=>wcount_4, Z=>w_gdata_3); - - XOR2_t19: XOR2 - port map (A=>wcount_4, B=>wcount_5, Z=>w_gdata_4); - - XOR2_t18: XOR2 - port map (A=>wcount_5, B=>wcount_6, Z=>w_gdata_5); - - XOR2_t17: XOR2 - port map (A=>wcount_6, B=>wcount_7, Z=>w_gdata_6); - - XOR2_t16: XOR2 - port map (A=>wcount_7, B=>wcount_8, Z=>w_gdata_7); - - XOR2_t15: XOR2 - port map (A=>wcount_8, B=>wcount_9, Z=>w_gdata_8); - - XOR2_t14: XOR2 - port map (A=>wcount_9, B=>wcount_10, Z=>w_gdata_9); - - XOR2_t13: XOR2 - port map (A=>wcount_10, B=>wcount_11, Z=>w_gdata_10); - - XOR2_t12: XOR2 - port map (A=>wcount_11, B=>wcount_12, Z=>w_gdata_11); - - XOR2_t11: XOR2 - port map (A=>rcount_0, B=>rcount_1, Z=>r_gdata_0); - - XOR2_t10: XOR2 - port map (A=>rcount_1, B=>rcount_2, Z=>r_gdata_1); - - XOR2_t9: XOR2 - port map (A=>rcount_2, B=>rcount_3, Z=>r_gdata_2); - - XOR2_t8: XOR2 - port map (A=>rcount_3, B=>rcount_4, Z=>r_gdata_3); - - XOR2_t7: XOR2 - port map (A=>rcount_4, B=>rcount_5, Z=>r_gdata_4); - - XOR2_t6: XOR2 - port map (A=>rcount_5, B=>rcount_6, Z=>r_gdata_5); - - XOR2_t5: XOR2 - port map (A=>rcount_6, B=>rcount_7, Z=>r_gdata_6); - - XOR2_t4: XOR2 - port map (A=>rcount_7, B=>rcount_8, Z=>r_gdata_7); - - XOR2_t3: XOR2 - port map (A=>rcount_8, B=>rcount_9, Z=>r_gdata_8); - - XOR2_t2: XOR2 - port map (A=>rcount_9, B=>rcount_10, Z=>r_gdata_9); - - XOR2_t1: XOR2 - port map (A=>rcount_10, B=>rcount_11, Z=>r_gdata_10); - - XOR2_t0: XOR2 - port map (A=>rcount_11, B=>rcount_12, Z=>r_gdata_11); - - LUT4_33: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r29, AD2=>w_gcount_r210, - AD1=>w_gcount_r211, AD0=>w_gcount_r212, - DO0=>w_g2b_xor_cluster_0); - - LUT4_32: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r25, AD2=>w_gcount_r26, - AD1=>w_gcount_r27, AD0=>w_gcount_r28, - DO0=>w_g2b_xor_cluster_1); - - LUT4_31: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r21, AD2=>w_gcount_r22, - AD1=>w_gcount_r23, AD0=>w_gcount_r24, - DO0=>w_g2b_xor_cluster_2); - - LUT4_30: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r211, AD2=>w_gcount_r212, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>wcount_r11); - - LUT4_29: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r210, AD2=>w_gcount_r211, - AD1=>w_gcount_r212, AD0=>scuba_vlo, DO0=>wcount_r10); - - LUT4_28: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r28, AD2=>w_gcount_r29, - AD1=>w_gcount_r210, AD0=>wcount_r11, DO0=>wcount_r8); - - LUT4_27: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r27, AD2=>w_gcount_r28, - AD1=>w_gcount_r29, AD0=>wcount_r10, DO0=>wcount_r7); - - LUT4_26: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r26, AD2=>w_gcount_r27, - AD1=>w_gcount_r28, AD0=>w_g2b_xor_cluster_0, DO0=>wcount_r6); - - LUT4_25: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>wcount_r5); - - LUT4_24: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r24, AD0=>scuba_vlo, DO0=>wcount_r4); - - LUT4_23: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r23, AD0=>w_gcount_r24, DO0=>wcount_r3); - - LUT4_22: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r22, AD2=>w_gcount_r23, - AD1=>w_gcount_r24, AD0=>scuba_vlo, - DO0=>w_g2b_xor_cluster_2_1); - - LUT4_21: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_g2b_xor_cluster_2_1, AD0=>scuba_vlo, DO0=>wcount_r2); - - LUT4_20: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_g2b_xor_cluster_2, AD0=>scuba_vlo, DO0=>wcount_r1); - - LUT4_19: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_g2b_xor_cluster_2, AD0=>w_gcount_r20, DO0=>wcount_r0); - - LUT4_18: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w29, AD2=>r_gcount_w210, - AD1=>r_gcount_w211, AD0=>r_gcount_w212, - DO0=>r_g2b_xor_cluster_0); - - LUT4_17: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w25, AD2=>r_gcount_w26, - AD1=>r_gcount_w27, AD0=>r_gcount_w28, - DO0=>r_g2b_xor_cluster_1); - - LUT4_16: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w21, AD2=>r_gcount_w22, - AD1=>r_gcount_w23, AD0=>r_gcount_w24, - DO0=>r_g2b_xor_cluster_2); - - LUT4_15: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w211, AD2=>r_gcount_w212, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>rcount_w11); - - LUT4_14: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w210, AD2=>r_gcount_w211, - AD1=>r_gcount_w212, AD0=>scuba_vlo, DO0=>rcount_w10); - - LUT4_13: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w28, AD2=>r_gcount_w29, - AD1=>r_gcount_w210, AD0=>rcount_w11, DO0=>rcount_w8); - - LUT4_12: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w27, AD2=>r_gcount_w28, - AD1=>r_gcount_w29, AD0=>rcount_w10, DO0=>rcount_w7); - - LUT4_11: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w26, AD2=>r_gcount_w27, - AD1=>r_gcount_w28, AD0=>r_g2b_xor_cluster_0, DO0=>rcount_w6); - - LUT4_10: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>rcount_w5); - - LUT4_9: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w24, AD0=>scuba_vlo, DO0=>rcount_w4); - - LUT4_8: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w23, AD0=>r_gcount_w24, DO0=>rcount_w3); - - LUT4_7: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w22, AD2=>r_gcount_w23, - AD1=>r_gcount_w24, AD0=>scuba_vlo, - DO0=>r_g2b_xor_cluster_2_1); - - LUT4_6: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2_1, AD0=>scuba_vlo, DO0=>rcount_w2); - - LUT4_5: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2, AD0=>scuba_vlo, DO0=>rcount_w1); - - LUT4_4: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2, AD0=>r_gcount_w20, DO0=>rcount_w0); - - LUT4_3: ROM16X1A - generic map (initval=> X"0410") - port map (AD3=>rptr_12, AD2=>rcount_12, AD1=>w_gcount_r212, - AD0=>scuba_vlo, DO0=>empty_cmp_set); - - LUT4_2: ROM16X1A - generic map (initval=> X"1004") - port map (AD3=>rptr_12, AD2=>rcount_12, AD1=>w_gcount_r212, - AD0=>scuba_vlo, DO0=>empty_cmp_clr); - - LUT4_1: ROM16X1A - generic map (initval=> X"0140") - port map (AD3=>wptr_12, AD2=>wcount_12, AD1=>r_gcount_w212, - AD0=>scuba_vlo, DO0=>full_cmp_set); - - LUT4_0: ROM16X1A - generic map (initval=> X"4001") - port map (AD3=>wptr_12, AD2=>wcount_12, AD1=>r_gcount_w212, - AD0=>scuba_vlo, DO0=>full_cmp_clr); - - pdp_ram_0_0_1: DP16KC - generic map (CSDECODE_B=> "0b000", CSDECODE_A=> "0b000", - WRITEMODE_B=> "NORMAL", WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", - REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=> 4, - DATA_WIDTH_A=> 4) - port map (DIA0=>Data(0), DIA1=>Data(1), DIA2=>Data(2), - DIA3=>Data(3), DIA4=>scuba_vlo, DIA5=>scuba_vlo, - DIA6=>scuba_vlo, DIA7=>scuba_vlo, DIA8=>scuba_vlo, - 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=>wptr_0, ADA3=>wptr_1, - ADA4=>wptr_2, ADA5=>wptr_3, ADA6=>wptr_4, ADA7=>wptr_5, - ADA8=>wptr_6, ADA9=>wptr_7, ADA10=>wptr_8, ADA11=>wptr_9, - ADA12=>wptr_10, ADA13=>wptr_11, CEA=>wren_i, CLKA=>WrClock, - OCEA=>wren_i, 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=>rptr_0, ADB3=>rptr_1, - ADB4=>rptr_2, ADB5=>rptr_3, ADB6=>rptr_4, ADB7=>rptr_5, - ADB8=>rptr_6, ADB9=>rptr_7, ADB10=>rptr_8, ADB11=>rptr_9, - ADB12=>rptr_10, ADB13=>rptr_11, CEB=>rden_i, CLKB=>RdClock, - OCEB=>rden_i, 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=>open, DOB5=>open, - DOB6=>open, DOB7=>open, DOB8=>open, DOB9=>open, DOB10=>open, - DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, - DOB15=>open, DOB16=>open, DOB17=>open); - - pdp_ram_0_1_0: DP16KC - generic map (CSDECODE_B=> "0b000", CSDECODE_A=> "0b000", - WRITEMODE_B=> "NORMAL", WRITEMODE_A=> "NORMAL", GSR=> "DISABLED", - REGMODE_B=> "NOREG", REGMODE_A=> "NOREG", DATA_WIDTH_B=> 4, - DATA_WIDTH_A=> 4) - port map (DIA0=>Data(4), DIA1=>Data(5), DIA2=>Data(6), - DIA3=>Data(7), DIA4=>scuba_vlo, DIA5=>scuba_vlo, - DIA6=>scuba_vlo, DIA7=>scuba_vlo, DIA8=>scuba_vlo, - 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=>wptr_0, ADA3=>wptr_1, - ADA4=>wptr_2, ADA5=>wptr_3, ADA6=>wptr_4, ADA7=>wptr_5, - ADA8=>wptr_6, ADA9=>wptr_7, ADA10=>wptr_8, ADA11=>wptr_9, - ADA12=>wptr_10, ADA13=>wptr_11, CEA=>wren_i, CLKA=>WrClock, - OCEA=>wren_i, 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=>rptr_0, ADB3=>rptr_1, - ADB4=>rptr_2, ADB5=>rptr_3, ADB6=>rptr_4, ADB7=>rptr_5, - ADB8=>rptr_6, ADB9=>rptr_7, ADB10=>rptr_8, ADB11=>rptr_9, - ADB12=>rptr_10, ADB13=>rptr_11, CEB=>rden_i, CLKB=>RdClock, - OCEB=>rden_i, 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(4), - DOB1=>Q(5), DOB2=>Q(6), DOB3=>Q(7), DOB4=>open, DOB5=>open, - DOB6=>open, DOB7=>open, DOB8=>open, DOB9=>open, DOB10=>open, - DOB11=>open, DOB12=>open, DOB13=>open, DOB14=>open, - DOB15=>open, DOB16=>open, DOB17=>open); - - FF_131: FD1P3BX - port map (D=>iwcount_0, SP=>wren_i, CK=>WrClock, PD=>Reset, - Q=>wcount_0); - - FF_130: FD1P3DX - port map (D=>iwcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_1); - - FF_129: FD1P3DX - port map (D=>iwcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_2); - - FF_128: FD1P3DX - port map (D=>iwcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_3); - - FF_127: FD1P3DX - port map (D=>iwcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_4); - - FF_126: FD1P3DX - port map (D=>iwcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_5); - - FF_125: FD1P3DX - port map (D=>iwcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_6); - - FF_124: FD1P3DX - port map (D=>iwcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_7); - - FF_123: FD1P3DX - port map (D=>iwcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_8); - - FF_122: FD1P3DX - port map (D=>iwcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_9); - - FF_121: FD1P3DX - port map (D=>iwcount_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_10); - - FF_120: FD1P3DX - port map (D=>iwcount_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_11); - - FF_119: FD1P3DX - port map (D=>iwcount_12, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_12); - - FF_118: FD1P3DX - port map (D=>w_gdata_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_0); - - FF_117: FD1P3DX - port map (D=>w_gdata_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_1); - - FF_116: FD1P3DX - port map (D=>w_gdata_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_2); - - FF_115: FD1P3DX - port map (D=>w_gdata_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_3); - - FF_114: FD1P3DX - port map (D=>w_gdata_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_4); - - FF_113: FD1P3DX - port map (D=>w_gdata_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_5); - - FF_112: FD1P3DX - port map (D=>w_gdata_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_6); - - FF_111: FD1P3DX - port map (D=>w_gdata_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_7); - - FF_110: FD1P3DX - port map (D=>w_gdata_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_8); - - FF_109: FD1P3DX - port map (D=>w_gdata_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_9); - - FF_108: FD1P3DX - port map (D=>w_gdata_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_10); - - FF_107: FD1P3DX - port map (D=>w_gdata_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_11); - - FF_106: FD1P3DX - port map (D=>wcount_12, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_12); - - FF_105: FD1P3DX - port map (D=>wcount_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_0); - - FF_104: FD1P3DX - port map (D=>wcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_1); - - FF_103: FD1P3DX - port map (D=>wcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_2); - - FF_102: FD1P3DX - port map (D=>wcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_3); - - FF_101: FD1P3DX - port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_4); - - FF_100: FD1P3DX - port map (D=>wcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_5); - - FF_99: FD1P3DX - port map (D=>wcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_6); - - FF_98: FD1P3DX - port map (D=>wcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_7); - - FF_97: FD1P3DX - port map (D=>wcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_8); - - FF_96: FD1P3DX - port map (D=>wcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_9); - - FF_95: FD1P3DX - port map (D=>wcount_10, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_10); - - FF_94: FD1P3DX - port map (D=>wcount_11, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_11); - - FF_93: FD1P3DX - port map (D=>wcount_12, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_12); - - FF_92: FD1P3BX - port map (D=>ircount_0, SP=>rden_i, CK=>RdClock, PD=>rRst, - Q=>rcount_0); - - FF_91: FD1P3DX - port map (D=>ircount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_1); - - FF_90: FD1P3DX - port map (D=>ircount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_2); - - FF_89: FD1P3DX - port map (D=>ircount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_3); - - FF_88: FD1P3DX - port map (D=>ircount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_4); - - FF_87: FD1P3DX - port map (D=>ircount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_5); - - FF_86: FD1P3DX - port map (D=>ircount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_6); - - FF_85: FD1P3DX - port map (D=>ircount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_7); - - FF_84: FD1P3DX - port map (D=>ircount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_8); - - FF_83: FD1P3DX - port map (D=>ircount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_9); - - FF_82: FD1P3DX - port map (D=>ircount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_10); - - FF_81: FD1P3DX - port map (D=>ircount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_11); - - FF_80: FD1P3DX - port map (D=>ircount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_12); - - FF_79: FD1P3DX - port map (D=>r_gdata_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_0); - - FF_78: FD1P3DX - port map (D=>r_gdata_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_1); - - FF_77: FD1P3DX - port map (D=>r_gdata_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_2); - - FF_76: FD1P3DX - port map (D=>r_gdata_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_3); - - FF_75: FD1P3DX - port map (D=>r_gdata_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_4); - - FF_74: FD1P3DX - port map (D=>r_gdata_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_5); - - FF_73: FD1P3DX - port map (D=>r_gdata_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_6); - - FF_72: FD1P3DX - port map (D=>r_gdata_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_7); - - FF_71: FD1P3DX - port map (D=>r_gdata_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_8); - - FF_70: FD1P3DX - port map (D=>r_gdata_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_9); - - FF_69: FD1P3DX - port map (D=>r_gdata_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_10); - - FF_68: FD1P3DX - port map (D=>r_gdata_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_11); - - FF_67: FD1P3DX - port map (D=>rcount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_12); - - FF_66: FD1P3DX - port map (D=>rcount_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_0); - - FF_65: FD1P3DX - port map (D=>rcount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_1); - - FF_64: FD1P3DX - port map (D=>rcount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_2); - - FF_63: FD1P3DX - port map (D=>rcount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_3); - - FF_62: FD1P3DX - port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_4); - - FF_61: FD1P3DX - port map (D=>rcount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_5); - - FF_60: FD1P3DX - port map (D=>rcount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_6); - - FF_59: FD1P3DX - port map (D=>rcount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_7); - - FF_58: FD1P3DX - port map (D=>rcount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_8); - - FF_57: FD1P3DX - port map (D=>rcount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_9); - - FF_56: FD1P3DX - port map (D=>rcount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_10); - - FF_55: FD1P3DX - port map (D=>rcount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_11); - - FF_54: FD1P3DX - port map (D=>rcount_12, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_12); - - FF_53: FD1S3DX - port map (D=>w_gcount_0, CK=>RdClock, CD=>Reset, Q=>w_gcount_r0); - - FF_52: FD1S3DX - port map (D=>w_gcount_1, CK=>RdClock, CD=>Reset, Q=>w_gcount_r1); - - FF_51: FD1S3DX - port map (D=>w_gcount_2, CK=>RdClock, CD=>Reset, Q=>w_gcount_r2); - - FF_50: FD1S3DX - port map (D=>w_gcount_3, CK=>RdClock, CD=>Reset, Q=>w_gcount_r3); - - FF_49: FD1S3DX - port map (D=>w_gcount_4, CK=>RdClock, CD=>Reset, Q=>w_gcount_r4); - - FF_48: FD1S3DX - port map (D=>w_gcount_5, CK=>RdClock, CD=>Reset, Q=>w_gcount_r5); - - FF_47: FD1S3DX - port map (D=>w_gcount_6, CK=>RdClock, CD=>Reset, Q=>w_gcount_r6); - - FF_46: FD1S3DX - port map (D=>w_gcount_7, CK=>RdClock, CD=>Reset, Q=>w_gcount_r7); - - FF_45: FD1S3DX - port map (D=>w_gcount_8, CK=>RdClock, CD=>Reset, Q=>w_gcount_r8); - - FF_44: FD1S3DX - port map (D=>w_gcount_9, CK=>RdClock, CD=>Reset, Q=>w_gcount_r9); - - FF_43: FD1S3DX - port map (D=>w_gcount_10, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r10); - - FF_42: FD1S3DX - port map (D=>w_gcount_11, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r11); - - FF_41: FD1S3DX - port map (D=>w_gcount_12, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r12); - - FF_40: FD1S3DX - port map (D=>r_gcount_0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w0); - - FF_39: FD1S3DX - port map (D=>r_gcount_1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w1); - - FF_38: FD1S3DX - port map (D=>r_gcount_2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w2); - - FF_37: FD1S3DX - port map (D=>r_gcount_3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w3); - - FF_36: FD1S3DX - port map (D=>r_gcount_4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w4); - - FF_35: FD1S3DX - port map (D=>r_gcount_5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w5); - - FF_34: FD1S3DX - port map (D=>r_gcount_6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w6); - - FF_33: FD1S3DX - port map (D=>r_gcount_7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w7); - - FF_32: FD1S3DX - port map (D=>r_gcount_8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w8); - - FF_31: FD1S3DX - port map (D=>r_gcount_9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w9); - - FF_30: FD1S3DX - port map (D=>r_gcount_10, CK=>WrClock, CD=>rRst, Q=>r_gcount_w10); - - FF_29: FD1S3DX - port map (D=>r_gcount_11, CK=>WrClock, CD=>rRst, Q=>r_gcount_w11); - - FF_28: FD1S3DX - port map (D=>r_gcount_12, CK=>WrClock, CD=>rRst, Q=>r_gcount_w12); - - FF_27: FD1S3DX - port map (D=>w_gcount_r0, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r20); - - FF_26: FD1S3DX - port map (D=>w_gcount_r1, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r21); - - FF_25: FD1S3DX - port map (D=>w_gcount_r2, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r22); - - FF_24: FD1S3DX - port map (D=>w_gcount_r3, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r23); - - FF_23: FD1S3DX - port map (D=>w_gcount_r4, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r24); - - FF_22: FD1S3DX - port map (D=>w_gcount_r5, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r25); - - FF_21: FD1S3DX - port map (D=>w_gcount_r6, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r26); - - FF_20: FD1S3DX - port map (D=>w_gcount_r7, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r27); - - FF_19: FD1S3DX - port map (D=>w_gcount_r8, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r28); - - FF_18: FD1S3DX - port map (D=>w_gcount_r9, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r29); - - FF_17: FD1S3DX - port map (D=>w_gcount_r10, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r210); - - FF_16: FD1S3DX - port map (D=>w_gcount_r11, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r211); - - FF_15: FD1S3DX - port map (D=>w_gcount_r12, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r212); - - FF_14: FD1S3DX - port map (D=>r_gcount_w0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w20); - - FF_13: FD1S3DX - port map (D=>r_gcount_w1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w21); - - FF_12: FD1S3DX - port map (D=>r_gcount_w2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w22); - - FF_11: FD1S3DX - port map (D=>r_gcount_w3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w23); - - FF_10: FD1S3DX - port map (D=>r_gcount_w4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w24); - - FF_9: FD1S3DX - port map (D=>r_gcount_w5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w25); - - FF_8: FD1S3DX - port map (D=>r_gcount_w6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w26); - - FF_7: FD1S3DX - port map (D=>r_gcount_w7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w27); - - FF_6: FD1S3DX - port map (D=>r_gcount_w8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w28); - - FF_5: FD1S3DX - port map (D=>r_gcount_w9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w29); - - FF_4: FD1S3DX - port map (D=>r_gcount_w10, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w210); - - FF_3: FD1S3DX - port map (D=>r_gcount_w11, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w211); - - FF_2: FD1S3DX - port map (D=>r_gcount_w12, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w212); - - FF_1: FD1S3BX - port map (D=>empty_d, CK=>RdClock, PD=>rRst, Q=>empty_i); - - FF_0: FD1S3DX - 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=>wcount_9, CO=>co4, - NC0=>iwcount_8, NC1=>iwcount_9); - - w_gctr_5: CU2 - port map (CI=>co4, PC0=>wcount_10, PC1=>wcount_11, CO=>co5, - NC0=>iwcount_10, NC1=>iwcount_11); - - w_gctr_6: CU2 - port map (CI=>co5, PC0=>wcount_12, PC1=>scuba_vlo, CO=>co6, - NC0=>iwcount_12, 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=>rcount_9, CO=>co4_1, - NC0=>ircount_8, NC1=>ircount_9); - - r_gctr_5: CU2 - port map (CI=>co4_1, PC0=>rcount_10, PC1=>rcount_11, CO=>co5_1, - NC0=>ircount_10, NC1=>ircount_11); - - r_gctr_6: CU2 - port map (CI=>co5_1, PC0=>rcount_12, PC1=>scuba_vlo, CO=>co6_1, - NC0=>ircount_12, 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=>wcount_r5, 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=>rcount_8, A1=>rcount_9, B0=>wcount_r8, - B1=>w_g2b_xor_cluster_0, CI=>co3_2, GE=>co4_2); - - empty_cmp_5: AGEB2 - port map (A0=>rcount_10, A1=>rcount_11, B0=>wcount_r10, - B1=>wcount_r11, CI=>co4_2, GE=>co5_2); - - empty_cmp_6: AGEB2 - port map (A0=>empty_cmp_set, A1=>scuba_vlo, B0=>empty_cmp_clr, - B1=>scuba_vlo, CI=>co5_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=>rcount_w5, 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=>wcount_8, A1=>wcount_9, B0=>rcount_w8, - B1=>r_g2b_xor_cluster_0, CI=>co3_3, GE=>co4_3); - - full_cmp_5: AGEB2 - port map (A0=>wcount_10, A1=>wcount_11, B0=>rcount_w10, - B1=>rcount_w11, CI=>co4_3, GE=>co5_3); - - full_cmp_6: AGEB2 - port map (A0=>full_cmp_set, A1=>scuba_vlo, B0=>full_cmp_clr, - B1=>scuba_vlo, CI=>co5_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 ecp3; -configuration Structure_CON of fifo_4kx8_ecp3 is - for Structure - for all:AGEB2 use entity ecp3.AGEB2(V); end for; - for all:AND2 use entity ecp3.AND2(V); end for; - for all:CU2 use entity ecp3.CU2(V); end for; - for all:FADD2B use entity ecp3.FADD2B(V); end for; - for all:FD1P3BX use entity ecp3.FD1P3BX(V); end for; - for all:FD1P3DX use entity ecp3.FD1P3DX(V); end for; - for all:FD1S3BX use entity ecp3.FD1S3BX(V); end for; - for all:FD1S3DX use entity ecp3.FD1S3DX(V); end for; - for all:INV use entity ecp3.INV(V); end for; - for all:OR2 use entity ecp3.OR2(V); end for; - for all:ROM16X1A use entity ecp3.ROM16X1A(V); end for; - for all:VHI use entity ecp3.VHI(V); end for; - for all:VLO use entity ecp3.VLO(V); end for; - for all:XOR2 use entity ecp3.XOR2(V); end for; - for all:DP16KC use entity ecp3.DP16KC(V); end for; - end for; -end Structure_CON; - --- synopsys translate_on diff --git a/gbe2_ecp3/ipcores_ecp3/fifo_512x32x8.vhd b/gbe2_ecp3/ipcores_ecp3/fifo_512x32x8.vhd deleted file mode 100644 index fef9988..0000000 --- a/gbe2_ecp3/ipcores_ecp3/fifo_512x32x8.vhd +++ /dev/null @@ -1,1298 +0,0 @@ --- VHDL netlist generated by SCUBA Diamond_2.1_Production (100) --- Module Version: 5.4 ---/home/soft/lattice/diamond/2.1_x64/ispfpga/bin/lin64/scuba -w -lang vhdl -synth synplify -bus_exp 7 -bb -arch ep5c00 -type ebfifo -depth 512 -width 32 -depth 512 -rdata_width 8 -no_enable -pe -1 -pf -1 -e - --- Tue Jun 11 11:02:45 2013 - -library IEEE; -use IEEE.std_logic_1164.all; --- synopsys translate_off -library ecp3; -use ecp3.components.all; --- synopsys translate_on - -entity fifo_512x32x8 is - port ( - Data: in std_logic_vector(31 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(7 downto 0); - Empty: out std_logic; - Full: out std_logic); -end fifo_512x32x8; - -architecture Structure of fifo_512x32x8 is - - -- internal signal declarations - signal invout_1: std_logic; - signal invout_0: std_logic; - signal w_g2b_xor_cluster_1: std_logic; - signal rcount_w1: std_logic; - signal r_g2b_xor_cluster_2_1: std_logic; - signal rcount_w0: std_logic; - signal r_g2b_xor_cluster_2: 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 w_gdata_8: 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 wptr_9: 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 r_gdata_8: std_logic; - signal r_gdata_9: std_logic; - signal r_gdata_10: 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 rptr_9: std_logic; - signal rptr_10: std_logic; - signal rptr_11: 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 w_gcount_9: 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 r_gcount_9: std_logic; - signal r_gcount_10: std_logic; - signal r_gcount_11: 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 w_gcount_r29: std_logic; - signal w_gcount_r9: 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 r_gcount_w29: std_logic; - signal r_gcount_w9: std_logic; - signal r_gcount_w210: std_logic; - signal r_gcount_w10: std_logic; - signal r_gcount_w211: std_logic; - signal r_gcount_w11: 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 iwcount_9: std_logic; - signal co4: std_logic; - signal wcount_9: 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 ircount_9: std_logic; - signal co3_1: std_logic; - signal ircount_10: std_logic; - signal ircount_11: std_logic; - signal co5: std_logic; - signal rcount_11: std_logic; - signal co4_1: std_logic; - signal rden_i: std_logic; - signal cmp_ci: std_logic; - signal rcount_0: std_logic; - signal rcount_1: std_logic; - signal co0_2: std_logic; - signal wcount_r0: std_logic; - signal wcount_r1: std_logic; - signal rcount_2: std_logic; - signal rcount_3: std_logic; - signal co1_2: std_logic; - signal wcount_r2: std_logic; - signal wcount_r3: std_logic; - signal rcount_4: std_logic; - signal rcount_5: std_logic; - signal co2_2: std_logic; - signal wcount_r4: std_logic; - signal wcount_r5: std_logic; - signal rcount_6: std_logic; - signal rcount_7: std_logic; - signal co3_2: std_logic; - signal w_g2b_xor_cluster_0: std_logic; - signal wcount_r7: std_logic; - signal rcount_8: std_logic; - signal rcount_9: std_logic; - signal co4_2: std_logic; - signal wcount_r8: std_logic; - signal empty_cmp_clr: std_logic; - signal rcount_10: 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_w2: std_logic; - signal rcount_w3: std_logic; - signal wcount_0: std_logic; - signal wcount_1: std_logic; - signal co0_3: std_logic; - signal rcount_w4: std_logic; - signal rcount_w5: std_logic; - signal wcount_2: std_logic; - signal wcount_3: std_logic; - signal co1_3: std_logic; - signal rcount_w6: std_logic; - signal rcount_w7: std_logic; - signal wcount_4: std_logic; - signal wcount_5: std_logic; - signal co2_3: std_logic; - signal r_g2b_xor_cluster_0: std_logic; - signal rcount_w9: std_logic; - signal wcount_6: std_logic; - signal wcount_7: std_logic; - signal co3_3: std_logic; - signal rcount_w10: std_logic; - signal full_cmp_clr: std_logic; - signal wcount_8: 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 - 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 - 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 - port (D: in std_logic; CK: in std_logic; PD: in std_logic; - Q: out std_logic); - end component; - component FD1S3DX - 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 ROM16X1A - generic (INITVAL : in std_logic_vector(15 downto 0)); - 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 PDPW16KC - generic (GSR : in String; CSDECODE_R : in String; - CSDECODE_W : in String; REGMODE : in String; - DATA_WIDTH_R : in Integer; DATA_WIDTH_W : in Integer); - 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 MEM_LPC_FILE : string; - attribute MEM_INIT_FILE : string; - attribute RESETMODE : string; - attribute GSR : string; - attribute MEM_LPC_FILE of pdp_ram_0_0_0 : label is "fifo_512x32x8.lpc"; - attribute MEM_INIT_FILE of pdp_ram_0_0_0 : label is ""; - attribute RESETMODE of pdp_ram_0_0_0 : label is "SYNC"; - 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; - attribute NGD_DRC_MASK : integer; - attribute NGD_DRC_MASK of Structure : architecture is 1; - -begin - -- component instantiation statements - AND2_t22: AND2 - port map (A=>WrEn, B=>invout_1, Z=>wren_i); - - INV_1: INV - port map (A=>full_i, Z=>invout_1); - - AND2_t21: AND2 - port map (A=>RdEn, B=>invout_0, Z=>rden_i); - - INV_0: INV - port map (A=>empty_i, Z=>invout_0); - - OR2_t20: OR2 - port map (A=>Reset, B=>RPReset, Z=>rRst); - - XOR2_t19: XOR2 - port map (A=>wcount_0, B=>wcount_1, Z=>w_gdata_0); - - XOR2_t18: XOR2 - port map (A=>wcount_1, B=>wcount_2, Z=>w_gdata_1); - - XOR2_t17: XOR2 - port map (A=>wcount_2, B=>wcount_3, Z=>w_gdata_2); - - XOR2_t16: XOR2 - port map (A=>wcount_3, B=>wcount_4, Z=>w_gdata_3); - - XOR2_t15: XOR2 - port map (A=>wcount_4, B=>wcount_5, Z=>w_gdata_4); - - XOR2_t14: XOR2 - port map (A=>wcount_5, B=>wcount_6, Z=>w_gdata_5); - - XOR2_t13: XOR2 - port map (A=>wcount_6, B=>wcount_7, Z=>w_gdata_6); - - XOR2_t12: XOR2 - port map (A=>wcount_7, B=>wcount_8, Z=>w_gdata_7); - - XOR2_t11: XOR2 - port map (A=>wcount_8, B=>wcount_9, Z=>w_gdata_8); - - XOR2_t10: XOR2 - port map (A=>rcount_0, B=>rcount_1, Z=>r_gdata_0); - - XOR2_t9: XOR2 - port map (A=>rcount_1, B=>rcount_2, Z=>r_gdata_1); - - XOR2_t8: XOR2 - port map (A=>rcount_2, B=>rcount_3, Z=>r_gdata_2); - - XOR2_t7: XOR2 - port map (A=>rcount_3, B=>rcount_4, Z=>r_gdata_3); - - XOR2_t6: XOR2 - port map (A=>rcount_4, B=>rcount_5, Z=>r_gdata_4); - - XOR2_t5: XOR2 - port map (A=>rcount_5, B=>rcount_6, Z=>r_gdata_5); - - XOR2_t4: XOR2 - port map (A=>rcount_6, B=>rcount_7, Z=>r_gdata_6); - - XOR2_t3: XOR2 - port map (A=>rcount_7, B=>rcount_8, Z=>r_gdata_7); - - XOR2_t2: XOR2 - port map (A=>rcount_8, B=>rcount_9, Z=>r_gdata_8); - - XOR2_t1: XOR2 - port map (A=>rcount_9, B=>rcount_10, Z=>r_gdata_9); - - XOR2_t0: XOR2 - port map (A=>rcount_10, B=>rcount_11, Z=>r_gdata_10); - - LUT4_27: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r26, AD2=>w_gcount_r27, - AD1=>w_gcount_r28, AD0=>w_gcount_r29, - DO0=>w_g2b_xor_cluster_0); - - LUT4_26: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r22, AD2=>w_gcount_r23, - AD1=>w_gcount_r24, AD0=>w_gcount_r25, - DO0=>w_g2b_xor_cluster_1); - - LUT4_25: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r28, AD2=>w_gcount_r29, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>wcount_r8); - - LUT4_24: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r27, AD2=>w_gcount_r28, - AD1=>w_gcount_r29, AD0=>scuba_vlo, DO0=>wcount_r7); - - LUT4_23: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r25, AD2=>w_gcount_r26, - AD1=>w_gcount_r27, AD0=>wcount_r8, DO0=>wcount_r5); - - LUT4_22: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r24, AD2=>w_gcount_r25, - AD1=>w_gcount_r26, AD0=>wcount_r7, DO0=>wcount_r4); - - LUT4_21: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_gcount_r23, AD2=>w_gcount_r24, - AD1=>w_gcount_r25, AD0=>w_g2b_xor_cluster_0, DO0=>wcount_r3); - - LUT4_20: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>wcount_r2); - - LUT4_19: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r21, AD0=>scuba_vlo, DO0=>wcount_r1); - - LUT4_18: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>w_g2b_xor_cluster_0, AD2=>w_g2b_xor_cluster_1, - AD1=>w_gcount_r20, AD0=>w_gcount_r21, DO0=>wcount_r0); - - LUT4_17: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w28, AD2=>r_gcount_w29, - AD1=>r_gcount_w210, AD0=>r_gcount_w211, - DO0=>r_g2b_xor_cluster_0); - - LUT4_16: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w24, AD2=>r_gcount_w25, - AD1=>r_gcount_w26, AD0=>r_gcount_w27, - DO0=>r_g2b_xor_cluster_1); - - LUT4_15: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w20, AD2=>r_gcount_w21, - AD1=>r_gcount_w22, AD0=>r_gcount_w23, - DO0=>r_g2b_xor_cluster_2); - - LUT4_14: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w210, AD2=>r_gcount_w211, AD1=>scuba_vlo, - AD0=>scuba_vlo, DO0=>rcount_w10); - - LUT4_13: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w29, AD2=>r_gcount_w210, - AD1=>r_gcount_w211, AD0=>scuba_vlo, DO0=>rcount_w9); - - LUT4_12: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w27, AD2=>r_gcount_w28, - AD1=>r_gcount_w29, AD0=>rcount_w10, DO0=>rcount_w7); - - LUT4_11: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w26, AD2=>r_gcount_w27, - AD1=>r_gcount_w28, AD0=>rcount_w9, DO0=>rcount_w6); - - LUT4_10: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w25, AD2=>r_gcount_w26, - AD1=>r_gcount_w27, AD0=>r_g2b_xor_cluster_0, DO0=>rcount_w5); - - LUT4_9: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>scuba_vlo, AD0=>scuba_vlo, DO0=>rcount_w4); - - LUT4_8: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w23, AD0=>scuba_vlo, DO0=>rcount_w3); - - LUT4_7: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_gcount_w22, AD0=>r_gcount_w23, DO0=>rcount_w2); - - LUT4_6: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_gcount_w21, AD2=>r_gcount_w22, - AD1=>r_gcount_w23, AD0=>scuba_vlo, - DO0=>r_g2b_xor_cluster_2_1); - - LUT4_5: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2_1, AD0=>scuba_vlo, DO0=>rcount_w1); - - LUT4_4: ROM16X1A - generic map (initval=> X"6996") - port map (AD3=>r_g2b_xor_cluster_0, AD2=>r_g2b_xor_cluster_1, - AD1=>r_g2b_xor_cluster_2, AD0=>scuba_vlo, DO0=>rcount_w0); - - LUT4_3: ROM16X1A - generic map (initval=> X"0410") - port map (AD3=>rptr_11, AD2=>rcount_11, AD1=>w_gcount_r29, - AD0=>scuba_vlo, DO0=>empty_cmp_set); - - LUT4_2: ROM16X1A - generic map (initval=> X"1004") - port map (AD3=>rptr_11, AD2=>rcount_11, AD1=>w_gcount_r29, - AD0=>scuba_vlo, DO0=>empty_cmp_clr); - - LUT4_1: ROM16X1A - generic map (initval=> X"0140") - port map (AD3=>wptr_9, AD2=>wcount_9, AD1=>r_gcount_w211, - AD0=>scuba_vlo, DO0=>full_cmp_set); - - LUT4_0: ROM16X1A - generic map (initval=> X"4001") - port map (AD3=>wptr_9, AD2=>wcount_9, AD1=>r_gcount_w211, - AD0=>scuba_vlo, DO0=>full_cmp_clr); - - pdp_ram_0_0_0: PDPW16KC - generic map (CSDECODE_R=> "0b000", CSDECODE_W=> "0b001", GSR=> "DISABLED", - REGMODE=> "NOREG", DATA_WIDTH_R=> 9, DATA_WIDTH_W=> 36) - 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=>scuba_vlo, DI9=>Data(8), DI10=>Data(9), DI11=>Data(10), - DI12=>Data(11), DI13=>Data(12), DI14=>Data(13), - DI15=>Data(14), DI16=>Data(15), DI17=>scuba_vlo, - DI18=>Data(16), DI19=>Data(17), DI20=>Data(18), - DI21=>Data(19), DI22=>Data(20), DI23=>Data(21), - DI24=>Data(22), DI25=>Data(23), DI26=>scuba_vlo, - DI27=>Data(24), DI28=>Data(25), DI29=>Data(26), - DI30=>Data(27), DI31=>Data(28), DI32=>Data(29), - DI33=>Data(30), DI34=>Data(31), 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=>wptr_8, 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=>rptr_0, ADR4=>rptr_1, - ADR5=>rptr_2, ADR6=>rptr_3, ADR7=>rptr_4, ADR8=>rptr_5, - ADR9=>rptr_6, ADR10=>rptr_7, ADR11=>rptr_8, ADR12=>rptr_9, - ADR13=>rptr_10, CER=>rden_i, CLKR=>RdClock, CSR0=>scuba_vlo, - CSR1=>scuba_vlo, CSR2=>scuba_vlo, RST=>Reset, DO0=>Q(0), - DO1=>Q(1), DO2=>Q(2), DO3=>Q(3), DO4=>Q(4), DO5=>Q(5), - DO6=>Q(6), DO7=>Q(7), DO8=>open, DO9=>open, DO10=>open, - DO11=>open, DO12=>open, DO13=>open, DO14=>open, DO15=>open, - DO16=>open, DO17=>open, DO18=>open, DO19=>open, DO20=>open, - DO21=>open, DO22=>open, DO23=>open, DO24=>open, DO25=>open, - DO26=>open, DO27=>open, DO28=>open, DO29=>open, DO30=>open, - DO31=>open, DO32=>open, DO33=>open, DO34=>open, DO35=>open); - - FF_111: FD1P3BX - port map (D=>iwcount_0, SP=>wren_i, CK=>WrClock, PD=>Reset, - Q=>wcount_0); - - FF_110: FD1P3DX - port map (D=>iwcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_1); - - FF_109: FD1P3DX - port map (D=>iwcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_2); - - FF_108: FD1P3DX - port map (D=>iwcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_3); - - FF_107: FD1P3DX - port map (D=>iwcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_4); - - FF_106: FD1P3DX - port map (D=>iwcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_5); - - FF_105: FD1P3DX - port map (D=>iwcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_6); - - FF_104: FD1P3DX - port map (D=>iwcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_7); - - FF_103: FD1P3DX - port map (D=>iwcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_8); - - FF_102: FD1P3DX - port map (D=>iwcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wcount_9); - - FF_101: FD1P3DX - port map (D=>w_gdata_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_0); - - FF_100: FD1P3DX - port map (D=>w_gdata_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_1); - - FF_99: FD1P3DX - port map (D=>w_gdata_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_2); - - FF_98: FD1P3DX - port map (D=>w_gdata_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_3); - - FF_97: FD1P3DX - port map (D=>w_gdata_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_4); - - FF_96: FD1P3DX - port map (D=>w_gdata_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_5); - - FF_95: FD1P3DX - port map (D=>w_gdata_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_6); - - FF_94: FD1P3DX - port map (D=>w_gdata_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_7); - - FF_93: FD1P3DX - port map (D=>w_gdata_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_8); - - FF_92: FD1P3DX - port map (D=>wcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>w_gcount_9); - - FF_91: FD1P3DX - port map (D=>wcount_0, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_0); - - FF_90: FD1P3DX - port map (D=>wcount_1, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_1); - - FF_89: FD1P3DX - port map (D=>wcount_2, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_2); - - FF_88: FD1P3DX - port map (D=>wcount_3, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_3); - - FF_87: FD1P3DX - port map (D=>wcount_4, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_4); - - FF_86: FD1P3DX - port map (D=>wcount_5, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_5); - - FF_85: FD1P3DX - port map (D=>wcount_6, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_6); - - FF_84: FD1P3DX - port map (D=>wcount_7, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_7); - - FF_83: FD1P3DX - port map (D=>wcount_8, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_8); - - FF_82: FD1P3DX - port map (D=>wcount_9, SP=>wren_i, CK=>WrClock, CD=>Reset, - Q=>wptr_9); - - FF_81: FD1P3BX - port map (D=>ircount_0, SP=>rden_i, CK=>RdClock, PD=>rRst, - Q=>rcount_0); - - FF_80: FD1P3DX - port map (D=>ircount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_1); - - FF_79: FD1P3DX - port map (D=>ircount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_2); - - FF_78: FD1P3DX - port map (D=>ircount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_3); - - FF_77: FD1P3DX - port map (D=>ircount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_4); - - FF_76: FD1P3DX - port map (D=>ircount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_5); - - FF_75: FD1P3DX - port map (D=>ircount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_6); - - FF_74: FD1P3DX - port map (D=>ircount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_7); - - FF_73: FD1P3DX - port map (D=>ircount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_8); - - FF_72: FD1P3DX - port map (D=>ircount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_9); - - FF_71: FD1P3DX - port map (D=>ircount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_10); - - FF_70: FD1P3DX - port map (D=>ircount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rcount_11); - - FF_69: FD1P3DX - port map (D=>r_gdata_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_0); - - FF_68: FD1P3DX - port map (D=>r_gdata_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_1); - - FF_67: FD1P3DX - port map (D=>r_gdata_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_2); - - FF_66: FD1P3DX - port map (D=>r_gdata_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_3); - - FF_65: FD1P3DX - port map (D=>r_gdata_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_4); - - FF_64: FD1P3DX - port map (D=>r_gdata_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_5); - - FF_63: FD1P3DX - port map (D=>r_gdata_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_6); - - FF_62: FD1P3DX - port map (D=>r_gdata_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_7); - - FF_61: FD1P3DX - port map (D=>r_gdata_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_8); - - FF_60: FD1P3DX - port map (D=>r_gdata_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_9); - - FF_59: FD1P3DX - port map (D=>r_gdata_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_10); - - FF_58: FD1P3DX - port map (D=>rcount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>r_gcount_11); - - FF_57: FD1P3DX - port map (D=>rcount_0, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_0); - - FF_56: FD1P3DX - port map (D=>rcount_1, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_1); - - FF_55: FD1P3DX - port map (D=>rcount_2, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_2); - - FF_54: FD1P3DX - port map (D=>rcount_3, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_3); - - FF_53: FD1P3DX - port map (D=>rcount_4, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_4); - - FF_52: FD1P3DX - port map (D=>rcount_5, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_5); - - FF_51: FD1P3DX - port map (D=>rcount_6, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_6); - - FF_50: FD1P3DX - port map (D=>rcount_7, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_7); - - FF_49: FD1P3DX - port map (D=>rcount_8, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_8); - - FF_48: FD1P3DX - port map (D=>rcount_9, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_9); - - FF_47: FD1P3DX - port map (D=>rcount_10, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_10); - - FF_46: FD1P3DX - port map (D=>rcount_11, SP=>rden_i, CK=>RdClock, CD=>rRst, - Q=>rptr_11); - - FF_45: FD1S3DX - port map (D=>w_gcount_0, CK=>RdClock, CD=>Reset, Q=>w_gcount_r0); - - FF_44: FD1S3DX - port map (D=>w_gcount_1, CK=>RdClock, CD=>Reset, Q=>w_gcount_r1); - - FF_43: FD1S3DX - port map (D=>w_gcount_2, CK=>RdClock, CD=>Reset, Q=>w_gcount_r2); - - FF_42: FD1S3DX - port map (D=>w_gcount_3, CK=>RdClock, CD=>Reset, Q=>w_gcount_r3); - - FF_41: FD1S3DX - port map (D=>w_gcount_4, CK=>RdClock, CD=>Reset, Q=>w_gcount_r4); - - FF_40: FD1S3DX - port map (D=>w_gcount_5, CK=>RdClock, CD=>Reset, Q=>w_gcount_r5); - - FF_39: FD1S3DX - port map (D=>w_gcount_6, CK=>RdClock, CD=>Reset, Q=>w_gcount_r6); - - FF_38: FD1S3DX - port map (D=>w_gcount_7, CK=>RdClock, CD=>Reset, Q=>w_gcount_r7); - - FF_37: FD1S3DX - port map (D=>w_gcount_8, CK=>RdClock, CD=>Reset, Q=>w_gcount_r8); - - FF_36: FD1S3DX - port map (D=>w_gcount_9, CK=>RdClock, CD=>Reset, Q=>w_gcount_r9); - - FF_35: FD1S3DX - port map (D=>r_gcount_0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w0); - - FF_34: FD1S3DX - port map (D=>r_gcount_1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w1); - - FF_33: FD1S3DX - port map (D=>r_gcount_2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w2); - - FF_32: FD1S3DX - port map (D=>r_gcount_3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w3); - - FF_31: FD1S3DX - port map (D=>r_gcount_4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w4); - - FF_30: FD1S3DX - port map (D=>r_gcount_5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w5); - - FF_29: FD1S3DX - port map (D=>r_gcount_6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w6); - - FF_28: FD1S3DX - port map (D=>r_gcount_7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w7); - - FF_27: FD1S3DX - port map (D=>r_gcount_8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w8); - - FF_26: FD1S3DX - port map (D=>r_gcount_9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w9); - - FF_25: FD1S3DX - port map (D=>r_gcount_10, CK=>WrClock, CD=>rRst, Q=>r_gcount_w10); - - FF_24: FD1S3DX - port map (D=>r_gcount_11, CK=>WrClock, CD=>rRst, Q=>r_gcount_w11); - - FF_23: FD1S3DX - port map (D=>w_gcount_r0, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r20); - - FF_22: FD1S3DX - port map (D=>w_gcount_r1, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r21); - - FF_21: FD1S3DX - port map (D=>w_gcount_r2, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r22); - - FF_20: FD1S3DX - port map (D=>w_gcount_r3, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r23); - - FF_19: FD1S3DX - port map (D=>w_gcount_r4, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r24); - - FF_18: FD1S3DX - port map (D=>w_gcount_r5, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r25); - - FF_17: FD1S3DX - port map (D=>w_gcount_r6, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r26); - - FF_16: FD1S3DX - port map (D=>w_gcount_r7, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r27); - - FF_15: FD1S3DX - port map (D=>w_gcount_r8, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r28); - - FF_14: FD1S3DX - port map (D=>w_gcount_r9, CK=>RdClock, CD=>Reset, - Q=>w_gcount_r29); - - FF_13: FD1S3DX - port map (D=>r_gcount_w0, CK=>WrClock, CD=>rRst, Q=>r_gcount_w20); - - FF_12: FD1S3DX - port map (D=>r_gcount_w1, CK=>WrClock, CD=>rRst, Q=>r_gcount_w21); - - FF_11: FD1S3DX - port map (D=>r_gcount_w2, CK=>WrClock, CD=>rRst, Q=>r_gcount_w22); - - FF_10: FD1S3DX - port map (D=>r_gcount_w3, CK=>WrClock, CD=>rRst, Q=>r_gcount_w23); - - FF_9: FD1S3DX - port map (D=>r_gcount_w4, CK=>WrClock, CD=>rRst, Q=>r_gcount_w24); - - FF_8: FD1S3DX - port map (D=>r_gcount_w5, CK=>WrClock, CD=>rRst, Q=>r_gcount_w25); - - FF_7: FD1S3DX - port map (D=>r_gcount_w6, CK=>WrClock, CD=>rRst, Q=>r_gcount_w26); - - FF_6: FD1S3DX - port map (D=>r_gcount_w7, CK=>WrClock, CD=>rRst, Q=>r_gcount_w27); - - FF_5: FD1S3DX - port map (D=>r_gcount_w8, CK=>WrClock, CD=>rRst, Q=>r_gcount_w28); - - FF_4: FD1S3DX - port map (D=>r_gcount_w9, CK=>WrClock, CD=>rRst, Q=>r_gcount_w29); - - FF_3: FD1S3DX - port map (D=>r_gcount_w10, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w210); - - FF_2: FD1S3DX - port map (D=>r_gcount_w11, CK=>WrClock, CD=>rRst, - Q=>r_gcount_w211); - - FF_1: FD1S3BX - port map (D=>empty_d, CK=>RdClock, PD=>rRst, Q=>empty_i); - - FF_0: FD1S3DX - 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=>wcount_9, CO=>co4, - NC0=>iwcount_8, NC1=>iwcount_9); - - 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=>rcount_9, CO=>co4_1, - NC0=>ircount_8, NC1=>ircount_9); - - r_gctr_5: CU2 - port map (CI=>co4_1, PC0=>rcount_10, PC1=>rcount_11, CO=>co5, - NC0=>ircount_10, NC1=>ircount_11); - - 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=>scuba_vlo, - B1=>scuba_vlo, CI=>cmp_ci, GE=>co0_2); - - empty_cmp_1: AGEB2 - port map (A0=>rcount_2, A1=>rcount_3, B0=>wcount_r0, - B1=>wcount_r1, CI=>co0_2, GE=>co1_2); - - empty_cmp_2: AGEB2 - port map (A0=>rcount_4, A1=>rcount_5, B0=>wcount_r2, - B1=>wcount_r3, CI=>co1_2, GE=>co2_2); - - empty_cmp_3: AGEB2 - port map (A0=>rcount_6, A1=>rcount_7, B0=>wcount_r4, - B1=>wcount_r5, CI=>co2_2, GE=>co3_2); - - empty_cmp_4: AGEB2 - port map (A0=>rcount_8, A1=>rcount_9, B0=>w_g2b_xor_cluster_0, - B1=>wcount_r7, CI=>co3_2, GE=>co4_2); - - empty_cmp_5: AGEB2 - port map (A0=>rcount_10, A1=>empty_cmp_set, B0=>wcount_r8, - B1=>empty_cmp_clr, CI=>co4_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_w2, - B1=>rcount_w3, CI=>cmp_ci_1, GE=>co0_3); - - full_cmp_1: AGEB2 - port map (A0=>wcount_2, A1=>wcount_3, B0=>rcount_w4, - B1=>rcount_w5, CI=>co0_3, GE=>co1_3); - - full_cmp_2: AGEB2 - port map (A0=>wcount_4, A1=>wcount_5, B0=>rcount_w6, - B1=>rcount_w7, CI=>co1_3, GE=>co2_3); - - full_cmp_3: AGEB2 - port map (A0=>wcount_6, A1=>wcount_7, B0=>r_g2b_xor_cluster_0, - B1=>rcount_w9, CI=>co2_3, GE=>co3_3); - - full_cmp_4: AGEB2 - port map (A0=>wcount_8, A1=>full_cmp_set, B0=>rcount_w10, - B1=>full_cmp_clr, 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 ecp3; -configuration Structure_CON of fifo_512x32x8 is - for Structure - for all:AGEB2 use entity ecp3.AGEB2(V); end for; - for all:AND2 use entity ecp3.AND2(V); end for; - for all:CU2 use entity ecp3.CU2(V); end for; - for all:FADD2B use entity ecp3.FADD2B(V); end for; - for all:FD1P3BX use entity ecp3.FD1P3BX(V); end for; - for all:FD1P3DX use entity ecp3.FD1P3DX(V); end for; - for all:FD1S3BX use entity ecp3.FD1S3BX(V); end for; - for all:FD1S3DX use entity ecp3.FD1S3DX(V); end for; - for all:INV use entity ecp3.INV(V); end for; - for all:OR2 use entity ecp3.OR2(V); end for; - for all:ROM16X1A use entity ecp3.ROM16X1A(V); end for; - for all:VHI use entity ecp3.VHI(V); end for; - for all:VLO use entity ecp3.VLO(V); end for; - for all:XOR2 use entity ecp3.XOR2(V); end for; - for all:PDPW16KC use entity ecp3.PDPW16KC(V); end for; - end for; -end Structure_CON; - --- synopsys translate_on diff --git a/gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn208256208256p13732cfe.ngo b/gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn208256208256p13732cfe.ngo deleted file mode 100644 index ea0bbaf47d83e33076aa847a1324fc64c116b8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11309 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%0AuV9QVo6OZmIk(svr{(=E<(-hb_Q z3w)Kn5dm|R+YYJO^-*{gGxhf=#LNx5`K*5Cx7TkGX2!x__@sxku_IEOmppxsFjK`6 zlj`@e%&K1wY}03m>{Iw$>~mpycI~^QM|?(0KIQqGz*2olt>saiu`d(!2T{sXI51r^ z5hjo2j7g0{nEcBH#-xTNO#Yn$FkR~smS0vZM|dPw{`{W$m)R1bu7;4IFG{#DC;rEs zvG0>h%15P^0&|(=!o0X6S@V@JC36Ln-grwhIoiATzVnvT#}z&$?ME@4R@OFp-RSxURb2ZI;eI@zOS1m{O_0C%yWQjq|+! ze6%kqOsR9gynb}IkIwwL?<`t>N|?a}|D{>lMM3CWc$7JA+!sIoUtvy4m6*SF8__xA z?|A7IX6OnHy+0Il@mcf2UGFyuQ|dcn=8m|HsQQB`+umfRt`6ao@`kZ-s>Sx~7lbLb zC79cbF3hUu-spdWnYuFN-ran9e)#c4%b2O_S_Q>3wHBokOBbO`V#$jViKUBC9($`T6v2+Q_AeN?}1Y+sWQ2wxVDM}xfE<@SF(&Z?5So(96 zJ1k8_sl(DVlsPQI!YChDT87errDl{3 OEVZCyV5t@5!v6udnRU(p diff --git a/gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn96649664p132b6db5.ngo b/gbe2_ecp3/ipcores_ecp3/pmi_ram_dpEbnonessdn96649664p132b6db5.ngo deleted file mode 100644 index 2bca22bc427945f7073b94f6cb84dcc4659d1cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8874 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 HG0puCC$Y6y diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii_gbe_pcs36.ngo b/gbe2_ecp3/ipcores_ecp3/sgmii_gbe_pcs36.ngo deleted file mode 100644 index e22e7de0d81b91d798211d8b9ee448fc44dff09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447536 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

k&I0-D0VY{zA>GNNMLuU%w2mQY2T+sDNPh)OI!D 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

kj2DUpILt9GrgAA%hM#m$rmW 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%0D%LI08Y7>15+cO98L`|UX|P{-NXLEaAVNB~ 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
  • x|Tr3x0+<7Fw}WETf~B4z-@vH0=%bw?oJJCO6Z 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 z z=yd|)1TDw^O$mA*ciopb+$(USfk6AR14~fgxA^^{*9qKf{ci>0^Qh;~Ezs^2xY=;EPGAbFdHin# z{&QMG{jQT%2PFf66I!*ng#w4+2cVSKG?GKqe=G1qtLD#riT5(E^w0ib)Ny8_I=}Hf zJlpFu*7d)f-_X)h|Em`8YoAK-jDC%)>iXwL=9mt_U!WW-JUc@DQ;zXh;$T9IzSd*H zPHAtw>z&a22Y7b$rD|YoPWm*L)eVK}C*@}Pi6uXRvMeP(<}6j8r4X98k1F}GWRQo$ z_47df4Lm>iCu|94!5p511+^TopiW6WAbna8@zHHlQP^TL|;OyaQwGd z)~)s_?=1VJJ49a<&;qTV>rlks$^hRp^&t9&h!z9{sq23r`ga9M1WcT-6DNi`7dq?A zgRtuY*yA~vxKI~0ak1r%-P9zQV#Ne z!n8J`L*A;VHP@2Yz99qoW6|MEgvRnZ^t152|IPZ4KMo!8JWQNG>kvn695noU$e(}? z$A~a-sjNfGor@bz?g06mf)*@HT8(Huk+^AN$X8Wi~^eWYrm%P?g-T0B9g54~28II2t1 zQ}DkdLu45iB7Jly(#-8h?!6c$VEc?v&}yxuIgD86nCfS*0Qrk)h$LCqSf1CQjTMA_ zR06h+r6NSEaYEQ--6|~4(JKhfLjH0YHkK1147c8?OVP05g#G5&;@>0@V#>-8mg|J5 zVGa$7vQkZOn;z`&#i#jR3Pg?8(~24+l*@4pf&4WH;W5!s)Ah8X0*N2HuXzsn>v#ym zW)L;kYc)@3w{k{2N^>t@P6)*5w(;Wc=^-nkdM_V>L-N56&>0@G?=>WN63#v zi)pBEvo1br3m?*WT@d7p1Vqh2D{mu>+Qs&IvZ5d4Z?-}d7FOT~g61%=gSc*>Um3{X z%A*AZft@Tm^pUu)_4d^;?>8E@NfIncQ7h5BJOz}REG&MYRyL}jaPgs?wVRvLsIS9OR&C`1D3Z`?bhN#^5|3^7MxMB z{5?*Hp5TOKi4HXs$3k=s78W)T)KI(x+mBgc)fv?;e=iN&{W(}&-l~T72@v|80ISxz zu_P9vHVLrw9IIl*Ti2F`sPYN~mr+v>n@hls)jZf|>4k0& zqK*^}y9M)ZSRng*?1)C`g>L`J@`!Hl1GcYdNbPC?`If5f-rF%c;l8Hr%;<*i%0USZIYjJ6g@r>zRFyT;W;jLzr;T z0eP`9*vGP(mHlVygp?6kP*58k?iRrQwL^#ci{*R-1`6s*kQc{+y|dS<3thIu@)l5l zW2Sj~QAQix%GOqHw!2>|D4-R{J4%4PsSeqjiFDu*A1G)0Ja}>E88e>RCsNa(M*863<+#E1x=xi<=Y8^lA)l51g?ez*nX9C$my`OYcmfD z-gd&Jl?d&3>QIVYeCNZ>Q1Ffd*<)p}ZSj`jHe&jd9rvIBJJ0O#JlMK>p-dLo@D|1Ek;Yrew!a!*RL-WU^B=LrolGN>u?6~d7m*= zp`e2kvgasZyX4JsuJbgTQU(e-Dv-Stp)^r*XgjW)zLA4zb+$mZ-~iihuhkxB@Af&U zuqy}I;WF65W!-AM^5cX_H=*ET0kSt@8FsYjP$#B&?~uDt&`pADd}y%EBXnp!#oU=2 z1O+{ukR8K=SVqsX=qG=>dfi+o=*2*`grzaw>u>@Sv0G>Y1-&hhogjeiZ$WpMFDo7I zU5A1`9AqD{fGvyDAs2rvT4@XgeFezIc5gf6wK^;|o!==E3M>+2pJKtbUDB=flE4*f9yDIb&<9~sI?-aYK__Hzzw5niiE$>(rfdng!bf$RbvY@KD@VHagb ztM{X!U=#;Acn7tGI&>(^*>sskW*O!`y{=f?EccBPrq3X1rr&_se{nB7R{l3D6?z9^-L(3WPzM|4zPFE z)3W!FR<-IG4g~=ct0{$mIf1PPGS zg$DZ+JuUlGK4Ws7&!B*pAg4D%-_x3v-AV+t>1Tz4xlYLGgIVt7wfcaD@1NWs};Nst>)(}SpOFU*jb1?j#hZ%*V0;VnfH;S zIs{y_f{n5Qx6zv~8(sHKXch#>=&*3?I#d0+6s|R z5qjj!*HcGNzX_`#fTO{_3e)<_>o8wI`pUIPT={Q5HuKjfO(j&hhB$I=trju(jmx-Y5gKV z;8RhzdajTcKFo$7ynopbP!O2!(4iNOu|uA&gP@-=txE_M3mP;Ngtd#N4TGSGSiGSG z%=EG9P#Mv`>Tkb6&{Rz8vJ5lJaynFjt2VbGW;qbkI%@^K4XZ)?`$E{0X_X;pjuY&u z4&Xn~9r7Km!Bq4q2s!Bl(L@3N5u;mmW!l}Tc@9F(V@oOEfd81#q3-OOh6Bz+$Q67) z?Sjy!ln#AHy_vH2CkVNTR!;@sd&@fXh0NC4vIIiz;j8Q4GVotYI@C}4z<V4d1uRra2Juf&=@X2o1LA(D#mg-P`YnP#?_lRSEbX1RWYF%or6-L1=jn zL=w{)<<0UKYa4!cR|u_&Rz)oEKQp@31m?FJ5qS{$Cceynj1cF|asc6?|9=bgf_!bszQ`8!z*K!JfvTLzz0dX)f~z9$+eyk`aT2p zM-K2m&1sPT8Qyj})E7cO!nCgO;Qx~s8qF`RnuTpS6W{&*vO)kZ+wpXj0ly0o7wGrF zf0O`WNiz5^(;@%mQi~;t*g4$B*YX1#1pKY&Rt1DBV$62%Uy9HzbofNjp=bP%dKD@o zn}V>@3iuE9${505xf1;yvLy&RON0L=hi2u!McO5-ZV3K^P=-r->EoGKYc_p`Y}w%B znIE;O5)P4{hCc4 zcxJ&fx%zoh1vON1wX@N5AeTZ!1 zgz#%L%zjMk&=Y2;(&QA(zOO)tz{4!>d&;amV$j&oAejA#g^;xp%-Sw%R9M`y(Po^ z+D@2K$%3H`sWJqyAZieW!$_hU8i8$G zLQT&pm6;<#$P5MM)^&%liw*V1@6&!kAQrkAD?~64bKS#8>w{ScU*H6OorG9nFAmmM z6FpzDEyU+}@0V-~KWE%uvUPv94hs8-@Yml0J~7d%U0)8u`->3#sj4izH~Kuv!<;j2 z>?;DMuE2pRe5yreKm3&6V*%#Q5Y^DvGT2XG{`?3vG{6Gu)?rVuKvli&Z3~2AxlC49 za6sVO4%o0>z*?aC3>=9cJ6`6*TE}82bhZ;V)^)&?k7NvmouVPUCr)`RRC5$Kl!tY7 z)f!^KP(Y{x^DA;NuQr3Bh@~{lxKCqER(-DX;b3i=1xwJ1p|wk7m^hTfE5>7JeJ3Y` zEK)E%HHGygmTm}*gI_8$ESQ0HRZ+_`Cx#;CVhdPAKyV#F4aqW&L{c!lo@!S(Qiez? z=4ieeTKhc>L3Knd7hVkw;Nj00D})^2wH6$5P#Dql(4SB^+5%CB2nac)_ZA_i9c^v) z!B9AsgP1o22)X37y3G9=dfo+v;{;ff#X!h!qVDjzaEO~-2!#`{BT2zL-0@o7Z06M#bR)0&n!ve8;&f9gMaEb-faX=`cTZICD-|1u#E4l> zHbP+#h3TMGU9VL=eqGx1OHjx&m=0Ps@>(^q_S_uy2Nce=U^-~k(reX<-!m{O1q$b5 zbPWNALA_ROtpgt{dlw2rotO^79W1(xj(o!Kl-vDnrzv)AHTqqdTE+ z8v`NLX$byB(xI~w?fMwYaJvOU>T?jB<;_9-RzU|G|U1FT?SD!#( zJOd#;DG2_-hoAY>p9!B06ot>;|mN(NhH zvH&69qr-ewhhFfXhWG6Pg((Vz{DfA;x(psHcMo<8hr&Y?giNG>_s;(CW#}cf_N77L z5e7o0;$tS>Dm_h)FR$cPKP*7uQ4563Vu7#d&>_lEOZf9=C`{!bWR47cRY8YpI6Fj> zpF!bqCxnFI!|59q9jYzH)fzk-3QsB!vJ@TG)$_&I=WxjPF%+JnAOzng`38Ev_{Quz zd)ZhhJk3DJdMj|J6t#Q&#R4I*c$2&#VQ4CL@1ZTR5PfMC!&k)cniw*xoowMb>||}& zeg17xLs>EecEPUtxoRiYmLbG$f#9l&ise{f{SWxi@e`qjF3@oNdjh>M7zz!;N0+oEhNV;yKGs@O6Gru@nv=1}cqD{Lr711In*Hb{Y!f3gtlBdehv*!^Q3g7#Z5 zG$nzDZM!MFHBhSEO$r`R81fM?6tY)@b#^txs@NU8=+Qc zE5Q14c=P(2*9tnYzYuZn4t8Ys(9vcAW(?3T>WpuQHRt*-g~A6`m`&k>Mt!}O%%J$; z&rR5L6&?cni7=zN?r=s6VViT&ekgo|(E})$(b#L%gt~C>>~JW2;(!_TXqX(X$}fC| z#ry>UlZ!+(^jv_j$5Z~m05^(Uvl8z+Np+$EHLAg zwd5nifO}9N6rVY!d?Mqo7bXr)>{Vd$N=6LJ0uMe@ zU~00idFp-(3|nD`7rq<>;@yAhK`(TO+O_0<9eCmAL}z%77E-!H7n|Mw!zg%B4xJ^@ zF!emELl-QY<@i4Eq9O%T4wsmB~J^_r|h*Og7lj0`U*gmSDf z^)9bNe+Y+D`Z?i6RS_-G>VY?{KZQj@$yj(%U3Esl)Mwtb{$jp9mRtp1)RbZB?;=e7 z+nZLt(tRKfQNDN+E$&-knn_P<8aTzmOD*6<9U7)SWnmgVKYF@=X}&^_F62{q@fMHH zuw_)#)0$R^x$N^tC3sO^glPn(m8}=lv?`8eyZ0W27Y!UR%?IIHx{PUWDhIiXd*MYR z8KzZWfuq%{{-P-XsY5y7-n6KpW)hkZz_|o9)Pja-l@*w<-hrX1i&>aGM8qd^QN`Yt zAZo7@LvFiw@M-Wl4HM2#D%RQw6Ve?pu_mjA7%WT1O5mS~xB!!GTiq*f1}HG8u2uUY zdFATV;a?%QkwukPLIwZNoCeHFKleKt3Ar?@=F!9Cx={wqim`Xu#gO|Jrxujvlj04S z6$(D-dkS)Ei)v|mm=nt5Q#wwa|5IoAM>&rJA@>c;QXSgE9KW13V3sTQ(dy-pTLTN= zO_iuF1M;tePn0~j1?M{N+%CuSoJxu>{M$9s&H+O0T zxfQTH)qb)h^`=HTeMhBJ&mp%gueJpbldEqr&}n|#Rptcb`buhp(wI#J1E$X(^rWhg zOK@td^e`ty7%|E6DJPr4r5BibIYnc>=P>XIL+K4;;L<}`?H{z%r&|q}rkS^Dt$>U- ztZFBtF)xY+Ok#4q<$uBP#aQw_77ugsB0cX@zGk%g>2uzCbrRg0Xi+;`jcJ!OpQV`O zSF7iJ4)-SWYLD$I7@K{1rUxEvYvk4|Db&UFXbvR?AVn?ZZdLlI9tddUscufcG)ci22sGUdvKRGd`i< zBZ7xHYqAluZnfc)?vm!ojQX76Va~kCXgMmCdYz10fvrgMB!~L2qNTo_HDK1Bd+lio zX;w=P%5Q%)qmv0kcMKP((Y@JX}^EB{e4I&C@fKDy8Zl z`^8@+%~sTz$a$F4e>2KawV6>XBS`aisB^DH^I2@iZc3X2ly3>#|65U(~tXqWP?A#H>(|wtF6F?t?nFF&cA`VBoWSm7<{S zq`5btzWiv+nGOSHxvd|qdPtgkqE2i*_=oLi=6I(8v+TW?@?}YLchqSUG-fDm!1QZi zYmiNvKS7-loW>kzlzN#n&pz8nn!93oZm?*~eij3tzUOZ3m`a*EW9sV^joA_9mfVj@ z)jIRdJJlYL=1z?IYN|2I8Zmu__WxlyY3_ijuaY!oPuajH8MSC7Pnz3fDXkDZ%)l7Y zfC(?!guEclZBgfP&ch5^Zgh=I8yvCGr1?E8rKOa{Tq+s(B(@z3{)#lW7S(rtjd{(X zF@v%styipUn%lB1>GLPA4jiaVylV&jru!_#tW>t;t@@uAheiviPbWz8xw>63>#XE-(HCDwphCad?z z7o<-v>YT=D%!`Zx)Azu@{q0Dfi>PyoMPpu|4VdQXci)I5eQ@X$hq^T8dCGw4Q#-Bx z6w)UPbxxu*W)5M%Bx72>@r?92i#jJL8q=j1Fkzd2_diIVUs2~cL1ShK224|`?eq6Z zpVO#wET=O$116F7(eVbP&nZS7L-a6tTGE(v22)!7G*20QW;BH3kN{2!c$jl0^E&gk zqA| zJ{|{Wd+-{wj%<*+>6b;$FCgp!tIjcbm@^+J22A2m_l3Vf_-IC*sPZru9OpFVg87_Q zp6@Q?+vDtAZC+i4qB5~(SdgZdXDMduO-r`+09#Xsx|Bs@rs}0siuulft)D03q8ePX zwb-pw^?8gnNWIm;js>;A-V=Q;=V!&+nxZ#t{V8^i{ zT&<)r56A}0rcAw}aIiH*owFE?nc_5HHt8)yV~*azm6L&##@z2PU^e#mp;E!#4O5?{ zXv}2EfZ6EBB@=zYK7>YT`E%)Mw>a@Q_Zm+BAYzYhglh^($^)0hcX17^MPwd0%N`Z`Q~ ztfDdFEe6cDV!N~$0Je=-@}r#^GmbT2*4@>m({-@LiRvOfjVUn(%sM+-KVAa1lju_& zIw)yJduRh@Z6WPJOR(jk&*6;5+)WuU-`v9{R0La~Q(beYF?SIL%vx7QZ5|2s-!1CG zMU5G&7%<=1zPr+VunBlIzZEoQjBLQHDHcBZ7}sG^>Jmzgxx;C|tdTUb8cv%=q0VnC z8Z+8qz^qRC)O`fDgOa+KQ)6zI44BpC`i`p%wsV5IB2;5Wi3ZH7UzIyL7;Mkcr$y43 z+XMqe^I|xs^9yQj1zYxCWxHqAqaNm|HjlX5|Ts{^|v`xwN`UR%33q z8Zawu@_RD_Y#(Cky%>$T$zs5)NJsQVpW%eMURPs^tO2vafSnm92ewp)x^mdV3@$QCyhc&=<5q);$G@nap1D|Er&szH(E`+AkHOv}w31z_a zTQ&XTcffwrqArBin2QMmW|^(m+D!%95-j-+PK~)xF<|<(oiMZ~uIt9s+e;dAfo#Au z_ng|^9~Xxsvz?$Z!<+_8pBWu8W`ivmQ*Xm*%ut5`libXo>ISx7oazd5jTs^tFkw+n zyK7*(A*svMHRgPa0n>Ex(;B!hVI-FP+fJRy7%+)OX+6)vlQtH0!Mw)gIgL4QA*0>j zD_7`~b_VQC&}TD2V+LCdn3aCm(CRMO-a}>+Mq>u)I!pPiSgm@}r(plcs;>Xnn6p^} zpB0`Z_WvF1{m>_^XiU7@dHVTMKFdcY?%oadG3c|NQ)AAg4VdM66n)SZ>^!Y*XV94A zjq+Z$M}>>iaAO6f?uqa)=QWiKeELnd{{8^$YmGnuG)Qwvj^STj} zj2vWnkMv1Ko$Eypb4gRZSi_%(>+B&`o-dS@H^f(5qBv2?Z9#8wQpCBJaHvcVfSXBKaf3fC6i?jTjMCWiPPe$vue5%D0NEB z6X%|ABmDvdb<)ifS288{cN12fmh;4wOxitc;()>e&0op1-i%eq%U5aYTS>{p-;+L^ zI{Bx?h2t-HJO$q{pUIv$_Z%kaH`b!gV|wD;vz(;gXk0-M!+YY~v!bNmN}ToGD|+JG zv#6xG6)xsUaP#o((ml^g`U$u`q6g#Ql}se%HpTL5L3`p#W^Ruci0bUE7H38a(r=ld z&h~0?RS|`U?_u6@ES@;`+%ajM=}_m7)i^a>vs1NQgynaR^YGlW(WKu3Nu81Q#JT6I zNuP&`I%n;Pb1&*4&CQ(Z!X8hYdr1)KlP0Olf;@303z6;x@#(Mn)Dlm>EbvA z{$bg>XP!yF!8lzyNb$s#ETMWh%Bn7-^2C)avU+Hx)P+`_IQLvMS>_S1&PQu;>Krub zx0+Gsp*?Z#rH#&+{?^JKVDInnyGP^H}^s`(r+FGxERe7=U%Et`UO+!ay3s} zu&+baJcCo`<2`Zi1#YC@Yz88(u%0;gd_L(n)1uDld*a-S>qx(87IlH0C(gb6j`W*? z^=iDvbFU~M&2JOxssfd#)&q4>B3Z_UTVlSXJ#i&V8Xren)Mbro9OlElNRRYeg4g$y z;)z>&j#V{p#~vnG^2E9KT9Q5|ILJ>z)NSkDjY;}E#(r?0pz+S&57KWNukP9O#JP8L zl73r6byue+Zdsy3jzpIugWhI-=M`$kE>NQb(2)D!34SxWkC#3_3H z8P2`;l=R!+-hb-hxp%ITKIx3Qd({(HvbXiYEm_^)s>WeijsMz#T6{*Jz7$%G!*X$N zt0sLILETzi5{IkvVg&b$^f>&vQ#yF8Y8YP+X0Nw7LSMRrOj`bEG)OjECYH4oGW>(C1d&stjI@uXDbDksL2+#s(t7id)*dey=H_Pxf67%YAI^f}x@gfAWsLDc zW8~wH>du4W`UIrCPea;3S-1MevElNF&!M;h3u&WqbMSrLD)qiRZf{!-iW~80flCW+ zD4JF3EuzP6d<`nb8(8W+w7Mwi&?TY!$f_nNZqA|w1sNf_RYsV6=8>s66u0Cd^@0;p zaZ1f2KJ}c`c)^hSP>gq>j8FjswG)M z`yYU!^%NvjMThkz9ioN5&aG_^MH?-UP*Z_~#$Ja_=s#+G^Z^t_qQiRl?`>JPYUPM- zzrQ>bi4-I>vO@eUiw4EdW;zc$?SP`q7PKHBeuqPcVz_G0^ARKi;t%jTbkI7j_9r<|6pIcMDTq&_bm%zK zl)0S>MZ3^piU{%Py7>4EhaJQ*P$Z#6Dg*Int-94Y_Jd=C+Cfpg1uY2Jw8(*dSP?FB zxp#<#HR@deE*-GKl}!w68^~kmY+nW9@ChI;#;G}piI%mwh&zjLo!6PqFSq=C{uyBn>55d;C1Lv;Y{zJyFk$|=^F%9bJSp#$RbWgRMH;v%B(%3iQS+*5>$ zSq+LOEGyesY*2JbL<<7qNvjU|a6P+ZJcXjmXi;Q^_%gf>`3ceI&c{K~RT|=fhj?$B zimxEGfYVqle?tpj5#p=rGUBT#E25|Lfuid&#ABO^f71)qRxb3SOi*--MhgPs8?bs> z4TY+8I~;|gJ65zH;A#_EgRVAZLR`o63?Y_Bx$lRg}Z+X-;B4npr(b*QzpY3|c-C~hyo)#m8X zd-u88Kx!+xa-g__6P*!o^*x7f)y6q;*xnvc+);t6t$4UvPOrUJD-glmYZO3nXA4}d z?|@jW&IA;96_G^2u5TC&rB9OKD#63WiXw)R@cHqtN&@UspY9<&MS&}LL6f@(7)ouA zt)~TUE10DxfM-#BTer$IxKczLoJBEe!{%=x@oS60SrobBDvyUNyYcjeQ01kwC;}_^ zOoZazMrTpvJ}bWuiu;HLXHm>Z*~>z4UpzWuJ_4{gI23>DFgT0i zdH?$(p!hr4;4BJm!_d7@Y$XiNqSzGurwqlztp;aN`0p-EgW{3A`z(sgul0JFIfyq6 zyoe7Lqnwa;k%G+5qE=9uLoIgtavJ0=RUmU951AvqR%7@(iEq9Gxi+*I!a*j!V0b!< z%<-1r+NAA<+$a$;e?qIVUaLvg#@B{CfZRP+$ov_tCQ!Q76lVGZc0J@KTOe~H3z@TI z9hz&sb>hcAA=iNp0}%efp+lj}wZNofkee<*CQn1=JX(hq5$8WSco%Y=5@gOtt5Cg) zW-fK^Xm~ahaxZd_xd5%!cpa`&jzkT=3Axt@$Xu*IW}sDf7%PtNom2q1cO8(q-U^vJ z^%|AA$7$)6cMEc#P>{Jxf=tPquLP<3ZhTwKEp$R=oB$c#-Y27z^~{N|@8Po90-5_b zNdJS=(n>Gj9_;UJdRi-0$h-l0y_}Fy2VrdWo=chWp7jod z7C@ebg^ZqPRmBUnr7O((B?I!l#ed!8nW*213Gj` zT5HG~hH3dxkY4OnSV@e%_U>-T8-;0oAVPXJrCU`M*X;dyA>@rwAfqx3>4z*jL?|m) zLNVk`;vl0MLT8*hR8wv=|5`5OO-A7+?xm&8@{JDdAa9mru(a8AdiPE!-rz7;+I(bX z>KrJJkPVhL&pt(Wf?_)^u}z|1TH5^8z!tlpcoRk+z<*culAkIwV>Ub=1jSo;cy(!W z;<0Jlp?I5Uu(UbtBijim-tI71+FZ2RnF7T-WP_#6JH zY4e_xpVvUK#2YMaZgi>#cFXai!P4gQ^%93c@m^fNOd#yNl(@9H*M$7dP@IVCmwm*S zmNu{N(Bf+--p{(1HYYNSb}19zW836RFhlVHD?IpGfPIg2Xy0S@0`X`JoUKN{y%Z4= z8|if;v9a~N&;gl{HAjT|jR;7@VLMO7POM?6x^?blaQ%hQM?56H?X_xU4W2%$E4W@D z^rZ}m6?omMqA;^v`%aKeTH*c}9+D0?G$`qy^YN{&lOVe+4fg|RNID|x&`~BE9xa6I znk?L(g0C@(Q-e|;Dpbo)Rzg;N8ges5NUJGnP}&>9m72fiL2ecgsej^2U1Ls%npoQJ zUV0XCFXNkA4JV|P*V9U?;OOK(WIE*D!01K-q;(f{s~&t7TUCJE`y5&jkoKW2Bdw!C z<1}EE4GQDAh(!@v&S{`VPh+rs${roqa~JG>hR_Uzmg+Ubww!Lx@9P3* zmpcqjhzhIsVji4GVGT}*+Md4dGe{bU2L#PgUOFL)tsZg(63dGQCq(_!bZRPG`5mnU z$4e(fRg*Tahs2hg!3j}kJKn-)(py%86QcGtzg86zt0A;qdg+8HupJu;SFQ^NCqyl2 z*mDykHpH~B+xzDUQ7~%j2XIAp7@QC_a&xh%!BY)Se`2p$vRt`{xN!O6bBjNTRlEa6;6d$>Cp; z#9M^H2~o85-CsxoyP;Q4h^p5rER-Y~um&eYMG5cakwhcW;Do4_^`@O6i6#z%6QXMU za`iKkXeJw+5Hd@%kCrF~RXmCPQ%_n*3B+=Dja6(kz>h~Lv#K*G12~j`xZP1h?y0Zo+M2#w1 zK7k}YwHlld75*p~uU9YL;Do3NiI2{aL~qgHgs6=jsi7p%$6;_n)P-|Jy-4Cq+Tet! zy`x89$$!NfoDg;V`O-cl@wL@`LX?ZOXnmCHGd{Q0kF`l+AO$XbT*}&`-}AB#5OTwc z97znaK+a4Wvd#*cRn}$hj52{Gi6IKOKDR*D9ZH8DDIYtUzaWY4F!~_2Oor2->~{3M z8^tY1;(H0QuCS0*q&sw#l>*YpizG3ef~+SFaMjQqx@hLI@?bDYjKl`}KBhOuYc-kc zkpD?nlK2V5m*>GXK+@834HGK|+5aYqF&wz;0%RpPH7F~II=eGEfFyo)f@>m+`lOzHd$hu?!7w8UM zW`2J!GiG@TS}B+w?soFr9b9$U^NoW)CW&bZWWR@59`Ci{_?466JCj5pIxB zjvGV#*O3H1VY|ZdqHJ|&4zu=%M|Q^JRSrfAe+!)3PV3NFi=1P^Dmn+PdRigtvR+VG zx1G7Y&Kx9(`4nWuagcR@)vU6cOT^kQE0RPgMrUDKI1%L$pH*ZzyE<R)i}8B3#EW9pWw^#z>YwOyizJph!9~#E8Z7EoL*$qR52uiXz<>*H z?pe`Zg|X7pL8mMvu~Gon&nTmtZk3g$ymvvck;G~RTtj)tlD*J%Im9w|14*nCAZr)O z$Q87-vg`9ciCxx{#Cip?e!+i#Sv4pt-x_u-_cBRDSRm`B1g?s*2DvEt(52cRl7vly z?4~GXB&9ox(dU0#LB%sc%KVoOQDXeSS@wSs2l+9bWP=!-fevCj(GgE3#c*J?3Sw(+rQB$4C* zR|;BwPUu$snJz+65J{xa;HoM?R-{FPvP8?0;oKOKIEd*iMJt@s)av|i?DD!*_L9UA zv>J%eNnO0_l;g3_Di=u{#ml&vhHRG6tg^e&mOgM1&e!b*P#3bHV2-Nt_YE zRgZ$K1$t>@t*4hy-*B8HoCLVA-n)KLbgN5LyO>jW%RXlXR|^JQ$(#K!Z^l>HHLKIe@aByk?Ca%FIB@;cni=FvR8C+jsS_i!ab;P=1ko_V_++iVW9Rb1C`A*MIoYc*5uu=eX8 zN#YS&#Ym7eOfQY3@A(m3(kqk16B=Bz5gO&t#3%jae9&^;?~wGJ0Oy`?kTgcrp`V>A z?_D?uNk7VvJ(`82@m^@6@cFp0X~@RwRmloTldQT`fJG4xFvv#8%tO)?T8E}lLmCed zk`l8~xk169VGGzI9tpOoRjPtD$qhS>a@78V`F4EPNh8?{LjTW z+#CFp@pgx4{ceG?cC>5hX4b`l>LCQ|`@*T(Rbe4D0F|{;vGhe0oL#BvWHEH^D!#z2 z5FmDy14C!0JK$_04)#&9R!Esu9Dlctodah_;P{mp2m9V)b*LWwnSaIRaALI;F4rdD z)HTf?onwp`rG)zkpbm$MB9mcYxsRcT_ zfd3wGI`o$^eZk_>q^T7;yUD_-qm&L6(y=~cT9T&L0-VBoawfh>d%DR?KjG6tGeV35 zPCb=i{~SH7{qu#xr)Jh9O>G=-zX`t6hgvnO{R^#BTGHR7shtBJ5ESfR%;?ZErs>)t zACRW@GCZirzy<0~nO&>epL0hznw&+l- za8Vr8kTi9t;Xy|Zw#~*$N}4`p;drbFF=N!~oPqbx_?`?bX&|bhO*m22nZ;(HR_6?? z=6N|-fxEcvdSlnJScF|GXw^#}8Zy?Yn4&V5V0q`GU28YimxK703M9WRsLU^AIKDu@ z27^q}^pyZt85wp>$Mi_k*90W}fJYx4aEJQiXviZ0Vv;x&8z4h^BPYa$JJrxP7C4Dd z#=E*86EYSmaNK1@pKiOscsSEJC#EN>%x^7_{**v1Ry8yf$6C7+kPzYa`GXZQrb@7D zkpsP)*pA~g?PyqCox)K1U%2E1Xo&flQL%YWND8ug4m#M=%jrJopk(!y37=Hdb3=BX zcBeiD=f^;SeIKh{jvu5TW4#Co3u!g=pYZ?igxExf4()e5NZGQ1 zG|h2OGDv?Rbjs`S3|k?s+A-1;N`O>^P?oGa%#m$(GMAC2 z1y+bF>wwriUWa7IvI~25k)}mF#8D22NnpE>aDY1V7TW3Kw)dLFkgMFeXoK(Q-v2 z(zM13QW+=2T$OaIYf|fRAJrgD>v)jLQxJ1Q7awz*-vxdZNfTBa37@!Pe)r0_XIb50 zcMHr4wQby)ufOKNN1p;@!%F^o|0tCQ(Z()Lk5XMh*fl}Zc6GU zTN-IfB|w@+Lu?OkzIr(hI+|P{O~+}Ff)MI0=vH3{ANSjY`8vshG@pmqFReP%Ph1`T z*A~*0A%e6>hS>g`4t>Klk$<^Enlc?Atw5{6-h2&ZKRP{FAWdgvkk+BqFiN-jfm-7D z0L42AkZe3GzQe1%$T>WkF`aDFUcp6I&uQ2a z=}zw|3-KGAurR=#o-9GgHXc@eOsIC(&}Ty#w%~#n3|)7EbVr62BRDm5Q-ruWn8KHC z?3M%>UvaQCz=AsWT;f4W!Xs_YP%86x8TM?YOAe|bO@GMv4?Pfs$%G=_w`vQ_H_z0M z&8WYw@v4tW^HqmhRO%mK@!S>-nDrdx&gPKjJd0Z19_H4{k^%Fr1A7bhljcj9e5S+0 z-0~*6#zlGq6eyK?-S^|C^d`+0u(!()J}e&6G&@mes!DX{oe~Uu*28!#}m;pNa;|8Yf%EUm?wjqT0AU%q`{7 z;Fa>M?uh;tk2cxMs6B*-xfN@`tITRK{H=wgIS$J+Q6;LWZ|!AtHLJFax%~xc-h(<5 zWR2O1G4NT1t)28UY2JxC<9H8Kc;ql(QuX4`cO}g+sB@3i!(6^xHegonz4OW;(!3pY z?qWU6E&VtHW~Cj~eSaX$+fZjL?O`q|G-6h~H1!Hz&CRlU6Ywxsd_x)dtT1yY`#EVA zQD>CsVQ%|aGGLb9JN6raG)JP&t-Oc1G=?=`maEn4a0k-75p{01dYB8ZTMd|Hd$oUh zm^6o@PLb7^7ij~gpHLL@329!-sdrZoQ`l?7EVGV+#iV%^>fGq?Ft-en4Sf1$R2tTi zG_OFN>qQT9>lmZFoA-@gm`s|Np-%N7k5KEyqY& z=yQS9!(8~YV8Aq2o<90l()>VFA1Xb}O&PKQ)93q9sn<#KJw|;p)tL8X7CeSe~NqmErhimc(~S4>KuM zFQrmUU$d=lA{@7&&aR?|8GFrQkh;0$^C`c<@r@4kt=7Zbx5bF*V;bhq!0~WieKppY ztBg`7n|>5I8IG@z)c0!-bMI59LF#a!)~*Y1JOoR=y{!3si!)%F=C`YR1TuY*+0LOc z$LZIoRNjdz3nmT1WkQNNT;O3QW8OS1F8N(aEBT6@EF!=spbGf`u9U<{akJ?jp543B%^)oj9R%n$TZDwTSf`B#P>gGW|Oy^&R8 zwxY0S2Y0n^8)Z@*LU@HF~-%c?Qk z$OcUEiy`LS@VE@-s1B zivg2pFrnEu@Ho(^4*GeR`z20i7V4Xi%j`c_{5L$l;ZO&FHD(!a>RzUAxb$=vJX$NM zqsSiS;UB%Jdzt3@`Tlsk+yhx1iuN!MwK8J*2#Q^X#{+R9^seUf;0@kDCs}dWmh157 zBBc(Bdwd@B-eHryspCYI6bO%E6?J4?V?H-Z-PHJ#+ArW?1m^uZ?_nn2k_=KOe8=r* z2!E?OWzFY-SgXcNY2(n^W|?V+FZ6`Rb5Q3M&F6t_gaOl6NU;m>P2Ct!}wTQ#PcGhmV%5|jFaa$i&@PdvvRGv_{Y?lO}}GIO5i z&=VLLxuuQo7^&tS((ltbHNktvK#y@`w{$jxtg1u>zqeeg5L`vH+V4NA;s z4goTxhP1ih{mVwr3}xh&WP=iO%WVJqy+o(Xb8zpb zi5@&E$ZEcEs*vIJ>TC~#yf>Wm^in~tw+Lc}y>g|}B*=SLPme$q<;9Q!d05@m61CZm;^|6 z`EJTz;HBf9Wmm>I!8do+jKFg9-fr-o#~IC4Vs1_pAwxEMJ}VAh{H2fS1Ijo(UP14g z3H^Vm3wbmnyHOcuNgr~{7>#c|pI*zE2>DN}l*k|>w~f>&F;&R$l!h-Kg1n{JJ3he0 zKl~Q7^{_{P4BPm)eGj;g-@!1YLPlC@(`sZhFrpK(Z0l?w^Ic zzcrNHp~SR^kgz(kUMa}ijN_c_RAMd=%{^pD@`WV0x5`avCNgqIC%d3`O>C9@47}Go zl&c~mw~f*($W251=V#f|o!UWu0gf|4iMh>T6d=QMOqYs5-eO#(@m{6(NMG-&m|@NP z-Tw;i1NI(kmyug)Y6LMuFF&f#5%Mig%HNTZn~s?UNERRW))mP6%T7r^%8W`o1W1Ss zZ9V|-f{z_Bgrv$R20of^Ehz@UcKoPc7#<%ZeQd>?wIAj zepWw~yd3fm=qWKuL1tT(ajKBv$CjLQL;g|heV8xi9uYEZTi%{X$UlcMhx%fU^ax^x z4qk}oQhth!^1S5Uw|GS3WItbySO)jonkZRJ8RtO}5_(pz@Dbd98Ic3MGIB?nMbLZ5 z)mpn=hkN(2_xF7Yo`T$CR(e+;ZxJs|$ z(QM~XkegisWSt2O9c@V5j`Bto( ztMA#Hc!9+2D63aNt~U#iFD*_e<0f%CN)1+!>r4Vb%bZ~ z91^#qBxMEpgF%3-(!E88ULCy`FdyN2D>9sFjZBOEM zlyj{hS9=A>io1<$F^Stz;8<`)X0O2wmXBCfv zT;UQR%XN1RUPj_}l!vY$mpcW>vRmCDgSogJCbKI@yt6F-Dp$RW%S2c2@Gcj(!;E+Z z`JG*WEIoIy?JF*BhiUZ+a;Z&#)F1A-1PhgfSwf%>rbJC7zTKT-*++1_~1IYZsn-@fFvL@8;rm8_QZ0sg~Z4k}NYaruKMg}Rbp--Ft zF)y!yv_Tmeq`b!dDUMWLUIV#@GBQYcjT-PJGTusiiNGi$gOu0ETfd?cFRy_tNF}BY z7fX8DqMA{}`Gnlzyu1cdDHUWrlK>h1!Kv!2czKQI-#KJtkn$R>E?P_S@)}6$RFL)T zf|#MzR!#bmm)Cf{*dQZ=l-Icb>7b{)yav)s6=YMFASMjHTwvzqHISn!Bdz{lrmDGz ze75j>8D3rkiLMIrj6)Dp^GR3Mi7q} zMSv{X;o`z9F20Cdbp@I1dmpJ{mU!4=R#Ps%_?!cI%p~72QXz})i;URH#TSt^uf$CB zz2j8KV)f?En90Q#k$SHnCmICf)U7bRoz2A;k-x7X$B5>xeQEH5d@jC-A^6mW{ah zA_^nO$ROg2rn}C1TznDL6_l7((JHYo8-8YHpL9^r5+!qd&k=sc-*HG<-D)5bGwqF^Jji$^AErto=UMh`EP>;Nb1SVx zkyd<-(1LS|G4K7UL-Cb2lh5uV0=D9-V~}2R7uQNk zn~lW#QXyjqM)T!~wQ#$;my&CheLLuJZSTEpqV!wx;l5H5TI3KnC8EhVpZFrf6kf%5 z!j5%S@CUk(3-x7>)g*O`=sRQ z$airpzN?cIng zXyjob-JOc>Rq`z=g-O)Xw*_1SDG55V0md6aFj^O07?F!oB6mXeNgRwwB&Q<}L-94T z)7%>2zL7p$OYUoEBQA%GlTxH3a`h}EO2KiS2rLTK5LZOTaV81e*P}1Qr1xG(^V?B*hI0NKZ-16X7i2gwI0zAw;Xk#D<5Zb0_!n&-kXpW9<4K?3^2bCM^i zv&ix;N>nEwuCqk=e{jo1q<`7RB>`Au2|LLG$Ucej5^1y$>qYi)0VWn%565To%08Y% z&cdD|zh|P-ha_?K;66%zZIIXbzoL)Ui~4IQbNDGd*P;~W0S`r^KcDC$<=SFxo75faH7uN^b{g!%nrp32d3H-|4Lk|-p9g>lZ>51Gk^L^QKbC6x~_=F*S zGLW~*%c_l@I!+1WX{?cr)<%Ywn?-(4ahjRnd88hV(RhrUrp{%5dmo27oP|8Gu*i)@ zoa00Ayym2LcVj)%HnRCeGFj-W4p|_MRu2W@7|g*HgojouM9o3uyDr-AV+X8v+x*88 zJw|x+uT9Ckee}fsbBpu);NjbDST@Q6kDi-+O>xFQ+P)XYLXl>0aitjwBF#!uf!31N z)*Z@1$9Uk;V+Rxz_oea{l&~DRKKBU=wVL74GYb^x{Y|9}hb!&A%|fGHP!NH9h_Y^9 zz;d3XG-R}e#-h8J5eo1Qy-ckssN{Gz?SsxNbi4-&N?}t~v#+U|RV4?HSt#d){A>UrPzuCW8_QO;bnq>uVNo;bPl)Z9~+FNa?eVK*M_kg#I z4RX););IU8V^Uh!H!O6a9fRRs7kulRd(pD#Vvj{Ebdd&ff44yHpZcHdri9Q)dy z9?e2A(LeVuFP`@nI(n;d|G#mowu!dB$6anYam!9yYrT;FIi9vdTuP8-7X7_#eX_U$ z_x-M3ST@||YZ_r+b3Heo%Xr^^+YZYnIDJhCn$yW^%5W|4^h?+@#lP27d)fZ~JH!RW zmwkXlpqU!qUbFO;&daf{ElybWnF9;Bdwop{G`F5j-^EDUeA#$6EL&prHGOLvK4EVs zM*8T>CgWbK{d;|H8f^`)&PCRj%|L!&RX)qT7(QDMemUS}i|ybS+D-SG{!QIlAwBUTdpxHTcva>t5ysy9!r>Ut(;ASAh%EkMlp(;1^d* zz;}elBB%y`@%;_ay#83>YVao#+UM{hW`(Q457xQjc_p;M)!=^}vUdtEr&hQce9E?# zzw?@Gg{#3IbUaGsh25wcyk82ON>}?uozt4)k-cuCbNe4GU3~z*12%Nf)_uQXE=OKGi^Kj z+dgDr;S@{{1$awSxo~GVzuB0)mxXDuFS{EGQhe{7f)vlON43kduwqsynC^mtN&aC> z);GBu+kl0Yz<$!aaJ7Y533&B2&3gln>R6Z_`uMQ9reDZPOfP4pXn^DB3`L}vcc8P{=K@HQVza>slrvv zkh{qRS9|#P>g8G%sm)+vFX5GHs|T+3@$c2w_PNc9iO@B$ubmpW+RyCkYk&rdcOS>X zYGPlzE#RqR#G@C6%&OddHoT(Iu?(y0hTH=V@XNyIuCl<)EqD$9321vOn51InjHJhT zG4su4+OHAbaafBb!)IHR?k3H#eA4xfhgTg;TkU{JUwM2@S;oT++y2T+7p5Mu!=(AX z<1%TXsgh$SRz_{^fwb0En3Ut2^`yo6SHJk9fEQ6r`4yX%_yd0Dd2{-q&b$(13bJM< zEqD6*TIKA&t;|$j&N1bR7bdN-`I>&P-5r>QHDKF$Amt{GaGh_hCT*~%uX<}EFD#kj z#Sw0_`1aat8L)Bu6keS&CEpE`wi-O#Si+jfwR}L?>nX1LTes%bo4twg39EJpqo>oXLhZp1{{&^jB9;}yno0t7e z#e+TRxPM-!Y$rz_#$mi;hSW9|m~`4duXE-#lp%+BI+S zqO7UCoiNGkpI5%a+Am}@uk4!I-v*QZvHJRYWZkiU2xguS#lAkofR9bSrl+=y3Z0{Q zjoH-CaIfdSVc5XDWY{HS$9#tKiqeD4|JBGAVc34Z@)2I`HZ{%xwn*Q+Y{k6WH3bKF z$=uXL6WB_)l)h|w7t5H4$14igaIyz%W$eDD^6o94Hn`7=_ok*h!B)}iYpUY#B&N*b z6@XJ`VZds>dD&`McY1z8HUSPH^(!OTYWn77t79^|7Mpl2;?(&T@Yi@qU1av(P~q&a zK;EY}M|YA~2Lj$_?}Nju6Lmqr`@ArHE50An%>v$MiAEW(6Ny5=`}}M_W|tuoL%{o- zwzS?%qH_p%pXVEw-bS1d0q=A4v*fu%ED`WN?@e!*PwW%{?=ySo+UZ1b5%50iZ220w zB41-)g?OJ0J6)yQGp9Q$hH{15MQXXkMTiNz$~eO4a6&`ne*0q@h;v)(-7QweyVbtALO5-Cf-`&?RX z?OI}X33#779JWqG4-@b{T_az?E77mm*HFiQc%RQsult9HY69M8e|r`(e~wrMyiZH= zL?nZ`Jp$fm^E%Vi2w0Vv>oCc66LRqrhJ_2qwg zpV9UuF5)5zc%Ko;O_8Q}3H!>yy`mk;n|XDtqvCYK-^4-@@WqcT>vEc?ECRlGm&AN0 z@nHmf@k_UFeMzJm0bhK{kQ{sy-NwEi;>sWNT^&~cW*T*3D4sTV9Rj}i!G@n$XOp89W@5bxf1!;LE*1nPQ+T#Ieb z?|m26^sL4>1D-dOKYjZ~uwt1p>XDhNFKBC60nXZ^w{)Ka+?K0==D=oGsfE zTSB0>Q@(GFY@%Fny`BH)bS17EM0v6TovwaMR@o@oR-n_h{KVw-l(8$&=`!gCkEXO= zflk*eQ(pOna)$*vT~p^yC_@Rz0-dfJa2|6%E1)J#J^O!jy3RLlUWZblC7rGw8s+_b zqMtFebw(}9PZ#J}eX+ZSos!%IdRFD&Q$nsl2X9D~YW*pz zSD=IU_Jg7QC^cBp!NW&c@-M0r^({*$oY+kK41rG9y8a z+pev{{)wTyX@S09iNpbqDEV5T@3%d%SQKS&3-tXACD-+#G;o2w-^>S=R+LLF(D&P0 z>z1Ap(gpf{i8FOoD63td@7HTsO}r32u>#lk!w1XC@oMkBcuZ=9-M}c&&+O6Zjh`qPS)iYJFK$#{%4inoXWj`-9z$u- z0{zTG8SCm(ZnZ!^b3}62a+IJg(9hgz+IX3=yaoE1BPuPxy$;}N6hlegt9Iph<(O<~ z4LfG?{HYVQFyHHU-z6o-?W#Rz!#6w$>+BqC+U)l2wZ&8BiO0z^xlWGsU_P1G*Yus{ z%_k*#^K`JnI>{5t3^Mbavcfva@mGE*;E8D`6V0&bno$Y3=x^JVa(%5lyY1v81LoNI z`-<0m+i55!kk0f9bdp<7xI2yK*`1u_g`B+(C1B1zZw|bSuJL+-PV)cG&WPX{ei6YBtY;EUc6K<&@qxcq-+|AMKD+U|06adF-iN=cfuhAM@l+Gvpk%`kGGISX!f+ zJgM{KZVTjW_wTjCF>n7{SjhPip7RGy|ItZ)eQb#{JiWBAPIAtPAN%nF%!PH5w;!8= zBV6Vd=p={j{iq@@1%2`&F7rgEZ-hyjtF79%m>JaOl{4JQlGrzf}8{X2_NlU_IEtoL0-bAEJ}Y_G>c+7}!Go#Z1IyN}^Dwom?R!(?dxp=|H1HM}jB z^j_x>=p=VIf2$s^_I*lc21ha98aj$Q%3L{)%i2yO&`EBiZ=~gQ$4`~Q;wzuKl_@WZ zc4ox2%jCt&PgTXHL1tgmVB`A@tGDG9&`(u&!J_DqPC%Mzz8-MeH?x$KhVUhpo)uKw)C8xS$GSsU^flhMwXBj1UY57xc z;2G85qV$zBz?tD)u!z^EKh@p-(ERQ z+$}F2+{v@aE@av;r_I;2sJ1&|iR}VUNh@5Zr|)4q<^?y_3+nV#O&n5|C&yh_WQ0YN zHNFu}_Dptun8h>fF096LZ=}iBG|DnQd+I=*rgvd2P8lEW%Afm-`Z=QQ=VtI+zYFWE zu&AAXul9!JqjzDT5f(w6p2-6@F6CK=7j|i2Q9Xaa`i?qf9#7|~ix>7dVUgY+u(aX% z?e%!3HuVVV^gJ=99p*`t7k+ih8h@0`!8QIG8}M|+v=FY`7br`ay{TGh&QdQdOZmlK z{bo*eFDy$rJaQxQ(2*~H2v3keS<2s5d~=OR_X1hU$)iu=myE-Dfh=Y9-6z@*{a+wU z`N{b%2aEacS%=4AWM0q zYxrRjXAsCz9(a(49JiAg@Wy{-DMR`nKuXVRG|ee=OXz)xc|*_>*6#5=Wp+=Y))x zDw6hwK&G>OLYWUqzyk`)bnbt$aww^Q2xK~|@9#O5q(lTVom)5DK{b?Yn?R=X-8L!T zlc-C~lnY7R_ugFz zqkiBC(|5aJmEuhrU(;su#7(8LdDeA87Y)R1^EYkR-|4MC$5XfC)@UGhn%=k93DYY> zil5~9--SyH)gN8W%9F?omlo<#y-X{fiC(z0P|T1$%Xm6_+$jsh-L(1ox@B+Dd)--{ z6aTc73*zpYd`-FbQ{fMK@WlGK%Q*N424B-d{Ex6) zveAKCRC+iq2ea9yxTy^MJue&5Pn)1%g$J_dn0!rNnahTEI11Tg@Nw>H8)W0C0oh+#pkSQ=vJd(`cC!y_dagLS7_t``px{R= zIQ`ha*T4F8%_csC>}A;Wvj(#N@;6;EPfbW~je+z~u-UCDI$f~M!6McxCoP(u=#CdR zL3W}E3LG{TvB55nmqq+!NetcaFWl?ygw!Q=7V)!xub(~ttoqNqP^9*zDhH zi>3SBFS|qjQY$3%#lA3yR9XNQvE5LkVaw0q_Bb2Fzo%yrJKVmeosNWrVbkC?J^+ia zZUBFQ_xSn_e`Y8bpN;M4p<~+^?}Kjeg1=OF{2koy8Jz`Gj6FTyz#@LJ`8qgYjxMgb z%WJYH^uns`tMwG5t_$L88~kaoTwm5x-HB~?-$PZ!A3fmVX(T#jYYWe zG4^o_ZdqvSm=SWFX57Msmw3!SvF(@*w|GpvZ+7<=4Q}z6SFLb& zDLKH5>JC!w7em(w337ZebgK@_DLyXzLEPeSs^n#X(!Sdaj@AscNE? z=&6T&Q#|0Wn0{A}qpsq`wmVPlkh;l;TYSF#64 zxc;h#V&3pT!7#5>bBQNdQq3h_Iw;o_z6FFVXo3p9IbK!DCg}=aABsJ|!%TeaF~|ki z`%{0Bm7VaYtsQPiiLh1e@Mxl8ixpjV@U~6H}tOex@&RoNIvkQ_KCTpO}2EQvJmAbgug8OKRsjpT2Zl0l%EB|vEuzq8;r;F5IiSFnqj^UlWXVmw$VmN8t9M|qfx;4{h14kTu_eTXx!-V}`6ndR2;g)^{$j8ZZi^ z{O*Q5gK?EAn+ch1z|VOkY!v7HEx_+3Atv~$yp!6#_Q3o`E|@LN0iT<%*kgl?-+0?1 z53CsLhA%d{2)P*B%9~(XO*?IU>wx9EE%4QE8ru5K2Fs(ZFzc9!ww7C9c`X-=8RnoZ zye2K%;KnU8ZLPLI^dkfAgh|ya<&0x(BQIqgOHMiOSlh(FLXFrJ0j2C?rfsSR%s`fW zQVufHHZxHkvW$~5k+sdOl#ML=cy2k!Z%j1^VutQn)^`xozNx3A zWhLe=s{qN&b86mT+O}TGe3p@a@AL|g@aDB|-eB4`Zc3k)k+<|N0Wu_i`n}3b+uBJv z*h=qRMZIe(Hya<$w5{Bf$gLoGHng@2_LJyRd^{&w+s#CI(Xx+!H)PuGUiyA0`}j9R zrtN8gd!JflpXW`ZGDc5phfk|#f_cU`rnML;BUwSV_pPN08UEgm`~8`A2<9x#u`9@S zdO^%E)7Ty(n0Anda-$VwTa5r2+PC$L5196UE=sUgkZpXcuIing-|+dzOgq3qS=tKn zb&nt>xQ+~H!nDYV2~D*q$ksLiGUVj#X6KmpT>}f9;u~ixvjC}izj_BV)Aqt+VY4YQ zTbg{x#!laQ_A(B7jcGr}W4@Ar^iK1%@UOfd8NR39)9OqcWv6s%1=-vnh#B^I|Fk1a zJH|>m*$T3mf93r#L;ED`y2-So^px1GAe(9gG1-cZvp-_m;a|4kSCBkoTpNS^toHe8 zoA3gsjm2a6y-~sO>~U?Jmoms@-;BTAN-r}{xP8Zh9Ug)2s&pIWWXs686Mb`3A;a$& zI<;k5RFA~OZW%fASG^!+*aqvH1DSRzj%d3Tk5_;R7D~I9ky7rub{h7xSMf<1?AjS-7P{Z6M7*n~<1^F6LJt^aU-D(&5l=qu zdta3Ldc}-dOuH73Zmvy1{^=W!3R$wmoDvvwjgwNb6{N?Zj9i5*QQG@Kai(2mr+jV& zdC4w77C&-x%W|e&VWgyR1$ogXKo+|_nz%a4^eptMO+j9;3Xr<~*GK=&wBLFuJzYVb zw+N8hWy41{W!lAV%5hha=gb0RL>^F(r!)d2 z>m40ZgK6iwiGiRXPk04L_%*ZiMy8!(B^rZ*JZ={tLps>M{EBJqX5vElkX8XwQ>)>H zHcb14kq8wE@`{trS*MqU-c!ad&{Ht-NUKTEJ6x+i>l>!sswXOff^2ONAVXGt+QZGXoA5|HCm@aUYJy#W z)V$_STEw&)5&1-k>3PLBcTZhE*FI-yJ^ZvfYo<(nIi?3$7_th73K<^O*?633Pa7%S zUqQa?>s^HmyVA3IS*AUOGkS@DG)_+gn;>Rr%#LO|nD)4rhzAO?zHdEMF2(_GZT+OLF&B%q^8}o zTezNw^hCx`kadjozBunBR)gZJ?IGU)K`3*4Lg_=hW*^n>p>PJC=qKD(=D4s6hx=^AP%v0FwaI7G;os&uMd zhw18L%s7XPOdKadR{L`>vol>?8>N`b$ca~t%KE5!uexyHfjLZ9+d_HjGBRPgNr0^K z*8V9In65gmWE9Sg&uHRuuK-!Of8)E2nXamrGUjDuVkc3|N=LeW5yEtp-IR8(#5`yf z#H={#@aQ{CSJ6tj`wH@jM}Vxbq2uS}nXbH<2mmrN;iyA^EdPxwdp6URH4=+JLGBUt zUT$`S(l(|mttTpijGXYNXhvlZ^;|oM=}LNu&!EJ7E{a*E_o-65nXb5^-K0%Xb9 z{$f2CsWY^8+}pL7F4{q<`7$y{ouOlUFTTrkRukp-%g7*ghQ2;k z@R;ew;)u?AWMq&!L#t+Pt;Tf7ibtk_j0{p|XxRM%6Vr|G5M4oundws2Xo{R~8~k&!{_3|%;T9M`k2hFCf>GDw}FX*Q>W>H0W`>LVkA)EQbgq3!^t z>t!Rpkc#2RaxEVj;Iy#7mr6A831jxu@ON~dE&SWDtmy8Tj zXGnYbcns6Ew-6;vMh2-fH2QQ#E2e8}B3_w{3{q$4#K^t)&E|Cvk<(;kkUB#Nl|J~G z>0WaY!%arcGKkJk*2Q{v4b!!B5KT@-F5PJo%pGP{8(ov>n%jtLCnJN@8EUQ@f$yWH z79#A)$RKrw-t4q(Cet82tw-z6i1)EWBo%D!eyH`zrzA{iN^ z&QQ4HCA^FD2O_(muLj)}u8Kllox7JU~GTk^AvAkrYM3vH| zVLuNPpG26_rQ_$@L#K?BO7`h8u$Ka>;`;_$nQl6MzTq73udp16V(TH{RZx~l~4K9T|6GBSLLU&){3LND*^~6Ve|15<$OtgTIVO~|ppQa4Ijv><+!&_W0d|sknU_eN%dMz`?mF|im(;3sg_*#-g zVnE2^>WTl_=$}t8WCml!i!gCatW*Bzh_h1aiRbmdnT#Q)F{Urd#LK$^LY7re{QSjZ zzhcPgjFm0Q#52tSAuCu_ho_+_?Hvp`gE6fA@#2T4vNIqgZu-y5#of!z#*i}^tNh|? z$s#F9RQls2x%~=Mp<^~61=Zc>PYgMSu~&;S@p`U+kVf@qPvguF=o9iQ#+sUnF!2VCfRHUr zsw4j0`q~#U{eOpEEIJ zCSz}CiV(7K;3(UxCq6pyy?hLr#aR2IOx$P*n0N>E#Me9?avVcuGuELf6K@tc%1-Ku zo2=8$V95E5yOt9rYXXCet-I!wTQ9zT}3!NCPP5TK~~ifUvuTPbPVZW zY;aN5vZE4_e{*9Ws*m_h>#|e~xtOsJi!$-IJW5PH@u4==DAR^lj>M2l7#muYiNEa% z2>FTnBnmClh;EmB%h;zynRpjRK*$jq)hOFuYu+3~E@f6#*hd^d2E_#x}RULM@r^j8eI zim_QmS42d_b-4VHk2XWA>sf? z?ExW|t4|`G`@|p&xt_7*MVa_8Ye2|V>XT@}vM!r205g#?}^PEr$n=a-DkOr9aJkA4C4c*t()je55&G;v3WxFTcBK1cuzm*iS{7_-JE5 zNL)Mr#HUvq{t<@!nXyepnfO?JK*+5oRmd-^tloklH!-%=_QHpUh(rM)cd1YH+Y1L> z!jPL8+x6l3#z2zf|7@n>tM%*2q}7(4Xh6DM+2K*%Fr)hHWlCeFZ++Zp@aScFl=2aXaStoTo& z<_%g7z>qr_J64pnoESLDlNMFT?|N75jUjh3cCsiFPcjBf{Io+Avc4fU8$-GnJ5!X2 zPtpg3Jm*n`oOZV9Jq)>vvGYZlxXl|7@{;-_>Xuh$3WnUx*d=EX4$suUQC?P`MDZ)$ zp^$qRyIhpDObHz2HT4niJYhyD47r!FYekuOnmb_PH`Eh<>+E3qPPC7)8%3FThBF}K zZS};rRrrmr>iZeHU6hGq4xRkRzZ&FvRY!d9!d^`=O`W#V>gz{CsG6TknU_k9d`kg>-_nfM%YK**=+ ziJzFBPrq~zF@~9mFa8B)u2CH_RAW^go})IPi`!uqs&T$>NFr+ngkf3H2p-dWDt8Fr*vZMVa_Fu7Hqw^(EMzcYQI=D$<&l26 zg&6V}3oTcawOkxH%8KeEUUz1>BN*~H3$0j`iGS+|n0OVh>hR24HR4kYd4h#jEy~2d zvjv2#uAcbkk?-urkSAGa^`cCCxg{WEO{;2@uMKYb9frh;Ej67*I6Nx@M#=U%HO26m zZjb*@6_t4XB>pC?BtEHCDmJsfeiG*~zbe;H;tb~7O8q3xUG~>cLe{ds zeiHGO1@)7zo$rdzu8?|LxPDS($8*TBYV8!%Ps)67{x>243+gBR9yfeEF^L8BlPz&ji2f_6tyIuvJaW7SVbu&~`cG{o*Ou&8iHIzyt<=D=d_J+61+|qt zM&o6ooC<0yO&vYHKJiuswUtV&?R%BTuY%f2mvZhz5QA1wTj|T`J$DifS5R9iwBr@b zA0J~C)K)rkDq#{4f(5mec3s!+B37}gwh}UBRkf9nBde;dgzQ*BZKcU;V;U3D6AIT> zs-XEQk=UY8xVBQaXU395IfcTtmD=2&-jaB$P`I|z);cYaggx0HsI3%oV4{Z@w1V17 zhX*%AB5bNfP+O_?gf+8>%M1S6O2|)D)mB1gDlA*9)K)@HDip4*G^qPBq-=hH<#@Jh zu;!6lIqg#qyJ~M3{+Kw0P`I{I!D03;5fcTqmHNXBWO2=PL*d#=<}w325k*o^Tge*! zGHMOXN8yXJSkI!s=^MtsjuX3^<`P*G3fER@v#NhIF+QPiZKdz3nb#0)R8U*##@*a% z#61<%Rjia-pEM(w4mMUnYj4pte%e^U=7z$Gw8uO2@MQ7(!f0L2ad8 zx0hxS;Zjgr>2yPP31V%kYAYcVQB_+BIf$y-O2|G0Uu`AMJM`C9LdK!0wvzTQkD#{F zg60eMS=r2@2O% z(q+cDh{*&gSG@nJt@N}?pR+`V64X}OUE$vt;#5K5+Demj&!-VF3kug(N=Q479HRmw z6t1nbv1iMPL=h9zR|H_fAk->CBQcwTZwdsI64D!nqHK1t_Sk^ob?JMpQy5TwCd3ohE-19}x=I zRx;lX*+!&BC|q0V+hx5Yh#4uUt@KXjCp(B<359DbbxUwBA&#b?w$dk^_W}_;p>S=b zZ+BPyirAu1xVBP3Vx1C1ITh4aV%rw4Cf+I(uB{a3-SZZaUmN$y%mv7ouwjYAcnxe-c?N&256( zO7#vzR3YMspte%j!0|s3`$SM%De}}xT;JC{g4#;^whbIZJQzW3rIM~vNRereBSa;& zRd=Od<@n`z)ji8ACCA|zV6q8nD;;lrAP+RF~>$L?$L=)6jT4)R}MQk=fZKVNEK0-S4V2_}-k|ps| zd|Q5~5!6=tyw(h)^?YOy)K)sXx6@!^_z7w&4IDBOX>Ffa1hth)>wC2)uA!i|($kHT zqKU95sIByK$$sw;>rqf!DRsf@ZbY3F)K&`f+*nWiOF?a=&oXG*SS4wrOZn=ydb6v-xOx?dNF=DObam|5&xwsB zsI8O{`u0ttGzn@eoorlCpLkJ%+Db>`e#j$om8!N95{6W@m5?d~>uPzxM-o!iRzi9Z zudOupH$C3q(#>#zGY>5dQh;RbGupsv%U;PTX`e~HCI;EZ>sCv?rt;2`_L<~sW|DDS z`%LmRx5_@QeJ1%@T4Y}k?Xz}MUO6ct-*(E#AlheD%)RGH$hYiD%)54l$EDI!3yUvP z2_G5K3_BB-~h2LcXb2V(#*B!&EWZ==a}UA|cy)Wn>WTvz;TO+epYZZW$Rw z`>b8R`UVNv+9@NicNO)n8Pe(BW)iZM5|dYgmV8}&zO`oZ(9FA;=ru&v#U-2c&txCh zK9hVsEwV3&_Swworcn~oVpNdr4a%yk)W^byuB~8|kVEK&`u4Qb3y@(o4#wA(kb^u5 zvaLpd3~iehhK~to?EiBq$TnU9lKnk*?+gh!z@Z>t_Xv>Cqt>=P5>mejh36LS% z*H@b_A>TD9FFJe__-IFFNqhWAHfr3u z;u3PWS3x%Mue=`#NsbkmghMeubt}lmc0tUL(~Ztum5{@n3bK()fYf~Zc-YSpQcAO+ zalU3D5A_q{>!-GfyU-WQEyC5dE50}{S?CL*eOApJj!!u#V!Dl95gA1LY+{49RR}>h zUg#B(Gk^81uu6R_Y|`PMe;@?iy`fh`2GKt2(D$>UgrHkM^h(ITjLK@LVzR_GGsh8v z?jzAF^diTnIA2>%b_5VC?%hnDn+xB>z{1A zBgI_fRFEEr09hh)_tG2*xyr5}k=Ir@X7SzqK)%kbFe=E4HUYBOd#m33M~b;juOKg2 z1xVd$&8w#+!`ClmSWCzE65XG0TL$KZ&i|zbF2#TxLtq@xp%_3K|gxuq%S3;h1Dzi}`!&)?+@<2jjB9V;zS`;(%Kn~@u(;Rp5QDDp1_3f;cTV>X5^|GQMh4L|t8lkcCkeSxLGrtO zlJ9_7-kaBnmwdn4WM2^NvjLB0G?$QPmAyR;9m*(GN@3x5Hof$rggk9jV!mt_Aj3=t z8qSiCr}PT4flYu6{ZKPS{-i$cRgm?4M@ZE>n~`z$ODX12w}Px^5yXTsHhZn^{5Xy#k~rUBBg~ggm5Ikadh?(K&P8Nw0V&cxrpdBHslMy`qn6 zpOMY*4y5ek+Gmo_WDcD7`fANk&R<3&aW(LS5p zw`4mBS>GcggJ_=}T+!{Ggsf|mkwLW2vMbD*D6|zFfgtS*B zWO=iU45EEj%F;)APvTuZ1-VDmdpYNpu^&q@OY3E15bd*L720-`kR`oJ%;%z*WxC!s zF$r1Rt{}al8I|6gbE1ue)L9ke4|c)a_0y-AoDwq9EF*(xpUti_OnO)1Jy-=<*DHuw zGGnNIyc9E3FC!B+8wJP`(MR5uzG>s#U?pZX5wiHe;kv6lCf-t3kkdsoD&}!i{8vIg zwJOMoEG=l&c={6Z1Qp^W#1=(NJd&IR( z7q>~s`%VSf*DQz`zVYybsuD8Kt|0O7%HQQwXL49$&1V@B(rZRK6}!6y!5*ZZ*0oQAlhexC;UYKT+fe9^orvQqJ7rCdfCo|pj)i;N-J+L z2*z3AOqG=CgrNJh^oPhL|2PE5@(D-U%_jui?4?(VSqxtaYoDdGs-8^zL%dFblX`$cJ-Zes`V_B2%|R>g6>@_$VNs%@1?)ET}66l;tg;a8ASUmY5I;T zgrK|VGBSwvnJGKxgoNzlkdZ;O&ny+T7$jsbn~V&ieO4u<_#+9~!y+StXrGnqy0)2w zlcd+uk;%apZmzjAlhfTlrK4g9v;caAlhet zHU7s=2zmk~BWD>z=O=s5{$W!>&|@rmr89Y_NicU9+Vx5jA?R5cy&^J*_E~(-OY*tY z)FLB;XrC>~-h71+^i)np2GKrCUIA+*UPvTMuLC-#9WDxDM z0k<0*l8|v889DQJyCA0Kxpnad2|3OsBf0jOZRFOQ5Ov(iEfYljA>lee)Hy5n zb%dx(67DUCx-8*3LDW^r_cla#H*;KPi0&0dO@^RvU)>wjFbEN zK=gPCXNKrR8~42f(bBIfO<#ykF>&9!5S?M>R)2`jc5~~05WQS#9SG5D4BR&uqIXL1 zK7i;w5^e}Y|KjAWA3^jS&BjE0z6l5Y&e)U|NuScqxh;g%I*nz*?2ImF0kNesl`H(>f32Qlpo+=_#k zPTbIphnOysZvw=0cW`Gs#PsrTD*ospV&3P5CJAB&S-6=DF+&{OnglT)dAMbR zm`@DcngTInxS>gbm~oOX6=KGlxHBDMYz}T^K+IHWt!6^ZYzz0zf|##t-1-7yGF{x7 z4KWKG-1-V)RvEaJ2{9Wj+{%HNV=itjhM4mnZmopa8IrXMVrNThzZzoa*m&z2i2d5d zt+f!l)Xc4Q5W7(t%X*02W9PmfA@&z5w>CiRAqlq;VvoDH?`Mep!@{ji5PQzVt<4a7 z$-u2G5G#E*)NF;=YYy()2C?#WV>`s&m2f*CHqXRccS7tx9&WiHw!p=$T@d@!!mT|J zr;|po7vf5Ixo;oDm3DJ$Kg5-{a_bj}t1RITK-^14?)w$u>X^875aQ~4xOE8PUU6~j zFvK;naO*dSlRhgoM-2ZIcIt_6j7`Sx?;y&Vr<}Abwb8zz<#0|G`>paAbws7kL z#92+;x(IPG9&TNNxbZG-c_410gkh>I;NsR@i2KpOt$Pr+!^5rn5O>zVt%neI)y1vH5O>eQ zt)~$8g!}L=@%TvYLyF+|vL0#;34`%fUEB(X@ik1`ih%L8Bwr+qujl4IEsSr-#}}f5 z@r}*gR}98Cvv8|8jBn}URtXsYx`|sQVf-5wZk2)w4<(--Cj4vQzS1z^ndB=2@um4J zL&`#Y1*x?h#85^symXd?RDt;BlCLVnzh>mPY7qarw8u*j-&Sg^4)Jd~ zcxw%a?`Yzd0pdHkxm6S5%}#FBhWLS!uMWh2=;gk;5dX2{s}J#?o4Kz6#K%h3%MhPr zF|EGPFFA%2mITTLPUTMM_ELA-Pw4`~kZs}0=O0^)xlLle>x z;@5k))e7P_y14Zk#BZ^1t2M;$uyN~kh~MquRvU=l@8VWlh(GM+R(ps);o;Vs5P#an zEfd6_H*l*1#9x%g*Ae0`+qv&8h`%bec7pipF7E3L@wr}Zb%FSNE4R8r{6nd=8^r(X z;JzM^z@&IRAtA!eeZ3%|nB?mX38n1ZXNH7I25!9r3Dr#8>I(_@D-{1i-i3rZWN1SA zK|*~GxB5du6EZX*gCW7>;ns(c&`s*&V@Mca;J#sy@IR@yPa)w$Blmp<3DW06$OuUI z%*1^oAz_q-TcaRhtcP2pAtBnutuc@gXX4gaNJubnD+&^lJlw*{vC{YBkk26@)x>?# zkdSWRRtzLcpAaGAAaRk@8ViZi`!{3)B>p7f;vsR9p6`(WiCd*HPlUuBcJ51p#Jyf_ zB}3u?X^$z8_`t}0Qz7xWn_DT6B(HcXB$bd_(;=y{lecC-(n}I<8YI<}eA6MRuAR5e zfTWkL+?okV(p{L4S&-CJ@_hkGEzP`jHYB}nf+(nSCG`h z#jUxJ)W^ZCd64w3ja!+J)ZfLeY)Bg6=GJ^j8Y5W?An9`__k9gXu{Lfkgro#AG$G$W zQj*k~14)w&+_wmlQpwPSI3Ov*!>z@TG>Z&P$P!4hd${#2B+YekYbhjUJGk{7BrUXY zYZ)XtJ=|IjNgG_;S^-I$9Nbz7N!x7PS_Mfi3%6E7(q0?4)2C+OeuAW1WN1P*L6ZC~ z+YCvM9o)AClAe*F3E2wCAueuhgXB;Lw{}2sF(bEjL2`KmxAsD^!OpGyko>CD`U@l* zz1(*YlHYK1>o-X5?BtdklHZYh$02#JggXVvpGm$mkQ^=f&O>sN%-iY39DmFm;#I`WH;yEBUU#)L*^4^(svL-NmhIF!iL7TYtmUvmS2Uf~nVB+`0`@ zZ|b>q7gEA4+{%R%orzm{kWx#Emk%lR9Nc#wQeJj*>mNulI=S@#Qd$_e^$=2ClUg4E z3BKT8NCBj@mvE0ErGtn2{)LpcCEOE8=|(P1$Wut^DdC<$N*@pRJ%^Nc?PTFE#gqYL zXdnbq267w#qW#hP4Aho*`hZ?xm z98yP0zLt<0E%~}Y>IxTc?FOl9C96B6uCsApZ%CD{i4X;8Z%X@OqJKv-Z;gSp?rv_4 zgS1{2ZpA{H^mz_(koK;L`^H1sdlD`l(mpV7-$Y0oN`?j!A?*{%N`f@$90wbuMLBru z6i7?(aw`SWCY!jG3TY{ll@4jsq}CabHqXjiXF^)GlUs8jZ3P+lTprS#5^f%(ZLo7+ zCZtK90gwf0(q{luX5+)y%Dhkaoz!t#2Uhh>Ke}kapC` zEeE8Xv2bfKq@9=cSORI6jNJDvq+K>}Ybm5%B?IpoLYjOYEQ7RLdhS~eX?La86_Doj zaNkNu%Xf2YHKaX}BCmn8=T`3f9@0Vbt%dY3a%tcPNY}c!<%D$k99jqIC7s;29@0yj zxb-8XmvwXNCrGbs;MPV+e_6u)4C#$r+_wqRjV5kwhVkddCVB)@=kp4fZH)NI#mipKQ=^sk1yCMA}sdW#eOTPnPFQk8Fi}8HJ>2RD zS*zUKdJD3?w{WWyWXY@cHe~%I?a>*s4tRNMSI9bQ;#N1vx@hNCcgT`HqgW5fx~=EF zo**484eJG2^3m@NS|Y2GrIrsl0qDc-YrhmFfAlYx~C zP%tk!<-S>ttEHgpZpq~UDqv+l&ig}uJs+>n_xs(1u?=D)x~~Bx>}5pXVx=Y{S{~KH zUP1I7MpD9FMf6=(Y6_z7R;j6ozRyR!hUohZC}GnO{h&&{j_8Mc)EkI?#DEfJN3_*S zO-JT^dz0_Ekr*j(>aKi$I!5Oh<;tJ^L#{47rl+>nNIF_2hsC1%7N&2 zebl>%USg&eA$qw1C2R?z*%A;l)IxoRm=SWyUc`)+_61_bi1s07tb^+k5%a8x@*w7U z8y7cq;>R4QVY7*N8}5c9s7N=M8}14>v1 zVm3OcOvG#v9Y)NjHnwjNv)w`+LCh`_brdlz_jSh*6D#dFViLTZokC^YwQ~_cN4JcuL#FS`M z05L!KsMClkw^QFCCS;|)N6arF>I`E3@KHg;T-K;U#MG!%5n}4iR54;23@BkGh>`D^ z!b%Zy!^c(z7wptoxWcW}k8pLiQRm?5=Ah2Q)l*tITsK?TD&XpCqAtMIPp2-z)!$5o z;JV#_67~~ZcZR5+;Tq(leu3*AjrtWXi?rY18fGLV?02{x3{ii;)pEaa39g5Yq=fwm z*BH4jf5A0YuFGY(#>;i7gzIU!E>&<%401;`TsCPnaJ^_@)8U$IqH5uKRi<@ty%uDv zhwBY#SKyikYJ}?@X-#mwEA2X5?|C`>8?I$C{RgfUGW{2> z)jFp);8KIse{ikw8fvY;6~$@mR&Z_Lv^C(`EUh(MJEXONYqys>+QJnlihxUVvbBS2 zuY>9USF(lb2-jCOsuNr((mKPH>SHs(l_ArvaDC%s>ju{`2h|;}69$ylJ>kl=Qa8a> zAnFCzX*1i+aGf!rwC)X8VTkGj*KaD-7p_Zk-v8i|$Me?x;HvU+dJ9~-oif8!uTrQ1=Z`l!3$?rf(9!QC}P4Td|?N8Jtg zO&WC%+`U!mKDY*a1T?d2jCuVryhiRq?H;D_akO% z1l&wY>xbZeLfS~U$C)@C1^3f->S4Gi+Nek1CY08X!u^7oZ8Y33c_}O0uQ;j4;GQbe zF>p_l>Em$QgPcAA_nSI37Vg;wl-5teJvT&+gL|Qc8V~mpjd}|1_e0dvaIf@H&%phW zXad}89c&Zf-mFrS;NEJdo`rjxm9oJtkEX3(fctZm?IpOAMU&z7`q*BDJ5w|T?jts~ zsc;_)QLn-6vs2UH&azUk!=0;AZ@^t(r>4XGz5F|7z#R;+y$N@*T+^9wpEtA3g8PC> zy#@DAGMx?gZzi@maQ~rGbK(9gNX>)0<<>bLZe7~jaMyb|T>$qrX%4vm^Rc~)*f0Z1 z>&1v|FM1ELog8dS5NmQ$OA*^$+A_q-eQfLZ5qq<=<%sR8a@`8V-l9<}5!*jRtwQYW zK58{$2TD^BJ4EymVjnPb`Y~ch7*JZTLF_0qwGOdQn5gxL9cQC9AoghswGpusozy18 z+B9l2VqZ|HEr@;DM}30WS2b!YVy78UT7QaIyNPll_Dz-AhS;}!)ON(q)u)q>PM z#Ck*?#HN_ok`S9_qmmJO$Vu%->|qD>HDa?Y)B(ii=u|3Vi!~}8u|FD6S|3F0c`tPm zaeb`RDa7?NQ(1_+)qv7E8*u}iR4(EMNy|r^#l+@E+=F)NG~yn1P~RhNj7kL&H$F%e zA#PHLDn{IM8dZw8SLBp3#7&WPXA#$OFYqJcW*WH^}H zSg8==KGdmS5VuiI{uObXHMZXnx79-ZjyR`}`V(<-H`V$t#Kp_B3UP^YijKIHAlKC+ z?y$6Lh&w5*32}aD{~)f!#C886uAHq65cfML86mKK4yMrj=o-^ya_Xww<-?WJ`^ ze0OP)h?i$5ZEiyRAf4-aBmO}f^*_X0rI`^w!AMG*+Yvua+Caq5HL(pw{900{e@NC@5%1I39!GpY);)>%GL`Kq#Q)@^CLsQw z5cMn)A}rMNNa!xpmypm;_P&CIK_*V8BH;lC^*R!)vTiyOp3&K6B0-+#w3&^B8M1C3 z5*7qGU4Vr5Wt{^FYi(?ck+3C1Ek(j^14^4^NQjZW?;|1B$+jE`p9iTGNZ4ngRwBV8 z(^W{=Z)V$pgensi53RF<(x63#sL!DFGN82i0@^KhY9F-zvLg}N?Q)(6+CbTx1Z}X5 z>yn|}YoYc-8)Blqgf>jt0cfMVY$?!2J1H-;$8A(9v~jX74cap%wsdHdbm}0q=R?#X zXp;>nZ8D%uQK?L5ugki_&}KNXDdhI)(~|8iEf#Okhssr z_A?UYp0&-dNX)dd{f@*F4(bmi=7=sKG2hGfClUiX^%oM)IH^h`{^+BskXT`-s*xDd zs2U{xYNd1}{-IK}NW5&P>X2BiQT0fyvr<=(cvYpYBC*L#T|?qO8r1-gVx=142~(*i zc-oq&>+rOIOW$?9_ko^wA83EAZT+Qh?_!2i5$iJ?}A5 zt>LlQs5bD(EjBzHp5d~tEj*)ST?9Oj%DQ&&Jf?F;dw9mmx(@I>CF?rEGeOpMg6COT z*BPD{EZorr9=R6?H^DPS)^&wP?(4$4!82Xfb%$qWkUJvbnIr3Zz%$>;))StEvaT0A z%gt;z!?W6e65bmg)k^h&XHAIe3(tBp^*?wv`KW&IY_(Fiz_Tqxnc>-Grf!8N+DG+= zC)R)xJ^-GC5Oo_od(G7C@Fe=EJK))GKncGSp071(AUvsN>MnQ=`lvzh95$eY4~FNc zmAV_AZ$s3*@D!M+``|h4r7ZBA(WxQu6g#P*@SK%(_rr5e)(wNFLe@P1kKB)kKM2pS zLGBn1&m~zm0-npV?jd+;oScq?r%u+5g6Eop?O}MDWZfh1{447oMUo=xMkA@Utg|Ai zt(Q9-HfD!KY^q^IyDwaw>YUMku<^O4dz6(xbBOStN~daEA>^V`bfQNP0@vJ&&XbvhD>W*<{^| zNP5A`9WNnivaEX#OX-dB>)u9^SJo{+(m@M%yo01nnL3bk($2ORN#BWn5pGRs*tu4Nk6M>tC93akopiwl_BaQB-I*F!q*__nw?sUq$Z7uLUNduT94!o zI<*1Gokg3F+}Fmo8OgU8P{Ow$`N0tN36dXjQd^Pyu!H&($)jb56Up-Pzwm8H9xH7- zlE+)PZU>U(5jK1$k|*kHyO3-PQoE7-g0wwIepy;Hl3(?58iVB5oRka6Z#XD7l4nSZ zMez}P+uVVLz(VFa+IAd z5y@Lr%7f&sJ}L>x+cauFl2e1!mqucIqUOuV~aMBwq_rSxCNaKnc%AvOH%E z&q4BkKDJ!!Z@I1IVSl)j&5!-P4JhFO?C&cd=hN8Va^Lhl4*V?BGdS?Oh3kSi@TZ+B z#DN+URfGd|I#q&{o+?#}lws1!kTN33b`~iQ8&JZ}A*JOWsT?WKSlKF&GRZ<+M9M~K zA*8f?rhh_;rg8cUQsk!<;lCo~D<9i$Nb%aJ-;t7Tr~W`nhE82VO3UZ`Pox|Vvi*e= zUx>Pllxzo8iIhB*szOS@MpYx_dplKwltMXAM@osDQj3(cGOb6-&$8nRQhu`-JKBcB zJI+Bxz$^c@w(a44#mv?b-Zw;@;hhy?Gr{||s2jYCHMU52SJnPHFw%b(=Xg!~2=E{_rMAyA9q0((ZuwkhFpD%15Z}UGN^4Yd;v?QzoVPzqWV7 zn=L!;h4-}Vu)tetZ5}FZhrs)zw4v};7)fb+KfFJgsbTQSZM^M+@K(#o55apq#OWxc zwh}#z)HWL1qcGl>x%t1gR-{IX9z*I)KDNh^dW)GFi_|+rP|1)bfiYh zbOusmt!!^1H9@ClB6Y8gnuS!40j2HxNb9UpE0EU1N3B9yU(p9hyUot_A=2*DsE?6$ zUyxdZw4u`0BJBYSTNKhpn5lJ08|kGsBh4n$El88^#@c>@w3lSM6=_qPT=yx`-mp?m zq)peTZAhCLq_!h%j)~fVw0RC{C(;&5+l92nA-3H}TP7_UX{yQ=gS3x*lnZI=gOnR- zo8**Oq;0jb#UpK(w9k>I$-2Er+b7dRq@|g-E*WVjEYw#>JME+nAgxrTQjqqe0i~@M zY2_-FinNOwm4>vRtyDVFehpCvk@km99YWe)K`H}j|9YuRq$@t^Fw(>9)KR2&u~FY5 zy^l(rMEad_N*2=ZbFyV4eW*-xkp6&~Ef?v-eN-OOM_Q?Tq(3aJ0O_McY<{GVkrqJu zSdHy8(#M;r?~wkqwC|BV!N+z6>61cK5b5%)plu-zCCRi1hf<88(zY0f((F_T4rMr~ zQXKk5RE9&}n%U0c&`FK@0f+K})Q>n62vO&7=!}m#k3+wT%5msV6I%riReGt5ICRZI zg>dL^jrs{0ij(>o8Lh3Kl`cuQq#LdINKcO4lE zjHI;v8yOB8^$#)@Td9AMvD8A{K*n;F`VSeayoMs0-%amBjcSFAHQXBkWUS|oh%jVq zc5vDn8Czvt8)R$`v4taJSCDFpjA$Pffs9xa)ead6R;oQR_Nr6|WXLn=h>pnE?`7+R zjITASGct}_sV>OyIjL^QkVn6W?#Q@gXNyF}W!c*U88t>yB6=dDR;O-4##JlT3mJ_L z>Skp8?W1}l0QXY*Fp_K<`6SA7@5Ol z@7>58uCd*N%#k{EFESssQuiVAG1+TD<`XL05M++?QbUm`UyTv>BXgpY?LlO|5~3bO z=5hl{#293*@llT>bG-p2Vk|OSKEF>Qv*q(U4w-Q>9goZeIqxZCes1QDr;+)EPCbK6 zk4jBI=6(}35t(0U)Ffo4Sg2=_nPxy~etX=^gL2-BIQ5>K@)Ay|UQS=eskL@$GEV&< zdIhI0$c|TW>SrIPQ*o+6cD#mD*G1EirI-7-zHnOJ6$qSG*%gXi+vgU{uB5S_R=0MgvA!;$Q zmOH8UkhRJ|EkV|YHfkxd)>x=z$ZGj&d>>hxO>E1N^{MPwfvoMaVsHNabuYhu@+fAm5M@EPLNuMtO9B4k@dZil!%SUD$%IT$SN0Y zK~_j-+lnlCw2IhC~6Vo@JrFM)un_>HxAG(o&H9o}DcX*+*qZI^O{^HX*iekkj6P5^)4Mon(3xIbDNn$B-k>mLiTLr{&-K zEpqxkNsT)yk&`Vus*w{g zvDF~wJ83#{3WIEQ$SIRnkDPO&E6Dj-bQL*&*txC&x$?bfL?d$Lu{)v(xgD&WUPrDx zM~e6xx!rAS{~-4!GxaZW`$@Zj+?LPQf5^SVZcN)L$Q@*%S|L~Nv)ci=Lye@g3q$UM zqSnYAX<}=G+($*>$bBrt))u*AMG?q-%FEUcxf6A&J#wE5QXP={lBgqcUzK&8kULG( z8M)JC+6B3@L?-0UwQ+BEh) zY7lZW?bO}Km3yRi_aawr8}05xZnm6fL2jOp>xLlLFFS@J_l%kCe&iMzP}&VcZmFGm z0J%Tt)NthfW~D|T_fn902)UJV@<`;?_}E4vx86=YjNEIo_Yve?x3N8n+V-dN=Ibh15(yxwMN9P<9BQsa?#tDN@~ z@@|v!o<`n4E2qyOZ?Hy9K;C^8Y9jK6%6XHJ_n?{WS>!$Bqn<;a+*`DJ5qT3sY%d}2 zc>_wjmytI`PMM6n*UfCNB5$rvO+ns*5H%Hf?*^&Ykhj!;(ry~^mdm==k+)j(2J*I> zIkh8iSBRR9yf_0&yBWySeAJuB`$BfiL|&4YZ5Hyr(x|tP=e1L_k$2EW%|YH_(Ol#m zv$D;D+#r;8^O2V&=e>=*JUMRx^5i>$cJCnXjK&=ckyq@b9LPH>=e>)(^F~tIEkfQ! zGxZ+wE<32D$ZIfB%aHfC?06q}|B03(Kg`ML3gox7Q!A0*L8De7-y~X%{75g`2gvUg zq&`G`pAe-Y->gy}BY&WeT7&$%4Jhr_BL6;(ibDQSm0E}V5eAfY>ybaoL~TI+qjDJ= zk^h*JZ8P$pa!^~4|BOy;MgEH_^(pdS4pC0zx7-f4A%B{QZ9DSqHfjg*XIiM8$e%6K zUC5s&EgJbt9Gu1=|9t~WI~Vd-1SvQ2KhUXIolQP$17N+g(OMtemH#Aj!dXwJ7*1MAf0dt5WqSX!**! zf`XQh&{Y&1lgqe<0-x+{KtZN*O7D)l!CN<{yl;0FuazbGiT zQ8!Q!@>2hy;Mbs`_6iCv=~OEeRGBECpw>c#q2Q{SYK?+M+0h36PO>f>ep86kw($2b zptO&G|7JVY4t}|}ZQmaLTQ#;0@ZavEI>LWfi0TCYJ#unq_=nioy1+loOqt++&`EWL z{~>AJ;D6Z8)*b%QvLh1yF;=!7@Q*c9J>eg3qHco!87tKb{z+!)X850zX>a&nG?LQ3 z5B&1A+P*LRQ)K!-_@~LVAN+5Gxb7DCX9OuT{Ih)2t? zx*h(-viA=7mwMUmgnzk@8VLU?ncfBe8WY^~$mNcJKh?@M3VwMEX#X($CuHv< z@Sl_&R`@GST=y9KAu}}w{-2%HSoo_n>Ph%@FEtMSdNcJj{5P!BGYGVjlP4e$=3|?L zK>HB&ECQWm`Wyn?b++dbxXFOh{sjbXmXlvXz%1)tMqq%Q)5!?j9;9ADV4z05iojse z6a?-yu}ww5BJDK6CIVdlCw5qQ!` z%|zfSX|oWRAbJadNiv;{z;kx4n}fg$IyE1G*EQ;G1ZJqz0t9BtbP)o}q%B5ZrJ2+B z5LhkeEl0p9Z3O~5e4MUCV7G%(5%|VJeT2XMxi_+wm*PEkL*Z6VY1F? zDhg8!DDBfwm=>ZAqVTwhI)uWLq6`$~$lgp87Kjd`@H?4)gTkQfJ%Yj#ANL+b;SU;h z429(?bsU8u(YGl4#m;sDg@1^ADEv!hJBh+-(J2(x$}|gwS2RwuQP>coa!~{?m4~8m zQ9g>=JJ||Q)LG<5Q8$?eP}Ea&8bvLi%kNOsPu6{pqW%uPNOe+|P_)KN{fVOWHtH`FZL(08Q4}ZBDirNCvsI%g(SXvv21QABst!emtW-UU zvO?4q6y=(!t0>C1Q`b-wFi{OC`p!u;qNvb8HKC|P+TSQT=VQBpqF+MPe<=FhYp8>Q zqCdH=Ln{=?&+j_`MY^=sC~DNWt__N=hp2EA{Trm(qFAw05hxC`QteUPLH2e;aW@NF zClvPxQJqnIvyU>N_)a;cD~bo3*}9=vo)vWHj$*kN=n#qGVKz>Cpm?~0>WSi!Ug{)BY%aU8Vz2Jl)228;WN-sM}FITiP8co+s^26w9;74g*o_@NwN;D1OgM4MMTp zw|5wf;uSKz8^s?OL#4wI6vun1VJO~jqK2dRkcAqFVxNM<1mY(VMo1d6Nd z)HoD3`lzQ-5*DH+qNIzJvZ186oq7Q!xBIA#%@Vx?4+ zT-2yFD7kDv=@5mIS{ttxPLfJTtO-I?YvaS|o z&r7?4vMC`>ucAzz4|TYPvgvlVzfrc(N&SPe#Ww0+lr0Gw>ZqXX13T3UWvVowY>kyI z3}sPfsx`{i8&Ep7LD@z#6^^pa29%C%QMM&SMc~|0Gt~~~#svN$Y@fQ9e#P z;@k!UO2|&i&@3dg0t9 zjT(gWgMHN9I6uTn-HY=NitfYtk!Cgv&X3Wkp*TOuPTi05&s(WsIRCPldI0CA7*IMs zi1V+Tso^+3!+_Fp1kTS2Q4it#Tpu+O=ND+yD4btpK7$mRd~S$(ALR>z)N+)+>!Vhne2JX066MQ9t5Ci=#OZ33e2P9+lMH3 znJE?J@h0jclpm74AEW#mjcpCek2|TgC_gERLV1p89m)%QoUTXtX#+~f4JZ$WsEsHu zF`#tZjPf6?)K--LYC!4uDawDhQae%JAm{Bu`E?W99+ck*Qqibr<)z%HXfKLIh5QVl zV;m~F*f@aQE`ijN=C&{*}ESV4?5YtMujy*c~LRJ zfYLD?6_d?W1}a)^o!_8hfsvGs$563Mr@lpnDkq;ng*^M}cnTGt$Yo@qVw;)kvQe?a zM-`yra|h)|MWU4opdu+m1yPadqzX}SRHKSe@vW6Qi;B}a^#dw`KI%tQ6x*qCRFs>k z3RGOss0*n0$x2;B#V=+mgbN!~>L*4UaA%s{7$M47lIb*A6%$2QUBt?RcSYH zp~1`cA1?eIGSn#y7sGX`4K8*Th2vsZnYP8n9xA61xY)}+Ebdnd9xRJICIeNkyPQ~yKd zAOlLLeyF@hrEWpx{c;&*R6b#4>yOF_(gvW?CYN>_Dql2)N~haV`LdO|1C_7I^iEXT zHMW7MoF%#om2;eIgHZXlnYs^^s)Mqia*aw2LFGm(H58TdSkdWzRPK>B43%-R;{jAA zgt+cORPL2F9F>W7wh^e@Z=pt_@}L2w( zP&GD0jYrjZoq8Ho&#TlksCvmqO+;18zi1Mw7HVwIq3V4n^*pLp2B{ZN^`W#EQT4H` zdl^+5e4I{3)y@$0Dyrh7O+{6Th3z#|9nq<2sLB<+j;bOX+Z(8=Fj00?{Sl<5qpHqH z%|O*PnZAjtMvZMYs>AHm98|Z{srjhxDLWRR`hPaIg{U6jrQSvLAZg8inA;+4395&i zI9-NndBo|o9Mw-4N$Io#)#I$xYE)0ss1H#6oB^fNN2s2vQ)^H?FGOuY^#-|&t*GAN zU~{56Ue;|#b<1aUC#nwxIo*xwlO`$})u(Ng3)N?38jI?mLu?7Cu5wbJq52<{`W!XT zsJ*BOw^LuBrk#UIL`^SgNvP>>V%v`zONjasHNy=koxVoRQ+DbAYMxc8=D)rDinLVJ zOtrG5q2_hDR_UmjVPiXpnwc7P2sN_}D4jA;Gfyrp6EzOeVbmNslFnyGJ5v)+Kx=>%#vSt%cCK2fQYsM%&f>2wM;JFQd}YWAp9HfmgUDhD-j z8kLKh&&*UFYQC^j`Ka-zR5@yD9Mm7s`xsCY$GbvDHH#ZKAF~A7eo2bQStbR_Yq` z$#QZ7^eHM^BlKxK4If6Kvj|3IH>r~ZZhwoGq8UntZ6pf55T)6NR? zB?gqvt)RcJQh>gam(e*4`iDNY*3hF2D4p9t-@wc591eYxtZNJX6APyi(6`C79rT?l zTL)GE?25AC}ew`nS@0LOJjlcS67Jr3OO(SJvGH{l5^~ zAk>D*j=`u6Hy-7|PirU_Gwqd9> zYt#d%m1okON1%3)mu(bkhgqqIQ9Im6J%ZX%a>}EqeN?8SQTv#M)5lOdPNN=2t=yY+ zegd`6IoQUc_C-7OBx)zysPU+sWIbvxv|B-F(PIsFoKNfzn=>e8g8qVBkZ?I7y%q-CP6NM$>Wx>Aigin@@A`WAJ6 z$&Qn#yCTX)-3<$;IjC>tr1DYU!Au2E-$Qg7^}R%AP=Bk9(<0OlHc_Rhe?X=`p#ISi z+j-PakXC{E=QXwv>Zi%2{et@0LAGktZi?5w!j*O!TX$UP=A(MzN?&O=;fj1u z+@%+;^p|!suG}u_i!1kemFEAt+=43)8Bn_P$CWYC?!c8v4z@dShdBQ;=G)`jE2u;IvEZ7M6aMB z$-(IqGrl2Mrg4Y;)1@i*hTnB+J{ta#>Dy?iHnA;0L!FI!2Mt%9lmiVn zLe#rxgqd1|#&A2e7>zBr?Dx>vNn=}rMpKAdipEGYwG53dpVjx#*juK{(b!L>E6{kW zo$FSj@ivWGg~owqYBd@M+o=!Gc%PM0(Ky0EtwG}xL24};$IEqIhsI|$w)JRy!A@;J z<76wf5sg#L)Fw2(VL<7!8I5n6sV!(+W~Dws<4S2;(J1$wU7ToKXX11l8aK-2Zb#!M z(srQHsdKs$jXPz!8;$W+wmoS4+)PEIG0}k1#f8SNWv?5JUfB_g#)Do?i!4p=qqjb=hbduTeQ@ zdd7g#B^ON-LsTA`o-?3y$w$)*A?9L(KO%0 zR*0r|bgBqV?*^$$xc-}y`V;Q2eAHiv{X%wJhI^m1O2o!VtAaaP<+^IbekrX6?t?~B zy6A{)6xAXj&B0cOg;CP#v2dfxb_EL;`KYT{*m7&ShJ|~qYzOIQw~uOt*gwn^5G#*8rZB`_v9h&B zTw75a#Ok7O#D$64B6e4h>muN8uTkx={=BqqNR*F;sXO+0y`1*M{{A|36Owz{r~ydq zAni6J?^M}lA^ue#^%mkg$-3EylV?k&If(mH+FT^8cW~W2#HE|4`G`9!)3*`#nY0Cn z%aQgD;!Sq0TZp(DX3BxMO3}MW*d#j^AudDOV#J*jy@$BHA*K00(-OqxOIwQgo({HU zh;J==A8~b}=J#uH+Bsc;xMLP-CE`M&RfyX!T8+5xMIRvkW-Hfyi1?O|y^6T2(mq1M z4q5jx;!YUL6w?~S{UXz~i2GVv6ygd+>yS_)JJuuNth5bCkjDzsMkEA$Ml@|g!nbB> zGZGFts4Yl1Y^6Ryf={QmB5sYG_bC#-cd|K=aMVO?L&7=HcEqhSl45FpFPicYwG#=2 zc4`+AvV7ETXsu+&9whwjU~7KQsYgXINRY=AlMC*q5T|a$4%VqyB-DuFkZ{q<*8F}q zVX`g(2{){48e$(4eTIZajqP)||B)Td?^ku7krdMxNT~Bs`;hRnN;SV1b%UMqV0~tY zO2Yc14k{Vzf45WnvHrA9eTnsjX6h@fFY!``5dE{X3`99qwoF9rmg!+c#cFIvutpDCbs5xk=|mZn%_mbr$&7X?ID@^pmnveoy4kB4yyV6uU4y6Hsbb3%R$@@S=aoI z(NRuLo8K|I(nsavg9w!>z{1J0&X0vHUxNWG92w&DG-9JH)OUytH&fqZZSNp;1}lb$ zf>z0L1V86#?bcgn3nPXB_tuaCNn=y3)VQziEFwNX`A+sQ%IV0X4O9SdKRR*R@j zI;VAriZWC6*wZaYHNO}2CIgD8`CYW^PO1SP^wA7;9f+teRmzTc@_p2F{A;mOGw@$0 zp4|0KWL*=@M0Q`E(sdTH2Z`Q7c30Uu8`)2*+&c%^qh-fjWIteLn}_Tv*+@#) z=2tt(eOTA#S3CV`Vrzc2(+@#vAqwOK?Q zLH-t%>y{#4Zo6HVA@yN9+xtkD+da$GF^%Eo;uqqr1uL_tC2oHrXL`E zu#uFm&97Nr>7Z1kC55PukoL8eYJMGahKXu^9rF>5YJMGamW6759do_`rR#cJ_)OXc zq`u{3+laJDvUd|wlXbSuNIf8J3sR5y*gipOp@Z6r)KVw)DN=v*Qck4)WI*Y<4XMAG zsqIMpQ>AtwwMwIQBDK~>?Lz9+5Vaer*9|CL_aOC#ooar)GgPYi_0HiM)%<$rmXBZa z>z%t9N$J}Bdgq%(`*5+nT<1hwR8&rraN!3#m5jo>Levpd{3z>=BJi@xb_{_j4(d1p zv!#8DziF0J|ZxVxCyntzYGyQum1xLY~cs&PJ`Q8mb_(J39-J%Us%vIjV+I%Ib+pmeQA z_TxV43bIGYj;qMN*Uokg+0!jl11j!TsYX=XZb0eUgz{R^b(CKSvHgvTJFQgnZ(Hv* zQ~#m-j*y{l!1>))sx{6($?MXs4f0Rf*xKUUl^_*?g5|QV9rAbb8g%Q33%fOvMr^s4rrkZ~3K<@9m9Yx*@xwMlwKg`VO8Dyu2s6t$PNHx^GBT~LFQ=P(EU3O5-uh5T{mVulN zyxi{1uN1h>OY43ZX=XdueS?d)S*atq*hh2}7YEwej^W}129)l{aZx_g-M_`fTYPLM zaM2Q?e8|6QKQpXDPRg~)L+L{ywtSTA z_fiEYk<;92b9RYa`zumk|5J_C|PRdj`Jw7 zJE(FL9}ZC!C_ZPSE}&QsQWsG=#7Bit(pIKFp`@RQ?Prw8ZL<3>D7nkR_A82AI`tb$ z&WEVqQIcb){y^y?LFy7p4rtV$C~3JJ{DqQ5Hnz(s8E2;|QJm_as!&{Prm9i=r$*JF zbdXBvC{fH*ElT8hSob=V%(k%Aqr|FFS5TZNmvI#(e;7&Wehno-m1;ogt4^vBB}WV> z-J4LdSEa6_Y^9m{8zs-kDgU7OSdi^s6ko7XH&A@VNBxJ=2XsS`&40zCgG#kRNq+-M zByeuKC=8|ZLTs&3x==cL1ZfYW;>!@H zkD%g!lX?^t@--7V8Wjg+hZPkkjiD0x7%H;7)EHFc%8tiTQ6TLJRFs)H9gDO4y^Mkw(PUJ=;ADFRl}DsC|8~Lv zBPo$nQ1!4%HUFN%vmvVa_Y_(_gU!FEu-MGj{Cf&Zd{p!ADXf#${Cf(whuEg0S}{>G zP~FKwy@~4H(q^LC>|mRP>N|qeTd2NATJvu)+%K*9w-`oBn~Q3z&UN!p{gkNruMUng zk`nngmVPB#fTb=mh+K=NFIBFKLel{owGK_GW@LQiehw3~7N@OCc zkNPMNs#8K#5~{xtC8N6KD`h{bx0*Tq64mk?F7hknd@Sp}Mzu+g7gE)`YxJJ{0DG*hS2(RejT9Yn!WFLemH@iNV5{wq*swoGJ9^-+h>_^^}u28~B8 z)DbjB%Z{UHyx+`r3=LU!>NpyjWXHFNe$C8w0u7y|`EU`k_ayRKKBlKoFiGROEEG+& zP|dHE`Nx0~nS;U%AC-%O=NwcX(zeSf`ACZku{FO}L|%~cBlT^S3Ltf?>^KeYnGoA| z@Lm#q4{xTNat67d%DU#?MZ8s}&EF|)^>RlM$|DRYk;TZjS*Q}^S30TY@04~*D?{dV z2isZX*U9t;HfQA*u>dAF5O}V!CTo4Wc*5W$1`LDbwb^ZM;oXhv=SO zu511aW$|X}3f7g#sZ#yfD-vPmbS7| z{~+dWAN4PivQ+8@lHLhY{~@V|)liS-_c=agr&__Yi0Acae#hhfKDIC<9^{T5t+A-l z%+@BX-Q6k`9@hFEjcSX^<5nsH3%9FOJEX}o)gJA`TEA&w>wv`hcB=V1&14(Z360k^ zsxumI*r_gPYAe^pgr*L%w=0^uh`OPvo6dFJ(Ig+q9+7D3EjxOkvEIpPPbB1uZo;0^ zA+}y<{KZb)jG8))>W!Lf7OD?w{!^*G(8H|M|Dd-up!Dbmy}ggR1$t+Z8G1LB?N-zT zr1eM589Unm)coM3ZbMDEgSs6xA-S|WQ1gq>iL*88J|r%ay%r>XBy9*1H=8*fio|FWbw3h6lT(Iay>4ZD z0Ex#9C_Ns;{+nbv9J`7wY$FhLM57);lwYStBI=y9QHc7<$M!IyE=hX?QFUInM-kN& zq()<%BF&0*ZKXYib)BV+!MYw!u6rEo`bv8O>*VJuJ;q|)AZbrx-4Izf4(s!c4N8yk zNGu9cPr;iSqMk<6R$2E9nqp<|1T;mr>)??pfApzPRpKrVMW)_tk5%|O)mPU=mp8zJjvVr_wF z7S>+0a{3n5{;E^6vGy;GnuE2v?466X^+C3ISbN<>&Bxk*W%@Rv+DTi0s7N!X?;z?H z2elAUBkhy}QIAM_7g5$A+ag3gu2YKye+rg_3(Buak>HCexi-=-fCgn1n+Hf-e!33^s;S% zcTkY}1m1geYAd`$Ow_0F4zo~Bc!xWwZSaotQrqEuBuMRmSDuge*a`0wCbnJhKCM%` z;e9bg?SXfyC>q`w8e0s!bM2H1UWdpH?=mx6EW96x;^1AYvc!J10TBc32E`Vj%F>UxH007RYln?*_ diff --git a/gbe2_ecp3/tb_gbe_buf.vhd b/gbe2_ecp3/tb_gbe_buf.vhd index 6d9edc5..fb1a331 100755 --- a/gbe2_ecp3/tb_gbe_buf.vhd +++ b/gbe2_ecp3/tb_gbe_buf.vhd @@ -360,7 +360,7 @@ begin -- Loop the transmissions ------------------------------------------------------------------------------- trigger_counter := x"4710"; - trigger_loop := 0; + trigger_loop := 1; wait until rising_edge(test_clk); @@ -416,7 +416,7 @@ begin --test_data_len := INTEGER(TRUNC(rand * 800.0)) + 1; --test_data_len := 9685; - test_data_len := 29; -- + (1 - J) * 200; + test_data_len := 200; -- calculate the needed variables test_loop_len := 2*(test_data_len - 1) + 1; diff --git a/gbe2_ecp3/trb_net16_gbe_buf.vhd b/gbe2_ecp3/trb_net16_gbe_buf.vhd index 55c6dc9..4cdff3b 100755 --- a/gbe2_ecp3/trb_net16_gbe_buf.vhd +++ b/gbe2_ecp3/trb_net16_gbe_buf.vhd @@ -119,7 +119,7 @@ architecture trb_net16_gbe_buf of trb_net16_gbe_buf is --attribute HGROUP of trb_net16_gbe_buf : architecture is "GBE_BUF_group"; -component tsmac35 --tsmac36 --tsmac35 +component tsmac35 port( --------------- clock and reset port declarations ------------------ hclk : in std_logic; @@ -238,6 +238,28 @@ port ( ); end component; +component slv_mac_memory is +port( + CLK : in std_logic; + RESET : in std_logic; + BUSY_IN : in std_logic; + -- Slave bus + SLV_ADDR_IN : in std_logic_vector(7 downto 0); + SLV_READ_IN : in std_logic; + SLV_WRITE_IN : in std_logic; + SLV_BUSY_OUT : out std_logic; + SLV_ACK_OUT : out std_logic; + SLV_DATA_IN : in std_logic_vector(31 downto 0); + SLV_DATA_OUT : out std_logic_vector(31 downto 0); + -- I/O to the backend + MEM_CLK_IN : in std_logic; + MEM_ADDR_IN : in std_logic_vector(7 downto 0); + MEM_DATA_OUT : out std_logic_vector(31 downto 0); + -- Status lines + STAT : out std_logic_vector(31 downto 0) -- DEBUG +); +end component; + component fifo_4096x9 is port( Data : in std_logic_vector(8 downto 0); @@ -485,7 +507,7 @@ signal tc_pc_ready : std_logic; signal tc_pc_h_ready : std_logic; signal mc_ctrl_frame_req : std_logic; signal mc_data : std_logic_vector(8 downto 0); -signal mc_wr_en : std_logic; +signal mc_rd_en : std_logic; signal fc_wr_en : std_logic; signal fc_data : std_logic_vector(7 downto 0); signal fc_ip_size : std_logic_vector(15 downto 0); @@ -581,30 +603,19 @@ signal timeout_noticed : std_Logic; attribute syn_keep of timeout_noticed : signal is true; attribute syn_preserve of timeout_noticed : signal is true; -signal dummy_size : std_logic_vector(15 downto 0); -signal dummy_pause : std_logic_vector(31 downto 0); - -signal make_reset : std_logic; -signal idle_too_long : std_logic; - -signal tc_data_not_valid : std_logic; - -signal mc_fc_h_ready, mc_fc_ready, mc_fc_wr_en : std_logic; -signal mc_ident, mc_size_left : std_logic_vector(15 downto 0); - - begin stage_ctrl_regs <= STAGE_CTRL_REGS_IN; -- gk 23.04.10 -LED_PACKET_SENT_OUT <= '0'; --timeout_noticed; --pc_ready; -LED_AN_DONE_N_OUT <= '0'; --not link_ok; --not pcs_an_complete; +LED_PACKET_SENT_OUT <= timeout_noticed; --pc_ready; +LED_AN_DONE_N_OUT <= not link_ok; --not pcs_an_complete; fc_ihl_version <= x"45"; fc_tos <= x"10"; fc_ttl <= x"ff"; + MAIN_CONTROL : trb_net16_gbe_main_control port map( CLK => CLK, @@ -612,8 +623,7 @@ MAIN_CONTROL : trb_net16_gbe_main_control RESET => RESET, MC_LINK_OK_OUT => link_ok, - MC_RESET_LINK_IN => '0', - MC_IDLE_TOO_LONG_OUT => idle_too_long, + MC_RESET_LINK_IN => MR_RESTART_IN, -- signals to/from receive controller RC_FRAME_WAITING_IN => rc_frame_ready, @@ -632,13 +642,12 @@ MAIN_CONTROL : trb_net16_gbe_main_control -- signals to/from transmit controller TC_TRANSMIT_CTRL_OUT => mc_transmit_ctrl, + TC_TRANSMIT_DATA_OUT => mc_transmit_data, TC_DATA_OUT => mc_data, - TC_RD_EN_IN => mc_wr_en, - --TC_DATA_NOT_VALID_OUT => tc_data_not_valid, + TC_RD_EN_IN => mc_rd_en, TC_FRAME_SIZE_OUT => mc_frame_size, TC_FRAME_TYPE_OUT => mc_type, TC_IP_PROTOCOL_OUT => mc_ip_proto, - TC_IDENT_OUT => mc_ident, TC_DEST_MAC_OUT => mc_dest_mac, TC_DEST_IP_OUT => mc_dest_ip, @@ -646,8 +655,19 @@ MAIN_CONTROL : trb_net16_gbe_main_control TC_SRC_MAC_OUT => mc_src_mac, TC_SRC_IP_OUT => mc_src_ip, TC_SRC_UDP_OUT => mc_src_udp, + + TC_IP_SIZE_OUT => mc_ip_size, + TC_UDP_SIZE_OUT => mc_udp_size, + TC_FLAGS_OFFSET_OUT => mc_flags, + + TC_BUSY_IN => mc_busy, TC_TRANSMIT_DONE_IN => mc_transmit_done, + -- signals to/from packet constructor + PC_READY_IN => pc_ready, + PC_TRANSMIT_ON_IN => pc_transmit_on, + PC_SOD_IN => tc_sod, + -- signals to/from sgmii/gbe pcs_an_complete PCS_AN_COMPLETE_IN => pcs_an_complete, @@ -664,38 +684,7 @@ MAIN_CONTROL : trb_net16_gbe_main_control GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, GSC_BUSY_IN => GSC_BUSY_IN, - MAKE_RESET_OUT => make_reset, --MAKE_RESET_OUT, - - -- CTS interface - CTS_NUMBER_IN => CTS_NUMBER_IN, - CTS_CODE_IN => CTS_CODE_IN, - CTS_INFORMATION_IN => CTS_INFORMATION_IN, - CTS_READOUT_TYPE_IN => CTS_READOUT_TYPE_IN, - CTS_START_READOUT_IN => CTS_START_READOUT_IN, - CTS_DATA_OUT => CTS_DATA_OUT, - CTS_DATAREADY_OUT => CTS_DATAREADY_OUT, - CTS_READOUT_FINISHED_OUT => CTS_READOUT_FINISHED_OUT, - CTS_READ_IN => CTS_READ_IN, - CTS_LENGTH_OUT => CTS_LENGTH_OUT, - CTS_ERROR_PATTERN_OUT => CTS_ERROR_PATTERN_OUT, - -- Data payload interface - FEE_DATA_IN => FEE_DATA_IN, - FEE_DATAREADY_IN => FEE_DATAREADY_IN, - FEE_READ_OUT => FEE_READ_OUT, - FEE_STATUS_BITS_IN => FEE_STATUS_BITS_IN, - FEE_BUSY_IN => FEE_BUSY_IN, - -- ip configurator - SLV_ADDR_IN => SLV_ADDR_IN, - SLV_READ_IN => SLV_READ_IN, - SLV_WRITE_IN => SLV_WRITE_IN, - SLV_BUSY_OUT => SLV_BUSY_OUT, - SLV_ACK_OUT => SLV_ACK_OUT, - SLV_DATA_IN => SLV_DATA_IN, - SLV_DATA_OUT => SLV_DATA_OUT, - - CFG_GBE_ENABLE_IN => use_gbe, - CFG_IPU_ENABLE_IN => use_trbnet, - CFG_MULT_ENABLE_IN => use_multievents, + MAKE_RESET_OUT => MAKE_RESET_OUT, -- signal to/from Host interface of TriSpeed MAC TSM_HADDR_OUT => mac_haddr, @@ -714,30 +703,56 @@ MAIN_CONTROL : trb_net16_gbe_main_control DEBUG_OUT => dbg_mc ); - - MAKE_RESET_OUT <= make_reset; -- or idle_too_long; -TRANSMIT_CONTROLLER : trb_net16_gbe_transmit_control2 +TRANSMIT_CONTROLLER : trb_net16_gbe_transmit_control port map( CLK => CLK, RESET => RESET, +-- signals to/from packet constructor + PC_READY_IN => pc_ready, + PC_DATA_IN => tc_data, + PC_WR_EN_IN => tc_wr_en, + PC_IP_SIZE_IN => tc_ip_size, + PC_UDP_SIZE_IN => tc_udp_size, + PC_FLAGS_OFFSET_IN => tc_flags_offset, + PC_SOD_IN => tc_sod, + PC_EOD_IN => tc_eod, + PC_FC_READY_OUT => tc_pc_ready, + PC_FC_H_READY_OUT => tc_pc_h_ready, + PC_TRANSMIT_ON_IN => pc_transmit_on, + + -- signals from ip_configurator used by packet constructor + IC_DEST_MAC_ADDRESS_IN => ic_dest_mac, + IC_DEST_IP_ADDRESS_IN => ic_dest_ip, + IC_DEST_UDP_PORT_IN => ic_dest_udp, + IC_SRC_MAC_ADDRESS_IN => ic_src_mac, + IC_SRC_IP_ADDRESS_IN => ic_src_ip, + IC_SRC_UDP_PORT_IN => ic_src_udp, + -- signal to/from main controller - TC_DATAREADY_IN => mc_transmit_ctrl, - TC_RD_EN_OUT => mc_wr_en, - TC_DATA_IN => mc_data(7 downto 0), - TC_FRAME_SIZE_IN => mc_frame_size, - TC_FRAME_TYPE_IN => mc_type, - TC_IP_PROTOCOL_IN => mc_ip_proto, - TC_DEST_MAC_IN => mc_dest_mac, - TC_DEST_IP_IN => mc_dest_ip, - TC_DEST_UDP_IN => mc_dest_udp, - TC_SRC_MAC_IN => mc_src_mac, - TC_SRC_IP_IN => mc_src_ip, - TC_SRC_UDP_IN => mc_src_udp, - TC_TRANSMISSION_DONE_OUT => mc_transmit_done, - TC_IDENT_IN => mc_ident, + MC_TRANSMIT_CTRL_IN => mc_transmit_ctrl, + MC_TRANSMIT_DATA_IN => mc_transmit_data, + MC_DATA_IN => mc_data, + MC_RD_EN_OUT => mc_rd_en, + MC_FRAME_SIZE_IN => mc_frame_size, + MC_FRAME_TYPE_IN => mc_type, + MC_IP_PROTOCOL_IN => mc_ip_proto, + + MC_DEST_MAC_IN => mc_dest_mac, + MC_DEST_IP_IN => mc_dest_ip, + MC_DEST_UDP_IN => mc_dest_udp, + MC_SRC_MAC_IN => mc_src_mac, + MC_SRC_IP_IN => mc_src_ip, + MC_SRC_UDP_IN => mc_src_udp, + + MC_IP_SIZE_IN => mc_ip_size, + MC_UDP_SIZE_IN => mc_udp_size, + MC_FLAGS_OFFSET_IN => mc_flags, + + MC_BUSY_OUT => mc_busy, + MC_TRANSMIT_DONE_OUT => mc_transmit_done, -- signal to/from frame constructor FC_DATA_OUT => fc_data, @@ -853,9 +868,6 @@ port map( DBG_SELECT_SENT_IN => dbg_select_sent, DBG_SELECT_PROTOS_IN => dbg_select_protos, - SCTRL_DUMMY_SIZE_OUT => dummy_size, - SCTRL_DUMMY_PAUSE_OUT => dummy_pause, - DBG_FIFO_Q_IN => dbg_q --DBG_FIFO_RESET_OUT => dbg_reset_fifo -- gk 28.09.10 @@ -887,7 +899,7 @@ port map( GBE_MAX_PACKET_OUT => max_packet, GBE_MIN_PACKET_OUT => min_packet, -- gk 20.07.10 GBE_MAX_FRAME_OUT => pc_max_frame_size, - GBE_USE_GBE_OUT => open, --use_gbe, + GBE_USE_GBE_OUT => use_gbe, GBE_USE_TRBNET_OUT => use_trbnet, GBE_USE_MULTIEVENTS_OUT => use_multievents, GBE_READOUT_CTR_OUT => readout_ctr, -- gk 26.04.10 @@ -920,10 +932,6 @@ port map( MONITOR_RX_FRAMES_IN => rc_frames_rec_ctr, MONITOR_RX_BYTES_IN => rc_bytes_rec, MONITOR_RX_BYTES_R_IN => rc_debug(31 downto 0), - - SCTRL_DUMMY_SIZE_OUT => dummy_size, - SCTRL_DUMMY_PAUSE_OUT => dummy_pause, - -- gk 01.06.10 DBG_IPU2GBE1_IN => dbg_ipu2gbe1, DBG_IPU2GBE2_IN => dbg_ipu2gbe2, @@ -943,7 +951,7 @@ port map( DBG_FC2_IN => dbg_fc2, DBG_FT1_IN => dbg_ft1, DBG_FT2_IN => dbg_ft(31 downto 0), - DBG_FR_IN => dbg_fr(63 downto 0), + DBG_FR_IN => dbg_fr, DBG_RC_IN => dbg_rc, DBG_MC_IN => dbg_mc, DBG_TC_IN => dbg_tc(31 downto 0), @@ -957,13 +965,164 @@ port map( --DBG_FIFO_RESET_OUT => dbg_reset_fifo -- gk 28.09.10 ); -use_gbe <= '1'; - allow_rx <= '1'; allow_large <= '0'; end generate; + +-- IP configurator: allows IP config to change for each event builder +THE_IP_CONFIGURATOR: ip_configurator +port map( + CLK => CLK, + RESET => RESET, + -- configuration interface + START_CONFIG_IN => ip_cfg_start, --IP_CFG_START_IN, -- new -- gk 7.03.10 + BANK_SELECT_IN => ip_cfg_bank, --IP_CFG_BANK_SEL_IN, -- new -- gk 27.03.10 + CONFIG_DONE_OUT => ip_cfg_done, --IP_CFG_DONE_OUT, -- new -- gk 27.03.10 + MEM_ADDR_OUT => ip_cfg_mem_addr, --IP_CFG_MEM_ADDR_OUT, -- new -- gk 27.03.10 + MEM_DATA_IN => ip_cfg_mem_data, --IP_CFG_MEM_DATA_IN, -- new -- gk 27.03.10 + MEM_CLK_OUT => ip_cfg_mem_clk, --IP_CFG_MEM_CLK_OUT, -- new -- gk 27.03.10 + -- information for IP cores + DEST_MAC_OUT => ic_dest_mac, + DEST_IP_OUT => ic_dest_ip, + DEST_UDP_OUT => ic_dest_udp, + SRC_MAC_OUT => ic_src_mac, + SRC_IP_OUT => ic_src_ip, + SRC_UDP_OUT => ic_src_udp, + MTU_OUT => open, --pc_max_frame_size, -- gk 22.04.10 + -- Debug + DEBUG_OUT => open +); + +-- gk 27.03.01 +MB_IP_CONFIG: slv_mac_memory +port map( + CLK => CLK, -- clk_100, + RESET => RESET, --reset_i, + BUSY_IN => '0', + -- Slave bus + SLV_ADDR_IN => SLV_ADDR_IN, --x"00", --mb_ip_mem_addr(7 downto 0), + SLV_READ_IN => SLV_READ_IN, --'0', --mb_ip_mem_read, + SLV_WRITE_IN => SLV_WRITE_IN, --mb_ip_mem_write, + SLV_BUSY_OUT => SLV_BUSY_OUT, + SLV_ACK_OUT => SLV_ACK_OUT, --mb_ip_mem_ack, + SLV_DATA_IN => SLV_DATA_IN, --mb_ip_mem_data_wr, + SLV_DATA_OUT => SLV_DATA_OUT, --mb_ip_mem_data_rd, + -- I/O to the backend + MEM_CLK_IN => ip_cfg_mem_clk, + MEM_ADDR_IN => ip_cfg_mem_addr, + MEM_DATA_OUT => ip_cfg_mem_data, + -- Status lines + STAT => open +); + +-- First stage: get data from IPU channel, buffer it and terminate the IPU transmission to CTS +THE_IPU_INTERFACE: trb_net16_ipu2gbe +port map( + CLK => CLK, + RESET => RESET, + --Event information coming from CTS + CTS_NUMBER_IN => CTS_NUMBER_IN, + CTS_CODE_IN => CTS_CODE_IN, + CTS_INFORMATION_IN => CTS_INFORMATION_IN, + CTS_READOUT_TYPE_IN => CTS_READOUT_TYPE_IN, + CTS_START_READOUT_IN => CTS_START_READOUT_IN, + --Information sent to CTS + --status data, equipped with DHDR + CTS_DATA_OUT => cts_data, + CTS_DATAREADY_OUT => cts_dataready, + CTS_READOUT_FINISHED_OUT => cts_readout_finished, + CTS_READ_IN => CTS_READ_IN, + CTS_LENGTH_OUT => cts_length, + CTS_ERROR_PATTERN_OUT => cts_error_pattern, + -- Data from Frontends + FEE_DATA_IN => FEE_DATA_IN, + FEE_DATAREADY_IN => FEE_DATAREADY_IN, + FEE_READ_OUT => fee_read, + FEE_STATUS_BITS_IN => FEE_STATUS_BITS_IN, + FEE_BUSY_IN => FEE_BUSY_IN, + -- slow control interface + START_CONFIG_OUT => ip_cfg_start, --open, --: out std_logic; -- reconfigure MACs/IPs/ports/packet size -- gk 27.03.10 + BANK_SELECT_OUT => ip_cfg_bank, --open, --: out std_logic_vector(3 downto 0); -- configuration page address -- gk 27.03.10 + CONFIG_DONE_IN => ip_cfg_done, --'1', --: in std_logic; -- configuration finished -- gk 27.03.10 + DATA_GBE_ENABLE_IN => use_gbe, --'1', --: in std_logic; -- IPU data is forwarded to GbE -- gk 22.04.10 + DATA_IPU_ENABLE_IN => use_trbnet, --'0', --: in std_logic; -- IPU data is forwarded to CTS / TRBnet -- gk 22.04.10 + MULT_EVT_ENABLE_IN => use_multievents, + MAX_MESSAGE_SIZE_IN => max_packet, --x"0000_FDE8", -- gk 08.04.10 -- temporarily fixed here, to be set by slow ctrl -- gk 22.04.10 + MIN_MESSAGE_SIZE_IN => min_packet, -- gk 20.07.10 + READOUT_CTR_IN => readout_ctr, -- gk 26.04.10 + READOUT_CTR_VALID_IN => readout_ctr_valid, -- gk 26.04.10 + ALLOW_LARGE_IN => allow_large, -- gk 21.07.10 + -- PacketConstructor interface + PC_WR_EN_OUT => pc_wr_en, + PC_DATA_OUT => pc_data, + PC_READY_IN => pc_ready, + PC_SOS_OUT => pc_sos, + PC_EOS_OUT => pc_eos, -- gk 07.10.10 + PC_EOD_OUT => pc_eod, + PC_SUB_SIZE_OUT => pc_sub_size, + PC_TRIG_NR_OUT => pc_trig_nr, + PC_PADDING_OUT => pc_padding, + MONITOR_OUT(31 downto 0) => monitor_sent, + MONITOR_OUT(63 downto 32) => monitor_dropped, + MONITOR_OUT(95 downto 64) => monitor_hr, + MONITOR_OUT(127 downto 96) => monitor_sm, + MONITOR_OUT(159 downto 128) => monitor_lr, + MONITOR_OUT(191 downto 160) => monitor_fifos, + MONITOR_OUT(223 downto 192) => monitor_empty, + DEBUG_OUT(31 downto 0) => dbg_ipu2gbe1, + DEBUG_OUT(63 downto 32) => dbg_ipu2gbe2, + DEBUG_OUT(95 downto 64) => dbg_ipu2gbe3, + DEBUG_OUT(127 downto 96) => dbg_ipu2gbe4, + DEBUG_OUT(159 downto 128) => dbg_ipu2gbe5, + DEBUG_OUT(191 downto 160) => dbg_ipu2gbe6, + DEBUG_OUT(223 downto 192) => dbg_ipu2gbe7, + DEBUG_OUT(255 downto 224) => dbg_ipu2gbe8, + DEBUG_OUT(287 downto 256) => dbg_ipu2gbe9, + DEBUG_OUT(319 downto 288) => dbg_ipu2gbe10, + DEBUG_OUT(351 downto 320) => dbg_ipu2gbe11, + DEBUG_OUT(383 downto 352) => dbg_ipu2gbe12 +); + +-- Second stage: Packet constructor +PACKET_CONSTRUCTOR : trb_net16_gbe_packet_constr +port map( + -- ports for user logic + RESET => RESET, + CLK => CLK, + MULT_EVT_ENABLE_IN => use_multievents, -- gk 06.10.10 + PC_WR_EN_IN => pc_wr_en, + PC_DATA_IN => pc_data, + PC_READY_OUT => pc_ready, + PC_START_OF_SUB_IN => pc_sos, --CHANGED TO SLOW CONTROL PULSE + PC_END_OF_SUB_IN => pc_eos, -- gk 07.10.10 + PC_END_OF_DATA_IN => pc_eod, + PC_TRANSMIT_ON_OUT => pc_transmit_on, + -- queue and subevent layer headers + PC_SUB_SIZE_IN => pc_sub_size, + PC_PADDING_IN => pc_padding, -- gk 29.03.10 + PC_DECODING_IN => pc_decoding, + PC_EVENT_ID_IN => pc_event_id, + PC_TRIG_NR_IN => pc_trig_nr, + PC_QUEUE_DEC_IN => pc_queue_dec, + PC_MAX_FRAME_SIZE_IN => pc_max_frame_size, + PC_DELAY_IN => pc_delay, -- gk 28.04.10 + -- NEW PORTS + TC_WR_EN_OUT => tc_wr_en, + TC_DATA_OUT => tc_data, + TC_H_READY_IN => tc_pc_h_ready, + TC_READY_IN => tc_pc_ready, + TC_IP_SIZE_OUT => tc_ip_size, + TC_UDP_SIZE_OUT => tc_udp_size, + --FC_IDENT_OUT => fc_ident, + TC_FLAGS_OFFSET_OUT => tc_flags_offset, + TC_SOD_OUT => tc_sod, + TC_EOD_OUT => tc_eod, + DEBUG_OUT(31 downto 0) => dbg_pc1, + DEBUG_OUT(63 downto 32) => dbg_pc2 +); + -- Third stage: Frame Constructor FRAME_CONSTRUCTOR: trb_net16_gbe_frame_constr port map( @@ -1159,7 +1318,7 @@ imp_gen: if (DO_SIMULATION = 0) generate -- MAC part - MAC: tsmac35 --tsmac36 --tsmac35 + MAC: tsmac35 port map( ----------------- clock and reset port declarations ------------------ hclk => CLK, @@ -1535,12 +1694,10 @@ discfrm_sync : signal_sync --*************** -- LOGIC ANALYZER SIGNALS --*************** ---ANALYZER_DEBUG_OUT <= dbg_mc or dbg_tc or (dbg_fc1 & dbg_fc2) or rc_debug or dbg_ft or dbg_fr(63 downto 0) or (dbg_fr(95 downto 64) & x"00000000"); ---ANALYZER_DEBUG_OUT(3 downto 0) <= dbg_select_protos(99 downto 96); ---ANALYZER_DEBUG_OUT(63 downto 4) <= (others => '0'); +ANALYZER_DEBUG_OUT <= dbg_mc or dbg_tc or (dbg_fc1 & dbg_fc2) or rc_debug or dbg_ft or dbg_fr(63 downto 0) or (dbg_fr(95 downto 64) & x"00000000"); -- Outputs ---FEE_READ_OUT <= fee_read; +FEE_READ_OUT <= fee_read; CTS_READOUT_FINISHED_OUT <= cts_readout_finished; CTS_DATAREADY_OUT <= cts_dataready; diff --git a/gbe2_ecp3/trb_net16_gbe_event_constr.vhd b/gbe2_ecp3/trb_net16_gbe_event_constr.vhd deleted file mode 100644 index 2733bad..0000000 --- a/gbe2_ecp3/trb_net16_gbe_event_constr.vhd +++ /dev/null @@ -1,689 +0,0 @@ -LIBRARY ieee; -use ieee.std_logic_1164.all; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; -use IEEE.std_logic_arith.all; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; - -use work.trb_net_gbe_components.all; -use work.trb_net_gbe_protocols.all; - -entity trb_net16_gbe_event_constr is -port( - RESET : in std_logic; - CLK : in std_logic; - MULT_EVT_ENABLE_IN : in std_logic; -- gk 06.10.10 - -- ports for user logic - PC_WR_EN_IN : in std_logic; -- write into queueConstr from userLogic - PC_DATA_IN : in std_logic_vector(7 downto 0); - PC_READY_OUT : out std_logic; - PC_START_OF_SUB_IN : in std_logic; - PC_END_OF_SUB_IN : in std_logic; -- gk 07.10.10 - PC_END_OF_DATA_IN : in std_logic; - PC_TRANSMIT_ON_OUT : out std_logic; - -- queue and subevent layer headers - PC_SUB_SIZE_IN : in std_logic_vector(31 downto 0); -- store and swap - PC_PADDING_IN : in std_logic; -- gk 29.03.10 - PC_DECODING_IN : in std_logic_vector(31 downto 0); -- swap - PC_EVENT_ID_IN : in std_logic_vector(31 downto 0); -- swap - PC_TRIG_NR_IN : in std_logic_vector(31 downto 0); -- store and swap! - PC_TRIGGER_TYPE_IN : in std_logic_vector(3 downto 0); - PC_QUEUE_DEC_IN : in std_logic_vector(31 downto 0); -- swap - PC_MAX_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); -- DO NOT SWAP - PC_MAX_QUEUE_SIZE_IN : in std_logic_vector(31 downto 0); - PC_DELAY_IN : in std_logic_vector(31 downto 0); -- gk 28.04.10 - -- FrameConstructor ports - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_EVENT_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_SOD_OUT : out std_logic; - DEBUG_OUT : out std_logic_vector(63 downto 0) -); -end entity trb_net16_gbe_event_constr; - -architecture RTL of trb_net16_gbe_event_constr is - -attribute syn_encoding : string; - ---type saveStates is (IDLE, SAVE_DATA, CLEANUP); ---signal save_current_state, save_next_state : saveStates; ---attribute syn_encoding of save_current_state : signal is "onehot"; - -type loadStates is (IDLE, GET_Q_SIZE, START_TRANSFER, LOAD_Q_HEADERS, LOAD_DATA, LOAD_SUB, LOAD_PADDING, LOAD_TERM, CLEANUP); -signal load_current_state, load_next_state : loadStates; -attribute syn_encoding of load_current_state : signal is "onehot"; - -type saveSubHdrStates is (IDLE, SAVE_SIZE, SAVE_DECODING, SAVE_ID, SAVE_TRG_NR); -signal save_sub_hdr_current_state, save_sub_hdr_next_state : saveSubHdrStates; -attribute syn_encoding of save_sub_hdr_current_state : signal is "onehot"; - -signal df_eod, df_wr_en, df_rd_en, df_empty, df_full, load_eod : std_logic; -signal df_q, df_qq : std_logic_vector(7 downto 0); - -signal header_ctr : integer range 0 to 31; - -signal shf_data, shf_q, shf_qq : std_logic_vector(7 downto 0); -signal shf_wr_en, shf_rd_en, shf_empty, shf_full : std_logic; -signal sub_int_ctr : integer range 0 to 3; -signal sub_size_to_save : std_logic_vector(31 downto 0); - -signal fc_data : std_logic_vector(7 downto 0); - -signal qsf_data : std_logic_vector(31 downto 0); -signal qsf_q, qsf_qq : std_logic_vector(7 downto 0); -signal qsf_wr, qsf_wr_en, qsf_wr_en_q, qsf_wr_en_qq, qsf_rd_en, qsf_rd_en_q, qsf_empty : std_logic; - -signal queue_size : std_logic_vector(31 downto 0); - -signal termination : std_logic_vector(255 downto 0); -signal term_ctr : integer range 0 to 33; -signal size_for_padding : std_logic_vector(7 downto 0); - -signal actual_q_size : std_logic_vector(15 downto 0); -signal tc_data : std_logic_vector(7 downto 0); -signal df_data : std_logic_vector(7 downto 0); -signal df_eod_q, df_eod_qq : std_logic; -signal df_wr_en_q, df_wr_en_qq : std_logic; -signal qsf_full : std_logic; - -begin - ---******* --- SAVING PART ---******* - ---SAVE_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- save_current_state <= IDLE; --- else --- save_current_state <= save_next_state; --- end if; --- end if; ---end process SAVE_MACHINE_PROC; --- ---SAVE_MACHINE : process(save_current_state, PC_START_OF_SUB_IN, PC_END_OF_DATA_IN) ---begin --- case (save_current_state) is --- --- when IDLE => --- if (PC_START_OF_SUB_IN = '1') then --- save_next_state <= SAVE_DATA; --- else --- save_next_state <= IDLE; --- end if; --- --- when SAVE_DATA => --- if (PC_END_OF_DATA_IN = '1') then --- save_next_state <= CLEANUP; --- else --- save_next_state <= SAVE_DATA; --- end if; --- --- when CLEANUP => --- save_next_state <= IDLE; --- --- when others => save_next_state <= IDLE; --- --- end case; ---end process SAVE_MACHINE; - -DF_EOD_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (PC_END_OF_DATA_IN = '1') then - df_eod <= '1'; - else - df_eod <= '0'; - end if; - - df_eod_q <= df_eod; - df_eod_qq <= df_eod_q; - end if; -end process DF_EOD_PROC; - -DF_WR_EN_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (PC_WR_EN_IN = '1') then - df_wr_en <= '1'; - else - df_wr_en <= '0'; - end if; - - df_wr_en_q <= df_wr_en; - df_wr_en_qq <= df_wr_en_q; - - df_data <= PC_DATA_IN; - end if; -end process DF_WR_EN_PROC; - -DATA_FIFO : fifo_64kx9 -port map( - Data(7 downto 0) => df_data, --PC_DATA_IN, - Data(8) => df_eod_qq, - WrClock => CLK, - RdClock => CLK, - WrEn => df_wr_en_qq, - RdEn => df_rd_en, - Reset => RESET, - RPReset => RESET, - Q(7 downto 0) => df_q, - Q(8) => load_eod, - Empty => df_empty, - Full => df_full -); - -DF_QQ_PROC : process(CLK) -begin - if rising_edge(CLK) then - df_qq <= df_q; - end if; -end process DF_QQ_PROC; - -READY_PROC : process(CLK) -begin - if rising_edge(CLK) then - --if (save_current_state = IDLE and df_full = '0') then --- if (df_full = '0') then --- PC_READY_OUT <= '1'; --- else --- PC_READY_OUT <= '0'; --- end if; - PC_READY_OUT <= not qsf_full; - end if; -end process READY_PROC; - ---***** --- subevent headers -SUBEVENT_HEADERS_FIFO : fifo_4kx8_ecp3 -port map( - Data => shf_data, - --Clock => CLK, - WrClock => CLK, - RdClock => CLK, - WrEn => shf_wr_en, - RdEn => shf_rd_en, - Reset => RESET, - RPReset => RESET, - Q => shf_q, - Empty => shf_empty, - Full => shf_full -); - -SHF_WR_EN_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (save_sub_hdr_current_state = IDLE) then - shf_wr_en <= '0'; - else - shf_wr_en <= '1'; - end if; - end if; -end process SHF_WR_EN_PROC; - -SHF_Q_PROC : process(CLK) -begin - if rising_edge(CLK) then - shf_qq <= shf_q; - end if; -end process SHF_Q_PROC; - -SAVE_SUB_HDR_MACHINE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - save_sub_hdr_current_state <= IDLE; - else - save_sub_hdr_current_state <= save_sub_hdr_next_state; - end if; - end if; -end process SAVE_SUB_HDR_MACHINE_PROC; - -SAVE_SUB_HDR_MACHINE : process(save_sub_hdr_current_state, PC_START_OF_SUB_IN, sub_int_ctr) -begin - case (save_sub_hdr_current_state) is - - when IDLE => - if (PC_START_OF_SUB_IN = '1') then - save_sub_hdr_next_state <= SAVE_SIZE; - else - save_sub_hdr_next_state <= IDLE; - end if; - - when SAVE_SIZE => - if (sub_int_ctr = 0) then - save_sub_hdr_next_state <= SAVE_DECODING; - else - save_sub_hdr_next_state <= SAVE_SIZE; - end if; - - when SAVE_DECODING => - if (sub_int_ctr = 0) then - save_sub_hdr_next_state <= SAVE_ID; - else - save_sub_hdr_next_state <= SAVE_DECODING; - end if; - - when SAVE_ID => - if (sub_int_ctr = 0) then - save_sub_hdr_next_state <= SAVE_TRG_NR; - else - save_sub_hdr_next_state <= SAVE_ID; - end if; - - when SAVE_TRG_NR => - if (sub_int_ctr = 0) then - save_sub_hdr_next_state <= IDLE; - else - save_sub_hdr_next_state <= SAVE_TRG_NR; - end if; - - when others => save_sub_hdr_next_state <= IDLE; - - end case; -end process SAVE_SUB_HDR_MACHINE; - -SUB_INT_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (save_sub_hdr_current_state = IDLE) then - sub_int_ctr <= 3; - else - if (sub_int_ctr = 0) then - sub_int_ctr <= 3; - else - sub_int_ctr <= sub_int_ctr - 1; - end if; - end if; - end if; -end process SUB_INT_CTR_PROC; - -SUB_SIZE_TO_SAVE_PROC : process (CLK) -begin - if rising_edge(CLK) then - if (PC_PADDING_IN = '0') then - sub_size_to_save <= PC_SUB_SIZE_IN + x"10"; - else - sub_size_to_save <= PC_SUB_SIZE_IN + x"c"; - end if; - end if; -end process SUB_SIZE_TO_SAVE_PROC; - -SHF_DATA_PROC : process(CLK) -begin - if rising_edge(CLK) then - case (save_sub_hdr_current_state) is - - when IDLE => - shf_data <= x"ac"; - - when SAVE_SIZE => - shf_data <= sub_size_to_save(sub_int_ctr * 8 + 7 downto sub_int_ctr * 8); - - when SAVE_DECODING => - --shf_data <= PC_DECODING_IN(sub_int_ctr * 8 + 7 downto sub_int_ctr * 8); - if (sub_int_ctr = 0) then - shf_data(3 downto 0) <= PC_DECODING_IN(3 downto 0); - shf_data(7 downto 4) <= PC_TRIGGER_TYPE_IN; - else - shf_data <= PC_DECODING_IN(sub_int_ctr * 8 + 7 downto sub_int_ctr * 8); - end if; - - when SAVE_ID => - shf_data <= PC_EVENT_ID_IN(sub_int_ctr * 8 + 7 downto sub_int_ctr * 8); - - when SAVE_TRG_NR => - shf_data <= PC_TRIG_NR_IN(sub_int_ctr * 8 + 7 downto sub_int_ctr * 8); - - when others => shf_data <= x"00"; - - end case; - end if; -end process SHF_DATA_PROC; - ---******* --- queue sizes - -QUEUE_SIZE_FIFO : fifo_512x32x8 -port map( - Data => qsf_data, - WrClock => CLK, - RdClock => CLK, - WrEn => qsf_wr, - RdEn => qsf_rd_en, - Reset => RESET, - RPReset => RESET, - Q => qsf_q, - Empty => qsf_empty, - Full => qsf_full -); - -qsf_wr <= qsf_wr_en or qsf_wr_en_q or qsf_wr_en_qq; - -QSF_DATA_PROC : process(qsf_wr_en, qsf_wr_en_q, qsf_wr_en_qq) -begin - -- queue size is saved twice in a row to facilitate readout and packet construction - if (qsf_wr_en = '1' or qsf_wr_en_q = '1') then - qsf_data(7 downto 0) <= queue_size(31 downto 24); - qsf_data(15 downto 8) <= queue_size(23 downto 16); - qsf_data(23 downto 16) <= queue_size(15 downto 8); - qsf_data(31 downto 24) <= queue_size(7 downto 0); - elsif (qsf_wr_en_qq = '1') then - qsf_data(7 downto 0) <= PC_QUEUE_DEC_IN(31 downto 24); - qsf_data(15 downto 8) <= PC_QUEUE_DEC_IN(23 downto 16); - qsf_data(23 downto 16) <= PC_QUEUE_DEC_IN(15 downto 8); - qsf_data(31 downto 24) <= PC_QUEUE_DEC_IN(7 downto 0); - else - qsf_data <= (others => '1'); - end if; -end process QSF_DATA_PROC; - -QSF_WR_PROC : process(CLK) -begin - if rising_edge(CLK) then - - qsf_wr_en_q <= qsf_wr_en; - qsf_wr_en_qq <= qsf_wr_en_q; - - if (MULT_EVT_ENABLE_IN = '1') then - if (save_sub_hdr_current_state = SAVE_SIZE and sub_int_ctr = 0) then - if (queue_size + x"10" + PC_SUB_SIZE_IN > PC_MAX_QUEUE_SIZE_IN) then - qsf_wr_en <= '1'; - else - qsf_wr_en <= '0'; - end if; - else - qsf_wr_en <= '0'; - end if; - else - if (PC_END_OF_DATA_IN = '1') then - qsf_wr_en <= '1'; - else - qsf_wr_en <= '0'; - end if; - end if; - end if; -end process QSF_WR_PROC; - -QUEUE_SIZE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (MULT_EVT_ENABLE_IN = '1') then - if (save_sub_hdr_next_state = SAVE_DECODING and sub_int_ctr = 3) then - queue_size <= x"0000_0000"; --queue_size <= x"0000_0028"; - elsif (save_sub_hdr_current_state = SAVE_DECODING and sub_int_ctr = 2) then - if (PC_SUB_SIZE_IN(2) = '1') then - queue_size <= queue_size + x"10" + PC_SUB_SIZE_IN + x"4" + x"8"; - else - queue_size <= queue_size + x"10" + PC_SUB_SIZE_IN + x"8"; - end if; - else - queue_size <= queue_size; - end if; - else - --if (save_current_state = IDLE) then - if (PC_START_OF_SUB_IN = '1') then - queue_size <= x"0000_0000"; --queue_size <= x"0000_0028"; - elsif (save_sub_hdr_current_state = SAVE_SIZE and sub_int_ctr = 0) then - if (PC_SUB_SIZE_IN(2) = '1') then - queue_size <= queue_size + x"10" + PC_SUB_SIZE_IN + x"4" + x"8"; - else - queue_size <= queue_size + x"10" + PC_SUB_SIZE_IN + x"8"; - end if; - end if; - end if; - end if; -end process QUEUE_SIZE_PROC; - - - ---******* --- LOADING PART ---******* - -LOAD_MACHINE_PROC : process(CLK) is -begin - if rising_edge(CLK) then - if (RESET = '1') then - load_current_state <= IDLE; - else - load_current_state <= load_next_state; - end if; - end if; -end process LOAD_MACHINE_PROC; - -LOAD_MACHINE : process(load_current_state, qsf_empty, header_ctr, load_eod, term_ctr) -begin - case (load_current_state) is - - when IDLE => - if (qsf_empty = '0') then -- something in queue sizes fifo means entire queue is waiting - load_next_state <= GET_Q_SIZE; --PUT_Q_HEADERS; - else - load_next_state <= IDLE; - end if; - - when GET_Q_SIZE => - if (header_ctr = 0) then - load_next_state <= START_TRANSFER; - else - load_next_state <= GET_Q_SIZE; - end if; - - when START_TRANSFER => - load_next_state <= LOAD_Q_HEADERS; - - when LOAD_Q_HEADERS => - if (header_ctr = 0) then - load_next_state <= LOAD_SUB; - else - load_next_state <= LOAD_Q_HEADERS; - end if; - - when LOAD_SUB => - if (header_ctr = 0) then - load_next_state <= LOAD_DATA; - else - load_next_state <= LOAD_SUB; - end if; - - when LOAD_DATA => - if (load_eod = '1' and term_ctr = 33) then - if (size_for_padding(2) = '1') then - load_next_state <= LOAD_PADDING; - else - load_next_state <= LOAD_TERM; - end if; - else - load_next_state <= LOAD_DATA; - end if; - - when LOAD_PADDING => - if (header_ctr = 0) then - load_next_state <= LOAD_TERM; - else - load_next_state <= LOAD_PADDING; - end if; - - when LOAD_TERM => - if (header_ctr = 0) then - load_next_state <= CLEANUP; - else - load_next_state <= LOAD_TERM; - end if; - - when CLEANUP => - load_next_state <= IDLE; - - end case; -end process LOAD_MACHINE; - -HEADER_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = IDLE) then - header_ctr <= 3; - elsif (load_current_state = GET_Q_SIZE and header_ctr = 0) then - header_ctr <= 8; - elsif (load_current_state = LOAD_Q_HEADERS and header_ctr = 0) then - header_ctr <= 15; - elsif (load_current_state = LOAD_SUB and header_ctr = 0) then - if (size_for_padding(2) = '1') then - header_ctr <= 3; - else - header_ctr <= 31; - end if; - elsif (load_current_state = LOAD_PADDING and header_ctr = 0) then - header_ctr <= 31; - elsif (load_current_state = LOAD_TERM and header_ctr = 0) then - header_ctr <= 3; - elsif (TC_RD_EN_IN = '1') then - if (load_current_state = LOAD_Q_HEADERS or load_current_state = LOAD_SUB or load_current_state = LOAD_TERM or load_current_state = LOAD_PADDING) then - header_ctr <= header_ctr - 1; - else - header_ctr <= header_ctr; - end if; - elsif (load_current_state = GET_Q_SIZE) then - header_ctr <= header_ctr - 1; - else - header_ctr <= header_ctr; - end if; - end if; -end process HEADER_CTR_PROC; - -SIZE_FOR_PADDING_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = LOAD_SUB and header_ctr = 12) then - size_for_padding <= shf_q; - else - size_for_padding <= size_for_padding; - end if; - end if; -end process SIZE_FOR_PADDING_PROC; - -TC_SOD_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = START_TRANSFER) then - TC_SOD_OUT <= '1'; - else - TC_SOD_OUT <= '0'; - end if; - end if; -end process TC_SOD_PROC; - ---***** --- read from fifos - -df_rd_en <= '1' when (load_current_state = LOAD_DATA and TC_RD_EN_IN = '1') or - (load_current_state = LOAD_SUB and header_ctr = 0 and TC_RD_EN_IN = '1') - --(load_current_state = LOAD_SUB and header_ctr = 1 and TC_RD_EN_IN = '1') - else '0'; - -shf_rd_en <= '1' when (load_current_state = LOAD_SUB and TC_RD_EN_IN = '1') or - (load_current_state = LOAD_Q_HEADERS and header_ctr = 0 and TC_RD_EN_IN = '1') - else '0'; - -QUEUE_FIFO_RD_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = GET_Q_SIZE and header_ctr /= 0) then - qsf_rd_en_q <= '1'; - elsif (load_current_state = IDLE and qsf_empty = '0') then - qsf_rd_en_q <= '1'; - else - qsf_rd_en_q <= '0'; - end if; - end if; -end process QUEUE_FIFO_RD_PROC; - -qsf_rd_en <= '1' when load_current_state = LOAD_Q_HEADERS and TC_RD_EN_IN = '1' else qsf_rd_en_q; - -ACTUAL_Q_SIZE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = START_TRANSFER) then - actual_q_size(7 downto 0) <= qsf_q; - elsif (load_current_state = GET_Q_SIZE and header_ctr = 0) then - actual_q_size(15 downto 8) <= qsf_q; - end if; - end if; -end process ACTUAL_Q_SIZE_PROC; - -TC_EVENT_SIZE_OUT <= actual_q_size; - -TERMINATION_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = IDLE) then - termination <= (others => '0'); - elsif (TC_RD_EN_IN = '1' and term_ctr /= 33 and term_ctr /= 0) then - termination(255 downto 8) <= termination(247 downto 0); - - for I in 0 to 7 loop - case (load_current_state) is - when LOAD_Q_HEADERS => termination(I) <= qsf_q(I); - when LOAD_SUB => termination(I) <= shf_q(I); - when LOAD_DATA => termination(I) <= df_q(I); - when others => termination(I) <= '0'; - end case; - end loop; - - else - termination <= termination; - end if; - end if; -end process TERMINATION_PROC; - -TERM_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = IDLE) then - term_ctr <= 0; - elsif (TC_RD_EN_IN = '1' and term_ctr /= 33) then - term_ctr <= term_ctr + 1; - end if; - end if; -end process TERM_CTR_PROC; - -TC_DATA_PROC : process(CLK) -begin - if rising_edge(CLK) then - case (load_current_state) is - when LOAD_Q_HEADERS => tc_data <= qsf_q; - when LOAD_SUB => tc_data <= shf_q; - when LOAD_DATA => tc_data <= df_q; - when LOAD_PADDING => tc_data <= x"aa"; - when LOAD_TERM => tc_data <= termination((header_ctr + 1) * 8 - 1 downto header_ctr * 8); - when others => tc_data <= x"cc"; - end case; - end if; -end process TC_DATA_PROC; - -TC_DATA_OUT(7 downto 0) <= tc_data; -TC_DATA_8_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (load_current_state = LOAD_TERM and header_ctr = 0) then - TC_DATA_OUT(8) <= '1'; - else - TC_DATA_OUT(8) <= '0'; - end if; - end if; -end process TC_DATA_8_PROC; - ---***** --- outputs - - - -DEBUG_OUT <= (others => '0'); - -end architecture RTL; diff --git a/gbe2_ecp3/trb_net16_gbe_frame_constr.vhd b/gbe2_ecp3/trb_net16_gbe_frame_constr.vhd index 57d365f..3e6c836 100755 --- a/gbe2_ecp3/trb_net16_gbe_frame_constr.vhd +++ b/gbe2_ecp3/trb_net16_gbe_frame_constr.vhd @@ -72,7 +72,7 @@ port( ); end component; -attribute syn_encoding : string; +attribute sys_encoding : string; type constructStates is (IDLE, DEST_MAC_ADDR, SRC_MAC_ADDR, FRAME_TYPE_S, VERSION, TOS_S, IP_LENGTH, IDENT, FLAGS, TTL_S, PROTO, HEADER_CS, @@ -80,12 +80,10 @@ type constructStates is (IDLE, DEST_MAC_ADDR, SRC_MAC_ADDR, FRAME_TYPE_S, VE UDP_CS, SAVE_DATA, CLEANUP, DELAY); signal constructCurrentState, constructNextState : constructStates; signal bsm_constr : std_logic_vector(7 downto 0); -attribute syn_encoding of constructCurrentState: signal is "onehot"; +attribute sys_encoding of constructCurrentState: signal is "safe,gray"; type transmitStates is (T_IDLE, T_LOAD, T_TRANSMIT, T_PAUSE, T_CLEANUP); signal transmitCurrentState, transmitNextState : transmitStates; -attribute syn_encoding of transmitCurrentState : signal is "onehot"; - signal bsm_trans : std_logic_vector(3 downto 0); signal headers_int_counter : integer range 0 to 6; @@ -113,13 +111,10 @@ signal ready_frames_ctr_q : std_logic_vector(15 downto 0); signal ip_cs_temp_right : std_logic_vector(15 downto 0); -- gk 29.03.10 signal fpf_reset : std_logic; -- gk 01.01.01 -signal link_ok_125, link_ok_q : std_logic; -- gk 09.12.10 signal delay_ctr : std_logic_vector(31 downto 0); signal frame_delay_reg : std_logic_vector(31 downto 0); -signal fpf_data_q : std_logic_vector(7 downto 0); -signal fpf_wr_en_q, fpf_eod : std_logic; begin @@ -127,37 +122,19 @@ begin udp_checksum <= x"0000"; -- no checksum test needed --debug <= (others => '0'); -process(CLK) -begin - if rising_edge(CLK) then - if constructCurrentState = IDLE then - ready <= '1'; - else - ready <= '0'; - end if; - - if (constructCurrentState = SAVE_DATA) then - headers_ready <= '1'; - else - headers_ready <= '0'; - end if; - end if; -end process; ---ready <= '1' when (constructCurrentState = IDLE) --- else '0'; ---headers_ready <= '1' when (constructCurrentState = SAVE_DATA) --- else '0'; - -sizeProc: process(CLK) -- put_udp_headers, IP_F_SIZE_IN, UDP_P_SIZE_IN, DEST_UDP_PORT_IN) +ready <= '1' when (constructCurrentState = IDLE) + else '0'; +headers_ready <= '1' when (constructCurrentState = SAVE_DATA) + else '0'; + +sizeProc: process( put_udp_headers, IP_F_SIZE_IN, UDP_P_SIZE_IN, DEST_UDP_PORT_IN) begin - if rising_edge(CLK) then - if( put_udp_headers = '1' ) and (DEST_UDP_PORT_IN /= x"0000") then - ip_size <= IP_F_SIZE_IN + x"14" + x"8"; - udp_size <= UDP_P_SIZE_IN + x"8"; - else - ip_size <= IP_F_SIZE_IN + x"14"; - udp_size <= UDP_P_SIZE_IN; - end if; + if( put_udp_headers = '1' ) and (DEST_UDP_PORT_IN /= x"0000") then + ip_size <= IP_F_SIZE_IN + x"14" + x"8"; + udp_size <= UDP_P_SIZE_IN + x"8"; + else + ip_size <= IP_F_SIZE_IN + x"14"; + udp_size <= UDP_P_SIZE_IN; end if; end process sizeProc; @@ -400,6 +377,7 @@ begin end if; end process putUdpHeadersProc; + fpfWrEnProc : process(constructCurrentState, WR_EN_IN, RESET, LINK_OK_IN) begin if (RESET = '1') or (LINK_OK_IN = '0') then -- gk 01.10.10 @@ -444,16 +422,6 @@ begin end case; end process fpfDataProc; -syncProc : process(CLK) -begin - if rising_edge(CLK) then - fpf_data_q <= fpf_data; - fpf_wr_en_q <= fpf_wr_en; - fpf_eod <= END_OF_DATA_IN; - end if; -end process syncProc; - - readyFramesCtrProc: process( CLK ) begin @@ -466,25 +434,15 @@ begin end if; end process readyFramesCtrProc; -fpfResetProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1' or LINK_OK_IN = '0') then - fpf_reset <= '1'; - else - fpf_reset <= '0'; - end if; - end if; -end process fpfResetProc; ---fpf_reset <= '1' when (RESET = '1') or (LINK_OK_IN = '0') else '0'; -- gk 01.10.10 +fpf_reset <= '1' when (RESET = '1') or (LINK_OK_IN = '0') else '0'; -- gk 01.10.10 FINAL_PACKET_FIFO: fifo_4096x9 port map( - Data(7 downto 0) => fpf_data_q, - Data(8) => fpf_eod, --END_OF_DATA_IN, + Data(7 downto 0) => fpf_data, + Data(8) => END_OF_DATA_IN, WrClock => CLK, RdClock => RD_CLK, - WrEn => fpf_wr_en_q, + WrEn => fpf_wr_en, RdEn => fpf_rd_en, --FT_TX_RD_EN_IN, Reset => fpf_reset, RPReset => fpf_reset, @@ -493,9 +451,8 @@ port map( Full => fpf_full ); ---fpf_rd_en <= FT_TX_RD_EN_IN; -fpf_rd_en <= '1' when ((link_ok_125 = '1') and (FT_TX_RD_EN_IN = '1')) - or (link_ok_125 = '0') -- clear the fifo if link is down +fpf_rd_en <= '1' when ((LINK_OK_IN = '1') and (FT_TX_RD_EN_IN = '1')) + or (LINK_OK_IN = '0') -- clear the fifo if link is down else '0'; transferToRdClock : signal_sync @@ -511,18 +468,10 @@ transferToRdClock : signal_sync D_OUT => ready_frames_ctr_q ); -process(RD_CLK) -begin - if rising_edge(RD_CLK) then - link_ok_q <= LINK_OK_IN; - link_ok_125 <= link_ok_q; - end if; -end process; - transmitMachineProc: process( RD_CLK ) begin if( rising_edge(RD_CLK) ) then - if( RESET = '1' ) or (link_ok_125 = '0') then -- gk 01.10.10 + if( RESET = '1' ) or (LINK_OK_IN = '0') then -- gk 01.10.10 transmitCurrentState <= T_IDLE; else transmitCurrentState <= transmitNextState; @@ -530,7 +479,7 @@ begin end if; end process transmitMachineProc; -transmitMachine: process( transmitCurrentState, fpf_q, FT_TX_DONE_IN, sent_frames_ctr, link_ok_125, ready_frames_ctr_q, FT_TX_DISCFRM_IN ) +transmitMachine: process( transmitCurrentState, fpf_q, FT_TX_DONE_IN, sent_frames_ctr, ready_frames_ctr_q, FT_TX_DISCFRM_IN ) begin case transmitCurrentState is when T_IDLE => @@ -550,9 +499,9 @@ begin when T_TRANSMIT => bsm_trans <= x"2"; -- gk 03.08.10 - if ((link_ok_125 = '1') and ((FT_TX_DONE_IN = '1') or (FT_TX_DISCFRM_IN = '1')))then + if ((LINK_OK_IN = '1') and ((FT_TX_DONE_IN = '1') or (FT_TX_DISCFRM_IN = '1')))then transmitNextState <= T_CLEANUP; - elsif (link_ok_125 = '0') then + elsif (LINK_OK_IN = '0') then transmitNextState <= T_PAUSE; else transmitNextState <= T_TRANSMIT; @@ -573,7 +522,7 @@ end process transmitMachine; sopProc: process( RD_CLK ) begin if rising_edge(RD_CLK) then - if ( RESET = '1' ) or (link_ok_125 = '0') then -- gk 01.10.10 + if ( RESET = '1' ) or (LINK_OK_IN = '0') then -- gk 01.10.10 ft_sop <= '0'; elsif ((transmitCurrentState = T_IDLE) and (sent_frames_ctr /= ready_frames_ctr_q)) then ft_sop <= '1'; diff --git a/gbe2_ecp3/trb_net16_gbe_frame_receiver.vhd b/gbe2_ecp3/trb_net16_gbe_frame_receiver.vhd index 67d3701..4e381c8 100644 --- a/gbe2_ecp3/trb_net16_gbe_frame_receiver.vhd +++ b/gbe2_ecp3/trb_net16_gbe_frame_receiver.vhd @@ -67,7 +67,7 @@ architecture trb_net16_gbe_frame_receiver of trb_net16_gbe_frame_receiver is attribute syn_encoding : string; type filter_states is (IDLE, REMOVE_DEST, REMOVE_SRC, REMOVE_TYPE, SAVE_FRAME, DROP_FRAME, REMOVE_VID, REMOVE_VTYPE, REMOVE_IP, REMOVE_UDP, DECIDE, CLEANUP); signal filter_current_state, filter_next_state : filter_states; -attribute syn_encoding of filter_current_state : signal is "onehot"; +attribute syn_encoding of filter_current_state : signal is "safe,gray"; signal fifo_wr_en : std_logic; signal rx_bytes_ctr : std_logic_vector(15 downto 0); @@ -107,12 +107,7 @@ signal state : std_logic_vector(3 downto 0); signal parsed_frames_ctr : std_logic_vector(15 downto 0); signal ok_frames_ctr : std_logic_vector(15 downto 0); -signal rx_data, fr_q : std_logic_vector(8 downto 0); - -signal fr_src_ip, fr_dest_ip : std_logic_vector(31 downto 0); -signal fr_dest_udp, fr_src_udp, fr_frame_size, fr_frame_proto : std_logic_vector(15 downto 0); -signal fr_dest_mac, fr_src_mac : std_logic_vector(47 downto 0); -signal fr_ip_proto : std_logic_vector(7 downto 0); +signal rx_data : std_logic_vector(8 downto 0); attribute syn_preserve : boolean; attribute syn_keep : boolean; @@ -121,6 +116,20 @@ attribute syn_preserve of rec_fifo_empty, rec_fifo_full, state, sizes_fifo_empty begin +DEBUG_OUT(0) <= rec_fifo_empty; +DEBUG_OUT(1) <= rec_fifo_full; +DEBUG_OUT(2) <= sizes_fifo_empty; +DEBUG_OUT(3) <= sizes_fifo_full; +DEBUG_OUT(7 downto 4) <= state; +-- DEBUG_OUT(19 downto 8) <= dbg_rec_frames(11 downto 0); +-- DEBUG_OUT(31 downto 20) <= parsed_frames_ctr(11 downto 0); +-- +-- DEBUG_OUT(47 downto 32) <= dbg_ack_frames; +-- DEBUG_OUT(63 downto 48) <= dbg_drp_frames; +-- DEBUG_OUT(79 downto 64) <= error_frames_ctr; +-- DEBUG_OUT(95 downto 80) <= ok_frames_ctr; + + -- new_frame is asserted when first byte of the frame arrives NEW_FRAME_PROC : process(RX_MAC_CLK) begin @@ -149,14 +158,14 @@ begin end if; end process FILTER_MACHINE_PROC; -FILTER_MACHINE : process(filter_current_state, saved_frame_type, LINK_OK_IN, saved_proto, g_MY_MAC, saved_dest_mac, remove_ctr, new_frame, MAC_RX_EOF_IN, frame_type_valid, ALLOW_RX_IN) +FILTER_MACHINE : process(filter_current_state, saved_frame_type, saved_proto, g_MY_MAC, saved_dest_mac, remove_ctr, new_frame, MAC_RX_EOF_IN, frame_type_valid, ALLOW_RX_IN) begin case filter_current_state is when IDLE => state <= x"1"; - if (new_frame = '1') and (ALLOW_RX_IN = '1') and (LINK_OK_IN = '1') then + if (new_frame = '1') and (ALLOW_RX_IN = '1') then filter_next_state <= REMOVE_DEST; else filter_next_state <= IDLE; @@ -244,8 +253,6 @@ begin state <= x"6"; if (frame_type_valid = '1') then filter_next_state <= SAVE_FRAME; - elsif (saved_frame_type = x"0806") then - filter_next_state <= SAVE_FRAME; else filter_next_state <= DROP_FRAME; end if; @@ -440,73 +447,74 @@ end process SAVED_VID_PROC; type_validator : trb_net16_gbe_type_validator port map( - CLK => RX_MAC_CLK, - RESET => RESET, - FRAME_TYPE_IN => saved_frame_type, - SAVED_VLAN_ID_IN => saved_vid, - ALLOWED_TYPES_IN => FR_ALLOWED_TYPES_IN, - VLAN_ID_IN => FR_VLAN_ID_IN, + CLK => RX_MAC_CLK, + RESET => RESET, + FRAME_TYPE_IN => saved_frame_type, + SAVED_VLAN_ID_IN => saved_vid, + ALLOWED_TYPES_IN => FR_ALLOWED_TYPES_IN, + VLAN_ID_IN => FR_VLAN_ID_IN, -- IP level - IP_PROTOCOLS_IN => saved_proto, + IP_PROTOCOLS_IN => saved_proto, ALLOWED_IP_PROTOCOLS_IN => FR_ALLOWED_IP_IN, -- UDP level - UDP_PROTOCOL_IN => saved_dest_udp, + UDP_PROTOCOL_IN => saved_dest_udp, ALLOWED_UDP_PROTOCOLS_IN => FR_ALLOWED_UDP_IN, - VALID_OUT => frame_type_valid + VALID_OUT => frame_type_valid ); +--TODO put here a larger fifo maybe (for sure!) receive_fifo : fifo_4096x9 port map( --- Data(7 downto 0) => MAC_RXD_IN, --- Data(8) => MAC_RX_EOF_IN, - Data => rx_data, + Data(7 downto 0) => MAC_RXD_IN, + Data(8) => MAC_RX_EOF_IN, +-- Data => rx_data, WrClock => RX_MAC_CLK, RdClock => CLK, WrEn => fifo_wr_en, RdEn => FR_RD_EN_IN, Reset => RESET, RPReset => RESET, - Q => fr_q, --FR_Q_OUT, + Q => FR_Q_OUT, Empty => rec_fifo_empty, Full => rec_fifo_full ); -- BUG HERE, probably more lost bytes in the fifo in other conditions ---fifo_wr_en <= '1' when (MAC_RX_EN_IN = '1') and ((filter_current_state = SAVE_FRAME) or --- --( (filter_current_state = REMOVE_TYPE and remove_ctr = x"b" and saved_frame_type /= x"8100" and saved_frame_type /= x"0800") or --- ((filter_current_state = REMOVE_VTYPE and remove_ctr = x"f") or --- (filter_current_state = DECIDE and frame_type_valid = '1'))) --- else '0'; - -RX_FIFO_SYNC : process(RX_MAC_CLK) -begin - if rising_edge(RX_MAC_CLK) then - - rx_data(8) <= MAC_RX_EOF_IN; - rx_data(7 downto 0) <= MAC_RXD_IN; - - if (MAC_RX_EN_IN = '1') then - if (filter_current_state = SAVE_FRAME) then - fifo_wr_en <= '1'; - elsif (filter_current_state = REMOVE_VTYPE and remove_ctr = x"f") then - fifo_wr_en <= '1'; - elsif (filter_current_state = DECIDE and frame_type_valid = '1') then - fifo_wr_en <= '1'; - else - fifo_wr_en <= '0'; - end if; - else - fifo_wr_en <= '0'; - end if; - - MAC_RX_FIFO_FULL_OUT <= rec_fifo_full; - end if; -end process RX_FIFO_SYNC; +fifo_wr_en <= '1' when (MAC_RX_EN_IN = '1') and ((filter_current_state = SAVE_FRAME) or + --( (filter_current_state = REMOVE_TYPE and remove_ctr = x"b" and saved_frame_type /= x"8100" and saved_frame_type /= x"0800") or + ((filter_current_state = REMOVE_VTYPE and remove_ctr = x"f") or + (filter_current_state = DECIDE and frame_type_valid = '1'))) + else '0'; + +--RX_FIFO_SYNC : process(RX_MAC_CLK) +--begin +-- if rising_edge(RX_MAC_CLK) then +-- +-- rx_data(8) <= MAC_RX_EOF_IN; +-- rx_data(7 downto 0) <= MAC_RXD_IN; +-- +-- if (MAC_RX_EN_IN = '1') then +-- if (filter_current_state = SAVE_FRAME) then +-- fifo_wr_en <= '1'; +-- elsif (filter_current_state = REMOVE_VTYPE and remove_ctr = x"f") then +-- fifo_wr_en <= '1'; +-- elsif (filter_current_state = DECIDE and frame_type_valid = '1') then +-- fifo_wr_en <= '1'; +-- else +-- fifo_wr_en <= '0'; +-- end if; +-- else +-- fifo_wr_en <= '0'; +-- end if; +-- +-- end if; +--end process RX_FIFO_SYNC; +MAC_RX_FIFO_FULL_OUT <= rec_fifo_full; sizes_fifo : fifo_512x32 port map( @@ -518,8 +526,8 @@ port map( RdEn => FR_GET_FRAME_IN, Reset => RESET, RPReset => RESET, - Q(15 downto 0) => fr_frame_size, --FR_FRAME_SIZE_OUT, - Q(31 downto 16) => fr_frame_proto, --FR_FRAME_PROTO_OUT, + Q(15 downto 0) => FR_FRAME_SIZE_OUT, + Q(31 downto 16) => FR_FRAME_PROTO_OUT, Empty => sizes_fifo_empty, Full => sizes_fifo_full ); @@ -535,8 +543,8 @@ port map( RdEn => FR_GET_FRAME_IN, Reset => RESET, RPReset => RESET, - Q(47 downto 0) => fr_src_mac, --FR_SRC_MAC_ADDRESS_OUT, - Q(63 downto 48) => fr_src_udp, --FR_SRC_UDP_PORT_OUT, + Q(47 downto 0) => FR_SRC_MAC_ADDRESS_OUT, + Q(63 downto 48) => FR_SRC_UDP_PORT_OUT, Q(71 downto 64) => dump2, Empty => open, Full => open @@ -553,8 +561,8 @@ port map( RdEn => FR_GET_FRAME_IN, Reset => RESET, RPReset => RESET, - Q(47 downto 0) => fr_dest_mac, --FR_DEST_MAC_ADDRESS_OUT, - Q(63 downto 48) => fr_dest_udp, --FR_DEST_UDP_PORT_OUT, + Q(47 downto 0) => FR_DEST_MAC_ADDRESS_OUT, + Q(63 downto 48) => FR_DEST_UDP_PORT_OUT, Q(71 downto 64) => dump, Empty => open, Full => open @@ -571,29 +579,13 @@ port map( RdEn => FR_GET_FRAME_IN, Reset => RESET, RPReset => RESET, - Q(31 downto 0) => fr_src_ip, --FR_SRC_IP_ADDRESS_OUT, - Q(63 downto 32) => fr_dest_ip, --FR_DEST_IP_ADDRESS_OUT, - Q(71 downto 64) => fr_ip_proto, --FR_IP_PROTOCOL_OUT, + Q(31 downto 0) => FR_SRC_IP_ADDRESS_OUT, + Q(63 downto 32) => FR_DEST_IP_ADDRESS_OUT, + Q(71 downto 64) => FR_IP_PROTOCOL_OUT, Empty => open, Full => open ); -process(CLK) -begin - if rising_edge(CLK) then - FR_SRC_IP_ADDRESS_OUT <= fr_src_ip; - FR_DEST_IP_ADDRESS_OUT <= fr_dest_ip; - FR_IP_PROTOCOL_OUT <= fr_ip_proto; - FR_DEST_UDP_PORT_OUT <= fr_dest_udp; - FR_DEST_MAC_ADDRESS_OUT <= fr_dest_mac; - FR_SRC_MAC_ADDRESS_OUT <= fr_src_mac; - FR_SRC_UDP_PORT_OUT <= fr_src_udp; - FR_FRAME_PROTO_OUT <= fr_frame_proto; - FR_FRAME_SIZE_OUT <= fr_frame_size; - FR_Q_OUT <= fr_q; - end if; -end process; - FRAME_VALID_PROC : process(RX_MAC_CLK) begin if rising_edge(RX_MAC_CLK) then @@ -610,7 +602,7 @@ begin if rising_edge(RX_MAC_CLK) then if (RESET = '1') or (delayed_frame_valid_q = '1') then --if (RESET = '1') or (frame_valid_q = '1') then - rx_bytes_ctr <= x"0001"; + rx_bytes_ctr <= (others => '0'); elsif (fifo_wr_en = '1') then rx_bytes_ctr <= rx_bytes_ctr + x"1"; end if; diff --git a/gbe2_ecp3/trb_net16_gbe_frame_trans.vhd b/gbe2_ecp3/trb_net16_gbe_frame_trans.vhd index 07d3df2..eddaf7f 100755 --- a/gbe2_ecp3/trb_net16_gbe_frame_trans.vhd +++ b/gbe2_ecp3/trb_net16_gbe_frame_trans.vhd @@ -57,17 +57,16 @@ attribute syn_encoding : string; type macInitStates is (I_IDLE, I_INCRADDRESS, I_PAUSE, I_WRITE, I_PAUSE2, I_READ, I_PAUSE3, I_ENDED); signal macInitState, macInitNextState : macInitStates; -attribute syn_encoding of macInitState: signal is "onehot"; +attribute syn_encoding of macInitState: signal is "safe,gray"; signal bsm_init : std_logic_vector(3 downto 0); type macStates is (M_RESETING, M_IDLE, M_INIT); signal macCurrentState, macNextState : macStates; -attribute syn_encoding of macCurrentState : signal is "onehot"; signal bsm_mac : std_logic_vector(3 downto 0); type transmitStates is (T_IDLE, T_TRANSMIT, T_WAITFORFIFO); signal transmitCurrentState, transmitNextState : transmitStates; -attribute syn_encoding of transmitCurrentState: signal is "onehot"; +attribute syn_encoding of transmitCurrentState: signal is "safe,gray"; signal bsm_trans : std_logic_vector(3 downto 0); signal tx_fifoavail_i : std_logic; @@ -92,20 +91,9 @@ signal resetAddr : std_logic; signal FifoEmpty : std_logic; signal debug : std_logic_vector(63 downto 0); signal sent_ctr : std_logic_vector(31 downto 0); -signal link_ok_125 : std_logic; begin -linkOkSync : pulse_sync -port map( - CLK_A_IN => CLK, - RESET_A_IN => RESET, - PULSE_A_IN => LINK_OK_IN, - CLK_B_IN => TX_MAC_CLK, - RESET_B_IN => RESET, - PULSE_B_OUT => link_ok_125 -); - -- Fakes debug(63 downto 32) <= (others => '0'); --debug(31 downto 0) <= sent_ctr; @@ -122,12 +110,13 @@ begin end if; end process TransmitStatemachineProc; +--TransmitStateMachine : process (transmitCurrentState, macCurrentState, START_OF_PACKET_IN, DATA_ENDFLAG_IN, TX_DONE_IN) TransmitStateMachine : process (transmitCurrentState, START_OF_PACKET_IN, DATA_ENDFLAG_IN, TX_DONE_IN) begin case transmitCurrentState is when T_IDLE => bsm_trans <= x"0"; - if (START_OF_PACKET_IN = '1') then + if (START_OF_PACKET_IN = '1') then --and (macCurrentState = M_IDLE)) then transmitNextState <= T_TRANSMIT; else transmitNextState <= T_IDLE; @@ -141,7 +130,7 @@ begin end if; when T_WAITFORFIFO => bsm_trans <= x"2"; - if (TX_DONE_IN = '1') then + if (TX_DONE_IN = '1') then --or (TX_DISCFRM_IN = '1') then transmitNextState <= T_IDLE; else transmitNextState <= T_WAITFORFIFO; diff --git a/gbe2_ecp3/trb_net16_gbe_ipu2gbe_simple_sender.vhd b/gbe2_ecp3/trb_net16_gbe_ipu2gbe_simple_sender.vhd index 040737b..63edfba 100644 --- a/gbe2_ecp3/trb_net16_gbe_ipu2gbe_simple_sender.vhd +++ b/gbe2_ecp3/trb_net16_gbe_ipu2gbe_simple_sender.vhd @@ -40,8 +40,8 @@ port( READOUT_CTR_IN : in std_logic_vector(23 downto 0); -- gk 26.04.10 READOUT_CTR_VALID_IN : in std_logic; -- gk 26.04.10 - SCTRL_DUMMY_SIZE_IN : in std_logic_vector(15 downto 0); - SCTRL_DUMMY_PAUSE_IN : in std_logic_vector(31 downto 0); + SCTRL_DUMMY_SIZE_IN : in std_logic_vector(15 downto 0) := (others => '0'); + SCTRL_DUMMY_PAUSE_IN : in std_logic_vector(31 downto 0) := (others => '0'); -- PacketConstructor interface ALLOW_LARGE_IN : in std_logic; -- gk 21.07.10 diff --git a/gbe2_ecp3/trb_net16_gbe_ipu_interface.vhd b/gbe2_ecp3/trb_net16_gbe_ipu_interface.vhd deleted file mode 100644 index 8eb5c46..0000000 --- a/gbe2_ecp3/trb_net16_gbe_ipu_interface.vhd +++ /dev/null @@ -1,686 +0,0 @@ -LIBRARY ieee; -use ieee.std_logic_1164.all; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; -use IEEE.std_logic_arith.all; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; - -use work.trb_net_gbe_components.all; -use work.trb_net_gbe_protocols.all; - -entity trb_net16_gbe_ipu_interface is - port ( - CLK_IPU : in std_logic; - CLK_GBE : in std_logic; - RESET : in std_logic; - -- IPU interface directed toward the CTS - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_READ_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; --no more data, end transfer, send TRM - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data from Frontends - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_BUSY_IN : in std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - -- slow control interface - START_CONFIG_OUT : out std_logic; -- reconfigure MACs/IPs/ports/packet size - BANK_SELECT_OUT : out std_logic_vector(3 downto 0); -- configuration page address - CONFIG_DONE_IN : in std_logic; -- configuration finished - DATA_GBE_ENABLE_IN : in std_logic; -- IPU data is forwarded to GbE - DATA_IPU_ENABLE_IN : in std_logic; -- IPU data is forwarded to CTS / TRBnet - MULT_EVT_ENABLE_IN : in std_logic; - MAX_MESSAGE_SIZE_IN : in std_logic_vector(31 downto 0); -- the maximum size of one HadesQueue -- gk 08.04.10 - MIN_MESSAGE_SIZE_IN : in std_logic_vector(31 downto 0); -- gk 20.07.10 - READOUT_CTR_IN : in std_logic_vector(23 downto 0); -- gk 26.04.10 - READOUT_CTR_VALID_IN : in std_logic; -- gk 26.04.10 - -- PacketConstructor interface - ALLOW_LARGE_IN : in std_logic; -- gk 21.07.10 - PC_WR_EN_OUT : out std_logic; - PC_DATA_OUT : out std_logic_vector (7 downto 0); - PC_READY_IN : in std_logic; - PC_SOS_OUT : out std_logic; - PC_EOS_OUT : out std_logic; -- gk 07.10.10 - PC_EOD_OUT : out std_logic; - PC_SUB_SIZE_OUT : out std_logic_vector(31 downto 0); - PC_TRIG_NR_OUT : out std_logic_vector(31 downto 0); - PC_PADDING_OUT : out std_logic; - PC_TRIGGER_TYPE_OUT : out std_logic_vector(3 downto 0); - MONITOR_OUT : out std_logic_vector(223 downto 0); - DEBUG_OUT : out std_logic_vector(383 downto 0) - ); -end entity trb_net16_gbe_ipu_interface; - -architecture RTL of trb_net16_gbe_ipu_interface is - -attribute syn_encoding : string; - -type saveStates is (IDLE, SAVE_EVT_ADDR, WAIT_FOR_DATA, SAVE_DATA, ADD_SUBSUB1, ADD_SUBSUB2, ADD_SUBSUB3, ADD_SUBSUB4, TERMINATE, CLOSE, RESET_FIFO, CLEANUP, DROP_SUBEVENT); -signal save_current_state, save_next_state : saveStates; -attribute syn_encoding of save_current_state : signal is "onehot"; - ---type loadStates is (IDLE, REMOVE, WAIT_ONE, DECIDE, CALC_PADDING, WAIT_FOR_LOAD, LOAD, LOAD_LAST_ONE, LOAD_LAST_TWO, DROP, CLOSE); -type loadStates is (IDLE, REMOVE, WAIT_ONE, DECIDE, WAIT_FOR_LOAD, LOAD, CLOSE); -signal load_current_state, load_next_state : loadStates; -attribute syn_encoding of load_current_state : signal is "onehot"; - -signal sf_data : std_Logic_vector(15 downto 0); -signal save_eod, sf_wr_en, sf_rd_en, sf_reset, sf_empty, sf_full, sf_afull, sf_eod, sf_eod_q, sf_eod_qq : std_logic; -signal sf_q, pc_data : std_logic_vector(7 downto 0); - -signal cts_rnd, cts_trg : std_logic_vector(15 downto 0); -signal save_ctr : std_logic_vector(15 downto 0); - -signal saved_events_ctr, loaded_events_ctr, saved_events_ctr_gbe : std_logic_vector(7 downto 0); -signal loaded_bytes_ctr : std_Logic_vector(15 downto 0); - -signal trigger_random : std_logic_vector(7 downto 0); -signal trigger_number : std_logic_vector(15 downto 0); -signal subevent_size : std_logic_vector(17 downto 0); -signal trigger_type : std_logic_vector(3 downto 0); - -signal bank_select : std_logic_vector(3 downto 0); -signal readout_ctr : std_logic_vector(23 downto 0); - -begin - ---********* --- RECEIVING PART ---********* - -SAVE_MACHINE_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (RESET = '1') then - save_current_state <= IDLE; - else - save_current_state <= save_next_state; - end if; - end if; -end process SAVE_MACHINE_PROC; - -SAVE_MACHINE : process(save_current_state, CTS_START_READOUT_IN, FEE_BUSY_IN, CTS_READ_IN) -begin - case (save_current_state) is - - when IDLE => - if (CTS_START_READOUT_IN = '1') then - save_next_state <= SAVE_EVT_ADDR; - else - save_next_state <= IDLE; - end if; - - when SAVE_EVT_ADDR => - save_next_state <= WAIT_FOR_DATA; - - when WAIT_FOR_DATA => - if (FEE_BUSY_IN = '1') then - save_next_state <= SAVE_DATA; - else - save_next_state <= WAIT_FOR_DATA; - end if; - - when SAVE_DATA => - if (FEE_BUSY_IN = '0') then - save_next_state <= TERMINATE; - else - save_next_state <= SAVE_DATA; - end if; - - when TERMINATE => - if (CTS_READ_IN = '1') then - save_next_state <= CLOSE; - else - save_next_state <= TERMINATE; - end if; - - when CLOSE => - if (CTS_START_READOUT_IN = '0') then - if (sf_afull = '0') then - save_next_state <= ADD_SUBSUB1; - else - save_next_state <= DROP_SUBEVENT; - end if; - else - save_next_state <= CLOSE; - end if; - - when ADD_SUBSUB1 => - save_next_state <= ADD_SUBSUB2; - - when ADD_SUBSUB2 => - save_next_state <= ADD_SUBSUB3; - - when ADD_SUBSUB3 => - save_next_state <= ADD_SUBSUB4; - - when ADD_SUBSUB4 => - save_next_state <= CLEANUP; - - when CLEANUP => - save_next_state <= IDLE; - - when DROP_SUBEVENT => - save_next_state <= IDLE; - - --TODO: complete with reset fifo state - - when others => save_next_state <= IDLE; - - end case; -end process SAVE_MACHINE; - -SF_WR_EN_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (sf_afull = '0') then - if (save_current_state = SAVE_DATA and FEE_DATAREADY_IN = '1' and FEE_BUSY_IN = '1') then - sf_wr_en <= '1'; - elsif (save_current_state = SAVE_EVT_ADDR) then - sf_wr_en <= '1'; - elsif (save_current_state = ADD_SUBSUB1 or save_current_state = ADD_SUBSUB2 or save_current_state = ADD_SUBSUB3 or save_current_state = ADD_SUBSUB4) then - sf_wr_en <= '1'; - else - sf_wr_en <= '0'; - end if; - else - sf_wr_en <= '0'; - end if; - end if; -end process SF_WR_EN_PROC; - -SF_DATA_EOD_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - case (save_current_state) is - - when SAVE_EVT_ADDR => - sf_data(3 downto 0) <= CTS_INFORMATION_IN(3 downto 0); - sf_data(7 downto 4) <= CTS_READOUT_TYPE_IN; - sf_data(15 downto 8) <= x"ab"; - save_eod <= '0'; - - when SAVE_DATA => - sf_data <= FEE_DATA_IN; - save_eod <= '0'; - - when ADD_SUBSUB1 => - sf_data <= x"0001"; - save_eod <= '0'; - - when ADD_SUBSUB2 => - sf_data <= x"5555"; - save_eod <= '0'; - - when ADD_SUBSUB3 => - sf_data <= FEE_STATUS_BITS_IN(31 downto 16); - save_eod <= '1'; - - when ADD_SUBSUB4 => - sf_data <= FEE_STATUS_BITS_IN(15 downto 0); - save_eod <= '0'; - - when others => sf_data <= (others => '0'); save_eod <= '0'; - - end case; - end if; -end process SF_DATA_EOD_PROC; - -SAVED_EVENTS_CTR_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (RESET = '1') then - saved_events_ctr <= (others => '0'); - elsif (save_current_state = ADD_SUBSUB4) then - saved_events_ctr <= saved_events_ctr + x"1"; - else - saved_events_ctr <= saved_events_ctr; - end if; - end if; -end process SAVED_EVENTS_CTR_PROC; - -CTS_DATAREADY_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (save_current_state = SAVE_DATA and FEE_BUSY_IN = '0') then - CTS_DATAREADY_OUT <= '1'; - elsif (save_current_state = TERMINATE) then - CTS_DATAREADY_OUT <= '1'; - else - CTS_DATAREADY_OUT <= '0'; - end if; - end if; -end process CTS_DATAREADY_PROC; - -CTS_READOUT_FINISHED_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (save_current_state = CLOSE) then - CTS_READOUT_FINISHED_OUT <= '1'; - else - CTS_READOUT_FINISHED_OUT <= '0'; - end if; - end if; -end process CTS_READOUT_FINISHED_PROC; - -CTS_LENGTH_OUT <= (others => '0'); -CTS_ERROR_PATTERN_OUT <= (others => '0'); - -CTS_DATA_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - CTS_DATA_OUT <= "0001" & cts_rnd(11 downto 0) & cts_trg; - end if; -end process CTS_DATA_PROC; - -CTS_RND_TRG_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (save_current_state = SAVE_DATA and save_ctr = x"0000") then - cts_rnd <= sf_data; - cts_trg <= cts_trg; - elsif (save_current_state = SAVE_DATA and save_ctr = x"0001") then - cts_rnd <= cts_rnd; - cts_trg <= sf_data; - else - cts_rnd <= cts_rnd; - cts_trg <= cts_trg; - end if; - end if; -end process CTS_RND_TRG_PROC; - -SAVE_CTR_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (save_current_state = IDLE) then - save_ctr <= (others => '0'); - elsif (save_current_state = SAVE_DATA and sf_wr_en = '1') then - save_ctr <= save_ctr + x"1"; - else - save_ctr <= save_ctr; - end if; - end if; -end process SAVE_CTR_PROC; - -FEE_READ_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (sf_afull = '0') then - if (save_current_state = IDLE or save_current_state = SAVE_EVT_ADDR or save_current_state = WAIT_FOR_DATA or save_current_state = SAVE_DATA) then - FEE_READ_OUT <= '1'; - else - FEE_READ_OUT <= '0'; - end if; - else - FEE_READ_OUT <= '0'; - end if; - end if; -end process FEE_READ_PROC; - - -THE_SPLIT_FIFO: fifo_32kx16x8_mb2 --fifo_16kx18x9 -port map( - -- Byte swapping for correct byte order on readout side of FIFO - Data(7 downto 0) => sf_data(15 downto 8), - Data(8) => '0', - Data(16 downto 9) => sf_data(7 downto 0), - Data(17) => save_eod, - WrClock => CLK_IPU, - RdClock => CLK_GBE, - WrEn => sf_wr_en, - RdEn => sf_rd_en, - Reset => sf_reset, - RPReset => sf_reset, - AmEmptyThresh => b"0000_0000_0000_0010", --b"0000_0000_0000_0010", -- one byte ahead - AmFullThresh => b"111_1111_1110_1111", --b"111_1111_1110_1111", -- 0x7fef = 32751 - Q(7 downto 0) => sf_q, - Q(8) => sf_eod, - --WCNT => open, - --RCNT => open, - Empty => sf_empty, - AlmostEmpty => open, - Full => open, --sf_afull -- WARNING, JUST FOR DEBUG - AlmostFull => sf_afull -); - -SF_RESET_PROC : process(CLK_IPU) -begin - if rising_edge(CLK_IPU) then - if (RESET = '1') then - sf_reset <= '1'; - elsif (save_current_state = DROP_SUBEVENT) then - sf_reset <= '1'; - else - sf_reset <= '0'; - end if; - end if; -end process SF_RESET_PROC; - ---********* --- LOADING PART ---********* - -PC_DATA_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - pc_data <= sf_q; - end if; -end process PC_DATA_PROC; - -LOAD_MACHINE_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (RESET = '1') then - load_current_state <= IDLE; - else - load_current_state <= load_next_state; - end if; - end if; -end process LOAD_MACHINE_PROC; - -LOAD_MACHINE : process(load_current_state, saved_events_ctr_gbe, loaded_events_ctr, loaded_bytes_ctr, PC_READY_IN, sf_eod, MULT_EVT_ENABLE_IN) -begin - case (load_current_state) is - - when IDLE => - if (saved_events_ctr /= loaded_events_ctr) then - load_next_state <= REMOVE; - else - load_next_state <= IDLE; - end if; - - when REMOVE => - if (loaded_bytes_ctr = x"0008") then - load_next_state <= WAIT_ONE; - else - load_next_state <= REMOVE; - end if; - - when WAIT_ONE => - load_next_state <= DECIDE; - - when DECIDE => - load_next_state <= WAIT_FOR_LOAD; - - when WAIT_FOR_LOAD => - if (PC_READY_IN = '1') then - load_next_state <= LOAD; - else - load_next_state <= WAIT_FOR_LOAD; - end if; - - when LOAD => - if (sf_eod = '1') then - load_next_state <= CLOSE; --LOAD_LAST_ONE; - else - load_next_state <= LOAD; - end if; - --- when LOAD_LAST_ONE => --- load_next_state <= LOAD_LAST_TWO; --- --- when LOAD_LAST_TWO => --- load_next_state <= CLOSE; - --when DROP => - - when CLOSE => - load_next_state <= IDLE; - - when others => load_next_state <= IDLE; - - end case; -end process LOAD_MACHINE; - -saved_ctr_sync : signal_sync -generic map( - WIDTH => 8, - DEPTH => 2 -) -port map( - RESET => RESET, - CLK0 => CLK_GBE, - CLK1 => CLK_GBE, - D_IN => saved_events_ctr, - D_OUT => saved_events_ctr_gbe -); - - ---TODO: create a proper read signal here -SF_RD_EN_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = REMOVE) then - sf_rd_en <= '1'; - elsif (load_current_state = LOAD) then - sf_rd_en <= '1'; - else - sf_rd_en <= '0'; - end if; - end if; -end process SF_RD_EN_PROC; - ---***** --- information extraction - -TRIGGER_RANDOM_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE) then - trigger_random <= (others => '0'); - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0005") then - trigger_random <= pc_data; - else - trigger_random <= trigger_random; - end if; - end if; -end process TRIGGER_RANDOM_PROC; - -TRIGGER_NUMBER_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE) then - trigger_number <= (others => '0'); - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0007") then - trigger_number(7 downto 0) <= pc_data; - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0006") then - trigger_number(15 downto 8) <= pc_data; - else - trigger_number <= trigger_number; - end if; - end if; -end process TRIGGER_NUMBER_PROC; - -SUBEVENT_SIZE_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE) then - subevent_size <= (others => '0'); - elsif (load_current_state = WAIT_ONE and sf_rd_en = '1' and loaded_bytes_ctr = x"0009") then - subevent_size(9 downto 2) <= pc_data; - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0008") then - subevent_size(17 downto 10) <= pc_data; - elsif (load_current_state = DECIDE) then - subevent_size <= subevent_size + x"8"; - else - subevent_size <= subevent_size; - end if; - end if; -end process SUBEVENT_SIZE_PROC; - -TRIGGER_TYPE_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE) then - trigger_type <= x"0"; - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0003") then - trigger_type <= pc_data(7 downto 4); - else - trigger_type <= trigger_type; - end if; - end if; -end process TRIGGER_TYPE_PROC; - --- end of extraction ---***** - ---***** --- counters - -LOADED_EVENTS_CTR_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (RESET = '1') then - loaded_events_ctr <= (others => '0'); - elsif (load_current_state = CLOSE) then - loaded_events_ctr <= loaded_events_ctr + x"1"; - else - loaded_events_ctr <= loaded_events_ctr; - end if; - end if; -end process LOADED_EVENTS_CTR_PROC; - -LOADED_BYTES_CTR_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE or load_current_state = DECIDE) then - loaded_bytes_ctr <= (others => '0'); - elsif (sf_rd_en = '1') then - if (load_current_state = REMOVE or load_current_state = LOAD) then - loaded_bytes_ctr <= loaded_bytes_ctr + x"1"; - else - loaded_bytes_ctr <= loaded_bytes_ctr; - end if; - else - loaded_bytes_ctr <= loaded_bytes_ctr; - end if; - end if; -end process LOADED_BYTES_CTR_PROC; - -READOUT_CTR_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (RESET = '1' or READOUT_CTR_VALID_IN = '1') then - readout_ctr <= READOUT_CTR_IN; - elsif (load_current_state = DECIDE) then - readout_ctr <= readout_ctr + x"1"; - else - readout_ctr <= readout_ctr; - end if; - end if; -end process READOUT_CTR_PROC; - --- end of counters ---***** - ---***** --- event builder selection - ---TODO: close the current multievent packet in case event builder address changes - -BANK_SELECT_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = IDLE) then - bank_select <= x"0"; - elsif (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0003") then - bank_select <= pc_data(3 downto 0); - else - bank_select <= bank_select; - end if; - end if; -end process BANK_SELECT_PROC; - -BANK_SELECT_OUT <= bank_select; - -START_CONFIG_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = REMOVE and sf_rd_en = '1' and loaded_bytes_ctr = x"0003") then - START_CONFIG_OUT <= '1'; - elsif (CONFIG_DONE_IN = '1') then - START_CONFIG_OUT <= '0'; - else - START_CONFIG_OUT <= '0'; - end if; - end if; -end process START_CONFIG_PROC; - --- end of event builder selection ---***** - - -PC_WR_EN_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = LOAD) then - PC_WR_EN_OUT <= '1'; --- elsif (load_current_state = LOAD_LAST_ONE or load_current_state = LOAD_LAST_TWO) then --- PC_WR_EN_OUT <= '1'; - else - PC_WR_EN_OUT <= '0'; - end if; - end if; -end process PC_WR_EN_PROC; - -PC_SOS_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (load_current_state = DECIDE) then - PC_SOS_OUT <= '1'; - else - PC_SOS_OUT <= '0'; - end if; - end if; -end process PC_SOS_PROC; - -PC_EOD_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - if (sf_eod = '1') then - sf_eod_q <= '1'; - else - sf_eod_q <= '0'; - end if; - - --sf_eod_qq <= sf_eod_q; - --PC_EOD_OUT <= sf_eod_qq; - PC_EOD_OUT <= sf_eod; --_q; - end if; -end process PC_EOD_PROC; - -PC_EOS_PROC : process(CLK_GBE) -begin - if rising_edge(CLK_GBE) then - PC_EOS_OUT <= '0'; - end if; -end process PC_EOS_PROC; - ---******* --- outputs - -PC_DATA_OUT <= pc_data; - -PC_SUB_SIZE_OUT <= b"0000_0000_0000_00" & subevent_size; - -PC_TRIG_NR_OUT <= readout_ctr(23 downto 16) & trigger_number & trigger_random; - -PC_TRIGGER_TYPE_OUT <= trigger_type; - -PC_PADDING_OUT <= '0'; --padding_needed; not used anymore - -DEBUG_OUT <= (others => '0'); -MONITOR_OUT <= (others => '0'); - -end architecture RTL; diff --git a/gbe2_ecp3/trb_net16_gbe_mac_control.vhd b/gbe2_ecp3/trb_net16_gbe_mac_control.vhd index d05ec46..29196e7 100644 --- a/gbe2_ecp3/trb_net16_gbe_mac_control.vhd +++ b/gbe2_ecp3/trb_net16_gbe_mac_control.vhd @@ -44,15 +44,16 @@ end trb_net16_gbe_mac_control; architecture trb_net16_gbe_mac_control of trb_net16_gbe_mac_control is -attribute syn_encoding : string; +--attribute HGROUP : string; +--attribute HGROUP of trb_net16_gbe_mac_control : architecture is "GBE_BUF_group"; -type mac_conf_states is (IDLE, DISABLE, WRITE_TX_RX_CTRL1, WRITE_TX_RX_CTRL2, ENABLE, READY); +type mac_conf_states is (IDLE, DISABLE, WRITE_TX_RX_CTRL, WRITE_MAX_PKT_SIZE, SKIP, WRITE_IPG, + WRITE_MAC0, WRITE_MAC1, WRITE_MAC2, ENABLE, READY); signal mac_conf_current_state, mac_conf_next_state : mac_conf_states; -attribute syn_encoding of mac_conf_current_state : signal is "onehot"; signal tsmac_ready : std_logic; -signal reg_mode : std_logic_vector(7 downto 0); -signal reg_tx_rx_ctrl1, reg_tx_rx_ctrl2 : std_logic_vector(7 downto 0); +signal reg_mode : std_logic_vector(15 downto 0); +signal reg_tx_rx_ctrl : std_logic_vector(15 downto 0); signal reg_max_pkt_size : std_logic_vector(15 downto 0); signal reg_ipg : std_logic_vector(15 downto 0); signal reg_mac0 : std_logic_vector(15 downto 0); @@ -68,28 +69,46 @@ signal hready_n_q : std_logic; begin -reg_mode(7 downto 4) <= x"0"; +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(7 downto 4) <= haddr(3 downto 0); +DEBUG_OUT(8) <= hcs_n; +DEBUG_OUT(9) <= hwrite_n; +DEBUG_OUT(63 downto 11) <= (others => '0'); + +reg_mode(15 downto 4) <= (others => '0'); -- reserved reg_mode(3) <= '1'; -- tx_en reg_mode(2) <= '1'; -- rx_en reg_mode(1) <= '1'; -- flow_control en reg_mode(0) <= MC_GBE_EN_IN; -- gbe en -reg_tx_rx_ctrl2(7 downto 1) <= (others => '0'); -- reserved -reg_tx_rx_ctrl2(0) <= '1'; -- receive short -reg_tx_rx_ctrl1(7) <= '1'; -- receive broadcast -reg_tx_rx_ctrl1(6) <= '1'; -- drop control -reg_tx_rx_ctrl1(5) <= '0'; -- half_duplex en -reg_tx_rx_ctrl1(4) <= '1'; -- receive multicast -reg_tx_rx_ctrl1(3) <= '1'; -- receive pause -reg_tx_rx_ctrl1(2) <= '0'; -- transmit disable FCS -reg_tx_rx_ctrl1(1) <= '1'; -- receive discard FCS and padding -reg_tx_rx_ctrl1(0) <= MC_PROMISC_IN; -- promiscuous mode +reg_tx_rx_ctrl(15 downto 9) <= (others => '0'); -- reserved +reg_tx_rx_ctrl(8) <= '1'; -- receive short +reg_tx_rx_ctrl(7) <= '1'; -- receive broadcast +reg_tx_rx_ctrl(6) <= '1'; -- drop control +reg_tx_rx_ctrl(5) <= '0'; -- half_duplex en +reg_tx_rx_ctrl(4) <= '1'; -- receive multicast +reg_tx_rx_ctrl(3) <= '1'; -- receive pause +reg_tx_rx_ctrl(2) <= '0'; -- transmit disable FCS +reg_tx_rx_ctrl(1) <= '1'; -- receive discard FCS and padding +reg_tx_rx_ctrl(0) <= MC_PROMISC_IN; -- promiscuous mode + +reg_max_pkt_size(15 downto 0) <= x"05EE"; -- 1518 default value + +reg_ipg(15 downto 5) <= (others => '0'); +reg_ipg(4 downto 0) <= "01100"; -- default value inter-packet-gap in byte time + +reg_mac0(7 downto 0) <= MC_MAC_ADDR_IN(7 downto 0); +reg_mac0(15 downto 8) <= MC_MAC_ADDR_IN(15 downto 8); +reg_mac1(7 downto 0) <= MC_MAC_ADDR_IN(23 downto 16); +reg_mac1(15 downto 8) <= MC_MAC_ADDR_IN(31 downto 24); +reg_mac2(7 downto 0) <= MC_MAC_ADDR_IN(39 downto 32); +reg_mac2(15 downto 8) <= MC_MAC_ADDR_IN(47 downto 40); MAC_CONF_MACHINE_PROC : process(CLK) begin if rising_edge(CLK) then - if (RESET = '1') then + if (RESET = '1') or (MC_RECONF_IN = '1') then mac_conf_current_state <= IDLE; else mac_conf_current_state <= mac_conf_next_state; @@ -97,52 +116,98 @@ begin end if; end process MAC_CONF_MACHINE_PROC; -MAC_CONF_MACHINE : process(mac_conf_current_state, MC_RECONF_IN, TSM_HREADY_N_IN) +MAC_CONF_MACHINE : process(mac_conf_current_state, tsmac_ready, haddr) begin case mac_conf_current_state is when IDLE => - if (MC_RECONF_IN = '1') then - mac_conf_next_state <= DISABLE; - else - mac_conf_next_state <= IDLE; - end if; + state <= x"1"; + if (tsmac_ready = '0') then + mac_conf_next_state <= DISABLE; + else + mac_conf_next_state <= IDLE; + end if; when DISABLE => - if (TSM_HREADY_N_IN = '0') then - mac_conf_next_state <= WRITE_TX_RX_CTRL1; - else - mac_conf_next_state <= DISABLE; - end if; - - when WRITE_TX_RX_CTRL1 => - if (TSM_HREADY_N_IN = '0') then - mac_conf_next_state <= WRITE_TX_RX_CTRL2; - else - mac_conf_next_state <= WRITE_TX_RX_CTRL1; - end if; - - when WRITE_TX_RX_CTRL2 => - if (TSM_HREADY_N_IN = '0') then - mac_conf_next_state <= ENABLE; - else - mac_conf_next_state <= WRITE_TX_RX_CTRL2; - end if; + state <= x"2"; + if (haddr = x"01") then + mac_conf_next_state <= WRITE_TX_RX_CTRL; + else + mac_conf_next_state <= DISABLE; + end if; + + when WRITE_TX_RX_CTRL => + state <= x"3"; + if (haddr = x"03") then + mac_conf_next_state <= WRITE_MAX_PKT_SIZE; + else + mac_conf_next_state <= WRITE_TX_RX_CTRL; + end if; + + when WRITE_MAX_PKT_SIZE => + state <= x"4"; + if (haddr = x"05") then + mac_conf_next_state <= SKIP; + else + mac_conf_next_state <= WRITE_MAX_PKT_SIZE; + end if; + + when SKIP => + state <= x"5"; + if (haddr = x"07") then + mac_conf_next_state <= WRITE_IPG; + else + mac_conf_next_state <= SKIP; + end if; + + when WRITE_IPG => + state <= x"6"; + if (haddr = x"09") then + mac_conf_next_state <= WRITE_MAC0; + else + mac_conf_next_state <= WRITE_IPG; + end if; + + when WRITE_MAC0 => + state <= x"7"; + if (haddr = x"0B") then + mac_conf_next_state <= WRITE_MAC1; + else + mac_conf_next_state <= WRITE_MAC0; + end if; + + when WRITE_MAC1 => + state <= x"8"; + if (haddr = x"0D") then + mac_conf_next_state <= WRITE_MAC2; + else + mac_conf_next_state <= WRITE_MAC1; + end if; + + when WRITE_MAC2 => + state <= x"9"; + if (haddr = x"0F") then + mac_conf_next_state <= ENABLE; + else + mac_conf_next_state <= WRITE_MAC2; + end if; when ENABLE => - if (TSM_HREADY_N_IN = '0') then - mac_conf_next_state <= READY; - else - mac_conf_next_state <= ENABLE; - end if; + state <= x"a"; + if (haddr = x"01") then + mac_conf_next_state <= READY; + else + mac_conf_next_state <= ENABLE; + end if; when READY => - if (MC_RECONF_IN = '1') then - mac_conf_next_state <= DISABLE; - else - mac_conf_next_state <= READY; - end if; + state <= x"b"; + if (MC_RECONF_IN = '1') then + mac_conf_next_state <= IDLE; + else + mac_conf_next_state <= READY; + end if; end case; @@ -150,69 +215,73 @@ end process MAC_CONF_MACHINE; HADDR_PROC : process(CLK) begin - if rising_edge(CLK) then - case mac_conf_current_state is - when IDLE => - TSM_HADDR_OUT <= x"00"; - when DISABLE => - TSM_HADDR_OUT <= x"00"; - when WRITE_TX_RX_CTRL1 => - TSM_HADDR_OUT <= x"02"; - when WRITE_TX_RX_CTRL2 => - TSM_HADDR_OUT <= x"03"; - when ENABLE => - TSM_HADDR_OUT <= x"00"; - when READY => - TSM_HADDR_OUT <= x"00"; - end case; - end if; + if rising_edge(CLK) then + if (RESET = '1') or (mac_conf_current_state = IDLE) then + haddr <= (others => '0'); + elsif (mac_conf_current_state /= IDLE) and (hcs_n = '0') and (TSM_HREADY_N_IN = '0') then + haddr <= haddr + x"1"; + elsif (mac_conf_current_state = SKIP) then + haddr <= haddr + x"1"; + elsif (mac_conf_current_state = WRITE_MAC2) and (haddr = x"0F") and (TSM_HREADY_N_IN = '0') then + haddr <= (others => '0'); + end if; + end if; end process HADDR_PROC; -HDATA_PROC : process(CLK) +HDATA_PROC : process(mac_conf_current_state) begin - if rising_edge(CLK) then - case mac_conf_current_state is - when IDLE => - TSM_HDATA_OUT <= x"00"; - when DISABLE => - TSM_HDATA_OUT <= x"00"; - when WRITE_TX_RX_CTRL1 => - TSM_HDATA_OUT <= reg_tx_rx_ctrl1; - when WRITE_TX_RX_CTRL2 => - TSM_HDATA_OUT <= reg_tx_rx_ctrl2; - when ENABLE => - TSM_HDATA_OUT <= reg_mode; - when READY => - TSM_HDATA_OUT <= x"00"; - end case; - end if; + + case mac_conf_current_state is + + when WRITE_TX_RX_CTRL => + TSM_HDATA_OUT <= reg_tx_rx_ctrl(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when WRITE_MAX_PKT_SIZE => + TSM_HDATA_OUT <= reg_max_pkt_size(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when WRITE_IPG => + TSM_HDATA_OUT <= reg_ipg(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when WRITE_MAC0 => + TSM_HDATA_OUT <= reg_mac0(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when WRITE_MAC1 => + TSM_HDATA_OUT <= reg_mac1(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when WRITE_MAC2 => + TSM_HDATA_OUT <= reg_mac2(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when ENABLE => + TSM_HDATA_OUT <= reg_mode(7 + 8 * hdata_pointer downto 8 * hdata_pointer); + + when others => + TSM_HDATA_OUT <= (others => '0'); + + end case; + end process HDATA_PROC; -process(CLK) +-- delay hready by one clock cycle to keep hcs and hwrite active during hready +HREADY_Q_PROC : process(CLK) begin - if rising_edge(CLK) then - if (mac_conf_current_state = IDLE or mac_conf_current_state = READY) then - hcs_n <= '1'; - hwrite_n <= '1'; - elsif (TSM_HREADY_N_IN = '1') then - hcs_n <= '0'; - hwrite_n <= '0'; - else - hcs_n <= '1'; - hwrite_n <= '1'; - end if; - - if (mac_conf_current_state = READY) then - tsmac_ready <= '1'; - else - tsmac_ready <= '0'; - end if; - end if; -end process; + if rising_edge(CLK) then + hready_n_q <= TSM_HREADY_N_IN; + end if; +end process HREADY_Q_PROC; + +hdata_pointer <= 1 when haddr(0) = '1' else 0; + +hcs_n <= '0' when (mac_conf_current_state /= IDLE) and (mac_conf_current_state /= SKIP) and (mac_conf_current_state /= READY) and (hready_n_q = '1') + else '1'; -- should also support reading + +hwrite_n <= hcs_n when (mac_conf_current_state /= IDLE) else '1'; -- active only during writing + +tsmac_ready <= '1' when (mac_conf_current_state = READY) else '0'; +TSM_HADDR_OUT <= haddr; TSM_HCS_N_OUT <= hcs_n; TSM_HWRITE_N_OUT <= hwrite_n; -TSM_HREAD_N_OUT <= '1'; +TSM_HREAD_N_OUT <= '1'; -- for the moment no reading MC_TSMAC_READY_OUT <= tsmac_ready; diff --git a/gbe2_ecp3/trb_net16_gbe_main_control.vhd b/gbe2_ecp3/trb_net16_gbe_main_control.vhd index 574f179..87f2e18 100644 --- a/gbe2_ecp3/trb_net16_gbe_main_control.vhd +++ b/gbe2_ecp3/trb_net16_gbe_main_control.vhd @@ -26,7 +26,6 @@ port ( MC_LINK_OK_OUT : out std_logic; MC_RESET_LINK_IN : in std_logic; - MC_IDLE_TOO_LONG_OUT : out std_logic; -- signals to/from receive controller RC_FRAME_WAITING_IN : in std_logic; @@ -44,22 +43,34 @@ port ( RC_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- signals to/from transmit controller - TC_TRANSMIT_CTRL_OUT : out std_logic; + TC_TRANSMIT_CTRL_OUT : out std_logic; -- slow control frame is waiting to be built and sent + TC_TRANSMIT_DATA_OUT : out std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_RD_EN_IN : in std_logic; TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; TC_TRANSMIT_DONE_IN : in std_logic; +-- signals to/from packet constructor + PC_READY_IN : in std_logic; + PC_TRANSMIT_ON_IN : in std_logic; + PC_SOD_IN : in std_logic; + -- signals to/from sgmii/gbe pcs_an_complete PCS_AN_COMPLETE_IN : in std_logic; @@ -77,38 +88,6 @@ port ( GSC_REPLY_READ_OUT : out std_logic; GSC_BUSY_IN : in std_logic; - -- signal for data readout - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; - MAKE_RESET_OUT : out std_logic; -- signal to/from Host interface of TriSpeed MAC @@ -136,8 +115,6 @@ architecture trb_net16_gbe_main_control of trb_net16_gbe_main_control is --attribute HGROUP : string; --attribute HGROUP of trb_net16_gbe_main_control : architecture is "GBE_MAIN_group"; -attribute syn_encoding : string; - signal tsm_ready : std_logic; signal tsm_reconf : std_logic; signal tsm_haddr : std_logic_vector(7 downto 0); @@ -148,7 +125,6 @@ signal tsm_hread_n : std_logic; type link_states is (ACTIVE, INACTIVE, ENABLE_MAC, TIMEOUT, FINALIZE, WAIT_FOR_BOOT, GET_ADDRESS); signal link_current_state, link_next_state : link_states; -attribute syn_encoding of link_current_state : signal is "onehot"; signal link_down_ctr : std_logic_vector(15 downto 0); signal link_down_ctr_lock : std_logic; @@ -157,9 +133,8 @@ signal link_ok_timeout_ctr : std_logic_vector(15 downto 0); signal mac_control_debug : std_logic_vector(63 downto 0); -type flow_states is (IDLE, TRANSMIT_CTRL, WAIT_FOR_FC, CLEANUP); +type flow_states is (IDLE, TRANSMIT_DATA, TRANSMIT_CTRL, CLEANUP); signal flow_current_state, flow_next_state : flow_states; -attribute syn_encoding of flow_current_state : signal is "onehot"; signal state : std_logic_vector(3 downto 0); signal link_state : std_logic_vector(3 downto 0); @@ -186,11 +161,11 @@ signal frame_waiting_ctr : std_logic_vector(15 downto 0); signal ps_busy_q : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); signal rc_frame_proto_q : std_Logic_vector(c_MAX_PROTOCOLS - 1 downto 0); -type redirect_states is (IDLE, CHECK_TYPE, DROP, CHECK_BUSY, LOAD, BUSY, WAIT_ONE, FINISH, CLEANUP); +type redirect_states is (IDLE, CHECK_TYPE, DROP, CHECK_BUSY, LOAD, BUSY, FINISH, CLEANUP); signal redirect_current_state, redirect_next_state : redirect_states; -attribute syn_encoding of redirect_current_state : signal is "onehot"; -signal disable_redirect, ps_wr_en_q, ps_wr_en_qq : std_logic; +signal frame_type : std_logic_vector(15 downto 0); +signal disable_redirect, ps_wr_en_q : std_logic; type stats_states is (IDLE, LOAD_VECTOR, CLEANUP); signal stats_current_state, stats_next_state : stats_states; @@ -213,12 +188,10 @@ signal nothing_sent_ctr : std_logic_vector(31 downto 0); signal dbg_ps : std_Logic_vector(63 downto 0); -signal tc_data : std_logic_vector(8 downto 0); - attribute syn_preserve : boolean; attribute syn_keep : boolean; -attribute syn_keep of unique_id, nothing_sent, link_state, state, redirect_state, dhcp_done : signal is true; -attribute syn_preserve of unique_id, nothing_sent, link_state, state, redirect_state, dhcp_done : signal is true; +attribute syn_keep of unique_id, nothing_sent, link_state, state, redirect_state : signal is true; +attribute syn_preserve of unique_id, nothing_sent, link_state, state, redirect_state : signal is true; signal mc_busy : std_logic; @@ -232,7 +205,7 @@ port map( RESET => RESET, PS_DATA_IN => rc_data_local, -- RC_DATA_IN, - PS_WR_EN_IN => ps_wr_en_qq, --ps_wr_en, + PS_WR_EN_IN => ps_wr_en_q, --ps_wr_en, PS_PROTO_SELECT_IN => proto_select, PS_BUSY_OUT => ps_busy, PS_FRAME_SIZE_IN => RC_FRAME_SIZE_IN, @@ -245,12 +218,12 @@ port map( PS_SRC_UDP_PORT_IN => RC_SRC_UDP_PORT_IN, PS_DEST_UDP_PORT_IN => RC_DEST_UDP_PORT_IN, - TC_DATA_OUT => tc_data, - TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => TC_DATA_OUT, + TC_RD_EN_IN => TC_RD_EN_IN, TC_FRAME_SIZE_OUT => TC_FRAME_SIZE_OUT, - TC_FRAME_TYPE_OUT => TC_FRAME_TYPE_OUT, + TC_FRAME_TYPE_OUT => frame_type, --TC_FRAME_TYPE_OUT, TC_IP_PROTOCOL_OUT => TC_IP_PROTOCOL_OUT, - TC_IDENT_OUT => TC_IDENT_OUT, + TC_DEST_MAC_OUT => TC_DEST_MAC_OUT, TC_DEST_IP_OUT => TC_DEST_IP_OUT, TC_DEST_UDP_OUT => TC_DEST_UDP_OUT, @@ -258,6 +231,11 @@ port map( TC_SRC_IP_OUT => TC_SRC_IP_OUT, TC_SRC_UDP_OUT => TC_SRC_UDP_OUT, + TC_IP_SIZE_OUT => TC_IP_SIZE_OUT, + TC_UDP_SIZE_OUT => TC_UDP_SIZE_OUT, + TC_FLAGS_OFFSET_OUT => TC_FLAGS_OFFSET_OUT, + + TC_BUSY_IN => TC_BUSY_IN, MC_BUSY_IN => mc_busy, RECEIVED_FRAMES_OUT => SELECT_REC_FRAMES_OUT, @@ -280,37 +258,6 @@ port map( MAKE_RESET_OUT => MAKE_RESET_OUT, - -- CTS interface - CTS_NUMBER_IN => CTS_NUMBER_IN, - CTS_CODE_IN => CTS_CODE_IN, - CTS_INFORMATION_IN => CTS_INFORMATION_IN, - CTS_READOUT_TYPE_IN => CTS_READOUT_TYPE_IN, - CTS_START_READOUT_IN => CTS_START_READOUT_IN, - CTS_DATA_OUT => CTS_DATA_OUT, - CTS_DATAREADY_OUT => CTS_DATAREADY_OUT, - CTS_READOUT_FINISHED_OUT => CTS_READOUT_FINISHED_OUT, - CTS_READ_IN => CTS_READ_IN, - CTS_LENGTH_OUT => CTS_LENGTH_OUT, - CTS_ERROR_PATTERN_OUT => CTS_ERROR_PATTERN_OUT, - -- Data payload interface - FEE_DATA_IN => FEE_DATA_IN, - FEE_DATAREADY_IN => FEE_DATAREADY_IN, - FEE_READ_OUT => FEE_READ_OUT, - FEE_STATUS_BITS_IN => FEE_STATUS_BITS_IN, - FEE_BUSY_IN => FEE_BUSY_IN, - -- ip configurator - SLV_ADDR_IN => SLV_ADDR_IN, - SLV_READ_IN => SLV_READ_IN, - SLV_WRITE_IN => SLV_WRITE_IN, - SLV_BUSY_OUT => SLV_BUSY_OUT, - SLV_ACK_OUT => SLV_ACK_OUT, - SLV_DATA_IN => SLV_DATA_IN, - SLV_DATA_OUT => SLV_DATA_OUT, - - CFG_GBE_ENABLE_IN => CFG_GBE_ENABLE_IN, - CFG_IPU_ENABLE_IN => CFG_IPU_ENABLE_IN, - CFG_MULT_ENABLE_IN => CFG_MULT_ENABLE_IN, - -- input for statistics from outside STAT_DATA_IN => stat_data, STAT_ADDR_IN => stat_addr, @@ -321,7 +268,7 @@ port map( DEBUG_OUT => dbg_ps ); -TC_DATA_OUT <= tc_data; +TC_FRAME_TYPE_OUT <= frame_type when flow_current_state = TRANSMIT_CTRL else x"0008"; -- gk 07.11.11 -- do not select any response constructors when dropping a frame @@ -341,8 +288,6 @@ begin else disable_redirect <= '0'; end if; - else - disable_redirect <= disable_redirect; end if; end if; end process DISABLE_REDIRECT_PROC; @@ -379,7 +324,8 @@ begin end if; -- gk 16.11.11 when CHECK_TYPE => - if (link_current_state = ACTIVE) then + redirect_state <= x"1"; + if (link_current_state = ACTIVE) then redirect_next_state <= CHECK_BUSY; elsif (link_current_state = GET_ADDRESS and RC_FRAME_PROTO_IN = "10") then redirect_next_state <= CHECK_BUSY; @@ -391,7 +337,7 @@ begin when DROP => redirect_state <= x"7"; if (loaded_bytes_ctr = RC_FRAME_SIZE_IN - x"1") then - redirect_next_state <= WAIT_ONE; --FINISH; + redirect_next_state <= FINISH; else redirect_next_state <= DROP; end if; @@ -407,7 +353,7 @@ begin when LOAD => redirect_state <= x"2"; if (loaded_bytes_ctr = RC_FRAME_SIZE_IN - x"1") then - redirect_next_state <= WAIT_ONE; --FINISH; + redirect_next_state <= FINISH; else redirect_next_state <= LOAD; end if; @@ -419,10 +365,6 @@ begin else redirect_next_state <= BUSY; end if; - - when WAIT_ONE => - redirect_state <= x"f"; - redirect_next_state <= FINISH; when FINISH => redirect_state <= x"4"; @@ -443,7 +385,7 @@ begin if rising_edge(CLK) then if (RESET = '1') then RC_LOADING_DONE_OUT <= '0'; - elsif (RC_DATA_IN(8) = '1' and ps_wr_en_q = '1') then + elsif (RC_DATA_IN(8) = '1' and ps_wr_en = '1') then RC_LOADING_DONE_OUT <= '1'; else RC_LOADING_DONE_OUT <= '0'; @@ -454,9 +396,8 @@ end process LOADING_DONE_PROC; PS_WR_EN_PROC : process(CLK) begin if rising_edge(CLK) then - ps_wr_en <= rc_rd_en; - ps_wr_en_q <= ps_wr_en; - ps_wr_en_qq <= ps_wr_en_q; + ps_wr_en <= rc_rd_en; + ps_wr_en_q <= ps_wr_en; end if; end process PS_WR_EN_PROC; @@ -467,8 +408,6 @@ begin loaded_bytes_ctr <= (others => '0'); elsif (redirect_current_state = LOAD or redirect_current_state = DROP) and (rc_rd_en = '1') then loaded_bytes_ctr <= loaded_bytes_ctr + x"1"; - else - loaded_bytes_ctr <= loaded_bytes_ctr; end if; end if; end process LOADED_BYTES_CTR_PROC; @@ -503,58 +442,69 @@ begin end if; end process FLOW_MACHINE_PROC; -FLOW_MACHINE : process(flow_current_state, TC_TRANSMIT_DONE_IN, ps_response_ready, tc_data) +FLOW_MACHINE : process(flow_current_state, PC_TRANSMIT_ON_IN, PC_SOD_IN, TC_TRANSMIT_DONE_IN, ps_response_ready) begin - case flow_current_state is + case flow_current_state is + + when IDLE => + state <= x"1"; + if (ps_response_ready = '1') and (PC_TRANSMIT_ON_IN = '0') then + flow_next_state <= TRANSMIT_CTRL; + elsif (PC_SOD_IN = '1') then -- pottential loss of frames + flow_next_state <= TRANSMIT_DATA; + else + flow_next_state <= IDLE; + end if; + + when TRANSMIT_DATA => + state <= x"2"; + if (TC_TRANSMIT_DONE_IN = '1') then + flow_next_state <= CLEANUP; + else + flow_next_state <= TRANSMIT_DATA; + end if; + + when TRANSMIT_CTRL => + state <= x"3"; + if (TC_TRANSMIT_DONE_IN = '1') then + flow_next_state <= CLEANUP; + else + flow_next_state <= TRANSMIT_CTRL; + end if; + + when CLEANUP => + state <= x"4"; + flow_next_state <= IDLE; - when IDLE => - if (ps_response_ready = '1') then - flow_next_state <= TRANSMIT_CTRL; - else - flow_next_state <= IDLE; - end if; - - when TRANSMIT_CTRL => - if (tc_data(8) = '1') then - flow_next_state <= WAIT_FOR_FC; - else - flow_next_state <= TRANSMIT_CTRL; - end if; - - when WAIT_FOR_FC => - if (TC_TRANSMIT_DONE_IN = '1') then - flow_next_state <= CLEANUP; - else - flow_next_state <= WAIT_FOR_FC; - end if; + end case; +end process FLOW_MACHINE; - when CLEANUP => - flow_next_state <= IDLE; +TC_TRANSMIT_DATA_OUT <= '1' when (flow_current_state = TRANSMIT_DATA) else '0'; +TC_TRANSMIT_CTRL_OUT <= '1' when (flow_current_state = TRANSMIT_CTRL) else '0'; - end case; -end process FLOW_MACHINE; +mc_busy <= '0' when flow_current_state = IDLE else '1'; -process(CLK) +NOTHING_SENT_CTR_PROC : process(CLK) begin if rising_edge(CLK) then - if (flow_current_state = IDLE and ps_response_ready = '1') then - TC_TRANSMIT_CTRL_OUT <= '1'; - else - TC_TRANSMIT_CTRL_OUT <= '0'; - end if; - - if (flow_current_state = TRANSMIT_CTRL or flow_current_state = WAIT_FOR_FC) then - mc_busy <= '1'; + if (RESET = '1' or TC_TRANSMIT_DONE_IN = '1') then + nothing_sent_ctr <= (others => '0'); else - mc_busy <= '0'; + nothing_sent_ctr <= nothing_sent_ctr + x"1"; end if; end if; -end process; ---TC_TRANSMIT_CTRL_OUT <= '1' when (flow_current_state = TRANSMIT_CTRL) else '0'; ---TC_TRANSMIT_CTRL_OUT <= '1' when (flow_current_state = IDLE and ps_response_ready = '1') else '0'; +end process NOTHING_SENT_CTR_PROC; ---mc_busy <= '0' when flow_current_state = IDLE else '1'; ---mc_busy <= '1' when flow_current_state = TRANSMIT_CTRL or flow_current_state = WAIT_FOR_FC else '0'; +NOTHING_SENT_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + nothing_sent <= '0'; + elsif (nothing_sent_ctr = x"ffff_ffff") then + nothing_sent <= '1'; + end if; + end if; +end process NOTHING_SENT_PROC; --*********************** -- LINK STATE CONTROL @@ -566,7 +516,7 @@ begin if (g_SIMULATE = 0) then link_current_state <= INACTIVE; else - link_current_state <= ACTIVE; --GET_ADDRESS; --ACTIVE; + link_current_state <= GET_ADDRESS; --ACTIVE; end if; else link_current_state <= link_next_state; @@ -574,7 +524,7 @@ begin end if; end process; -LINK_STATE_MACHINE : process(link_current_state, dhcp_done, wait_ctr, PCS_AN_COMPLETE_IN, tsm_ready, link_ok_timeout_ctr) +LINK_STATE_MACHINE : process(link_current_state, dhcp_done, wait_ctr, PCS_AN_COMPLETE_IN, tsm_ready, link_ok_timeout_ctr, PC_READY_IN) begin case link_current_state is @@ -621,7 +571,11 @@ begin if (PCS_AN_COMPLETE_IN = '0') then link_next_state <= INACTIVE; else - link_next_state <= WAIT_FOR_BOOT; --ACTIVE; + if (PC_READY_IN = '1') then + link_next_state <= WAIT_FOR_BOOT; --ACTIVE; + else + link_next_state <= FINALIZE; + end if; end if; when WAIT_FOR_BOOT => @@ -659,22 +613,10 @@ begin elsif (link_current_state = TIMEOUT) then link_ok_timeout_ctr <= link_ok_timeout_ctr + x"1"; end if; - - if (link_current_state = ACTIVE or link_current_state = GET_ADDRESS) then - link_ok <= '1'; - else - link_ok <= '0'; - end if; - - if (link_current_state = GET_ADDRESS) then - dhcp_start <= '1'; - else - dhcp_start <= '0'; - end if; end if; end process LINK_OK_CTR_PROC; ---link_ok <= '1' when (link_current_state = ACTIVE) or (link_current_state = GET_ADDRESS) else '0'; +link_ok <= '1' when (link_current_state = ACTIVE) or (link_current_state = GET_ADDRESS) or (link_current_state = WAIT_FOR_BOOT) else '0'; WAIT_CTR_PROC : process(CLK) begin @@ -687,24 +629,24 @@ begin end if; end process WAIT_CTR_PROC; ---dhcp_start <= '1' when link_current_state = GET_ADDRESS else '0'; - ---LINK_DOWN_CTR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- link_down_ctr <= (others => '0'); --- link_down_ctr_lock <= '0'; --- elsif (PCS_AN_COMPLETE_IN = '1') then --- link_down_ctr_lock <= '0'; --- elsif ((PCS_AN_COMPLETE_IN = '0') and (link_down_ctr_lock = '0')) then --- link_down_ctr <= link_down_ctr + x"1"; --- link_down_ctr_lock <= '1'; --- end if; --- end if; ---end process LINK_DOWN_CTR_PROC; - -MC_LINK_OK_OUT <= link_ok; -- or nothing_sent; +dhcp_start <= '1' when link_current_state = GET_ADDRESS else '0'; + +LINK_DOWN_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + link_down_ctr <= (others => '0'); + link_down_ctr_lock <= '0'; + elsif (PCS_AN_COMPLETE_IN = '1') then + link_down_ctr_lock <= '0'; + elsif ((PCS_AN_COMPLETE_IN = '0') and (link_down_ctr_lock = '0')) then + link_down_ctr <= link_down_ctr + x"1"; + link_down_ctr_lock <= '1'; + end if; + end if; +end process LINK_DOWN_CTR_PROC; + +MC_LINK_OK_OUT <= link_ok or nothing_sent; -- END OF LINK STATE CONTROL --************* @@ -713,7 +655,7 @@ MC_LINK_OK_OUT <= link_ok; -- or nothing_sent; -- GENERATE MAC_ADDRESS g_MY_MAC <= unique_id(31 downto 8) & x"be0002"; ---g_MAX_FRAME_SIZE <= x"0578"; +g_MAX_FRAME_SIZE <= x"0578"; --g_MAX_PACKET_SIZE <= x"fa00" when g_SIMULATE = 0 else x"0600"; -- @@ -724,7 +666,7 @@ g_MY_MAC <= unique_id(31 downto 8) & x"be0002"; TSMAC_CONTROLLER : trb_net16_gbe_mac_control port map( - CLK => CLK, + CLK => CLK, RESET => RESET, -- signals to/from main controller @@ -744,21 +686,12 @@ port map( TSM_HREADY_N_IN => TSM_HREADY_N_IN, TSM_HDATA_EN_N_IN => TSM_HDATA_EN_N_IN, - DEBUG_OUT => open + DEBUG_OUT => mac_control_debug ); --DEBUG_OUT <= mac_control_debug; -process(CLK) -begin - if rising_edge(CLK) then - if link_current_state = INACTIVE and PCS_AN_COMPLETE_IN = '1' then - tsm_reconf <= '1'; - else - tsm_reconf <= '0'; - end if; - end if; -end process; ---tsm_reconf <= '1' when (link_current_state = INACTIVE) and (PCS_AN_COMPLETE_IN = '0') else '0'; + +tsm_reconf <= '1' when (link_current_state = INACTIVE) and (PCS_AN_COMPLETE_IN = '1') else '0'; TSM_HADDR_OUT <= tsm_haddr; TSM_HCS_N_OUT <= tsm_hcs_n; @@ -774,142 +707,142 @@ TSM_HWRITE_N_OUT <= tsm_hwrite_n; -- STATISTICS -- ***** --- ---CTRS_GEN : for n in 0 to 15 generate --- --- CTR_PROC : process(CLK) --- begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- arr(n) <= (others => '0'); --- elsif (rx_stat_en_q = '1' and rx_stat_vec_q(16 + n) = '1') then --- arr(n) <= arr(n) + x"1"; --- end if; --- end if; --- end process CTR_PROC; --- ---end generate CTRS_GEN; --- ---STAT_VEC_SYNC : signal_sync ---generic map ( --- WIDTH => 32, --- DEPTH => 2 ---) ---port map ( --- RESET => RESET, --- CLK0 => CLK, --- CLK1 => CLK, --- D_IN => TSM_RX_STAT_VEC_IN, --- D_OUT => rx_stat_vec_q ---); --- --- ---STAT_VEC_EN_SYNC : pulse_sync ---port map( --- CLK_A_IN => CLK_125, --- RESET_A_IN => RESET, --- PULSE_A_IN => TSM_RX_STAT_EN_IN, --- CLK_B_IN => CLK, --- RESET_B_IN => RESET, --- PULSE_B_OUT => rx_stat_en_q ---); --- --- ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, rx_stat_en_q, stats_ctr) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if (rx_stat_en_q = '1') then --- stats_next_state <= LOAD_VECTOR; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_VECTOR => --- --if (stat_ack = '1') then --- if (stats_ctr = 15) then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_VECTOR; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---STATS_CTR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') or (stats_current_state = IDLE) then --- stats_ctr <= 0; --- elsif (stats_current_state = LOAD_VECTOR and stat_ack ='1') then --- stats_ctr <= stats_ctr + 1; --- end if; --- end if; ---end process STATS_CTR_PROC; --- -----stat_data <= arr(stats_ctr); --- ---stat_addr <= x"0c" + std_logic_vector(to_unsigned(stats_ctr, 8)); --- ---stat_rdy <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; --- ---stat_data(7 downto 0) <= arr(stats_ctr)(31 downto 24); ---stat_data(15 downto 8) <= arr(stats_ctr)(23 downto 16); ---stat_data(23 downto 16) <= arr(stats_ctr)(15 downto 8); ---stat_data(31 downto 24) <= arr(stats_ctr)(7 downto 0); + +CTRS_GEN : for n in 0 to 15 generate + + CTR_PROC : process(CLK) + begin + if rising_edge(CLK) then + if (RESET = '1') then + arr(n) <= (others => '0'); + elsif (rx_stat_en_q = '1' and rx_stat_vec_q(16 + n) = '1') then + arr(n) <= arr(n) + x"1"; + end if; + end if; + end process CTR_PROC; + +end generate CTRS_GEN; + +STAT_VEC_SYNC : signal_sync +generic map ( + WIDTH => 32, + DEPTH => 2 +) +port map ( + RESET => RESET, + CLK0 => CLK, + CLK1 => CLK, + D_IN => TSM_RX_STAT_VEC_IN, + D_OUT => rx_stat_vec_q +); + + +STAT_VEC_EN_SYNC : pulse_sync +port map( + CLK_A_IN => CLK_125, + RESET_A_IN => RESET, + PULSE_A_IN => TSM_RX_STAT_EN_IN, + CLK_B_IN => CLK, + RESET_B_IN => RESET, + PULSE_B_OUT => rx_stat_en_q +); + + +STATS_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + stats_current_state <= IDLE; + else + stats_current_state <= stats_next_state; + end if; + end if; +end process STATS_MACHINE_PROC; + +STATS_MACHINE : process(stats_current_state, rx_stat_en_q, stats_ctr) +begin + + case (stats_current_state) is + + when IDLE => + if (rx_stat_en_q = '1') then + stats_next_state <= LOAD_VECTOR; + else + stats_next_state <= IDLE; + end if; + + when LOAD_VECTOR => + --if (stat_ack = '1') then + if (stats_ctr = 15) then + stats_next_state <= CLEANUP; + else + stats_next_state <= LOAD_VECTOR; + end if; + + when CLEANUP => + stats_next_state <= IDLE; + + end case; + +end process STATS_MACHINE; + +STATS_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (stats_current_state = IDLE) then + stats_ctr <= 0; + elsif (stats_current_state = LOAD_VECTOR and stat_ack ='1') then + stats_ctr <= stats_ctr + 1; + end if; + end if; +end process STATS_CTR_PROC; + +--stat_data <= arr(stats_ctr); + +stat_addr <= x"0c" + std_logic_vector(to_unsigned(stats_ctr, 8)); + +stat_rdy <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; + +stat_data(7 downto 0) <= arr(stats_ctr)(31 downto 24); +stat_data(15 downto 8) <= arr(stats_ctr)(23 downto 16); +stat_data(23 downto 16) <= arr(stats_ctr)(15 downto 8); +stat_data(31 downto 24) <= arr(stats_ctr)(7 downto 0); -- **** debug ---FRAME_WAITING_CTR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- frame_waiting_ctr <= (others => '0'); --- elsif (RC_FRAME_WAITING_IN = '1') then --- frame_waiting_ctr <= frame_waiting_ctr + x"1"; --- end if; --- end if; ---end process FRAME_WAITING_CTR_PROC; --- ---SAVE_VALUES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- ps_busy_q <= (others => '0'); --- rc_frame_proto_q <= (others => '0'); --- elsif (redirect_current_state = IDLE and RC_FRAME_WAITING_IN = '1') then --- ps_busy_q <= ps_busy; --- rc_frame_proto_q <= RC_FRAME_PROTO_IN; --- end if; --- end if; ---end process SAVE_VALUES_PROC; --- --- ---DEBUG_OUT(3 downto 0) <= link_state; ---DEBUG_OUT(7 downto 4) <= state; ---DEBUG_OUT(11 downto 8) <= redirect_state; ---DEBUG_OUT(15 downto 12) <= link_state; ---DEBUG_OUT(23 downto 16) <= frame_waiting_ctr(7 downto 0); ---DEBUG_OUT(27 downto 24) <= (others => '0'); --ps_busy_q; ---DEBUG_OUT(31 downto 28) <= (others => '0'); --rc_frame_proto_q; ---DEBUG_OUT(63 downto 32) <= dbg_ps(31 downto 0) or dbg_ps(63 downto 32); +FRAME_WAITING_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + frame_waiting_ctr <= (others => '0'); + elsif (RC_FRAME_WAITING_IN = '1') then + frame_waiting_ctr <= frame_waiting_ctr + x"1"; + end if; + end if; +end process FRAME_WAITING_CTR_PROC; + +SAVE_VALUES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + ps_busy_q <= (others => '0'); + rc_frame_proto_q <= (others => '0'); + elsif (redirect_current_state = IDLE and RC_FRAME_WAITING_IN = '1') then + ps_busy_q <= ps_busy; + rc_frame_proto_q <= RC_FRAME_PROTO_IN; + end if; + end if; +end process SAVE_VALUES_PROC; + + +DEBUG_OUT(3 downto 0) <= link_state; +DEBUG_OUT(7 downto 4) <= state; +DEBUG_OUT(11 downto 8) <= redirect_state; +DEBUG_OUT(15 downto 12) <= link_state; +DEBUG_OUT(23 downto 16) <= frame_waiting_ctr(7 downto 0); +DEBUG_OUT(27 downto 24) <= (others => '0'); --ps_busy_q; +DEBUG_OUT(31 downto 28) <= (others => '0'); --rc_frame_proto_q; +DEBUG_OUT(63 downto 32) <= dbg_ps(31 downto 0) or dbg_ps(63 downto 32); -- **** diff --git a/gbe2_ecp3/trb_net16_gbe_packet_constr.vhd b/gbe2_ecp3/trb_net16_gbe_packet_constr.vhd index b8b5920..e6ca1bc 100755 --- a/gbe2_ecp3/trb_net16_gbe_packet_constr.vhd +++ b/gbe2_ecp3/trb_net16_gbe_packet_constr.vhd @@ -1,1051 +1,1088 @@ -LIBRARY IEEE; -USE IEEE.std_logic_1164.ALL; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; -use IEEE.std_logic_arith.all; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; -use work.trb_net_gbe_components.all; - -entity trb_net16_gbe_packet_constr is -port( - RESET : in std_logic; - CLK : in std_logic; - MULT_EVT_ENABLE_IN : in std_logic; -- gk 06.10.10 - -- ports for user logic - PC_WR_EN_IN : in std_logic; -- write into queueConstr from userLogic - PC_DATA_IN : in std_logic_vector(7 downto 0); - PC_READY_OUT : out std_logic; - PC_START_OF_SUB_IN : in std_logic; - PC_END_OF_SUB_IN : in std_logic; -- gk 07.10.10 - PC_END_OF_DATA_IN : in std_logic; - PC_TRANSMIT_ON_OUT : out std_logic; - -- queue and subevent layer headers - PC_SUB_SIZE_IN : in std_logic_vector(31 downto 0); -- store and swap - PC_PADDING_IN : in std_logic; -- gk 29.03.10 - PC_DECODING_IN : in std_logic_vector(31 downto 0); -- swap - PC_EVENT_ID_IN : in std_logic_vector(31 downto 0); -- swap - PC_TRIG_NR_IN : in std_logic_vector(31 downto 0); -- store and swap! - PC_QUEUE_DEC_IN : in std_logic_vector(31 downto 0); -- swap - PC_MAX_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); -- DO NOT SWAP - PC_DELAY_IN : in std_logic_vector(31 downto 0); -- gk 28.04.10 - -- FrameConstructor ports - TC_WR_EN_OUT : out std_logic; - TC_DATA_OUT : out std_logic_vector(7 downto 0); - TC_H_READY_IN : in std_logic; - TC_READY_IN : in std_logic; - TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); - TC_SOD_OUT : out std_logic; - TC_EOD_OUT : out std_logic; - DEBUG_OUT : out std_logic_vector(63 downto 0) -); -end trb_net16_gbe_packet_constr; - -architecture trb_net16_gbe_packet_constr of trb_net16_gbe_packet_constr is - ---attribute HGROUP : string; ---attribute HGROUP of trb_net16_gbe_packet_constr : architecture is "GBE_GBE_group"; - -component fifo_64kx9 -port ( - Data : in std_logic_vector(8 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(8 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - --- FIFO for SubEventHeader information -component fifo_16kx8 is -port ( - Data : in std_logic_vector(7 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(7 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - -signal df_wr_en : std_logic; -signal df_rd_en : std_logic; -signal df_q : std_logic_vector(7 downto 0); -signal df_q_reg : std_logic_vector(7 downto 0); -signal df_empty : std_logic; -signal df_full : std_logic; - -signal fc_data : std_logic_vector(7 downto 0); -signal fc_wr_en : std_logic; -signal fc_sod : std_logic; -signal fc_eod : std_logic; -signal fc_ident : std_logic_vector(15 downto 0); -- change this to own counter! -signal fc_flags_offset : std_logic_vector(15 downto 0); - -signal shf_data : std_logic_vector(7 downto 0); -signal shf_wr_en : std_logic; -signal shf_rd_en : std_logic; -signal shf_q : std_logic_vector(7 downto 0); -signal shf_empty : std_logic; -signal shf_full : std_logic; - -type constructStates is (CIDLE, SAVE_DATA, WAIT_FOR_LOAD); -signal constructCurrentState, constructNextState : constructStates; -signal constr_state : std_logic_vector(3 downto 0); -signal all_int_ctr : integer range 0 to 31; -signal all_ctr : std_logic_vector(4 downto 0); - -type saveSubStates is (SIDLE, SAVE_SIZE, SAVE_DECODING, SAVE_ID, SAVE_TRIG_NR, SAVE_TERM); -signal saveSubCurrentState, saveSubNextState : saveSubStates; -signal save_state : std_logic_vector(3 downto 0); -signal sub_int_ctr : integer range 0 to 31; -signal sub_ctr : std_logic_vector(4 downto 0); -signal my_int_ctr : integer range 0 to 3; -signal my_ctr : std_logic_vector(1 downto 0); - -type loadStates is (LIDLE, WAIT_FOR_FC, PUT_Q_LEN, PUT_Q_DEC, LOAD_SUB, PREP_DATA, LOAD_DATA, DIVIDE, LOAD_TERM, CLEANUP, DELAY); -signal loadCurrentState, loadNextState: loadStates; -signal load_state : std_logic_vector(3 downto 0); - -signal queue_size : std_logic_vector(31 downto 0); -- sum of all subevents sizes plus their headers and queue headers and termination -signal queue_size_temp : std_logic_vector(31 downto 0); -signal actual_queue_size : std_logic_vector(31 downto 0); -- queue size used during loading process when queue_size is no more valid -signal bytes_loaded : std_logic_vector(15 downto 0); -- size of actual constructing frame -signal sub_size_to_save : std_logic_vector(31 downto 0); -- size of subevent to save to shf -signal sub_size_loaded : std_logic_vector(31 downto 0); -- size of subevent actually being transmitted -signal sub_bytes_loaded : std_logic_vector(31 downto 0); -- amount of bytes of actual subevent sent -signal actual_packet_size : std_logic_vector(15 downto 0); -- actual size of whole udp packet -signal size_left : std_logic_vector(31 downto 0); -signal fc_ip_size : std_logic_vector(15 downto 0); -signal fc_udp_size : std_logic_vector(15 downto 0); -signal max_frame_size : std_logic_vector(15 downto 0); -signal divide_position : std_logic_vector(1 downto 0); -- 00->data, 01->sub, 11->term -signal debug : std_logic_vector(63 downto 0); -signal pc_ready : std_logic; - -signal pc_sub_size : std_logic_vector(31 downto 0); -signal pc_trig_nr : std_logic_vector(31 downto 0); -signal rst_after_sub_comb : std_logic; -- gk 08.04.10 -signal rst_after_sub : std_logic; -- gk 08.04.10 -signal load_int_ctr : integer range 0 to 3; -- gk 08.04.10 -signal delay_ctr : std_logic_vector(31 downto 0); -- gk 28.04.10 -signal ticks_ctr : std_logic_vector(7 downto 0); -- gk 28.04.10 - --- gk 26.07.10 -signal load_eod : std_logic; -signal load_eod_q : std_logic; - --- gk 07.10.10 -signal df_eod : std_logic; - --- gk 04.12.10 -signal first_sub_in_multi : std_logic; -signal from_divide_state : std_logic; -signal disable_prep : std_logic; - -begin - - -PC_TRANSMIT_ON_OUT <= '1' when constructCurrentState = WAIT_FOR_LOAD else '0'; - -my_int_ctr <= (3 - to_integer(to_unsigned(sub_int_ctr, 2))); -- reverse byte order -load_int_ctr <= (3 - to_integer(to_unsigned(all_int_ctr, 2))); -- gk 08.04.10 - -all_ctr <= std_logic_vector(to_unsigned(all_int_ctr, all_ctr'length)); -- for debugging -sub_ctr <= std_logic_vector(to_unsigned(sub_int_ctr, sub_ctr'length)); -- for debugging -my_ctr <= std_logic_vector(to_unsigned(my_int_ctr, my_ctr'length)); -- for debugging - -max_frame_size <= PC_MAX_FRAME_SIZE_IN; - --- Ready signal for PacketConstructor -pc_ready <= '1' when (constructCurrentState = CIDLE) and (df_empty = '1') else '0'; - --- store event information on Start_of_Subevent -THE_EVT_INFO_STORE_PROC: process( CLK ) -begin - if( rising_edge(CLK) ) then - if (RESET = '1') then -- gk 31.05.10 - pc_sub_size <= (others => '0'); - pc_trig_nr <= (others => '0'); - elsif( PC_START_OF_SUB_IN = '1' ) then - pc_sub_size <= PC_SUB_SIZE_IN; - pc_trig_nr <= PC_TRIG_NR_IN; - end if; - end if; -end process; - --- gk 07.10.10 -df_eod <= '1' when ((MULT_EVT_ENABLE_IN = '0') and (PC_END_OF_DATA_IN = '1')) - or ((MULT_EVT_ENABLE_IN = '1') and (PC_END_OF_SUB_IN = '1')) - else '0'; - --- Data FIFO for incoming packet data from IPU buffer --- gk 26.07.10 -DATA_FIFO : fifo_64kx9 -port map( - Data(7 downto 0) => PC_DATA_IN, - Data(8) => df_eod, --PC_END_OF_DATA_IN, -- gk 07.10.10 - WrClock => CLK, - RdClock => CLK, - WrEn => df_wr_en, - RdEn => df_rd_en, - Reset => RESET, - RPReset => RESET, - Q(7 downto 0) => df_q, - Q(8) => load_eod, - Empty => df_empty, - Full => df_full -); - -LOAD_EOD_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - load_eod_q <= '0'; - else - load_eod_q <= load_eod; - end if; - end if; -end process LOAD_EOD_PROC; - --- Write enable for the data FIFO --- !!!combinatorial signal!!! --- could be avoided as IPU2GBE does only send data in case of PC_READY. -df_wr_en <= '1' when ((PC_WR_EN_IN = '1') and (constructCurrentState /= WAIT_FOR_LOAD)) - else '0'; - --- Output register for data FIFO -dfQProc : process(CLK) -begin - if rising_edge(CLK) then - df_q_reg <= df_q; - end if; -end process dfQProc; - --- Construction state machine -constructMachineProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - constructCurrentState <= CIDLE; - else - constructCurrentState <= constructNextState; - end if; - end if; -end process constructMachineProc; - -constructMachine : process(constructCurrentState, PC_START_OF_SUB_IN, PC_WR_EN_IN, PC_END_OF_DATA_IN, loadCurrentState, saveSubCurrentState, sub_int_ctr) -begin - case constructCurrentState is - when CIDLE => - constr_state <= x"0"; - --if( PC_WR_EN_IN = '1' ) then - -- gk 04.12.10 - if (PC_START_OF_SUB_IN = '1') then - - constructNextState <= SAVE_DATA; - else - constructNextState <= CIDLE; - end if; - when SAVE_DATA => - constr_state <= x"1"; - if( PC_END_OF_DATA_IN = '1') then - constructNextState <= WAIT_FOR_LOAD; - else - constructNextState <= SAVE_DATA; - end if; - when WAIT_FOR_LOAD => - constr_state <= x"2"; - if( (df_empty = '1') and (loadCurrentState = LIDLE) ) then -- waits until the whole packet is transmitted - constructNextState <= CIDLE; - else - constructNextState <= WAIT_FOR_LOAD; - end if; - when others => - constr_state <= x"f"; - constructNextState <= CIDLE; - end case; -end process constructMachine; - ---*********************** --- SIZE COUNTERS FOR SAVING SIDE ---*********************** - --- gk 29.03.10 the subevent size saved to its headers cannot contain padding bytes but they are included in pc_sub_size --- that's why they are removed if pc_padding flag is asserted -sub_size_to_save <= (x"10" + pc_sub_size) when (PC_PADDING_IN = '0') - else (x"c" + pc_sub_size); -- subevent headers + data - --- BUG HERE BUG HERE BUG HERE BUG HERE --- gk 29.03.10 no changes here because the queue size should contain the padding bytes of subevents -queueSizeProc : process(CLK) -begin - if rising_edge(CLK) then - --if (RESET = '1') or (loadCurrentState = PUT_Q_DEC) then -- gk 07.10.10 -- (loadCurrentState = CLEANUP) then - if (RESET = '1') or (loadCurrentState = CLEANUP) then - queue_size <= x"00000028"; -- + 8B for queue headers and 32B for termination - elsif (saveSubCurrentState = SAVE_SIZE) and (sub_int_ctr = 3) then - queue_size <= queue_size + pc_sub_size + x"10"; -- + 16B for each subevent headers - end if; - end if; -end process queueSizeProc; - - ---*********************** --- LOAD DATA COMBINED WITH HEADERS INTO FC, QUEUE TRANSMISSION ---*********************** - -loadMachineProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - loadCurrentState <= LIDLE; - else - loadCurrentState <= loadNextState; - end if; - end if; -end process loadMachineProc; - -loadMachine : process(loadCurrentState, constructCurrentState, all_int_ctr, df_empty, - sub_bytes_loaded, sub_size_loaded, size_left, TC_H_READY_IN, - max_frame_size, bytes_loaded, divide_position, PC_DELAY_IN, - delay_ctr, load_eod_q, MULT_EVT_ENABLE_IN) -begin - case loadCurrentState is - when LIDLE => - load_state <= x"0"; - if ((constructCurrentState = WAIT_FOR_LOAD) and (df_empty = '0')) then - loadNextState <= WAIT_FOR_FC; - else - loadNextState <= LIDLE; - end if; - when WAIT_FOR_FC => - load_state <= x"1"; - if (TC_H_READY_IN = '1') then - loadNextState <= PUT_Q_LEN; - else - loadNextState <= WAIT_FOR_FC; - end if; - when PUT_Q_LEN => - load_state <= x"2"; - if (all_int_ctr = 3) then - loadNextState <= PUT_Q_DEC; - else - loadNextState <= PUT_Q_LEN; - end if; - when PUT_Q_DEC => - load_state <= x"3"; - if (all_int_ctr = 3) then - loadNextState <= LOAD_SUB; - else - loadNextState <= PUT_Q_DEC; - end if; - when LOAD_SUB => - load_state <= x"4"; - if (bytes_loaded = max_frame_size - 1) then - loadNextState <= DIVIDE; - elsif (all_int_ctr = 15) then - loadNextState <= PREP_DATA; - else - loadNextState <= LOAD_SUB; - end if; - when PREP_DATA => - load_state <= x"5"; - loadNextState <= LOAD_DATA; - when LOAD_DATA => - load_state <= x"6"; --- if (bytes_loaded = max_frame_size - 1) then --- loadNextState <= DIVIDE; --- -- gk 07.10.10 --- elsif (MULT_EVT_ENABLE_IN = '1') then --- if (size_left = x"0000_0023") then --- loadNextState <= LOAD_TERM; --- elsif (load_eod_q = '1') then --- loadNextState <= LOAD_SUB; --- else --- loadNextState <= LOAD_DATA; --- end if; --- else --- if (load_eod_q = '1') then --- loadNextState <= LOAD_TERM; --- else --- loadNextState <= LOAD_DATA; --- end if; --- end if; - if (bytes_loaded = max_frame_size - 1) then - loadNextState <= DIVIDE; - -- gk 07.10.10 - elsif (load_eod_q = '1') then - if (MULT_EVT_ENABLE_IN = '1') then - if (size_left < x"0000_0030") then - loadNextState <= LOAD_TERM; - else - loadNextState <= LOAD_SUB; - end if; - else - loadNextState <= LOAD_TERM; - end if; - else - loadNextState <= LOAD_DATA; - end if; - when DIVIDE => - load_state <= x"7"; - if (TC_H_READY_IN = '1') then - if (divide_position = "00") then - loadNextState <= PREP_DATA; - elsif (divide_position = "01") then - loadNextState <= LOAD_SUB; - else - loadNextState <= LOAD_TERM; - end if; - else - loadNextState <= DIVIDE; - end if; - when LOAD_TERM => - load_state <= x"8"; - if (bytes_loaded = max_frame_size - 1) and (all_int_ctr /= 31) then - loadNextState <= DIVIDE; - elsif (all_int_ctr = 31) then - loadNextState <= CLEANUP; - else - loadNextState <= LOAD_TERM; - end if; - -- gk 28.04.10 - when CLEANUP => - load_state <= x"9"; - if (PC_DELAY_IN = x"0000_0000") then - loadNextState <= LIDLE; - else - loadNextState <= DELAY; - end if; - -- gk 28.04.10 - when DELAY => - load_state <= x"a"; - if (delay_ctr = x"0000_0000") then - loadNextState <= LIDLE; - else - loadNextState <= DELAY; - end if; - when others => - load_state <= x"f"; - loadNextState <= LIDLE; - end case; -end process loadMachine; - --- gk 04.12.10 -firstSubInMultiProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LOAD_TERM) then - first_sub_in_multi <= '1'; - elsif (loadCurrentState = LOAD_DATA) then - first_sub_in_multi <= '0'; - end if; - end if; -end process; - --- gk 04.12.10 -fromDivideStateProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - from_divide_state <= '0'; - elsif (loadCurrentState = DIVIDE) then - from_divide_state <= '1'; - elsif (loadCurrentState = PREP_DATA) then - from_divide_state <= '0'; - end if; - end if; -end process fromDivideStateProc; - - -dividePositionProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - divide_position <= "00"; - elsif (bytes_loaded = max_frame_size - 1) then - if (loadCurrentState = LIDLE) then - divide_position <= "00"; - disable_prep <= '0'; -- gk 05.12.10 - elsif (loadCurrentState = LOAD_DATA) then - -- gk 05.12.10 - -- gk 26.07.10 - if (MULT_EVT_ENABLE_IN = '0') and (load_eod_q = '1') then -- if termination is about to be loaded divide on term - divide_position <= "11"; - disable_prep <= '0'; -- gk 05.12.10 - elsif (MULT_EVT_ENABLE_IN = '1') and (load_eod_q = '1') then - if (size_left > x"0000_0028") then - divide_position <= "01"; - disable_prep <= '0'; -- gk 05.12.10 - else - divide_position <= "11"; - disable_prep <= '0'; -- gk 05.12.10 - end if; - else - divide_position <= "00"; -- still data loaded divide on data - disable_prep <= '1'; -- gk 05.12.10 - end if; - elsif (loadCurrentState = LOAD_SUB) then - if (all_int_ctr = 15) then - divide_position <= "00"; - disable_prep <= '1'; -- gk 05.12.10 - else - divide_position <= "01"; - disable_prep <= '0'; -- gk 05.12.10 - end if; - elsif (loadCurrentState = LOAD_TERM) then - divide_position <= "11"; - disable_prep <= '0'; -- gk 05.12.10 - end if; - elsif (loadCurrentState = PREP_DATA) then -- gk 06.12.10 reset disable_prep - disable_prep <= '0'; - end if; - - end if; -end process dividePositionProc; - -allIntCtrProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then -- gk 31.05.10 - all_int_ctr <= 0; - else - case loadCurrentState is - - when LIDLE => all_int_ctr <= 0; - - when WAIT_FOR_FC => all_int_ctr <= 0; - - when PUT_Q_LEN => - if (all_int_ctr = 3) then - all_int_ctr <= 0; - else - all_int_ctr <= all_int_ctr + 1; - end if; - - when PUT_Q_DEC => - if (all_int_ctr = 3) then - all_int_ctr <= 0; - else - all_int_ctr <= all_int_ctr + 1; - end if; - - when LOAD_SUB => - if (all_int_ctr = 15) then - all_int_ctr <= 0; - else - all_int_ctr <= all_int_ctr + 1; - end if; - - when LOAD_DATA => all_int_ctr <= 0; - - when LOAD_TERM => - if (all_int_ctr = 31) then - all_int_ctr <= 0; - else - all_int_ctr <= all_int_ctr + 1; - end if; - - when DIVIDE => null; - - when CLEANUP => all_int_ctr <= 0; - - when PREP_DATA => all_int_ctr <= 0; - - when DELAY => all_int_ctr <= 0; - end case; - end if; - end if; -end process allIntCtrProc; - -dfRdEnProc : process(loadCurrentState, bytes_loaded, max_frame_size, sub_bytes_loaded, - sub_size_loaded, all_int_ctr, RESET, size_left, load_eod_q) -begin - if (RESET = '1') then - df_rd_en <= '0'; - elsif (loadCurrentState = LOAD_DATA) then --- if (bytes_loaded = max_frame_size - x"1") then --- df_rd_en <= '0'; --- -- gk 07.10.10 --- elsif (MULT_EVT_ENABLE_IN = '0') and (load_eod_q = '1') then --- df_rd_en <= '0'; --- -- gk 07.10.10 --- elsif (MULT_EVT_ENABLE_IN = '1') and (size_left = x"0000_003a") then --- df_rd_en <= '0'; --- else --- df_rd_en <= '1'; --- end if; - if (bytes_loaded = max_frame_size - x"1") then - df_rd_en <= '0'; - -- gk 26.07.10 - --elsif (load_eod = '1') or (load_eod_q = '1') then - elsif (load_eod_q = '1') then - df_rd_en <= '0'; --- elsif (sub_bytes_loaded = sub_size_loaded) then --- df_rd_en <= '0'; - else - df_rd_en <= '1'; - end if; - - elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr = 15) and (bytes_loaded /= max_frame_size - x"1") then - df_rd_en <= '1'; - elsif (loadCurrentState = PREP_DATA) then - df_rd_en <= '1'; - else - df_rd_en <= '0'; - end if; -end process dfRdEnProc; - -shfRdEnProc : process(loadCurrentState, all_int_ctr, RESET) -begin - if (RESET = '1') then -- gk 31.05.10 - shf_rd_en <= '0'; - elsif (loadCurrentState = LOAD_SUB) then - shf_rd_en <= '1'; - elsif (loadCurrentState = LOAD_TERM) and (all_int_ctr < 31) then - shf_rd_en <= '1'; - elsif (loadCurrentState = PUT_Q_DEC) and (all_int_ctr = 3) then - shf_rd_en <= '1'; - else - shf_rd_en <= '0'; - end if; -end process shfRdEnProc; - - -fcWrEnProc : process(loadCurrentState, RESET, first_sub_in_multi, from_divide_state, MULT_EVT_ENABLE_IN, divide_position, disable_prep) -begin - if (RESET = '1') then -- gk 31.05.10 - fc_wr_en <= '0'; - elsif (loadCurrentState = PUT_Q_LEN) or (loadCurrentState = PUT_Q_DEC) then - fc_wr_en <= '1'; - elsif (loadCurrentState = LOAD_SUB) or (loadCurrentState = LOAD_DATA) or (loadCurrentState = LOAD_TERM) then - fc_wr_en <= '1'; - -- gk 04.12.10 - elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') and (disable_prep = '0') then - fc_wr_en <= '1'; - elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (from_divide_state = '1') and ((divide_position = "00") or (divide_position = "01")) and (disable_prep = '0') then - fc_wr_en <= '1'; - else - fc_wr_en <= '0'; - end if; -end process fcWrEnProc; - - --- was all_int_ctr -fcDataProc : process(loadCurrentState, queue_size_temp, PC_QUEUE_DEC_IN, shf_q, df_q_reg, load_int_ctr) -begin - case loadCurrentState is - when LIDLE => fc_data <= x"af"; - when WAIT_FOR_FC => fc_data <= x"bf"; - -- gk 08.04.10 my_int_ctr changed to load_int_ctr - when PUT_Q_LEN => fc_data <= queue_size_temp(load_int_ctr * 8 + 7 downto load_int_ctr * 8); - when PUT_Q_DEC => fc_data <= PC_QUEUE_DEC_IN(load_int_ctr * 8 + 7 downto load_int_ctr * 8); - when LOAD_SUB => fc_data <= shf_q; - when PREP_DATA => fc_data <= df_q_reg; - when LOAD_DATA => fc_data <= df_q_reg; - when LOAD_TERM => fc_data <= shf_q; - when DIVIDE => fc_data <= x"cf"; - when CLEANUP => fc_data <= x"df"; - when others => fc_data <= x"00"; - end case; -end process fcDataProc; - --- delay counters --- gk 28.04.10 -DELAY_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if ((RESET = '1') or (loadCurrentState = LIDLE)) then - delay_ctr <= PC_DELAY_IN; - elsif ((loadCurrentState = DELAY) and (ticks_ctr(7) = '1')) then - delay_ctr <= delay_ctr - x"1"; - end if; - end if; -end process DELAY_CTR_PROC; - --- gk 28.04.10 -TICKS_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if ((RESET = '1') or (loadCurrentState = LIDLE) or (ticks_ctr(7) = '1')) then - ticks_ctr <= x"00"; - elsif (loadCurrentState = DELAY) then - ticks_ctr <= ticks_ctr + x"1"; - end if; - end if; -end process TICKS_CTR_PROC; - - ---*********************** --- SIZE COUNTERS FOR LOADING SIDE ---*********************** - -queue_size_temp <= queue_size - x"20"; -- size of data without termination - --- gk 08.04.10 -rst_after_sub_comb <= '1' when (loadCurrentState = LIDLE) or - ((loadCurrentState = LOAD_DATA) and (size_left /= x"00000021")) -- gk 26.07.10 -- and (sub_bytes_loaded = sub_size_loaded) - else '0'; - --- gk 08.04.10 -RST_AFTER_SUB_PROC : process(CLK) -begin - if(rising_edge(CLK)) then - if(RESET = '1') then - rst_after_sub <= '0'; - else - rst_after_sub <= rst_after_sub_comb; - end if; - end if; -end process RST_AFTER_SUB_PROC; - --- counts all bytes loaded to divide data into frames -bytesLoadedProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = DIVIDE) or (loadCurrentState = CLEANUP) then - bytes_loaded <= x"0000"; - elsif (loadCurrentState = PUT_Q_LEN) or (loadCurrentState = PUT_Q_DEC) or (loadCurrentState = LOAD_DATA) or (loadCurrentState = LOAD_SUB) or (loadCurrentState = LOAD_TERM) then - bytes_loaded <= bytes_loaded + x"1"; - -- gk 05.12.10 --- elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') then --- bytes_loaded <= bytes_loaded + x"1"; - elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') and (disable_prep = '0') then - bytes_loaded <= bytes_loaded + x"1"; - elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (from_divide_state = '1') and ((divide_position = "00") or (divide_position = "01")) and (disable_prep = '0') then - bytes_loaded <= bytes_loaded + x"1"; - end if; - end if; -end process bytesLoadedProc; - --- size of subevent loaded from memory -subSizeLoadedProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then -- gk 08.04.10 - sub_size_loaded <= x"00000000"; - elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr < 4) then - -- was all_int_ctr - -- gk 08.04.10 my_int_ctr changed to load_int_ctr - sub_size_loaded(7 + load_int_ctr * 8 downto load_int_ctr * 8) <= shf_q; - -- gk 29.03.10 here the padding bytes have to be added to the loadedSize in order to load the correct amount of bytes from fifo - elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr = 5) and (sub_size_loaded(2) = '1') then - sub_size_loaded <= sub_size_loaded + x"4"; - end if; - end if; -end process subSizeLoadedProc; - --- counts only raw data bytes being loaded -subBytesLoadedProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then -- gk 26.07.10 --or (sub_bytes_loaded = sub_size_loaded) -- gk 08.04.10 - sub_bytes_loaded <= x"00000011"; -- subevent headers doesnt count - elsif (loadCurrentState = LOAD_DATA) then - sub_bytes_loaded <= sub_bytes_loaded + x"1"; - end if; - end if; -end process subBytesLoadedProc; - --- counts the size of the large udp packet -actualPacketProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then - actual_packet_size <= x"0008"; - elsif (fc_wr_en = '1') then - actual_packet_size <= actual_packet_size + x"1"; - end if; - end if; -end process actualPacketProc; - -actualQueueSizeProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = CLEANUP) then - actual_queue_size <= (others => '0'); - elsif (loadCurrentState = LIDLE) then - actual_queue_size <= queue_size; - end if; - end if; -end process actualQueueSizeProc; - --- amount of bytes left to send in current packet -sizeLeftProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = CLEANUP) then - size_left <= (others => '0'); - elsif (loadCurrentState = LIDLE) then - size_left <= queue_size; - elsif (fc_wr_en = '1') then - size_left <= size_left - 1; - end if; - end if; -end process sizeLeftProc; - --- HOT FIX: don't rely on CTS information, count the packets on your own. --- In this case, we increment the fragmented packet ID with EOD from ipu2gbe. -THE_FC_IDENT_COUNTER_PROC: process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - fc_ident <= (others => '0'); - elsif (PC_END_OF_DATA_IN = '1') then - fc_ident <= fc_ident + 1; - end if; - end if; -end process THE_FC_IDENT_COUNTER_PROC; - -fc_flags_offset(15 downto 14) <= "00"; - -moreFragmentsProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then - fc_flags_offset(13) <= '0'; - elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) or ((loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1')) then - if ((actual_queue_size - actual_packet_size) < max_frame_size) then - fc_flags_offset(13) <= '0'; -- no more fragments - else - fc_flags_offset(13) <= '1'; -- more fragments - end if; - end if; - end if; -end process moreFragmentsProc; - -eodProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - fc_eod <= '0'; - elsif (loadCurrentState = LOAD_DATA) and (bytes_loaded = max_frame_size - 2) then - fc_eod <= '1'; - elsif (loadCurrentState = LOAD_SUB) and (bytes_loaded = max_frame_size - 2) then - fc_eod <= '1'; - elsif (loadCurrentState = LOAD_TERM) and ((bytes_loaded = max_frame_size - 2) or (all_int_ctr = 30)) then - fc_eod <= '1'; - else - fc_eod <= '0'; - end if; - end if; -end process eodProc; - -sodProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - fc_sod <= '0'; - elsif (loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1') then - fc_sod <= '1'; - elsif (loadCurrentState = DIVIDE) and (TC_READY_IN = '1') then - fc_sod <= '1'; - else - fc_sod <= '0'; - end if; - end if; -end process sodProc; - -offsetProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then - fc_flags_offset(12 downto 0) <= (others => '0'); - elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) then - fc_flags_offset(12 downto 0) <= actual_packet_size(15 downto 3); - end if; - end if; -end process offsetProc; - -fcIPSizeProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET= '1') then - fc_ip_size <= (others => '0'); - elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) or ((loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1')) then - if (size_left >= max_frame_size) then - fc_ip_size <= max_frame_size; - else - fc_ip_size <= size_left(15 downto 0); - end if; - end if; - end if; -end process fcIPSizeProc; - -fcUDPSizeProc : process(CLK) - begin - if rising_edge(CLK) then - if (RESET = '1') then - fc_udp_size <= (others => '0'); - elsif (loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1') then - fc_udp_size <= queue_size(15 downto 0); - end if; - end if; -end process fcUDPSizeProc; - - ---*********************** --- SUBEVENT HEADERS WRITE AND READ ---*********************** - -SUBEVENT_HEADERS_FIFO : fifo_4kx8_ecp3 --fifo_16kx8 -port map( - Data => shf_data, - WrClock => CLK, - RdClock => CLK, - WrEn => shf_wr_en, - RdEn => shf_rd_en, - Reset => RESET, - RPReset => RESET, - Q => shf_q, - Empty => shf_empty, - Full => shf_full -); - --- write enable for SHF -shf_wr_en <= '1' when ((saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA)) - else '0'; - --- data multiplexing for SHF (convert 32bit LWs to 8bit) --- CHANGED. --- The SubEventHeader (4x 32bit is stored in [MSB:LSB] now, same byte order as data from PC. -shfDataProc : process(saveSubCurrentState, sub_size_to_save, PC_DECODING_IN, PC_EVENT_ID_IN, - pc_trig_nr, my_int_ctr, fc_data) -begin - case saveSubCurrentState is - when SIDLE => shf_data <= x"ac"; - when SAVE_SIZE => shf_data <= sub_size_to_save(my_int_ctr * 8 + 7 downto my_int_ctr * 8); - when SAVE_DECODING => shf_data <= PC_DECODING_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8); - when SAVE_ID => shf_data <= PC_EVENT_ID_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8); - when SAVE_TRIG_NR => shf_data <= pc_trig_nr(my_int_ctr * 8 + 7 downto my_int_ctr * 8); - when SAVE_TERM => shf_data <= fc_data; - when others => shf_data <= x"00"; - end case; -end process shfDataProc; - -saveSubMachineProc : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - saveSubCurrentState <= SIDLE; - else - saveSubCurrentState <= saveSubNextState; - end if; - end if; -end process saveSubMachineProc; - -saveSubMachine : process(saveSubCurrentState, PC_START_OF_SUB_IN, sub_int_ctr, loadCurrentState, TC_H_READY_IN) -begin - case saveSubCurrentState is - when SIDLE => - save_state <= x"0"; - if (PC_START_OF_SUB_IN = '1') then - saveSubNextState <= SAVE_SIZE; - -- this branch is dangerous! - elsif (loadCurrentState = WAIT_FOR_FC) and (TC_H_READY_IN = '1') then -- means that loadCurrentState is put_q_len - saveSubNextState <= SAVE_TERM; - else - saveSubNextState <= SIDLE; - end if; - when SAVE_SIZE => - save_state <= x"1"; - if (sub_int_ctr = 3) then - saveSubNextState <= SAVE_DECODING; - else - saveSubNextState <= SAVE_SIZE; - end if; - when SAVE_DECODING => - save_state <= x"2"; - if (sub_int_ctr = 3) then - saveSubNextState <= SAVE_ID; - else - saveSubNextState <= SAVE_DECODING; - end if; - when SAVE_ID => - save_state <= x"3"; - if (sub_int_ctr = 3) then - saveSubNextState <= SAVE_TRIG_NR; - else - saveSubNextState <= SAVE_ID; - end if; - when SAVE_TRIG_NR => - save_state <= x"4"; - if (sub_int_ctr = 3) then - saveSubNextState <= SIDLE; - else - saveSubNextState <= SAVE_TRIG_NR; - end if; - when SAVE_TERM => - save_state <= x"5"; - if (sub_int_ctr = 31) then - saveSubNextState <= SIDLE; - else - saveSubNextState <= SAVE_TERM; - end if; - when others => - save_state <= x"f"; - saveSubNextState <= SIDLE; - end case; -end process; - --- This counter is used for breaking down 32bit information words into 8bit bytes for --- storing them in the SHF. --- It is also used for the termination 32byte sequence. -subIntProc: process( CLK ) -begin - if rising_edge(CLK) then - if (RESET = '1') or (saveSubCurrentState = SIDLE) then - sub_int_ctr <= 0; - elsif (sub_int_ctr = 3) and (saveSubCurrentState /= SAVE_TERM) then - sub_int_ctr <= 0; - elsif (sub_int_ctr = 31) and (saveSubCurrentState = SAVE_TERM) then - sub_int_ctr <= 0; - elsif (saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA) then - sub_int_ctr <= sub_int_ctr + 1; - end if; - end if; -end process subIntProc; - ---debug(3 downto 0) <= constr_state; ---debug(7 downto 4) <= save_state; ---debug(11 downto 8) <= load_state; ---debug(27 downto 12) <= queue_size(15 downto 0); ---debug(28) <= df_full; ---debug(29) <= df_empty; ---debug(30) <= shf_full; ---debug(31) <= shf_empty; --- ---debug(47 downto 32) <= size_left(15 downto 0); ---debug(52 downto 48) <= all_ctr; ---debug(53) <= pc_ready; - --- outputs -PC_READY_OUT <= pc_ready; -TC_WR_EN_OUT <= fc_wr_en; -TC_DATA_OUT <= fc_data; -TC_IP_SIZE_OUT <= fc_ip_size; -TC_UDP_SIZE_OUT <= fc_udp_size; --- FC_IDENT_OUT(15 downto 8) <= fc_ident(7 downto 0); --- FC_IDENT_OUT(7 downto 0) <= fc_ident(15 downto 8); -TC_FLAGS_OFFSET_OUT <= fc_flags_offset; -TC_SOD_OUT <= fc_sod; -TC_EOD_OUT <= fc_eod; - -DEBUG_OUT <= debug; - +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; +USE IEEE.std_logic_UNSIGNED.ALL; +use IEEE.std_logic_arith.all; + +library work; +use work.trb_net_std.all; +use work.trb_net_components.all; +use work.trb_net16_hub_func.all; + +entity trb_net16_gbe_packet_constr is +port( + RESET : in std_logic; + CLK : in std_logic; + MULT_EVT_ENABLE_IN : in std_logic; -- gk 06.10.10 + -- ports for user logic + PC_WR_EN_IN : in std_logic; -- write into queueConstr from userLogic + PC_DATA_IN : in std_logic_vector(7 downto 0); + PC_READY_OUT : out std_logic; + PC_START_OF_SUB_IN : in std_logic; + PC_END_OF_SUB_IN : in std_logic; -- gk 07.10.10 + PC_END_OF_DATA_IN : in std_logic; + PC_TRANSMIT_ON_OUT : out std_logic; + -- queue and subevent layer headers + PC_SUB_SIZE_IN : in std_logic_vector(31 downto 0); -- store and swap + PC_PADDING_IN : in std_logic; -- gk 29.03.10 + PC_DECODING_IN : in std_logic_vector(31 downto 0); -- swap + PC_EVENT_ID_IN : in std_logic_vector(31 downto 0); -- swap + PC_TRIG_NR_IN : in std_logic_vector(31 downto 0); -- store and swap! + PC_QUEUE_DEC_IN : in std_logic_vector(31 downto 0); -- swap + PC_MAX_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); -- DO NOT SWAP + PC_DELAY_IN : in std_logic_vector(31 downto 0); -- gk 28.04.10 + -- FrameConstructor ports + TC_WR_EN_OUT : out std_logic; + TC_DATA_OUT : out std_logic_vector(7 downto 0); + TC_H_READY_IN : in std_logic; + TC_READY_IN : in std_logic; + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_SOD_OUT : out std_logic; + TC_EOD_OUT : out std_logic; + DEBUG_OUT : out std_logic_vector(63 downto 0) +); +end trb_net16_gbe_packet_constr; + +architecture trb_net16_gbe_packet_constr of trb_net16_gbe_packet_constr is + +--attribute HGROUP : string; +--attribute HGROUP of trb_net16_gbe_packet_constr : architecture is "GBE_GBE_group"; + +component fifo_64kx9 +port ( + Data : in std_logic_vector(8 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(8 downto 0); + Empty : out std_logic; + Full : out std_logic +); +end component; + +-- FIFO for SubEventHeader information +component fifo_16kx8 is +port ( + Data : in std_logic_vector(7 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(7 downto 0); + Empty : out std_logic; + Full : out std_logic +); +end component; + +signal df_wr_en : std_logic; +signal df_rd_en : std_logic; +signal df_q : std_logic_vector(7 downto 0); +signal df_q_reg : std_logic_vector(7 downto 0); +signal df_empty : std_logic; +signal df_full : std_logic; + +signal fc_data : std_logic_vector(7 downto 0); +signal fc_wr_en : std_logic; +signal fc_sod : std_logic; +signal fc_eod : std_logic; +signal fc_ident : std_logic_vector(15 downto 0); -- change this to own counter! +signal fc_flags_offset : std_logic_vector(15 downto 0); + +signal shf_data : std_logic_vector(7 downto 0); +signal shf_wr_en : std_logic; +signal shf_rd_en : std_logic; +signal shf_q : std_logic_vector(7 downto 0); +signal shf_empty : std_logic; +signal shf_full : std_logic; + +type constructStates is (CIDLE, SAVE_DATA, WAIT_FOR_LOAD); +signal constructCurrentState, constructNextState : constructStates; +signal constr_state : std_logic_vector(3 downto 0); +signal all_int_ctr : integer range 0 to 31; +signal all_ctr : std_logic_vector(4 downto 0); + +type saveSubStates is (SIDLE, SAVE_SIZE, SAVE_DECODING, SAVE_ID, SAVE_TRIG_NR, SAVE_TERM); +signal saveSubCurrentState, saveSubNextState : saveSubStates; +signal save_state : std_logic_vector(3 downto 0); +signal sub_int_ctr : integer range 0 to 31; +signal sub_ctr : std_logic_vector(4 downto 0); +signal my_int_ctr : integer range 0 to 3; +signal my_ctr : std_logic_vector(1 downto 0); + +type loadStates is (LIDLE, WAIT_FOR_FC, PUT_Q_LEN, PUT_Q_DEC, LOAD_SUB, PREP_DATA, LOAD_DATA, DIVIDE, LOAD_TERM, CLEANUP, DELAY); +signal loadCurrentState, loadNextState: loadStates; +signal load_state : std_logic_vector(3 downto 0); + +signal queue_size : std_logic_vector(31 downto 0); -- sum of all subevents sizes plus their headers and queue headers and termination +signal queue_size_temp : std_logic_vector(31 downto 0); +signal actual_queue_size : std_logic_vector(31 downto 0); -- queue size used during loading process when queue_size is no more valid +signal bytes_loaded : std_logic_vector(15 downto 0); -- size of actual constructing frame +signal sub_size_to_save : std_logic_vector(31 downto 0); -- size of subevent to save to shf +signal sub_size_loaded : std_logic_vector(31 downto 0); -- size of subevent actually being transmitted +signal sub_bytes_loaded : std_logic_vector(31 downto 0); -- amount of bytes of actual subevent sent +signal actual_packet_size : std_logic_vector(15 downto 0); -- actual size of whole udp packet +signal size_left : std_logic_vector(31 downto 0); +signal fc_ip_size : std_logic_vector(15 downto 0); +signal fc_udp_size : std_logic_vector(15 downto 0); +signal max_frame_size : std_logic_vector(15 downto 0); +signal divide_position : std_logic_vector(1 downto 0); -- 00->data, 01->sub, 11->term +signal debug : std_logic_vector(63 downto 0); +signal pc_ready : std_logic; + +signal pc_sub_size : std_logic_vector(31 downto 0); +signal pc_trig_nr : std_logic_vector(31 downto 0); +signal rst_after_sub_comb : std_logic; -- gk 08.04.10 +signal rst_after_sub : std_logic; -- gk 08.04.10 +signal load_int_ctr : integer range 0 to 3; -- gk 08.04.10 +signal delay_ctr : std_logic_vector(31 downto 0); -- gk 28.04.10 +signal ticks_ctr : std_logic_vector(7 downto 0); -- gk 28.04.10 + +-- gk 26.07.10 +signal load_eod : std_logic; +signal load_eod_q : std_logic; + +-- gk 07.10.10 +signal df_eod : std_logic; + +-- gk 04.12.10 +signal first_sub_in_multi : std_logic; +signal from_divide_state : std_logic; +signal disable_prep : std_logic; + +begin + + +PC_TRANSMIT_ON_OUT <= '1' when constructCurrentState = WAIT_FOR_LOAD else '0'; + +my_int_ctr <= (3 - to_integer(to_unsigned(sub_int_ctr, 2))); -- reverse byte order +load_int_ctr <= (3 - to_integer(to_unsigned(all_int_ctr, 2))); -- gk 08.04.10 + +all_ctr <= std_logic_vector(to_unsigned(all_int_ctr, all_ctr'length)); -- for debugging +sub_ctr <= std_logic_vector(to_unsigned(sub_int_ctr, sub_ctr'length)); -- for debugging +my_ctr <= std_logic_vector(to_unsigned(my_int_ctr, my_ctr'length)); -- for debugging + +max_frame_size <= PC_MAX_FRAME_SIZE_IN; + +-- Ready signal for PacketConstructor +pc_ready <= '1' when (constructCurrentState = CIDLE) and (df_empty = '1') else '0'; + +-- store event information on Start_of_Subevent +THE_EVT_INFO_STORE_PROC: process( CLK ) +begin + if( rising_edge(CLK) ) then + if (RESET = '1') then -- gk 31.05.10 + pc_sub_size <= (others => '0'); + pc_trig_nr <= (others => '0'); + elsif( PC_START_OF_SUB_IN = '1' ) then + pc_sub_size <= PC_SUB_SIZE_IN; + pc_trig_nr <= PC_TRIG_NR_IN; + end if; + end if; +end process; + +-- gk 07.10.10 +df_eod <= '1' when ((MULT_EVT_ENABLE_IN = '0') and (PC_END_OF_DATA_IN = '1')) + or ((MULT_EVT_ENABLE_IN = '1') and (PC_END_OF_SUB_IN = '1')) + else '0'; + +-- Data FIFO for incoming packet data from IPU buffer +-- gk 26.07.10 +DATA_FIFO : fifo_64kx9 +port map( + Data(7 downto 0) => PC_DATA_IN, + Data(8) => df_eod, --PC_END_OF_DATA_IN, -- gk 07.10.10 + WrClock => CLK, + RdClock => CLK, + WrEn => df_wr_en, + RdEn => df_rd_en, + Reset => RESET, + RPReset => RESET, + Q(7 downto 0) => df_q, + Q(8) => load_eod, + Empty => df_empty, + Full => df_full +); + +LOAD_EOD_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + load_eod_q <= '0'; + else + load_eod_q <= load_eod; + end if; + end if; +end process LOAD_EOD_PROC; + +-- Write enable for the data FIFO +-- !!!combinatorial signal!!! +-- could be avoided as IPU2GBE does only send data in case of PC_READY. +df_wr_en <= '1' when ((PC_WR_EN_IN = '1') and (constructCurrentState /= WAIT_FOR_LOAD)) + else '0'; + +-- Output register for data FIFO +dfQProc : process(CLK) +begin + if rising_edge(CLK) then + df_q_reg <= df_q; + end if; +end process dfQProc; + +-- Construction state machine +constructMachineProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + constructCurrentState <= CIDLE; + else + constructCurrentState <= constructNextState; + end if; + end if; +end process constructMachineProc; + +constructMachine : process(constructCurrentState, PC_START_OF_SUB_IN, PC_WR_EN_IN, PC_END_OF_DATA_IN, loadCurrentState, saveSubCurrentState, sub_int_ctr) +begin + case constructCurrentState is + when CIDLE => + constr_state <= x"0"; + --if( PC_WR_EN_IN = '1' ) then + -- gk 04.12.10 + if (PC_START_OF_SUB_IN = '1') then + + constructNextState <= SAVE_DATA; + else + constructNextState <= CIDLE; + end if; + when SAVE_DATA => + constr_state <= x"1"; + if( PC_END_OF_DATA_IN = '1') then + constructNextState <= WAIT_FOR_LOAD; + else + constructNextState <= SAVE_DATA; + end if; + when WAIT_FOR_LOAD => + constr_state <= x"2"; + if( (df_empty = '1') and (loadCurrentState = LIDLE) ) then -- waits until the whole packet is transmitted + constructNextState <= CIDLE; + else + constructNextState <= WAIT_FOR_LOAD; + end if; + when others => + constr_state <= x"f"; + constructNextState <= CIDLE; + end case; +end process constructMachine; + +--*********************** +-- SIZE COUNTERS FOR SAVING SIDE +--*********************** + +-- gk 29.03.10 the subevent size saved to its headers cannot contain padding bytes but they are included in pc_sub_size +-- that's why they are removed if pc_padding flag is asserted +sub_size_to_save <= (x"10" + pc_sub_size) when (PC_PADDING_IN = '0') + else (x"c" + pc_sub_size); -- subevent headers + data + +-- BUG HERE BUG HERE BUG HERE BUG HERE +-- gk 29.03.10 no changes here because the queue size should contain the padding bytes of subevents +queueSizeProc : process(CLK) +begin + if rising_edge(CLK) then + --if (RESET = '1') or (loadCurrentState = PUT_Q_DEC) then -- gk 07.10.10 -- (loadCurrentState = CLEANUP) then + if (RESET = '1') or (loadCurrentState = CLEANUP) then + queue_size <= x"00000028"; -- + 8B for queue headers and 32B for termination + elsif (saveSubCurrentState = SAVE_SIZE) and (sub_int_ctr = 3) then + queue_size <= queue_size + pc_sub_size + x"10"; -- + 16B for each subevent headers + end if; + end if; +end process queueSizeProc; + + +--*********************** +-- LOAD DATA COMBINED WITH HEADERS INTO FC, QUEUE TRANSMISSION +--*********************** + +loadMachineProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + loadCurrentState <= LIDLE; + else + loadCurrentState <= loadNextState; + end if; + end if; +end process loadMachineProc; + +loadMachine : process(loadCurrentState, constructCurrentState, all_int_ctr, df_empty, + sub_bytes_loaded, sub_size_loaded, size_left, TC_H_READY_IN, + max_frame_size, bytes_loaded, divide_position, PC_DELAY_IN, + delay_ctr, load_eod_q, MULT_EVT_ENABLE_IN) +begin + case loadCurrentState is + when LIDLE => + load_state <= x"0"; + if ((constructCurrentState = WAIT_FOR_LOAD) and (df_empty = '0')) then + loadNextState <= WAIT_FOR_FC; + else + loadNextState <= LIDLE; + end if; + when WAIT_FOR_FC => + load_state <= x"1"; + if (TC_H_READY_IN = '1') then + loadNextState <= PUT_Q_LEN; + else + loadNextState <= WAIT_FOR_FC; + end if; + when PUT_Q_LEN => + load_state <= x"2"; + if (all_int_ctr = 3) then + loadNextState <= PUT_Q_DEC; + else + loadNextState <= PUT_Q_LEN; + end if; + when PUT_Q_DEC => + load_state <= x"3"; + if (all_int_ctr = 3) then + loadNextState <= LOAD_SUB; + else + loadNextState <= PUT_Q_DEC; + end if; + when LOAD_SUB => + load_state <= x"4"; + if (bytes_loaded = max_frame_size - 1) then + loadNextState <= DIVIDE; + elsif (all_int_ctr = 15) then + loadNextState <= PREP_DATA; + else + loadNextState <= LOAD_SUB; + end if; + when PREP_DATA => + load_state <= x"5"; + loadNextState <= LOAD_DATA; + when LOAD_DATA => + load_state <= x"6"; +-- if (bytes_loaded = max_frame_size - 1) then +-- loadNextState <= DIVIDE; +-- -- gk 07.10.10 +-- elsif (MULT_EVT_ENABLE_IN = '1') then +-- if (size_left = x"0000_0023") then +-- loadNextState <= LOAD_TERM; +-- elsif (load_eod_q = '1') then +-- loadNextState <= LOAD_SUB; +-- else +-- loadNextState <= LOAD_DATA; +-- end if; +-- else +-- if (load_eod_q = '1') then +-- loadNextState <= LOAD_TERM; +-- else +-- loadNextState <= LOAD_DATA; +-- end if; +-- end if; + if (bytes_loaded = max_frame_size - 1) then + loadNextState <= DIVIDE; + -- gk 07.10.10 + elsif (load_eod_q = '1') then + if (MULT_EVT_ENABLE_IN = '1') then + if (size_left < x"0000_0030") then + loadNextState <= LOAD_TERM; + else + loadNextState <= LOAD_SUB; + end if; + else + loadNextState <= LOAD_TERM; + end if; + else + loadNextState <= LOAD_DATA; + end if; + when DIVIDE => + load_state <= x"7"; + if (TC_H_READY_IN = '1') then + if (divide_position = "00") then + loadNextState <= PREP_DATA; + elsif (divide_position = "01") then + loadNextState <= LOAD_SUB; + else + loadNextState <= LOAD_TERM; + end if; + else + loadNextState <= DIVIDE; + end if; + when LOAD_TERM => + load_state <= x"8"; + if (bytes_loaded = max_frame_size - 1) and (all_int_ctr /= 31) then + loadNextState <= DIVIDE; + elsif (all_int_ctr = 31) then + loadNextState <= CLEANUP; + else + loadNextState <= LOAD_TERM; + end if; + -- gk 28.04.10 + when CLEANUP => + load_state <= x"9"; + if (PC_DELAY_IN = x"0000_0000") then + loadNextState <= LIDLE; + else + loadNextState <= DELAY; + end if; + -- gk 28.04.10 + when DELAY => + load_state <= x"a"; + if (delay_ctr = x"0000_0000") then + loadNextState <= LIDLE; + else + loadNextState <= DELAY; + end if; + when others => + load_state <= x"f"; + loadNextState <= LIDLE; + end case; +end process loadMachine; + +-- gk 04.12.10 +firstSubInMultiProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LOAD_TERM) then + first_sub_in_multi <= '1'; + elsif (loadCurrentState = LOAD_DATA) then + first_sub_in_multi <= '0'; + end if; + end if; +end process; + +-- gk 04.12.10 +fromDivideStateProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + from_divide_state <= '0'; + elsif (loadCurrentState = DIVIDE) then + from_divide_state <= '1'; + elsif (loadCurrentState = PREP_DATA) then + from_divide_state <= '0'; + end if; + end if; +end process fromDivideStateProc; + + +dividePositionProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + divide_position <= "00"; +-- elsif (bytes_loaded = max_frame_size - 1) then +-- if (loadCurrentState = LIDLE) then +-- divide_position <= "00"; +-- elsif (loadCurrentState = LOAD_DATA) then +-- -- gk 07.10.10 +-- if (MULT_EVT_ENABLE_IN = '1') and (size_left = x"0000_003a") then +-- divide_position <= "11"; +-- -- gk 07.10.10 +-- elsif (MULT_EVT_ENABLE_IN = '1') and (load_eod_q = '1') then +-- divide_position <= "01"; +-- -- gk 26.07.10 +-- elsif (MULT_EVT_ENABLE_IN = '0') and (load_eod_q = '1') then -- if termination is about to be loaded divide on term +-- divide_position <= "11"; +-- else +-- divide_position <= "00"; -- still data loaded divide on data +-- end if; +-- elsif (loadCurrentState = LOAD_SUB) then +-- if (all_int_ctr = 15) then +-- divide_position <= "00"; +-- else +-- divide_position <= "01"; +-- end if; +-- elsif (loadCurrentState = LOAD_TERM) then +-- divide_position <= "11"; +-- end if; +-- end if; + elsif (bytes_loaded = max_frame_size - 1) then + if (loadCurrentState = LIDLE) then + divide_position <= "00"; + disable_prep <= '0'; -- gk 05.12.10 + elsif (loadCurrentState = LOAD_DATA) then + -- gk 05.12.10 + -- gk 26.07.10 + if (MULT_EVT_ENABLE_IN = '0') and (load_eod_q = '1') then -- if termination is about to be loaded divide on term + divide_position <= "11"; + disable_prep <= '0'; -- gk 05.12.10 + elsif (MULT_EVT_ENABLE_IN = '1') and (load_eod_q = '1') then + if (size_left > x"0000_0028") then + divide_position <= "01"; + disable_prep <= '0'; -- gk 05.12.10 + else + divide_position <= "11"; + disable_prep <= '0'; -- gk 05.12.10 + end if; + else + divide_position <= "00"; -- still data loaded divide on data + disable_prep <= '1'; -- gk 05.12.10 + end if; + elsif (loadCurrentState = LOAD_SUB) then + if (all_int_ctr = 15) then + divide_position <= "00"; + disable_prep <= '1'; -- gk 05.12.10 + else + divide_position <= "01"; + disable_prep <= '0'; -- gk 05.12.10 + end if; + elsif (loadCurrentState = LOAD_TERM) then + divide_position <= "11"; + disable_prep <= '0'; -- gk 05.12.10 + end if; + elsif (loadCurrentState = PREP_DATA) then -- gk 06.12.10 reset disable_prep + disable_prep <= '0'; + end if; + + end if; +end process dividePositionProc; + +allIntCtrProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then -- gk 31.05.10 + all_int_ctr <= 0; + else + case loadCurrentState is + + when LIDLE => all_int_ctr <= 0; + + when WAIT_FOR_FC => all_int_ctr <= 0; + + when PUT_Q_LEN => + if (all_int_ctr = 3) then + all_int_ctr <= 0; + else + all_int_ctr <= all_int_ctr + 1; + end if; + + when PUT_Q_DEC => + if (all_int_ctr = 3) then + all_int_ctr <= 0; + else + all_int_ctr <= all_int_ctr + 1; + end if; + + when LOAD_SUB => + if (all_int_ctr = 15) then + all_int_ctr <= 0; + else + all_int_ctr <= all_int_ctr + 1; + end if; + + when LOAD_DATA => all_int_ctr <= 0; + + when LOAD_TERM => + if (all_int_ctr = 31) then + all_int_ctr <= 0; + else + all_int_ctr <= all_int_ctr + 1; + end if; + + when DIVIDE => null; + + when CLEANUP => all_int_ctr <= 0; + + when PREP_DATA => all_int_ctr <= 0; + + when DELAY => all_int_ctr <= 0; + end case; + end if; + end if; +end process allIntCtrProc; + +dfRdEnProc : process(loadCurrentState, bytes_loaded, max_frame_size, sub_bytes_loaded, + sub_size_loaded, all_int_ctr, RESET, size_left, load_eod_q) +begin + if (RESET = '1') then + df_rd_en <= '0'; + elsif (loadCurrentState = LOAD_DATA) then +-- if (bytes_loaded = max_frame_size - x"1") then +-- df_rd_en <= '0'; +-- -- gk 07.10.10 +-- elsif (MULT_EVT_ENABLE_IN = '0') and (load_eod_q = '1') then +-- df_rd_en <= '0'; +-- -- gk 07.10.10 +-- elsif (MULT_EVT_ENABLE_IN = '1') and (size_left = x"0000_003a") then +-- df_rd_en <= '0'; +-- else +-- df_rd_en <= '1'; +-- end if; + if (bytes_loaded = max_frame_size - x"1") then + df_rd_en <= '0'; + -- gk 26.07.10 + --elsif (load_eod = '1') or (load_eod_q = '1') then + elsif (load_eod_q = '1') then + df_rd_en <= '0'; +-- elsif (sub_bytes_loaded = sub_size_loaded) then +-- df_rd_en <= '0'; + else + df_rd_en <= '1'; + end if; + + elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr = 15) and (bytes_loaded /= max_frame_size - x"1") then + df_rd_en <= '1'; + elsif (loadCurrentState = PREP_DATA) then + df_rd_en <= '1'; + else + df_rd_en <= '0'; + end if; +end process dfRdEnProc; + +shfRdEnProc : process(loadCurrentState, all_int_ctr, RESET) +begin + if (RESET = '1') then -- gk 31.05.10 + shf_rd_en <= '0'; + elsif (loadCurrentState = LOAD_SUB) then + shf_rd_en <= '1'; + elsif (loadCurrentState = LOAD_TERM) and (all_int_ctr < 31) then + shf_rd_en <= '1'; + elsif (loadCurrentState = PUT_Q_DEC) and (all_int_ctr = 3) then + shf_rd_en <= '1'; + else + shf_rd_en <= '0'; + end if; +end process shfRdEnProc; + + +-- fcWrEnProc : process(loadCurrentState, RESET) +-- begin +-- if (RESET = '1') then -- gk 31.05.10 +-- fc_wr_en <= '0'; +-- elsif (loadCurrentState = PUT_Q_LEN) or (loadCurrentState = PUT_Q_DEC) then +-- fc_wr_en <= '1'; +-- elsif (loadCurrentState = LOAD_SUB) or (loadCurrentState = LOAD_DATA) or (loadCurrentState = LOAD_TERM) then +-- fc_wr_en <= '1'; +-- else +-- fc_wr_en <= '0'; +-- end if; +-- end process fcWrEnProc; +fcWrEnProc : process(loadCurrentState, RESET, first_sub_in_multi, from_divide_state, MULT_EVT_ENABLE_IN, divide_position, disable_prep) +begin + if (RESET = '1') then -- gk 31.05.10 + fc_wr_en <= '0'; + elsif (loadCurrentState = PUT_Q_LEN) or (loadCurrentState = PUT_Q_DEC) then + fc_wr_en <= '1'; + elsif (loadCurrentState = LOAD_SUB) or (loadCurrentState = LOAD_DATA) or (loadCurrentState = LOAD_TERM) then + fc_wr_en <= '1'; + -- gk 04.12.10 + elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') and (disable_prep = '0') then + fc_wr_en <= '1'; + elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (from_divide_state = '1') and ((divide_position = "00") or (divide_position = "01")) and (disable_prep = '0') then + fc_wr_en <= '1'; + else + fc_wr_en <= '0'; + end if; +end process fcWrEnProc; + + +-- was all_int_ctr +fcDataProc : process(loadCurrentState, queue_size_temp, PC_QUEUE_DEC_IN, shf_q, df_q_reg, load_int_ctr) +begin + case loadCurrentState is + when LIDLE => fc_data <= x"af"; + when WAIT_FOR_FC => fc_data <= x"bf"; + -- gk 08.04.10 my_int_ctr changed to load_int_ctr + when PUT_Q_LEN => fc_data <= queue_size_temp(load_int_ctr * 8 + 7 downto load_int_ctr * 8); + when PUT_Q_DEC => fc_data <= PC_QUEUE_DEC_IN(load_int_ctr * 8 + 7 downto load_int_ctr * 8); + when LOAD_SUB => fc_data <= shf_q; + when PREP_DATA => fc_data <= df_q_reg; + when LOAD_DATA => fc_data <= df_q_reg; + when LOAD_TERM => fc_data <= shf_q; + when DIVIDE => fc_data <= x"cf"; + when CLEANUP => fc_data <= x"df"; + when others => fc_data <= x"00"; + end case; +end process fcDataProc; + +-- delay counters +-- gk 28.04.10 +DELAY_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if ((RESET = '1') or (loadCurrentState = LIDLE)) then + delay_ctr <= PC_DELAY_IN; + elsif ((loadCurrentState = DELAY) and (ticks_ctr(7) = '1')) then + delay_ctr <= delay_ctr - x"1"; + end if; + end if; +end process DELAY_CTR_PROC; + +-- gk 28.04.10 +TICKS_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if ((RESET = '1') or (loadCurrentState = LIDLE) or (ticks_ctr(7) = '1')) then + ticks_ctr <= x"00"; + elsif (loadCurrentState = DELAY) then + ticks_ctr <= ticks_ctr + x"1"; + end if; + end if; +end process TICKS_CTR_PROC; + + +--*********************** +-- SIZE COUNTERS FOR LOADING SIDE +--*********************** + +queue_size_temp <= queue_size - x"20"; -- size of data without termination + +-- gk 08.04.10 +rst_after_sub_comb <= '1' when (loadCurrentState = LIDLE) or + ((loadCurrentState = LOAD_DATA) and (size_left /= x"00000021")) -- gk 26.07.10 -- and (sub_bytes_loaded = sub_size_loaded) + else '0'; + +-- gk 08.04.10 +RST_AFTER_SUB_PROC : process(CLK) +begin + if(rising_edge(CLK)) then + if(RESET = '1') then + rst_after_sub <= '0'; + else + rst_after_sub <= rst_after_sub_comb; + end if; + end if; +end process RST_AFTER_SUB_PROC; + +-- counts all bytes loaded to divide data into frames +bytesLoadedProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = DIVIDE) or (loadCurrentState = CLEANUP) then + bytes_loaded <= x"0000"; + elsif (loadCurrentState = PUT_Q_LEN) or (loadCurrentState = PUT_Q_DEC) or (loadCurrentState = LOAD_DATA) or (loadCurrentState = LOAD_SUB) or (loadCurrentState = LOAD_TERM) then + bytes_loaded <= bytes_loaded + x"1"; + -- gk 05.12.10 +-- elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') then +-- bytes_loaded <= bytes_loaded + x"1"; + elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (first_sub_in_multi = '0') and (from_divide_state = '0') and (disable_prep = '0') then + bytes_loaded <= bytes_loaded + x"1"; + elsif (MULT_EVT_ENABLE_IN = '1') and (loadCurrentState = PREP_DATA) and (from_divide_state = '1') and ((divide_position = "00") or (divide_position = "01")) and (disable_prep = '0') then + bytes_loaded <= bytes_loaded + x"1"; + end if; + end if; +end process bytesLoadedProc; + +-- size of subevent loaded from memory +subSizeLoadedProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then -- gk 08.04.10 + sub_size_loaded <= x"00000000"; + elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr < 4) then + -- was all_int_ctr + -- gk 08.04.10 my_int_ctr changed to load_int_ctr + sub_size_loaded(7 + load_int_ctr * 8 downto load_int_ctr * 8) <= shf_q; + -- gk 29.03.10 here the padding bytes have to be added to the loadedSize in order to load the correct amount of bytes from fifo + elsif (loadCurrentState = LOAD_SUB) and (all_int_ctr = 5) and (sub_size_loaded(2) = '1') then + sub_size_loaded <= sub_size_loaded + x"4"; + end if; + end if; +end process subSizeLoadedProc; + +-- counts only raw data bytes being loaded +subBytesLoadedProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then -- gk 26.07.10 --or (sub_bytes_loaded = sub_size_loaded) -- gk 08.04.10 + sub_bytes_loaded <= x"00000011"; -- subevent headers doesnt count + elsif (loadCurrentState = LOAD_DATA) then + sub_bytes_loaded <= sub_bytes_loaded + x"1"; + end if; + end if; +end process subBytesLoadedProc; + +-- counts the size of the large udp packet +actualPacketProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then + actual_packet_size <= x"0008"; + elsif (fc_wr_en = '1') then + actual_packet_size <= actual_packet_size + x"1"; + end if; + end if; +end process actualPacketProc; + +actualQueueSizeProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = CLEANUP) then + actual_queue_size <= (others => '0'); + elsif (loadCurrentState = LIDLE) then + actual_queue_size <= queue_size; + end if; + end if; +end process actualQueueSizeProc; + +-- amount of bytes left to send in current packet +sizeLeftProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = CLEANUP) then + size_left <= (others => '0'); + elsif (loadCurrentState = LIDLE) then + size_left <= queue_size; + elsif (fc_wr_en = '1') then + size_left <= size_left - 1; + end if; + end if; +end process sizeLeftProc; + +-- HOT FIX: don't rely on CTS information, count the packets on your own. +-- In this case, we increment the fragmented packet ID with EOD from ipu2gbe. +THE_FC_IDENT_COUNTER_PROC: process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + fc_ident <= (others => '0'); + elsif (PC_END_OF_DATA_IN = '1') then + fc_ident <= fc_ident + 1; + end if; + end if; +end process THE_FC_IDENT_COUNTER_PROC; + +fc_flags_offset(15 downto 14) <= "00"; + +moreFragmentsProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then + fc_flags_offset(13) <= '0'; + elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) or ((loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1')) then + if ((actual_queue_size - actual_packet_size) < max_frame_size) then + fc_flags_offset(13) <= '0'; -- no more fragments + else + fc_flags_offset(13) <= '1'; -- more fragments + end if; + end if; + end if; +end process moreFragmentsProc; + +eodProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + fc_eod <= '0'; + elsif (loadCurrentState = LOAD_DATA) and (bytes_loaded = max_frame_size - 2) then + fc_eod <= '1'; + elsif (loadCurrentState = LOAD_SUB) and (bytes_loaded = max_frame_size - 2) then + fc_eod <= '1'; + elsif (loadCurrentState = LOAD_TERM) and ((bytes_loaded = max_frame_size - 2) or (all_int_ctr = 30)) then + fc_eod <= '1'; + else + fc_eod <= '0'; + end if; + end if; +end process eodProc; + +sodProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + fc_sod <= '0'; + elsif (loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1') then + fc_sod <= '1'; + elsif (loadCurrentState = DIVIDE) and (TC_READY_IN = '1') then + fc_sod <= '1'; + else + fc_sod <= '0'; + end if; + end if; +end process sodProc; + +offsetProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) then + fc_flags_offset(12 downto 0) <= (others => '0'); + elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) then + fc_flags_offset(12 downto 0) <= actual_packet_size(15 downto 3); + end if; + end if; +end process offsetProc; + +fcIPSizeProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET= '1') then + fc_ip_size <= (others => '0'); + elsif ((loadCurrentState = DIVIDE) and (TC_READY_IN = '1')) or ((loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1')) then + if (size_left >= max_frame_size) then + fc_ip_size <= max_frame_size; + else + fc_ip_size <= size_left(15 downto 0); + end if; + end if; + end if; +end process fcIPSizeProc; + +fcUDPSizeProc : process(CLK) + begin + if rising_edge(CLK) then + if (RESET = '1') then + fc_udp_size <= (others => '0'); + elsif (loadCurrentState = WAIT_FOR_FC) and (TC_READY_IN = '1') then + fc_udp_size <= queue_size(15 downto 0); + end if; + end if; +end process fcUDPSizeProc; + + +--*********************** +-- SUBEVENT HEADERS WRITE AND READ +--*********************** + +SUBEVENT_HEADERS_FIFO : fifo_16kx8 +port map( + Data => shf_data, + WrClock => CLK, + RdClock => CLK, + WrEn => shf_wr_en, + RdEn => shf_rd_en, + Reset => RESET, + RPReset => RESET, + Q => shf_q, + Empty => shf_empty, + Full => shf_full +); + +-- write enable for SHF +shf_wr_en <= '1' when ((saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA)) + else '0'; + +-- data multiplexing for SHF (convert 32bit LWs to 8bit) +-- CHANGED. +-- The SubEventHeader (4x 32bit is stored in [MSB:LSB] now, same byte order as data from PC. +shfDataProc : process(saveSubCurrentState, sub_size_to_save, PC_DECODING_IN, PC_EVENT_ID_IN, + pc_trig_nr, my_int_ctr, fc_data) +begin + case saveSubCurrentState is + when SIDLE => shf_data <= x"ac"; + when SAVE_SIZE => shf_data <= sub_size_to_save(my_int_ctr * 8 + 7 downto my_int_ctr * 8); + when SAVE_DECODING => shf_data <= PC_DECODING_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8); + when SAVE_ID => shf_data <= PC_EVENT_ID_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8); + when SAVE_TRIG_NR => shf_data <= pc_trig_nr(my_int_ctr * 8 + 7 downto my_int_ctr * 8); + when SAVE_TERM => shf_data <= fc_data; + when others => shf_data <= x"00"; + end case; +end process shfDataProc; + +saveSubMachineProc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + saveSubCurrentState <= SIDLE; + else + saveSubCurrentState <= saveSubNextState; + end if; + end if; +end process saveSubMachineProc; + +saveSubMachine : process(saveSubCurrentState, PC_START_OF_SUB_IN, sub_int_ctr, loadCurrentState, TC_H_READY_IN) +begin + case saveSubCurrentState is + when SIDLE => + save_state <= x"0"; + if (PC_START_OF_SUB_IN = '1') then + saveSubNextState <= SAVE_SIZE; + -- this branch is dangerous! + elsif (loadCurrentState = WAIT_FOR_FC) and (TC_H_READY_IN = '1') then -- means that loadCurrentState is put_q_len + saveSubNextState <= SAVE_TERM; + else + saveSubNextState <= SIDLE; + end if; + when SAVE_SIZE => + save_state <= x"1"; + if (sub_int_ctr = 3) then + saveSubNextState <= SAVE_DECODING; + else + saveSubNextState <= SAVE_SIZE; + end if; + when SAVE_DECODING => + save_state <= x"2"; + if (sub_int_ctr = 3) then + saveSubNextState <= SAVE_ID; + else + saveSubNextState <= SAVE_DECODING; + end if; + when SAVE_ID => + save_state <= x"3"; + if (sub_int_ctr = 3) then + saveSubNextState <= SAVE_TRIG_NR; + else + saveSubNextState <= SAVE_ID; + end if; + when SAVE_TRIG_NR => + save_state <= x"4"; + if (sub_int_ctr = 3) then + saveSubNextState <= SIDLE; + else + saveSubNextState <= SAVE_TRIG_NR; + end if; + when SAVE_TERM => + save_state <= x"5"; + if (sub_int_ctr = 31) then + saveSubNextState <= SIDLE; + else + saveSubNextState <= SAVE_TERM; + end if; + when others => + save_state <= x"f"; + saveSubNextState <= SIDLE; + end case; +end process; + +-- This counter is used for breaking down 32bit information words into 8bit bytes for +-- storing them in the SHF. +-- It is also used for the termination 32byte sequence. +subIntProc: process( CLK ) +begin + if rising_edge(CLK) then + if (RESET = '1') or (saveSubCurrentState = SIDLE) then + sub_int_ctr <= 0; + elsif (sub_int_ctr = 3) and (saveSubCurrentState /= SAVE_TERM) then + sub_int_ctr <= 0; + elsif (sub_int_ctr = 31) and (saveSubCurrentState = SAVE_TERM) then + sub_int_ctr <= 0; + elsif (saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA) then + sub_int_ctr <= sub_int_ctr + 1; + end if; + end if; +end process subIntProc; + +debug(3 downto 0) <= constr_state; +debug(7 downto 4) <= save_state; +debug(11 downto 8) <= load_state; +debug(27 downto 12) <= queue_size(15 downto 0); +debug(28) <= df_full; +debug(29) <= df_empty; +debug(30) <= shf_full; +debug(31) <= shf_empty; + +debug(47 downto 32) <= size_left(15 downto 0); +debug(52 downto 48) <= all_ctr; +debug(53) <= pc_ready; + +-- outputs +PC_READY_OUT <= pc_ready; +TC_WR_EN_OUT <= fc_wr_en; +TC_DATA_OUT <= fc_data; +TC_IP_SIZE_OUT <= fc_ip_size; +TC_UDP_SIZE_OUT <= fc_udp_size; +-- FC_IDENT_OUT(15 downto 8) <= fc_ident(7 downto 0); +-- FC_IDENT_OUT(7 downto 0) <= fc_ident(15 downto 8); +TC_FLAGS_OFFSET_OUT <= fc_flags_offset; +TC_SOD_OUT <= fc_sod; +TC_EOD_OUT <= fc_eod; + +DEBUG_OUT <= debug; + end trb_net16_gbe_packet_constr; \ No newline at end of file diff --git a/gbe2_ecp3/trb_net16_gbe_protocol_prioritizer.vhd b/gbe2_ecp3/trb_net16_gbe_protocol_prioritizer.vhd index dddbc65..98f38f7 100644 --- a/gbe2_ecp3/trb_net16_gbe_protocol_prioritizer.vhd +++ b/gbe2_ecp3/trb_net16_gbe_protocol_prioritizer.vhd @@ -56,15 +56,15 @@ begin if (UDP_PROTOCOL_IN = x"0044") then -- DHCP Client CODE_OUT(1) <= '1'; -- No. 4 = SCTRL - elsif (UDP_PROTOCOL_IN = x"6590") then -- SCTRL module - CODE_OUT(2) <= '1'; + elsif (UDP_PROTOCOL_IN = x"61a8") then -- SCTRL module + CODE_OUT(3) <= '1'; else -- branch for pure IPv4 CODE_OUT <= (others => '0'); end if; -- No. 3 = ICMP --- elsif (PROTOCOL_CODE_IN = x"01") then -- ICMP --- CODE_OUT(2) <= '1'; + elsif (PROTOCOL_CODE_IN = x"01") then -- ICMP + CODE_OUT(2) <= '1'; else CODE_OUT <= (others => '0'); end if; diff --git a/gbe2_ecp3/trb_net16_gbe_protocol_selector.vhd b/gbe2_ecp3/trb_net16_gbe_protocol_selector.vhd index bd18a97..7f1ca21 100644 --- a/gbe2_ecp3/trb_net16_gbe_protocol_selector.vhd +++ b/gbe2_ecp3/trb_net16_gbe_protocol_selector.vhd @@ -43,7 +43,7 @@ port ( TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); @@ -51,6 +51,11 @@ port ( TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; MC_BUSY_IN : in std_logic; -- counters from response constructors @@ -74,38 +79,6 @@ port ( GSC_BUSY_IN : in std_logic; MAKE_RESET_OUT : out std_logic; - - -- signal for data readout - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; -- input for statistics from outside STAT_DATA_IN : in std_logic_vector(31 downto 0); @@ -123,11 +96,8 @@ architecture trb_net16_gbe_protocol_selector of trb_net16_gbe_protocol_selector --attribute HGROUP : string; --attribute HGROUP of trb_net16_gbe_protocol_selector : architecture is "GBE_MAIN_group"; -attribute syn_encoding : string; - signal rd_en : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); signal resp_ready : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); -signal tc_wr : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); signal tc_data : std_logic_vector(c_MAX_PROTOCOLS * 9 - 1 downto 0); signal tc_size : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); signal tc_type : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); @@ -142,29 +112,23 @@ signal tc_src_udp : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 down signal tc_ip_proto : std_logic_vector(c_MAX_PROTOCOLS * 8 - 1 downto 0); -- plus 1 is for the outside -signal stat_data : std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); -signal stat_addr : std_logic_vector(c_MAX_PROTOCOLS * 8 - 1 downto 0); -signal stat_rdy : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); -signal stat_ack : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); -signal tc_ip_size : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); -signal tc_udp_size : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); -signal tc_size_left : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); -signal tc_flags_size : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); +signal stat_data : std_logic_vector((c_MAX_PROTOCOLS + 1) * 32 - 1 downto 0); +signal stat_addr : std_logic_vector((c_MAX_PROTOCOLS + 1) * 8 - 1 downto 0); +signal stat_rdy : std_logic_vector((c_MAX_PROTOCOLS + 1) - 1 downto 0); +signal stat_ack : std_logic_vector((c_MAX_PROTOCOLS + 1) - 1 downto 0); +signal tc_ip_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0); +signal tc_udp_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0); +signal tc_flags_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0); -signal tc_data_not_valid : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); type select_states is (IDLE, LOOP_OVER, SELECT_ONE, PROCESS_REQUEST, CLEANUP); signal select_current_state, select_next_state : select_states; -attribute syn_encoding of select_current_state : signal is "onehot"; signal state : std_logic_vector(3 downto 0); signal index : integer range 0 to c_MAX_PROTOCOLS - 1; signal mult : std_logic; -signal tc_ident : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); -signal zeros : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - attribute syn_preserve : boolean; attribute syn_keep : boolean; attribute syn_keep of state, mult : signal is true; @@ -172,53 +136,56 @@ attribute syn_preserve of state, mult : signal is true; begin -zeros <= (others => '0'); - -- protocol Nr. 1 ARP ARP : trb_net16_gbe_response_constructor_ARP generic map( STAT_ADDRESS_BASE => 6 ) port map ( - CLK => CLK, - RESET => RESET, + CLK => CLK, + RESET => RESET, -- INTERFACE - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(0), + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(0), PS_RESPONSE_READY_OUT => resp_ready(0), - PS_BUSY_OUT => busy(0), - PS_SELECTED_IN => selected(0), + PS_BUSY_OUT => busy(0), + PS_SELECTED_IN => selected(0), PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(1 * 9 - 1 downto 0 * 9), - TC_FRAME_SIZE_OUT => tc_size(1 * 16 - 1 downto 0 * 16), - TC_FRAME_TYPE_OUT => tc_type(1 * 16 - 1 downto 0 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(1 * 8 - 1 downto 0 * 8), - TC_IDENT_OUT => tc_ident(1 * 16 - 1 downto 0 * 16), - - TC_DEST_MAC_OUT => tc_mac(1 * 48 - 1 downto 0 * 48), - TC_DEST_IP_OUT => tc_ip(1 * 32 - 1 downto 0 * 32), - TC_DEST_UDP_OUT => tc_udp(1 * 16 - 1 downto 0 * 16), - TC_SRC_MAC_OUT => tc_src_mac(1 * 48 - 1 downto 0 * 48), - TC_SRC_IP_OUT => tc_src_ip(1 * 32 - 1 downto 0 * 32), - TC_SRC_UDP_OUT => tc_src_udp(1 * 16 - 1 downto 0 * 16), - - STAT_DATA_OUT => stat_data(1 * 32 - 1 downto 0 * 32), - STAT_ADDR_OUT => stat_addr(1 * 8 - 1 downto 0 * 8), - STAT_DATA_RDY_OUT => stat_rdy(0), - STAT_DATA_ACK_IN => stat_ack(0), - RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(1 * 16 - 1 downto 0 * 16), - SENT_FRAMES_OUT => SENT_FRAMES_OUT(1 * 16 - 1 downto 0 * 16), - DEBUG_OUT => PROTOS_DEBUG_OUT(1 * 32 - 1 downto 0 * 32) --- END OF INTERFACE + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, + + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(1 * 9 - 1 downto 0 * 9), + TC_FRAME_SIZE_OUT => tc_size(1 * 16 - 1 downto 0 * 16), + TC_FRAME_TYPE_OUT => tc_type(1 * 16 - 1 downto 0 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(1 * 8 - 1 downto 0 * 8), + + TC_DEST_MAC_OUT => tc_mac(1 * 48 - 1 downto 0 * 48), + TC_DEST_IP_OUT => tc_ip(1 * 32 - 1 downto 0 * 32), + TC_DEST_UDP_OUT => tc_udp(1 * 16 - 1 downto 0 * 16), + TC_SRC_MAC_OUT => tc_src_mac(1 * 48 - 1 downto 0 * 48), + TC_SRC_IP_OUT => tc_src_ip(1 * 32 - 1 downto 0 * 32), + TC_SRC_UDP_OUT => tc_src_udp(1 * 16 - 1 downto 0 * 16), + + TC_IP_SIZE_OUT => tc_ip_size(1 * 16 - 1 downto 0 * 16), + TC_UDP_SIZE_OUT => tc_udp_size(1 * 16 - 1 downto 0 * 16), + TC_FLAGS_OFFSET_OUT => tc_flags_size(1 * 16 - 1 downto 0 * 16), + + TC_BUSY_IN => TC_BUSY_IN, + + STAT_DATA_OUT => stat_data(1 * 32 - 1 downto 0 * 32), + STAT_ADDR_OUT => stat_addr(1 * 8 - 1 downto 0 * 8), + STAT_DATA_RDY_OUT => stat_rdy(0), + STAT_DATA_ACK_IN => stat_ack(0), + RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(1 * 16 - 1 downto 0 * 16), + SENT_FRAMES_OUT => SENT_FRAMES_OUT(1 * 16 - 1 downto 0 * 16), + DEBUG_OUT => PROTOS_DEBUG_OUT(1 * 32 - 1 downto 0 * 32) +-- END OF INTERFACE ); -- protocol No. 2 DHCP @@ -226,304 +193,243 @@ DHCP : trb_net16_gbe_response_constructor_DHCP generic map( STAT_ADDRESS_BASE => 0 ) port map ( - CLK => CLK, - RESET => RESET, + CLK => CLK, + RESET => RESET, -- INTERFACE - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(1), + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(1), PS_RESPONSE_READY_OUT => resp_ready(1), - PS_BUSY_OUT => busy(1), - PS_SELECTED_IN => selected(1), + PS_BUSY_OUT => busy(1), + PS_SELECTED_IN => selected(1), PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(2 * 9 - 1 downto 1 * 9), - TC_FRAME_SIZE_OUT => tc_size(2 * 16 - 1 downto 1 * 16), - TC_FRAME_TYPE_OUT => tc_type(2 * 16 - 1 downto 1 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(2 * 8 - 1 downto 1 * 8), - TC_IDENT_OUT => tc_ident(2 * 16 - 1 downto 1 * 16), + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(2 * 9 - 1 downto 1 * 9), + TC_FRAME_SIZE_OUT => tc_size(2 * 16 - 1 downto 1 * 16), + TC_FRAME_TYPE_OUT => tc_type(2 * 16 - 1 downto 1 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(2 * 8 - 1 downto 1 * 8), - TC_DEST_MAC_OUT => tc_mac(2 * 48 - 1 downto 1 * 48), - TC_DEST_IP_OUT => tc_ip(2 * 32 - 1 downto 1 * 32), - TC_DEST_UDP_OUT => tc_udp(2 * 16 - 1 downto 1 * 16), - TC_SRC_MAC_OUT => tc_src_mac(2 * 48 - 1 downto 1 * 48), - TC_SRC_IP_OUT => tc_src_ip(2 * 32 - 1 downto 1 * 32), - TC_SRC_UDP_OUT => tc_src_udp(2 * 16 - 1 downto 1 * 16), - - STAT_DATA_OUT => stat_data(2 * 32 - 1 downto 1 * 32), - STAT_ADDR_OUT => stat_addr(2 * 8 - 1 downto 1 * 8), - STAT_DATA_RDY_OUT => stat_rdy(1), - STAT_DATA_ACK_IN => stat_ack(1), - RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(2 * 16 - 1 downto 1 * 16), - SENT_FRAMES_OUT => SENT_FRAMES_OUT(2 * 16 - 1 downto 1 * 16), + TC_DEST_MAC_OUT => tc_mac(2 * 48 - 1 downto 1 * 48), + TC_DEST_IP_OUT => tc_ip(2 * 32 - 1 downto 1 * 32), + TC_DEST_UDP_OUT => tc_udp(2 * 16 - 1 downto 1 * 16), + TC_SRC_MAC_OUT => tc_src_mac(2 * 48 - 1 downto 1 * 48), + TC_SRC_IP_OUT => tc_src_ip(2 * 32 - 1 downto 1 * 32), + TC_SRC_UDP_OUT => tc_src_udp(2 * 16 - 1 downto 1 * 16), + + TC_IP_SIZE_OUT => tc_ip_size(2 * 16 - 1 downto 1 * 16), + TC_UDP_SIZE_OUT => tc_udp_size(2 * 16 - 1 downto 1 * 16), + TC_FLAGS_OFFSET_OUT => tc_flags_size(2 * 16 - 1 downto 1 * 16), + + TC_BUSY_IN => TC_BUSY_IN, + + STAT_DATA_OUT => stat_data(2 * 32 - 1 downto 1 * 32), + STAT_ADDR_OUT => stat_addr(2 * 8 - 1 downto 1 * 8), + STAT_DATA_RDY_OUT => stat_rdy(1), + STAT_DATA_ACK_IN => stat_ack(1), + RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(2 * 16 - 1 downto 1 * 16), + SENT_FRAMES_OUT => SENT_FRAMES_OUT(2 * 16 - 1 downto 1 * 16), -- END OF INTERFACE - DHCP_START_IN => DHCP_START_IN, - DHCP_DONE_OUT => DHCP_DONE_OUT, + DHCP_START_IN => DHCP_START_IN, + DHCP_DONE_OUT => DHCP_DONE_OUT, - DEBUG_OUT => PROTOS_DEBUG_OUT(1 * 32 - 1 downto 0 * 32) + DEBUG_OUT => PROTOS_DEBUG_OUT(2 * 32 - 1 downto 1 * 32) ); -- protocol No. 3 Ping ---Ping : trb_net16_gbe_response_constructor_Ping ---generic map( STAT_ADDRESS_BASE => 3 ---) ---port map ( --- CLK => CLK, --- RESET => RESET, --- ------- INTERFACE --- PS_DATA_IN => PS_DATA_IN, --- PS_WR_EN_IN => PS_WR_EN_IN, --- PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(2), --- PS_RESPONSE_READY_OUT => resp_ready(2), --- PS_BUSY_OUT => busy(2), --- PS_SELECTED_IN => selected(2), --- --- PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, --- PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, --- PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, --- PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, --- PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, --- PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, --- --- TC_RD_EN_IN => TC_RD_EN_IN, --- TC_DATA_OUT => tc_data(3 * 9 - 1 downto 2 * 9), --- TC_FRAME_SIZE_OUT => tc_size(3 * 16 - 1 downto 2 * 16), --- TC_FRAME_TYPE_OUT => tc_type(3 * 16 - 1 downto 2 * 16), --- TC_IP_PROTOCOL_OUT => tc_ip_proto(3 * 8 - 1 downto 2 * 8), --- TC_IDENT_OUT => tc_ident(3 * 16 - 1 downto 2 * 16), --- --- TC_DEST_MAC_OUT => tc_mac(3 * 48 - 1 downto 2 * 48), --- TC_DEST_IP_OUT => tc_ip(3 * 32 - 1 downto 2 * 32), --- TC_DEST_UDP_OUT => tc_udp(3 * 16 - 1 downto 2 * 16), --- TC_SRC_MAC_OUT => tc_src_mac(3 * 48 - 1 downto 2 * 48), --- TC_SRC_IP_OUT => tc_src_ip(3 * 32 - 1 downto 2 * 32), --- TC_SRC_UDP_OUT => tc_src_udp(3 * 16 - 1 downto 2 * 16), --- --- STAT_DATA_OUT => stat_data(3 * 32 - 1 downto 2 * 32), --- STAT_ADDR_OUT => stat_addr(3 * 8 - 1 downto 2 * 8), --- STAT_DATA_RDY_OUT => stat_rdy(2), --- STAT_DATA_ACK_IN => stat_ack(2), --- RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), --- SENT_FRAMES_OUT => SENT_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), --- DEBUG_OUT => PROTOS_DEBUG_OUT(3 * 32 - 1 downto 2 * 32) ----- END OF INTERFACE ---); +Ping : trb_net16_gbe_response_constructor_Ping +generic map( STAT_ADDRESS_BASE => 3 +) +port map ( + CLK => CLK, + RESET => RESET, + +-- INTERFACE + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(2), + PS_RESPONSE_READY_OUT => resp_ready(2), + PS_BUSY_OUT => busy(2), + PS_SELECTED_IN => selected(2), + + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, + + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(3 * 9 - 1 downto 2 * 9), + TC_FRAME_SIZE_OUT => tc_size(3 * 16 - 1 downto 2 * 16), + TC_FRAME_TYPE_OUT => tc_type(3 * 16 - 1 downto 2 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(3 * 8 - 1 downto 2 * 8), + + TC_DEST_MAC_OUT => tc_mac(3 * 48 - 1 downto 2 * 48), + TC_DEST_IP_OUT => tc_ip(3 * 32 - 1 downto 2 * 32), + TC_DEST_UDP_OUT => tc_udp(3 * 16 - 1 downto 2 * 16), + TC_SRC_MAC_OUT => tc_src_mac(3 * 48 - 1 downto 2 * 48), + TC_SRC_IP_OUT => tc_src_ip(3 * 32 - 1 downto 2 * 32), + TC_SRC_UDP_OUT => tc_src_udp(3 * 16 - 1 downto 2 * 16), + + TC_IP_SIZE_OUT => tc_ip_size(3 * 16 - 1 downto 2 * 16), + TC_UDP_SIZE_OUT => tc_udp_size(3 * 16 - 1 downto 2 * 16), + TC_FLAGS_OFFSET_OUT => tc_flags_size(3 * 16 - 1 downto 2 * 16), + + TC_BUSY_IN => TC_BUSY_IN, + + STAT_DATA_OUT => stat_data(3 * 32 - 1 downto 2 * 32), + STAT_ADDR_OUT => stat_addr(3 * 8 - 1 downto 2 * 8), + STAT_DATA_RDY_OUT => stat_rdy(2), + STAT_DATA_ACK_IN => stat_ack(2), + RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), + SENT_FRAMES_OUT => SENT_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), + DEBUG_OUT => PROTOS_DEBUG_OUT(3 * 32 - 1 downto 2 * 32) +-- END OF INTERFACE +); SCTRL : trb_net16_gbe_response_constructor_SCTRL generic map( STAT_ADDRESS_BASE => 8 ) port map ( - CLK => CLK, - RESET => RESET, + CLK => CLK, + RESET => RESET, -- INTERFACE - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(2), - PS_RESPONSE_READY_OUT => resp_ready(2), - PS_BUSY_OUT => busy(2), - PS_SELECTED_IN => selected(2), + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(3), + PS_RESPONSE_READY_OUT => resp_ready(3), + PS_BUSY_OUT => busy(3), + PS_SELECTED_IN => selected(3), PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(3 * 9 - 1 downto 2 * 9), - TC_FRAME_SIZE_OUT => tc_size(3 * 16 - 1 downto 2 * 16), - TC_FRAME_TYPE_OUT => tc_type(3 * 16 - 1 downto 2 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(3 * 8 - 1 downto 2 * 8), - TC_IDENT_OUT => tc_ident(3 * 16 - 1 downto 2 * 16), - - TC_DEST_MAC_OUT => tc_mac(3 * 48 - 1 downto 2 * 48), - TC_DEST_IP_OUT => tc_ip(3 * 32 - 1 downto 2 * 32), - TC_DEST_UDP_OUT => tc_udp(3 * 16 - 1 downto 2 * 16), - TC_SRC_MAC_OUT => tc_src_mac(3 * 48 - 1 downto 2 * 48), - TC_SRC_IP_OUT => tc_src_ip(3 * 32 - 1 downto 2 * 32), - TC_SRC_UDP_OUT => tc_src_udp(3 * 16 - 1 downto 2 * 16), - - STAT_DATA_OUT => stat_data(3 * 32 - 1 downto 2 * 32), - STAT_ADDR_OUT => stat_addr(3 * 8 - 1 downto 2 * 8), - STAT_DATA_RDY_OUT => stat_rdy(2), - STAT_DATA_ACK_IN => stat_ack(2), - RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), - SENT_FRAMES_OUT => SENT_FRAMES_OUT(3 * 16 - 1 downto 2 * 16), + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, + + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(4 * 9 - 1 downto 3 * 9), + TC_FRAME_SIZE_OUT => tc_size(4 * 16 - 1 downto 3 * 16), + TC_FRAME_TYPE_OUT => tc_type(4 * 16 - 1 downto 3 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(4 * 8 - 1 downto 3 * 8), + + TC_DEST_MAC_OUT => tc_mac(4 * 48 - 1 downto 3 * 48), + TC_DEST_IP_OUT => tc_ip(4 * 32 - 1 downto 3 * 32), + TC_DEST_UDP_OUT => tc_udp(4 * 16 - 1 downto 3 * 16), + TC_SRC_MAC_OUT => tc_src_mac(4 * 48 - 1 downto 3 * 48), + TC_SRC_IP_OUT => tc_src_ip(4 * 32 - 1 downto 3 * 32), + TC_SRC_UDP_OUT => tc_src_udp(4 * 16 - 1 downto 3 * 16), + + TC_IP_SIZE_OUT => tc_ip_size(4 * 16 - 1 downto 3 * 16), + TC_UDP_SIZE_OUT => tc_udp_size(4 * 16 - 1 downto 3 * 16), + TC_FLAGS_OFFSET_OUT => tc_flags_size(4 * 16 - 1 downto 3 * 16), + + TC_BUSY_IN => TC_BUSY_IN, + + STAT_DATA_OUT => stat_data(4 * 32 - 1 downto 3 * 32), + STAT_ADDR_OUT => stat_addr(4 * 8 - 1 downto 3 * 8), + STAT_DATA_RDY_OUT => stat_rdy(3), + STAT_DATA_ACK_IN => stat_ack(3), + RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(4 * 16 - 1 downto 3 * 16), + SENT_FRAMES_OUT => SENT_FRAMES_OUT(4 * 16 - 1 downto 3 * 16), -- END OF INTERFACE - GSC_CLK_IN => GSC_CLK_IN, - GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, - GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, - GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, - GSC_INIT_READ_IN => GSC_INIT_READ_IN, - GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, - GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, - GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, - GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, - GSC_BUSY_IN => GSC_BUSY_IN, + GSC_CLK_IN => GSC_CLK_IN, + GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, + GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, + GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, + GSC_INIT_READ_IN => GSC_INIT_READ_IN, + GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, + GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, + GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, + GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, + GSC_BUSY_IN => GSC_BUSY_IN, - MAKE_RESET_OUT => MAKE_RESET_OUT, + MAKE_RESET_OUT => MAKE_RESET_OUT, - DEBUG_OUT => PROTOS_DEBUG_OUT(3 * 32 - 1 downto 2 * 32) + DEBUG_OUT => PROTOS_DEBUG_OUT(4 * 32 - 1 downto 3 * 32) ); -TrbNetData : trb_net16_gbe_response_constructor_TrbNetData +--stat_gen : if g_SIMULATE = 0 generate +Stat : trb_net16_gbe_response_constructor_Stat +generic map( STAT_ADDRESS_BASE => 10 +) port map ( - CLK => CLK, - RESET => RESET, + CLK => CLK, + RESET => RESET, -- INTERFACE - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(3), - PS_RESPONSE_READY_OUT => resp_ready(3), - PS_BUSY_OUT => busy(3), - PS_SELECTED_IN => selected(3), - - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(4 * 9 - 1 downto 3 * 9), - TC_FRAME_SIZE_OUT => tc_size(4 * 16 - 1 downto 3 * 16), - TC_FRAME_TYPE_OUT => tc_type(4 * 16 - 1 downto 3 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(4 * 8 - 1 downto 3 * 8), - TC_IDENT_OUT => tc_ident(4 * 16 - 1 downto 3 * 16), - - TC_DEST_MAC_OUT => tc_mac(4 * 48 - 1 downto 3 * 48), - TC_DEST_IP_OUT => tc_ip(4 * 32 - 1 downto 3 * 32), - TC_DEST_UDP_OUT => tc_udp(4 * 16 - 1 downto 3 * 16), - TC_SRC_MAC_OUT => tc_src_mac(4 * 48 - 1 downto 3 * 48), - TC_SRC_IP_OUT => tc_src_ip(4 * 32 - 1 downto 3 * 32), - TC_SRC_UDP_OUT => tc_src_udp(4 * 16 - 1 downto 3 * 16), - - STAT_DATA_OUT => stat_data(4 * 32 - 1 downto 3 * 32), - STAT_ADDR_OUT => stat_addr(4 * 8 - 1 downto 3 * 8), - STAT_DATA_RDY_OUT => stat_rdy(3), - STAT_DATA_ACK_IN => stat_ack(3), - RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(4 * 16 - 1 downto 3 * 16), - SENT_FRAMES_OUT => SENT_FRAMES_OUT(4 * 16 - 1 downto 3 * 16), --- END OF INTERFACE - - -- CTS interface - CTS_NUMBER_IN => CTS_NUMBER_IN, - CTS_CODE_IN => CTS_CODE_IN, - CTS_INFORMATION_IN => CTS_INFORMATION_IN, - CTS_READOUT_TYPE_IN => CTS_READOUT_TYPE_IN, - CTS_START_READOUT_IN => CTS_START_READOUT_IN, - CTS_DATA_OUT => CTS_DATA_OUT, - CTS_DATAREADY_OUT => CTS_DATAREADY_OUT, - CTS_READOUT_FINISHED_OUT => CTS_READOUT_FINISHED_OUT, - CTS_READ_IN => CTS_READ_IN, - CTS_LENGTH_OUT => CTS_LENGTH_OUT, - CTS_ERROR_PATTERN_OUT => CTS_ERROR_PATTERN_OUT, - -- Data payload interface - FEE_DATA_IN => FEE_DATA_IN, - FEE_DATAREADY_IN => FEE_DATAREADY_IN, - FEE_READ_OUT => FEE_READ_OUT, - FEE_STATUS_BITS_IN => FEE_STATUS_BITS_IN, - FEE_BUSY_IN => FEE_BUSY_IN, - -- ip configurator - SLV_ADDR_IN => SLV_ADDR_IN, - SLV_READ_IN => SLV_READ_IN, - SLV_WRITE_IN => SLV_WRITE_IN, - SLV_BUSY_OUT => SLV_BUSY_OUT, - SLV_ACK_OUT => SLV_ACK_OUT, - SLV_DATA_IN => SLV_DATA_IN, - SLV_DATA_OUT => SLV_DATA_OUT, - - CFG_GBE_ENABLE_IN => CFG_GBE_ENABLE_IN, - CFG_IPU_ENABLE_IN => CFG_IPU_ENABLE_IN, - CFG_MULT_ENABLE_IN => CFG_MULT_ENABLE_IN, - --- debug - DEBUG_OUT => open + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(4), + PS_RESPONSE_READY_OUT => resp_ready(4), + PS_BUSY_OUT => busy(4), + PS_SELECTED_IN => selected(4), + + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, + + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(5 * 9 - 1 downto 4 * 9), + TC_FRAME_SIZE_OUT => tc_size(5 * 16 - 1 downto 4 * 16), + TC_FRAME_TYPE_OUT => tc_type(5 * 16 - 1 downto 4 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(5 * 8 - 1 downto 4 * 8), + + TC_DEST_MAC_OUT => tc_mac(5 * 48 - 1 downto 4 * 48), + TC_DEST_IP_OUT => tc_ip(5 * 32 - 1 downto 4 * 32), + TC_DEST_UDP_OUT => tc_udp(5 * 16 - 1 downto 4 * 16), + TC_SRC_MAC_OUT => tc_src_mac(5 * 48 - 1 downto 4 * 48), + TC_SRC_IP_OUT => tc_src_ip(5 * 32 - 1 downto 4 * 32), + TC_SRC_UDP_OUT => tc_src_udp(5 * 16 - 1 downto 4 * 16), + + TC_IP_SIZE_OUT => tc_ip_size(5 * 16 - 1 downto 4 * 16), + TC_UDP_SIZE_OUT => tc_udp_size(5 * 16 - 1 downto 4 * 16), + TC_FLAGS_OFFSET_OUT => tc_flags_size(5 * 16 - 1 downto 4 * 16), + + TC_BUSY_IN => TC_BUSY_IN, + + STAT_DATA_OUT => stat_data(5 * 32 - 1 downto 4 * 32), + STAT_ADDR_OUT => stat_addr(5 * 8 - 1 downto 4 * 8), + STAT_DATA_RDY_OUT => stat_rdy(4), + STAT_DATA_ACK_IN => stat_ack(4), + + RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(5 * 16 - 1 downto 4 * 16), + SENT_FRAMES_OUT => SENT_FRAMES_OUT(5 * 16 - 1 downto 4 * 16), + DEBUG_OUT => PROTOS_DEBUG_OUT(5 * 32 - 1 downto 4 * 32), + + STAT_DATA_IN => stat_data, + STAT_ADDR_IN => stat_addr, + STAT_DATA_RDY_IN => stat_rdy, + STAT_DATA_ACK_OUT => stat_ack ); - ---stat_gen : if g_SIMULATE = 0 generate ---Stat : trb_net16_gbe_response_constructor_Stat ---generic map( STAT_ADDRESS_BASE => 10 ---) ---port map ( --- CLK => CLK, --- RESET => RESET, --- ----- INTERFACE --- PS_DATA_IN => PS_DATA_IN, --- PS_WR_EN_IN => PS_WR_EN_IN, --- PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(4), --- PS_RESPONSE_READY_OUT => resp_ready(4), --- PS_BUSY_OUT => busy(4), --- PS_SELECTED_IN => selected(4), --- --- PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, --- PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, --- PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, --- PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, --- PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, --- PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, --- --- TC_WR_EN_OUT => TC_WR_EN_OUT, --- TC_DATA_OUT => tc_data(5 * 9 - 1 downto 4 * 9), --- TC_FRAME_SIZE_OUT => tc_size(5 * 16 - 1 downto 4 * 16), --- TC_FRAME_TYPE_OUT => tc_type(5 * 16 - 1 downto 4 * 16), --- TC_IP_PROTOCOL_OUT => tc_ip_proto(5 * 8 - 1 downto 4 * 8), --- --- TC_DEST_MAC_OUT => tc_mac(5 * 48 - 1 downto 4 * 48), --- TC_DEST_IP_OUT => tc_ip(5 * 32 - 1 downto 4 * 32), --- TC_DEST_UDP_OUT => tc_udp(5 * 16 - 1 downto 4 * 16), --- TC_SRC_MAC_OUT => tc_src_mac(5 * 48 - 1 downto 4 * 48), --- TC_SRC_IP_OUT => tc_src_ip(5 * 32 - 1 downto 4 * 32), --- TC_SRC_UDP_OUT => tc_src_udp(5 * 16 - 1 downto 4 * 16), --- --- TC_IP_SIZE_OUT => tc_ip_size(5 * 16 - 1 downto 4 * 16), --- TC_UDP_SIZE_OUT => tc_udp_size(5 * 16 - 1 downto 4 * 16), --- TC_FLAGS_OFFSET_OUT => tc_flags_size(5 * 16 - 1 downto 4 * 16), --- --- TC_BUSY_IN => TC_BUSY_IN, --- --- STAT_DATA_OUT => stat_data(5 * 32 - 1 downto 4 * 32), --- STAT_ADDR_OUT => stat_addr(5 * 8 - 1 downto 4 * 8), --- STAT_DATA_RDY_OUT => stat_rdy(4), --- STAT_DATA_ACK_IN => stat_ack(4), --- --- RECEIVED_FRAMES_OUT => RECEIVED_FRAMES_OUT(5 * 16 - 1 downto 4 * 16), --- SENT_FRAMES_OUT => SENT_FRAMES_OUT(5 * 16 - 1 downto 4 * 16), --- DEBUG_OUT => PROTOS_DEBUG_OUT(5 * 32 - 1 downto 4 * 32), --- --- STAT_DATA_IN => stat_data, --- STAT_ADDR_IN => stat_addr, --- STAT_DATA_RDY_IN => stat_rdy, --- STAT_DATA_ACK_OUT => stat_ack ---); --end generate; --*************** -- DO NOT TOUCH, response selection logic ---stat_data((c_MAX_PROTOCOLS + 1) * 32 - 1 downto c_MAX_PROTOCOLS * 32) <= STAT_DATA_IN; ---stat_addr((c_MAX_PROTOCOLS + 1) * 8 - 1 downto c_MAX_PROTOCOLS * 8) <= STAT_ADDR_IN; ---stat_rdy(c_MAX_PROTOCOLS) <= STAT_DATA_RDY_IN; ---STAT_DATA_ACK_OUT <= stat_ack(c_MAX_PROTOCOLS); +stat_data((c_MAX_PROTOCOLS + 1) * 32 - 1 downto c_MAX_PROTOCOLS * 32) <= STAT_DATA_IN; +stat_addr((c_MAX_PROTOCOLS + 1) * 8 - 1 downto c_MAX_PROTOCOLS * 8) <= STAT_ADDR_IN; +stat_rdy(c_MAX_PROTOCOLS) <= STAT_DATA_RDY_IN; +STAT_DATA_ACK_OUT <= stat_ack(c_MAX_PROTOCOLS); + +mult <= or_all(resp_ready(2 downto 0)) and or_all(resp_ready(4 downto 3)); ---mult <= or_all(resp_ready(2 downto 0)); --or_all(resp_ready(2 downto 0)) and or_all(resp_ready(4 downto 3)); PS_BUSY_OUT <= busy; @@ -538,12 +444,13 @@ begin end if; end process SELECT_MACHINE_PROC; -SELECT_MACHINE : process(select_current_state, MC_BUSY_IN, resp_ready, index, zeros) +SELECT_MACHINE : process(select_current_state, MC_BUSY_IN, resp_ready, index) begin case (select_current_state) is when IDLE => + state <= x"1"; if (MC_BUSY_IN = '0') then select_next_state <= LOOP_OVER; else @@ -551,19 +458,19 @@ begin end if; when LOOP_OVER => - if (resp_ready /= zeros) then + state <= x"2"; + if (or_all(resp_ready) = '1') then if (resp_ready(index) = '1') then select_next_state <= SELECT_ONE; elsif (index = c_MAX_PROTOCOLS) then select_next_state <= CLEANUP; - else - select_next_state <= LOOP_OVER; end if; else select_next_state <= CLEANUP; - end if; - + end if; + when SELECT_ONE => + state <= x"3"; if (MC_BUSY_IN = '1') then select_next_state <= PROCESS_REQUEST; else @@ -571,6 +478,7 @@ begin end if; when PROCESS_REQUEST => + state <= x"4"; if (MC_BUSY_IN = '0') then select_next_state <= CLEANUP; else @@ -578,6 +486,7 @@ begin end if; when CLEANUP => + state <= x"5"; select_next_state <= IDLE; end case; @@ -589,7 +498,7 @@ begin if rising_edge(CLK) then if (RESET = '1') or (select_current_state = IDLE) then index <= 0; - elsif (select_current_state = LOOP_OVER and resp_ready(index) = '0') then -- and (or_all(resp_ready) = '1' or mult = '1')) then + elsif (select_current_state = LOOP_OVER and resp_ready(index) = '0' and (or_all(resp_ready) = '1' or mult = '1')) then index <= index + 1; end if; end if; @@ -609,7 +518,9 @@ begin TC_SRC_IP_OUT <= (others => '0'); TC_SRC_UDP_OUT <= (others => '0'); TC_IP_PROTOCOL_OUT <= (others => '0'); - TC_IDENT_OUT <= (others => '0'); + TC_IP_SIZE_OUT <= (others => '0'); + TC_UDP_SIZE_OUT <= (others => '0'); + TC_FLAGS_OFFSET_OUT <= (others => '0'); PS_RESPONSE_READY_OUT <= '0'; selected <= (others => '0'); elsif (select_current_state = SELECT_ONE or select_current_state = PROCESS_REQUEST) then @@ -623,14 +534,15 @@ begin TC_SRC_IP_OUT <= tc_src_ip((index + 1) * 32 - 1 downto index * 32); TC_SRC_UDP_OUT <= tc_src_udp((index + 1) * 16 - 1 downto index * 16); TC_IP_PROTOCOL_OUT <= tc_ip_proto((index + 1) * 8 - 1 downto index * 8); - TC_IDENT_OUT <= tc_ident((index + 1) * 16 - 1 downto index * 16); + TC_IP_SIZE_OUT <= tc_ip_size((index + 1) * 16 - 1 downto index * 16); + TC_UDP_SIZE_OUT <= tc_udp_size((index + 1) * 16 - 1 downto index * 16); + TC_FLAGS_OFFSET_OUT <= tc_flags_size((index + 1) * 16 - 1 downto index * 16); if (select_current_state = SELECT_ONE) then PS_RESPONSE_READY_OUT <= '1'; - selected(index) <= '0'; else PS_RESPONSE_READY_OUT <= '0'; - selected(index) <= '1'; end if; + selected(index) <= '1'; else TC_DATA_OUT <= (others => '0'); TC_FRAME_SIZE_OUT <= (others => '0'); @@ -642,13 +554,126 @@ begin TC_SRC_IP_OUT <= (others => '0'); TC_SRC_UDP_OUT <= (others => '0'); TC_IP_PROTOCOL_OUT <= (others => '0'); - TC_IDENT_OUT <= (others => '0'); + TC_IP_SIZE_OUT <= (others => '0'); + TC_UDP_SIZE_OUT <= (others => '0'); + TC_FLAGS_OFFSET_OUT <= (others => '0'); PS_RESPONSE_READY_OUT <= '0'; selected <= (others => '0'); end if; end if; end process SELECTOR_PROC; +--SELECTOR_PROC : process(CLK) +-- variable found : boolean := false; +-- variable index : integer range 0 to c_MAX_PROTOCOLS - 1 := 0; +--begin +-- if rising_edge(CLK) then +-- +-- selected <= (others => '0'); +-- +-- if (RESET = '1') then +-- TC_DATA_OUT <= (others => '0'); +-- TC_FRAME_SIZE_OUT <= (others => '0'); +-- TC_FRAME_TYPE_OUT <= (others => '0'); +-- TC_DEST_MAC_OUT <= (others => '0'); +-- TC_DEST_IP_OUT <= (others => '0'); +-- TC_DEST_UDP_OUT <= (others => '0'); +-- TC_SRC_MAC_OUT <= (others => '0'); +-- TC_SRC_IP_OUT <= (others => '0'); +-- TC_SRC_UDP_OUT <= (others => '0'); +-- TC_IP_PROTOCOL_OUT <= (others => '0'); +-- TC_IP_SIZE_OUT <= (others => '0'); +-- TC_UDP_SIZE_OUT <= (others => '0'); +-- TC_FLAGS_OFFSET_OUT <= (others => '0'); +-- PS_RESPONSE_READY_OUT <= '0'; +-- selected <= (others => '0'); +-- found := false; +-- index := 0; +-- else +-- if (or_all(resp_ready) = '1' and MC_BUSY_IN = '0') then +-- for i in 0 to c_MAX_PROTOCOLS - 1 loop +-- if (resp_ready(i) = '1' and found = false) then +-- TC_DATA_OUT <= tc_data((i + 1) * 9 - 1 downto i * 9); +-- TC_FRAME_SIZE_OUT <= tc_size((i + 1) * 16 - 1 downto i * 16); +-- TC_FRAME_TYPE_OUT <= tc_type((i + 1) * 16 - 1 downto i * 16); +-- TC_DEST_MAC_OUT <= tc_mac((i + 1) * 48 - 1 downto i * 48); +-- TC_DEST_IP_OUT <= tc_ip((i + 1) * 32 - 1 downto i * 32); +-- TC_DEST_UDP_OUT <= tc_udp((i + 1) * 16 - 1 downto i * 16); +-- TC_SRC_MAC_OUT <= tc_src_mac((i + 1) * 48 - 1 downto i * 48); +-- TC_SRC_IP_OUT <= tc_src_ip((i + 1) * 32 - 1 downto i * 32); +-- TC_SRC_UDP_OUT <= tc_src_udp((i + 1) * 16 - 1 downto i * 16); +-- TC_IP_PROTOCOL_OUT <= tc_ip_proto((i + 1) * 8 - 1 downto i * 8); +-- TC_IP_SIZE_OUT <= tc_ip_size((i + 1) * 16 - 1 downto i * 16); +-- TC_UDP_SIZE_OUT <= tc_udp_size((i + 1) * 16 - 1 downto i * 16); +-- TC_FLAGS_OFFSET_OUT <= tc_flags_size((i + 1) * 16 - 1 downto i * 16); +-- PS_RESPONSE_READY_OUT <= '1'; +-- selected(i) <= '1'; +-- index := i; +-- found := true; +---- elsif (i = c_MAX_PROTOCOLS - 1) and (resp_ready(i) = '0') and (found = false) then +---- found := false; +---- PS_RESPONSE_READY_OUT <= '0'; +-- end if; +-- end loop; +-- elsif (or_all(resp_ready) = '1' and MC_BUSY_IN = '1') then +-- TC_DATA_OUT <= tc_data((index + 1) * 9 - 1 downto index * 9); +-- TC_FRAME_SIZE_OUT <= tc_size((index + 1) * 16 - 1 downto index * 16); +-- TC_FRAME_TYPE_OUT <= tc_type((index + 1) * 16 - 1 downto index * 16); +-- TC_DEST_MAC_OUT <= tc_mac((index + 1) * 48 - 1 downto index * 48); +-- TC_DEST_IP_OUT <= tc_ip((index + 1) * 32 - 1 downto index * 32); +-- TC_DEST_UDP_OUT <= tc_udp((index + 1) * 16 - 1 downto index * 16); +-- TC_SRC_MAC_OUT <= tc_src_mac((index + 1) * 48 - 1 downto index * 48); +-- TC_SRC_IP_OUT <= tc_src_ip((index + 1) * 32 - 1 downto index * 32); +-- TC_SRC_UDP_OUT <= tc_src_udp((index + 1) * 16 - 1 downto index * 16); +-- TC_IP_PROTOCOL_OUT <= tc_ip_proto((index + 1) * 8 - 1 downto index * 8); +-- TC_IP_SIZE_OUT <= tc_ip_size((index + 1) * 16 - 1 downto index * 16); +-- TC_UDP_SIZE_OUT <= tc_udp_size((index + 1) * 16 - 1 downto index * 16); +-- TC_FLAGS_OFFSET_OUT <= tc_flags_size((index + 1) * 16 - 1 downto index * 16); +-- PS_RESPONSE_READY_OUT <= '1'; +-- selected(index) <= '1'; +-- index := index; +-- found := true; +-- elsif (MC_BUSY_IN = '0') then +-- TC_DATA_OUT <= (others => '0'); +-- TC_FRAME_SIZE_OUT <= (others => '0'); +-- TC_FRAME_TYPE_OUT <= (others => '0'); +-- TC_DEST_MAC_OUT <= (others => '0'); +-- TC_DEST_IP_OUT <= (others => '0'); +-- TC_DEST_UDP_OUT <= (others => '0'); +-- TC_SRC_MAC_OUT <= (others => '0'); +-- TC_SRC_IP_OUT <= (others => '0'); +-- TC_SRC_UDP_OUT <= (others => '0'); +-- TC_IP_PROTOCOL_OUT <= (others => '0'); +-- TC_IP_SIZE_OUT <= (others => '0'); +-- TC_UDP_SIZE_OUT <= (others => '0'); +-- TC_FLAGS_OFFSET_OUT <= (others => '0'); +-- PS_RESPONSE_READY_OUT <= '0'; +-- found := false; +-- index := 0; +-- else +-- TC_DATA_OUT <= (others => '0'); +-- TC_FRAME_SIZE_OUT <= (others => '0'); +-- TC_FRAME_TYPE_OUT <= (others => '0'); +-- TC_DEST_MAC_OUT <= (others => '0'); +-- TC_DEST_IP_OUT <= (others => '0'); +-- TC_DEST_UDP_OUT <= (others => '0'); +-- TC_SRC_MAC_OUT <= (others => '0'); +-- TC_SRC_IP_OUT <= (others => '0'); +-- TC_SRC_UDP_OUT <= (others => '0'); +-- TC_IP_PROTOCOL_OUT <= (others => '0'); +-- TC_IP_SIZE_OUT <= (others => '0'); +-- TC_UDP_SIZE_OUT <= (others => '0'); +-- TC_FLAGS_OFFSET_OUT <= (others => '0'); +-- PS_RESPONSE_READY_OUT <= '0'; +-- found := false; +-- index := 0; +-- end if; +-- end if; +-- +-- end if; +--end process SELECTOR_PROC; +-- *********** + end trb_net16_gbe_protocol_selector; diff --git a/gbe2_ecp3/trb_net16_gbe_receive_control.vhd b/gbe2_ecp3/trb_net16_gbe_receive_control.vhd index 08d4534..549ffbf 100644 --- a/gbe2_ecp3/trb_net16_gbe_receive_control.vhd +++ b/gbe2_ecp3/trb_net16_gbe_receive_control.vhd @@ -67,11 +67,9 @@ architecture trb_net16_gbe_receive_control of trb_net16_gbe_receive_control is --attribute HGROUP : string; --attribute HGROUP of trb_net16_gbe_receive_control : architecture is "GBE_MAIN_group"; -attribute syn_encoding : string; -type load_states is (IDLE, PREPARE, WAIT_ONE, READY); +type load_states is (IDLE, PREPARE, READY); signal load_current_state, load_next_state : load_states; -attribute syn_encoding of load_current_state : signal is "onehot"; signal frames_received_ctr : std_logic_vector(31 downto 0); signal frames_readout_ctr : std_logic_vector(31 downto 0); @@ -80,7 +78,6 @@ signal bytes_rec_ctr : std_logic_vector(31 downto 0); signal state : std_logic_vector(3 downto 0); signal proto_code : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); signal reset_prioritizer : std_logic; -signal frame_waiting : std_logic; -- debug only signal saved_proto : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); @@ -99,14 +96,14 @@ RC_DEST_UDP_PORT_OUT <= FR_DEST_UDP_PORT_IN; protocol_prioritizer : trb_net16_gbe_protocol_prioritizer port map( - CLK => CLK, - RESET => reset_prioritizer, + CLK => CLK, + RESET => reset_prioritizer, FRAME_TYPE_IN => FR_FRAME_PROTO_IN, PROTOCOL_CODE_IN => FR_IP_PROTOCOL_IN, UDP_PROTOCOL_IN => FR_DEST_UDP_PORT_IN, - CODE_OUT => proto_code + CODE_OUT => proto_code ); reset_prioritizer <= '1' when load_current_state = IDLE else '0'; @@ -114,10 +111,10 @@ reset_prioritizer <= '1' when load_current_state = IDLE else '0'; --RC_FRAME_PROTO_OUT <= proto_code when (and_all(proto_code) = '0') else (others => '0'); RC_FRAME_PROTO_OUT <= proto_code; -- no more ones as the incorrect value, last slot for Trash ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(11 downto 4) <= frames_received_ctr(7 downto 0); ---DEBUG_OUT(19 downto 12) <= frames_readout_ctr(7 downto 0); ---DEBUG_OUT(31 downto 20) <= bytes_rec_ctr(11 downto 0); +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(11 downto 4) <= frames_received_ctr(7 downto 0); +DEBUG_OUT(19 downto 12) <= frames_readout_ctr(7 downto 0); +DEBUG_OUT(31 downto 20) <= bytes_rec_ctr(11 downto 0); LOAD_MACHINE_PROC : process(CLK) begin @@ -144,10 +141,7 @@ begin when PREPARE => -- prepare frame size state <= x"2"; - load_next_state <= WAIT_ONE; --READY; - - when WAIT_ONE => - load_next_state <= READY; + load_next_state <= READY; when READY => -- wait for reading out the whole frame state <= x"3"; @@ -160,41 +154,22 @@ begin end case; end process LOAD_MACHINE; -process(CLK) +FR_GET_FRAME_OUT <= '1' when (load_current_state = PREPARE) + else '0'; + +RC_FRAME_WAITING_OUT <= '1' when (load_current_state = READY) + else '0'; + +SYNC_PROC : process(CLK) begin - if rising_edge(CLK) then - if (load_current_state = PREPARE) then - FR_GET_FRAME_OUT <= '1'; - else - FR_GET_FRAME_OUT <= '0'; - end if; - - if (load_current_state = READY and RC_LOADING_DONE_IN = '0') then - RC_FRAME_WAITING_OUT <= '1'; - else - RC_FRAME_WAITING_OUT <= '0'; - end if; - - --RC_FRAME_WAITING_OUT <= frame_waiting; - end if; -end process; - ---FR_GET_FRAME_OUT <= '1' when (load_current_state = PREPARE) --- else '0'; --- ---RC_FRAME_WAITING_OUT <= '1' when (load_current_state = READY) --- else '0'; - ---SYNC_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- FRAMES_RECEIVED_OUT <= frames_received_ctr; --- --BYTES_RECEIVED_OUT <= bytes_rec_ctr; --- BYTES_RECEIVED_OUT(15 downto 0) <= bytes_rec_ctr(15 downto 0); --- BYTES_RECEIVED_OUT(16 + c_MAX_PROTOCOLS - 1 downto 16) <= saved_proto; --- BYTES_RECEIVED_OUT(31 downto 16 + c_MAX_PROTOCOLS) <= (others => '0'); --- end if; ---end process SYNC_PROC; + if rising_edge(CLK) then + FRAMES_RECEIVED_OUT <= frames_received_ctr; + --BYTES_RECEIVED_OUT <= bytes_rec_ctr; + BYTES_RECEIVED_OUT(15 downto 0) <= bytes_rec_ctr(15 downto 0); + BYTES_RECEIVED_OUT(16 + c_MAX_PROTOCOLS - 1 downto 16) <= saved_proto; + BYTES_RECEIVED_OUT(31 downto 16 + c_MAX_PROTOCOLS) <= (others => '0'); + end if; +end process SYNC_PROC; FRAMES_REC_CTR_PROC : process(CLK) begin @@ -218,7 +193,6 @@ begin end if; end process FRAMES_READOUT_CTR_PROC; --- debug only BYTES_REC_CTR_PROC : process(CLK) begin if rising_edge(CLK) then @@ -230,6 +204,7 @@ begin end if; end process BYTES_REC_CTR_PROC; +-- debug only SAVED_PROTO_PROC : process(CLK) begin if rising_edge(CLK) then diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_ARP.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_ARP.vhd index 6e48567..5c29a45 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_ARP.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_ARP.vhd @@ -22,31 +22,35 @@ port ( RESET : in std_logic; -- INTERFACE - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); + PS_DATA_IN : in std_logic_vector(8 downto 0); + PS_WR_EN_IN : in std_logic; + PS_ACTIVATE_IN : in std_logic; + PS_RESPONSE_READY_OUT : out std_logic; + PS_BUSY_OUT : out std_logic; + PS_SELECTED_IN : in std_logic; + PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); + PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); + TC_RD_EN_IN : in std_logic; + TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -71,12 +75,11 @@ attribute syn_encoding : string; type dissect_states is (IDLE, READ_FRAME, DECIDE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP); signal dissect_current_state, dissect_next_state : dissect_states; -attribute syn_encoding of dissect_current_state: signal is "onehot"; +attribute syn_encoding of dissect_current_state: signal is "safe,gray"; type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); signal stats_current_state, stats_next_state : stats_states; -attribute syn_encoding of stats_current_state : signal is "onehot"; - +attribute syn_encoding of stats_current_state : signal is "safe,gray"; signal saved_opcode : std_logic_vector(15 downto 0); signal saved_sender_ip : std_logic_vector(31 downto 0); signal saved_target_ip : std_logic_vector(31 downto 0); @@ -89,8 +92,6 @@ signal rec_frames : std_logic_vector(15 downto 0); signal sent_frames : std_logic_vector(15 downto 0); signal stat_data_temp : std_logic_vector(31 downto 0); -signal tc_wr : std_logic; - attribute syn_preserve : boolean; attribute syn_keep : boolean; attribute syn_keep of state : signal is true; @@ -119,7 +120,7 @@ begin end if; end process DISSECT_MACHINE_PROC; -DISSECT_MACHINE : process(dissect_current_state, g_MY_IP, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, data_ctr, PS_SELECTED_IN, saved_target_ip) +DISSECT_MACHINE : process(dissect_current_state, g_MY_IP, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, TC_BUSY_IN, data_ctr, PS_SELECTED_IN, saved_target_ip) begin case dissect_current_state is @@ -150,7 +151,7 @@ begin when WAIT_FOR_LOAD => state <= x"4"; - if (PS_SELECTED_IN = '1') then + if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then dissect_next_state <= LOAD_FRAME; else dissect_next_state <= WAIT_FOR_LOAD; @@ -174,31 +175,18 @@ end process DISSECT_MACHINE; DATA_CTR_PROC : process(CLK) begin if rising_edge(CLK) then - if (RESET = '1') or (dissect_current_state = IDLE and PS_WR_EN_IN = '0') then - data_ctr <= 1; - elsif (dissect_current_state = WAIT_FOR_LOAD) then + if (RESET = '1') or (dissect_current_state = IDLE and PS_WR_EN_IN = '0') or (dissect_current_state = WAIT_FOR_LOAD) then data_ctr <= 1; elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then data_ctr <= data_ctr + 1; elsif (dissect_current_state = READ_FRAME and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then -- in case of saving data from incoming frame data_ctr <= data_ctr + 1; - elsif (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1' and TC_RD_EN_IN = '1') then -- in case of constructing response + elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then -- in case of constructing response data_ctr <= data_ctr + 1; end if; end if; end process DATA_CTR_PROC; ---TC_WR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1') then --- tc_wr <= '1'; --- else --- tc_wr <= '0'; --- end if; --- end if; ---end process TC_WR_PROC; - SAVE_VALUES_PROC : process(CLK) begin if rising_edge(CLK) then @@ -209,28 +197,28 @@ begin elsif (dissect_current_state = READ_FRAME) then case (data_ctr) is - when 6 => - saved_opcode(7 downto 0) <= PS_DATA_IN(7 downto 0); when 7 => + saved_opcode(7 downto 0) <= PS_DATA_IN(7 downto 0); + when 8 => saved_opcode(15 downto 8) <= PS_DATA_IN(7 downto 0); - when 13 => - saved_sender_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); when 14 => - saved_sender_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + saved_sender_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); when 15 => - saved_sender_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + saved_sender_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); when 16 => + saved_sender_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when 17 => saved_sender_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); - when 23 => - saved_target_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); when 24 => - saved_target_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + saved_target_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); when 25 => - saved_target_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + saved_target_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); when 26 => + saved_target_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when 27 => saved_target_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); when others => null; @@ -241,27 +229,31 @@ end process SAVE_VALUES_PROC; TC_DATA_PROC : process(dissect_current_state, data_ctr, values) begin - if rising_edge(CLK) then - tc_data(8) <= '0'; - - if (dissect_current_state = LOAD_FRAME) then - for i in 0 to 7 loop - tc_data(i) <= values((data_ctr - 1) * 8 + i); - end loop; - -- mark the last byte - if (data_ctr = 28) then - tc_data(8) <= '1'; - end if; - else - tc_data(7 downto 0) <= (others => '0'); + tc_data(8) <= '0'; + + if (dissect_current_state = LOAD_FRAME) then + for i in 0 to 7 loop + tc_data(i) <= values((data_ctr - 1) * 8 + i); + end loop; + -- mark the last byte + if (data_ctr = 28) then + tc_data(8) <= '1'; end if; - - TC_DATA_OUT <= tc_data; - - end if; + else + tc_data(7 downto 0) <= (others => '0'); + end if; + end process TC_DATA_PROC; ---TC_WR_EN_OUT <= tc_wr; +TC_DATA_SYNC : process(CLK) +begin + if rising_edge(CLK) then + TC_DATA_OUT <= tc_data; + end if; +end process TC_DATA_SYNC; + +--PS_BUSY_OUT <= '0' when (dissect_current_state = IDLE) else '1'; +--PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) else '0'; PS_RESPONSE_SYNC : process(CLK) begin @@ -282,134 +274,136 @@ end process PS_RESPONSE_SYNC; -TC_FRAME_SIZE_OUT <= x"001c"; -- fixed frame size +TC_FRAME_SIZE_OUT <= x"001c"; -- fixed frame size -TC_FRAME_TYPE_OUT <= x"0608"; -TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; -TC_DEST_IP_OUT <= x"00000000"; -- doesnt matter -TC_DEST_UDP_OUT <= x"0000"; -- doesnt matter -TC_SRC_MAC_OUT <= g_MY_MAC; -TC_SRC_IP_OUT <= x"00000000"; -- doesnt matter -TC_SRC_UDP_OUT <= x"0000"; -- doesnt matter -TC_IP_PROTOCOL_OUT <= x"00"; -- doesnt matter -TC_IDENT_OUT <= (others => '0'); -- doesn't matter +TC_FRAME_TYPE_OUT <= x"0608"; +TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; +TC_DEST_IP_OUT <= x"00000000"; -- doesnt matter +TC_DEST_UDP_OUT <= x"0000"; -- doesnt matter +TC_SRC_MAC_OUT <= g_MY_MAC; +TC_SRC_IP_OUT <= x"00000000"; -- doesnt matter +TC_SRC_UDP_OUT <= x"0000"; -- doesnt matter +TC_IP_PROTOCOL_OUT <= x"00"; -- doesnt matter +TC_IP_SIZE_OUT <= (others => '0'); -- doesn't matter +TC_UDP_SIZE_OUT <= (others => '0'); -- doesn't matter +TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter -- **** statistice ---REC_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- rec_frames <= (others => '0'); --- elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then --- rec_frames <= rec_frames + x"1"; --- end if; --- end if; ---end process REC_FRAMES_PROC; --- ---SENT_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- sent_frames <= (others => '0'); --- elsif (dissect_current_state = CLEANUP) then --- sent_frames <= sent_frames + x"1"; --- end if; --- end if; ---end process SENT_FRAMES_PROC; --- ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, dissect_current_state) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = CLEANUP) then --- stats_next_state <= LOAD_SENT; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_SENT => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_RECEIVED; --- else --- stats_next_state <= LOAD_SENT; --- end if; --- --- when LOAD_RECEIVED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_RECEIVED; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---SELECTOR : process(CLK) ---begin --- if rising_edge(CLK) then --- case(stats_current_state) is --- --- when LOAD_SENT => --- stat_data_temp <= x"0601" & sent_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); --- --- when LOAD_RECEIVED => --- stat_data_temp <= x"0602" & rec_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); --- --- when others => --- stat_data_temp <= (others => '0'); --- STAT_ADDR_OUT <= (others => '0'); --- --- end case; --- end if; ---end process SELECTOR; --- ---STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); ---STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); ---STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); ---STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); --- ---STAT_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then --- STAT_DATA_RDY_OUT <= '1'; --- else --- STAT_DATA_RDY_OUT <= '0'; --- end if; --- end if; ---end process STAT_SYNC; -----STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; --- ----- **** debug ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(4) <= '0'; ---DEBUG_OUT(7 downto 5) <= "000"; ---DEBUG_OUT(8) <= '0'; ---DEBUG_OUT(11 downto 9) <= "000"; ---DEBUG_OUT(31 downto 12) <= (others => '0'); ----- **** +REC_FRAMES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + rec_frames <= (others => '0'); + elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then + rec_frames <= rec_frames + x"1"; + end if; + end if; +end process REC_FRAMES_PROC; + +SENT_FRAMES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + sent_frames <= (others => '0'); + elsif (dissect_current_state = CLEANUP) then + sent_frames <= sent_frames + x"1"; + end if; + end if; +end process SENT_FRAMES_PROC; + +RECEIVED_FRAMES_OUT <= rec_frames; +SENT_FRAMES_OUT <= sent_frames; +STATS_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + stats_current_state <= IDLE; + else + stats_current_state <= stats_next_state; + end if; + end if; +end process STATS_MACHINE_PROC; + +STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, dissect_current_state) +begin + + case (stats_current_state) is + + when IDLE => + if (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = CLEANUP) then + stats_next_state <= LOAD_SENT; + else + stats_next_state <= IDLE; + end if; + + when LOAD_SENT => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= LOAD_RECEIVED; + else + stats_next_state <= LOAD_SENT; + end if; + + when LOAD_RECEIVED => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= CLEANUP; + else + stats_next_state <= LOAD_RECEIVED; + end if; + + when CLEANUP => + stats_next_state <= IDLE; + + end case; + +end process STATS_MACHINE; + +SELECTOR : process(CLK) +begin + if rising_edge(CLK) then + case(stats_current_state) is + + when LOAD_SENT => + stat_data_temp <= x"0601" & sent_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); + + when LOAD_RECEIVED => + stat_data_temp <= x"0602" & rec_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); + + when others => + stat_data_temp <= (others => '0'); + STAT_ADDR_OUT <= (others => '0'); + + end case; + end if; +end process SELECTOR; + +STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); +STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); +STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); +STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); + +STAT_SYNC : process(CLK) +begin + if rising_edge(CLK) then + if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then + STAT_DATA_RDY_OUT <= '1'; + else + STAT_DATA_RDY_OUT <= '0'; + end if; + end if; +end process STAT_SYNC; +--STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; + +-- **** debug +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(4) <= '0'; +DEBUG_OUT(7 downto 5) <= "000"; +DEBUG_OUT(8) <= '0'; +DEBUG_OUT(11 downto 9) <= "000"; +DEBUG_OUT(31 downto 12) <= (others => '0'); +-- **** end trb_net16_gbe_response_constructor_ARP; diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_DHCP.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_DHCP.vhd index 0045865..34d7f18 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_DHCP.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_DHCP.vhd @@ -40,13 +40,17 @@ port ( TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -74,20 +78,20 @@ attribute syn_encoding : string; type main_states is (BOOTING, SENDING_DISCOVER, WAITING_FOR_OFFER, SENDING_REQUEST, WAITING_FOR_ACK, ESTABLISHED); signal main_current_state, main_next_state : main_states; -attribute syn_encoding of main_current_state: signal is "onehot"; +attribute syn_encoding of main_current_state: signal is "safe,gray"; type receive_states is (IDLE, DISCARD, CLEANUP, SAVE_VALUES); signal receive_current_state, receive_next_state : receive_states; -attribute syn_encoding of receive_current_state: signal is "onehot"; +attribute syn_encoding of receive_current_state: signal is "safe,gray"; -type discover_states is (IDLE, WAIT_FOR_LOAD, BOOTP_HEADERS, CLIENT_IP, YOUR_IP, ZEROS1, MY_MAC, ZEROS2, VENDOR_VALS, VENDOR_VALS2, TERMINATION, CLEANUP); +type discover_states is (IDLE, BOOTP_HEADERS, CLIENT_IP, YOUR_IP, ZEROS1, MY_MAC, ZEROS2, VENDOR_VALS, VENDOR_VALS2, TERMINATION, CLEANUP); signal construct_current_state, construct_next_state : discover_states; -attribute syn_encoding of construct_current_state: signal is "onehot"; +attribute syn_encoding of construct_current_state: signal is "safe,gray"; type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, LOAD_DISCARDED, CLEANUP); signal stats_current_state, stats_next_state : stats_states; -attribute syn_encoding of stats_current_state : signal is "onehot"; +attribute syn_encoding of stats_current_state : signal is "safe,gray"; signal state : std_logic_vector(3 downto 0); signal rec_frames : std_logic_vector(15 downto 0); @@ -116,12 +120,13 @@ signal vendor_values2 : std_logic_vector(47 downto 0); signal discarded_ctr : std_logic_vector(15 downto 0); + signal stat_data_temp : std_logic_vector(31 downto 0); attribute syn_preserve : boolean; attribute syn_keep : boolean; -attribute syn_keep of state, state2 : signal is true; -attribute syn_preserve of state, state2 : signal is true; +attribute syn_keep of state : signal is true; +attribute syn_preserve of state : signal is true; begin @@ -448,25 +453,25 @@ begin end if; end process CONSTRUCT_MACHINE_PROC; -CONSTRUCT_MACHINE : process(construct_current_state, main_current_state, load_ctr, PS_SELECTED_IN) +CONSTRUCT_MACHINE : process(construct_current_state, main_current_state, load_ctr, TC_BUSY_IN, PS_SELECTED_IN) begin case construct_current_state is when IDLE => state <= x"1"; if (main_current_state = SENDING_DISCOVER) or (main_current_state = SENDING_REQUEST) then - construct_next_state <= WAIT_FOR_LOAD; + construct_next_state <= BOOTP_HEADERS; else construct_next_state <= IDLE; end if; - when WAIT_FOR_LOAD => - state <= x"2"; - if (PS_SELECTED_IN = '1') then - construct_next_state <= BOOTP_HEADERS; - else - construct_next_state <= WAIT_FOR_LOAD; - end if; +-- when WAIT_FOR_LOAD => +-- state <= x"2"; +-- if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then +-- construct_next_state <= BOOTP_HEADERS; +-- else +-- construct_next_state <= WAIT_FOR_LOAD; +-- end if; when BOOTP_HEADERS => @@ -556,92 +561,90 @@ begin if (RESET = '1') or (construct_current_state = IDLE) then load_ctr <= 0; elsif (TC_RD_EN_IN = '1') and (PS_SELECTED_IN = '1') then --- elsif (construct_current_state /= IDLE and construct_current_state /= CLEANUP and PS_SELECTED_IN = '1') then load_ctr <= load_ctr + 1; - else - load_ctr <= load_ctr; end if; end if; end process LOAD_CTR_PROC; ---TC_WR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (construct_current_state /= IDLE and construct_current_state /= CLEANUP and PS_SELECTED_IN = '1') then --- TC_WR_EN_OUT <= '1'; --- else --- TC_WR_EN_OUT <= '0'; --- end if; --- end if; ---end process TC_WR_PROC; - TC_DATA_PROC : process(CLK, construct_current_state, load_ctr, bootp_hdr, g_MY_MAC, main_current_state) begin + if rising_edge(CLK) then - case (construct_current_state) is - - when BOOTP_HEADERS => - for i in 0 to 7 loop - tc_data(i) <= bootp_hdr(load_ctr * 8 + i); - end loop; - tc_data(8) <= '0'; - - when CLIENT_IP => - if (main_current_state = SENDING_DISCOVER) then - tc_data(7 downto 0) <= x"00"; - elsif (main_current_state = SENDING_REQUEST) then - for i in 0 to 7 loop - tc_data(i) <= saved_proposed_ip((load_ctr - 12) * 8 + i); - end loop; - end if; - tc_data(8) <= '0'; - - when YOUR_IP => - tc_data(7 downto 0) <= x"00"; - tc_data(8) <= '0'; + + case (construct_current_state) is + + when BOOTP_HEADERS => + for i in 0 to 7 loop + tc_data(i) <= bootp_hdr(load_ctr * 8 + i); + end loop; + tc_data(8) <= '0'; - when ZEROS1 => + when CLIENT_IP => + if (main_current_state = SENDING_DISCOVER) then tc_data(7 downto 0) <= x"00"; - tc_data(8) <= '0'; - - when MY_MAC => + elsif (main_current_state = SENDING_REQUEST) then for i in 0 to 7 loop - tc_data(i) <= g_MY_MAC((load_ctr - 28) * 8 + i); + tc_data(i) <= saved_proposed_ip((load_ctr - 12) * 8 + i); end loop; - tc_data(8) <= '0'; + end if; + tc_data(8) <= '0'; + + when YOUR_IP => + tc_data(7 downto 0) <= x"00"; + tc_data(8) <= '0'; + + when ZEROS1 => + tc_data(7 downto 0) <= x"00"; + tc_data(8) <= '0'; + + when MY_MAC => + for i in 0 to 7 loop + tc_data(i) <= g_MY_MAC((load_ctr - 28) * 8 + i); + end loop; + tc_data(8) <= '0'; + + when ZEROS2 => + tc_data(7 downto 0) <= x"00"; + tc_data(8) <= '0'; - when ZEROS2 => - tc_data(7 downto 0) <= x"00"; - tc_data(8) <= '0'; - - when VENDOR_VALS => - for i in 0 to 7 loop - tc_data(i) <= vendor_values((load_ctr - 236) * 8 + i); - end loop; - tc_data(8) <= '0'; - - -- needed only for DHCP Request message - when VENDOR_VALS2 => - for i in 0 to 7 loop - tc_data(i) <= vendor_values2((load_ctr - 258) * 8 + i); - end loop; - tc_data(8) <= '0'; - - when TERMINATION => - tc_data(7 downto 0) <= x"ff"; - tc_data(8) <= '1'; + when VENDOR_VALS => + for i in 0 to 7 loop + tc_data(i) <= vendor_values((load_ctr - 236) * 8 + i); + end loop; + tc_data(8) <= '0'; - when others => - tc_data(7 downto 0) <= x"00"; - tc_data(8) <= '0'; + -- needed only for DHCP Request message + when VENDOR_VALS2 => + for i in 0 to 7 loop + tc_data(i) <= vendor_values2((load_ctr - 258) * 8 + i); + end loop; + tc_data(8) <= '0'; + + when TERMINATION => + tc_data(7 downto 0) <= x"ff"; + tc_data(8) <= '1'; - end case; - - TC_DATA_OUT <= tc_data; - + when others => + tc_data(7 downto 0) <= x"00"; + tc_data(8) <= '0'; + + end case; + end if; + end process; +--TC_DATA_SYNC : process(CLK) +--begin + --if rising_edge(CLK) then + TC_DATA_OUT <= tc_data; + --end if; +--end process TC_DATA_SYNC; + + +--PS_BUSY_OUT <= '0' when (construct_current_state = IDLE) else '1'; +--PS_RESPONSE_READY_OUT <= '0' when (construct_current_state = IDLE) else '1'; + PS_RESPONSE_SYNC : process(CLK) begin if rising_edge(CLK) then @@ -660,26 +663,27 @@ begin end process PS_RESPONSE_SYNC; -- fixed sizes for discover and request messages -TC_FRAME_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109"; +TC_FRAME_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109"; +TC_IP_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109"; +TC_UDP_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109"; -TC_FRAME_TYPE_OUT <= x"0008"; -- frame type: ip - -TC_IDENT_OUT <= x"1" & sent_frames(11 downto 0); +TC_FRAME_TYPE_OUT <= x"0008"; -- frame type: ip +TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter -- **** statistics ---REC_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- rec_frames <= (others => '0'); --- elsif (receive_current_state = SAVE_VALUES and PS_DATA_IN(8) = '1') then --- rec_frames <= rec_frames + x"1"; --- end if; --- end if; ---end process REC_FRAMES_PROC; --- --- needed for identification +REC_FRAMES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + rec_frames <= (others => '0'); + --elsif (receive_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then + elsif (receive_current_state = SAVE_VALUES and PS_DATA_IN(8) = '1') then + rec_frames <= rec_frames + x"1"; + end if; + end if; +end process REC_FRAMES_PROC; + SENT_FRAMES_PROC : process(CLK) begin if rising_edge(CLK) then @@ -690,122 +694,123 @@ begin end if; end if; end process SENT_FRAMES_PROC; --- ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; --- ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, STAT_DATA_ACK_IN, PS_DATA_IN, construct_current_state, receive_current_state) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if (receive_current_state = SAVE_VALUES and PS_DATA_IN(8) = '1') or (construct_current_state = CLEANUP) or (receive_current_state = DISCARD and PS_DATA_IN(8) = '1') then --- stats_next_state <= LOAD_SENT; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_SENT => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_RECEIVED; --- else --- stats_next_state <= LOAD_SENT; --- end if; --- --- when LOAD_RECEIVED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_DISCARDED; --- else --- stats_next_state <= LOAD_RECEIVED; --- end if; --- --- when LOAD_DISCARDED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_DISCARDED; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---SELECTOR : process(CLK) ---begin --- if rising_edge(CLK) then --- case(stats_current_state) is --- --- when LOAD_SENT => --- stat_data_temp <= x"0101" & sent_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); --- --- when LOAD_RECEIVED => --- stat_data_temp <= x"0102" & rec_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); --- --- when LOAD_DISCARDED => --- stat_data_temp <= x"0103" & discarded_ctr; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 2, 8)); --- --- when others => --- stat_data_temp <= (others => '0'); --- STAT_ADDR_OUT <= (others => '0'); --- --- end case; --- end if; --- ---end process SELECTOR; --- ---STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); ---STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); ---STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); ---STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); --- ---STAT_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then --- STAT_DATA_RDY_OUT <= '1'; --- else --- STAT_DATA_RDY_OUT <= '0'; --- end if; --- end if; ---end process STAT_SYNC; + +RECEIVED_FRAMES_OUT <= rec_frames; +SENT_FRAMES_OUT <= sent_frames; + +STATS_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + stats_current_state <= IDLE; + else + stats_current_state <= stats_next_state; + end if; + end if; +end process STATS_MACHINE_PROC; + +STATS_MACHINE : process(stats_current_state, STAT_DATA_ACK_IN, PS_DATA_IN, construct_current_state, receive_current_state) +begin + + case (stats_current_state) is + + when IDLE => + if (receive_current_state = SAVE_VALUES and PS_DATA_IN(8) = '1') or (construct_current_state = CLEANUP) or (receive_current_state = DISCARD and PS_DATA_IN(8) = '1') then + stats_next_state <= LOAD_SENT; + else + stats_next_state <= IDLE; + end if; + + when LOAD_SENT => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= LOAD_RECEIVED; + else + stats_next_state <= LOAD_SENT; + end if; + + when LOAD_RECEIVED => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= LOAD_DISCARDED; + else + stats_next_state <= LOAD_RECEIVED; + end if; + + when LOAD_DISCARDED => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= CLEANUP; + else + stats_next_state <= LOAD_DISCARDED; + end if; + + when CLEANUP => + stats_next_state <= IDLE; + + end case; + +end process STATS_MACHINE; + +SELECTOR : process(CLK) +begin + if rising_edge(CLK) then + case(stats_current_state) is + + when LOAD_SENT => + stat_data_temp <= x"0101" & sent_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); + + when LOAD_RECEIVED => + stat_data_temp <= x"0102" & rec_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); + + when LOAD_DISCARDED => + stat_data_temp <= x"0103" & discarded_ctr; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 2, 8)); + + when others => + stat_data_temp <= (others => '0'); + STAT_ADDR_OUT <= (others => '0'); + + end case; + end if; + +end process SELECTOR; + +STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); +STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); +STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); +STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); + +STAT_SYNC : process(CLK) +begin + if rising_edge(CLK) then + if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then + STAT_DATA_RDY_OUT <= '1'; + else + STAT_DATA_RDY_OUT <= '0'; + end if; + end if; +end process STAT_SYNC; +--STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; -- **** -- **** debug ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(7 downto 4) <= state2; ---DEBUG_OUT(11 downto 8) <= state3; ---DEBUG_OUT(15 downto 12) <= (others => '0'); ---DEBUG_OUT(31 downto 16) <= discarded_ctr; --- ---DISCARDED_CTR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- discarded_ctr <= (others => '0'); --- elsif (receive_current_state = DISCARD and PS_DATA_IN(8) = '1') then --- discarded_ctr <= discarded_ctr + x"1"; --- end if; --- end if; ---end process DISCARDED_CTR_PROC; +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(7 downto 4) <= state2; +DEBUG_OUT(11 downto 8) <= state3; +DEBUG_OUT(15 downto 12) <= (others => '0'); +DEBUG_OUT(31 downto 16) <= discarded_ctr; + +DISCARDED_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + discarded_ctr <= (others => '0'); + elsif (receive_current_state = DISCARD and PS_DATA_IN(8) = '1') then + discarded_ctr <= discarded_ctr + x"1"; + end if; + end if; +end process DISCARDED_CTR_PROC; -- **** end trb_net16_gbe_response_constructor_DHCP; diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_Forward.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_Forward.vhd index 813efee..b5ef95b 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_Forward.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_Forward.vhd @@ -154,6 +154,7 @@ begin end if; end process FF_RD_LOCK_PROC; +-- TODO: put a smaller fifo here FRAME_FIFO: fifo_4096x9 port map( Data => PS_DATA_IN, diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_Ping.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_Ping.vhd index b738ac3..5161932 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_Ping.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_Ping.vhd @@ -41,13 +41,17 @@ port ( TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -73,12 +77,13 @@ attribute syn_encoding : string; type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_LOAD, LOAD_FRAME, CLEANUP); signal dissect_current_state, dissect_next_state : dissect_states; -attribute syn_encoding of dissect_current_state: signal is "onehot"; +attribute syn_encoding of dissect_current_state: signal is "safe,gray"; type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); signal stats_current_state, stats_next_state : stats_states; -attribute syn_encoding of stats_current_state : signal is "onehot"; +attribute syn_encoding of stats_current_state : signal is "safe,gray"; +signal state : std_logic_vector(3 downto 0); signal rec_frames : std_logic_vector(15 downto 0); signal sent_frames : std_logic_vector(15 downto 0); @@ -101,9 +106,10 @@ signal fifo_q : std_logic_vector(7 downto 0); signal stat_data_temp : std_logic_vector(31 downto 0); -signal tc_wr : std_logic; - -signal data_reg : std_logic_vector(511 downto 0); +attribute syn_preserve : boolean; +attribute syn_keep : boolean; +attribute syn_keep of state : signal is true; +attribute syn_preserve of state : signal is true; begin @@ -118,11 +124,12 @@ begin end if; end process DISSECT_MACHINE_PROC; -DISSECT_MACHINE : process(dissect_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, data_ctr, data_length) +DISSECT_MACHINE : process(dissect_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, TC_BUSY_IN, data_ctr, data_length) begin case dissect_current_state is when IDLE => + state <= x"1"; if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then dissect_next_state <= READ_FRAME; else @@ -130,6 +137,7 @@ begin end if; when READ_FRAME => + state <= x"2"; if (PS_DATA_IN(8) = '1') then dissect_next_state <= WAIT_FOR_LOAD; else @@ -137,13 +145,15 @@ begin end if; when WAIT_FOR_LOAD => - if (PS_SELECTED_IN = '1') then + state <= x"3"; + if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then dissect_next_state <= LOAD_FRAME; else dissect_next_state <= WAIT_FOR_LOAD; end if; when LOAD_FRAME => + state <= x"4"; if (data_ctr = data_length + 1) then dissect_next_state <= CLEANUP; else @@ -151,6 +161,7 @@ begin end if; when CLEANUP => + state <= x"5"; dissect_next_state <= IDLE; end case; @@ -163,23 +174,12 @@ begin data_ctr <= 2; elsif (dissect_current_state = READ_FRAME and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then -- in case of saving data from incoming frame data_ctr <= data_ctr + 1; - elsif (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1' and TC_RD_EN_IN = '1') then -- in case of constructing response + elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then -- in case of constructing response data_ctr <= data_ctr + 1; end if; end if; end process DATA_CTR_PROC; ---TC_WR_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1') then --- tc_wr <= '1'; --- else --- tc_wr <= '0'; --- end if; --- end if; ---end process TC_WR_PROC; - DATA_LENGTH_PROC: process(CLK) begin if rising_edge(CLK) then @@ -202,8 +202,6 @@ begin elsif (dissect_current_state = READ_FRAME) then if (data_ctr < 9) then -- headers saved_headers(data_ctr * 8 - 1 downto (data_ctr - 1) * 8) <= PS_DATA_IN(7 downto 0); - elsif (data_ctr > 8) then -- data - saved_data((data_ctr - 8) * 8 - 1 downto (data_ctr - 8 - 1) * 8) <= PS_DATA_IN(7 downto 0); end if; elsif (dissect_current_state = LOAD_FRAME) then saved_headers(7 downto 0) <= x"00"; @@ -213,24 +211,22 @@ begin end if; end process SAVE_VALUES_PROC; -----TODO: change it to one register 64B ---fifo : fifo_2048x8 --- PORT map( --- Reset => RESET, --- RPReset => RESET, --- WrClock => CLK, --- RdClock => CLK, --- Data => PS_DATA_IN(7 downto 0), --- WrEn => fifo_wr_en, --- RdEn => fifo_rd_en, --- Q => fifo_q, --- Full => open, --- Empty => open --- ); +fifo : fifo_2048x8 + PORT map( + Reset => RESET, + RPReset => RESET, + WrClock => CLK, + RdClock => CLK, + Data => PS_DATA_IN(7 downto 0), + WrEn => fifo_wr_en, + RdEn => fifo_rd_en, + Q => fifo_q, + Full => open, + Empty => open + ); -----TODO: change it to synchronous ---fifo_wr_en <= '1' when (dissect_current_state = READ_FRAME and data_ctr > 8) else '0'; ---fifo_rd_en <= '1' when (dissect_current_state = LOAD_FRAME and data_ctr > 8) else '0'; +fifo_wr_en <= '1' when (dissect_current_state = READ_FRAME and data_ctr > 8) else '0'; +fifo_rd_en <= '1' when (dissect_current_state = LOAD_FRAME and data_ctr > 8) else '0'; CS_PROC : process(CLK) begin @@ -244,11 +240,13 @@ begin checksum_rrr(15 downto 0) <= (others => '0'); elsif (dissect_current_state = READ_FRAME and data_ctr > 4) then if (std_logic_vector(to_unsigned(data_ctr, 1)) = "0") then + --checksum(7 downto 0) <= checksum(7 downto 0) + PS_DATA_IN(7 downto 0); checksum_l <= checksum_l + PS_DATA_IN(7 downto 0); else + --checksum(15 downto 8) <= checksum(15 downto 8) + PS_DATA_IN(7 downto 0); checksum_r <= checksum_r + PS_DATA_IN(7 downto 0); end if; - elsif (dissect_current_state = WAIT_FOR_LOAD) then + elsif (dissect_current_state = WAIT_FOR_LOAD and TC_BUSY_IN = '0') then checksum_ll <= x"0000" + checksum_l(7 downto 0) + checksum_r(19 downto 8); checksum_rr <= x"0000" + checksum_r(7 downto 0) + checksum_l(19 downto 8); elsif (dissect_current_state = LOAD_FRAME and data_ctr = 2) then @@ -262,34 +260,39 @@ checksum(15 downto 8) <= not (checksum_lll(7 downto 0) + checksum_rrr(15 downto TC_DATA_PROC : process(dissect_current_state, data_ctr, saved_headers, saved_data, data_length) begin - if rising_edge(CLK) then - tc_data(8) <= '0'; + tc_data(8) <= '0'; + + if (dissect_current_state = LOAD_FRAME) then + if (data_ctr < 10) then -- headers + for i in 0 to 7 loop + tc_data(i) <= saved_headers((data_ctr - 2) * 8 + i); + end loop; + else -- data + for i in 0 to 7 loop + tc_data(i) <= fifo_q(i); --saved_data((data_ctr - 10) * 8 + i); + end loop; - if (dissect_current_state = LOAD_FRAME) then - if (data_ctr < 10) then -- headers - for i in 0 to 7 loop - tc_data(i) <= saved_headers((data_ctr - 2) * 8 + i); - end loop; - else -- data - for i in 0 to 7 loop - tc_data(i) <= saved_data((data_ctr - 8 - 2) * 8 + i); --fifo_q(i); - end loop; - - -- mark the last byte - if (data_ctr = data_length + 1) then - tc_data(8) <= '1'; - end if; + -- mark the last byte + if (data_ctr = data_length + 1) then + tc_data(8) <= '1'; end if; - else - tc_data(7 downto 0) <= (others => '0'); end if; - - TC_DATA_OUT <= tc_data; - + else + tc_data(7 downto 0) <= (others => '0'); end if; + end process TC_DATA_PROC; ---TC_WR_EN_OUT <= tc_wr; +TC_DATA_SYNC : process(CLK) +begin + if rising_edge(CLK) then + TC_DATA_OUT <= tc_data; + end if; +end process TC_DATA_SYNC; + + +--PS_BUSY_OUT <= '0' when (dissect_current_state = IDLE) else '1'; +--PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) else '0'; PS_RESPONSE_SYNC : process(CLK) begin @@ -308,14 +311,17 @@ begin end if; end process PS_RESPONSE_SYNC; -TC_FRAME_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16)); -TC_FRAME_TYPE_OUT <= x"0008"; -TC_DEST_UDP_OUT <= x"0000"; -- not used -TC_SRC_MAC_OUT <= g_MY_MAC; -TC_SRC_IP_OUT <= g_MY_IP; -TC_SRC_UDP_OUT <= x"0000"; -- not used -TC_IP_PROTOCOL_OUT <= X"01"; -- ICMP -TC_IDENT_OUT <= x"2" & sent_frames(11 downto 0); +TC_FRAME_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16)); +TC_IP_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16)); +TC_UDP_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16)); + +TC_FRAME_TYPE_OUT <= x"0008"; +TC_DEST_UDP_OUT <= x"0000"; -- not used +TC_SRC_MAC_OUT <= g_MY_MAC; +TC_SRC_IP_OUT <= g_MY_IP; +TC_SRC_UDP_OUT <= x"0000"; -- not used +TC_IP_PROTOCOL_OUT <= X"01"; -- ICMP +TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter ADDR_PROC : process(CLK) begin @@ -328,19 +334,18 @@ begin end process ADDR_PROC; -- statistics --- ---REC_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- rec_frames <= (others => '0'); --- elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then --- rec_frames <= rec_frames + x"1"; --- end if; --- end if; ---end process REC_FRAMES_PROC; --- --- needed for identification + +REC_FRAMES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + rec_frames <= (others => '0'); + elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then + rec_frames <= rec_frames + x"1"; + end if; + end if; +end process REC_FRAMES_PROC; + SENT_FRAMES_PROC : process(CLK) begin if rising_edge(CLK) then @@ -351,101 +356,101 @@ begin end if; end if; end process SENT_FRAMES_PROC; --- ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; --- ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, STAT_DATA_ACK_IN, PS_DATA_IN, dissect_current_state) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = CLEANUP) then --- stats_next_state <= LOAD_SENT; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_SENT => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_RECEIVED; --- else --- stats_next_state <= LOAD_SENT; --- end if; --- --- when LOAD_RECEIVED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_RECEIVED; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---SELECTOR : process(CLK) ---begin --- if rising_edge(CLK) then --- case(stats_current_state) is --- --- when LOAD_SENT => --- stat_data_temp <= x"0401" & sent_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); --- --- when LOAD_RECEIVED => --- stat_data_temp <= x"0402" & rec_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); --- --- when others => --- stat_data_temp <= (others => '0'); --- STAT_ADDR_OUT <= (others => '0'); --- --- end case; --- end if; ---end process SELECTOR; --- ---STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); ---STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); ---STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); ---STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); --- ---STAT_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then --- STAT_DATA_RDY_OUT <= '1'; --- else --- STAT_DATA_RDY_OUT <= '0'; --- end if; --- end if; ---end process STAT_SYNC; + +RECEIVED_FRAMES_OUT <= rec_frames; +SENT_FRAMES_OUT <= sent_frames; +RECEIVED_FRAMES_OUT <= rec_frames; +SENT_FRAMES_OUT <= sent_frames; + +STATS_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + stats_current_state <= IDLE; + else + stats_current_state <= stats_next_state; + end if; + end if; +end process STATS_MACHINE_PROC; + +STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, STAT_DATA_ACK_IN, PS_DATA_IN, dissect_current_state) +begin + + case (stats_current_state) is + + when IDLE => + if (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = CLEANUP) then + stats_next_state <= LOAD_SENT; + else + stats_next_state <= IDLE; + end if; + + when LOAD_SENT => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= LOAD_RECEIVED; + else + stats_next_state <= LOAD_SENT; + end if; + + when LOAD_RECEIVED => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= CLEANUP; + else + stats_next_state <= LOAD_RECEIVED; + end if; + + when CLEANUP => + stats_next_state <= IDLE; + + end case; + +end process STATS_MACHINE; + +SELECTOR : process(CLK) +begin + if rising_edge(CLK) then + case(stats_current_state) is + + when LOAD_SENT => + stat_data_temp <= x"0401" & sent_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); + + when LOAD_RECEIVED => + stat_data_temp <= x"0402" & rec_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); + + when others => + stat_data_temp <= (others => '0'); + STAT_ADDR_OUT <= (others => '0'); + + end case; + end if; +end process SELECTOR; + +STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); +STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); +STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); +STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); + +STAT_SYNC : process(CLK) +begin + if rising_edge(CLK) then + if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then + STAT_DATA_RDY_OUT <= '1'; + else + STAT_DATA_RDY_OUT <= '0'; + end if; + end if; +end process STAT_SYNC; --STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; -- **** debug ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(4) <= '0'; ---DEBUG_OUT(7 downto 5) <= "000"; ---DEBUG_OUT(8) <= '0'; ---DEBUG_OUT(11 downto 9) <= "000"; ---DEBUG_OUT(31 downto 12) <= (others => '0'); +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(4) <= '0'; +DEBUG_OUT(7 downto 5) <= "000"; +DEBUG_OUT(8) <= '0'; +DEBUG_OUT(11 downto 9) <= "000"; +DEBUG_OUT(31 downto 12) <= (others => '0'); -- **** end trb_net16_gbe_response_constructor_Ping; diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_PseudoPing.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_PseudoPing.vhd deleted file mode 100644 index 748a651..0000000 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_PseudoPing.vhd +++ /dev/null @@ -1,389 +0,0 @@ -LIBRARY IEEE; -USE IEEE.std_logic_1164.ALL; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; - -use work.trb_net_gbe_components.all; -use work.trb_net_gbe_protocols.all; - ---******** --- Response Constructor which responds to Ping messages --- - -entity trb_net16_gbe_response_constructor_PseudoPing is -generic ( STAT_ADDRESS_BASE : integer := 0 -); -port ( - CLK : in std_logic; -- system clock - RESET : in std_logic; - --- INTERFACE - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; - - RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); - SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); --- END OF INTERFACE - --- debug - DEBUG_OUT : out std_logic_vector(31 downto 0) -); -end trb_net16_gbe_response_constructor_PseudoPing; - - -architecture trb_net16_gbe_response_constructor_PseudoPing of trb_net16_gbe_response_constructor_PseudoPing is - ---attribute HGROUP : string; ---attribute HGROUP of trb_net16_gbe_response_constructor_Ping : architecture is "GBE_MAIN_group"; - -attribute syn_encoding : string; - -type dissect_states is (IDLE, READ_FRAME, GENERATE_DATA, WAIT_FOR_LOAD, LOAD_FRAME, CLEANUP); -signal dissect_current_state, dissect_next_state : dissect_states; -attribute syn_encoding of dissect_current_state: signal is "safe,gray"; - -type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); -signal stats_current_state, stats_next_state : stats_states; -attribute syn_encoding of stats_current_state : signal is "safe,gray"; - -signal rec_frames : std_logic_vector(15 downto 0); -signal sent_frames : std_logic_vector(15 downto 0); - -signal saved_data : std_logic_vector(447 downto 0); -signal saved_headers : std_logic_vector(63 downto 0); - -signal data_ctr : integer range 1 to 1500; -signal data_length : integer range 1 to 1500; -signal tc_data : std_logic_vector(8 downto 0); - -signal checksum : std_logic_vector(15 downto 0); - -signal checksum_l, checksum_r : std_logic_vector(19 downto 0); -signal checksum_ll, checksum_rr : std_logic_vector(15 downto 0); -signal checksum_lll, checksum_rrr : std_logic_vector(15 downto 0); - -signal fifo_wr_en, fifo_rd_en : std_logic; -signal fifo_q : std_logic_vector(7 downto 0); - - -signal stat_data_temp : std_logic_vector(31 downto 0); - -signal tc_wr : std_logic; - -signal data_reg : std_logic_vector(511 downto 0); -signal fifo_data : std_logic_vector(7 downto 0); -signal gen_ctr : std_logic_vector(15 downto 0); -signal size_left : std_logic_vector(15 downto 0); - -begin - ---DISSECT_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- dissect_current_state <= IDLE; --- else --- dissect_current_state <= dissect_next_state; --- end if; --- end if; ---end process DISSECT_MACHINE_PROC; - -DISSECT_MACHINE : process(dissect_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, data_ctr, data_length, gen_ctr, size_left, PS_SELECTED_IN) -begin - case dissect_current_state is - - when IDLE => - if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then - dissect_next_state <= READ_FRAME; - else - dissect_next_state <= IDLE; - end if; - - when READ_FRAME => - if (PS_DATA_IN(8) = '1') then - dissect_next_state <= GENERATE_DATA; - else - dissect_next_state <= READ_FRAME; - end if; - - when GENERATE_DATA => - if (gen_ctr = x"07ff") then - dissect_next_state <= WAIT_FOR_LOAD; - else - dissect_next_state <= GENERATE_DATA; - end if; - - when WAIT_FOR_LOAD => - if (PS_SELECTED_IN = '1') then - dissect_next_state <= LOAD_FRAME; - else - dissect_next_state <= WAIT_FOR_LOAD; - end if; - - when LOAD_FRAME => - if (size_left = x"0000") then - dissect_next_state <= CLEANUP; - else - dissect_next_state <= LOAD_FRAME; - end if; - - when CLEANUP => - dissect_next_state <= IDLE; - - end case; -end process DISSECT_MACHINE; - -fifo : fifo_2048x8 - PORT map( - Reset => RESET, - RPReset => RESET, - WrClock => CLK, - RdClock => CLK, - Data => fifo_data, - WrEn => fifo_wr_en, - RdEn => fifo_rd_en, --TC_RD_EN_IN, - Q => fifo_q, - Full => open, - Empty => open - ); - -fifo_rd_en <= '1' when TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1' else '0'; -fifo_wr_en <= '1' when dissect_current_state = GENERATE_DATA else '0'; -fifo_data <= gen_ctr(7 downto 0); - -process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = IDLE or dissect_current_state = CLEANUP) then - gen_ctr <= (others => '0'); - elsif (dissect_current_state = GENERATE_DATA) then - gen_ctr <= gen_ctr + x"1"; - else - gen_ctr <= gen_ctr; - end if; - end if; -end process; - - -TC_DATA_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = LOAD_FRAME and size_left = x"0000") then - tc_data(8) <= '1'; - else - tc_data(8) <= '0'; - end if; - - tc_data(7 downto 0) <= fifo_q; - end if; -end process TC_DATA_PROC; - -TC_DATA_OUT <= tc_data; - -PS_RESPONSE_SYNC : process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) then - PS_RESPONSE_READY_OUT <= '1'; - else - PS_RESPONSE_READY_OUT <= '0'; - end if; - - if (dissect_current_state = IDLE) then - PS_BUSY_OUT <= '0'; - else - PS_BUSY_OUT <= '1'; - end if; - end if; -end process PS_RESPONSE_SYNC; - -process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = GENERATE_DATA) then - size_left <= x"0500"; - elsif (dissect_current_state = LOAD_FRAME) then - size_left <= size_left - x"1"; - else - size_left <= size_left; - end if; - end if; -end process; - -TC_FRAME_SIZE_OUT <= x"0500"; - -TC_FRAME_TYPE_OUT <= x"0008"; -TC_DEST_UDP_OUT <= x"c350"; -- not used -TC_SRC_MAC_OUT <= g_MY_MAC; -TC_SRC_IP_OUT <= g_MY_IP; -TC_SRC_UDP_OUT <= x"c350"; -- not used -TC_IP_PROTOCOL_OUT <= X"11"; -- ICMP -TC_IDENT_OUT <= x"2" & sent_frames(11 downto 0); - -ADDR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = READ_FRAME) then - TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; - TC_DEST_IP_OUT <= PS_SRC_IP_ADDRESS_IN; - end if; - end if; -end process ADDR_PROC; - --- statistics --- ---REC_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- rec_frames <= (others => '0'); --- elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then --- rec_frames <= rec_frames + x"1"; --- end if; --- end if; ---end process REC_FRAMES_PROC; --- --- needed for identification -SENT_FRAMES_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - sent_frames <= (others => '0'); - elsif (dissect_current_state = WAIT_FOR_LOAD and PS_SELECTED_IN = '1') then - sent_frames <= sent_frames + x"1"; - end if; - end if; -end process SENT_FRAMES_PROC; --- ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; ---RECEIVED_FRAMES_OUT <= rec_frames; ---SENT_FRAMES_OUT <= sent_frames; --- ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, STAT_DATA_ACK_IN, PS_DATA_IN, dissect_current_state) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = CLEANUP) then --- stats_next_state <= LOAD_SENT; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_SENT => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_RECEIVED; --- else --- stats_next_state <= LOAD_SENT; --- end if; --- --- when LOAD_RECEIVED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_RECEIVED; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---SELECTOR : process(CLK) ---begin --- if rising_edge(CLK) then --- case(stats_current_state) is --- --- when LOAD_SENT => --- stat_data_temp <= x"0401" & sent_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); --- --- when LOAD_RECEIVED => --- stat_data_temp <= x"0402" & rec_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); --- --- when others => --- stat_data_temp <= (others => '0'); --- STAT_ADDR_OUT <= (others => '0'); --- --- end case; --- end if; ---end process SELECTOR; --- ---STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); ---STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); ---STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); ---STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); --- ---STAT_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then --- STAT_DATA_RDY_OUT <= '1'; --- else --- STAT_DATA_RDY_OUT <= '0'; --- end if; --- end if; ---end process STAT_SYNC; ---STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; - --- **** debug ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(4) <= '0'; ---DEBUG_OUT(7 downto 5) <= "000"; ---DEBUG_OUT(8) <= '0'; ---DEBUG_OUT(11 downto 9) <= "000"; ---DEBUG_OUT(31 downto 12) <= (others => '0'); --- **** - -end trb_net16_gbe_response_constructor_PseudoPing; - - diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_SCTRL.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_SCTRL.vhd index 7d1482a..17d1421 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_SCTRL.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_SCTRL.vhd @@ -38,14 +38,18 @@ generic ( STAT_ADDRESS_BASE : integer := 0 TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; + STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); STAT_DATA_RDY_OUT : out std_logic; @@ -78,26 +82,23 @@ architecture RTL of trb_net16_gbe_response_constructor_SCTRL is attribute syn_encoding : string; ---type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_TC, DIVIDE, WAIT_FOR_LOAD, CLEANUP); -type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP); ---type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_A_WORD, WAIT_ONE, WAIT_TWO, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_TC, DIVIDE, WAIT_FOR_LOAD, CLEANUP); ---type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_TC, DIVIDE, WAIT_FOR_LOAD, CLEANUP); +type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_TC, DIVIDE, WAIT_FOR_LOAD, CLEANUP, WAIT_FOR_LOAD_ACK, LOAD_ACK); signal dissect_current_state, dissect_next_state : dissect_states; -attribute syn_encoding of dissect_current_state: signal is "onehot"; +attribute syn_encoding of dissect_current_state: signal is "safe,gray"; type stats_states is (IDLE, LOAD_RECEIVED, LOAD_REPLY, CLEANUP); signal stats_current_state, stats_next_state : stats_states; -attribute syn_encoding of stats_current_state : signal is "onehot"; +attribute syn_encoding of stats_current_state : signal is "safe,gray"; signal saved_target_ip : std_logic_vector(31 downto 0); signal data_ctr : integer range 0 to 30; +signal state : std_logic_vector(3 downto 0); signal stat_data_temp : std_logic_vector(31 downto 0); signal rec_frames : std_logic_vector(15 downto 0); signal rx_fifo_q : std_logic_vector(17 downto 0); -signal rx_fifo_qq : std_logic_vector(17 downto 0); signal rx_fifo_wr, rx_fifo_rd : std_logic; signal tx_eod, rx_eod : std_logic; @@ -106,7 +107,6 @@ signal tx_fifo_wr, tx_fifo_rd : std_logic; signal tx_fifo_reset : std_logic; signal gsc_reply_read : std_logic; signal gsc_init_dataready : std_logic; -signal gsc_init_dataready_q : std_logic; signal tx_data_ctr : std_logic_vector(15 downto 0); signal tx_loaded_ctr : std_logic_vector(15 downto 0); @@ -125,6 +125,14 @@ signal reset_detected : std_logic := '0'; signal make_reset : std_logic := '0'; +attribute syn_preserve : boolean; +attribute syn_keep : boolean; +attribute syn_keep of tx_data_ctr, tx_loaded_ctr, state : signal is true; +attribute syn_preserve of tx_data_ctr, tx_loaded_ctr, state : signal is true; + +signal temp_ctr : std_logic_vector(7 downto 0); + +signal gsc_init_read_q : std_logic; signal fifo_rd_q : std_logic; signal too_much_data : std_logic; @@ -132,18 +140,6 @@ signal too_much_data : std_logic; signal rx_fifo_data : std_logic_vector(8 downto 0); signal tx_fifo_data : std_logic_vector(17 downto 0); -signal tc_wr : std_logic; -signal state : std_logic_vector(3 downto 0); -signal saved_hdr_1 : std_logic_vector(7 downto 0) := x"ab"; -signal saved_hdr_2 : std_logic_vector(7 downto 0) := x"cd"; -signal saved_hdr_ctr : std_logic_vector(3 downto 0); - -attribute syn_preserve : boolean; -attribute syn_keep : boolean; -attribute syn_keep of rx_fifo_wr, rx_fifo_rd, gsc_init_dataready, tx_fifo_wr, tx_fifo_rd, gsc_reply_read, state : signal is true; -attribute syn_preserve of rx_fifo_wr, rx_fifo_rd, gsc_init_dataready, tx_fifo_wr, tx_fifo_rd, gsc_reply_read, state : signal is true; - - begin MAKE_RESET_OUT <= make_reset; @@ -162,150 +158,59 @@ receive_fifo : fifo_2048x8x16 Empty => rx_empty ); ---TODO: change to synchronous +--rx_fifo_wr <= '1' when PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1' else '0'; rx_fifo_rd <= '1' when (gsc_init_dataready = '1' and dissect_current_state = LOAD_TO_HUB) or (gsc_init_dataready = '1' and dissect_current_state = WAIT_FOR_HUB and GSC_INIT_READ_IN = '1') or (dissect_current_state = READ_FRAME and PS_DATA_IN(8) = '1') else '0'; -- preload first word -RX_FIFO_WR_SYNC : process(CLK) +RX_FIFO_SYNC : process(CLK) begin if rising_edge(CLK) then - if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1' and (saved_hdr_ctr = "0100" or saved_hdr_ctr = "1000")) then + if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then rx_fifo_wr <= '1'; else rx_fifo_wr <= '0'; end if; - rx_fifo_data <= PS_DATA_IN; - end if; -end process RX_FIFO_WR_SYNC; - -SAVED_HDR_CTR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = IDLE and PS_WR_EN_IN = '0' and PS_ACTIVATE_IN = '0') then - saved_hdr_ctr <= "0001"; - elsif (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1' and saved_hdr_ctr /= "1000") then - saved_hdr_ctr(3 downto 0) <= saved_hdr_ctr(2 downto 0) & '0'; - else - saved_hdr_ctr <= saved_hdr_ctr; - end if; - end if; -end process SAVED_HDR_CTR_PROC; - -SAVED_HDR_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then - if (saved_hdr_ctr = "0001") then - saved_hdr_1 <= PS_DATA_IN(7 downto 0); - saved_hdr_2 <= saved_hdr_2; - elsif (saved_hdr_ctr = "0010") then - saved_hdr_2 <= PS_DATA_IN(7 downto 0); - saved_hdr_1 <= saved_hdr_1; - else - saved_hdr_1 <= saved_hdr_1; - saved_hdr_2 <= saved_hdr_2; - end if; - else - saved_hdr_1 <= saved_hdr_1; - saved_hdr_2 <= saved_hdr_2; - end if; - end if; -end process SAVED_HDR_PROC; - ---RX_FIFO_RD_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- --- if (dissect_current_state = LOAD_A_WORD) then +-- if (gsc_init_dataready = '1' and dissect_current_state = LOAD_TO_HUB) then +-- rx_fifo_rd <= '1'; +-- elsif (gsc_init_dataready = '1' and dissect_current_state = WAIT_FOR_HUB and GSC_INIT_READ_IN = '1') then +-- rx_fifo_rd <= '1'; +-- elsif (dissect_current_state = READ_FRAME and PS_DATA_IN(8) = '1') then -- rx_fifo_rd <= '1'; -- else -- rx_fifo_rd <= '0'; -- end if; --- ----- if (dissect_current_state = WAIT_ONE) then ----- gsc_init_dataready <= '1'; ----- elsif (dissect_current_state = WAIT_FOR_HUB and GSC_INIT_READ_IN = '0') then ----- gsc_init_dataready <= '1'; ----- else ----- gsc_init_dataready <= '0'; ----- end if; --- ----- if (dissect_current_state = READ_FRAME and PS_DATA_IN(8) = '1') then -- preload the first byte ----- rx_fifo_rd <= '1'; ----- elsif (dissect_current_state = LOAD_TO_HUB) then ----- rx_fifo_rd <= '1'; ----- elsif (dissect_current_state = WAIT_FOR_HUB and GSC_INIT_READ_IN = '1') then ----- rx_fifo_rd <= '1'; ----- else ----- rx_fifo_rd <= '0'; ----- end if; ----- ----- if (dissect_current_state = WAIT_FOR_HUB) then ----- gsc_init_dataready <= '1'; ----- elsif (dissect_current_state = LOAD_TO_HUB and GSC_INIT_READ_IN = '1') then ----- gsc_init_dataready <= '1'; ----- else ----- gsc_init_dataready <= '0'; ----- end if; ----- ----- if (dissect_current_state = WAIT_FOR_HUB) then ----- packet_num <= "100"; ----- elsif (dissect_current_state = LOAD_TO_HUB) then ----- if (gsc_init_dataready = '1' and packet_num = "100") then ----- packet_num <= "000"; ----- elsif (gsc_init_dataready = '1' and packet_num /= "100") then ----- packet_num <= packet_num + "1"; ----- else ----- packet_num <= packet_num; ----- end if; ----- else ----- packet_num <= packet_num; ----- end if; --- --- if (dissect_current_state = READ_FRAME) then --- packet_num <= "011"; --- elsif (dissect_current_state = LOAD_A_WORD) then --- if (packet_num = "100") then --- packet_num <= "000"; --- else --- packet_num <= packet_num + "1"; --- end if; --- else --- packet_num <= packet_num; --- end if; --- + -- GSC_INIT_DATA_OUT(7 downto 0) <= rx_fifo_q(16 downto 9); -- GSC_INIT_DATA_OUT(15 downto 8) <= rx_fifo_q(7 downto 0); -- --- --GSC_INIT_DATAREADY_OUT <= gsc_init_dataready; --- ----- GSC_INIT_PACKET_NUM_OUT <= packet_num; --- --- end if; ---end process RX_FIFO_RD_SYNC; --- ---GSC_INIT_DATAREADY_OUT <= '1' when dissect_current_state = WAIT_FOR_HUB else '0'; +-- if (GSC_INIT_READ_IN = '1' and dissect_current_state = LOAD_TO_HUB) or (dissect_current_state = WAIT_FOR_HUB) then +-- gsc_init_dataready <= '1'; +-- else +-- gsc_init_dataready <= '0'; +-- end if; + + rx_fifo_data <= PS_DATA_IN; + end if; +end process RX_FIFO_SYNC; -----TODO: add a register GSC_INIT_DATA_OUT(7 downto 0) <= rx_fifo_q(16 downto 9); -GSC_INIT_DATA_OUT(15 downto 8) <= rx_fifo_q(7 downto 0); +GSC_INIT_DATA_OUT(15 downto 8) <= rx_fifo_q(7 downto 0); ------- TODO: change it to synchronous GSC_INIT_PACKET_NUM_OUT <= packet_num; GSC_INIT_DATAREADY_OUT <= gsc_init_dataready; gsc_init_dataready <= '1' when (GSC_INIT_READ_IN = '1' and dissect_current_state = LOAD_TO_HUB) or (dissect_current_state = WAIT_FOR_HUB) else '0'; - + PACKET_NUM_PROC : process(CLK) begin if rising_edge(CLK) then if (RESET = '1') or (dissect_current_state = IDLE) then packet_num <= "100"; - elsif (GSC_INIT_READ_IN = '1' and rx_fifo_rd = '1' and packet_num = "100") then + elsif (GSC_INIT_READ_IN = '1' and gsc_init_dataready = '1' and packet_num = "100") then packet_num <= "000"; elsif (rx_fifo_rd = '1' and packet_num /= "100") then packet_num <= packet_num + "1"; @@ -313,8 +218,7 @@ begin end if; end process PACKET_NUM_PROC; ---temporairly changed to a smaller fifo -transmit_fifo : fifo_4kx18x9 --fifo_65536x18x9 +transmit_fifo : fifo_65536x18x9 PORT map( Reset => tx_fifo_reset, RPReset => tx_fifo_reset, @@ -327,78 +231,55 @@ transmit_fifo : fifo_4kx18x9 --fifo_65536x18x9 Full => tx_full, Empty => tx_empty ); + +tx_fifo_data(7 downto 0) <= GSC_REPLY_DATA_IN(15 downto 8); +tx_fifo_data(8) <= '0'; +tx_fifo_data(16 downto 9) <= GSC_REPLY_DATA_IN(7 downto 0); +tx_fifo_data(17) <= '0'; -TX_FIFO_WR_SYNC : process(CLK) -begin - if rising_edge(CLK) then - if (GSC_REPLY_DATAREADY_IN = '1' and gsc_reply_read = '1') then - tx_fifo_wr <= '1'; - elsif (saved_hdr_ctr = "0010") then - tx_fifo_wr <= '1'; - else - tx_fifo_wr <= '0'; - end if; - - if (saved_hdr_ctr = "010") then - tx_fifo_data <= '0' & PS_DATA_IN(7 downto 0) & '0' & x"02"; - else - tx_fifo_data(7 downto 0) <= GSC_REPLY_DATA_IN(15 downto 8); - tx_fifo_data(8) <= '0'; - tx_fifo_data(16 downto 9) <= GSC_REPLY_DATA_IN(7 downto 0); - tx_fifo_data(17) <= '0'; - end if; - end if; -end process TX_FIFO_WR_SYNC; +tx_fifo_wr <= '1' when (GSC_REPLY_DATAREADY_IN = '1' and gsc_reply_read = '1') else '0'; +tx_fifo_reset <= '1' when (RESET = '1') or (too_much_data = '1' and dissect_current_state = CLEANUP) else '0'; +tx_fifo_rd <= '1' when TC_RD_EN_IN = '1' and dissect_current_state = LOAD_FRAME and (tx_frame_loaded /= g_MAX_FRAME_SIZE) else '0'; ---TX_FIFO_RD_SYNC : process(CLK) +--TX_FIFO_SYNC_PROC : process(CLK) --begin -- if rising_edge(CLK) then --- if (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1' and tx_frame_loaded /= g_MAX_FRAME_SIZE) then --- tx_fifo_rd <= '1'; +-- if (GSC_REPLY_DATAREADY_IN = '1' and gsc_reply_read = '1') then +-- tx_fifo_wr <= '1'; -- else --- tx_fifo_rd <= '0'; --- end if; +-- tx_fifo_wr <= '0'; +-- end if; -- end if; ---end process TX_FIFO_RD_SYNC; -tx_fifo_rd <= '1' when TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1' else '0'; - -TX_FIFO_SYNC_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') or (too_much_data = '1' and dissect_current_state = CLEANUP) then - tx_fifo_reset <= '1'; - else - tx_fifo_reset <= '0'; - end if; - end if; -end process TX_FIFO_SYNC_PROC; +--end process TX_FIFO_SYNC_PROC; -TC_DATA_PROC : process(CLK) +TC_DATA_PROC : process(dissect_current_state, tx_loaded_ctr, tx_data_ctr, tx_frame_loaded, g_MAX_FRAME_SIZE) begin - if rising_edge(CLK) then - - TC_DATA_OUT(7 downto 0) <= tx_fifo_q(7 downto 0); + if (dissect_current_state = LOAD_FRAME) then - --if (tx_loaded_ctr = tx_data_ctr + x"1" or tx_frame_loaded = g_MAX_FRAME_SIZE - x"1") then - if (tx_loaded_ctr = tx_data_ctr) then - TC_DATA_OUT(8) <= '1'; + TC_DATA_OUT(7 downto 0) <= tx_fifo_q(7 downto 0); + + if (tx_loaded_ctr = tx_data_ctr or tx_frame_loaded = g_MAX_FRAME_SIZE - x"1") then + TC_DATA_OUT(8) <= '1'; + else + TC_DATA_OUT(8) <= '0'; + end if; + + elsif (dissect_current_state = LOAD_ACK) then + + TC_DATA_OUT(7 downto 0) <= tx_loaded_ctr(7 downto 0); + + if (tx_loaded_ctr = x"0010" + x"1") then + TC_DATA_OUT(8) <= '1'; + else + TC_DATA_OUT(8) <= '0'; + end if; else - TC_DATA_OUT(8) <= '0'; + TC_DATA_OUT <= (others => '0'); end if; - end if; end process TC_DATA_PROC; -GSC_REPLY_READ_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (dissect_current_state = WAIT_FOR_RESPONSE or dissect_current_state = SAVE_RESPONSE) then - gsc_reply_read <= '1'; - else - gsc_reply_read <= '0'; - end if; - end if; -end process GSC_REPLY_READ_PROC; GSC_REPLY_READ_OUT <= gsc_reply_read; +gsc_reply_read <= '1' when dissect_current_state = WAIT_FOR_RESPONSE or dissect_current_state = SAVE_RESPONSE else '0'; -- counter of data received from TRBNet hub TX_DATA_CTR_PROC : process(CLK) @@ -407,7 +288,7 @@ begin if (RESET = '1' or dissect_current_state = IDLE) then tx_data_ctr <= (others => '0'); elsif (tx_fifo_wr = '1') then - tx_data_ctr <= tx_data_ctr + x"2"; + tx_data_ctr(15 downto 1) <= tx_data_ctr(15 downto 1) + x"1"; end if; end if; end process TX_DATA_CTR_PROC; @@ -427,13 +308,22 @@ end process TOO_MUCH_DATA_PROC; TX_LOADED_CTR_PROC : process(CLK) begin if rising_edge(CLK) then - if (RESET = '1' or dissect_current_state = IDLE) then - tx_loaded_ctr <= x"0000"; - elsif (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1' and TC_RD_EN_IN = '1') then + if (RESET = '1' or dissect_current_state = IDLE or dissect_current_state = WAIT_FOR_HUB) then + tx_loaded_ctr <= (others => '0'); + elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1' and (tx_frame_loaded /= g_MAX_FRAME_SIZE)) then + tx_loaded_ctr <= tx_loaded_ctr + x"1"; + elsif (dissect_current_state = LOAD_ACK and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then tx_loaded_ctr <= tx_loaded_ctr + x"1"; end if; end if; end process TX_LOADED_CTR_PROC; + +--PS_BUSY_OUT <= '0' when (dissect_current_state = IDLE) else '1'; +-- +--PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or +-- dissect_current_state = CLEANUP or dissect_current_state = WAIT_FOR_LOAD_ACK or +-- dissect_current_state = LOAD_ACK or dissect_current_state = DIVIDE) and (too_much_data = '0') +-- else '0'; PS_RESPONSE_SYNC : process(CLK) begin @@ -441,6 +331,8 @@ begin if (too_much_data = '0') then if (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) then PS_RESPONSE_READY_OUT <= '1'; + elsif (dissect_current_state = WAIT_FOR_LOAD_ACK or dissect_current_state = LOAD_ACK or dissect_current_state = DIVIDE) then + PS_RESPONSE_READY_OUT <= '1'; else PS_RESPONSE_READY_OUT <= '0'; end if; @@ -457,62 +349,63 @@ end process PS_RESPONSE_SYNC; TC_FRAME_TYPE_OUT <= x"0008"; TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; TC_DEST_IP_OUT <= PS_SRC_IP_ADDRESS_IN; -TC_DEST_UDP_OUT(7 downto 0) <= PS_SRC_UDP_PORT_IN(15 downto 8); -TC_DEST_UDP_OUT(15 downto 8) <= PS_SRC_UDP_PORT_IN(7 downto 0); +TC_DEST_UDP_OUT(7 downto 0) <= PS_SRC_UDP_PORT_IN(15 downto 8); --x"a861"; +TC_DEST_UDP_OUT(15 downto 8) <= PS_SRC_UDP_PORT_IN(7 downto 0); --x"a861"; TC_SRC_MAC_OUT <= g_MY_MAC; TC_SRC_IP_OUT <= g_MY_IP; -TC_SRC_UDP_OUT <= x"9065"; --x"a861"; +TC_SRC_UDP_OUT <= x"a861"; TC_IP_PROTOCOL_OUT <= x"11"; -TC_IDENT_OUT <= x"3" & reply_ctr(11 downto 0); -TC_FRAME_SIZE_OUT <= tx_data_ctr; +FRAME_SIZE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1' or dissect_current_state = IDLE) then + TC_FRAME_SIZE_OUT <= (others => '0'); + TC_IP_SIZE_OUT <= (others => '0'); + elsif (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = DIVIDE) then + if (size_left >= g_MAX_FRAME_SIZE) then + TC_FRAME_SIZE_OUT <= g_MAX_FRAME_SIZE; + TC_IP_SIZE_OUT <= g_MAX_FRAME_SIZE; + else + TC_FRAME_SIZE_OUT <= size_left(15 downto 0); + TC_IP_SIZE_OUT <= size_left(15 downto 0); + end if; + elsif (dissect_current_state = WAIT_FOR_LOAD_ACK) then + TC_FRAME_SIZE_OUT <= x"0010"; + TC_IP_SIZE_OUT <= x"0010"; + end if; + end if; +end process FRAME_SIZE_PROC; + +TC_UDP_SIZE_OUT <= tx_data_ctr; ---FRAME_SIZE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1' or dissect_current_state = IDLE) then --- TC_FRAME_SIZE_OUT <= (others => '0'); --- TC_IP_SIZE_OUT <= (others => '0'); --- elsif (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = DIVIDE) then --- if (size_left >= g_MAX_FRAME_SIZE) then --- TC_FRAME_SIZE_OUT <= g_MAX_FRAME_SIZE; --- TC_IP_SIZE_OUT <= g_MAX_FRAME_SIZE; --- else --- TC_FRAME_SIZE_OUT <= size_left(15 downto 0); --- TC_IP_SIZE_OUT <= size_left(15 downto 0); --- end if; --- end if; --- end if; ---end process FRAME_SIZE_PROC; --- ---TC_UDP_SIZE_OUT <= tx_data_ctr; --- ---TC_FLAGS_OFFSET_OUT(15 downto 14) <= "00"; ---MORE_FRAGMENTS_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then --- TC_FLAGS_OFFSET_OUT(13) <= '0'; --- elsif ((dissect_current_state = DIVIDE and PS_SELECTED_IN = '1') or (dissect_current_state = WAIT_FOR_LOAD)) then --- if ((tx_data_ctr - tx_loaded_ctr) < g_MAX_FRAME_SIZE) then --- TC_FLAGS_OFFSET_OUT(13) <= '0'; -- no more fragments --- else --- TC_FLAGS_OFFSET_OUT(13) <= '1'; -- more fragments --- end if; --- end if; --- end if; ---end process MORE_FRAGMENTS_PROC; --- ---OFFSET_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then --- TC_FLAGS_OFFSET_OUT(12 downto 0) <= (others => '0'); --- elsif (dissect_current_state = DIVIDE and PS_SELECTED_IN = '1') then --- TC_FLAGS_OFFSET_OUT(12 downto 0) <= tx_loaded_ctr(15 downto 3) + x"1"; --- end if; --- end if; ---end process OFFSET_PROC; + +TC_FLAGS_OFFSET_OUT(15 downto 14) <= "00"; +MORE_FRAGMENTS_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then + TC_FLAGS_OFFSET_OUT(13) <= '0'; + elsif ((dissect_current_state = DIVIDE and TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') or (dissect_current_state = WAIT_FOR_LOAD)) then + if ((tx_data_ctr - tx_loaded_ctr) < g_MAX_FRAME_SIZE) then + TC_FLAGS_OFFSET_OUT(13) <= '0'; -- no more fragments + else + TC_FLAGS_OFFSET_OUT(13) <= '1'; -- more fragments + end if; + end if; + end if; +end process MORE_FRAGMENTS_PROC; + +OFFSET_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then + TC_FLAGS_OFFSET_OUT(12 downto 0) <= (others => '0'); + elsif (dissect_current_state = DIVIDE and TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then + TC_FLAGS_OFFSET_OUT(12 downto 0) <= tx_loaded_ctr(15 downto 3) + x"1"; + end if; + end if; +end process OFFSET_PROC; DISSECT_MACHINE_PROC : process(CLK) begin @@ -529,12 +422,12 @@ begin end if; end process DISSECT_MACHINE_PROC; -DISSECT_MACHINE : process(dissect_current_state, reset_detected, too_much_data, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, data_ctr, PS_SELECTED_IN, GSC_INIT_READ_IN, GSC_REPLY_DATAREADY_IN, tx_loaded_ctr, tx_data_ctr, rx_fifo_q, GSC_BUSY_IN, tx_frame_loaded, g_MAX_FRAME_SIZE) +DISSECT_MACHINE : process(dissect_current_state, reset_detected, too_much_data, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, TC_BUSY_IN, data_ctr, PS_SELECTED_IN, GSC_INIT_READ_IN, GSC_REPLY_DATAREADY_IN, tx_loaded_ctr, tx_data_ctr, rx_fifo_q, GSC_BUSY_IN, tx_frame_loaded, g_MAX_FRAME_SIZE) begin case dissect_current_state is when IDLE => - state <= x"0"; + state <= x"1"; if (PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then dissect_next_state <= READ_FRAME; else @@ -542,27 +435,35 @@ begin end if; when READ_FRAME => - state <= x"1"; + state <= x"2"; if (PS_DATA_IN(8) = '1') then - dissect_next_state <= WAIT_FOR_HUB; + --if (reset_detected = '1') then -- send ack only if reset command came + -- dissect_next_state <= WAIT_FOR_LOAD_ACK; + --else + dissect_next_state <= WAIT_FOR_HUB; + --end if; else dissect_next_state <= READ_FRAME; end if; + +-- when WAIT_FOR_LOAD_ACK => +-- state <= x"a"; +-- if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then +-- dissect_next_state <= LOAD_ACK; +-- else +-- dissect_next_state <= WAIT_FOR_LOAD_ACK; +-- end if; -- --- when LOAD_A_WORD => --- state <= x"2"; --- dissect_next_state <= WAIT_ONE; --WAIT_FOR_HUB; --- --- when WAIT_ONE => --- state <= x"3"; --- dissect_next_state <= WAIT_TWO; --WAIT_FOR_HUB; --- --- when WAIT_TWO => --- state <= x"4"; --- dissect_next_state <= WAIT_FOR_HUB; +-- when LOAD_ACK => +-- state <= x"b"; +-- if (tx_loaded_ctr = x"0010") then +-- dissect_next_state <= WAIT_FOR_HUB; --CLEANUP; +-- else +-- dissect_next_state <= LOAD_ACK; +-- end if; when WAIT_FOR_HUB => - state <= x"5"; + state <= x"3"; if (GSC_INIT_READ_IN = '1') then dissect_next_state <= LOAD_TO_HUB; else @@ -570,7 +471,7 @@ begin end if; when LOAD_TO_HUB => - state <= x"3"; + state <= x"4"; if (rx_fifo_q(17) = '1') then if (reset_detected = '1') then dissect_next_state <= CLEANUP; @@ -582,7 +483,7 @@ begin end if; when WAIT_FOR_RESPONSE => - state <= x"6"; + state <= x"5"; if (GSC_REPLY_DATAREADY_IN = '1') then dissect_next_state <= SAVE_RESPONSE; else @@ -590,7 +491,7 @@ begin end if; when SAVE_RESPONSE => - state <= x"7"; + state <= x"6"; if (GSC_REPLY_DATAREADY_IN = '0' and GSC_BUSY_IN = '0') then if (too_much_data = '0') then dissect_next_state <= WAIT_FOR_LOAD; @@ -602,78 +503,92 @@ begin end if; when WAIT_FOR_LOAD => - state <= x"8"; - if (PS_SELECTED_IN = '1') then + state <= x"7"; + if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then dissect_next_state <= LOAD_FRAME; else dissect_next_state <= WAIT_FOR_LOAD; end if; - + when LOAD_FRAME => - state <= x"9"; + state <= x"8"; if (tx_loaded_ctr = tx_data_ctr) then dissect_next_state <= CLEANUP; + elsif (tx_frame_loaded = g_MAX_FRAME_SIZE) then + dissect_next_state <= DIVIDE; else dissect_next_state <= LOAD_FRAME; end if; + + when DIVIDE => + state <= x"c"; + if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then + dissect_next_state <= LOAD_FRAME; + else + dissect_next_state <= DIVIDE; + end if; when CLEANUP => - state <= x"b"; + state <= x"9"; + dissect_next_state <= IDLE; + + when others => + state <= x"1"; dissect_next_state <= IDLE; end case; end process DISSECT_MACHINE; ----- counter of bytes of currently constructed frame ---FRAME_LOADED_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1' or dissect_current_state = DIVIDE or dissect_current_state = IDLE) then --- tx_frame_loaded <= (others => '0'); --- elsif (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1') then --- tx_frame_loaded <= tx_frame_loaded + x"1"; --- end if; --- end if; ---end process FRAME_LOADED_PROC; --- ----- counter down to 0 of bytes that have to be transmitted for a given packet ---SIZE_LEFT_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1' or dissect_current_state = SAVE_RESPONSE) then --- size_left <= (others => '0'); --- elsif (dissect_current_state = WAIT_FOR_LOAD) then --- size_left <= tx_data_ctr; --- elsif (dissect_current_state = LOAD_FRAME and PS_SELECTED_IN = '1' and (tx_frame_loaded /= g_MAX_FRAME_SIZE)) then --- size_left <= size_left - x"1"; --- end if; --- end if; ---end process SIZE_LEFT_PROC; +-- counter of bytes of currently constructed frame +FRAME_LOADED_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1' or dissect_current_state = DIVIDE or dissect_current_state = IDLE) then + tx_frame_loaded <= (others => '0'); + elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then + tx_frame_loaded <= tx_frame_loaded + x"1"; + end if; + end if; +end process FRAME_LOADED_PROC; + +-- counter down to 0 of bytes that have to be transmitted for a given packet +SIZE_LEFT_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1' or dissect_current_state = SAVE_RESPONSE) then + size_left <= (others => '0'); + elsif (dissect_current_state = WAIT_FOR_LOAD) then + size_left <= tx_data_ctr; + elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1' and (tx_frame_loaded /= g_MAX_FRAME_SIZE)) then + size_left <= size_left - x"1"; + end if; + end if; +end process SIZE_LEFT_PROC; -- reset request packet detection - RESET_DETECTED_PROC : process(CLK) - begin - if rising_edge(CLK) then - if (RESET = '1' or dissect_current_state = CLEANUP) then - reset_detected <= '0'; - elsif (PS_DATA_IN(7 downto 0) = x"80" and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1' and saved_hdr_ctr = "0100") then--and dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then -- first byte as 0x80 - reset_detected <= '1'; - end if; - end if; - end process RESET_DETECTED_PROC; - - MAKE_RESET_PROC : process(CLK) - begin - if rising_edge(CLK) then - if (RESET = '1') then - make_reset <= '0'; - elsif (dissect_current_state = CLEANUP and reset_detected = '1') then - make_reset <= '1'; - end if; - end if; - end process MAKE_RESET_PROC; +RESET_DETECTED_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1' or dissect_current_state = CLEANUP) then + reset_detected <= '0'; + elsif (PS_DATA_IN(7 downto 0) = x"80" and dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then -- first byte as 0x80 + reset_detected <= '1'; + end if; + end if; +end process RESET_DETECTED_PROC; + +MAKE_RESET_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + make_reset <= '0'; + elsif (dissect_current_state = CLEANUP and reset_detected = '1') then + make_reset <= '1'; + end if; + end if; +end process MAKE_RESET_PROC; @@ -685,18 +600,17 @@ end process DISSECT_MACHINE; -- statistics ---REC_FRAMES_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- rec_frames <= (others => '0'); --- elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then --- rec_frames <= rec_frames + x"1"; --- end if; --- end if; ---end process REC_FRAMES_PROC; --- --- needed for identification +REC_FRAMES_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + rec_frames <= (others => '0'); + elsif (dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') then + rec_frames <= rec_frames + x"1"; + end if; + end if; +end process REC_FRAMES_PROC; + REPLY_CTR_PROC : process(CLK) begin if rising_edge(CLK) then @@ -707,99 +621,99 @@ begin end if; end if; end process REPLY_CTR_PROC; --- --- ---STATS_MACHINE_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- stats_current_state <= IDLE; --- else --- stats_current_state <= stats_next_state; --- end if; --- end if; ---end process STATS_MACHINE_PROC; --- ---STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, dissect_current_state, tx_loaded_ctr, tx_data_ctr) ---begin --- --- case (stats_current_state) is --- --- when IDLE => --- if ((dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = LOAD_FRAME and tx_loaded_ctr = tx_data_ctr)) then --- stats_next_state <= LOAD_RECEIVED; --- else --- stats_next_state <= IDLE; --- end if; --- --- when LOAD_RECEIVED => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= LOAD_REPLY; --- else --- stats_next_state <= LOAD_RECEIVED; --- end if; --- --- when LOAD_REPLY => --- if (STAT_DATA_ACK_IN = '1') then --- stats_next_state <= CLEANUP; --- else --- stats_next_state <= LOAD_REPLY; --- end if; --- --- when CLEANUP => --- stats_next_state <= IDLE; --- --- end case; --- ---end process STATS_MACHINE; --- ---SELECTOR : process(CLK) ---begin --- if rising_edge(CLK) then --- case(stats_current_state) is --- --- when LOAD_RECEIVED => --- stat_data_temp <= x"0502" & rec_frames; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); --- --- when LOAD_REPLY => --- stat_data_temp <= x"0503" & reply_ctr; --- STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); --- --- when others => --- stat_data_temp <= (others => '0'); --- STAT_ADDR_OUT <= (others => '0'); --- --- end case; --- end if; ---end process SELECTOR; --- ---STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); ---STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); ---STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); ---STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); --- ---STAT_SYNC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then --- STAT_DATA_RDY_OUT <= '1'; --- else --- STAT_DATA_RDY_OUT <= '0'; --- end if; --- end if; ---end process STAT_SYNC; -----STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; --- ----- end of statistics --- ----- **** debug ---DEBUG_OUT(3 downto 0) <= state; ---DEBUG_OUT(4) <= '0'; ---DEBUG_OUT(7 downto 5) <= "000"; ---DEBUG_OUT(8) <= '0'; ---DEBUG_OUT(11 downto 9) <= "000"; ---DEBUG_OUT(31 downto 12) <= (others => '0'); ----- **** + + +STATS_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + stats_current_state <= IDLE; + else + stats_current_state <= stats_next_state; + end if; + end if; +end process STATS_MACHINE_PROC; + +STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, dissect_current_state, tx_loaded_ctr, tx_data_ctr) +begin + + case (stats_current_state) is + + when IDLE => + if ((dissect_current_state = IDLE and PS_WR_EN_IN = '1' and PS_ACTIVATE_IN = '1') or (dissect_current_state = LOAD_FRAME and tx_loaded_ctr = tx_data_ctr)) then + stats_next_state <= LOAD_RECEIVED; + else + stats_next_state <= IDLE; + end if; + + when LOAD_RECEIVED => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= LOAD_REPLY; + else + stats_next_state <= LOAD_RECEIVED; + end if; + + when LOAD_REPLY => + if (STAT_DATA_ACK_IN = '1') then + stats_next_state <= CLEANUP; + else + stats_next_state <= LOAD_REPLY; + end if; + + when CLEANUP => + stats_next_state <= IDLE; + + end case; + +end process STATS_MACHINE; + +SELECTOR : process(CLK) +begin + if rising_edge(CLK) then + case(stats_current_state) is + + when LOAD_RECEIVED => + stat_data_temp <= x"0502" & rec_frames; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE, 8)); + + when LOAD_REPLY => + stat_data_temp <= x"0503" & reply_ctr; + STAT_ADDR_OUT <= std_logic_vector(to_unsigned(STAT_ADDRESS_BASE + 1, 8)); + + when others => + stat_data_temp <= (others => '0'); + STAT_ADDR_OUT <= (others => '0'); + + end case; + end if; +end process SELECTOR; + +STAT_DATA_OUT(7 downto 0) <= stat_data_temp(31 downto 24); +STAT_DATA_OUT(15 downto 8) <= stat_data_temp(23 downto 16); +STAT_DATA_OUT(23 downto 16) <= stat_data_temp(15 downto 8); +STAT_DATA_OUT(31 downto 24) <= stat_data_temp(7 downto 0); + +STAT_SYNC : process(CLK) +begin + if rising_edge(CLK) then + if (stats_current_state /= IDLE and stats_current_state /= CLEANUP) then + STAT_DATA_RDY_OUT <= '1'; + else + STAT_DATA_RDY_OUT <= '0'; + end if; + end if; +end process STAT_SYNC; +--STAT_DATA_RDY_OUT <= '1' when stats_current_state /= IDLE and stats_current_state /= CLEANUP else '0'; + +-- end of statistics + +-- **** debug +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(4) <= '0'; +DEBUG_OUT(7 downto 5) <= "000"; +DEBUG_OUT(8) <= '0'; +DEBUG_OUT(11 downto 9) <= "000"; +DEBUG_OUT(31 downto 12) <= (others => '0'); +-- **** end architecture RTL; diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_Trash.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_Trash.vhd index 4845606..bf85023 100644 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_Trash.vhd +++ b/gbe2_ecp3/trb_net16_gbe_response_constructor_Trash.vhd @@ -15,8 +15,6 @@ use work.trb_net_gbe_components.all; -- simply clears the fifo from garbage entity trb_net16_gbe_response_constructor_Trash is -generic ( STAT_ADDRESS_BASE : integer := 0 -); port ( CLK : in std_logic; -- system clock RESET : in std_logic; @@ -38,7 +36,6 @@ port ( TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_SIZE_LEFT_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); @@ -47,16 +44,9 @@ port ( TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); -- END OF INTERFACE diff --git a/gbe2_ecp3/trb_net16_gbe_response_constructor_TrbNetData.vhd b/gbe2_ecp3/trb_net16_gbe_response_constructor_TrbNetData.vhd deleted file mode 100644 index 69d4b54..0000000 --- a/gbe2_ecp3/trb_net16_gbe_response_constructor_TrbNetData.vhd +++ /dev/null @@ -1,372 +0,0 @@ -LIBRARY IEEE; -USE IEEE.std_logic_1164.ALL; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; - -use work.trb_net_gbe_components.all; -use work.trb_net_gbe_protocols.all; - -entity trb_net16_gbe_response_constructor_TrbNetData is -port ( - CLK : in std_logic; -- system clock - RESET : in std_logic; - --- INTERFACE - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; - RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); - SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); --- END OF INTERFACE - - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; - --- debug - DEBUG_OUT : out std_logic_vector(31 downto 0) -); -end trb_net16_gbe_response_constructor_TrbNetData; - - -architecture trb_net16_gbe_response_constructor_TrbNetData of trb_net16_gbe_response_constructor_TrbNetData is - -attribute syn_encoding : string; - -signal ip_cfg_start : std_logic; -signal ip_cfg_bank : std_logic_vector(3 downto 0); -signal ip_cfg_done : std_logic; -signal ip_cfg_mem_addr : std_logic_vector(7 downto 0); -signal ip_cfg_mem_data : std_logic_vector(31 downto 0); -signal ip_cfg_mem_clk : std_logic; - -signal ic_dest_mac : std_logic_vector(47 downto 0); -signal ic_dest_ip : std_logic_vector(31 downto 0); -signal ic_dest_udp : std_logic_vector(15 downto 0); -signal ic_src_mac : std_logic_vector(47 downto 0); -signal ic_src_ip : std_logic_vector(31 downto 0); -signal ic_src_udp : std_logic_vector(15 downto 0); - -signal pc_wr_en : std_logic; -signal pc_data : std_logic_vector(7 downto 0); -signal pc_eod : std_logic; -signal pc_sos : std_logic; -signal pc_ready : std_logic; -signal pc_padding : std_logic; -signal pc_event_id : std_logic_vector(31 downto 0); -signal pc_sub_size : std_logic_vector(31 downto 0); -signal pc_trig_nr : std_logic_vector(31 downto 0); -signal pc_eos : std_logic; -signal pc_transmit_on : std_logic; - -signal tc_rd_en : std_logic; -signal tc_data : std_logic_vector(8 downto 0); -signal tc_size : std_logic_vector(15 downto 0); -signal tc_sod : std_logic; -signal pc_trig_type : std_logic_vector(3 downto 0); - -type dissect_states is (IDLE, WAIT_FOR_LOAD, LOAD, CLEANUP); -signal dissect_current_state, dissect_next_state : dissect_states; -attribute syn_encoding of dissect_current_state : signal is "onehot"; - -signal event_bytes : std_logic_vector(15 downto 0); -signal loaded_bytes : std_logic_vector(15 downto 0); -signal sent_packets : std_logic_vector(15 downto 0); - -begin - - -THE_IP_CONFIGURATOR: ip_configurator -port map( - CLK => CLK, - RESET => RESET, - -- configuration interface - START_CONFIG_IN => ip_cfg_start, - BANK_SELECT_IN => ip_cfg_bank, - CONFIG_DONE_OUT => ip_cfg_done, - MEM_ADDR_OUT => ip_cfg_mem_addr, - MEM_DATA_IN => ip_cfg_mem_data, - MEM_CLK_OUT => ip_cfg_mem_clk, - -- information for IP cores - DEST_MAC_OUT => ic_dest_mac, - DEST_IP_OUT => ic_dest_ip, - DEST_UDP_OUT => ic_dest_udp, - SRC_MAC_OUT => ic_src_mac, - SRC_IP_OUT => ic_src_ip, - SRC_UDP_OUT => ic_src_udp, - MTU_OUT => open, - -- Debug - DEBUG_OUT => open -); - -MB_IP_CONFIG: slv_mac_memory -port map( - CLK => CLK, - RESET => RESET, - BUSY_IN => '0', - -- Slave bus - SLV_ADDR_IN => SLV_ADDR_IN, - SLV_READ_IN => SLV_READ_IN, - SLV_WRITE_IN => SLV_WRITE_IN, - SLV_BUSY_OUT => SLV_BUSY_OUT, - SLV_ACK_OUT => SLV_ACK_OUT, - SLV_DATA_IN => SLV_DATA_IN, - SLV_DATA_OUT => SLV_DATA_OUT, - -- I/O to the backend - MEM_CLK_IN => ip_cfg_mem_clk, - MEM_ADDR_IN => ip_cfg_mem_addr, - MEM_DATA_OUT => ip_cfg_mem_data, - -- Status lines - STAT => open -); - -THE_IPU_INTERFACE: trb_net16_gbe_ipu_interface --ipu2gbe -port map( - CLK_IPU => CLK, - CLK_GBE => CLK, - RESET => RESET, - --Event information coming from CTS - CTS_NUMBER_IN => CTS_NUMBER_IN, - CTS_CODE_IN => CTS_CODE_IN, - CTS_INFORMATION_IN => CTS_INFORMATION_IN, - CTS_READOUT_TYPE_IN => CTS_READOUT_TYPE_IN, - CTS_START_READOUT_IN => CTS_START_READOUT_IN, - --Information sent to CTS - --status data, equipped with DHDR - CTS_DATA_OUT => CTS_DATA_OUT, - CTS_DATAREADY_OUT => CTS_DATAREADY_OUT, - CTS_READOUT_FINISHED_OUT => CTS_READOUT_FINISHED_OUT, - CTS_READ_IN => CTS_READ_IN, - CTS_LENGTH_OUT => CTS_LENGTH_OUT, - CTS_ERROR_PATTERN_OUT => CTS_ERROR_PATTERN_OUT, - -- Data from Frontends - FEE_DATA_IN => FEE_DATA_IN, - FEE_DATAREADY_IN => FEE_DATAREADY_IN, - FEE_READ_OUT => FEE_READ_OUT, - FEE_STATUS_BITS_IN => FEE_STATUS_BITS_IN, - FEE_BUSY_IN => FEE_BUSY_IN, - -- slow control interface - START_CONFIG_OUT => ip_cfg_start, - BANK_SELECT_OUT => ip_cfg_bank, - CONFIG_DONE_IN => ip_cfg_done, - DATA_GBE_ENABLE_IN => CFG_GBE_ENABLE_IN, - DATA_IPU_ENABLE_IN => CFG_IPU_ENABLE_IN, - MULT_EVT_ENABLE_IN => '0', --CFG_MULT_ENABLE_IN, - MAX_MESSAGE_SIZE_IN => x"0000_0fd0", - MIN_MESSAGE_SIZE_IN => x"0000_0007", - READOUT_CTR_IN => x"00_0000", - READOUT_CTR_VALID_IN => '0', - ALLOW_LARGE_IN => '0', - -- PacketConstructor interface - PC_WR_EN_OUT => pc_wr_en, - PC_DATA_OUT => pc_data, - PC_READY_IN => pc_ready, - PC_SOS_OUT => pc_sos, - PC_EOS_OUT => pc_eos, - PC_EOD_OUT => pc_eod, - PC_SUB_SIZE_OUT => pc_sub_size, - PC_TRIG_NR_OUT => pc_trig_nr, - PC_TRIGGER_TYPE_OUT => pc_trig_type, - PC_PADDING_OUT => pc_padding, - MONITOR_OUT => open, - DEBUG_OUT => open -); - ---TODO: add missing values from setup -PACKET_CONSTRUCTOR : trb_net16_gbe_event_constr --trb_net16_gbe_packet_constr -port map( - CLK => CLK, - RESET => RESET, - MULT_EVT_ENABLE_IN => '0', - PC_WR_EN_IN => pc_wr_en, - PC_DATA_IN => pc_data, - PC_READY_OUT => pc_ready, - PC_START_OF_SUB_IN => pc_sos, - PC_END_OF_SUB_IN => pc_eos, - PC_END_OF_DATA_IN => pc_eod, - PC_TRANSMIT_ON_OUT => pc_transmit_on, - PC_SUB_SIZE_IN => pc_sub_size, - PC_PADDING_IN => pc_padding, - PC_DECODING_IN => x"0002_0001", --pc_decoding, - PC_EVENT_ID_IN => x"0000_8000", --pc_event_id, - PC_TRIG_NR_IN => pc_trig_nr, - PC_TRIGGER_TYPE_IN => pc_trig_type, - PC_QUEUE_DEC_IN => x"0003_0062", --pc_queue_dec, - PC_MAX_FRAME_SIZE_IN => g_MAX_FRAME_SIZE, - PC_MAX_QUEUE_SIZE_IN => x"0000_0fd0", - PC_DELAY_IN => (others => '0'), - TC_RD_EN_IN => tc_rd_en, - TC_DATA_OUT => tc_data, - TC_EVENT_SIZE_OUT => tc_size, - TC_SOD_OUT => tc_sod, - DEBUG_OUT => open -); - -tc_rd_en <= '1' when PS_SELECTED_IN = '1' and TC_RD_EN_IN = '1' else '0'; - -DISSECT_MACHINE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - dissect_current_state <= IDLE; - else - dissect_current_state <= dissect_next_state; - end if; - end if; -end process DISSECT_MACHINE_PROC; - -DISSECT_MACHINE : process(dissect_current_state, tc_sod, event_bytes, loaded_bytes, PS_SELECTED_IN) -begin - case dissect_current_state is - - when IDLE => - if (tc_sod = '1') then - dissect_next_state <= WAIT_FOR_LOAD; - else - dissect_next_state <= IDLE; - end if; - - when WAIT_FOR_LOAD => - if (PS_SELECTED_IN = '1') then - dissect_next_state <= LOAD; - else - dissect_next_state <= WAIT_FOR_LOAD; - end if; - - when LOAD => - if (event_bytes = loaded_bytes) then - dissect_next_state <= CLEANUP; - else - dissect_next_state <= LOAD; - end if; - - when CLEANUP => - dissect_next_state <= IDLE; - - end case; -end process DISSECT_MACHINE; - -PS_BUSY_OUT <= '0' when dissect_current_state = IDLE else '1'; -PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = LOAD) or (dissect_current_state = WAIT_FOR_LOAD) else '0'; - -TC_DATA_OUT <= tc_data; ---TC_DATA_EOD_PROC : process (clk) is ---begin --- if rising_edge(clk) then --- if (dissect_current_state = LOAD and event_bytes = loaded_bytes - x"2") then --- TC_DATA_OUT(8) <= '1'; --- else --- TC_DATA_OUT(8) <= '0'; --- end if; --- end if; ---end process TC_DATA_EOD_PROC; - -EVENT_BYTES_PROC : process (clk) is -begin - if rising_edge(clk) then - if dissect_current_state = IDLE and tc_sod = '1' then - event_bytes <= tc_size + x"20"; -- adding termination bytes - else - event_bytes <= event_bytes; - end if; - end if; -end process EVENT_BYTES_PROC; - -LOADED_BYTES_PROC : process (clk) is -begin - if rising_edge(clk) then - if (dissect_current_state = IDLE) then - loaded_bytes <= (others => '0'); - elsif (dissect_current_state = LOAD and TC_RD_EN_IN = '1') then - loaded_bytes <= loaded_bytes + x"1"; - else - loaded_bytes <= loaded_bytes; - end if; - end if; -end process LOADED_BYTES_PROC; - -TC_FRAME_SIZE_OUT <= event_bytes; -TC_FRAME_TYPE_OUT <= x"0008"; -TC_DEST_MAC_OUT <= ic_dest_mac; -TC_DEST_IP_OUT <= ic_dest_ip; -TC_DEST_UDP_OUT <= ic_dest_udp; -TC_SRC_MAC_OUT <= g_MY_MAC; -TC_SRC_IP_OUT <= g_MY_IP; -TC_SRC_UDP_OUT <= ic_src_udp; -TC_IP_PROTOCOL_OUT <= x"11"; -TC_IDENT_OUT <= x"4" & sent_packets(11 downto 0); - -SENT_PACKETS_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - sent_packets <= (others => '0'); - elsif (dissect_current_state = IDLE and tc_sod = '1') then - sent_packets <= sent_packets + x"1"; - end if; - end if; -end process SENT_PACKETS_PROC; - - -end trb_net16_gbe_response_constructor_TrbNetData; - - diff --git a/gbe2_ecp3/trb_net16_gbe_setup.vhd b/gbe2_ecp3/trb_net16_gbe_setup.vhd index 5e43f94..598d650 100644 --- a/gbe2_ecp3/trb_net16_gbe_setup.vhd +++ b/gbe2_ecp3/trb_net16_gbe_setup.vhd @@ -94,9 +94,6 @@ port( DBG_SELECT_SENT_IN : in std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); DBG_SELECT_PROTOS_IN : in std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - SCTRL_DUMMY_SIZE_OUT : out std_logic_vector(15 downto 0); - SCTRL_DUMMY_PAUSE_OUT : out std_logic_vector(31 downto 0); - DBG_FIFO_Q_IN : in std_logic_vector(15 downto 0) --DBG_RESET_FIFO_OUT : out std_logic -- gk 28.09.10 ); @@ -134,8 +131,6 @@ signal allowed_udp : std_logic_vector(31 downto 0); signal vlan_id : std_logic_vector(31 downto 0); signal allow_brdcst_eth : std_logic; signal allow_brdcst_ip : std_logic; -signal dummy_size : std_logic_vector(15 downto 0); -signal dummy_pause : std_logic_vector(31 downto 0); begin @@ -167,8 +162,6 @@ begin GBE_ALLOWED_IP_OUT <= allowed_ip; GBE_ALLOWED_UDP_OUT <= allowed_udp; GBE_VLAN_ID_OUT <= vlan_id; - SCTRL_DUMMY_SIZE_OUT <= dummy_size; - SCTRL_DUMMY_PAUSE_OUT <= dummy_pause; end if; end process OUT_PROC; @@ -216,8 +209,6 @@ begin vlan_id <= x"0000_0000"; -- no vlan id by default allow_brdcst_eth <= '1'; allow_brdcst_ip <= '1'; - dummy_size <= x"0100"; - dummy_pause <= x"0040_0000"; elsif (BUS_WRITE_EN_IN = '1') then case BUS_ADDR_IN is @@ -236,7 +227,6 @@ begin when x"04" => max_frame <= BUS_DATA_IN(15 downto 0); - g_MAX_FRAME_SIZE <= BUS_DATA_IN(15 downto 0); when x"05" => if (BUS_DATA_IN = x"0000_0000") then @@ -303,12 +293,6 @@ begin when x"12" => allowed_udp <= BUS_DATA_IN; - - when x"13" => - dummy_size <= BUS_DATA_IN(15 downto 0); - - when x"14" => - dummy_pause <= BUS_DATA_IN; -- gk 28.09.10 when x"fe" => @@ -350,8 +334,6 @@ begin allowed_udp <= allowed_udp; allow_brdcst_eth <= allow_brdcst_eth; allow_brdcst_ip <= allow_brdcst_ip; - dummy_size <= dummy_size; - dummy_pause <= dummy_pause; end case; else @@ -447,169 +429,162 @@ begin when x"12" => data_out <= allowed_udp; - - when x"13" => - data_out(15 downto 0) <= dummy_size; + + -- gk 01.06.10 + when x"e0" => + data_out <= DBG_IPU2GBE1_IN; + + when x"e1" => + data_out <= DBG_IPU2GBE2_IN; + + when x"e2" => + data_out <= DBG_PC1_IN; + + when x"e3" => + data_out <= DBG_PC2_IN; + + when x"e4" => + data_out <= DBG_FC1_IN; + + when x"e5" => + data_out <= DBG_FC2_IN; + + when x"e6" => + data_out <= DBG_FT1_IN; + + when x"e7" => + data_out <= DBG_FT2_IN; + + when x"e8" => + data_out(15 downto 0) <= DBG_FIFO_Q_IN; data_out(31 downto 16) <= (others => '0'); + + when x"e9" => + data_out <= DBG_IPU2GBE3_IN; + + when x"ea" => + data_out <= DBG_IPU2GBE4_IN; + + when x"eb" => + data_out <= DBG_IPU2GBE5_IN; + + when x"ec" => + data_out <= DBG_IPU2GBE6_IN; + + when x"ed" => + data_out <= DBG_IPU2GBE7_IN; + + when x"ee" => + data_out <= DBG_IPU2GBE8_IN; + + when x"ef" => + data_out <= DBG_IPU2GBE9_IN; + + when x"f0" => + data_out <= DBG_IPU2GBE10_IN; + + when x"f1" => + data_out <= DBG_IPU2GBE11_IN; + + when x"f2" => + data_out <= DBG_IPU2GBE12_IN; + + when x"f3" => + data_out <= MONITOR_BYTES_IN; + + when x"f4" => + data_out <= MONITOR_SENT_IN; + + when x"f5" => + data_out <= MONITOR_DROPPED_IN; + + when x"f6" => + data_out <= MONITOR_SM_IN; + + when x"f7" => + data_out <= MONITOR_LR_IN; + + when x"f8" => + data_out <= MONITOR_HDR_IN; + + when x"f9" => + data_out <= MONITOR_FIFOS_IN; + + when x"fa" => + data_out <= MONITOR_DISCFRM_IN; + + when x"fb" => + data_out <= MONITOR_LINK_DWN_IN; + + when x"fc" => + data_out <= MONITOR_EMPTY_IN; + + --when x"d1" => + -- data_out <= DBG_FR_IN; + + --when x"d2" => + -- data_out <= DBG_RC_IN; + + --when x"d4" => + -- data_out <= DBG_TC_IN; + + -- **** receive debug section + + when x"a0" => + data_out <= DBG_FR_IN(31 downto 0); -- received frames from tsmac | state machine | fifos status + + when x"a1" => + data_out <= DBG_FR_IN(63 downto 32); -- dropped | accepted frames + + when x"a2" => + data_out <= MONITOR_RX_FRAMES_IN; + + when x"a3" => + data_out <= MONITOR_RX_BYTES_IN; + + when x"a4" => + data_out <= MONITOR_RX_BYTES_R_IN; + + when x"a5" => + data_out <= DBG_MC_IN(31 downto 0); + + + -- *** debug of response constructors + + -- Forward + when x"b0" => + data_out(15 downto 0) <= DBG_SELECT_REC_IN(1 * 16 - 1 downto 0 * 16); + data_out(31 downto 16) <= DBG_SELECT_SENT_IN(1 * 16 - 1 downto 0 * 16); + when x"b1" => + data_out <= DBG_SELECT_PROTOS_IN(1 * 32 - 1 downto 0 * 32); + + -- ARP + when x"b2" => + data_out(15 downto 0) <= DBG_SELECT_REC_IN(2 * 16 - 1 downto 1 * 16); + data_out(31 downto 16) <= DBG_SELECT_SENT_IN(2 * 16 - 1 downto 1 * 16); + when x"b3" => + data_out <= DBG_SELECT_PROTOS_IN(2 * 32 - 1 downto 1 * 32); + + -- Test + when x"b4" => + data_out(15 downto 0) <= DBG_SELECT_REC_IN(3 * 16 - 1 downto 2 * 16); + data_out(31 downto 16) <= DBG_SELECT_SENT_IN(3 * 16 - 1 downto 2 * 16); + when x"b5" => + data_out <= DBG_SELECT_PROTOS_IN(3 * 32 - 1 downto 2 * 32); + + -- DHCP + when x"b6" => + data_out(15 downto 0) <= DBG_SELECT_REC_IN(4 * 16 - 1 downto 3 * 16); + data_out(31 downto 16) <= DBG_SELECT_SENT_IN(4 * 16 - 1 downto 3 * 16); + when x"b7" => + data_out <= DBG_SELECT_PROTOS_IN(4 * 32 - 1 downto 3 * 32); - when x"14" => - data_out <= dummy_pause; - --- -- gk 01.06.10 --- when x"e0" => --- data_out <= DBG_IPU2GBE1_IN; --- --- when x"e1" => --- data_out <= DBG_IPU2GBE2_IN; --- --- when x"e2" => --- data_out <= DBG_PC1_IN; --- --- when x"e3" => --- data_out <= DBG_PC2_IN; --- --- when x"e4" => --- data_out <= DBG_FC1_IN; --- --- when x"e5" => --- data_out <= DBG_FC2_IN; --- --- when x"e6" => --- data_out <= DBG_FT1_IN; --- --- when x"e7" => --- data_out <= DBG_FT2_IN; --- --- when x"e8" => --- data_out(15 downto 0) <= DBG_FIFO_Q_IN; --- data_out(31 downto 16) <= (others => '0'); --- --- when x"e9" => --- data_out <= DBG_IPU2GBE3_IN; --- --- when x"ea" => --- data_out <= DBG_IPU2GBE4_IN; --- --- when x"eb" => --- data_out <= DBG_IPU2GBE5_IN; --- --- when x"ec" => --- data_out <= DBG_IPU2GBE6_IN; --- --- when x"ed" => --- data_out <= DBG_IPU2GBE7_IN; --- --- when x"ee" => --- data_out <= DBG_IPU2GBE8_IN; --- --- when x"ef" => --- data_out <= DBG_IPU2GBE9_IN; --- --- when x"f0" => --- data_out <= DBG_IPU2GBE10_IN; --- --- when x"f1" => --- data_out <= DBG_IPU2GBE11_IN; --- --- when x"f2" => --- data_out <= DBG_IPU2GBE12_IN; --- --- when x"f3" => --- data_out <= MONITOR_BYTES_IN; --- --- when x"f4" => --- data_out <= MONITOR_SENT_IN; --- --- when x"f5" => --- data_out <= MONITOR_DROPPED_IN; --- --- when x"f6" => --- data_out <= MONITOR_SM_IN; --- --- when x"f7" => --- data_out <= MONITOR_LR_IN; --- --- when x"f8" => --- data_out <= MONITOR_HDR_IN; --- --- when x"f9" => --- data_out <= MONITOR_FIFOS_IN; --- --- when x"fa" => --- data_out <= MONITOR_DISCFRM_IN; --- --- when x"fb" => --- data_out <= MONITOR_LINK_DWN_IN; --- --- when x"fc" => --- data_out <= MONITOR_EMPTY_IN; --- --- --when x"d1" => --- -- data_out <= DBG_FR_IN; --- --- --when x"d2" => --- -- data_out <= DBG_RC_IN; --- --- --when x"d4" => --- -- data_out <= DBG_TC_IN; --- --- -- **** receive debug section --- --- when x"a0" => --- data_out <= DBG_FR_IN(31 downto 0); -- received frames from tsmac | state machine | fifos status --- --- when x"a1" => --- data_out <= DBG_FR_IN(63 downto 32); -- dropped | accepted frames --- --- when x"a2" => --- data_out <= MONITOR_RX_FRAMES_IN; --- --- when x"a3" => --- data_out <= MONITOR_RX_BYTES_IN; --- --- when x"a4" => --- data_out <= MONITOR_RX_BYTES_R_IN; --- --- when x"a5" => --- data_out <= DBG_MC_IN(31 downto 0); --- --- --- -- *** debug of response constructors --- --- -- Forward --- when x"b0" => --- data_out(15 downto 0) <= DBG_SELECT_REC_IN(1 * 16 - 1 downto 0 * 16); --- data_out(31 downto 16) <= DBG_SELECT_SENT_IN(1 * 16 - 1 downto 0 * 16); --- when x"b1" => --- data_out <= DBG_SELECT_PROTOS_IN(1 * 32 - 1 downto 0 * 32); --- --- -- ARP --- when x"b2" => --- data_out(15 downto 0) <= DBG_SELECT_REC_IN(2 * 16 - 1 downto 1 * 16); --- data_out(31 downto 16) <= DBG_SELECT_SENT_IN(2 * 16 - 1 downto 1 * 16); --- when x"b3" => --- data_out <= DBG_SELECT_PROTOS_IN(2 * 32 - 1 downto 1 * 32); --- --- -- Test --- when x"b4" => --- data_out(15 downto 0) <= DBG_SELECT_REC_IN(3 * 16 - 1 downto 2 * 16); --- data_out(31 downto 16) <= DBG_SELECT_SENT_IN(3 * 16 - 1 downto 2 * 16); --- when x"b5" => --- data_out <= DBG_SELECT_PROTOS_IN(3 * 32 - 1 downto 2 * 32); --- --- -- DHCP --- when x"b6" => --- data_out(15 downto 0) <= DBG_SELECT_REC_IN(4 * 16 - 1 downto 3 * 16); --- data_out(31 downto 16) <= DBG_SELECT_SENT_IN(4 * 16 - 1 downto 3 * 16); --- when x"b7" => --- data_out <= DBG_SELECT_PROTOS_IN(4 * 32 - 1 downto 3 * 32); --- --- -- PING --- when x"b8" => --- data_out(15 downto 0) <= DBG_SELECT_REC_IN(5 * 16 - 1 downto 4 * 16); --- data_out(31 downto 16) <= DBG_SELECT_SENT_IN(5 * 16 - 1 downto 4 * 16); --- when x"b9" => --- data_out <= DBG_SELECT_PROTOS_IN(5 * 32 - 1 downto 4 * 32); + -- PING + when x"b8" => + data_out(15 downto 0) <= DBG_SELECT_REC_IN(5 * 16 - 1 downto 4 * 16); + data_out(31 downto 16) <= DBG_SELECT_SENT_IN(5 * 16 - 1 downto 4 * 16); + when x"b9" => + data_out <= DBG_SELECT_PROTOS_IN(5 * 32 - 1 downto 4 * 32); -- Trash --when x"b8" => diff --git a/gbe2_ecp3/trb_net16_gbe_transmit_control.vhd b/gbe2_ecp3/trb_net16_gbe_transmit_control.vhd index 825ee80..cf0fbc3 100644 --- a/gbe2_ecp3/trb_net16_gbe_transmit_control.vhd +++ b/gbe2_ecp3/trb_net16_gbe_transmit_control.vhd @@ -11,114 +11,262 @@ use work.trb_net16_hub_func.all; use work.trb_net_gbe_protocols.all; --******** --- doing shit right now +-- multiplexes the output stream between data and slow control frames +-- creates slow control frames entity trb_net16_gbe_transmit_control is port ( - CLK : in std_logic; - RESET : in std_logic; + CLK : in std_logic; -- system clock + RESET : in std_logic; + +-- signals to/from packet constructor + PC_READY_IN : in std_logic; + PC_DATA_IN : in std_logic_vector(7 downto 0); + PC_WR_EN_IN : in std_logic; + PC_IP_SIZE_IN : in std_logic_vector(15 downto 0); + PC_UDP_SIZE_IN : in std_logic_vector(15 downto 0); + PC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0); + PC_SOD_IN : in std_logic; + PC_EOD_IN : in std_logic; + PC_FC_READY_OUT : out std_logic; + PC_FC_H_READY_OUT : out std_logic; + PC_TRANSMIT_ON_IN : in std_logic; + + -- signals from ip_configurator used by packet constructor + IC_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + IC_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + IC_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); + IC_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + IC_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + IC_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- signal to/from main controller - MC_TRANSMIT_CTRL_IN : in std_logic; - MC_DATA_IN : in std_logic_vector(8 downto 0); - MC_WR_EN_IN : in std_logic; - MC_DATA_NOT_VALID_IN : in std_logic; - MC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - MC_FRAME_TYPE_IN : in std_logic_vector(15 downto 0); - - MC_DEST_MAC_IN : in std_logic_vector(47 downto 0); - MC_DEST_IP_IN : in std_logic_vector(31 downto 0); - MC_DEST_UDP_IN : in std_logic_vector(15 downto 0); - MC_SRC_MAC_IN : in std_logic_vector(47 downto 0); - MC_SRC_IP_IN : in std_logic_vector(31 downto 0); - MC_SRC_UDP_IN : in std_logic_vector(15 downto 0); + MC_TRANSMIT_CTRL_IN : in std_logic; -- slow control frame is waiting to be built and sent + MC_TRANSMIT_DATA_IN : in std_logic; + MC_DATA_IN : in std_logic_vector(8 downto 0); + MC_RD_EN_OUT : out std_logic; + MC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); + MC_FRAME_TYPE_IN : in std_logic_vector(15 downto 0); - MC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0); - MC_IDENT_IN : in std_logic_vector(15 downto 0); + MC_DEST_MAC_IN : in std_logic_vector(47 downto 0); + MC_DEST_IP_IN : in std_logic_vector(31 downto 0); + MC_DEST_UDP_IN : in std_logic_vector(15 downto 0); + MC_SRC_MAC_IN : in std_logic_vector(47 downto 0); + MC_SRC_IP_IN : in std_logic_vector(31 downto 0); + MC_SRC_UDP_IN : in std_logic_vector(15 downto 0); - MC_IP_SIZE_IN : in std_logic_vector(15 downto 0); - MC_UDP_SIZE_IN : in std_logic_vector(15 downto 0); - MC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0); + MC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0); - MC_FC_H_READY_OUT : out std_logic; - MC_FC_READY_OUT : out std_logic; - MC_FC_WR_EN_IN : in std_logic; + MC_IP_SIZE_IN : in std_logic_vector(15 downto 0); + MC_UDP_SIZE_IN : in std_logic_vector(15 downto 0); + MC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0); - MC_BUSY_OUT : out std_logic; - MC_TRANSMIT_DONE_OUT : out std_logic; + MC_BUSY_OUT : out std_logic; + MC_TRANSMIT_DONE_OUT : out std_logic; -- signal to/from frame constructor - FC_DATA_OUT : out std_logic_vector(7 downto 0); - FC_WR_EN_OUT : out std_logic; - FC_READY_IN : in std_logic; - FC_H_READY_IN : in std_logic; - FC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - FC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_IDENT_OUT : out std_logic_vector(15 downto 0); -- internal packet counter - FC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); - FC_SOD_OUT : out std_logic; - FC_EOD_OUT : out std_logic; - FC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - - DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); + FC_DATA_OUT : out std_logic_vector(7 downto 0); + FC_WR_EN_OUT : out std_logic; + FC_READY_IN : in std_logic; + FC_H_READY_IN : in std_logic; + FC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + FC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + FC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + FC_IDENT_OUT : out std_logic_vector(15 downto 0); -- internal packet counter + FC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + FC_SOD_OUT : out std_logic; + FC_EOD_OUT : out std_logic; + FC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + + DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); + DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); + DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); + SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); + SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); + SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); + -- debug - DEBUG_OUT : out std_logic_vector(63 downto 0) + DEBUG_OUT : out std_logic_vector(63 downto 0) ); end trb_net16_gbe_transmit_control; architecture trb_net16_gbe_transmit_control of trb_net16_gbe_transmit_control is +--attribute HGROUP : string; +--attribute HGROUP of trb_net16_gbe_transmit_control : architecture is "GBE_BUF_group"; + +attribute syn_encoding : string; + +type tx_states is (IDLE, TRANSMIT_DATA, TRANSMIT_CTRL, CLEANUP); +signal tx_current_state, tx_next_state : tx_states; +attribute syn_encoding of tx_current_state: signal is "safe,gray"; + +type ctrl_construct_states is (IDLE, WAIT_FOR_FC, LOAD_DATA, CLOSE, CLEANUP); +signal ctrl_construct_current_state, ctrl_construct_next_state : ctrl_construct_states; +attribute syn_encoding of ctrl_construct_current_state: signal is "safe,gray"; + +signal ctrl_sod : std_logic; +signal delayed_wr_en : std_logic; +signal delayed_wr_en_q : std_logic; +signal sent_bytes_ctr : std_logic_vector(15 downto 0); +signal sent_packets_ctr : std_logic_vector(15 downto 0); + +signal state : std_logic_vector(3 downto 0); +signal state2 : std_logic_vector(3 downto 0); +signal temp_frame_size : std_logic_vector(15 downto 0); +signal temp_ip_size : std_logic_vector(15 downto 0); + +attribute syn_preserve : boolean; +attribute syn_keep : boolean; +attribute syn_keep of temp_frame_size, temp_ip_size : signal is true; +attribute syn_preserve of temp_frame_size, temp_ip_size : signal is true; + + +begin + +temp_frame_size <= MC_FRAME_SIZE_IN; +temp_ip_size <= MC_IP_SIZE_IN; + +DEBUG_OUT(3 downto 0) <= state; +DEBUG_OUT(7 downto 4) <= state2; +DEBUG_OUT(31 downto 8) <= (others => '0'); + +MC_BUSY_OUT <= '0' when (tx_current_state = IDLE) + else '1'; + +MC_TRANSMIT_DONE_OUT <= '1' when (tx_current_state = CLEANUP) else '0'; + +TX_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + tx_current_state <= IDLE; + else + tx_current_state <= tx_next_state; + end if; + end if; +end process TX_MACHINE_PROC; + +TX_MACHINE : process(tx_current_state, MC_TRANSMIT_CTRL_IN, MC_TRANSMIT_DATA_IN, FC_READY_IN, PC_EOD_IN, ctrl_construct_current_state) begin + case tx_current_state is + + when IDLE => + state <= x"1"; + if (FC_READY_IN = '1') then +-- if (MC_TRANSMIT_DATA_IN = '1') then +-- tx_next_state <= TRANSMIT_DATA; +-- elsif (MC_TRANSMIT_CTRL_IN = '1') then +-- tx_next_state <= TRANSMIT_CTRL; + if (MC_TRANSMIT_CTRL_IN = '1') then + tx_next_state <= TRANSMIT_CTRL; + elsif (MC_TRANSMIT_DATA_IN = '1') then + tx_next_state <= TRANSMIT_DATA; + else + tx_next_state <= IDLE; + end if; + else + tx_next_state <= IDLE; + end if; + + when TRANSMIT_DATA => + state <= x"2"; + if (PC_EOD_IN = '1') then + tx_next_state <= CLEANUP; + else + tx_next_state <= TRANSMIT_DATA; + end if; + + when TRANSMIT_CTRL => + state <= x"3"; + if (ctrl_construct_current_state = CLOSE) then + tx_next_state <= CLEANUP; + else + tx_next_state <= TRANSMIT_CTRL; + end if; + + when CLEANUP => + state <= x"4"; + tx_next_state <= IDLE; + + end case; +end process TX_MACHINE; -SYNC_PROC : process(CLK) +-- in case of data from packet constructor use always IP +FC_FRAME_TYPE_OUT <= MC_FRAME_TYPE_IN when tx_current_state = TRANSMIT_CTRL else x"0008"; + +SELECTOR : process(CLK) begin if rising_edge(CLK) then - - MC_FC_H_READY_OUT <= FC_H_READY_IN; - MC_FC_READY_OUT <= FC_READY_IN; - FC_FRAME_TYPE_OUT <= MC_FRAME_TYPE_IN; + case tx_current_state is + + when TRANSMIT_DATA => + -- CHANGED FOR SIMPLE FRAME SENDER + FC_DATA_OUT <= PC_DATA_IN; + FC_SOD_OUT <= PC_SOD_IN; + FC_EOD_OUT <= PC_EOD_IN; + FC_IP_SIZE_OUT <= PC_IP_SIZE_IN; + FC_UDP_SIZE_OUT <= PC_UDP_SIZE_IN; + FC_FLAGS_OFFSET_OUT <= PC_FLAGS_OFFSET_IN; + FC_IDENT_OUT <= sent_packets_ctr; + DEST_MAC_ADDRESS_OUT <= IC_DEST_MAC_ADDRESS_IN; + DEST_IP_ADDRESS_OUT <= IC_DEST_IP_ADDRESS_IN; + DEST_UDP_PORT_OUT <= IC_DEST_UDP_PORT_IN; + SRC_MAC_ADDRESS_OUT <= IC_SRC_MAC_ADDRESS_IN; + SRC_IP_ADDRESS_OUT <= IC_SRC_IP_ADDRESS_IN; + SRC_UDP_PORT_OUT <= IC_SRC_UDP_PORT_IN; + + FC_IP_PROTOCOL_OUT <= x"11"; + + + when TRANSMIT_CTRL => FC_DATA_OUT <= MC_DATA_IN(7 downto 0); FC_IP_PROTOCOL_OUT <= MC_IP_PROTOCOL_IN; - if (MC_TRANSMIT_CTRL_IN = '1') then + if (ctrl_construct_current_state = WAIT_FOR_FC) and (FC_READY_IN = '1') then FC_SOD_OUT <= '1'; else FC_SOD_OUT <= '0'; end if; - if (MC_DATA_IN(8) = '1') then + --if (ctrl_construct_current_state = CLOSE) then + if (ctrl_construct_current_state = LOAD_DATA and sent_bytes_ctr = MC_FRAME_SIZE_IN - x"1") then FC_EOD_OUT <= '1'; else FC_EOD_OUT <= '0'; end if; - if (MC_FRAME_TYPE_IN = x"0008") then + if (MC_FRAME_TYPE_IN = x"0008") then -- in case of ip FC_IP_SIZE_OUT <= MC_IP_SIZE_IN; - FC_UDP_SIZE_OUT <= MC_UDP_SIZE_IN; + --if (MC_UDP_SIZE_IN > g_MAX_FRAME_SIZE) then + -- FC_UDP_SIZE_OUT <= MC_UDP_SIZE_IN; -- - x"1"; + --else + FC_UDP_SIZE_OUT <= MC_UDP_SIZE_IN; + --end if; else - FC_IP_SIZE_OUT <= MC_FRAME_SIZE_IN; - FC_UDP_SIZE_OUT <= MC_FRAME_SIZE_IN; + FC_IP_SIZE_OUT <= temp_frame_size; --MC_FRAME_SIZE_IN; + FC_UDP_SIZE_OUT <= temp_frame_size; --MC_FRAME_SIZE_IN; end if; - - if (MC_DATA_NOT_VALID_IN = '0' and MC_WR_EN_IN = '1') then - FC_WR_EN_OUT <= '1'; - else - FC_WR_EN_OUT <= '0'; - end if; - +-- FC_IP_SIZE_OUT <= temp_frame_size; --MC_FRAME_SIZE_IN; +-- FC_UDP_SIZE_OUT <= temp_frame_size; --MC_FRAME_SIZE_IN; FC_FLAGS_OFFSET_OUT <= MC_FLAGS_OFFSET_IN; + if (ctrl_construct_current_state = WAIT_FOR_FC) and (FC_H_READY_IN = '1') then + MC_RD_EN_OUT <= '1'; + delayed_wr_en <= '0'; --'1'; + elsif (ctrl_construct_current_state = LOAD_DATA) and (sent_bytes_ctr < MC_FRAME_SIZE_IN - x"2") then -- (sent_bytes_ctr /= MC_FRAME_SIZE_IN) then + MC_RD_EN_OUT <= '1'; + delayed_wr_en <= '1'; + else + MC_RD_EN_OUT <= '0'; + delayed_wr_en <= '0'; + end if; + DEST_MAC_ADDRESS_OUT <= MC_DEST_MAC_IN; DEST_IP_ADDRESS_OUT <= MC_DEST_IP_IN; DEST_UDP_PORT_OUT <= MC_DEST_UDP_IN; @@ -126,9 +274,121 @@ begin SRC_IP_ADDRESS_OUT <= MC_SRC_IP_IN; SRC_UDP_PORT_OUT <= MC_SRC_UDP_IN; - FC_IDENT_OUT <= MC_IDENT_IN; + FC_IDENT_OUT <= sent_packets_ctr; + + when others => + MC_RD_EN_OUT <= '0'; + FC_DATA_OUT <= (others => '0'); + delayed_wr_en <= '0'; + FC_SOD_OUT <= '0'; + FC_EOD_OUT <= '0'; + + end case; + + end if; +end process SELECTOR; + +FC_WR_EN_PROC : process(CLK) +begin + if rising_edge(CLK) then + delayed_wr_en_q <= delayed_wr_en; + + case tx_current_state is + when TRANSMIT_DATA => + FC_WR_EN_OUT <= PC_WR_EN_IN; + when TRANSMIT_CTRL => + FC_WR_EN_OUT <= delayed_wr_en_q; + when others => + FC_WR_EN_OUT <= '0'; + end case; + end if; +end process FC_WR_EN_PROC; + + +CTRL_CONSTRUCT_MACHINE_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + ctrl_construct_current_state <= IDLE; + else + ctrl_construct_current_state <= ctrl_construct_next_state; + end if; end if; -end process SYNC_PROC; +end process CTRL_CONSTRUCT_MACHINE_PROC; + +CTRL_CONSTRUCT_MACHINE : process(ctrl_construct_current_state, tx_current_state, FC_H_READY_IN, sent_bytes_ctr, MC_FRAME_SIZE_IN) +begin + + case ctrl_construct_current_state is + + when IDLE => + state2 <= x"1"; + if (tx_current_state = TRANSMIT_CTRL) then + ctrl_construct_next_state <= WAIT_FOR_FC; + else + ctrl_construct_next_state <= IDLE; + end if; + + when WAIT_FOR_FC => + state2 <= x"2"; + if (FC_H_READY_IN = '1') then + ctrl_construct_next_state <= LOAD_DATA; + else + ctrl_construct_next_state <= WAIT_FOR_FC; + end if; + + when LOAD_DATA => + state2 <= x"3"; + if (sent_bytes_ctr = MC_FRAME_SIZE_IN - x"1") then + ctrl_construct_next_state <= CLOSE; + else + ctrl_construct_next_state <= LOAD_DATA; + end if; + + when CLOSE => + state2 <= x"4"; + ctrl_construct_next_state <= CLEANUP; + + when CLEANUP => + state2 <= x"5"; + ctrl_construct_next_state <= IDLE; + + end case; + +end process CTRL_CONSTRUCT_MACHINE; + +SENT_BYTES_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (ctrl_construct_current_state = IDLE) then + sent_bytes_ctr <= (others => '0'); + elsif (delayed_wr_en_q = '1') then + sent_bytes_ctr <= sent_bytes_ctr + x"1"; + end if; + end if; +end process SENT_BYTES_CTR_PROC; + +PC_FC_H_READY_OUT <= FC_H_READY_IN when ((tx_current_state = IDLE) or (tx_current_state = TRANSMIT_DATA)) + else '0'; + +PC_FC_READY_OUT <= FC_READY_IN when ((tx_current_state = IDLE) or (tx_current_state = TRANSMIT_DATA)) + else '0'; + +SENT_PACKETS_CTR_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + sent_packets_ctr <= (others => '0'); + --elsif (tx_current_state = CLEANUP and MC_FLAGS_OFFSET_IN(13) = '0') then + elsif (tx_current_state = TRANSMIT_DATA and PC_EOD_IN = '1' and PC_FLAGS_OFFSET_IN(13) = '0') then + sent_packets_ctr <= sent_packets_ctr + x"1"; + elsif (tx_current_state = TRANSMIT_CTRL and ctrl_construct_current_state = CLOSE and MC_FLAGS_OFFSET_IN(13) = '0') then + sent_packets_ctr <= sent_packets_ctr + x"1"; + end if; + end if; +end process SENT_PACKETS_CTR_PROC; + + end trb_net16_gbe_transmit_control; diff --git a/gbe2_ecp3/trb_net16_gbe_transmit_control2.vhd b/gbe2_ecp3/trb_net16_gbe_transmit_control2.vhd deleted file mode 100644 index 51341d8..0000000 --- a/gbe2_ecp3/trb_net16_gbe_transmit_control2.vhd +++ /dev/null @@ -1,295 +0,0 @@ -LIBRARY IEEE; -USE IEEE.std_logic_1164.ALL; -USE IEEE.numeric_std.ALL; -USE IEEE.std_logic_UNSIGNED.ALL; - -library work; -use work.trb_net_std.all; -use work.trb_net_components.all; -use work.trb_net16_hub_func.all; - -use work.trb_net_gbe_protocols.all; - ---******** --- performs response constructors readout and splitting into frames - -entity trb_net16_gbe_transmit_control2 is -port ( - CLK : in std_logic; - RESET : in std_logic; - --- signal to/from main controller - TC_DATAREADY_IN : in std_logic; - TC_RD_EN_OUT : out std_logic; - TC_DATA_IN : in std_logic_vector(7 downto 0); - TC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - TC_FRAME_TYPE_IN : in std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0); - TC_DEST_MAC_IN : in std_logic_vector(47 downto 0); - TC_DEST_IP_IN : in std_logic_vector(31 downto 0); - TC_DEST_UDP_IN : in std_logic_vector(15 downto 0); - TC_SRC_MAC_IN : in std_logic_vector(47 downto 0); - TC_SRC_IP_IN : in std_logic_vector(31 downto 0); - TC_SRC_UDP_IN : in std_logic_vector(15 downto 0); - TC_TRANSMISSION_DONE_OUT : out std_logic; - TC_IDENT_IN : in std_logic_vector(15 downto 0); - --- signal to/from frame constructor - FC_DATA_OUT : out std_logic_vector(7 downto 0); - FC_WR_EN_OUT : out std_logic; - FC_READY_IN : in std_logic; - FC_H_READY_IN : in std_logic; - FC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - FC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_IDENT_OUT : out std_logic_vector(15 downto 0); -- internal packet counter - FC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); - FC_SOD_OUT : out std_logic; - FC_EOD_OUT : out std_logic; - FC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - - DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - --- debug - DEBUG_OUT : out std_logic_vector(63 downto 0) -); -end trb_net16_gbe_transmit_control2; - - -architecture trb_net16_gbe_transmit_control2 of trb_net16_gbe_transmit_control2 is - -attribute syn_encoding : string; - -type transmit_states is (IDLE, PREPARE_HEADERS, WAIT_FOR_H, TRANSMIT, SEND_ONE, SEND_TWO, CLOSE, WAIT_FOR_TRANS, DIVIDE, CLEANUP); -signal transmit_current_state, transmit_next_state : transmit_states; -attribute syn_encoding of transmit_current_state : signal is "onehot"; - -signal tc_rd, tc_rd_q, tc_rd_qq : std_logic; -signal local_end : std_logic_vector(15 downto 0); - -signal actual_frame_bytes, full_packet_size, ip_size, packet_loaded_bytes : std_logic_vector(15 downto 0); -signal go_to_divide, more_fragments : std_logic; -signal first_frame : std_logic; - -begin - -TRANSMIT_MACHINE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (RESET = '1') then - transmit_current_state <= IDLE; - else - transmit_current_state <= transmit_next_state; - end if; - end if; -end process TRANSMIT_MACHINE_PROC; - -TRANSMIT_MACHINE : process(transmit_current_state, FC_H_READY_IN, TC_DATAREADY_IN, FC_READY_IN, local_end, g_MAX_FRAME_SIZE, actual_frame_bytes, go_to_divide) -begin - case transmit_current_state is - - when IDLE => - if (TC_DATAREADY_IN = '1') then - transmit_next_state <= PREPARE_HEADERS; --WAIT_FOR_H; - else - transmit_next_state <= IDLE; - end if; - - when PREPARE_HEADERS => - transmit_next_state<= WAIT_FOR_H; - - when WAIT_FOR_H => - if (FC_H_READY_IN = '1') then - transmit_next_state <= TRANSMIT; - else - transmit_next_state <= WAIT_FOR_H; - end if; - - when TRANSMIT => - if (local_end = x"0000") then - transmit_next_state <= SEND_ONE; - else - if (actual_frame_bytes = g_MAX_FRAME_SIZE - x"1") then - transmit_next_state <= SEND_ONE; - else - transmit_next_state <= TRANSMIT; - end if; - end if; - - when SEND_ONE => - transmit_next_state <= SEND_TWO; - - when SEND_TWO => - transmit_next_state <= CLOSE; - - when CLOSE => - transmit_next_state <= WAIT_FOR_TRANS; - - when WAIT_FOR_TRANS => - if (FC_READY_IN = '1') then - if (go_to_divide = '1') then - transmit_next_state <= DIVIDE; - else - transmit_next_state <= CLEANUP; - end if; - else - transmit_next_state <= WAIT_FOR_TRANS; - end if; - - when DIVIDE => - transmit_next_state <= PREPARE_HEADERS; --WAIT_FOR_H; - - when CLEANUP => - transmit_next_state <= IDLE; - - end case; -end process TRANSMIT_MACHINE; - -tc_rd <= '1' when transmit_current_state = TRANSMIT else '0'; -TC_RD_EN_OUT <= tc_rd; - -SYNC_PROC : process(CLK) -begin - if rising_edge(CLK) then - tc_rd_q <= tc_rd; - tc_rd_qq <= tc_rd_q; - FC_WR_EN_OUT <= tc_rd_qq; - end if; -end process SYNC_PROC; - -ACTUAL_FRAME_BYTES_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = IDLE or transmit_current_state = DIVIDE) then - actual_frame_bytes <= (others => '0'); - elsif (transmit_current_state = TRANSMIT) then - actual_frame_bytes <= actual_frame_bytes + x"1"; - else - actual_frame_bytes <= actual_frame_bytes; - end if; - end if; -end process ACTUAL_FRAME_BYTES_PROC; - -GO_TO_DIVIDE_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = IDLE or transmit_current_state = DIVIDE) then - go_to_divide <= '0'; - elsif (transmit_current_state = TRANSMIT and actual_frame_bytes = g_MAX_FRAME_SIZE - x"1") then - go_to_divide <= '1'; --- elsif (transmit_current_state = SEND_ONE and full_packet_size < packet_loaded_bytes - x"1") then --- go_to_divide <= '1'; --- elsif (transmit_current_state = SEND_TWO and full_packet_size < packet_loaded_bytes - x"1") then --- go_to_divide <= '1'; - elsif (transmit_current_state = SEND_ONE and full_packet_size = packet_loaded_bytes) then - go_to_divide <= '0'; - else - go_to_divide <= go_to_divide; - end if; - end if; -end process GO_TO_DIVIDE_PROC; - -LOCAL_END_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = IDLE and TC_DATAREADY_IN = '1') then - local_end <= TC_FRAME_SIZE_IN - x"1"; - full_packet_size <= TC_FRAME_SIZE_IN; - elsif (transmit_current_state = TRANSMIT) then - local_end <= local_end - x"1"; - full_packet_size <= full_packet_size; - else - local_end <= local_end; - full_packet_size <= full_packet_size; - end if; - end if; -end process LOCAL_END_PROC; - -FC_DATA_OUT <= TC_DATA_IN; -FC_SOD_OUT <= '1' when transmit_current_state = WAIT_FOR_H else '0'; -FC_EOD_OUT <= '1' when transmit_current_state = CLOSE else '0'; - -process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = PREPARE_HEADERS) then - if (local_end >= g_MAX_FRAME_SIZE) then - ip_size <= g_MAX_FRAME_SIZE; - else - ip_size <= local_end + x"1"; - end if; - else - ip_size <= ip_size; - end if; - end if; -end process; -FC_IP_SIZE_OUT <= ip_size; -FC_UDP_SIZE_OUT <= full_packet_size; --TC_FRAME_SIZE_IN; - -FC_FLAGS_OFFSET_OUT(15 downto 14) <= "00"; -FC_FLAGS_OFFSET_OUT(13) <= more_fragments; -MORE_FRAGMENTS_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = PREPARE_HEADERS) then - if (local_end >= g_MAX_FRAME_SIZE) then - more_fragments <= '1'; - else - more_fragments <= '0'; - end if; - else - more_fragments <= more_fragments; - end if; - end if; -end process MORE_FRAGMENTS_PROC; -FC_FLAGS_OFFSET_OUT(12 downto 0) <= ('0' & x"000") when first_frame = '1' else (packet_loaded_bytes(15 downto 3) + x"1"); - -PACKET_LOADED_BYTES_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = IDLE) then - packet_loaded_bytes <= x"0000"; - elsif (transmit_current_state = TRANSMIT) then - packet_loaded_bytes <= packet_loaded_bytes + x"1"; --- elsif (transmit_current_state = DIVIDE and first_frame = '1') then --- packet_loaded_bytes <= packet_loaded_bytes + x"8"; -- 8bytes for udp headers added for the first offset - else - packet_loaded_bytes <= packet_loaded_bytes; - end if; - end if; -end process PACKET_LOADED_BYTES_PROC; - -FIRST_FRAME_PROC : process(CLK) -begin - if rising_edge(CLK) then - if (transmit_current_state = IDLE) then - first_frame <= '1'; - elsif (transmit_current_state = DIVIDE) then - first_frame <= '0'; - else - first_frame <= first_frame; - end if; - end if; -end process FIRST_FRAME_PROC; - - -TC_TRANSMISSION_DONE_OUT <= '1' when transmit_current_state = CLEANUP else '0'; - -FC_FRAME_TYPE_OUT <= TC_FRAME_TYPE_IN; -FC_IP_PROTOCOL_OUT <= TC_IP_PROTOCOL_IN; -DEST_MAC_ADDRESS_OUT <= TC_DEST_MAC_IN; -DEST_IP_ADDRESS_OUT <= TC_DEST_IP_IN; -DEST_UDP_PORT_OUT <= TC_DEST_UDP_IN; -SRC_MAC_ADDRESS_OUT <= TC_SRC_MAC_IN; -SRC_IP_ADDRESS_OUT <= TC_SRC_IP_IN; -SRC_UDP_PORT_OUT <= TC_SRC_UDP_IN; -FC_IDENT_OUT <= TC_IDENT_IN; - -end trb_net16_gbe_transmit_control2; - - diff --git a/gbe2_ecp3/trb_net16_gbe_type_validator.vhd b/gbe2_ecp3/trb_net16_gbe_type_validator.vhd index 10fe5fe..93147c7 100644 --- a/gbe2_ecp3/trb_net16_gbe_type_validator.vhd +++ b/gbe2_ecp3/trb_net16_gbe_type_validator.vhd @@ -49,64 +49,37 @@ signal result : std_logic_vector(c_MAX_FRAME_TYPES - 1 downto 0 signal ip_result : std_logic_vector(c_MAX_IP_PROTOCOLS - 1 downto 0); signal udp_result : std_logic_vector(c_MAX_UDP_PROTOCOLS - 1 downto 0); signal partially_valid : std_logic; -- only protocols, vlan to be checked -signal zeros : std_logic_vector(c_MAX_FRAME_TYPES - 1 downto 0); begin -- DO NOT TOUCH IP_RESULTS_GEN : for i in 0 to c_MAX_IP_PROTOCOLS - 1 generate -process(CLK) -begin - if rising_edge(CLK) then - if IP_PROTOCOLS(i) = IP_PROTOCOLS_IN and ALLOWED_IP_PROTOCOLS_IN(i) = '1' then - ip_result(i) <= '1'; - else - ip_result(i) <= '0'; - end if; - end if; -end process; --- ip_result(i) <= '1' when ( --- IP_PROTOCOLS(i) = IP_PROTOCOLS_IN and --- ALLOWED_IP_PROTOCOLS_IN(i) = '1' --- ) else '0'; + ip_result(i) <= '1' when ( + IP_PROTOCOLS(i) = IP_PROTOCOLS_IN and + ALLOWED_IP_PROTOCOLS_IN(i) = '1' + ) else '0'; + + end generate IP_RESULTS_GEN; UDP_RESULTS_GEN : for i in 0 to c_MAX_UDP_PROTOCOLS - 1 generate -process(CLK) -begin - if rising_edge(CLK) then - if UDP_PROTOCOLS(i) = UDP_PROTOCOL_IN and ALLOWED_UDP_PROTOCOLS_IN(i) = '1' then - udp_result(i) <= '1'; - else - udp_result(i) <= '0'; - end if; - end if; -end process; --- udp_result(i) <= '1' when ( --- UDP_PROTOCOLS(i) = UDP_PROTOCOL_IN and --- ALLOWED_UDP_PROTOCOLS_IN(i) = '1' --- ) else '0'; + + udp_result(i) <= '1' when ( + UDP_PROTOCOLS(i) = UDP_PROTOCOL_IN and + ALLOWED_UDP_PROTOCOLS_IN(i) = '1' + ) else '0'; end generate UDP_RESULTS_GEN; RESULT_GEN : for i in 0 to c_MAX_FRAME_TYPES - 1 generate -process(CLK) -begin - if rising_edge(CLK) then - if FRAME_TYPES(i) = FRAME_TYPE_IN and ALLOWED_TYPES_IN(i) = '1' then - result(i) <= '1'; - else - result(i) <= '0'; - end if; - end if; -end process; --- result(i) <= '1' when ( --- FRAME_TYPES(i) = FRAME_TYPE_IN and --- ALLOWED_TYPES_IN(i) = '1' --- ) else '0'; + + result(i) <= '1' when ( + FRAME_TYPES(i) = FRAME_TYPE_IN and + ALLOWED_TYPES_IN(i) = '1' + ) else '0'; end generate RESULT_GEN; @@ -123,17 +96,15 @@ begin else -- do not accept other protocols than udp and icmp inside ip partially_valid <= '0'; end if; - elsif (result /= zeros) then-- other frame - partially_valid <= '1'; --or_all(result); - else - partially_valid <= '0'; + else -- other frame + partially_valid <= or_all(result); end if; end if; end process PARTIALLY_VALID_PROC; -VALID_OUT_PROC : process(CLK) --partially_valid, SAVED_VLAN_ID_IN, VLAN_ID_IN) +VALID_OUT_PROC : process(partially_valid, SAVED_VLAN_ID_IN, VLAN_ID_IN) begin - if rising_edge(CLK) then + --if rising_edge(CLK) then -- if (RESET = '1') then -- VALID_OUT <= '0'; if (partially_valid = '1') then @@ -149,7 +120,7 @@ begin else VALID_OUT <= '0'; end if; - end if; + --end if; end process VALID_OUT_PROC; --if rising_edge(CLK) then diff --git a/gbe2_ecp3/trb_net16_ipu2gbe.vhd b/gbe2_ecp3/trb_net16_ipu2gbe.vhd index 471956c..a5c5d89 100755 --- a/gbe2_ecp3/trb_net16_ipu2gbe.vhd +++ b/gbe2_ecp3/trb_net16_ipu2gbe.vhd @@ -594,16 +594,16 @@ end process SAVED_EVT_CTR_PROC; -- gk 20.07.10 ---INC_DATA_CTR_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') or (rst_saved_ctr = '1') then --- inc_data_ctr <= (others => '0'); --- elsif (sf_wr_en = '1') and (data_req = '1') then --- inc_data_ctr(31 downto 1) <= inc_data_ctr(31 downto 1) + x"1"; --- end if; --- end if; ---end process INC_DATA_CTR_proc; +INC_DATA_CTR_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (rst_saved_ctr = '1') then + inc_data_ctr <= (others => '0'); + elsif (sf_wr_en = '1') and (data_req = '1') then + inc_data_ctr(31 downto 1) <= inc_data_ctr(31 downto 1) + x"1"; + end if; + end if; +end process INC_DATA_CTR_proc; ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ @@ -802,13 +802,15 @@ begin rem_phase_comb <= '1'; end if; when WAIT_TO_REMOVE => - if (rem_ctr = x"a") then + state2 <= x"2"; + if (rem_ctr = x"a") then loadNextState <= DECIDE; else loadNextState <= WAIT_TO_REMOVE; end if; when DECIDE => - if (pc_sub_size >= MAX_MESSAGE_SIZE_IN) then + state2 <= x"2"; + if (pc_sub_size >= MAX_MESSAGE_SIZE_IN) then loadNextState <= PAUSE_BEFORE_DROP1; drop_large_comb <= '1'; elsif (pc_sub_size = b"0000_0000_0000_00") then -- gk 01.10.10 @@ -902,10 +904,12 @@ begin loadNextState <= WAIT_PC; end if; when PAUSE_BEFORE_DROP1 => - loadNextState <= PAUSE_BEFORE_DROP2; + state2 <= x"2"; + loadNextState <= PAUSE_BEFORE_DROP2; pc_sos_comb <= '1'; when PAUSE_BEFORE_DROP2 => - loadNextState <= DROP; + state2 <= x"2"; + loadNextState <= DROP; drop_event_comb <= '1'; -- gk 23.07.10 when DROP => @@ -919,7 +923,8 @@ begin end if; -- gk 25.07.10 when DROP_SUBSUB => - if (load_sub_done = '1') then + state2 <= x"e"; + if (load_sub_done = '1') then if( padding_needed = '0' ) then loadNextState <= CALCC; else @@ -940,36 +945,36 @@ end process loadMachine; PC_EOS_OUT <= '1' when (MULT_EVT_ENABLE_IN = '1') and (pc_eod = '1') else '0'; -- gk 25.07.10 ---INVALID_STATS_PROC : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- dropped_lr_events_ctr <= (others => '0'); --- dropped_sm_events_ctr <= (others => '0'); --- headers_invalid_ctr <= (others => '0'); --- dropped_ctr <= (others => '0'); --- invalid_hsize_ctr <= (others => '0'); --- found_empty_evt_ctr <= (others => '0'); -- gk 01.10.10 --- elsif (rst_regs = '1') then --- invalid_hsize_lock <= '0'; --- elsif (drop_small = '1') then --- dropped_sm_events_ctr <= dropped_sm_events_ctr + x"1"; --- dropped_ctr <= dropped_ctr + x"1"; --- elsif (drop_large = '1') then --- dropped_lr_events_ctr <= dropped_lr_events_ctr + x"1"; --- dropped_ctr <= dropped_ctr + x"1"; --- elsif (drop_headers = '1') then --- headers_invalid_ctr <= headers_invalid_ctr + x"1"; --- dropped_ctr <= dropped_ctr + x"1"; --- elsif (load_eod_q = '1') and (read_size_q /= x"3fffe") and (invalid_hsize_lock = '0') then -- ?? --- invalid_hsize_ctr <= invalid_hsize_ctr + x"1"; --- invalid_hsize_lock <= '1'; --- -- gk 01.10.10 --- elsif (found_empty_evt = '1') then --- found_empty_evt_ctr <= found_empty_evt_ctr + x"1"; --- end if; --- end if; ---end process INVALID_STATS_PROC; +INVALID_STATS_PROC : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + dropped_lr_events_ctr <= (others => '0'); + dropped_sm_events_ctr <= (others => '0'); + headers_invalid_ctr <= (others => '0'); + dropped_ctr <= (others => '0'); + invalid_hsize_ctr <= (others => '0'); + found_empty_evt_ctr <= (others => '0'); -- gk 01.10.10 + elsif (rst_regs = '1') then + invalid_hsize_lock <= '0'; + elsif (drop_small = '1') then + dropped_sm_events_ctr <= dropped_sm_events_ctr + x"1"; + dropped_ctr <= dropped_ctr + x"1"; + elsif (drop_large = '1') then + dropped_lr_events_ctr <= dropped_lr_events_ctr + x"1"; + dropped_ctr <= dropped_ctr + x"1"; + elsif (drop_headers = '1') then + headers_invalid_ctr <= headers_invalid_ctr + x"1"; + dropped_ctr <= dropped_ctr + x"1"; + elsif (load_eod_q = '1') and (read_size_q /= x"3fffe") and (invalid_hsize_lock = '0') then -- ?? + invalid_hsize_ctr <= invalid_hsize_ctr + x"1"; + invalid_hsize_lock <= '1'; + -- gk 01.10.10 + elsif (found_empty_evt = '1') then + found_empty_evt_ctr <= found_empty_evt_ctr + x"1"; + end if; + end if; +end process INVALID_STATS_PROC; -- gk 05.08.10 INVALID_H_PROC : process(CLK) @@ -1273,135 +1278,135 @@ end process CONSTR_EVENTS_CTR_PROC; ------------------------------------------------------------------------------------------ -- Debug signals ---debug(0) <= sf_full; ---debug(1) <= sf_empty; ---debug(2) <= sf_afull; ---debug(3) <= sf_aempty; --- ---debug(7 downto 4) <= state2; --- ---debug(11 downto 8) <= state; --- ---dbg_bs_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- debug(15 downto 12) <= (others => '0'); --- elsif ( (sf_rd_en = '1') and (rem_ctr = x"3") ) then --- debug(15 downto 12) <= bank_select; --- end if; --- end if; ---end process dbg_bs_proc; --- ---debug(16) <= config_done; ---debug(17) <= '0'; --remove_done; ---debug(18) <= read_done; ---debug(19) <= padding_needed; --- ---debug(20) <= load_sub_done; --- ---dbg_cts_inf_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- debug(39 downto 32) <= (others => '0'); --- elsif ( save_addr = '1' ) then --- debug(39 downto 32) <= CTS_INFORMATION_IN; --- end if; --- end if; ---end process dbg_cts_inf_proc; --- ---debug(47 downto 40) <= (others => '0'); --- --- ---debug(63 downto 48) <= actual_message_size(15 downto 0); --- ---dbg_pc_sub_size_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- debug(81 downto 64) <= (others => '0'); --- elsif (loadCurrentState = DECIDE) then --- debug(81 downto 64) <= pc_sub_size; --- end if; --- end if; ---end process dbg_pc_sub_size_proc; --- ---dbg_empty_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') or (rst_regs = '1') then --- debug(84 downto 82) <= (others => '0'); --- elsif (read_size = 2) then --- debug(82) <= sf_empty; --- elsif (read_size = 1) then --- debug(83) <= sf_empty; --- elsif (read_size = 0) then --- debug(84) <= sf_empty; --- end if; --- end if; ---end process dbg_empty_proc; --- ---debug(95 downto 85) <= (others => '0'); --- ---dbg_inc_ctr_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- debug(127 downto 96) <= (others => '1'); --- elsif (saveCurrentState = SCLOSE) then --- debug(127 downto 96) <= inc_data_ctr; --- end if; --- end if; ---end process dbg_inc_ctr_proc; --- ---debug(143 downto 128) <= dropped_sm_events_ctr(15 downto 0); ---debug(159 downto 144) <= dropped_lr_events_ctr(15 downto 0); --- ---debug(175 downto 160) <= headers_invalid_ctr(15 downto 0); ---debug(191 downto 176) <= (others => '0'); --- ---dbg_cts_q_proc : process(CLK) ---begin --- if rising_edge(CLK) then --- if (RESET = '1') then --- cts_len_q <= (others => '0'); --- cts_rnd_q <= (others => '0'); --- cts_trg_q <= (others => '0'); --- cts_addr_q <= (others => '0'); --- elsif (cts_len_saved = '1') then --- cts_len_q <= cts_len(16 downto 1); --- cts_addr_q <= cts_addr; --- cts_rnd_q <= cts_rnd; --- cts_trg_q <= cts_trg; --- end if; --- end if; ---end process dbg_cts_q_proc; - ---debug(207 downto 192) <= cts_trg_q; ---debug(223 downto 208) <= cts_rnd_q; ---debug(239 downto 224) <= cts_addr_q; ---debug(255 downto 240) <= cts_len_q; ---debug(271 downto 256) <= first_run_trg; ---debug(287 downto 272) <= first_run_addr; --- ---debug(303 downto 288) <= saved_events_ctr; ---debug(319 downto 304) <= loaded_events_ctr; --- ---debug(335 downto 320) <= constr_events_ctr(15 downto 0); ---debug(351 downto 336) <= dropped_ctr(15 downto 0); --- ---debug(367 downto 352) <= invalid_hsize_ctr; ---debug(383 downto 368) <= (others => '0'); --- ---MONITOR_OUT(31 downto 0) <= constr_events_ctr; ---MONITOR_OUT(63 downto 32) <= dropped_ctr; ---MONITOR_OUT(95 downto 64) <= headers_invalid_ctr; ---MONITOR_OUT(127 downto 96) <= dropped_sm_events_ctr; ---MONITOR_OUT(159 downto 128) <= dropped_lr_events_ctr; ---MONITOR_OUT(163 downto 160) <= b"1111" when (sf_afull = '1') else b"0000"; ---MONITOR_OUT(191 downto 164) <= (others => '0'); ---MONITOR_OUT(223 downto 192) <= found_empty_evt_ctr; -- gk 01.10.10 +debug(0) <= sf_full; +debug(1) <= sf_empty; +debug(2) <= sf_afull; +debug(3) <= sf_aempty; + +debug(7 downto 4) <= state2; + +debug(11 downto 8) <= state; + +dbg_bs_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + debug(15 downto 12) <= (others => '0'); + elsif ( (sf_rd_en = '1') and (rem_ctr = x"3") ) then + debug(15 downto 12) <= bank_select; + end if; + end if; +end process dbg_bs_proc; + +debug(16) <= config_done; +debug(17) <= '0'; --remove_done; +debug(18) <= read_done; +debug(19) <= padding_needed; + +debug(20) <= load_sub_done; + +dbg_cts_inf_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + debug(39 downto 32) <= (others => '0'); + elsif ( save_addr = '1' ) then + debug(39 downto 32) <= CTS_INFORMATION_IN; + end if; + end if; +end process dbg_cts_inf_proc; + +debug(47 downto 40) <= (others => '0'); + + +debug(63 downto 48) <= actual_message_size(15 downto 0); + +dbg_pc_sub_size_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + debug(81 downto 64) <= (others => '0'); + elsif (loadCurrentState = DECIDE) then + debug(81 downto 64) <= pc_sub_size; + end if; + end if; +end process dbg_pc_sub_size_proc; + +dbg_empty_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') or (rst_regs = '1') then + debug(84 downto 82) <= (others => '0'); + elsif (read_size = 2) then + debug(82) <= sf_empty; + elsif (read_size = 1) then + debug(83) <= sf_empty; + elsif (read_size = 0) then + debug(84) <= sf_empty; + end if; + end if; +end process dbg_empty_proc; + +debug(95 downto 85) <= (others => '0'); + +dbg_inc_ctr_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + debug(127 downto 96) <= (others => '1'); + elsif (saveCurrentState = SCLOSE) then + debug(127 downto 96) <= inc_data_ctr; + end if; + end if; +end process dbg_inc_ctr_proc; + +debug(143 downto 128) <= dropped_sm_events_ctr(15 downto 0); +debug(159 downto 144) <= dropped_lr_events_ctr(15 downto 0); + +debug(175 downto 160) <= headers_invalid_ctr(15 downto 0); +debug(191 downto 176) <= (others => '0'); + +dbg_cts_q_proc : process(CLK) +begin + if rising_edge(CLK) then + if (RESET = '1') then + cts_len_q <= (others => '0'); + cts_rnd_q <= (others => '0'); + cts_trg_q <= (others => '0'); + cts_addr_q <= (others => '0'); + elsif (cts_len_saved = '1') then + cts_len_q <= cts_len(16 downto 1); + cts_addr_q <= cts_addr; + cts_rnd_q <= cts_rnd; + cts_trg_q <= cts_trg; + end if; + end if; +end process dbg_cts_q_proc; + +debug(207 downto 192) <= cts_trg_q; +debug(223 downto 208) <= cts_rnd_q; +debug(239 downto 224) <= cts_addr_q; +debug(255 downto 240) <= cts_len_q; +debug(271 downto 256) <= first_run_trg; +debug(287 downto 272) <= first_run_addr; + +debug(303 downto 288) <= saved_events_ctr; +debug(319 downto 304) <= loaded_events_ctr; + +debug(335 downto 320) <= constr_events_ctr(15 downto 0); +debug(351 downto 336) <= dropped_ctr(15 downto 0); + +debug(367 downto 352) <= invalid_hsize_ctr; +debug(383 downto 368) <= (others => '0'); + +MONITOR_OUT(31 downto 0) <= constr_events_ctr; +MONITOR_OUT(63 downto 32) <= dropped_ctr; +MONITOR_OUT(95 downto 64) <= headers_invalid_ctr; +MONITOR_OUT(127 downto 96) <= dropped_sm_events_ctr; +MONITOR_OUT(159 downto 128) <= dropped_lr_events_ctr; +MONITOR_OUT(163 downto 160) <= b"1111" when (sf_afull = '1') else b"0000"; +MONITOR_OUT(191 downto 164) <= (others => '0'); +MONITOR_OUT(223 downto 192) <= found_empty_evt_ctr; -- gk 01.10.10 -- Outputs FEE_READ_OUT <= fee_read; @@ -1425,6 +1430,6 @@ PC_TRIG_NR_OUT <= readout_ctr(23 downto 16) & pc_trig_nr & trig_random PC_SUB_SIZE_OUT <= b"0000_0000_0000_00" & pc_sub_size; PC_PADDING_OUT <= padding_needed; ---DEBUG_OUT <= debug; +DEBUG_OUT <= debug; end architecture; \ No newline at end of file diff --git a/gbe2_ecp3/trb_net16_med_ecp_sfp_gbe_8b.vhd b/gbe2_ecp3/trb_net16_med_ecp_sfp_gbe_8b.vhd index 37b975c..52a5df5 100755 --- a/gbe2_ecp3/trb_net16_med_ecp_sfp_gbe_8b.vhd +++ b/gbe2_ecp3/trb_net16_med_ecp_sfp_gbe_8b.vhd @@ -231,7 +231,7 @@ end component; -- ); -- end component; -component sgmii_gbe_pcs35 --sgmii_gbe_pcs36 -- sgmii_gbe_pcs35 +component sgmii_gbe_pcs35 port( rst_n : in std_logic; signal_detect : in std_logic; gbe_mode : in std_logic; @@ -742,7 +742,7 @@ buf_stat_debug(11 downto 0) <= sd_rx_debug(11 downto 0); - SGMII_GBE_PCS : sgmii_gbe_pcs35 --sgmii_gbe_pcs36 --sgmii_gbe_pcs35 + SGMII_GBE_PCS : sgmii_gbe_pcs35 port map( rst_n => GSR_N, signal_detect => signal_detected, diff --git a/gbe2_ecp3/trb_net_gbe_components.vhd b/gbe2_ecp3/trb_net_gbe_components.vhd index d0db062..f8e0e1b 100644 --- a/gbe2_ecp3/trb_net_gbe_components.vhd +++ b/gbe2_ecp3/trb_net_gbe_components.vhd @@ -10,136 +10,6 @@ use work.trb_net_gbe_protocols.all; package trb_net_gbe_components is -component trb_net16_gbe_transmit_control2 is -port ( - CLK : in std_logic; - RESET : in std_logic; - --- signal to/from main controller - TC_DATAREADY_IN : in std_logic; - TC_RD_EN_OUT : out std_logic; - TC_DATA_IN : in std_logic_vector(7 downto 0); - TC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - TC_FRAME_TYPE_IN : in std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0); - TC_DEST_MAC_IN : in std_logic_vector(47 downto 0); - TC_DEST_IP_IN : in std_logic_vector(31 downto 0); - TC_DEST_UDP_IN : in std_logic_vector(15 downto 0); - TC_SRC_MAC_IN : in std_logic_vector(47 downto 0); - TC_SRC_IP_IN : in std_logic_vector(31 downto 0); - TC_SRC_UDP_IN : in std_logic_vector(15 downto 0); - TC_IDENT_IN : in std_logic_vector(15 downto 0); - TC_TRANSMISSION_DONE_OUT : out std_logic; - --- signal to/from frame constructor - FC_DATA_OUT : out std_logic_vector(7 downto 0); - FC_WR_EN_OUT : out std_logic; - FC_READY_IN : in std_logic; - FC_H_READY_IN : in std_logic; - FC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - FC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - FC_IDENT_OUT : out std_logic_vector(15 downto 0); -- internal packet counter - FC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); - FC_SOD_OUT : out std_logic; - FC_EOD_OUT : out std_logic; - FC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - - DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - --- debug - DEBUG_OUT : out std_logic_vector(63 downto 0) -); -end component; - -component trb_net16_gbe_event_constr is -port( - RESET : in std_logic; - CLK : in std_logic; - MULT_EVT_ENABLE_IN : in std_logic; -- gk 06.10.10 - -- ports for user logic - PC_WR_EN_IN : in std_logic; -- write into queueConstr from userLogic - PC_DATA_IN : in std_logic_vector(7 downto 0); - PC_READY_OUT : out std_logic; - PC_START_OF_SUB_IN : in std_logic; - PC_END_OF_SUB_IN : in std_logic; -- gk 07.10.10 - PC_END_OF_DATA_IN : in std_logic; - PC_TRANSMIT_ON_OUT : out std_logic; - -- queue and subevent layer headers - PC_SUB_SIZE_IN : in std_logic_vector(31 downto 0); -- store and swap - PC_PADDING_IN : in std_logic; -- gk 29.03.10 - PC_DECODING_IN : in std_logic_vector(31 downto 0); -- swap - PC_EVENT_ID_IN : in std_logic_vector(31 downto 0); -- swap - PC_TRIG_NR_IN : in std_logic_vector(31 downto 0); -- store and swap! - PC_TRIGGER_TYPE_IN : in std_logic_vector(3 downto 0); - PC_QUEUE_DEC_IN : in std_logic_vector(31 downto 0); -- swap - PC_MAX_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); -- DO NOT SWAP - PC_MAX_QUEUE_SIZE_IN : in std_logic_vector(31 downto 0); - PC_DELAY_IN : in std_logic_vector(31 downto 0); -- gk 28.04.10 - -- FrameConstructor ports - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_EVENT_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_SOD_OUT : out std_logic; - DEBUG_OUT : out std_logic_vector(63 downto 0) -); -end component; - -component trb_net16_gbe_ipu_interface is - port ( - CLK_IPU : in std_logic; - CLK_GBE : in std_logic; - RESET : in std_logic; - -- IPU interface directed toward the CTS - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_READ_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; --no more data, end transfer, send TRM - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data from Frontends - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_BUSY_IN : in std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - -- slow control interface - START_CONFIG_OUT : out std_logic; -- reconfigure MACs/IPs/ports/packet size - BANK_SELECT_OUT : out std_logic_vector(3 downto 0); -- configuration page address - CONFIG_DONE_IN : in std_logic; -- configuration finished - DATA_GBE_ENABLE_IN : in std_logic; -- IPU data is forwarded to GbE - DATA_IPU_ENABLE_IN : in std_logic; -- IPU data is forwarded to CTS / TRBnet - MULT_EVT_ENABLE_IN : in std_logic; - MAX_MESSAGE_SIZE_IN : in std_logic_vector(31 downto 0); -- the maximum size of one HadesQueue -- gk 08.04.10 - MIN_MESSAGE_SIZE_IN : in std_logic_vector(31 downto 0); -- gk 20.07.10 - READOUT_CTR_IN : in std_logic_vector(23 downto 0); -- gk 26.04.10 - READOUT_CTR_VALID_IN : in std_logic; -- gk 26.04.10 - -- PacketConstructor interface - ALLOW_LARGE_IN : in std_logic; -- gk 21.07.10 - PC_WR_EN_OUT : out std_logic; - PC_DATA_OUT : out std_logic_vector (7 downto 0); - PC_READY_IN : in std_logic; - PC_SOS_OUT : out std_logic; - PC_EOS_OUT : out std_logic; -- gk 07.10.10 - PC_EOD_OUT : out std_logic; - PC_SUB_SIZE_OUT : out std_logic_vector(31 downto 0); - PC_TRIG_NR_OUT : out std_logic_vector(31 downto 0); - PC_PADDING_OUT : out std_logic; - PC_TRIGGER_TYPE_OUT : out std_logic_vector(3 downto 0); - MONITOR_OUT : out std_logic_vector(223 downto 0); - DEBUG_OUT : out std_logic_vector(383 downto 0) - ); -end component; component trb_net16_gbe_buf is generic( @@ -300,14 +170,20 @@ port ( TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - MC_BUSY_IN : in std_logic; + + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; + MC_BUSY_IN : in std_logic; -- counters from response constructors RECEIVED_FRAMES_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); @@ -331,38 +207,6 @@ port ( MAKE_RESET_OUT : out std_logic; - -- signal for data readout - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; - -- input for statistics from outside STAT_DATA_IN : in std_logic_vector(31 downto 0); STAT_ADDR_IN : in std_logic_vector(7 downto 0); @@ -407,7 +251,6 @@ port ( MC_LINK_OK_OUT : out std_logic; MC_RESET_LINK_IN : in std_logic; - MC_IDLE_TOO_LONG_OUT : out std_logic; -- signals to/from receive controller RC_FRAME_WAITING_IN : in std_logic; @@ -425,21 +268,34 @@ port ( RC_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- signals to/from transmit controller - TC_TRANSMIT_CTRL_OUT : out std_logic; + TC_TRANSMIT_CTRL_OUT : out std_logic; -- slow control frame is waiting to be built and sent + TC_TRANSMIT_DATA_OUT : out std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_RD_EN_IN : in std_logic; TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + + TC_BUSY_IN : in std_logic; TC_TRANSMIT_DONE_IN : in std_logic; +-- signals to/from packet constructor + PC_READY_IN : in std_logic; + PC_TRANSMIT_ON_IN : in std_logic; + PC_SOD_IN : in std_logic; + -- signals to/from sgmii/gbe pcs_an_complete PCS_AN_COMPLETE_IN : in std_logic; @@ -457,38 +313,6 @@ port ( GSC_REPLY_READ_OUT : out std_logic; GSC_BUSY_IN : in std_logic; - -- signal for data readout - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; - MAKE_RESET_OUT : out std_logic; -- signal to/from Host interface of TriSpeed MAC @@ -516,11 +340,32 @@ port ( CLK : in std_logic; -- system clock RESET : in std_logic; +-- signals to/from packet constructor + PC_READY_IN : in std_logic; + PC_DATA_IN : in std_logic_vector(7 downto 0); + PC_WR_EN_IN : in std_logic; + PC_IP_SIZE_IN : in std_logic_vector(15 downto 0); + PC_UDP_SIZE_IN : in std_logic_vector(15 downto 0); + PC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0); + PC_SOD_IN : in std_logic; + PC_EOD_IN : in std_logic; + PC_FC_READY_OUT : out std_logic; + PC_FC_H_READY_OUT : out std_logic; + PC_TRANSMIT_ON_IN : in std_logic; + + -- signals from ip_configurator used by packet constructor + IC_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + IC_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + IC_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); + IC_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + IC_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + IC_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); + -- signal to/from main controller MC_TRANSMIT_CTRL_IN : in std_logic; -- slow control frame is waiting to be built and sent + MC_TRANSMIT_DATA_IN : in std_logic; MC_DATA_IN : in std_logic_vector(8 downto 0); - MC_DATA_NOT_VALID_IN : in std_logic; - MC_WR_EN_IN : in std_logic; + MC_RD_EN_OUT : out std_logic; MC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); MC_FRAME_TYPE_IN : in std_logic_vector(15 downto 0); @@ -532,16 +377,11 @@ port ( MC_SRC_UDP_IN : in std_logic_vector(15 downto 0); MC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0); - MC_IDENT_IN : in std_logic_vector(15 downto 0); MC_IP_SIZE_IN : in std_logic_vector(15 downto 0); MC_UDP_SIZE_IN : in std_logic_vector(15 downto 0); MC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0); - MC_FC_H_READY_OUT : out std_logic; - MC_FC_READY_OUT : out std_logic; - MC_FC_WR_EN_IN : in std_logic; - MC_BUSY_OUT : out std_logic; MC_TRANSMIT_DONE_OUT : out std_logic; @@ -692,10 +532,6 @@ port( MIN_MESSAGE_SIZE_IN : in std_logic_vector(31 downto 0); -- gk 20.07.10 READOUT_CTR_IN : in std_logic_vector(23 downto 0); -- gk 26.04.10 READOUT_CTR_VALID_IN : in std_logic; -- gk 26.04.10 - --- SCTRL_DUMMY_SIZE_IN : in std_logic_vector(15 downto 0); --- SCTRL_DUMMY_PAUSE_IN : in std_logic_vector(31 downto 0); - -- PacketConstructor interface ALLOW_LARGE_IN : in std_logic; -- gk 21.07.10 PC_WR_EN_OUT : out std_logic; @@ -956,9 +792,6 @@ port( DBG_SELECT_SENT_IN : in std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); DBG_SELECT_PROTOS_IN : in std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - SCTRL_DUMMY_SIZE_OUT : out std_logic_vector(15 downto 0); - SCTRL_DUMMY_PAUSE_OUT : out std_logic_vector(31 downto 0); - DBG_FIFO_Q_IN : in std_logic_vector(15 downto 0) --DBG_FIFO_RESET_OUT : out std_logic ); @@ -1094,22 +927,6 @@ port( ); end component; -component fifo_4kx18x9 is -port( - Data : in std_logic_vector(17 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(8 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - - component fifo_2048x8x16 is port( Data : in std_logic_vector(8 downto 0); @@ -1125,21 +942,6 @@ port( ); end component; -component fifo_4kx8_ecp3 is -port( - Data : in std_logic_vector(7 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(7 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - component statts_mem is port ( WrAddress: in std_logic_vector(7 downto 0); @@ -1154,123 +956,4 @@ component statts_mem is Q: out std_logic_vector(7 downto 0)); end component; ---component slv_mac_memory is ---port( --- CLK : in std_logic; --- RESET : in std_logic; --- BUSY_IN : in std_logic; --- -- Slave bus --- SLV_ADDR_IN : in std_logic_vector(7 downto 0); --- SLV_READ_IN : in std_logic; --- SLV_WRITE_IN : in std_logic; --- SLV_BUSY_OUT : out std_logic; --- SLV_ACK_OUT : out std_logic; --- SLV_DATA_IN : in std_logic_vector(31 downto 0); --- SLV_DATA_OUT : out std_logic_vector(31 downto 0); --- -- I/O to the backend --- MEM_CLK_IN : in std_logic; --- MEM_ADDR_IN : in std_logic_vector(7 downto 0); --- MEM_DATA_OUT : out std_logic_vector(31 downto 0); --- -- Status lines --- STAT : out std_logic_vector(31 downto 0) -- DEBUG ---); ---end component; - -component fifo_32kx16x8_mb2 -port( - Data : in std_logic_vector(17 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; - AmEmptyThresh : in std_logic_vector(15 downto 0); - AmFullThresh : in std_logic_vector(14 downto 0); - Q : out std_logic_vector(8 downto 0); - WCNT : out std_logic_vector(15 downto 0); - RCNT : out std_logic_vector(16 downto 0); - Empty : out std_logic; - AlmostEmpty : out std_logic; - Full : out std_logic; - AlmostFull : out std_logic -); -end component; - -component fifo_64kx9 -port ( - Data : in std_logic_vector(8 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(8 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - -component fifo_16kx18x9 is - port ( - Data: in std_logic_vector(17 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; - AmEmptyThresh: in std_logic_vector(14 downto 0); - AmFullThresh: in std_logic_vector(13 downto 0); - Q: out std_logic_vector(8 downto 0); - Empty: out std_logic; - Full: out std_logic; - AlmostEmpty: out std_logic; - AlmostFull: out std_logic); -end component; - -component fifo_32k_9 is - port ( - Data: in std_logic_vector(8 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(8 downto 0); - Empty: out std_logic; - Full: out std_logic); -end component; - - -component fifo_512x32x8 -port ( - Data : in std_logic_vector(31 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(7 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - -component fifo_512x8 -port ( - Data : in std_logic_vector(7 downto 0); - Clock : in std_logic; - WrEn : in std_logic; - RdEn : in std_logic; - Reset : in std_logic; - Q : out std_logic_vector(7 downto 0); - Empty : out std_logic; - Full : out std_logic -); -end component; - end package; \ No newline at end of file diff --git a/gbe2_ecp3/trb_net_gbe_protocols.vhd b/gbe2_ecp3/trb_net_gbe_protocols.vhd index cdef3c4..c389a7f 100644 --- a/gbe2_ecp3/trb_net_gbe_protocols.vhd +++ b/gbe2_ecp3/trb_net_gbe_protocols.vhd @@ -15,14 +15,14 @@ signal g_MY_IP : std_logic_vector(31 downto 0); signal g_MY_MAC : std_logic_vector(47 downto 0); -- size of ethernet frame use for fragmentation of outgoing packets -signal g_MAX_FRAME_SIZE : std_logic_vector(15 downto 0) := x"0200"; -- set up in main controller +signal g_MAX_FRAME_SIZE : std_logic_vector(15 downto 0); -- set up in main controller --signal g_MAX_PACKET_SIZE : std_logic_vector(15 downto 0); constant c_MAX_FRAME_TYPES : integer range 1 to 16 := 2; -constant c_MAX_PROTOCOLS : integer range 1 to 16 := 4; --5; --4; --5; +constant c_MAX_PROTOCOLS : integer range 1 to 16 := 5; constant c_MAX_IP_PROTOCOLS : integer range 1 to 16 := 2; -constant c_MAX_UDP_PROTOCOLS : integer range 1 to 16 := 4; +constant c_MAX_UDP_PROTOCOLS : integer range 1 to 16 := 3; type frame_types_a is array(c_MAX_FRAME_TYPES - 1 downto 0) of std_logic_vector(15 downto 0); constant FRAME_TYPES : frame_types_a := (x"0800", x"0806"); @@ -34,7 +34,7 @@ constant IP_PROTOCOLS : ip_protos_a := (x"11", x"01"); -- this are the destination ports of the incoming packet type udp_protos_a is array(c_MAX_UDP_PROTOCOLS - 1 downto 0) of std_logic_vector(15 downto 0); -constant UDP_PROTOCOLS : udp_protos_a := (x"0044", x"6590", x"7530", x"7531"); --x"6590", x"7530", x"7531"); --x"61a8", x"7530", x"7531"); +constant UDP_PROTOCOLS : udp_protos_a := (x"0044", x"61a8", x"7530"); -- DHCP client, SCTRL, STATs component trb_net16_gbe_response_constructor_Forward is @@ -56,11 +56,11 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_WR_EN_OUT : out std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); @@ -99,18 +99,21 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_RD_EN_IN : in std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -145,7 +148,7 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_WR_EN_OUT : out std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); @@ -168,8 +171,6 @@ port ( end component; component trb_net16_gbe_response_constructor_Trash is -generic ( STAT_ADDRESS_BASE : integer := 0 -); port ( CLK : in std_logic; -- system clock RESET : in std_logic; @@ -191,25 +192,16 @@ port ( TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_SIZE_LEFT_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); TC_BUSY_IN : in std_logic; - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); -- END OF INTERFACE @@ -240,18 +232,21 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_RD_EN_IN : in std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -276,54 +271,6 @@ port ( CLK : in std_logic; -- system clock RESET : in std_logic; --- INTERFACE - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; - - RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); - SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); --- END OF INTERFACE - --- debug - DEBUG_OUT : out std_logic_vector(31 downto 0) -); -end component; - -component trb_net16_gbe_response_constructor_PseudoPing is -generic ( STAT_ADDRESS_BASE : integer := 0 -); -port ( - CLK : in std_logic; -- system clock - RESET : in std_logic; - -- INTERFACE PS_DATA_IN : in std_logic_vector(8 downto 0); PS_WR_EN_IN : in std_logic; @@ -343,13 +290,16 @@ port ( TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -384,7 +334,7 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_WR_EN_OUT : out std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); @@ -428,18 +378,21 @@ generic ( STAT_ADDRESS_BASE : integer := 0 PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_RD_EN_IN : in std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0); + TC_BUSY_IN : in std_logic; STAT_DATA_OUT : out std_logic_vector(31 downto 0); STAT_ADDR_OUT : out std_logic_vector(7 downto 0); @@ -490,12 +443,11 @@ port ( PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_WR_EN_OUT : out std_logic; + TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); @@ -526,80 +478,4 @@ port ( ); end component; -component trb_net16_gbe_response_constructor_TrbNetData is -port ( - CLK : in std_logic; -- system clock - RESET : in std_logic; - --- INTERFACE - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - - STAT_DATA_OUT : out std_logic_vector(31 downto 0); - STAT_ADDR_OUT : out std_logic_vector(7 downto 0); - STAT_DATA_RDY_OUT : out std_logic; - STAT_DATA_ACK_IN : in std_logic; - RECEIVED_FRAMES_OUT : out std_logic_vector(15 downto 0); - SENT_FRAMES_OUT : out std_logic_vector(15 downto 0); --- END OF INTERFACE - - -- CTS interface - CTS_NUMBER_IN : in std_logic_vector (15 downto 0); - CTS_CODE_IN : in std_logic_vector (7 downto 0); - CTS_INFORMATION_IN : in std_logic_vector (7 downto 0); - CTS_READOUT_TYPE_IN : in std_logic_vector (3 downto 0); - CTS_START_READOUT_IN : in std_logic; - CTS_DATA_OUT : out std_logic_vector (31 downto 0); - CTS_DATAREADY_OUT : out std_logic; - CTS_READOUT_FINISHED_OUT : out std_logic; - CTS_READ_IN : in std_logic; - CTS_LENGTH_OUT : out std_logic_vector (15 downto 0); - CTS_ERROR_PATTERN_OUT : out std_logic_vector (31 downto 0); - -- Data payload interface - FEE_DATA_IN : in std_logic_vector (15 downto 0); - FEE_DATAREADY_IN : in std_logic; - FEE_READ_OUT : out std_logic; - FEE_STATUS_BITS_IN : in std_logic_vector (31 downto 0); - FEE_BUSY_IN : in std_logic; - -- ip configurator - SLV_ADDR_IN : in std_logic_vector(7 downto 0); - SLV_READ_IN : in std_logic; - SLV_WRITE_IN : in std_logic; - SLV_BUSY_OUT : out std_logic; - SLV_ACK_OUT : out std_logic; - SLV_DATA_IN : in std_logic_vector(31 downto 0); - SLV_DATA_OUT : out std_logic_vector(31 downto 0); - - CFG_GBE_ENABLE_IN : in std_logic; - CFG_IPU_ENABLE_IN : in std_logic; - CFG_MULT_ENABLE_IN : in std_logic; - --- debug - DEBUG_OUT : out std_logic_vector(31 downto 0) -); -end component; - end package; -- 2.43.0