CreatrUW00 2018-06-26 16:03 采纳率: 0%
浏览 612
已结题

急~关于VHDL串口驱动的问题

图片说明自己写了个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;

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-06-26 16:06
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突