From ecec68b59007d279cd547e60143fa4fd11978785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= <fandabohacek@gmail.com> Date: Sat, 25 Feb 2023 22:50:27 +0100 Subject: [PATCH] fix: update data link layer to meet changes --- src/data_link/data_link_layer.vhd | 72 ++++++++++++++++++------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/src/data_link/data_link_layer.vhd b/src/data_link/data_link_layer.vhd index e3c09e7..3c27911 100644 --- a/src/data_link/data_link_layer.vhd +++ b/src/data_link/data_link_layer.vhd @@ -18,35 +18,38 @@ library ieee; use ieee.std_logic_1164.all; use work.data_link_pkg.all; +use work.transport_pkg.all; entity data_link_layer is generic ( K_character : std_logic_vector(7 downto 0) := "10111100"; -- K sync character R_character : std_logic_vector(7 downto 0) := "00011100"; -- ILAS - -- multiframe start + -- multiframe start A_character : std_logic_vector(7 downto 0) := "01111100"; -- multiframe end Q_character : std_logic_vector(7 downto 0) := "10011100"; -- 2nd ILAS frame - -- 2nd character - 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 + -- 2nd character + 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 port ( - ci_char_clk : in std_logic; -- Character clock - ci_reset : in std_logic; -- Reset (asynchronous, active low) + 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) -- link configuration - do_lane_config : out link_config; -- Configuration of the link + 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 + co_lane_ready : out std_logic; -- Received /A/, waiting for lane sync + ci_lane_start : in std_logic; -- Start sending data from lane buffer -- input, output - co_synced : out std_logic; -- Whether the lane is synced - di_10b : in std_logic_vector(9 downto 0); -- The 10b input character - do_char : out frame_character); -- The aligned frame output character + co_synced : out std_logic; -- Whether the lane is synced + di_10b : in std_logic_vector(9 downto 0); -- The 10b input character + do_aligned_chars : out std_logic_vector(8*F - 1 downto 0); + co_frame_state : out frame_state); -- The aligned frame output character end entity data_link_layer; architecture a1 of data_link_layer is @@ -54,22 +57,23 @@ architecture a1 of data_link_layer is signal decoder_do_char : character_vector; - signal lane_alignment_ci_realign : std_logic := '0'; - signal lane_alignment_co_aligned : std_logic; - signal lane_alignment_co_error : std_logic; - signal lane_alignment_co_ready : std_logic; - signal lane_alignment_do_char : character_vector; + signal lane_alignment_ci_realign : std_logic := '0'; + signal lane_alignment_co_aligned : std_logic; + signal lane_alignment_co_error : std_logic; + signal lane_alignment_co_ready : std_logic; + signal lane_alignment_do_char : character_vector; signal lane_alignment_co_correct_sync_chars : integer; - signal frame_alignment_ci_request_sync : std_logic; - signal frame_alignment_ci_realign : std_logic := '0'; - signal frame_alignment_co_aligned : std_logic; - signal frame_alignment_co_error : std_logic; - signal frame_alignment_do_char : frame_character; + signal frame_alignment_ci_request_sync : std_logic; + signal frame_alignment_ci_realign : std_logic := '0'; + signal frame_alignment_co_aligned : std_logic; + signal frame_alignment_co_error : std_logic; + signal frame_alignment_do_aligned_chars : std_logic_vector(8*F - 1 downto 0); + signal frame_alignment_co_frame_state : frame_state; signal frame_alignment_co_correct_sync_chars : integer; signal link_controller_co_synced : std_logic; - signal link_controller_co_state : link_state; + signal link_controller_co_state : link_state; signal link_controller_do_config : link_config; signal link_controller_ci_resync : std_logic; @@ -77,7 +81,9 @@ begin -- architecture a1 do_lane_config <= link_controller_do_config; co_lane_ready <= lane_alignment_co_ready; co_synced <= link_controller_co_synced; - do_char <= frame_alignment_do_char; + do_aligned_chars <= frame_alignment_do_aligned_chars; + co_frame_state <= frame_alignment_co_frame_state; + co_synced <= link_controller_co_synced; frame_alignment_ci_request_sync <= not link_controller_co_synced; @@ -117,6 +123,8 @@ begin -- architecture a1 ci_frame_alignment_error => frame_alignment_co_error, ci_frame_alignment_aligned => frame_alignment_co_aligned, di_char => decoder_do_char, + co_synced => link_controller_co_synced, + co_state => link_controller_co_state, do_config => link_controller_do_config); -- char alignment @@ -153,12 +161,16 @@ begin -- architecture a1 -- frame alignment frame_alignment : entity work.frame_alignment + generic map ( + SCRAMBLING => SCRAMBLING, + F => F, + K => K) port map ( ci_char_clk => ci_char_clk, + ci_frame_clk => ci_frame_clk, ci_reset => ci_reset, - ci_scrambled => SCRAMBLING, - ci_F => F, - ci_K => K, + co_frame_state => frame_alignment_co_frame_state, + do_aligned_chars => frame_alignment_do_aligned_chars, co_correct_sync_chars => frame_alignment_co_correct_sync_chars, ci_request_sync => frame_alignment_ci_request_sync, ci_realign => frame_alignment_ci_realign, -- 2.48.1