⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rx_sla.vhd

📁 VHDL的例子
💻 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 + -