From 4a807ac4593b64b1d349684735f3cee9780eff96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 25 Feb 2023 20:56:52 +0100 Subject: [PATCH] feat: make frame alignment output aligned octets in frames instead of octets --- src/data_link/frame_alignment.vhd | 13 ++++++++----- testbench/data_link/frame_alignment_tb.vhd | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/data_link/frame_alignment.vhd b/src/data_link/frame_alignment.vhd index 7135fe3..1ed9abd 100644 --- a/src/data_link/frame_alignment.vhd +++ b/src/data_link/frame_alignment.vhd @@ -79,6 +79,7 @@ architecture a1 of frame_alignment is signal reg_known_sync_char_position : integer range 0 to 256; signal next_octet_index : integer := 0; + signal next_adjusted_octet_index : integer := 0; begin -- architecture a1 data_buffer: entity work.ring_buffer generic map ( @@ -117,6 +118,7 @@ begin -- architecture a1 reg_state <= INIT; reg_last_frame_data <= (others => '0'); next_frame_state <= ('0', '0', '0', '0', '0', '0', '0', '0'); + buffer_align_to <= -1; elsif ci_char_clk'event and ci_char_clk = '1' then -- rising clock edge -- set last_frame_data if this is the last frame and not /F/ or /A/ if next_is_last_octet = '1' and not (is_f = '1' or is_a = '1') then @@ -169,7 +171,7 @@ begin -- architecture a1 reg_state <= ALIGNED; elsif ci_realign = '1' then -- align to last known sync char position - buffer_align_to <= reg_known_sync_char_position; + buffer_align_to <= reg_known_sync_char_position + buffer_read_position; reg_state <= ALIGNED; end if; end if; @@ -179,17 +181,18 @@ begin -- architecture a1 co_correct_sync_chars <= reg_correct_sync_chars; buffer_raw_adjust_position <= (buffer_align_to + 1 - buffer_read_position) mod F; - buffer_adjust_position <= buffer_raw_adjust_position when buffer_raw_adjust_position < F/2 + 1 + buffer_adjust_position <= buffer_raw_adjust_position when buffer_raw_adjust_position <= F/2 + 1 else buffer_raw_adjust_position - F; 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 SCRAMBLED else + reg_last_frame_data when not SCRAMBLED else F_replace_data when is_f = '1' else A_replace_data; - next_octet_index <= buffer_write_position mod F; - next_is_last_octet <= '1' when F = 1 or next_octet_index = F - 2 else '0'; + next_adjusted_octet_index <= (buffer_write_position - buffer_read_position - buffer_adjust_position) mod F; + next_octet_index <= (buffer_write_position - buffer_read_position) mod F; + next_is_last_octet <= '1' when next_adjusted_octet_index = F - 1 else '0'; is_f <= '1' when di_char.d8b = F_char and di_char.kout = '1' else '0'; is_a <= '1' when di_char.d8b = A_char and di_char.kout = '1' else '0'; diff --git a/testbench/data_link/frame_alignment_tb.vhd b/testbench/data_link/frame_alignment_tb.vhd index 694c43b..d421dc3 100644 --- a/testbench/data_link/frame_alignment_tb.vhd +++ b/testbench/data_link/frame_alignment_tb.vhd @@ -38,7 +38,7 @@ architecture a1 of frame_alignment_tb is ('0', '0', ('1', '0', '0', "00000010", '1'), '1', '0'), ('0', '0', ('0', '0', '0', "00000011", '1'), '1', '0'), ('0', '0', ('0', '0', '0', "00000100", '1'), '1', '0'), - ('0', '0', ('0', '0', '0', "00000000", '1'), '1', '0'), -- frame begins + ('0', '0', ('0', '0', '0', "00000000", '1'), '1', '0'), -- frame ends ('0', '0', ('1', '0', '0', "11111100", '1'), '0', '1'), -- frame begins, /A/ ('0', '0', ('1', '0', '0', "11111100", '1'), '0', '1'), -- frame begins, /A/ ('0', '0', ('0', '0', '0', "01000001", '1'), '0', '1'), @@ -50,9 +50,18 @@ architecture a1 of frame_alignment_tb is ('0', '0', ('0', '0', '0', "00100010", '1'), '1', '0'), ('0', '0', ('0', '0', '0', "00100011", '1'), '1', '0'), ('0', '0', ('0', '0', '0', "00100100", '1'), '1', '0'), - ('0', '0', ('0', '0', '0', "00000101", '1'), '1', '0'), - ('0', '0', ('0', '0', '0', "00000001", '1'), '1', '0'), - ('0', '0', ('0', '0', '0', "00000000", '1'), '1', '0') -- frame begin + ('0', '0', ('0', '0', '0', "10000101", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "01000001", '1'), '1', '0'), -- frame begins + ('0', '0', ('0', '0', '0', "01000010", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "01000011", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "01000100", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "01000101", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "00100001", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "00100010", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "00100011", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "00100100", '1'), '1', '0'), + ('0', '0', ('1', '0', '0', "11111100", '1'), '1', '0'), + ('0', '0', ('0', '0', '0', "00000000", '1'), '1', '0') ); constant char_clk_period : time := 1 ns; -- 2.48.1