📄 irda.vhd
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
-- CreateDate : 2007-07-24
-- ModifData : 2007-07-24
-- Description : irDA Receive ( Asynchronous, Data bits: 48 )
-- Remoter of Midea Air condition : R51F
-- Author : Explorer01
-- Version : V1.0
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- VHDL library Declarations
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations
ENTITY irDA IS
PORT
(
RXD: IN STD_LOGIC;
TXD: OUT STD_LOGIC;
RESET: IN STD_LOGIC;
CLK: IN STD_LOGIC; -- Period : 26uS( 37.9KHz )
EOC: OUT STD_LOGIC;
DATA1: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
DATA2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
DATA3: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END irDA;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF irDA IS
SIGNAL DataIN : STD_LOGIC;
SIGNAL CountCLK: STD_LOGIC_VECTOR(1 DOWNTO 0);
----------------------------
SIGNAL spdata: STD_LOGIC_VECTOR(47 DOWNTO 0);
SIGNAL cnt48: INTEGER RANGE 0 TO 63; -- 49BITS
SIGNAL Count : STD_LOGIC_VECTOR(7 DOWNTO 0); -- 256
SIGNAL CountT: STD_LOGIC_VECTOR(7 DOWNTO 0); -- 256
BEGIN
--
-- The wave of R51F
-- ____ ____________ ________ ____
-- | | | | | | |
-- | | | | | | |
-- | | | | | | | ....
-- | | | | | | |
-- |___________| |___| |___| |___
--
-- | | | | | | |
--(uS) | 4400 | 4400 |600| 1560 |600|480|
-- | | | | | | |
--
-- | | | |
-- | Start | "1" | "0" |
-- | | | |
--
-- Code : 48Bits
--
--
--
-------------------------------------------------
-- Optimize : RXD Filter
PROCESS( RESET, CLK, CountCLK, RXD )
BEGIN
IF( RESET='0' ) THEN
DataIN <= '1';
CountCLK <= (OTHERS=>'0');
ELSIF( RXD='0' ) THEN
IF( CLK'EVENT AND CLK='1' ) THEN
IF( CountCLK<"11" ) THEN CountCLK <= CountCLK + 1;
ELSE CountCLK <= "11"; DataIN <= '0';
END IF;
END IF;
ELSE
DataIN <= '1';
CountCLK <= (OTHERS=>'0');
END IF;
END PROCESS;
-------------------------------------------------
-- Bits Control
PROCESS( RESET, CLK, DataIN, Count, CountT, cnt48 )
BEGIN
IF( DataIN='1' ) THEN
CountT <= (OTHERS=>'0');
ELSE
IF( CLK'EVENT AND CLK='1' ) THEN CountT <= CountT + 1;
END IF;
END IF;
-----------------------------------------------
-- Stop
IF( RESET = '0' OR CountT=B"0000_0101" ) THEN
Count <= (OTHERS=>'0');
ELSIF( DataIN='1' ) THEN
IF( CLK'EVENT AND CLK='1' ) THEN
IF( Count<B"1111_0000" ) THEN Count <= Count + 1; -- 240
ELSE Count <= B"1111_1000"; -- 248
END IF;
IF( Count=B"1110_1010" ) THEN EOC <= '1';
ELSE EOC <= '0';
END IF;
END IF;
END IF;
-----------------------------------------------
-- Receive information
IF( RESET = '0' ) THEN
spdata <= (OTHERS=>'0');
cnt48 <= 47;
ELSIF( DataIN'EVENT AND DataIN='0' ) THEN
-- IF( (Count="00000000") OR (Count>"10100000") ) THEN -- Start 160
IF( Count>B"1010_0000" ) THEN -- Start 160
cnt48 <= 47;
ELSE
IF ( Count>B"0011_0010" ) THEN spdata(cnt48) <= '1'; -- 50 '1'
ELSIF( Count>B"0000_1100" ) THEN spdata(cnt48) <= '0'; -- 12 '0'
END IF;
cnt48 <= cnt48 - 1;
END IF;
END IF;
END PROCESS;
-------------------------------------------------
-------------------------------------------------
DATA3 <= spdata( 47 DOWNTO 40 );
DATA2 <= spdata( 31 DOWNTO 24 );
DATA1 <= spdata( 15 DOWNTO 8 );
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -