FPGA串口通信汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA实验报告
目录
FPGA实验报告 (1)
目录 (1)
基于VHDL的串口通信实现设计 (3)
摘要 (3)
正文 (3)
1.研究背景知识 (3)
1.1串口简介 (3)
1.2串口通信参数 (3)
2.系统整体设计 (5)
2.1 系统框图 (5)
2.2原理图 (5)
2.3管脚介绍: (6)
3. 系统模块设计 (6)
3.1分频模块 (6)
3.11流程图 (6)
3.12程序 (7)
3.2接收模块 (8)
3.21流程图 (8)
3.22程序 (9)
3.3发送模块 (10)
3.31流程图 (10)
3.32程序 (11)
4. 系统调试 (12)
4.1 时序调试 (12)
4.2硬件调试 (13)
5.总结 (14)
基于VHDL的串口通信实现设计
摘要
串口是计算机上一种非常通用设备通信的协议,其特点是通信线路简单,成本低,特别适用于远距离通信,因此有较为广泛的应用。为了深入了解串口,本课程设计基于VHDL语言,利用FPGA开发板实现了板间串口通信。在程序设计中,考虑到串口波特率、数据格式等参数,共采用了四个模块:分频模块(即波特率产生模块),接受模块,发送模块,显示模块。通过软件和开发板调试,实现了板和串口调试助手收发数据,软件改变波特率等参数,并在数码管显示的功能。
关键词:串口VHDL FPGA 分频接收发送显示
正文
1.研究背景知识
1.1串口简介
串行接口Serial Interface是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式。
1.2串口通信参数
双方为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置:
1.数据的传输速率
传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位
到底代表几个位就不得而知了,要使得双方的数据读取正常,就要考虑到传输速率——波特率,其所代表的意义是每秒钟所能产生的最大电压状态改变率,或者说是每秒钟可以振荡的次数。
2.数据的发送单位
一般串行通信端口所发送的数据是字符类型的,若用来传输文件,则会使用二进制的数据类型。当使用字符类型时,通常使用ASCII码,ASCII码中8个位形成一个字符。以实际的RS-232传输来看,由于大多数应用只是发送文字码,因此只要7个位就可以将ASCII码的0-127号字符表达出来,所有的可见字符都在这个范围内,所以只要7个数据位就足够了。不同的情况下,会使用到不同的发送单位,但使用多少个位合成一个字节必须先行确定。
3.起始位及停止位
由于异步串行通信中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的发送,而当发送端准备要开始发送数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位。当发送端要开始发送数据时,便将传输在线的电位由低电位提升至高电位,而当发送结束后,再将电位降至低电位。接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据,并因停止位的通知(因电压维持在低电位)而确切数据的字符信号已经结束。
4.校验位的检查
为了预防错误的产生,因此使用校验位作为检查的机制;校验位是用来检查所发送数据正确性的一种核对码,其中又分成奇校验位和偶校验位两种方式,分别是检查字符码中I的数目是奇数或偶数。以偶校验位为例,A的ASCII码01100001 (二进制),其中1的数目是三个,因此校验位便是1,使1的数目保持偶数。
2.系统整体设计 2.1 系统框图
2.2原理图
分频 模块
波特率选择, 收发控制
发送 模块
接收 模块
数码管 显示
2.3管脚介绍:
3. 系统模块设计 3.1分频模块
通过本模块要产生8×波特率的时钟,FPGA 开发板时钟振荡频率为50MHZ ,因此要产生9600*8的时钟,分频数为50M/9600/8=325*2,本程序以9600波特率为例,展开分频。其余波特率依例可以选择产生。
3.11流程图
功能 管脚 输入/输出 功能
RST 输入 复位,初始化 CLK 输入 时钟 RXD 输入 串行收引脚 SK_RP 输入 高电平为接收数据 低电平为发送数据 BAUD8X 输出 波特率*8 TXD 输出 串行发引脚 SEG_EN 输出 数码管位选择 SEG_DATA
输出
数码管段选择
3.12程序
PROCESS(clk,rst) --分频得到8倍波特率的时钟 BEGIN
SEG_EN<="11111110" ; IF ( rst = '1') THEN
DIV_BUF <= '0';
div_REG<= "0000000000000000" ; ELSIF(clk'EVENT AND clk='1')THEN
IF (div_reg = div_par - "0000000000000001") THEN--//FEN PIN SHU YI BAN QU FAN
DIV_BUF<= NOT DIV_BUF ; --产生时钟脉冲 DIV_REG<="0000000000000000" ; ELSE
开始
DIV_PAR 为分频数的一半,DIV_REG 分频计数器清零;DIV_BUF 时钟信号清零
DIV_BUF 赋值给BAUD8X ,DIV_BUF 为波特率*8
DIV_BUF 取反,时钟信号产生;DIV_REG 分频计数器清零
结束
DIV_REG=分频数一半
时钟上升
DIV_REG 计数
1
1