VHDL设计的串口通信程序设计的串口通信程序
本文给出一个VHDL设计的串口通信程序,感兴趣的朋友可以看看。
本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。程序
实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。串口的波特
律由程序中定义的p_par参数决定,更改该参数可以实现相应的波特率。程序当前设定的p_par 的值是0x104,对应的波特率
是9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通信同步。
程序的工作过程是:串口处于全双工工作状态,按动key2,CPLD向PC发送皐elcome"字符串(串口调试工具设成按ASCII码
接受方式);PC可随时向CPLD发送0-F的十六进制数据,CPLD接受后显示在7段数码管上。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY UART IS
PORT (
clk : IN std_logic;
rst : IN std_logic;
rxd : IN std_logic; 串行数据接收端
txd : OUT std_logic; 串行数据发送端
en : OUT std_logic_vector(7 downto 0); 数码管使能
seg_data : OUT std_logic_vector(7 DOWNTO 0); 数码管数据
key_input : IN std_logic 按键输入
);
END UART;
ARCHITECTURE arch OF UART IS
//////////////////inner reg////////////////////
SIGNAL p_reg : std_logic_vector(15 DOWNTO 0);分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟
SIGNAL p8_tras_reg : std_logic_vector(2 DOWNTO 0);该寄存器的计数值对应发送时当前位于的时隙数
SIGNAL p8_rec_reg : std_logic_vector(2 DOWNTO 0); 寄存器的计数值对应接收时当前位于的时隙数
SIGNAL state_tras : std_logic_vector(3 DOWNTO 0); 发送状态寄存器
SIGNAL state_rec : std_logic_vector(3 DOWNTO 0); 接受状态寄存器
SIGNAL clkbaud_tras : std_logic; 以波特率为频率的发送使能信号
SIGNAL clkbaud_rec : std_logic; 以波特率为频率的接受使能信号
SIGNAL clkbaud8x : std_logic; 以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙
SIGNAL recstart : std_logic; 开始发送标志
SIGNAL recstart_tmp : std_logic; 开始接受标志
SIGNAL trasstart : std_logic;
SIGNAL rxd_reg1 : std_logic; 接收寄存器1
SIGNAL rxd_reg2 : std_logic; 接收寄存器2,因为接收数据为异步信号,故用两级缓存