diff --git a/hdl/combpm_packet_filter.vhd b/hdl/combpm_packet_filter.vhd index 211ae59bda7cb12ef7f61e3bb42b107a718aae04..2d81f26d28b40028901c4c5a16e8945a146c0fcf 100644 --- a/hdl/combpm_packet_filter.vhd +++ b/hdl/combpm_packet_filter.vhd @@ -4,145 +4,50 @@ use ieee.numeric_std.all; use work.pkg_bpmpacket_stream.all; +library desy; +use desy.ram_tdp; + entity combpm_packet_filter is generic( - G_B_ADDR_W : natural := 14 + G_W_ADDR_TABLE : natural ); port( - axis_clk : in std_logic; - axi_clk : in std_logic; - axis_rst_n : in std_logic; - axi_rst_n : in std_logic; - - -- AXIS SLAVE INTERFACE - s_axis_tdest : in std_logic_vector(C_TDEST_W-1 downto 0); - s_axis_tdata : in std_logic_vector(C_TDATA_W-1 downto 0); - s_axis_tlast : in std_logic; - s_axis_tvalid : in std_logic; - s_axis_tready : out std_logic; + axis_clk : in std_logic; + axi_clk : in std_logic; + axis_rst_n : in std_logic; -- AXIS SLAVE INTERFACE - m_axis_tdest : out std_logic_vector(C_TDEST_W-1 downto 0); - m_axis_tdata : out std_logic_vector(C_TDATA_W-1 downto 0); - m_axis_tlast : out std_logic; - m_axis_tvalid : out std_logic; + s_axis_tdest : in std_logic_vector(C_TDEST_W-1 downto 0); + s_axis_tdata : in std_logic_vector(C_TDATA_W-1 downto 0); + s_axis_tlast : in std_logic; + s_axis_tvalid : in std_logic; + s_axis_tready : out std_logic; + + -- AXIS MASTER INTERFACE + m_axis_tdest : out std_logic_vector(C_TDEST_W-1 downto 0); + m_axis_tdata : out std_logic_vector(C_TDATA_W-1 downto 0); + m_axis_tlast : out std_logic; + m_axis_tvalid : out std_logic; + + -- Table configuration interface + pi_table_en : in std_logic; + pi_table_we : in std_logic; + pi_table_addr : in std_logic_vector(G_W_ADDR_TABLE-1 downto 0); + pi_table_data : in std_logic_vector(7 downto 0); + po_table_data : out std_logic_vector(7 downto 0) - -- AXI bus interface - s_axi_awaddr : IN STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - s_axi_awlen : IN STD_LOGIC_VECTOR(7 DOWNTO 0); - s_axi_awsize : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_awburst : IN STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_awlock : IN STD_LOGIC; - s_axi_awcache : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_awprot : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_awvalid : IN STD_LOGIC; - s_axi_awready : OUT STD_LOGIC; - s_axi_wdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0); - s_axi_wstrb : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_wlast : IN STD_LOGIC; - s_axi_wvalid : IN STD_LOGIC; - s_axi_wready : OUT STD_LOGIC; - s_axi_bresp : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_bvalid : OUT STD_LOGIC; - s_axi_bready : IN STD_LOGIC; - s_axi_araddr : IN STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - s_axi_arlen : IN STD_LOGIC_VECTOR(7 DOWNTO 0); - s_axi_arsize : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_arburst : IN STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_arlock : IN STD_LOGIC; - s_axi_arcache : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_arprot : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_arvalid : IN STD_LOGIC; - s_axi_arready : OUT STD_LOGIC; - s_axi_rdata : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); - s_axi_rresp : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_rlast : OUT STD_LOGIC; - s_axi_rvalid : OUT STD_LOGIC; - s_axi_rready : IN STD_LOGIC ); end combpm_packet_filter; architecture rtl of combpm_packet_filter is - --------------------------- - -- COMPONENT DECLARATION -- - --------------------------- - COMPONENT combpm_packet_filter_axi_bram_ctrl - PORT ( - s_axi_aclk : IN STD_LOGIC; - s_axi_aresetn : IN STD_LOGIC; - s_axi_awaddr : IN STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - s_axi_awlen : IN STD_LOGIC_VECTOR(7 DOWNTO 0); - s_axi_awsize : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_awburst : IN STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_awlock : IN STD_LOGIC; - s_axi_awcache : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_awprot : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_awvalid : IN STD_LOGIC; - s_axi_awready : OUT STD_LOGIC; - s_axi_wdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0); - s_axi_wstrb : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_wlast : IN STD_LOGIC; - s_axi_wvalid : IN STD_LOGIC; - s_axi_wready : OUT STD_LOGIC; - s_axi_bresp : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_bvalid : OUT STD_LOGIC; - s_axi_bready : IN STD_LOGIC; - s_axi_araddr : IN STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - s_axi_arlen : IN STD_LOGIC_VECTOR(7 DOWNTO 0); - s_axi_arsize : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_arburst : IN STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_arlock : IN STD_LOGIC; - s_axi_arcache : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - s_axi_arprot : IN STD_LOGIC_VECTOR(2 DOWNTO 0); - s_axi_arvalid : IN STD_LOGIC; - s_axi_arready : OUT STD_LOGIC; - s_axi_rdata : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); - s_axi_rresp : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); - s_axi_rlast : OUT STD_LOGIC; - s_axi_rvalid : OUT STD_LOGIC; - s_axi_rready : IN STD_LOGIC; - bram_rst_a : OUT STD_LOGIC; - bram_clk_a : OUT STD_LOGIC; - bram_en_a : OUT STD_LOGIC; - bram_we_a : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); - bram_addr_a : OUT STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - bram_wrdata_a : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); - bram_rddata_a : IN STD_LOGIC_VECTOR(31 DOWNTO 0) - ); - END COMPONENT; - - COMPONENT combpm_packet_filter_blk_mem - PORT ( - clka : IN STD_LOGIC; - ena : IN STD_LOGIC; - wea : IN STD_LOGIC_VECTOR(3 DOWNTO 0); - addra : IN STD_LOGIC_VECTOR(G_B_ADDR_W-3 DOWNTO 0); - dina : IN STD_LOGIC_VECTOR(31 DOWNTO 0); - douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); - clkb : IN STD_LOGIC; - enb : IN STD_LOGIC; - web : IN STD_LOGIC_VECTOR(0 DOWNTO 0); - addrb : IN STD_LOGIC_VECTOR(G_B_ADDR_W-1 DOWNTO 0); - dinb : IN STD_LOGIC_VECTOR(7 DOWNTO 0); - doutb : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) - ); - END COMPONENT; - ------------------------ -- SIGNAL DECLARATION -- ------------------------ signal in_packet : t_bpmpacket; signal out_packet : t_bpmpacket; - signal bram_clk_a : STD_LOGIC; - signal bram_en_a : STD_LOGIC; - signal bram_we_a : STD_LOGIC_VECTOR(3 DOWNTO 0); - signal bram_addr_a : STD_LOGIC_VECTOR(G_B_ADDR_W-3 DOWNTO 0); - signal bram_wrdata_a : STD_LOGIC_VECTOR(31 DOWNTO 0); - signal bram_rddata_a : STD_LOGIC_VECTOR(31 DOWNTO 0); - signal table_data : std_logic_vector(7 downto 0); signal tvalid_r : std_logic_vector(1 downto 0); @@ -186,73 +91,28 @@ begin m_axis_tlast <= '1'; -- Packet is one tdata only m_axis_tvalid <= tvalid_r(tvalid_r'left) and table_data(7); - --------------------- - -- BRAM CONTROLLER -- - --------------------- - inst_bram_ctrl : combpm_packet_filter_axi_bram_ctrl - port map ( - s_axi_aclk => axi_clk, - s_axi_aresetn => axi_rst_n, - - s_axi_awaddr => s_axi_awaddr, - s_axi_awlen => s_axi_awlen, - s_axi_awsize => s_axi_awsize, - s_axi_awburst => s_axi_awburst, - s_axi_awlock => s_axi_awlock, - s_axi_awcache => s_axi_awcache, - s_axi_awprot => s_axi_awprot, - s_axi_awvalid => s_axi_awvalid, - s_axi_awready => s_axi_awready, - s_axi_wdata => s_axi_wdata, - s_axi_wstrb => s_axi_wstrb, - s_axi_wlast => s_axi_wlast, - s_axi_wvalid => s_axi_wvalid, - s_axi_wready => s_axi_wready, - s_axi_bresp => s_axi_bresp, - s_axi_bvalid => s_axi_bvalid, - s_axi_bready => s_axi_bready, - s_axi_araddr => s_axi_araddr, - s_axi_arlen => s_axi_arlen, - s_axi_arsize => s_axi_arsize, - s_axi_arburst => s_axi_arburst, - s_axi_arlock => s_axi_arlock, - s_axi_arcache => s_axi_arcache, - s_axi_arprot => s_axi_arprot, - s_axi_arvalid => s_axi_arvalid, - s_axi_arready => s_axi_arready, - s_axi_rdata => s_axi_rdata, - s_axi_rresp => s_axi_rresp, - s_axi_rlast => s_axi_rlast, - s_axi_rvalid => s_axi_rvalid, - s_axi_rready => s_axi_rready, - - bram_rst_a => open, - bram_clk_a => bram_clk_a, - bram_en_a => bram_en_a, - bram_we_a => bram_we_a, - bram_addr_a(1 downto 0) => open, - bram_addr_a(G_B_ADDR_W-1 downto 2) => bram_addr_a, - bram_wrdata_a => bram_wrdata_a, - bram_rddata_a => bram_rddata_a - ); - - ------------------- - -- BRAM INSTANCE -- - ------------------- - inst_bram : combpm_packet_filter_blk_mem + ------------------ + -- FILTER TABLE -- + ------------------ + -- Port A is read write from AXI controller, Port B is read only from logic + inst_phase_table: entity desy.ram_tdp + generic map( + G_ADDR => G_W_ADDR_TABLE, + G_DATA => 8 + ) port map( - clka => bram_clk_a, - ena => bram_en_a, - wea => bram_we_a, - addra => bram_addr_a, - dina => bram_wrdata_a, - douta => bram_rddata_a, - clkb => axis_clk, - enb => '1', - web => "0", - addrb => in_packet.bpm_id(G_B_ADDR_W-1 downto 0), - dinb => (others => '0'), - doutb => table_data + pi_clk_a => axi_clk, + pi_en_a => pi_table_en, + pi_we_a => pi_table_we, + pi_addr_a => pi_table_addr, + pi_data_a => pi_table_data, + po_data_a => po_table_data, + pi_clk_b => axis_clk, + pi_en_b => '1', + pi_we_b => '0', + pi_addr_b => in_packet.bpm_id(G_W_ADDR_TABLE-1 downto 0), + pi_data_b => (others => '0'), + po_data_b => table_data ); end architecture rtl; diff --git a/hdl/pkg_combpm.vhd b/hdl/pkg_combpm.vhd index 67c7acb6d2e488d69ef1bff59f1aa4917aeb7e08..febec73a280eaf86f0747d1c211bc6ee023401de 100644 --- a/hdl/pkg_combpm.vhd +++ b/hdl/pkg_combpm.vhd @@ -7,6 +7,9 @@ use ieee.numeric_std.all; package pkg_combpm is + constant C_W_ADDR_TABLE : natural := 8; + + ------------------------- -- GT WIZARD COMPONENT -- ------------------------- diff --git a/hdl/top_combpm_electron.vhd b/hdl/top_combpm_electron.vhd index b4e6831e04220005bcbb273786fa5991efd6f7fd..b4ec6c53f7eb830993d4f22eb4f758cb62130766 100644 --- a/hdl/top_combpm_electron.vhd +++ b/hdl/top_combpm_electron.vhd @@ -48,8 +48,10 @@ entity top_combpm_electron is -- AXIS interface m_axis_aclk : out std_logic; - m_axis_m2s : out t_bpmpacket_axis_m2s; - m_axis_s2m : in t_bpmpacket_axis_s2m; -- warning: TREADY is ignored ! + m_axis_tdata : out std_logic_vector(C_TDATA_W-1 downto 0); + m_axis_tdest : out std_logic_vector(C_TDEST_W-1 downto 0); + m_axis_tlast : out std_logic; + m_axis_tready : in std_logic; -- AXI bus interface s_axi_aclk : in std_logic; @@ -93,6 +95,8 @@ architecture struct of top_combpm_electron is signal cdc_control_array_axi : std_logic_vector(2 downto 0); -- CDC, clock axi side signal cdc_control_array_bpm : std_logic_vector(2 downto 0); -- CDC, clock bpm side + signal m_axis_decoded_m2s : t_bpmpacket_axis_m2s; + signal m_axis_decoded_s2m : t_bpmpacket_axis_s2m; -- warning: TREADY is ignored ! begin @@ -234,8 +238,8 @@ begin pps => pps, gt_datarx => gt_datarx, - m_axis_m2s => m_axis_m2s, - m_axis_s2m => m_axis_s2m, + m_axis_m2s => m_axis_decoded_m2s, + m_axis_s2m => m_axis_decoded_s2m, mc_time => mc_time, soft_reset => addrmap_w.PROTOCOL.SOFTRESET.data(0), @@ -323,4 +327,40 @@ begin gtwiz_userclk_tx_usrclk_out => open, gtwiz_userclk_tx_usrclk2_out => open ); + + + ------------------- + -- PACKET FILTER -- + ------------------- + inst_filter:entity work.combpm_packet_filter + generic map( + G_W_ADDR_TABLE => C_W_ADDR_TABLE + ) + port map( + axis_clk => usrclk, + axi_clk => s_axi_aclk, + axis_rst_n => sync_resetn, + + -- AXIS SLAVE INTERFACE + s_axis_tdest => m_axis_decoded_m2s.tdest, + s_axis_tdata => m_axis_decoded_m2s.tdata, + s_axis_tlast => m_axis_decoded_m2s.tlast, + s_axis_tvalid => m_axis_decoded_m2s.tvalid, + s_axis_tready => m_axis_decoded_s2m.tready, + + -- AXIS SLAVE INTERFACE + m_axis_tdest => m_axis_tdest, + m_axis_tdata => m_axis_tdata, + m_axis_tlast => m_axis_tlast, + m_axis_tvalid => m_axis_tvalid, + + -- Table configuration interface + pi_table_en => addrmap_r.table.en, + pi_table_we => addrmap_r.table.we, + pi_table_addr => addrmap_r.table.addr(C_W_ADDR_TABLE-1 downto 0), + pi_table_data => addrmap_r.table.data, + po_table_data => addrmap_w.table.data + ); + + end architecture struct; diff --git a/rdl/combpm.rdl b/rdl/combpm.rdl index 15019143e4e5a13e47f2d2784d08f30fc0bd37b9..b9e2bfa56c74562049f4e42d944cfc93e6df98e2 100644 --- a/rdl/combpm.rdl +++ b/rdl/combpm.rdl @@ -109,4 +109,10 @@ addrmap combpm { field {hw=w;sw=r;} data[16]; } FRAMESEQ; + external mem { + desc = "BPM filter table"; + memwidth = 8; + mementries = 2**`C_W_ADDR_TABLE; + } TABLE; + }; diff --git a/tcl/generate_combpm_packet_filter_ip.tcl b/tcl/generate_combpm_packet_filter_ip.tcl deleted file mode 100644 index a3bf011864655735de7077586fa38ea5e2e739a3..0000000000000000000000000000000000000000 --- a/tcl/generate_combpm_packet_filter_ip.tcl +++ /dev/null @@ -1,49 +0,0 @@ - -# Address width, on logic side (8 bits data access) -set b_addr_w 14 - -# Address width on AXI MM side (32 bits access) -set a_addr_w [expr $b_addr_w-2] - -set a_depth [expr 1<<$a_addr_w] -set b_depth [expr 1<<$b_addr_w] - -set xcipath [create_ip -name axi_bram_ctrl -vendor xilinx.com -library ip -version 4.1 -module_name combpm_packet_filter_axi_bram_ctrl] - - -set_property -dict [list \ - CONFIG.PROTOCOL {AXI4} \ - CONFIG.SUPPORTS_NARROW_BURST {0} \ - CONFIG.SINGLE_PORT_BRAM {1} \ - CONFIG.USE_ECC {0} \ - CONFIG.BMG_INSTANCE {EXTERNAL} \ - CONFIG.MEM_DEPTH $a_depth \ - CONFIG.CLKIF.FREQ_HZ 250000000 \ - CONFIG.DATA_WIDTH 32 \ - ] [get_ips combpm_packet_filter_axi_bram_ctrl] - -set_property GENERATE_SYNTH_CHECKPOINT 0 [get_files $xcipath] - -set xcipath [create_ip -name blk_mem_gen -vendor xilinx.com -library ip -version 8.4 -module_name combpm_packet_filter_blk_mem] - -set_property -dict [list \ - CONFIG.Memory_Type {True_Dual_Port_RAM} \ - CONFIG.Use_Byte_Write_Enable {true} \ - CONFIG.Byte_Size {8} \ - CONFIG.Write_Width_A {32} \ - CONFIG.Write_Depth_A $a_depth \ - CONFIG.Read_Width_A {32} \ - CONFIG.Operating_Mode_A {WRITE_FIRST} \ - CONFIG.Write_Width_B {8} \ - CONFIG.Read_Width_B {8} \ - CONFIG.Operating_Mode_B {WRITE_FIRST} \ - CONFIG.Enable_B {Use_ENB_Pin} \ - CONFIG.Register_PortA_Output_of_Memory_Primitives {false} \ - CONFIG.Register_PortA_Output_of_Memory_Core {false} \ - CONFIG.Register_PortB_Output_of_Memory_Primitives {false} \ - CONFIG.Port_B_Clock {250} \ - CONFIG.Port_B_Write_Rate {0} \ - CONFIG.Port_B_Enable_Rate {100} \ - ] [get_ips combpm_packet_filter_blk_mem] - -set_property GENERATE_SYNTH_CHECKPOINT 0 [get_files $xcipath] diff --git a/tcl/main.tcl b/tcl/main.tcl index 92b13bb2359c108f15702db2f46a6becb4ffc3a1..981ca440c5806ab0810232975df8a10f40d71bc9 100644 --- a/tcl/main.tcl +++ b/tcl/main.tcl @@ -4,11 +4,13 @@ # ============================================================================== proc init {} { + variable Config + + # Configuration from package + parseVhdlConfigFile Config "../hdl/pkg_combpm.vhd" + + # TODO add quad to configuration - # Configuration - # TODO Follow FWK - # variable quad_name - # set quad_name X0Y4 } # ============================================================================== @@ -47,8 +49,6 @@ proc doOnCreate {} { set_property target_language VHDL [current_project] source combpm_gtwizard.tcl - source generate_combpm_packet_filter_ip.tcl - variable Vhdl addSources Vhdl }