diff --git a/hdl/ccn_pack.vhd b/hdl/ccn_pack.vhd index 8bd963954dfd6f6823847cc87a06232bdbc92a43..58ce0576771d3705809be2f5035bae3d7e8f8360 100644 --- a/hdl/ccn_pack.vhd +++ b/hdl/ccn_pack.vhd @@ -112,6 +112,7 @@ architecture rtl of ccn_pack is signal fifo_tlast : std_logic; signal fifo_tuser : std_logic_vector(0 downto 0); signal fifo_tuser_slv : std_logic_vector(7 downto 0); + signal fifo_err_rst : std_logic; -- Some constant for mapping constant C_TKEEP_S00 : std_logic_vector(23 downto 0) := (others => '1'); @@ -244,12 +245,13 @@ begin header_tdata(103 downto 96) <= mac_length(15 downto 8); header_tdata(111 downto 104) <= mac_length(7 downto 0); header_tdata(119 downto 112) <= G_PROTOCOL_ID; - header_tdata(127 downto 120) <= (others => '0'); + header_tdata(127 downto 120) <= pkt_reg_tuser(7 downto 0); header_tdata(191 downto 128) <= timeref; sup_arb_res_s1 <= not header_tready; - pkt_ix_tdata <= pkt_reg_tdata; + pkt_ix_tdata <= pkt_reg_tdata when frame_error = '0' else + (others => '0'); pkt_ix_tvalid <= frame_error or reg_tvalid; pkt_ix_tlast <= frame_error or pkt_cnt_zero; pkt_ix_tuser <= (others => frame_error); @@ -290,10 +292,11 @@ begin -- FIFO -- ---------- fifo_tuser(0) <= or_reduce(fifo_tuser_slv); + fifo_err_rst <= (not fifo_tuser(0)) and aresetn; inst_fifo: entity work.ccn_axis_fifo_pframe port map( - s_axis_aresetn => aresetn, + s_axis_aresetn => fifo_err_rst, s_axis_aclk => aclk, m_axis_aclk => m_axis_clk, s_axis_tvalid => fifo_tvalid, diff --git a/hdl/ccn_unpack.vhd b/hdl/ccn_unpack.vhd index b71f0591e6e41d3cd020cd23378716b76da6a86c..c8d22b44408833196c7c8d083e0386395dcdc31e 100644 --- a/hdl/ccn_unpack.vhd +++ b/hdl/ccn_unpack.vhd @@ -28,6 +28,7 @@ entity ccn_unpack is err_mac_dst : out std_logic; err_mac_src : out std_logic; pkt_mcts : out std_logic_vector(63 downto 0); + frame_counter : out std_logic_vector(31 downto 0); -- AXIS Frame input s_axis_clk : in std_logic; -- Only S_AXIS signals on this clk domain @@ -82,12 +83,15 @@ architecture rtl of ccn_unpack is signal header_mac_len : std_logic_vector(15 downto 0); signal header_pkt_id : std_logic_vector(7 downto 0); signal header_pkt_mcts : std_logic_vector(63 downto 0); + signal header_framenum : std_logic_vector(7 downto 0); -- Status and stats signal frame_cnt : unsigned(31 downto 0); begin + frame_counter <= std_logic_vector(frame_cnt); + ---------------- -- INPUT FIFO -- ---------------- @@ -129,9 +133,9 @@ begin m_axis_tkeep => m_axis_tkeep, m_axis_tlast => open ); - m_axis_tvalid <= wconv_out_tvalid; - m_axis_tlast <= wconv_out_tvalid; - m_axis_tuser <= std_logic_vector(frame_cnt(m_axis_tuser'range)); + m_axis_tvalid <= wconv_out_tvalid; + m_axis_tlast <= wconv_out_tvalid; + m_axis_tuser <= std_logic_vector(header_framenum(m_axis_tuser'range)); wconv_in_tvalid <= (not fsm_dump) and fifo_tvalid; @@ -218,6 +222,7 @@ begin header_mac_len <= (others => '0'); header_pkt_id <= (others => '0'); frame_cnt <= (others => '0'); + header_framenum <= (others => '0'); err_pid <= '0'; err_mac_dst <= '0'; err_mac_src <= '0'; @@ -241,11 +246,12 @@ begin if fsm_state = G_TWO then header_mac_src(31 downto 24) <= fifo_tdata(7 downto 0); header_mac_src(23 downto 16) <= fifo_tdata(15 downto 8); - header_mac_src(15 downto 8) <= fifo_tdata(23 downto 16); - header_mac_src(7 downto 0) <= fifo_tdata(31 downto 24); - header_mac_len(15 downto 8) <= fifo_tdata(39 downto 32); - header_mac_len(7 downto 0) <= fifo_tdata(47 downto 40); - header_pkt_id(7 downto 0) <= fifo_tdata(55 downto 48); + header_mac_src(15 downto 8) <= fifo_tdata(23 downto 16); + header_mac_src(7 downto 0) <= fifo_tdata(31 downto 24); + header_mac_len(15 downto 8) <= fifo_tdata(39 downto 32); + header_mac_len(7 downto 0) <= fifo_tdata(47 downto 40); + header_pkt_id <= fifo_tdata(55 downto 48); + header_framenum <= fifo_tdata(63 downto 56); end if; if fsm_state = G_THREE then diff --git a/hdl/top_ccn_packeter.vhd b/hdl/top_ccn_packeter.vhd index 6803b9801a6ea7f182e26535c00d43533e619698..936b966863d5a647c4979c950a89c79eae738a7b 100644 --- a/hdl/top_ccn_packeter.vhd +++ b/hdl/top_ccn_packeter.vhd @@ -69,6 +69,12 @@ architecture rtl of top_ccn_packeter is signal areset : std_logic; + -- Flags + signal s_err_timeout : std_logic; + signal f_err_timeout : std_logic; + signal s_err_seq : std_logic; + signal f_err_seq : std_logic; + begin areset <= not aresetn; @@ -107,18 +113,18 @@ begin aresetn => aresetn, -- Control - packeter_run => addrmap_o.packeter_bpm_frame.run.data(0), + packeter_run => addrmap_o.control.enable.data(0), mac_dst => mac_dst, mac_src => mac_src, - mac_length => addrmap_o.mac_length.length.data, - packet_timeout => addrmap_o.packeter_bpm_frame.timeout.data, - expect_pkt_cnt => addrmap_o.packeter_bpm_frame.count.data, + mac_length => addrmap_o.mac_length.data.data, + packet_timeout => addrmap_o.timeout.data.data, + expect_pkt_cnt => addrmap_o.npacket.data.data, timeref => timeref, -- Status - status_err_seq => addrmap_i.packeter_error.seq.data(0), - status_err_timeout => addrmap_i.packeter_error.timeout.data(0), - status_frame_count => addrmap_i.packeter_count.count.data, + status_err_seq => s_err_seq, + status_err_timeout => s_err_timeout, + status_frame_count => addrmap_i.packeter_count.data.data, -- AXIS Packet input s_axis_tdata => s_axis_tdata, @@ -137,5 +143,35 @@ begin ); + ------------------ + -- STICKY FLAGS -- + ------------------ + addrmap_i.packeter_error.timeout.data(0) <= f_err_timeout; + addrmap_i.packeter_error.seq.data(0) <= f_err_seq; + + p_flags:process(aclk, aresetn) + begin + if aresetn = '0' then + f_err_timeout <= '0'; + f_err_seq <= '0'; + elsif rising_edge(aclk) then + + if addrmap_o.reset_error.reset.data(0) = '1' then + f_err_timeout <= '0'; + f_err_seq <= '0'; + else + + if s_err_timeout = '1' then + f_err_timeout <= '1'; + end if; + + if s_err_seq = '1' then + f_err_seq <= '1'; + end if; + + end if; + + end if; + end process; end architecture; diff --git a/hdl/top_ccn_unpacketer.vhd b/hdl/top_ccn_unpacketer.vhd index b43e6870b5e84cc96f1e949245cda6063a7a1a13..c2ab3fe2a9ae7cf8968a8a5a84fee64965ca4345 100644 --- a/hdl/top_ccn_unpacketer.vhd +++ b/hdl/top_ccn_unpacketer.vhd @@ -70,6 +70,17 @@ architecture struct of top_ccn_unpacketer is signal areset : std_logic; + + -- Error flags + signal f_err_pid : std_logic; + signal f_err_mac_len : std_logic; + signal f_err_mac_dst : std_logic; + signal f_err_mac_src : std_logic; + signal s_err_pid : std_logic; + signal s_err_mac_len : std_logic; + signal s_err_mac_dst : std_logic; + signal s_err_mac_src : std_logic; + begin areset <= not aresetn; @@ -117,11 +128,12 @@ begin mac_src => mac_src, -- Status - err_pid => addrmap_i.unpack_error.err_pid.data(0), - err_mac_len => addrmap_i.unpack_error.err_mac_len.data(0), - err_mac_dst => addrmap_i.unpack_error.err_mac_dst.data(0), - err_mac_src => addrmap_i.unpack_error.err_mac_src.data(0), + err_pid => s_err_pid, + err_mac_len => s_err_mac_len, + err_mac_dst => s_err_mac_dst, + err_mac_src => s_err_mac_src, pkt_mcts => open, + frame_counter => addrmap_i.frame_cnt.data.data, -- AXIS Frame input s_axis_clk => s_axis_clk, @@ -142,4 +154,49 @@ begin ); + ------------------ + -- STICKY FLAGS -- + ------------------ + addrmap_i.unpack_error.err_pid.data(0) <= f_err_pid; + addrmap_i.unpack_error.err_mac_len.data(0) <= f_err_mac_len; + addrmap_i.unpack_error.err_mac_dst.data(0) <= f_err_mac_dst; + addrmap_i.unpack_error.err_mac_src.data(0) <= f_err_mac_src; + + p_flags:process(aclk, aresetn) + begin + if aresetn = '0' then + f_err_pid <= '0'; + f_err_mac_len <= '0'; + f_err_mac_dst <= '0'; + f_err_mac_src <= '0'; + elsif rising_edge(aclk) then + + if addrmap_o.reset_error.reset.data(0) = '1' then + f_err_pid <= '0'; + f_err_mac_len <= '0'; + f_err_mac_dst <= '0'; + f_err_mac_src <= '0'; + else + + if s_err_pid = '1' then + f_err_pid <= '1'; + end if; + + if s_err_mac_len = '1' then + f_err_mac_len <= '1'; + end if; + + if s_err_mac_dst = '1' then + f_err_mac_dst <= '1'; + end if; + + if s_err_mac_src = '1' then + f_err_mac_src <= '1'; + end if; + end if; + + end if; + end process; + + end architecture struct; diff --git a/rdl/ccn_packeter.rdl b/rdl/ccn_packeter.rdl index b3526817a36d00032d14e0a16576f46e4d40ec61..64ee0dbe24a46bb92d1e297d1ea68eae49e09266 100644 --- a/rdl/ccn_packeter.rdl +++ b/rdl/ccn_packeter.rdl @@ -40,31 +40,43 @@ addrmap ccn_packeter { } MAC_SRC_MSB; reg { - desc="Ethernet MAC frame length. Should be PACKETER_BPM_FRAME.COUNT+8"; - field {hw=r; sw=rw;} LENGTH[16]; + desc="Ethernet MAC frame length. Should be (NPACKET+1)*PACKETSIZE+10"; + field {hw=r; sw=rw;} data[16]; } MAC_LENGTH; reg { desc="Packeter control."; - field {hw=r; sw=rw; desc="Timeout limit. One unit is 4 ns."; - } TIMEOUT[16]; - field {hw=r; sw=rw; desc="Number of BPM packet to aggregate."; - } COUNT[8]; - field {hw=r; sw=rw; desc="Start the BPM packeter."; - } RUN; - } PACKETER_BPM_FRAME; + default hw=r; default sw=rw; + field {desc="Enable the BPM packeter.";} ENABLE; + } CONTROL; + + reg { + default hw=r; default sw=rw; + field {desc="Timeout limit. One unit is 4 ns.";} data[16]; + } TIMEOUT; + + reg { + default hw=r; default sw=rw; + field {desc="Number of BPM packet to aggregate -1 .";} data[8]; + } NPACKET; reg { desc="Number of output Position Packets counted"; - field {hw=w; sw=r;} COUNT[32]; + field {hw=w; sw=r;} data[32]; } PACKETER_COUNT; reg { desc="Error detected by the packeter. Cleared on read."; - field {hw=w; sw=r; rclr; sticky; desc="New FA sequence received before reaching expected number of BPM packets."; + field {hw=w; sw=r; desc="New FA sequence received before reaching expected number of BPM packets."; } SEQ; - field {hw=w; sw=r; rclr; sticky; desc="Timeout waiting for a new BPM packet."; + field {hw=w; sw=r; desc="Timeout waiting for a new BPM packet."; } TIMEOUT; } PACKETER_ERROR; + reg { + desc="Reset error flags"; + default hw=r; default sw=rw; + field {desc="Start the BPM packeter.";} RESET; + } RESET_ERROR; + }; diff --git a/rdl/ccn_unpacketer.rdl b/rdl/ccn_unpacketer.rdl index d95ef325a68447827608c136e303dfddabf6838e..745429371d9881a46a4c25580b09eeed63465777 100644 --- a/rdl/ccn_unpacketer.rdl +++ b/rdl/ccn_unpacketer.rdl @@ -40,27 +40,37 @@ addrmap ccn_unpacketer { } MAC_SRC_MSB; reg { - desc="Ethernet MAC frame length. Should be PACKETER_BPM_FRAME.COUNT+8"; + desc="Ethernet MAC frame length. Should be (CONFIGURE.NPACKET+1)*PACKETSIZE+10"; field {hw=r; sw=rw;} LENGTH[16]; } MAC_LENGTH; reg { desc="Unpacketer control."; - field {hw=r; sw=rw; desc="Start the BPM packeter."; - } enable; - } control; + default hw=r; default sw=rw; + field {desc="Start the BPM packeter.";} ENABLE; + } CONTROL; reg { desc="Error detected by the packeter. Cleared on read."; - field {hw=w; sw=r; rclr; sticky; desc="Protocol ID mismatch."; + field {hw=w; sw=r; desc="Protocol ID mismatch."; } ERR_PID; - field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC frame length not expected."; + field {hw=w; sw=r; desc="Incomming MAC frame length not expected."; } ERR_MAC_LEN; - field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC source address not expected."; + field {hw=w; sw=r; desc="Incomming MAC source address not expected."; } ERR_MAC_SRC; - field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC destination address not expected."; + field {hw=w; sw=r; desc="Incomming MAC destination address not expected."; } ERR_MAC_DST; - } UNPACK_ERROR; + reg { + desc="Reset error flags"; + default hw=r; default sw=rw; + field {desc="Start the BPM packeter.";} RESET; + } RESET_ERROR; + + reg { + desc="Unpacked frames counter."; + field {hw=rw; sw=r;} data[32]; + } FRAME_CNT; + };