📄 rx_sla.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Rx_Sla IS
PORT(
RxClock : IN STD_LOGIC;
RxAddr : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
RxEnb : IN STD_LOGIC;
RxClav : OUT STD_LOGIC;
RxSoc : OUT STD_LOGIC;
Rxdata : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
ResetB : IN STD_LOGIC;
RD_AVAIL : IN STD_LOGIC;
Read_en : OUT STD_LOGIC;
Out_Data : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
-----微处理器接口
GCLK : IN STD_LOGIC;
D : INOUT STD_LOGIC_VECTOR(1 DOWNTO 0);
BA : IN STD_LOGIC_VECTOR(24 TO 31);
BCTL0 : IN STD_LOGIC; CS6 : IN STD_LOGIC
);
END Rx_Sla;
ARCHITECTURE RTL OF Rx_Sla IS
SIGNAL RxEnb_tmp : STD_LOGIC;
SIGNAL Byte_Count : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL Data1 : STD_LOGIC_VECTOR(15 DOWNTO 0);
TYPE Poll_State_TYPE IS (S0,S1,S2,S3,S4,S5,S6);
SIGNAL Poll_state : Poll_State_TYPE;
SIGNAL D_TMP :STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
PROCESS(GCLK)
BEGIN
IF(GCLK'EVENT AND GCLK='1') THEN
if(CS6 = '0' AND BCTL0 ='1') THEN
if(BA="11100111") THEN
if(Poll_state=S0) THEN
D<="00000001";
ELSIF(Poll_state=S1) THEN
D<="00000010";
ELSIF(Poll_state=S2) THEN
D<="00000100";
ELSIF(Poll_state=S3) THEN
D<="00001000";
ELSIF(Poll_state=S4) THEN
D<="00010000";
ELSIF(Poll_state=S5) THEN
D<="00100000";
ELSIF(Poll_state=S6) THEN
D<="01000000";
ELSE
D<="ZZZZZZZZ";
END IF;
END IF;
else
D<="ZZZZZZZZ";
END if;
END IF;
END PROCESS;
Justify: --接收轮询地址并验证如果地址为0,送出CLAV
PROCESS(RxClock,ResetB)
BEGIN
IF (ResetB = '0') Then
Poll_state<= S0;
Byte_Count<="00000" ;
Read_en<='0';
RxSoc<='0';
ELSIF (RxClock'EVENT AND RxClock = '1') THEN
CASE Poll_state IS
WHEN S0 => --判断FIFO中是否有数据
IF(RD_AVAIL='1') THEN
IF(RxAddr="11111") THEN
RxClav<='Z';
RxSoc<='Z';
Read_en<='1';
Byte_Count<=Byte_Count+'1';
Poll_state<= S1;
ELSE
RxClav<='0';
RxSoc<='Z';
Read_en<='1';
Byte_Count<=Byte_Count+'1';
Poll_state<= S1;
END IF;
ELSIF(RxAddr="11111") THEN
RxClav<='Z';
RxSoc<='Z';
Read_en<='0';
Poll_state<= S0;
ELSE
RxClav<='0';
RxSoc<='Z';
Read_en<='0';
Poll_state<= S0;
END IF;
WHEN S1 => --根据RxAddr来送出RxClav,送出FIFO读使能
IF(RxAddr="11111") THEN
RxClav<='Z';
RxSoc<='Z';
Read_en<='1';
Poll_state<= S2;
Byte_Count<=Byte_Count+'1';
ELSE
RxClav<='0';
RxSoc<='Z';
Read_en<='1';
Poll_state<= S2;
Byte_Count<=Byte_Count+'1';
END IF;
WHEN S2 => --根据RxAddr来送出RxClav并将FIFO读入的数据锁存
IF(RxAddr="11111") THEN
RxClav<='Z';
RxSoc<='Z';
Poll_state<= S3;
Read_en<='0';
Data1<=Out_Data;
ELSE
RxClav<='0';
RxSoc<='Z';
Poll_state<= S3;
Read_en<='0';
Data1<=Out_Data;
END IF;
WHEN S3 => --判断RxEnb来决定是否发送数据
IF (RxAddr="00000" ) THEN
IF (RxEnb='1' ) THEN
RxClav<='1';
RxSoc<='Z';
Poll_state<= S4;
Read_en<='0';
ELSE
RxClav<='1';
RxSoc<='Z';
Poll_state<= S3;
Read_en<='0';
END IF;
ELSIF( RxAddr="11111" ) THEN
RxClav<='Z';
RxSoc<='Z';
Poll_state<= S3;
Read_en<='0';
ELSE
RxClav<='0';
RxSoc<='Z';
Poll_state<= S3;
Read_en<='0';
END IF;
WHEN S4 => --判断RxEnb来决定是否继续发送数据
IF(RxAddr="00000") THEN
RxClav<='1';
ELSIF (RxAddr="11111") then THEN
RxClav<='Z';
ELSE
RxClav<='0';
END IF;
IF (RxEnb='1') THEN
Poll_state<= S3;
Read_en<='0';
RxSoc<='Z';
Rxdata<="ZZZZZZZZZZZZZZZZ";
ELSE
Poll_state<= S5;
RxSoc<='1';
Read_en<='1';
Rxdata<=Data1;
END IF;
WHEN S5 => --判断RxEnb来决定是否继续发送数据
IF(RxAddr="00000") THEN
RxClav<='1';
ELSIF (RxAddr="11111") THEN
RxClav<='Z';
ELSE
RxClav<='0';
END IF;
IF (RxEnb='1') THEN
Poll_state<= S5;
Read_en<='0';
RxSoc<='Z';
Rxdata<="ZZZZZZZZZZZZZZZZ";
ELSE
Poll_state<= S6;
RxSoc<='0';
Read_en<='1';
Rxdata<=Out_Data;
END IF;
WHEN S6 => --当数据为一帧时停止发送数据并返回到初始状态
IF(RxAddr="00000") THEN
RxClav<='1';
ELSIF (RxAddr="11111") THEN
RxClav<='Z';
ELSE
RxClav<='0';
END IF;
IF (RxEnb='1') THEN
Poll_state<= S6;
Read_en<='0';
RxSoc<='Z';
Rxdata<="ZZZZZZZZZZZZZZZZ";
ELSIF(Byte_Count="11001") THEN
Read_en<='0';
Poll_state<= S6;
RxSoc<='0';
Rxdata<=Out_Data;
Byte_Count<=Byte_Count+'1';
ELSIF(Byte_Count="11010") THEN
Read_en<='0';
Poll_state<= S6;
RxSoc<='0';
Rxdata<=Out_Data;
Byte_Count<=Byte_Count+'1';
ELSIF(Byte_Count="11011") THEN
Read_en<='0';
Byte_Count<="00000";
Poll_state<= S0;
RxSoc<='Z';
ELSE
Read_en<='1';
Rxdata<=Out_Data;
Poll_state<= S6;
Byte_Count<=Byte_Count+'1';
RxSoc<='0';
END if ;
END CASE;
END IF;
END PROCESS Justify;
END RTL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -