自己写了个VHDL串口驱动的代码,仿真好好地,上了板子怎么都不行
请问有没有大佬解答一下到底是哪里出了问题
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity RX2 is
port(clk : in std_logic; --系统时钟
EN: in std_logic; --复位信号
RX: in std_logic; --RS232接收数据信号;
RX_STATE: BUFFER STD_LOGIC;--接受的RX状态,从起始位开始置1,停止位之后置零
TX_STATE:buffer STD_LOGIC;
RX_DATA: BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
TX: OUT STD_LOGIC
);
end RX2;
architecture behav of RX2 is
shared VARIABLE A:INTEGER:=0;
--读入的数据存储的位置
SIGNAL RX_DATA_r: STD_LOGIC_VECTOR(7 DOWNTO 0);--读入的数据
SIGNAL RX_START: STD_LOGIC;--读入时开始生成波特时?
SIGNAL BAUDRX : STD_LOGIC;--输入用波特时?
SIGNAL BAUDTX: STD_LOGIC;
BEGIN
--RX--
PROCESS(clk,BAUDRX)
variable cnt1:integer:=0;
VARIABLE cnt2:integer:=0;
BEGIN
IF (EN='0') THEN--使能端
cnt1:=0;
ELSE
IF (rising_edge(clk)) THEN
IF (RX='0') THEN--判断RX出现的是否为特定时长的低电平
cnt1:=cnt1+1;RX_STATE<='1';
else cnt1:=0;
end if;
IF (cnt1=5208) THEN--当是特定时长低电平时
RX_START<='1';--开始生成波特时钟,此时波特时钟的上升沿刚好为周期的一半
cnt1:=0;
END IF;
IF (RX_START='1') THEN
IF (cnt2=5208) THEN--波特率为9600
cnt2:=0;
BAUDRX<=NOT(BAUDRX);
IF (A=0) THEN
RX_START<='0';
RX_STATE<='0';
END IF;
ELSE cnt2:=cnt2+1;
END IF;
IF (cnt2=2604) THEN
BAUDRX<=NOT(BAUDRX);
END IF;
ELSE BAUDRX<='0';
end if;
END IF;
END IF;
END PROCESS;
process (RX_START)
BEGIN
IF (EN='0') THEN--使能端
A:=0;
ELSE
IF(rising_edge(BAUDRX)) THEN
IF (RX_START='1') THEN
IF (A<9) THEN
RX_DATA_r(A)<=RX;
A:=A+1;
END IF;
IF (A=9) THEN
RX_DATA<=RX_DATA_r;--将RX_DATA_R的数据锁存到RX_DATA中?
RX_DATA_r<="00000000";
A:=0;
END IF;
END IF;
END IF;
END IF;
end process;
----TX---
PROCESS(BAUDTX)
VARIABLE CNT:INTEGER:=0;
VARIABLE CNT1:INTEGER:=0;
VARIABLE B:INTEGER:=0;
BEGIN
IF(EN='0')THEN
TX_STATE<='0';
ELSE
IF(RISING_EDGE(CLK))THEN
IF(TX_STATE='0')THEN
TX<='1';
END IF;
IF(RX_STATE='1')THEN
IF(CNT=52080)THEN
CNT:=0;
TX_STATE<='1';
TX<='0';
ELSE CNT:=CNT+1;
END IF;
ELSIF(RX_STATE='0')THEN
CNT:=0;
END IF;
IF(TX_STATE='1')THEN
IF(CNT1=5208)THEN
CNT1:=0;
BAUDTX<=NOT(BAUDTX);
IF(B<8)THEN
TX<=RX_DATA(B);
B:=B+1;
ELSIF(B=8)THEN
TX<='1';
B:=B+1;
ELSIF(B=9)THEN
TX_STATE<='0';
B:=0;
END IF;
ELSE CNT1:=CNT1+1;
END IF;
IF(CNT1=2604)THEN
BAUDTX<=NOT(BAUDTX);
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END architecture;