Skip to content
Snippets Groups Projects
Commit 5dd1e818 authored by BRONES Romain's avatar BRONES Romain
Browse files

New minor version: Register control, filter wrong frames

* Separated and fixed error flags
* Dedicated register to reset flags
* Data stream stopped on reset
* Do not forward erroneous frames
parents 496e1685 d0e562f8
No related branches found
No related tags found
No related merge requests found
......@@ -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,
......
......@@ -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 --
----------------
......@@ -131,7 +135,7 @@ begin
);
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_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';
......@@ -245,7 +250,8 @@ begin
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_pkt_id <= fifo_tdata(55 downto 48);
header_framenum <= fifo_tdata(63 downto 56);
end if;
if fsm_state = G_THREE then
......
......@@ -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;
......@@ -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;
......@@ -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;
};
......@@ -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;
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment