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