📄 e1_defr.vhd
字号:
library ieee;use ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;entity e1_defr isport(E1_in: in STD_LOGIC;--input serial stream E1_CLK_in: in STD_LOGIC;--clock for input stream reset: in STD_LOGIC; -- reset frame_start,byte_ready,sync_ok: out STD_LOGIC; -- fr1,fr2: out STD_LOGIC; data: out STD_LOGIC_VECTOR (0 to 7); -- erri: out integer range 0 to 3; zero_frame: out STD_LOGIC_VECTOR (0 to 7)--; -- output: out STD_LOGIC_VECTOR (1 downto 0) );end e1_defr ;architecture BEHAVIOR of e1_defr isconstant BITS_IN_FRAME: integer :=255;--!!!!!!!!!!!!!!!!!!255SIGNAL frame1_det,frame2_det: STD_LOGIC ;signal prl_in:STD_LOGIC_VECTOR (0 to 7);signal state: STD_LOGIC_VECTOR (1 downto 0);begindata<=prl_in;--------------------------------------------------------------------------------------------------------- frame1 and frame2 detection-------------------------------------------------------------------------------------------------------frame2_det<=prl_in(1);with prl_in select frame1_det<='1' when "10011011", '0' when others;-------------------------------------------------------------------------------------------------------- lower bits come first!!!-- serial to parallel converter------------------------------------------------------------------------------------------------------process (E1_CLK_in)beginif (FALLING_EDGE(E1_CLK_in)) thenprl_in(0 to 6)<=prl_in(1 to 7);prl_in(7)<=E1_in;end if;end process;---------------------------------------------------------------------------------------------------------- state machine using GRAY CODE (or trying to use GRAY CODE :-) )-- 00 - waiting for the first frame syncronization sygnal-- 01 - skipping other frame bits + 8 bits of next syncro signal and trying to detect second frame sync.-- signal, if all OK go to the 011 state, else to the 000 state-- 11 - skipping other frame bits + 8 bits of next syncro signal and trying to detect first frame sync.-- signal, if all OK go to the 010 state, else to the 000 state-- 10 - start normal data receiving. Syncronizanion complete.--------------------------------------------------------------------------------------------------------process (E1_CLK_in,reset)variable cnt : integer range 0 to 255;variable s_err: integer range 0 to 3;variable frame_flag: std_logic;-- determines type of the framebeginif (reset='1') then state<="00";elsif (RISING_EDGE(E1_CLK_in)) thenCASE state IS WHEN "00" => sync_ok<='0';-- no syncronization frame_start<='0'; state(0)<=frame1_det; -- waiting for the first frame alignment, if detected go to the next state cnt:=0; frame_flag:='0'; s_err:=0; WHEN "01" => if (cnt = BITS_IN_FRAME) then state(0)<=frame2_det; state(1)<=frame2_det; cnt:=0; else cnt:=cnt+1; end if; WHEN "11" => if (cnt = BITS_IN_FRAME) then state(0)<='0'; state(1)<=frame1_det; cnt:=0; else cnt:=cnt+1; end if; WHEN "10" => sync_ok<='1';-- syncronization established if (cnt = BITS_IN_FRAME) then if(frame_flag='0') then -- detecting wrong syncro signal ?????? according to g704 zero_frame<=prl_in;--store zero frame for future transmission if(frame2_det='0') then s_err:=s_err+1; else s_err:=0; end if; end if; cnt:=0; frame_start<='0';-- frame ended frame_flag:=not(frame_flag);-- change type of zero time-slot else--byte_ready placed there to avoid byte_ready generation then time-slot 0 received (cnt = BITS_IN_RFAME) frame_start<='1';--frame begins byte_ready<=CONV_STD_LOGIC_VECTOR(cnt,3)(0) and CONV_STD_LOGIC_VECTOR(cnt,3)(1) and CONV_STD_LOGIC_VECTOR(cnt,3)(2); cnt:=cnt+1; end if;-- if received 3 consecutive wrong frame alignment signals system detect "loss of frame alignment" situation state(1)<=not(CONV_STD_LOGIC_VECTOR(s_err,2)(0) and CONV_STD_LOGIC_VECTOR(s_err,2)(1)); when others=> state<="00";END CASE;end if;end process;end BEHAVIOR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -