CPLD的串口通信设计

一、硬件电路设计
本文选用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;
#p#发送模块e#2. 发送模块
发送部分采用状态机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;
-- 发送的数据各位的位序号
variable txds:std_logic;
variable dtmp:std_logic_vector(7
downto 0);
begin
if reset='0' then
t_state
dtmp:=data;
txds:='0'; -- 发送开始
t_state if t_no=d_len then
txds:='1'; -- 发送结束
t_no:=0;
t_statet_state<=t_start;
end case;
end if;
txd<=txds;
end process;
3. 数据接收模块
接收部分采用状态机进行编程,共设两个状态:
r-start 和r_shift 分别表示接收开始以及接收保持状态;复位键按下时设置到r-start 状态,并将待接收存放数据的data 赋值为“00000000”, 在r-start状态,接收状态机将处于这一个状态并等待波特率计数信号的电平上升沿到来。波特率发生模块的计数上升沿到来,依据状态的不同值做不同处理,如果是r-start 接收开始状态则等待开始位信号,检测到rxds=‘0’的开始位信号好转到r_shift 接收保持状态,r_shift 接收保持状态会不断判断接收的数据位数是否满8 位,如果满了则回归r-start 状态,否则继续接收,保持在r_shift 接收保持状态,为避免干扰将其余情况下的状态自动跳转到r-start 接收开始状态,程序与发送部分类似,此处省略。
三、串口通信的vhdl程序仿真结果
串行口通信的仿真结果如图2 所示。从图中可以看出,每发送完一个字节,即8 位数据后,线路上将输出一个高电平,之后又开始传送下一个字节。
同样,仿真波形显示,有效数据到达接收管脚rxd之前,线路上保持为高电平,直到收到一个低电平起始位,将该起始位后的8 位数据串行接收后依次送到保存接收结果的信号data 的各位。
图2 串行口通信仿真波形图
串口通信的硬件验证
将程序通过在系统编程下载入配套的cpld 电路板进行硬件验证,按照以下步骤进行。
(1)确定管脚对应关系:
串行接收管脚rxd 与max232 的12 脚r1out对应; 串行发送管脚txd 与max232 的11 脚t1in对应;复位信号reset 与按键s1 对应。
(2)由quartus ii 进行管脚分配:
f10mhz 在maxii 芯片上对应的管脚号为12 ;s1 在maxii 芯片上对应的管脚号为21 ; rxd 在maxii 芯片上对应的管脚号为89; txd 在maxii 芯片上对应的管脚号为90。
(3)电平定义:
按键s1 按下时表示输入信号为低电平。
应用“ 串口调试助手” 进行验证, 在发送窗口随机输入需要发送的字符,可以发现由pc 机发给cpld 的字符被cpld 传送回来并在接收窗口显示出来。在批量随机数据发送后分析:在传输时19.2kb/s 传输速率下,误码率达10-8。

夺得多项第一!问界M7冬测成绩大翻身?低温仍是纯电车的痛
云和数据促创新 中兴通讯GoldenDB亮相2020数据技术嘉年华
智能手机外观趋势:从华为P10、小米6、魅蓝E2衍生话题!
目前出现人工智能专业人才紧缺现状,人才培养体系出炉
Adam Taylor玩转MicroZed系列69:关于Zynq的约束简介
CPLD的串口通信设计
接在220V交流电的指示灯,串联多大的电阻都会烧?
Python应用与优化所必备的6个基本库
MAX1562, MAX1562H, MAX1563应用电路
蓄电池正确使用方法_蓄电池如何进行维护
华为品牌价值位列全球第40名 中国手机向高端市场发起进攻
三防漆自动涂覆工艺的常见问题及解决方法
工信部出台PCB新规 将于2月1日起开始施行
智能网络必须针对任务关键型环境而发展
中芯国际与台积电的差距在哪
CES Asia首日:凯迪拉克超级智能驾驶系统上海发布,各大车企争奇斗艳!
台媒:联发科5G芯片打入三星供应链
受MLCC涨价影响,MOSFET芯片厂商也涨了
《自动化学报》—多Agent深度强化学习综述
Zhaoke(兆科)VGA矩阵常见故障及维护方法