一、硬件电路设计
本文选用CPLD 是ALTERA 公司的EPM240T100,结合MAX232 接口芯片进行串口通信设计,框图如下图1 所示。
图1 CPLD串口通信模块硬件设计
二、VHDL程序模块设计及描述
使用VHDL 对CPLD 进行编程,设计3 个模块,波特率发生模块,接收器,发送器。
1. 波特率发生模块
波特率发生器实际是一个分频器,如前所述,本文设计的波特率为19.2kb/ 秒,设计使用的时钟频率为10MHz,所以计数器进行计数时计数到260进行翻转。
程序如下(关键部分保留,非必要部分用……代替):
……
ENTITY uart IS
GENERIC(d_len:INTEGER:=8);
PORT (
f10MHz:IN STD_LOGIC;-- 系统时钟
reset:IN STD_LOGIC;-- 复位信号
rxd:IN STD_LOGIC; -- 串行接收
txd:OUT STD_LOGIC;-- 串行发送
);
END uart;
ARCHITECTURE behav of uart IS
……
BEGIN
rxds<=rxd;
PROCESS(f10MHz,reset)
-- 设置波特率发生器 19200kb/s
VARIABLE clk19200hz: STD_LOGIC;
VARIABLE count:INTEGER RANGE 0 TO 260;
BEGIN
IF reset='0' THEN
count:=0;
clk19200hz:='0';
ELSIF f10MHz'EVENT AND f10MHz='1' THEN
IF count=260 THEN
count:=0;clk19200hz:= NOT clk19200hz;
ELSE
count:=count+1;
END IF;
END IF;
baud_rate<=clk19200hz;
END PROCESS;
发送部分采用状态机t_state 进行编程,共设两个值:t-start 和t_shift,分别表示发送开始以及发送保持状态。复位键按下时设置到t-start 状态,并将发送数据位设为“1”, 发送的数据位数计数为0,在t-start 状态,状态机将处于这一个状态并等待波特率计数信号的电平上升沿到来。上升沿到来时,依据t_state 状态的不同值做不同处理,如果是t-start 开始状态则先读待发送的数据,并发送开始位“0”,然后将状态转到发送保持t_shift 状态,在发送保持t_shift 状态,不断判断发送的数据位数是否满8 位,如果满了则回归t-start 状态,否则继续发送,保持在t_shift 状态,为避免干扰将其余情况下的状态自动跳转到t-start 状态。程序如下:
PROCESS(baud_rate,reset,data)
-- 数据发送部分
VARIABLE t_no:INTEGER RANGE 0 TO 8;
-- 发送的数据各位的位序号
作者:Spring 来源:电子发烧友网