实验四串口接收模块电路设计
- 格式:doc
- 大小:169.00 KB
- 文档页数:5
数字逻辑与处理器基础实验串口收发器设计实验报告姓名:学号:2012011250班级:无21组号:S2目录实验十:串口收发器设计 (3)一、实验目的 (3)二、实验内容 (3)(一) 设计方案 (3)1. 串口基本原理 (3)2. 实验设计原理 (3)3. 模块介绍 (4)(二) 关键代码 (4)(三) 仿真波形 (8)(四) 综合结果 (8)1. 综合电路图 (8)2. 综合情况 (9)3. 硬件调试情况 (11)三、实验总结 (11)实验十:串口收发器设计一、实验目的了解和掌握UART的工作原理二、实验内容(一)设计方案1.串口基本原理图1串口时序示意图图1表明在异步传送中串行发送一个数据字节的位定时关系(图中没有包括奇偶校验位)。
发送一个完整的字节信息,首先是一个作为起始位的逻辑“0”位,接着是8个数据位,然后是1个、1+1/2个或2个停止位逻辑“1”位,数据线空闲时呈现为高或“1”状态。
在字符的8位数据部分,先发送数据的最低位,最后发送最高位。
每位持续的时间是固定的,由发送器本地时钟控制,每秒发送的数据位个数,即为“波特率”。
起始位和停止位起着很重要的作用。
显然,他们标志每个字符的开始和结束,但更重要的是他们使接收器能把局部时钟与每个新开始接收的字符再同步。
异步通信没有可参照的时钟信号,发送器随时都可能发送数据,需要从任何边沿的出现时刻开始正确地采样紧接着的 10~11位(包括开始位、数据位和停止位)。
接收器的时钟与发送器的时钟不是同一个,因此,接收器采样点的间隔跟由发送器时钟所确定的位间隔时间不同,接收器设计不好会导致采样错误。
2.实验设计原理协议提取接收到的数据并发送给控制器。
每当串口接收器收到一个完整的数据,在RX_STATUS 上输出一个高电平指示脉冲,并同时在RX_DATA 上输出接收到的有效数据,RX_DATA 上的接收数据一致有效到下一个RX_STATUS 脉冲位置。
由于串行数据帧与接收时钟是异步的,所以接收器功能实现中的关键是接收器时钟与每个接收字符的同步。
串口实验实验报告串口实验报告一、引言串口是一种常见的数据传输接口,广泛应用于电子设备之间的数据通信。
本次实验旨在通过串口通信实验,深入了解串口的工作原理和使用方法,并实现简单的数据传输。
二、实验目的1. 理解串口通信的基本原理;2. 掌握串口通信的硬件连接方式;3. 学会使用串口通信协议进行数据传输;4. 实现简单的串口通信程序。
三、实验器材1. 一台个人电脑;2. 一块开发板;3. 一条串口数据线。
四、实验步骤1. 将开发板与个人电脑通过串口数据线连接起来;2. 打开串口通信软件,并进行相应的设置;3. 在开发板上编写程序,实现数据的发送和接收;4. 在个人电脑上编写程序,实现数据的接收和显示;5. 进行数据传输实验,观察数据是否能正常传输。
五、实验结果与分析经过实验,我们成功地实现了串口通信,并能够正常地进行数据传输。
通过观察数据接收端的显示,我们可以清晰地看到发送端发送的数据被准确地接收并显示出来。
这说明我们的串口通信实验是成功的。
六、实验总结通过本次实验,我们深入了解了串口通信的原理和使用方法,并成功地实现了串口通信的数据传输。
串口通信在电子设备之间的数据传输中有着广泛的应用,掌握串口通信技术对于我们的学习和工作都具有重要的意义。
七、参考文献[1] XXXX. 串口通信原理与应用[M]. 电子工业出版社, 2010.八、致谢感谢实验中给予我们帮助和指导的老师和同学们,没有你们的支持,我们无法顺利完成本次实验。
九、附录实验中使用的程序代码如下:发送端代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>int main(){HANDLE hSerial;DCB dcbSerialParams = { 0 };COMMTIMEOUTS timeouts = { 0 };// 打开串口hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE){printf("无法打开串口\n");return 1;}// 配置串口参数dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)) {printf("无法获取串口参数\n");return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;if (!SetCommState(hSerial, &dcbSerialParams)) {printf("无法设置串口参数\n");return 1;}// 设置串口超时时间timeouts.ReadIntervalTimeout = 50;timeouts.ReadTotalTimeoutConstant = 50;timeouts.ReadTotalTimeoutMultiplier = 10;timeouts.WriteTotalTimeoutConstant = 50;timeouts.WriteTotalTimeoutMultiplier = 10;if (!SetCommTimeouts(hSerial, &timeouts)){printf("无法设置串口超时时间\n");return 1;}// 发送数据char data[] = "Hello, Serial!";DWORD bytesWritten;if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)){printf("无法发送数据\n");return 1;}// 关闭串口CloseHandle(hSerial);return 0;}```接收端代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>int main(){HANDLE hSerial;DCB dcbSerialParams = { 0 };COMMTIMEOUTS timeouts = { 0 };// 打开串口hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE){printf("无法打开串口\n");return 1;}// 配置串口参数dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)){printf("无法获取串口参数\n");return 1;}dcbSerialParams.BaudRate = CBR_9600;dcbSerialParams.ByteSize = 8;dcbSerialParams.StopBits = ONESTOPBIT;dcbSerialParams.Parity = NOPARITY;if (!SetCommState(hSerial, &dcbSerialParams)) {printf("无法设置串口参数\n");return 1;}// 设置串口超时时间timeouts.ReadIntervalTimeout = 50;timeouts.ReadTotalTimeoutConstant = 50;timeouts.ReadTotalTimeoutMultiplier = 10;timeouts.WriteTotalTimeoutConstant = 50;timeouts.WriteTotalTimeoutMultiplier = 10;if (!SetCommTimeouts(hSerial, &timeouts)){printf("无法设置串口超时时间\n");return 1;}// 接收数据char data[100];DWORD bytesRead;if (!ReadFile(hSerial, data, sizeof(data), &bytesRead, NULL)){printf("无法接收数据\n");return 1;}// 显示接收到的数据printf("接收到的数据:%s\n", data);// 关闭串口CloseHandle(hSerial);return 0;}```十、联系方式作者:XXXEmail:XXX。
嵌入式串口接受数据实验课题研究目的和内容
嵌入式串口接收数据实验课题的研究目的是探索嵌入式系统中串口通信的原理和应用,培养学生对嵌入式系统的开发能力和问题解决能力。
具体的研究内容可以包括以下方面:
1. 串口通信原理:学习串口通信的工作原理、通信协议等基础知识。
2. 嵌入式串口编程:学习使用合适的编程语言和开发工具,实现嵌入式系统的串口接收功能。
3. 数据接收与解析:学习如何接收串口发送的数据,并对数据进行解析和处理,包括数据格式转换、数据校验等。
4. 数据存储与显示:学习将接收到的数据进行存储和显示,可以使用内部存储器、外部存储卡或者其他存储设备。
5. 串口参数配置:学习如何配置串口的波特率、数据位数、校验位、停止位等参数,以满足不同应用的需求。
6. 错误处理与调试:学习如何处理串口通信中可能出现的错误,同时熟悉使用调试工具和技巧进行故障排查。
一、实验目的1. 理解串行通讯的基本原理和通信方式。
2. 掌握串行通讯的硬件设备和软件实现方法。
3. 学会使用串行通讯进行数据传输。
4. 通过实验,提高动手能力和分析问题、解决问题的能力。
二、实验原理串行通讯是指用一条数据传输线将数据一位一位地按顺序传送的通信方式。
与并行通讯相比,串行通讯具有线路简单、成本低等优点。
串行通讯的基本原理如下:1. 异步串行通讯:每个字符独立发送,字符间有时间间隔,不需要同步信号。
每个字符由起始位、数据位、奇偶校验位和停止位组成。
2. 同步串行通讯:数据块作为一个整体发送,需要同步信号。
同步串行通讯分为两种方式:面向字符方式和面向比特方式。
三、实验设备1. 计算机:一台2. 串行通讯设备:串行数据线、串行接口卡、串口调试助手等3. 单片机实验平台:一台4. 数码管显示模块:一个四、实验内容1. 异步串行通讯实验(1)硬件连接:将计算机的串口与单片机实验平台的串行接口连接。
(2)软件设计:编写程序,实现单片机向计算机发送数据,计算机接收数据并显示在屏幕上。
(3)实验步骤:a. 设置串行通信参数:波特率、数据位、停止位、奇偶校验位等。
b. 编写发送程序,实现单片机向计算机发送数据。
c. 编写接收程序,实现计算机接收数据并显示在屏幕上。
2. 同步串行通讯实验(1)硬件连接:与异步串行通讯实验相同。
(2)软件设计:编写程序,实现单片机向计算机发送数据块,计算机接收数据块并显示在屏幕上。
(3)实验步骤:a. 设置串行通信参数:波特率、数据位、停止位、奇偶校验位等。
b. 编写发送程序,实现单片机向计算机发送数据块。
c. 编写接收程序,实现计算机接收数据块并显示在屏幕上。
3. 双机通讯实验(1)硬件连接:将两台单片机实验平台通过串行数据线连接。
(2)软件设计:编写程序,实现两台单片机之间相互发送和接收数据。
(3)实验步骤:a. 设置串行通信参数:波特率、数据位、停止位、奇偶校验位等。
目录串口接收模块的verilog设计 (1)1现场可编程门阵列FPGA (2)2 Verilog HDL简介 (3)3串行通信系统 (3)3.1串行通信概念 (4)3.3 RS-232总线 (5)3.3.1 RS-232接口特性 (5)3.3串行通信接口组成 (6)3.4 通信协议 (7)3.5系统整体结构 (8)4 UART简介 (9)4.1 接收模块功能设计描述 (11)4.2波特率模块 (16)4.3验证 (17)5总结体会 (18)参考文献 (19)串口接收模块的verilog设计摘要:UART(即Universal Asynchronous Receiver Transmitter)是数据通信及控制中广泛使用的一种全双工串行数据传输协议。
本设计基于 FPGA器件实现对UART的波特率产生器、UART发送器和接收器及其整合电路的模块化设计,采用Verilog HDL语言对三个功能模块进行硬件描述。
通过串口调试助手进行验证,其结果完全符合UART协议的要求和预期的结果。
关键词:UART FPGA Verilog HDL 验证1现场可编程门阵列FPGA20世纪80年代中期,FPGA刚出现时,大部分用来实现粘合逻辑、中等复杂度的状态机和相对有限的数据处理任务。
在20世纪90年代早期,FPGA的规模和复杂度开始增加,那时它们的主要场所在通信和网络领域。
到了20世纪90年代末,FPGA在消费、汽车和工业领域的应用经历了爆炸式增长。
21世纪早期,已经可以买到数百万容量的高性能FPGA。
今天FPGA几乎可以用来实现任何东西,包括通信设备和软件定义无线电,雷达、影像和其它数字信号处理的应用,直至包含硬件和软件的片上系统。
FPGA(field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路出现的,既解决了制定电路的不足,又克服了原有可编程器件门电路数有限的缺点。
关于串口的实验报告1. 实验目的本实验的目的是通过学习并实践串口通信的基本原理和方法,加深对串口通信的理解,掌握串口通信的使用技巧和开发工具。
同时,了解串口通信在实际应用中的重要性和应用场景。
2. 实验原理串口是一种用于计算机与外部设备之间进行数据通信的接口标准。
在计算机中,串口通常通过RS-232或RS-485等标准来实现。
串口通信采用的是异步通信方式,即接收方和发送方的时钟不同步,通过发送和接收的数据包中的控制信息来实现数据的传输。
串口通信的基本原理如下:- 串口通信通过一个物理接口连接计算机和外部设备。
- 通信数据被分为一个个字节进行传输,每个字节由一定的控制信息和实际数据组成。
- 发送方通过发送字节的方式将数据发送给接收方。
- 接收方通过接收字节的方式将数据接收并进行处理。
3. 实验步骤步骤一:准备实验环境为了进行串口通信的实验,我们需要准备以下工具和设备:- 一台计算机- 一个串口转USB转换器- 一个外部设备(如Arduino、传感器等)步骤二:安装串口驱动程序在开始实验之前,我们需要安装串口转USB转换器所需的驱动程序。
驱动程序的安装方式因不同的设备而有所差异,一般可以通过官方网站下载并按照说明进行安装。
步骤三:编写串口通信程序根据所使用的编程语言和开发工具,编写一个简单的串口通信程序。
该程序应包括以下功能:- 打开指定的串口端口- 配置串口的波特率、数据位、停止位等参数- 循环读取串口接收缓冲区中的数据,并进行处理- 将需要发送的数据写入串口发送缓冲区步骤四:测试串口通信将串口转USB转换器插入计算机,并将外部设备连接至串口转USB转换器。
运行编写好的串口通信程序,并观察实验结果。
测试串口通信的方法可以有很多,可以通过发送和接收数据包来验证通信是否正常。
步骤五:总结与分析根据实验结果,总结并分析串口通信的性能和应用场景。
可以考虑以下问题:- 串口通信在哪些领域得到了广泛应用?- 串口通信有哪些特点和优势?- 在实际应用中,串口通信可能遇到哪些常见问题,如何解决?4. 实验结论通过本实验,我们了解了串口通信的基本原理和实际应用方法。
串口通讯电路pcb课程设计一、课程目标知识目标:1. 学生理解串口通讯的基本原理,掌握相关的电子元件及其功能。
2. 学生能够描述PCB(印刷电路板)设计的基本流程,并运用相关知识设计串口通讯电路。
3. 学生掌握串口通讯协议,了解数据传输的方式及其特点。
技能目标:1. 学生能够运用所学知识,设计并绘制串口通讯电路的PCB图。
2. 学生通过实际操作,提高动手能力,培养问题解决和团队协作能力。
3. 学生学会使用相关软件(如Altium Designer等)进行PCB设计,并完成电路板制作。
情感态度价值观目标:1. 学生培养对电子技术领域的兴趣,提高对科技创新的热情。
2. 学生认识到团队合作的重要性,增强团队协作精神。
3. 学生树立正确的价值观,认识到学习科学技术对国家和社会发展的意义。
课程性质:本课程为实践性较强的课程,结合理论知识,注重培养学生的实际操作能力和创新能力。
学生特点:学生处于高年级阶段,具备一定的电子技术基础和动手能力,对新鲜事物充满好奇心。
教学要求:教师需引导学生将理论知识与实际操作相结合,注重培养学生的创新思维和团队协作能力,提高学生的实践操作水平。
通过课程学习,使学生能够独立完成串口通讯电路的PCB设计。
二、教学内容1. 理论知识:- 串口通讯原理及其协议介绍,包括数据格式、波特率、校验等。
- 电子元件基本知识,如电阻、电容、二极管、晶体管等。
- PCB设计基础,包括设计流程、布线原则、层叠结构等。
2. 实践操作:- 使用相关软件(如Altium Designer)进行串口通讯电路的原理图绘制。
- 根据原理图进行PCB布局、布线设计,并生成制造文件。
- 电路板制作过程演示,如打印、腐蚀、钻孔等。
3. 教学大纲:- 第一周:串口通讯原理学习,电子元件知识回顾。
- 第二周:PCB设计基础知识学习,设计流程介绍。
- 第三周:原理图绘制实践,团队协作完成电路设计。
- 第四周:PCB布局、布线设计,并进行审查修改。
串行通信实验报告实验报告:串行通信实验一、实验目的本实验旨在通过搭建串行通信系统,了解串行通信的基本原理和工作方式,掌握串行通信的相关知识和技术。
二、实验仪器和材料1. Arduino开发板B数据线3.跳线若干4.电脑三、实验原理串行通信是一种通过连续的、位的形式传输数据的通信方式。
在串行通信中,数据通过一个数据线一位一位地传输,与并行通信相比,串行通信的线路数量较少,适用于数据传输距离较远的场景。
在本实验中,我们使用Arduino开发板作为串行通信的发送和接收端,通过USB数据线连接电脑与Arduino开发板进行数据交互。
四、实验步骤1. 连接电路:将Arduino开发板通过USB数据线连接至电脑,确保连接稳定。
2. 编写Arduino代码:使用Arduino IDE软件编写Arduino代码,实现数据发送和接收的功能。
代码示例://发送端void setuSerial.begin(9600); //设置串行通信波特率为9600void looString message = "Hello World!"; //待发送的消息Serial.println(message); //通过串行通信发送消息delay(2000); //延迟2秒//接收端void setuSerial.begin(9600); //设置串行通信波特率为9600void looif (Serial.available() { //如果串行通信接收到数据String message = Serial.readString(; //读取接收到的数据Serial.println("Received: " + message); //打印接收到的数据}3. 上传代码:将编写好的代码上传至Arduino开发板,使其开始工作。
4. 打开串行监视器:在Arduino IDE中点击“工具”菜单并选择“串行监视器”(或使用快捷键Ctrl+Shift+M)打开串行监视器。
课程设计报告课程EDA技术与应用题目UART串口数据接收器院系物理与电子工程学院年级专业电子信息工程班级3班学号学生姓名指导教师设计时间2010.12摘要UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是广泛使用的串行数据传输协议。
UART允许在串行链路上进行全双工的通信。
通过应用EDA技术,基于CPLD/ FPGA器件设计与实现UART的波特率产生器、UART发送器和接收器及其整合电路,目的是熟练运用VHDL 语言,掌握FPGA芯片的使用。
波特率发生器、接收器和发送器是UART的三个核心功能模块,利用VHDL语言对这三个功能模块进行描述并加以整合,通过MaxPlusII仿真,用C++编写串口调试程序进行验证,其结果完全符合UART协议的要求和预期的结果。
关键词:UART;串行通讯;VHDL语言;CPLD;仿真目录第一章课题概述- 3 -1.1课题背景- 3 -1.2 课题目的与意义- 3 -第二章相关理论与技术- 4 -2.1 UART相关内容简介- 4 -2.1.1复杂可编程逻辑器件FPGA简介- 4-2.1.2 RS-232介绍- 4 -2.1.3 VHDL简介- 5 -2.2 UART协议介绍- 6 -2.3硬件结构设计- 7 -2.4软件设计- 7 -2.5开发板介绍- 8 -第三章课题详细设计与实现- 9 -3.1 UART的整体设计- 9 -3.2 波特率发生器- 11 -3.2.1波特率介绍- 11 -3.2.2波特率的分频计算- 11 -3.3 接收模块设计- 12 -3.3.1接收模块原理- 12 -3.3.2接收模块仿真图- 12 -3.4 串口调试软件- 13 -3.5功能测试- 14 -总结- 16 -参考文献- 18 -第一章课题概述1.1 课题背景UART协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议。
串口通讯实验报告串口通讯实验报告一、引言串口通讯是计算机与外部设备进行数据交互的一种重要方式。
在本次实验中,我们通过使用串口通讯实现了计算机与单片机之间的数据传输,探索了串口通讯的原理和应用。
二、实验目的本次实验的目的是通过串口通讯实现计算机与单片机之间的数据传输,并观察数据的传输过程和结果。
通过这个实验,我们可以更好地理解串口通讯的工作原理,并掌握串口通讯的基本操作方法。
三、实验原理串口通讯是通过串行传输方式实现数据传输的。
在计算机和外部设备之间,数据通过串行的方式进行传输,即逐位地进行传送。
串口通讯的原理主要包括波特率、数据位、停止位和校验位等参数的设置。
四、实验步骤1. 准备工作:连接计算机和单片机,确保串口线连接正确。
2. 设置串口参数:打开计算机的串口设置工具,设置波特率、数据位、停止位和校验位等参数。
3. 单片机编程:编写单片机程序,设置串口通讯的相关参数,并实现数据的接收和发送功能。
4. 计算机编程:编写计算机程序,通过串口通讯接收单片机发送的数据,并进行相应的处理和显示。
5. 实验验证:运行单片机程序和计算机程序,观察数据的传输过程和结果,验证串口通讯的正确性。
五、实验结果与分析经过实验,我们成功地实现了计算机与单片机之间的数据传输。
通过串口通讯,我们可以将计算机上的数据发送到单片机上,并从单片机上接收到数据,实现了双向的数据交互。
我们还观察到,在不同的串口参数设置下,数据传输的速度和稳定性会有所差异。
六、实验应用串口通讯在现实生活中有着广泛的应用。
例如,我们可以通过串口通讯将计算机连接到打印机或扫描仪上,实现打印和扫描功能。
此外,串口通讯还可以应用于工业自动化控制、仪器仪表通讯等领域。
七、实验总结通过本次实验,我们深入了解了串口通讯的原理和应用,并成功地实现了计算机与单片机之间的数据传输。
通过实验,我们掌握了串口通讯的基本操作方法,并对串口通讯的参数设置和数据传输过程有了更深入的理解。
UART串口接收模块设计实验目标:实现FPGA接收其他设备通过UART协议发送过来的数据知识点:1、U RAT通信协议工业环境下数据接收实现。
2、I n system sources and probes editor ISSP)调试工具的使用。
UART发送端发送一个字节数据时序图:采集中间时刻时的数据即可,如下图所示但是在工业应用中,往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。
以下为改进型的单bit数据接收方式示意图:BI + 1 - 1丨丨「i |丨11 口「「「i「11 丨im i [1 2 3 4 5 6 7 8 9 10 11 12 1314 1516在这张图中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此这两段时间的电平无效,采集时直接忽略。
而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。
但是也不排除该段数据受强 电磁干扰而出现错误的电平脉冲, 因此对这一段电平,进行多次采样,并求高低 电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。
例如, 采样6次的结果分别为1/1/1/1/0/1/,贝U 取电平结果为1,若为0/0/1/0/0/0,,贝U 取 电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通 信线路环境非常恶劣,数据不具有可靠性。
串口发送模块包含两个主要组件:1、 起始位检测进程(低电平,下降沿)2、 波特率产生模块3、 数据接收模块串口接收模块整体结构图:Data_Byte[7:0] Rx_Done=Rst n波特率时钟计算:---------------- ►Baud_Set[2:0] ----- -------- ►ClkModelsim 仿真图:• 在testbench 文件中我们为设计输入了假定的信号, 在仿真图中我们可以看到 data_byte_r 在Rx_done 标志位产生的时候成功的将仿真数据 data_byte_t 接收到其中。
四川工程职业技术学院电子信息工程09-1班《EDA应用》大作业串行通信第3组:杨国勋、李开宏、彭国明2011.10目录一、设计任务 (1)二、硬件设计 (1)1、硬件电路图 (1)2、整体模块 (2)三、软件设计 (2)1、主程序模块 (2)2、发送模块 (5)3、接收模块 (7)四、实验结果 (9)五、开发工具 (10)1、硬件 (10)2、软件 (10)六、项目总结 (10)1、遇到的问题 (10)2、解决的办法 (10)七、参考文献 (10)一、设计任务综合运用所学基本知识,通过在FPGA开发板子完成与计算机进行RS232串口通信,计算机上的软件可以使用串口通信调试软件进行数据发送或接收数据。
根据设计要求,应把系统分成4个模块来完成,这四个模块分别是:时钟模块(向系统各部分提供各种频率的时钟信号)收发模块(进行串行通信的发送和接收)显示模块(显示通信的数据格式)控制模块(控制系统的工作)二、硬件设计1、硬件电路图2、整体模块三、软件设计1、主程序模块module uart_test(clock,key,rdata,wen,sdata,seg,dig);input clock; //系统时钟(48MHz) input[2:0] key; //按键输入(KEY1~KEY3) input[7:0]rdata; //接收到的数据output wen; //发送数据使能output[7:0]sdata; //要发送的数据output[7:0]seg; //数码管段码输出output[7:0]dig; //数码管位码输出//I/O寄存器reg[7:0]sdata;reg[7:0]seg;reg[7:0]dig;//内部寄存器reg[16:0]count; //时钟分频计数器reg[2:0]dout1,dout2,dout3,buff; //消抖寄存器reg[1:0] cnt; //数码管扫描计数器reg[3:0]disp_dat; //数码管扫描显存reg div_clk; //分频时钟wire[2:0]key_edge; //按键消抖输出//时钟分频部分always @(posedge clock)beginif (count < 17'd120000)begincount <= count + 1'b1;div_clk <= 1'b0;endelsebegincount <= 17'd0;div_clk <= 1'b1;endend//按键消抖部分always @(posedge clock)beginif(div_clk)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endend//按键边沿检测部分always @(posedge clock)beginbuff <= dout1 | dout2 | dout3;endassign key_edge = ~(dout1 | dout2 | dout3) & buff;//2位16进制数输出部分always @(posedge clock) //按键1 beginif(key_edge[0])sdata[7:4] <= sdata[7:4] + 1'b1;endalways @(posedge clock) //按键2beginif(key_edge[1])sdata[3:0] <= sdata[3:0] + 1'b1;endassign wen = key_edge[2]; //按键3//数码管扫描显示部分always @(posedge clock) //定义上升沿触发进程beginif(div_clk)cnt <= cnt + 1'b1;endalways @(posedge clock)beginif(div_clk)begincase(cnt) //选择扫描显示数据2'd0:disp_dat = sdata[7:4]; //第一个数码管2'd1:disp_dat = sdata[3:0]; //第二个数码管2'd2:disp_dat = rdata[7:4]; //第七个数码管2'd3:disp_dat = rdata[3:0]; //第八个数码管endcasecase(cnt) //选择数码管显示位2'd0:dig = 8'b01111111; //选择第一个数码管显示2'd1:dig = 8'b10111111; //选择第二个数码管显示2'd2:dig = 8'b11111101; //选择第七个数码管显示2'd3:dig = 8'b11111110; //选择第八个数码管显示endcaseendendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg = 8'hc0; //显示04'h1:seg = 8'hf9; //显示14'h2:seg = 8'ha4; //显示24'h3:seg = 8'hb0; //显示34'h4:seg = 8'h99; //显示44'h5:seg = 8'h92; //显示54'h6:seg = 8'h82; //显示64'h7:seg = 8'hf8; //显示74'h8:seg = 8'h80; //显示84'h9:seg = 8'h90; //显示94'ha:seg = 8'h88; //显示a4'hb:seg = 8'h83; //显示b4'hc:seg = 8'hc6; //显示c4'hd:seg = 8'ha1; //显示d4'he:seg = 8'h86; //显示e4'hf:seg = 8'h8e; //显示f endcaseendendmodule2、发送模块module send(clk,clkout,Datain,TXD,TI,WR);input WR;input [7:0]Datain; //发送的一字节数据input clk;output clkout;output TXD,TI; //串行数据,发送中断reg[9:0]Datainbuf,Datainbuf2; //发送数据缓存reg WR_ctr,TI,txd_reg;reg [3:0]bincnt; //发送数据计数器reg [15:0] cnt;wire clk_equ;parameter cout = 5000;/*************波特率发生进程****************************/ always@(posedge clk)beginif(clk_equ)cnt = 16'd0;elsecnt=cnt+1'b1;endassign clk_equ = (cnt == cout);assign clkout = clk_equ;/*************读数据到缓存进程****************************/ always@(posedge clk)beginif(WR)beginDatainbuf={1'b1,Datain[7:0],1'b0};//读入数据,并把缓存组成一帧数据,10位WR_ctr = 1'b1; //置开始标志位endelse if(TI==0)WR_ctr = 1'b0;end/*************主程序进程****************************/ always@(posedge clk)beginif(clk_equ)beginif(WR_ctr==1||bincnt<4'd10) //发送条件判断,保证发送数据的完整性beginif(bincnt<4'd10)begintxd_reg = Datainbuf2[0]; //从最低位开始发送Datainbuf2 = Datainbuf>>bincnt; //移位输出bincnt = bincnt+4'd1; //发送数据位计数TI = 1'b0;endelsebincnt = 4'd0;endelsebegin //发送完毕或者处于等待状态时TXD和TI为高txd_reg = 1'b1;TI = 1'b1;endendendassign TXD = txd_reg; //TXD连续输出endmodule3、接收模块module rec(clk,clkout,Dataout,RXD,RI);input clk,RXD;output clkout,RI;output [7:0] Dataout; //并行数据输出reg StartF,RI;reg [9:0] UartBuff; //接收缓存区reg [3:0]count,count_bit;reg [15:0] cnt;reg [2:0]bit_collect; //采集数据缓存区wire clk_equ,bit1,bit2,bit3,bit;parameter cout = 312;//时钟是48M所以16*9600的分频数为312.5,这里取整数/*************波特率发生进程****************************/ always@(posedge clk)beginif(clk_equ)cnt = 16'd0;elsecnt=cnt+1'b1;endassign clk_equ = (cnt == cout);assign clkout = clk_equ;assign bit1 = bit_collect[0]&bit_collect[1]; assign bit2 = bit_collect[1]&bit_collect[2]; assign bit3 = bit_collect[0]&bit_collect[2]; assign bit = bit1|bit2|bit3;always@(posedge clk)beginif(clk_equ)beginif(!StartF) //是否处于接收状态beginif(!RXD)begincount = 4'b0; //复位计数器count_bit = 4'b0;RI = 1'b0;StartF = 1'b1;endelse RI = 1'b1;endelsebegincount = count+1'b1; //位接收状态加1if(count==4'd6)bit_collect[0] = RXD; //数据采集if(count==4'd7)bit_collect[1] = RXD; //数据采集if(count==4'd8)beginbit_collect[2] = RXD; //数据采集UartBuff[count_bit] = bit;count_bit = count_bit+1'b1;//位计数器加1if((count_bit==4'd1)&&(UartBuff[0]==1'b1))//判断开始位是否为0beginStartF = 1'b0; //标志开始接收endRI = 1'b0; //中断标志位低endif(count_bit>4'd9) //检测是否接收结束beginRI = 1'b1; //中断标志为高标志转换结束StartF = 1'b0;endendendendassign Dataout = UartBuff[8:1]; //取出数据位endmodule四、实验结果(1) 在工作状态下,若用户按下K1按键,则数码管1上的数字加 1(0~F循环);(2) 在工作状态下,若用户按下K2按键,则数码管2上的数字加 1(0~F循环);(3) 在工作状态下,若用户按下K3按键,则把数码管1和2上的数字通过串口发送到串口调试软件的接收窗口;(4) 在工作状态下,若用户通过串口调试软件在发送窗口发送数字,则在数码管7和8上显示相应的数字。
单片机串口通讯实验报告本实验是基于单片机和串口通讯的实验,旨在通过掌握单片机与计算机之间的串口通讯原理、方法和技巧,提高学生在单片机应用方面的操作技能和实践能力。
本实验将分为以下三个部分进行讲解:一、实验原理串口是指通过一条通信线路,将数据以一定的格式传输到一个设备或计算机上。
单片机是一种非常常见的嵌入式系统,具有很好的应用前景。
通过学习单片机串口通信原理,可以更好地理解嵌入式系统的应用场景。
串口发送数据的基本原理是将二进制的数据码转换成特定规则的数据帧,发送到串口的通信线路上。
串口接收数据的基本原理是从串口线路上读取二进制码,对码进行格式化解码,再存储到相应的缓存区中。
计算机和单片机通讯的原理基本一致,但是具体的实现方法和细节要根据所用的串口模块和单片机芯片来确定。
二、实验步骤该实验将从计算机到单片机的数据传输进行实验。
其中,计算机上将使用串口终端软件RealTERM,单片机使用TTL串口。
1.连接TTL串口首先,将串口线连接到单片机的TTL串口上(RX、TX、GND)。
2.串口设置打开RealTERM软件,设置串口参数(波特率、数据位、奇偶校验、停止位等)。
在Windows系统中,可以通过设备管理器查看串口设备,从而确定串口号(通常为COM1、COM2等)。
3.单片机程序设计单片机程序中需要设置串口参数、发送数据和接收数据等功能。
在发送数据时,需要将发送缓存区中的数据转换成相应的数据帧格式,再通过串口发送到计算机上。
在接收数据时,需要从串口接收缓存区中读取数据,并且解析成特定的格式,再将数据存储到所需的区域。
4.进行实验打开串口终端软件后,点击“打开串口”按钮,可以看到从单片机发送的数据。
可以通过键盘输入数据,以进行数据的发送和接收。
具体操作步骤可以根据实际需要来确定,可以设置不同的数据帧格式和接收响应逻辑。
三、实验结果通过上述实验,可以掌握单片机串口通信的基本原理和实现方法。
可以通过实验得到一些操作技巧,例如:1.根据计算机和单片机所使用的串口模块和相关参数,选择合适的波特率、数据位、奇偶校验和停止位等控制参数。
第十一章制作PCB11.1设计任务使用Protel2004设计出串口通信电路。
画出电路原理图和PCB板,并生成制造文件。
11.2创建项目文件及工作环境打开Protel2004,选择菜单中【文件】|【创建】|【项目】|【PCB项目】,系统的工作区会自动产生PCB项目文件PCB_Project1.PrjPCB。
右键点击,在右键菜单中选择【追加新文件到项目中】|【Schematic】,则系统会自动产生Sheet1.SchDoc 文件和原理图设计界面。
选择菜单【文件】|【保存】,系统会弹出【保存】对话框,如图11-1所示【保存】对话框。
将文件名称改为Serial.SchDoc,点击。
图11-1 【保存】对话框右键点击,在右键菜单中选择【追加新文件到项目中】|【PCB】,2则系统会自动产生PCB1.PcbDoc 文件和原理图设计界面。
选择菜单【文件】|【保存】,系统会弹出【保存】对话框,如图11-2所示【保存】对话框。
将文件名称改为Serial.PcbDoc ,点击。
图11-2 【保存】对话框11.3 原理图设计11.3.1 设计思路本例使用的是MAXIM 公司的Max232芯片,设计串口通信电路。
11.3.2 元件库管理与设计根据8.4.1中介绍的方法添加元件库。
将Library 文件夹中的Miscellaneous Connectors.IntLib 和Miscellaneous Devices.IntLib 以及Library/Maxim 文件夹中的Maxim Communication Transceiver.IntLib 添加进来。
如图11-3和11-4所示【打开】对话框。
3图11-3 【打开】对话框图11-3 【打开】对话框4添加元件库后,【可用元件库】对话框就变成如图11-4所示。
点击。
图11-4 【可用元件库】11.3.3 原理图布线单击屏幕右侧按钮,弹出【元件库】对话框,在下拉菜单中选择元件库,在元件清性】 对话框,修改元件标识符和注释,点击,然后将选择的元件放置在原理图5表11-1 元件参数表选择菜单【放置】|【端口】属性】 对话框设置端口名称和I/O 类型。
一、实验名称FPGA串口发送与接收实验二、实验目的和要求目的要求:1)掌握VHDL硬件语言的基本应用。
2)理解掌握串口通信协议。
3)掌握和理解串口发送模块的原理和设计方法。
4)掌握和理解串口接收模块的原理和设计方法。
5)掌握用VHDL硬件语言进行顶层文件设计。
6)掌握用Modelsim 进行仿真操作。
三、实验内容和原理1.串口发送与接收模块设计思路串行通信时与并行通信相对应的,串行通信指计算机总线或者其他数据通道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。
串行通信被用于长距离通信及大多数计算机网络,串行通信总线越来越普遍,优越性也越来越突出。
UART是异步串口通信,没有同步的时钟,为了能保证数据传输的正确性,采用16倍数据波特率的时钟进行采样,每位数据有16个时钟采样,接收采用大数判决或者中间时钟采样。
一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
串口UART 通信协议数据帧格式如下图所示,首先是一个起始位ST,然后是7-8位可选数据位,0-1位可选奇偶校验位PA、1-2位可选的高电平停止位SP。
图3-1 UART 串口通信协议本次试验分三个模块进行设计:分频器、串口发送部分、串口接收部分。
分频器输出时钟为16倍采样值,发送部分根据发送信号进行数据发送,接收部分先接收起始位再对每个数据位的第八个clk 进行采样接收数据。
设计中分别对三个模块效果进行仿真,最后把串口发送和接收部分组合,实现把串行接收到的数据再串行发出。
2. 分频器分频器是对输入的50MHz 系统时钟进行分频,本次试验采用的波特率为9600bps ,进行16倍采样后的时钟为16*9600,因此分频系数为325。
计算公式如下:9600165000000052.325*= (公式3-1)分频器的符号文件如下图所示:图3-2 分频器符号文件3. 串口发送模块串口发送模块最根本的功能是把放在串口中的并行数据一位一位地串行发送出去,实现数据的并串转换。
实验四串口接收模块电路设计一、实验目的:1、熟练使用ISE设计工具。
2、理解串口传输协议。
理解采用“自顶向下”设计思路,分解模块的方法。
3、在ISE使用Verilog HDL设计串口接收模块,完成仿真、下载。
二、原理分析(一)串口传输协议概述设计完成异步串口通信通用异步收发是一种典型的异步串口通信,简称UART。
串口通信时序如图1所示。
图1 通用异步收发时序图由图1可以看出,在没有数据传送时,通信线会一直处于高电平,即逻辑1状态;当有数据传送时,数据帧以起始位开始,以停止位结束。
起始位为低电平,即逻辑0状态;停止位为高电平,即逻辑1状态,其持续时间可选为1位、1.5位或2位(本次设计选择持续时间1位)。
接收端在接收到停止位后,知道一帧数据已经传完,转为等待数据接收状态;只要再接收到0状态,即为新一帧数据的起始状态。
数据帧的数据位低位(LSB)在前,高位(MSB)在后,根据不同的编码规则,数据位可能为5位、6位、7位或者8位(本次设计数据位定位8位)。
校验位也可根据需要选择奇校验、偶校验或者不要校验(本次设计不要校验位)。
(二)串口时序分析串口通讯常用“波特率”表述串口传输速率,常用的参数有9600 bps 和115200 bps等。
在硬件传输角度看,波特率表征了传输一位数据所需要的时间。
例如:波特率是9600 bps,传输一位数据的时间是1/9600= 0.000104166666666667秒。
如果FPGA系统时钟是20MHZ,则一位数据传输时间相当于(1/9600)/(1/20M)=2083个20MHZ时钟周期。
设一帧数据位数=1(开始位)+8(数据位)+1(校验位)+1(结束位)=11位,所以传输一帧数据的时间是11*1/9600=0.00114583333333333333333333333333秒。
为了稳定采集串口数据帧的数据,需要在每位数据的“中间时刻”采样,由此,需要在每位数据开始时刻对时钟进行计数,若系统时钟是20MHZ,则在计数至2083/2=1042时采样此时刻的数值。
三、系统分析:为实现串口接收电路,FPGA应该完成:1、及时发现数据传输的开始,并判断每一位的开始。
2、按照“在数据位中间采样”的要求,确认采样时刻。
3、将采样得到串行数据转换为并行数据。
4、将并行数据显示在下载板上。
本次实验参数:串口传输数据率9600bps,每帧数据11位。
按照“自顶向下”设计思想,系统分为以下五个子模块:1、帧开始监测模块(detect_module)输入端口:串行输入数据RX_Pin_In,系统时钟CLK,复位信号RSTn,其中当RSTn=0时系统复位。
输出端口:H2L_Sig参考代码:module detect_module( CLK, RSTn,RX_Pin_In, H2L_Sig);input CLK;input RSTn;input RX_Pin_In;output H2L_Sig;reg H2L_F1;reg H2L_F2;always @ ( posedge CLK or negedge RSTn )if( !RSTn )beginH2L_F1 <= 1'b1;H2L_F2 <= 1'b1;endelsebeginH2L_F1 <= RX_Pin_In;H2L_F2 <= H2L_F1; endassign H2L_Sig = H2L_F2 & !H2L_F1;endmodule2、数据位中心定位模块(rx_bps_module)输入端口:系统时钟CLK;复位信号 RSTn,当RSTn=0,系统复位;数据位有效信号 Count_Sig,当Count_Sig=1,表示有效位传输。
输出端口:BPS_CLK,当计数至每一位的中间位置,BPS_CLK=1,提示信号采集时间到,否则不进行信号采集。
设系统时钟20MHZ,则参考代码如下:module rx_bps_module(CLK, RSTn,Count_Sig,BPS_CLK );input CLK;input RSTn;input Count_Sig;output BPS_CLK;reg [11:0]Count_BPS;always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count_BPS <= 12'd0;else if( Count_BPS == 12'd2082 )Count_BPS <= 12'd0;else if( Count_Sig )Count_BPS <= Count_BPS + 1'b1;elseCount_BPS <= 12'd0;assign BPS_CLK = ( Count_BPS == 12'd1041 ) ? 1'b1 : 1'b0;endmodule3、数据装载模块(rx_control_module)输入端口:系统时钟CLK,复位信号 RSTn,当RSTn=0时,系统复位帧开始信号H2L_Sig,当H2L_Sig=1,表示一帧信号开始;串口数据输入信号: RX_Pin_In,位中心定位信号:BPS_CLK,串口接收使能信号 RX_En_Sig,当RX_En_Sig=1,系统正常工作。
反正不接收数据。
输出端口:串口数据帧开始确认信号:Count_Sig,当 Count_Sig=1,表示串口输入帧开始时刻,持续一个系统时钟周期。
装载好的串口数据:RX_Data,位宽为8bits串口数据接收结束信号: RX_Done_Sig,当RX_Done_Sig=1,表示一帧串口数据接收完毕。
参考代码:module rx_control_module(CLK, RSTn, H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig, Count_Sig, RX_Data, RX_Done_Sig);input CLK;input RSTn;input H2L_Sig;input RX_En_Sig;input RX_Pin_In;input BPS_CLK;output Count_Sig;output [7:0]RX_Data;output RX_Done_Sig;reg [3:0]i;reg [7:0]rData;reg isCount;reg isDone;always @ ( posedge CLK or negedge RSTn )if( !RSTn )begini <= 4'd0;rData <= 8'd0;isCount <= 1'b0;isDone <= 1'b0;endelse if(RX_En_Sig )case ( i )4'd0 :if( H2L_Sig ) begin i <= i + 1'b1; isCount <= 1'b1; end4'd1 :if( BPS_CLK ) begin i <= i + 1'b1; end4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8, 4'd9 :if( BPS_CLK ) begin i <= i + 1'b1; rData[ i - 2 ] <= RX_Pin_In; end4'd10 :if( BPS_CLK ) begin i <= i + 1'b1; end4'd11 :if( BPS_CLK ) begin i <= i + 1'b1; end4'd12 :begin i <= i + 1'b1; isDone <= 1'b1; isCount <= 1'b0; end4'd13 :begin i <= 1'b0; isDone <= 1'b0; endendcaseassign Count_Sig = isCount;assign RX_Data = rData;assign RX_Done_Sig = isDone;endmodule这一代码采用有限状态机方式,在监测到串口数据帧开始时刻,如果系统接收使能信号有效,展开对串口输入的几个阶段:帧开始,有效帧数据接收,接收帧校验位,接收帧结束位,一帧接收结束,转回帧开始状态。
4、显示模块(display)输入端口:sum,从串口接收到的8bits的一帧数据输出端口:自定义本模块根据下载板的资源,将接收到的8bits数据显示出来,可以采用数码管,发光二极管等。
5、顶层模块(top)将以上4个模块合理组合,构成一个系统。
四、实验内容:1.在理解串口协议2.采用VerilogHDL,设计分频模块,将下载板上40MHz时钟转换为所需要的20MHZ 时钟。
3. 分析帧开始监测模块(detect_module),数据位中心定位模块(rx_bps_module),数据装载模块(rx_control_module)的功能,完成:帧开始监测模块(detect_module),数据装载模块(rx_control_module)两个模块的功能仿真。
4. 根据下载板资源,设计数据显示方案,并设计display.v模块并仿真。
5. 在理解各个参考代码基础上,画出系统模块连接图,完成顶层模块top.v的设计。
6、根据下载板资源,锁定引脚,编译适配以上文件,最后进行下载和硬件测试。
四、思考题:1、简述帧开始监测模块(detect_module),数据位中心定位模块(rx_bps_module),数据装载模块(rx_control_module)的功能各是什么?这三个模块是如何配合实现了串口数据的接收?2、如果串口比特率改为115200 bps,代码应该做怎样的修改?3、如果要设计串口数据发送模块,该如何设计,简要写出设计系统任务书(包括设计目标,功能模块划分,子模块功能描述等)五、实验报告:要求按照系统实现要求,分析串口通讯协议,描述按“自顶向下”设计方法分解系统,实现各子模块的思路,实验报告附功能仿真波形及其分析。
阐述下载测试电路,包括引脚锁定,下载调试效果。
回答本实验的思考题。