来自「CPLD的小程序集合」· 代码 · 共 108 行
TXT
108 行
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- 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 UART IS
PORT
(
RESET: IN STD_LOGIC;
CLK: IN STD_LOGIC;
RXD: IN STD_LOGIC;
EOC: OUT STD_LOGIC;
PDATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
TXD: OUT STD_LOGIC
);
END UART;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF UART IS
SIGNAL spdata: STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL TT: STD_LOGIC;
SIGNAL cnt8: integer range 0 to 10;
SIGNAL Start : STD_LOGIC;
SIGNAL Count : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
-------------------------------------------------
-- BITS
PROCESS( RESET, CLK, RXD, Start, Count, cnt8, TT )
BEGIN
-----------------------------------------------
--
IF( RESET = '0' )THEN
Count <= "0000";
ELSIF( Start='1' ) THEN
IF( CLK'EVENT AND CLK='1' ) THEN Count <= Count + 1;
END IF;
ELSE Count <= "0000";
END IF;
-----------------------------------------------
TT <= Count(2); -- Count(3) : 4800
-- Count(2) : 9600
-- Count(1) : 19200
-- Count(0) : 38400
-----------------------------------------------
-- End of recevie
IF( cnt8>8 ) THEN EOC <= '1';
ELSE EOC <= '0';
END IF;
END PROCESS;
-------------------------------------------------
-- Start
StartRun: PROCESS( RESET, RXD, TT, cnt8, Start )
BEGIN
-----------------------------------------------
--
IF( RESET = '0' ) THEN Start <= '0';
ELSIF( cnt8=0 ) THEN
IF( RXD'EVENT AND RXD='0' ) THEN Start <= '1';
END IF;
ELSIF( cnt8>9 AND TT='0' ) THEN Start <= '0';
END IF;
END PROCESS;
-------------------------------------------------
-- Recevie
Recevie: PROCESS( RESET, Start, TT, RXD, cnt8 )
BEGIN
-----------------------------------------------
-- Receive data
IF( RESET = '0' )THEN
spdata <= "00000000000";
ELSIF( TT'EVENT AND TT='1' ) THEN
spdata(cnt8) <= RXD;
END IF;
IF( RESET = '0' OR Start='0' ) THEN cnt8 <= 0;
ELSIF( Start='1' ) THEN
IF( TT'EVENT AND TT='1' ) THEN cnt8 <= cnt8 + 1;
END IF;
END IF;
END PROCESS;
-------------------------------------------------
-------------------------------------------------
PDATA <= spdata( 8 downto 1 );
TXD <= RXD;
END Behavioral;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?