diff --git a/libraries/base/dp/src/vhdl/dp_rsn_source.vhd b/libraries/base/dp/src/vhdl/dp_rsn_source.vhd
index 61ec23f9dff8e62a108b7af363387a3f0a105d7f..db0835da04948d894bc2a559f62dc57f77d033d4 100644
--- a/libraries/base/dp/src/vhdl/dp_rsn_source.vhd
+++ b/libraries/base/dp/src/vhdl/dp_rsn_source.vhd
@@ -25,26 +25,38 @@
 --   use the Raw sample Sequence Number (RSN) as rs_sosi.bsn according to the
 --   PPS and RSN grid defined in [1].
 -- Description:
---   The rs_sosi timing is derived from the input bs_sosi, but the rs_sosi
+--   The BSN in the input bs_sosi counts blocks of g_bs_block_size samples
+--   since t_epoch = 1 Jan 1970 [1]. The RSN can start at any BSN, using
+--   RSN = BSN * g_bs_block_size as initial value. The block size
+--   g_rs_block_size of the RSN is free to choose and will typically differ
+--   from the BSN block size g_bs_block_size. Therefore counting back to
+--   t_epoch the very first RSN block in the output rs_sosi will typically
+--   not start at t_epoch. The RSN will start at 0 at t_epoch, because it
+--   counts samples. Therefore choose to let the bsn field in the rs_sosi
+--   record carry the RSN of the first sample in the block, instead of
+--   counting blocks. The RSN thus increments by g_rs_block_size (instead of
+--   by 1) for every block.
+-- Features:
+-- . The rs_sosi timing is derived from the input bs_sosi, but the rs_sosi
 --   uses RSN as rs_sosi.bsn and has its own block and sync intervals.
---   Assumption is that every clk cycle carries valid data when the
+-- . Assumption is that every clk cycle carries valid data when the
 --   bs_sosi.valid is '1', so no gaps in bs_sosi.valid.
---   The bs_sosi can stop and restart. It (re)starts with bs_sosi.sync and
+-- . The bs_sosi can stop and restart. It (re)starts with bs_sosi.sync and
 --   bs_sosi.sop when bs_sosi.valid becomes '1' and it stops when
 --   bs_sosi.valid becomes '0' immediately after a bs_sosi.eop.
---   The rs_sosi block size is g_rs_block_size.
---   The rs_sosi sync interval has g_nof_clk_per_sync. If g_nof_clk_per_sync
+-- . The rs_sosi block size is g_rs_block_size.
+-- . The rs_sosi sync interval has g_nof_clk_per_sync. If g_nof_clk_per_sync
 --   is not a multiple of g_rs_block_size, then the rs_sosi.sync will occur at
 --   the next start of block.
---   The initial RSN in rs_sosi.bsn is bs_sosi.bsn * g_bs_block_size, where
+-- . The initial RSN in rs_sosi.bsn is bs_sosi.bsn * g_bs_block_size, where
 --   g_bs_block_size is the input block size of bs_sosi.
---   The rs_sosi starts when the bs_sosi starts, so when bs_sosi.sync = '1'
+-- . The rs_sosi starts when the bs_sosi starts, so when bs_sosi.sync = '1'
 --   and bs_sosi.valid becomes '1'.
---   The rs_sosi ends after the rs_sosi.eop, when the bs_sosi ends. There
+-- . The rs_sosi ends after the rs_sosi.eop, when the bs_sosi ends. There
 --   may be undefined filler data in the last rs_sosi block to finish it
 --   after the rs_sosi.eop.
 -- Remark:
--- * The bs_sosi typically comes from dp_bsn_source_v2.vhd
+-- . The bs_sosi typically comes from dp_bsn_source_v2.vhd
 --
 -- References:
 -- [1] https://support.astron.nl/confluence/display/L2M/L2+STAT+Decision%3A+Timing+in+Station