~ruther/jesd204b-vhdl

212264ba57fdf56a3d425e3a3c7b5d6953c287b5 — František Boháček 2 years ago f077b17
chore: specify ranges for all integers

Ranges are not needed inside of tesbenches.
Resolves #22.
M src/data_link/data_link_layer.vhd => src/data_link/data_link_layer.vhd +5 -5
@@ 31,8 31,8 @@ entity data_link_layer is
    ERROR_CONFIG : error_handling_config        := (2, 0, 5, 5, 5);  -- Configuration
                                        -- for the error
    SCRAMBLING   : std_logic                    := '0';  -- Whether scrambling is enabled
    F            : integer                      := 2;  -- Number of octets in a frame
    K            : integer                      := 1);  -- Number of frames in a mutliframe
    F            : integer range 1 to 256       := 2;  -- Number of octets in a frame
    K            : integer range 1 to 32        := 1);  -- Number of frames in a mutliframe
  port (
    ci_char_clk  : in std_logic;        -- Character clock
    ci_frame_clk : in std_logic;        -- Frame clock


@@ 42,9 42,9 @@ entity data_link_layer is
    do_lane_config : out link_config;  -- Configuration of the link

    -- synchronization
    co_lane_ready : out std_logic;  -- Received /A/, waiting for lane sync
    ci_lane_start : in  std_logic;  -- Start sending data from lane buffer
    ci_request_sync : in std_logic; -- Request resynchronization
    co_lane_ready   : out std_logic;  -- Received /A/, waiting for lane sync
    ci_lane_start   : in  std_logic;  -- Start sending data from lane buffer
    ci_request_sync : in  std_logic;  -- Request resynchronization

    -- input, output
    co_synced        : out std_logic;  -- Whether the lane is synced

M src/data_link/data_link_pkg.vhd => src/data_link/data_link_pkg.vhd +14 -14
@@ 41,7 41,7 @@ package data_link_pkg is
    DID       : integer range 0 to 255;        -- Device identification number
    F         : integer range 1 to 256;        -- No. of octets per frame
    HD        : std_logic;              -- High density format
    JESDV     : integer;                -- JESD204 version
    JESDV     : integer range 0 to 7;                -- JESD204 version
    K         : integer range 1 to 32;  -- No. of frames per multiframe
    L         : integer range 1 to 32;  -- No. of lanes per converter
    LID       : integer range 0 to 31;  -- Lane identification number


@@ 59,19 59,19 @@ package data_link_pkg is
  end record link_config;

  type error_handling_config is record
    lane_alignment_realign_after  : integer;  -- realign after correctly
                                              -- received X alignment
                                              -- characters (0 to disable)
    frame_alignment_realign_after : integer;  -- realign after correctly
                                              -- received X alignment
                                              -- characters (0 to disable)
    tolerate_missing_in_frame     : integer;  -- How many missing errors to
                                              -- tolerate in a frame (0 to disable)
    tolerate_disparity_in_frame   : integer;  -- How many disparity errors to
                                              -- tolerate in a frame (0 to disable)
    tolerate_unexpected_characters_in_frame : integer;  -- How many unexpected
                                                        -- characters to
                                                        -- tolerate in a frame
    lane_alignment_realign_after            : integer range 0 to 256;  -- realign after correctly
                                        -- received X alignment
                                        -- characters (0 to disable)
    frame_alignment_realign_after           : integer range 0 to 256;  -- realign after correctly
                                        -- received X alignment
                                        -- characters (0 to disable)
    tolerate_missing_in_frame               : integer range 0 to 256;  -- How many missing errors to
                                        -- tolerate in a frame (0 to disable)
    tolerate_disparity_in_frame             : integer range 0 to 256;  -- How many disparity errors to
                                        -- tolerate in a frame (0 to disable)
    tolerate_unexpected_characters_in_frame : integer range 0 to 256;  -- How many unexpected
                                        -- characters to
                                        -- tolerate in a frame
  end record error_handling_config;

end package data_link_pkg;

M src/data_link/error_handler.vhd => src/data_link/error_handler.vhd +2 -2
@@ 15,8 15,8 @@ use work.data_link_pkg.all;
entity error_handler is
  generic (
    CONFIG : error_handling_config; -- Configuration of error handling
    F : integer; -- Number of octets in a frame
    K : integer); -- Number of frames in a multiframe
    F : integer range 1 to 256; -- Number of octets in a frame
    K : integer range 1 to 32); -- Number of frames in a multiframe
  port (
    ci_char_clk                      : in  std_logic;  -- Character clock
    ci_reset                         : in  std_logic;  -- Reset (asynchronous,

M src/data_link/frame_alignment.vhd => src/data_link/frame_alignment.vhd +2 -2
@@ 78,8 78,8 @@ architecture a1 of frame_alignment is
  signal reg_correct_sync_chars : integer := 0;
  signal reg_known_sync_char_position : integer range 0 to 256;

  signal next_octet_index : integer := 0;
  signal next_adjusted_octet_index : integer := 0;
  signal next_octet_index : integer range 0 to F := 0;
  signal next_adjusted_octet_index : integer range 0 to F := 0;
begin  -- architecture a1
  data_buffer: entity work.ring_buffer
    generic map (

M src/data_link/ilas_parser.vhd => src/data_link/ilas_parser.vhd +24 -24
@@ 14,20 14,20 @@ use ieee.numeric_std.all;

entity ilas_parser is
  generic (
    F : integer; -- Number of octets in a frame
    K : integer; -- Number of frames in a multiframe
    K_character  : std_logic_vector(7 downto 0) := "10111100";  -- Character
                                                                -- for syncing
    R_character  : std_logic_vector(7 downto 0) := "00011100";  -- ILAS
                                                                -- multiframe
                                                                -- start character
    A_character  : std_logic_vector(7 downto 0) := "01111100";  -- ILAS
                                                                -- multiframe
                                                                -- end character
    Q_character  : std_logic_vector(7 downto 0) := "10011100";  -- ILAS 2nd
                                                                -- multiframe
                                                                -- 2nd character
    multiframes_count : integer                      := 4);
    F                 : integer range 1 to 256;  -- Number of octets in a frame
    K                 : integer range 1 to 32;  -- Number of frames in a multiframe
    K_character       : std_logic_vector(7 downto 0) := "10111100";  -- Character
                                        -- for syncing
    R_character       : std_logic_vector(7 downto 0) := "00011100";  -- ILAS
                                        -- multiframe
                                        -- start character
    A_character       : std_logic_vector(7 downto 0) := "01111100";  -- ILAS
                                        -- multiframe
                                        -- end character
    Q_character       : std_logic_vector(7 downto 0) := "10011100";  -- ILAS 2nd
                                        -- multiframe
                                        -- 2nd character
    multiframes_count : integer range 1 to 32        := 4);

  port (
    ci_char_clk        : in  std_logic;  -- Character clock


@@ 48,19 48,19 @@ architecture a1 of ilas_parser is
  signal octets_in_multiframe : integer range 0 to 8192 := 0;
  signal link_config_data : std_logic_vector(link_config_length-1 downto 0) := (others => '0');
  signal reg_processing_ilas : std_logic := '0';
  signal reg_multiframe_index : integer := 0;
  signal reg_octet_index : integer := 0;
  signal reg_multiframe_index : integer range 0 to multiframes_count+1 := 0;
  signal reg_octet_index : integer range 0 to F*K+5 := 0;

  signal next_processing_ilas : std_logic := '0';
  signal next_multiframe_index : integer := 0;
  signal next_octet_index : integer := 0;
  signal next_multiframe_index : integer range 0 to multiframes_count+1 := 0;
  signal next_octet_index : integer range 0 to F*K+5 := 0;

  signal finished : std_logic := '0';
  signal err : std_logic := '0';


  function getOctetUpIndex (
    octet_index : integer)
    octet_index : integer range 0 to F*K+5)
    return integer is
  begin  -- function getByteUpIndex
    return link_config_length - 1 - 8 * octet_index;


@@ 68,9 68,9 @@ architecture a1 of ilas_parser is

  function getDataByIndex (
    data        : std_logic_vector(link_config_length-1 downto 0);
    octet_index : integer;
    bit_index   : integer;
    length      : integer)
    octet_index : integer range 0 to F*K+5;
    bit_index   : integer range 0 to 7;
    length      : integer range 1 to 8)
    return std_logic_vector is
    variable up_index : integer;
  begin  -- function getDataByIndex


@@ 80,8 80,8 @@ architecture a1 of ilas_parser is

  function getBitByIndex (
    data        : std_logic_vector(link_config_length-1 downto 0);
    octet_index : integer;
    bit_index   : integer)
    octet_index : integer range 0 to F*K+5;
    bit_index   : integer range 0 to 7)
    return std_logic is
    variable up_index : integer;
  begin  -- function getBitByIndex

M src/data_link/lane_alignment.vhd => src/data_link/lane_alignment.vhd +7 -7
@@ 15,11 15,11 @@ use work.data_link_pkg.all;

entity lane_alignment is
  generic (
    F : integer; -- Number of octets in a frame
    K : integer; -- Number of frames in a multiframe
    buffer_size     : integer          := 256;  -- How many octets to keep
    R_character : std_logic_vector(7 downto 0) := "00011100";  -- The /R/ character
    dummy_character : character_vector := ('1', '0', '0', "10111100", '0'));
    F               : integer range 1 to 256;  -- Number of octets in a frame
    K               : integer range 1 to 32;  -- Number of frames in a multiframe
    buffer_size     : integer                      := 256;  -- How many octets to keep
    R_character     : std_logic_vector(7 downto 0) := "00011100";  -- The /R/ character
    dummy_character : character_vector             := ('1', '0', '0', "10111100", '0'));
-- Character to send before the buffer is ready and started

  port (


@@ 49,8 49,8 @@ architecture a1 of lane_alignment is
  signal reg_started : std_logic := '0';
  signal reg_error : std_logic := '0';

  signal reg_write_index : integer := 0;
  signal reg_read_index : integer := 0;
  signal reg_write_index : integer range 0 to buffer_size := 0;
  signal reg_read_index  : integer range 0 to buffer_size := 0;

  signal next_write_index : integer range 0 to buffer_size-1 := 0;
  signal next_read_index  : integer range 0 to buffer_size-1 := 0;

M src/data_link/link_controller.vhd => src/data_link/link_controller.vhd +2 -2
@@ 20,8 20,8 @@ use work.data_link_pkg.all;

entity link_controller is
  generic (
    F : integer; -- Number of octets in a frame
    K : integer; -- Number of frames in a multiframe
    F : integer range 1 to 256; -- Number of octets in a frame
    K : integer range 1 to 32; -- Number of frames in a multiframe
    K_character  : std_logic_vector(7 downto 0) := "10111100");  -- Sync character
  port (
    ci_frame_clk : in std_logic;        -- Frame clock

M src/descrambler.vhd => src/descrambler.vhd +1 -1
@@ 4,7 4,7 @@ use work.data_link_pkg.all;

entity descrambler is
  generic (
    F : integer);
    F : integer range 1 to 256);
  port (
    ci_frame_clk : in  std_logic;
    ci_reset    : in  std_logic;

M src/jesd204b_link_rx.vhd => src/jesd204b_link_rx.vhd +17 -18
@@ 22,24 22,24 @@ entity jesd204b_link_rx is
                                        -- alignment character
    Q_character  : std_logic_vector(7 downto 0) := "10011100";  -- ILAS 2nd
                                        -- frame 2nd character
    ADJCNT       : integer                      := 0;
    ADJCNT       : integer range 0 to 15        := 0;
    ADJDIR       : std_logic                    := '0';
    BID          : integer                      := 0;
    DID          : integer                      := 0;
    BID          : integer range 0 to 15        := 0;
    DID          : integer range 0 to 255       := 0;
    HD           : std_logic                    := '0';
    JESDV        : integer                      := 1;
    JESDV        : integer range 0 to 7         := 1;
    PHADJ        : std_logic                    := '0';
    SUBCLASSV    : integer                      := 0;
    K            : integer;             -- Number of frames in a
                                        -- multiframe
    CS           : integer;             -- Number of control bits per sample
    M            : integer;             -- Number of converters
    S            : integer;             -- Number of samples
    L            : integer;             -- Number of lanes
    F            : integer;             -- Number of octets in a frame
    CF           : integer;             -- Number of control words
    N            : integer;             -- Size of a sample
    Nn           : integer;             -- Size of a word (sample + ctrl if CF
    SUBCLASSV    : integer range 0 to 7         := 0;
    K            : integer range 1 to 32;  -- Number of frames in a
                                           -- multiframe
    CS           : integer range 0 to 3;   -- Number of control bits per sample
    M            : integer range 1 to 256;  -- Number of converters
    S            : integer range 1 to 32;  -- Number of samples
    L            : integer range 1 to 32;  -- Number of lanes
    F            : integer range 1 to 256;  -- Number of octets in a frame
    CF           : integer range 0 to 32;  -- Number of control words
    N            : integer range 1 to 32;  -- Size of a sample
    Nn           : integer range 1 to 32;  -- Size of a word (sample + ctrl if CF
    ERROR_CONFIG : error_handling_config        := (2, 0, 5, 5, 5);
    SCRAMBLING   : std_logic                    := '0');
  port (


@@ 53,8 53,7 @@ entity jesd204b_link_rx is

    di_transceiver_data : in  lane_input_array(0 to L-1);  -- Data from transceivers
    do_samples          : out samples_array(0 to M - 1, 0 to S - 1);
    co_frame_state      : out frame_state;
-- Output samples
    co_frame_state      : out frame_state;  -- Output samples
    co_correct_data     : out std_logic);  -- Whether samples are correct user
                                           -- data
end entity jesd204b_link_rx;


@@ 109,9 108,9 @@ architecture a1 of jesd204b_link_rx is
      then
        matches := '0';
      end if;
    end loop;  -- i

      return matches;
    end loop;  -- i
  end function ConfigsMatch;
begin  -- architecture a1
  -- nsynced is active LOW, set '0' if all ready

M src/jesd204b_multipoint_link_rx.vhd => src/jesd204b_multipoint_link_rx.vhd +2 -2
@@ 44,7 44,7 @@ architecture a1 of jesd204b_multipoint_link_rx is

  -- purpose: Count lanes before link with index link_index
  function sumCummulativeLanes (
    link_index : integer)
    link_index : integer range 0 to LINKS-1)
    return integer is
    variable lanes_count : integer := 0;
  begin  -- function sumCummulativeLanes


@@ 59,7 59,7 @@ architecture a1 of jesd204b_multipoint_link_rx is

  -- purpose: Count converters before link with index link_index
  function sumCummulativeConverters (
    link_index : integer)
    link_index : integer range 0 to LINKS-1)
    return integer is
    variable converters_count : integer := 0;
  begin  -- function sumCummulativeConverters

Do not follow this link