@@ 19,7 19,7 @@ use work.transport_pkg.all;
entity frame_alignment is
generic (
- SCRAMBLED : boolean; -- Whether data are scrambled
+ SCRAMBLING : std_logic; -- Whether data are scrambled
F : integer range 0 to 256 := 8; -- Number of octets in a frame
K : integer range 0 to 32 := 1; -- Number of frames in a multiframe
sync_char : std_logic_vector(7 downto 0) := "10111100"; -- K
@@ 186,7 186,7 @@ begin -- architecture a1
is_wrong_char <= (is_f and not next_is_last_octet) or (is_a and not next_is_last_octet);
buffer_character <= di_char.d8b when is_f = '0' and is_a = '0' else
- reg_last_frame_data when not SCRAMBLED else
+ reg_last_frame_data when SCRAMBLING = '0' else
F_replace_data when is_f = '1' else
A_replace_data;
@@ 45,6 45,7 @@ entity jesd204b_rx is
di_transceiver_data : in lane_input_array(L-1 downto 0); -- Data from transceivers
do_samples : out samples_array(M - 1 downto 0, S - 1 downto 0);
+ co_frame_state : out frame_state;
-- Output samples
co_correct_data : out std_logic); -- Whether samples are correct user
-- data
@@ 55,20 56,22 @@ architecture a1 of jesd204b_rx is
-- outputs
signal data_link_ready_vector : std_logic_vector(L-1 downto 0) := (others => '0');
signal data_link_synced_vector : std_logic_vector(L-1 downto 0) := (others => '0');
- signal data_link_chars_array : frame_character_array(0 to L-1);
+ signal data_link_aligned_chars_array : lane_character_array(0 to L-1)(F*8-1 downto 0);
+ signal data_link_frame_state_array : frame_state_array(0 to L-1);
-- inputs
signal data_link_start : std_logic := '0';
-- == DESCRAMBLER ==
- signal scrambler_chars_array : frame_character_array(0 to L-1);
+ -- signal scrambler_chars_array : frame_character_array(0 to L-1);
-- == TRANSPORT ==
- signal transport_chars_array : frame_character_array(0 to L-1);
+ signal transport_chars_array : lane_character_array(0 to L-1)(F*8-1 downto 0);
+ signal transport_frame_state_array : frame_state_array(0 to L-1);
type lane_configs_array is array (0 to L-1) of link_config;
signal lane_configuration_array : lane_configs_array;
- signal all_ones : std_logic_vector(L-1 downto 0) := (others => '0');
+ signal all_ones : std_logic_vector(L-1 downto 0) := (others => '1');
function ConfigsMatch (
config_array : lane_configs_array)
@@ 93,40 96,43 @@ begin -- architecture a1
data_link_start <= '1' when data_link_ready_vector = all_ones else '0';
-- characters either from scrambler if scrambling enabled or directly from data_link
- transport_chars_array <= scrambler_chars_array when SCRAMBLING = '1' else data_link_chars_array;
+ -- transport_chars_array <= scrambler_chars_array when SCRAMBLING = '1' else data_link_chars_array;
+ transport_chars_array <= data_link_aligned_chars_array;
+ transport_frame_state_array <= data_link_frame_state_array;
-- error '1' if configs do not match
co_error <= not ConfigsMatch(lane_configuration_array);
- data_links: for i in 0 to L-1 generate
- data_link_layer: entity work.data_link_layer
+ data_links : for i in 0 to L-1 generate
+ data_link_layer : entity work.data_link_layer
generic map (
- K_character => K_character,
- R_character => R_character,
- A_character => A_character,
- Q_character => Q_character,
+ K_character => K_character,
+ R_character => R_character,
+ A_character => A_character,
+ Q_character => Q_character,
ERROR_CONFIG => ERROR_CONFIG,
- SCRAMBLING => SCRAMBLING,
- F => F,
- K => K)
+ SCRAMBLING => SCRAMBLING,
+ F => F,
+ K => K)
port map (
- ci_char_clk => ci_char_clk,
- ci_reset => ci_reset,
- do_lane_config => lane_configuration_array(i),
- co_lane_ready => data_link_ready_vector(i),
- ci_lane_start => data_link_start,
- ci_error_config => ERROR_CONFIG,
- co_synced => data_link_synced_vector(i),
- di_10b => di_transceiver_data(i),
- do_char => data_link_chars_array(i));
+ ci_char_clk => ci_char_clk,
+ ci_frame_clk => ci_frame_clk,
+ ci_reset => ci_reset,
+ do_lane_config => lane_configuration_array(i),
+ co_lane_ready => data_link_ready_vector(i),
+ ci_lane_start => data_link_start,
+ co_synced => data_link_synced_vector(i),
+ di_10b => di_transceiver_data(i),
+ do_aligned_chars => data_link_aligned_chars_array(i),
+ co_frame_state => data_link_frame_state_array(i));
scrambler_gen: if SCRAMBLING = '1' generate
- scrambler: entity work.descrambler
- port map (
- ci_char_clk => ci_char_clk,
- ci_reset => ci_reset,
- di_char => data_link_chars_array(i),
- do_char => scrambler_chars_array(i));
+ -- scrambler: entity work.descrambler
+ -- port map (
+ -- ci_char_clk => ci_char_clk,
+ -- ci_reset => ci_reset,
+ -- di_char => data_link_chars_array(i),
+ -- do_char => scrambler_chars_array(i));
end generate scrambler_gen;
end generate data_links;
@@ 141,11 147,11 @@ begin -- architecture a1
N => N,
Nn => Nn)
port map (
- ci_char_clk => ci_char_clk,
ci_frame_clk => ci_frame_clk,
ci_reset => ci_reset,
di_lanes_data => transport_chars_array,
- co_correct_data => co_correct_data,
+ ci_frame_states => transport_frame_state_array,
+ co_frame_state => co_frame_state,
do_samples_data => do_samples);
end architecture a1;
@@ 15,21 15,21 @@ use work.transport_pkg.all;
entity transport_layer is
generic (
CS : integer := 1; -- Number of control bits per sample
- M : integer := 1; -- Number of converters
- S : integer := 1; -- Number of samples
- L : integer := 1; -- Number of lanes
- F : integer := 2; -- Number of octets in a frame
+ M : integer := 1; -- Number of converters
+ S : integer := 1; -- Number of samples
+ L : integer := 1; -- Number of lanes
+ F : integer := 2; -- Number of octets in a frame
CF : integer := 0; -- Number of control words
- N : integer := 12; -- Size of a sample
- Nn : integer := 16); -- Size of a word (sample + ctrl if CF
- -- =0
+ N : integer := 12; -- Size of a sample
+ Nn : integer := 16); -- Size of a word (sample + ctrl if CF
+ -- =0
port (
- ci_char_clk : in std_logic; -- Character clock
- ci_frame_clk : in std_logic; -- Frame clock
- ci_reset : in std_logic; -- Reset (asynchronous, active low)
- ci_frame_states : in frame_state_array(0 to L-1);
+ ci_frame_clk : in std_logic; -- Frame clock
+ ci_reset : in std_logic; -- Reset (asynchronous, active low)
+ di_lanes_data : in lane_character_array(0 to L-1)(F*8-1 downto 0); -- Data from the lanes
+ ci_frame_states : in frame_state_array(0 to L-1);
co_frame_state : out frame_state;
- do_samples_data : out samples_array(0 to M - 1, 0 to S - 1)); -- The
+ do_samples_data : out samples_array(0 to M - 1, 0 to S - 1)); -- The
-- output samples
end entity transport_layer;
@@ 48,12 48,11 @@ begin -- architecture a1
N => N,
Nn => Nn)
port map (
- ci_char_clk => ci_char_clk,
ci_frame_clk => ci_frame_clk,
ci_reset => ci_reset,
ci_frame_states => ci_frame_states,
di_lanes_data => di_lanes_data,
- co_frame_state => co_frame_staet,
+ co_frame_state => co_frame_state,
do_samples_data => do_samples_data);
end architecture a1;