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

📄 a8215.vhd

📁 通过用FPGA的 VDHL语言 来实现8251的异步功能
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY A8215 IS
PORT
(
 	ADDRESS:IN STD_LOGIC_VECTOR(8 DOWNTO 0);
  	CD:IN STD_LOGIC;
	DATA:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
	RESET,CLK:IN STD_LOGIC;
	WR,RD:IN STD_LOGIC;
	RXD:IN STD_LOGIC;
	RXRDY:OUT STD_LOGIC;
	RXC:IN STD_LOGIC;
	TXD:OUT STD_LOGIC;
	TXRDY:OUT STD_LOGIC;
	TXC:IN STD_LOGIC;
	RTS:OUT STD_LOGIC;
	CTS:IN STD_LOGIC
);
END A8215;

ARCHITECTURE TEST OF A8215 IS
SIGNAL TCOUNT,RCOUNT:INTEGER RANGE 0 TO 64;
SIGNAL SHIFTSTART:INTEGER RANGE 0 TO 11;
SIGNAL SENDBUFFER:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL READSIG: INTEGER RANGE 0 TO 8;
SIGNAL RECEIVEFLAG:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL RECEIVEBUFFER:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL BUSBUFFER:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL BUF_TXD,BUF_RTS,BUF_RXRDY,BUF_TXRDY:STD_LOGIC;
SIGNAL COMMAND5:STD_LOGIC;
SIGNAL CS,WRSTART,RDSTART:STD_LOGIC;
BEGIN
CHIP_SELECT:PROCESS
BEGIN
IF(ADDRESS="101000000")THEN
CS<='0';
ELSE
CS<='1';
END IF;
END PROCESS CHIP_SELECT;

CONTROL:PROCESS(RESET,CLK)
BEGIN
IF(RESET='1')THEN
BUSBUFFER<="00000000";
BUF_RXRDY<='0';
BUF_TXRDY<='0';
BUF_RTS<='1';
COMMAND5<='0';
WRSTART<='0';
RDSTART<='0';
ELSIF(RISING_EDGE(CLK))THEN
IF(WR='0' AND CS='0')THEN
CASE CD IS
 WHEN '0'=>BUSBUFFER<=DATA;
 WHEN '1'=>COMMAND5<=DATA(5);
 WHEN OTHERS=>NULL;
END CASE;
END IF;
IF(SHIFTSTART>0) THEN
BUF_TXRDY<='0';
ELSIF(SHIFTSTART=0 AND CTS='0' AND COMMAND5='1')THEN
BUF_TXRDY<='1';
END IF;
IF(WR='0' AND CD='1' AND CS='0' AND COMMAND5='1')THEN
WRSTART<='1';
ELSIF(SHIFTSTART>0)THEN
WRSTART<='0';
END IF;
IF(RECEIVEFLAG="10")THEN
BUF_RXRDY<='1';
ELSIF(RECEIVEFLAG="00")THEN
BUF_RXRDY<='0';
END IF;
IF(RD='0' AND CD='0')THEN
RDSTART<='1';
ELSIF(RECEIVEFLAG="00")THEN
RDSTART<='0';
END IF;
END IF;
RXRDY<=BUF_RXRDY;
TXRDY<=BUF_TXRDY;
RTS<=BUF_RTS;
END PROCESS CONTROL;

SHIFT:PROCESS(RESET,TXC)
BEGIN
IF(RESET='1')THEN
SENDBUFFER<="00000000";
SHIFTSTART<=0;
TCOUNT<=0;
BUF_TXD<='1';
ELSIF(FALLING_EDGE(TXC))THEN
IF(WRSTART='1' AND BUF_RTS='1')THEN
BUF_TXD<='0';
SENDBUFFER(0)<=BUSBUFFER(0);
SENDBUFFER(1)<=BUSBUFFER(1);
SENDBUFFER(2)<=BUSBUFFER(2);
SENDBUFFER(3)<=BUSBUFFER(3);
SENDBUFFER(4)<=BUSBUFFER(4);
SENDBUFFER(5)<=BUSBUFFER(5);
SENDBUFFER(6)<=BUSBUFFER(6);
SENDBUFFER(7)<=BUSBUFFER(7);
SENDBUFFER(8)<='1';
SENDBUFFER(9)<='1';
TCOUNT<=0;
SHIFTSTART<=11;
ELSIF(SHIFTSTART>0 AND BUF_RTS='1')THEN
IF(TCOUNT=15)THEN
BUF_TXD<=SENDBUFFER(0);
SENDBUFFER(0)<=SENDBUFFER(1);
SENDBUFFER(1)<=SENDBUFFER(2);
SENDBUFFER(2)<=SENDBUFFER(3);
SENDBUFFER(3)<=SENDBUFFER(4);
SENDBUFFER(4)<=SENDBUFFER(5);
SENDBUFFER(5)<=SENDBUFFER(6);
SENDBUFFER(6)<=SENDBUFFER(7);
SENDBUFFER(7)<=SENDBUFFER(8);
SENDBUFFER(8)<=SENDBUFFER(9);
SENDBUFFER(9)<='1';
SHIFTSTART<=SHIFTSTART-1;
TCOUNT<=0;
ELSE
TCOUNT<=TCOUNT+1;
END IF;
END IF;
END IF;
TXD<=BUF_TXD;
END PROCESS SHIFT;

RECEIVE:PROCESS(RXC,RESET)
BEGIN
IF(RESET='1')THEN
RECEIVEBUFFER<="00000000";
RECEIVEFLAG<="00";
RCOUNT<=0;
READSIG<=0;
ELSIF(RISING_EDGE(RXC))THEN
IF(RCOUNT=8)THEN
RCOUNT<=0;
RECEIVEFLAG<="01";
READSIG<=0;
ELSE RCOUNT<=RCOUNT+1;
END IF;
ELSIF(RECEIVEFLAG="01")THEN
IF(RCOUNT=15)THEN
RECEIVEBUFFER(0)<=RECEIVEBUFFER(1);
RECEIVEBUFFER(1)<=RECEIVEBUFFER(2);
RECEIVEBUFFER(2)<=RECEIVEBUFFER(3);
RECEIVEBUFFER(3)<=RECEIVEBUFFER(4);
RECEIVEBUFFER(4)<=RECEIVEBUFFER(5);
RECEIVEBUFFER(5)<=RECEIVEBUFFER(6);
RECEIVEBUFFER(6)<=RECEIVEBUFFER(7);
RECEIVEBUFFER(7)<=RXD;
RCOUNT<=0;
READSIG<=READSIG+1;
ELSIF(READSIG=8 AND RCOUNT=8)THEN
RECEIVEFLAG<="10";
ELSE RCOUNT<=RCOUNT+1;
END IF;
ELSIF(RECEIVEFLAG="10" AND RDSTART='1')THEN
RECEIVEFLAG<="00";
END IF;
END PROCESS RECEIVE;

READ: PROCESS(CS,RD)
BEGIN
IF(CS='0' AND RD='0')THEN
IF(CD='0')THEN
DATA<=RECEIVEBUFFER;
ELSIF(CD='1')THEN
DATA(0)<=BUF_TXRDY;
DATA(1)<=BUF_RXRDY;
DATA(2)<='0';
DATA(3)<='0';
DATA(4)<='0';
DATA(5)<='0';
DATA(6)<='0';
DATA(7)<='0';
END IF;
ELSE 
DATA<="ZZZZZZZZ";
END IF;
END PROCESS READ;

END TEST;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -