diff --git a/doc/regmap.adoc b/doc/regmap.adoc index c1dbe4721576fb1986c42ab96c209acb652536d7..fb64a829c0e442f9bc60dd17ae16e5af0d9f12a3 100644 --- a/doc/regmap.adoc +++ b/doc/regmap.adoc @@ -3,34 +3,35 @@ |=== |Name | N | bits | type | RW | Description -| ID | 1 | 32 | uint | RO | +++Module identifier.+++ -| VERSION | 1 | 32 | uint | RO | +++Module version.+++ +| ID | 1 | 32 | uint | RO | +++Module Identification Number+++ + +| VERSION | 1 | 32 | uint | RO | +++Module version.+++ + | SFP | 1 | 2 | bitfields | RO | +++SFP module status+++ + -- RXLOS [0:0] sw:RO uint : +++RX lost signal+++ + -- MODABS [1:1] sw:RO uint : +++Module is absent+++ -| GT | 1 | 11 | bitfields | RW | +++GT transceivers status and control+++ + -- POWERGOOD [0:0] sw:RO uint : +++Powergood signal+++ + -- QPLLLOCK [1:1] sw:RO uint : +++PLL lock signal+++ + -- RXCLKACTIVE [2:2] sw:RO uint : +++RX clk active signal+++ + -- RXCDRLOCK [3:3] sw:RO uint : +++RX CDR lock signal+++ + -- RXRESETDONE [4:4] sw:RO uint : +++RX reset done signal+++ + -- RXBYTEISALIGNED [5:5] sw:RO uint : +++RX byte is aligned signal+++ + -- RXBYTEREALIGN [6:6] sw:RO uint : +++RX byte realign signal+++ + -- RXCOMMADET [7:7] sw:RO uint : +++RX comma detected signal+++ + -- RXCOMMADETEN [8:8] sw:RW uint : +++RX comma detection enable signal+++ + -- RXRSTDATAPATH [9:9] sw:RW uint : +++Reset RX datapath+++ + -- RXRSTPLLDATAPATH [10:10] sw:RW uint : +++Reset RX PLL and datapath+++ -| PROTOCOL | 1 | 4 | bitfields | RW | +++BPM protocol status and control+++ + -- FRAMEERROR [0:0] sw:RO uint : +++Frame error+++ + -- SEQFRAMECNTERROR [1:1] sw:RO uint : +++Sequence frame count mismatch+++ + -- SEQFRAMEDISCONT [2:2] sw:RO uint : +++Sequence frame discontinuity+++ + -- SOFTRESET [3:3] sw:RW uint : +++Soft reset+++ -| VALIDFRAMECNT | 1 | 32 | uint | RO | +++BPM protocol valid frame counters+++ -| INVALIDFRAMECNT | 1 | 32 | uint | RO | +++BPM protocol invalid frame counters+++ -| VALIDFRAMERATE | 1 | 32 | uint | RO | +++BPM protocol valid frame rate+++ -| INVALIDFRAMERATE | 1 | 32 | uint | RO | +++BPM protocol invalid frame rate+++ -| FRAMESEQ | 1 | 16 | uint | RO | +++BPM protocol frame sequence+++ -| TABLE | 256 | 8 | uint | RW | +++Packet filter table+++ + _RXLOS_ [0:0] sw:RO uint : +++RX lost signal+++ + + _MODABS_ [1:1] sw:RO uint : +++Module is absent+++ + +| GT_STATUS | 1 | 8 | bitfields | RO | +++GT transceivers status+++ + + _POWERGOOD_ [0:0] sw:RO uint : +++Powergood signal+++ + + _QPLLLOCK_ [1:1] sw:RO uint : +++PLL lock signal+++ + + _RXCLKACTIVE_ [2:2] sw:RO uint : +++RX clk active signal+++ + + _RXCDRLOCK_ [3:3] sw:RO uint : +++RX CDR lock signal+++ + + _RXRESETDONE_ [4:4] sw:RO uint : +++RX reset done signal+++ + + _RXBYTEISALIGNED_ [5:5] sw:RO uint : +++RX byte is aligned signal+++ + + _RXBYTEREALIGN_ [6:6] sw:RO uint : +++RX byte realign signal+++ + + _RXCOMMADET_ [7:7] sw:RO uint : +++RX comma detected signal+++ + +| GT_CONTROL | 1 | 3 | bitfields | RW | +++GT transceivers control+++ + + _RXCOMMADETEN_ [0:0] sw:RW uint : +++RX comma detection enable signal+++ + + _RXRSTDATAPATH_ [1:1] sw:RW uint : +++Reset RX datapath+++ + + _RXRSTPLLDATAPATH_ [2:2] sw:RW uint : +++Reset RX PLL and datapath+++ + +| PROTOCOL_ERROR | 1 | 3 | bitfields | RO | +++BPM protocol status and control+++ + + _FRAMEERROR_ [0:0] sw:RO uint : +++Frame error+++ + + _SEQFRAMECNTERROR_ [1:1] sw:RO uint : +++Sequence frame count mismatch+++ + + _SEQFRAMEDISCONT_ [2:2] sw:RO uint : +++Sequence frame discontinuity+++ + +| RESET | 1 | 1 | uint | RW | +++None+++ + +| VALIDFRAMECNT | 1 | 32 | uint | RO | +++BPM protocol valid frame counters+++ + +| INVALIDFRAMECNT | 1 | 32 | uint | RO | +++BPM protocol invalid frame counters+++ + +| VALIDFRAMERATE | 1 | 32 | uint | RO | +++BPM protocol valid frame rate+++ + +| INVALIDFRAMERATE | 1 | 32 | uint | RO | +++BPM protocol invalid frame rate+++ + +| FRAMESEQ | 1 | 16 | uint | RO | +++BPM protocol frame sequence+++ + +| FILTERTABLE | 256 | 32 | uint | RW | +++BPM filter table+++ + |=== diff --git a/hdl/combpm_protocol_electron.vhd b/hdl/combpm_protocol_electron.vhd index 214f3b6e2550faa83ce74542719f5ab026955286..c36c6ac53805549bfd26ec392b90a5bd415d12ef 100644 --- a/hdl/combpm_protocol_electron.vhd +++ b/hdl/combpm_protocol_electron.vhd @@ -84,8 +84,6 @@ architecture rtl of combpm_protocol_electron is signal packet : t_bpmpacket; signal m_axi_tvalid : std_logic; - signal pps_r : std_logic; - begin @@ -278,23 +276,19 @@ begin p_framecnt:process(clk, rst_n) begin if rst_n = '0' then - cnt_frame_seq_r <= (others => '0'); - cnt_valid_r <= (others => '0'); - cnt_invalid_r <= (others => '0'); - rate_valid_r <= (others => '0'); - rate_invalid_r <= (others => '0'); - frame_valid_rate <= (others => '0'); - frame_invalid_rate <= (others => '0'); - last_seq <= (others => '0'); - last_cnt_seq_r <= (others => '0'); - seq_discontinuity <= '0'; + cnt_frame_seq_r <= (others => '0'); + cnt_valid_r <= (others => '0'); + cnt_invalid_r <= (others => '0'); + rate_valid_r <= (others => '0'); + rate_invalid_r <= (others => '0'); + frame_valid_rate<= (others => '0'); + frame_invalid_rate<= (others => '0'); + last_seq <= (others => '0'); + last_cnt_seq_r <= (others => '0'); + seq_discontinuity <= '0'; cnt_seq_mismatch <= '0'; - pps_r <= '0'; elsif rising_edge(clk) then - -- Register for rising edge filter - pps_r <= pps; - if soft_reset = '1' then cnt_frame_seq_r <= (others => '0'); cnt_valid_r <= (others => '0'); @@ -319,7 +313,7 @@ begin end if; -- Rate counter - if pps = '1' and pps_r = '0' then + if pps = '1' then frame_valid_rate <= std_logic_vector(rate_valid_r); frame_invalid_rate <= std_logic_vector(rate_invalid_r); rate_valid_r <= (others => '0'); diff --git a/hdl/top_combpm_electron.vhd b/hdl/top_combpm_electron.vhd index 69508b45eff4a905137d8c57ca1615642274096e..6a7b86951b9c09f8414d73a352538148f8c4502d 100644 --- a/hdl/top_combpm_electron.vhd +++ b/hdl/top_combpm_electron.vhd @@ -69,6 +69,8 @@ architecture struct of top_combpm_electron is signal usrclk : std_logic; signal rst : std_logic; + signal pps_resync : std_logic; + signal frame_seq_cnt : std_logic_vector(15 downto 0); signal frame_valid_cnt : std_logic_vector(31 downto 0); signal frame_invalid_cnt : std_logic_vector(31 downto 0); @@ -112,6 +114,21 @@ begin src_arst => rst_n ); + xpm_cdc_pps_inst: xpm_cdc_pulse + generic map ( + RST_USED => 0, + DEST_SYNC_FF => 4, + INIT_SYNC_FF => 0 + ) + port map ( + dest_clk => usrclk, + dest_pulse => pps_resync, + src_rst => '0', + dest_rst => '0', + src_clk => free_100_clk, + src_pulse => pps + ); + -- Reset invert polarity rst <= not rst_n; @@ -232,7 +249,7 @@ begin port map( rst_n => sync_resetn, clk => usrclk, - pps => pps, + pps => pps_resync, gt_datarx => gt_datarx, m_axis_m2s => m_axis_decoded_m2s,