实验四 UART串口通信实验报告
串口通信实验报告

试验三双机通讯试验【1 】一、试验目标UART 串行通讯接口技巧运用二、试验实现的功效用两片焦点板之间实现串行通讯,将按键信息互发到对方数码管显示.三、体系硬件设计(1)单片机的最小体系部分(2)电源部分(3)人机界面部分数码管部分按键部分(4)串口通讯部分四、体系软件设计#include <STC.H>#define uchar unsigned char#define uint unsigned intvoid send();uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;uint m=0,i=0,j;uchar temp,prt;/***y延时函数***/void delay(uint k){uint i,j; //界说局部变量ijfor(i=0;i<k;i++) //外层轮回{for(j=0;j<121;j++); //内层轮回}}/***键盘扫描***/char scan_key(){ H1=0;H2=0;L1=1;L2=1;L3=1;if(L1==0){ delay(5);if (L1==0){ L1=0;H1=1;H2=1;if(H1==0){ m=1; //KEY1键按下return(m);}if(H2==0){ m=4; //KEY4键按下return(m);}}}if(L2==0){ delay(5);if (L2==0){ L2=0;H1=1;H2=1;if(H1==0){ m=2; //KEY2键按下return(m);}if(H2==0){ m=5; //KEY5键按下return(m);}}}if(L3==0){ delay(5);if (L3==0){ L3=0;H1=1;H2=1;if(H1==0){ m=3; //KEY3键按下return(m);}if(H2==0){ m=6; // KEY6键按下return(m);}}}return(0);}/***主函数***/main(){P1M1=0x00;P1M0=0xff;SCON=0x50;//设定串行口工作方法1TMOD=0x20;//准时器1,主动重载,产生数据传输速度 TH1=0xfd;//数据传输率为9600TR1=1;//启动准时器1P0&=0xf0;while(1){if(scan_key()) //假如有按键按下{SBUF=scan_key(); //发送数据while(!TI); // 等待数据传送TI=0; // 消除数据传送标记}if(RI) //是否稀有据到来{RI=0; // 消除数据传送标记temp=SBUF; // 将吸收到的数据暂消失temp中}P1=code0[temp]; // 数据传送到P1口输出delay(500); //延时500ms}}五、试验中碰到的问题及解决办法(1)串行口和准时器的工作方法设定是症结,本次是按需传输的是两位十六进制数,串行口为工作方法1,准时器为8位主动重载;(2)采取P0&=0xf0语句使4个数码管静态点亮;(3)在发送和接收进程中,用标识位TI和RI来检测发送和接收是否完成;(4)在用电脑和单片机进行串口通讯测试时,电脑的传世速度必定要和单片机的传输速度相等,不然显示会消失错误.指点先生签字:日期:。
uart实验报告

uart实验报告
《UART实验报告》
实验目的:通过实验学习串行通信的基本原理,掌握UART通信协议的工作原理和使用方法。
实验设备:单片机开发板、串口调试助手、电脑。
实验原理:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信协议,用于在计算机和外部设备之间进行数据传输。
UART通信协议包括数据位、停止位、奇偶校验位等参数,通过这些参数的设置可以实现不同的通信速率和数据传输方式。
实验步骤:
1. 连接单片机开发板和电脑,打开串口调试助手。
2. 在单片机开发板上编写UART通信程序,设置通信参数。
3. 将单片机开发板通过串口连接到电脑,打开串口调试助手。
4. 在串口调试助手上发送数据,观察单片机开发板接收到的数据。
5. 在单片机开发板上发送数据,观察串口调试助手接收到的数据。
实验结果:
经过实验,我们成功地实现了通过UART通信协议在单片机开发板和电脑之间进行数据传输。
在串口调试助手上发送的数据能够被单片机开发板正确接收,并且在单片机开发板上发送的数据也能够被串口调试助手正确接收。
通过调整通信参数,我们还验证了不同通信速率和数据传输方式对通信效果的影响。
实验总结:
通过本次实验,我们深入了解了UART通信协议的工作原理和使用方法,掌握
了串行通信的基本原理。
在今后的学习和工作中,我们将能够更加熟练地应用UART通信协议进行数据传输,为实际工程应用打下了坚实的基础。
串口通信实验报告

串口通信实验报告串口通信实验报告一、引言串口通信是一种常用的数据传输方式,广泛应用于计算机与外部设备之间的数据交互。
本实验旨在通过对串口通信的实际操作,掌握串口通信的基本原理和实现方法。
二、实验目的1. 理解串口通信的基本原理;2. 学会使用串口通信的相关指令和函数;3. 掌握串口通信的实际应用。
三、实验器材与软件1. 单片机开发板;2. 电脑;3. 串口线;4. 串口调试助手软件。
四、实验步骤1. 连接单片机开发板和电脑,使用串口线将它们连接起来;2. 打开串口调试助手软件,设置串口参数(波特率、数据位、停止位等);3. 在单片机开发板上编写相应的程序,实现串口通信功能;4. 将程序下载到单片机开发板上,并启动程序;5. 在串口调试助手软件中发送数据,并观察单片机开发板上的反应;6. 分析实验结果,总结串口通信的特点和应用。
五、实验结果与分析经过实验,我们成功地实现了串口通信功能。
在串口调试助手软件中发送数据时,单片机开发板能够正确接收并处理数据,并作出相应的反馈。
通过实验结果的分析,我们可以得出以下结论:1. 串口通信具有较高的可靠性和稳定性,适用于长距离数据传输;2. 串口通信的速度较慢,适用于对数据传输速度要求不高的场景;3. 串口通信可以实现双向数据传输,方便实现设备之间的数据交互。
六、实验心得本次实验让我对串口通信有了更深入的了解。
通过实际操作,我掌握了串口通信的基本原理和实现方法,并学会了使用串口调试助手软件进行串口通信调试。
在实验过程中,我遇到了一些问题,例如串口参数设置不正确导致通信失败等。
但通过不断调试和排查,最终成功解决了这些问题。
这让我更加明白了实验的重要性,只有亲自动手去实践,才能真正掌握知识。
通过这次实验,我还意识到串口通信在现实生活中的广泛应用。
无论是计算机与外部设备的数据交互,还是嵌入式系统的开发,串口通信都扮演着重要的角色。
因此,掌握串口通信技术对于我们的学习和工作都具有重要意义。
实验4 UART实验

实验四uart实验1.实验类型:设计性实验2.实验目的:了解和熟悉实验箱硬件、UART通信程序设计及烧写等3.实验内容:(1) 根据硬件结构写出S3C2410与PC机的串口通信程序;(2) 根据接收命令控制LED灯的显示;4.关键实验步骤:1.把并口线插到pc机的并口,并把并口与JTAG相连,JTAG与开发板的14针JTAT口相连,打开2410-S.2.把整个GIVEIO目录拷贝到C:\WINDOWS下,并把该目录下的giveio.sys文件拷贝到c:/windows/system32/drivers下。
3.在控制面板里,选添加硬件>下一步>选-是我已经连接了此硬件>下一步>选中-添加新的硬件设备>下一步>选中安装我手动从列表选择的硬件>下一步>选择-显示所有设备>选择-从磁盘安装-浏览,指定驱动为C:\WINDOWS\GIVEIO\giveio.inf文件,点击确定,安装好驱动.4.根据硬件连接图编写控制程序,并生成bin文件.5.在d盘新建一目录ARM,把sjf2410.exe和要烧写的bin文件拷贝到该目录下,在程序-附件-msdos下,进入该目录,运行sjf2410 命令如下:sjf2410 /f:bin 文件.在此后出现的三次要求输入参数,第一次是让选择Flash,选0;第二次是选择jtag对flash的两种功能,也选0;第三次是让选择起始地址,选0此后就等待大约3-5分钟的烧写时间,当VIVI 烧写完毕后选择参数2,退出烧写。
烧录后重新启动2410-S,观察不同控制程序的实验现象。
#define ULCON0 (*(volatile unsigned long *)0x50000000)#define UCON0 (*(volatile unsigned long *)0x50000004)#define UTRSTA T0 (*(volatile unsigned long *)0x50000010)#define UTXH0 (*(volatile unsigned long *)0x50000020)#define URXH0 (*(volatile unsigned long *)0x50000024)#define UBRDIV0 (*(volatile unsigned long *)0x50000028)#define GPHCON (*(volatile unsigned long *)0x56000070)//#define GPHDAT (*(volatile unsigned long *)0x56000074) #define GPHUP (*(volatile unsigned long *)0x56000078)void Delay(unsigned long x);int Main(){unsigned long uartrecdata=0x09;ULCON0=0x03;UCON0=0x45;UBRDIV0=0x13;GPHCON=0x000000A0;GPHUP=0x00000000;while(1){while(!(UTRSTAT0&0x2)); //等待知道THR变空//改动延时时间1--10 Delay(100);UTXH0 =uartrecdata;Delay(100);while(!(UTRSTAT0&0x1)); //等待直到接受到一个数据uartrecdata=URXH0;Delay(100);}return 0;}void Delay(unsigned long x){unsigned long i,l=0;for(i=0;i<=x;i++);}IMPORT MainAREA Init,CODE,READONLYENTRYLDR R0,=0x53000000mov r1,#0STR R1,[R0]BL MainEND#define IOPMOD (*(volatile unsigned long *)0x56000020)#define IOPDATA (*(volatile unsigned long *)0x56000024)void Delay(unsigned long x);int Main(){unsigned long LED;IOPMOD=0x00005400; LED=0x00000001;while(1){IOPDATA=LED;LED=(LED<<1);if(LED==0x00000100)LED=0x00000001;Delay(200000);}return 0;}void Delay(unsigned long x){ unsigned long i;for(i=0;i<=x;i++) ;}。
串行通讯实验报告

串行通讯实验报告实验目的:1.了解串行通讯的基本概念和原理。
2.学习串行通讯的常用协议和流程。
3.实现串行通讯的发送和接收功能。
4.掌握使用串行通讯进行数据传输的方法。
实验器材:1.PC机一台。
2.串行通讯扩展板一块。
3.经典串行通讯工具软件。
实验原理:串行通讯是指信息逐位地按顺序进行传输的通讯方式。
串行通讯需要通过物理通道将数据逐位地传输给接收方。
常用的串行通讯协议有UART (通用异步收发传输)协议、SPI(串行外设接口)协议和I2C(串行外设接口)协议等。
实验步骤:1.将串行通讯扩展板连接到PC机上的串行通讯端口。
2.在PC机上安装串行通讯工具软件,并打开软件。
3.配置串行通讯参数,包括波特率、数据位、停止位和校验位等。
4.在串行通讯工具软件中编写发送数据的程序,并发送数据。
5.在串行通讯工具软件中接收数据,并验证接收的数据是否正确。
实验结果与分析:在实验中,我们使用串行通讯扩展板和串行通讯工具软件实现了串行通讯的发送和接收功能。
我们先配置了串行通讯的参数,在发送数据之前,我们选择了合适的波特率、数据位、停止位和校验位等。
然后,在发送数据之后,我们使用串行通讯工具软件接收数据,并验证接收的数据是否正确。
实验中我们可以观察到发送和接收的数据都是逐位地传输的,并且发送和接收的数据需要保持一致。
如果发送和接收的数据不一致,可能是由于串行通讯参数配置错误或者数据传输过程中产生了错误。
实验总结:通过本次实验,我们了解了串行通讯的基本概念和原理,学习了串行通讯的常用协议和流程,掌握了使用串行通讯进行数据传输的方法。
在实验中,我们成功完成了串行通讯的发送和接收功能,并验证了接收的数据是否正确。
实验中还存在一些问题,比如串行通讯的参数配置可能会影响数据的传输效果,我们需要根据具体情况选择合适的参数。
另外,数据传输中可能会产生噪声和错误,我们需要采取一些纠错措施来提高数据的传输可靠性。
总的来说,本次实验对我们了解串行通讯的原理和应用有很大帮助,为今后的学习和实践打下了良好的基础。
uart串口通信实验报告

串口通信实验报告基本实验:16位的乘法器设计思想:乘法器根据以往学过数电的设计经验,应该是移位相加的方法,设被乘数为[15:0]a,乘数为[15:0]b,则从b的最高位开始算起,c初值为0,为b最高位为1,则c就等于c+a;接下来,若b的次高位为1,则c左移一位加a,若为0则c左移一位就可以了,这样的步骤做到b的最低位那么c的值就是a*b,当然最好c是中间寄存器,这样结果才不会出现中间值。
实验的源码:module muti(clk,rst,ready,a,b,c);input clk;input rst;input [15:0]a;input [15:0]b;output [31:0]c;output ready;reg [31:0]c;reg ready;reg [31:0]temp;reg [5:0]n;always @(posedge clk or posedge rst)beginif(rst)beginc<=0;ready<=1;temp<=0;n<=32;endelseif(ready)begintemp<=0;n<=32;ready<=0;endelseif(n)beginif(b[n-1])begintemp<=(temp<<1)+a;n<=n-1;endbegintemp<=temp<<1;n<=n-1;endendelsebeginc<=temp;n<=32;ready<=1;endendendmodul测试代码:`timescale 1ns/1ns module tb;reg clk;reg [15:0]a;reg [15:0]b;reg rst;wire ready;wire [31:0]c;always #10 clk=~clk; initialbeginrst<=1;clk<=0;a=0;b=0;#10 rst=0;#21 a=21;b=32;#650 a=3;b=4;#700 $stop;endmuti muti_unit(.a(a),.b(b),.rst(rst),.clk(clk),.ready(ready),.c(c));endmodule这边a被乘数,b是乘数,当rst为高时,则将c置0,ready置一,ready信号为高表示此时空闲可以计算,rst为低时则开始计算,21*32为672,3*4为12,在乘法操作时,ready信号为低电平表示在工作中不能再输入进行计算,当计算结束则变为高电平。
串口通讯实验报告

串口通讯实验报告串口通讯实验报告一、引言串口通讯是计算机与外部设备进行数据交互的一种重要方式。
在本次实验中,我们通过使用串口通讯实现了计算机与单片机之间的数据传输,探索了串口通讯的原理和应用。
二、实验目的本次实验的目的是通过串口通讯实现计算机与单片机之间的数据传输,并观察数据的传输过程和结果。
通过这个实验,我们可以更好地理解串口通讯的工作原理,并掌握串口通讯的基本操作方法。
三、实验原理串口通讯是通过串行传输方式实现数据传输的。
在计算机和外部设备之间,数据通过串行的方式进行传输,即逐位地进行传送。
串口通讯的原理主要包括波特率、数据位、停止位和校验位等参数的设置。
四、实验步骤1. 准备工作:连接计算机和单片机,确保串口线连接正确。
2. 设置串口参数:打开计算机的串口设置工具,设置波特率、数据位、停止位和校验位等参数。
3. 单片机编程:编写单片机程序,设置串口通讯的相关参数,并实现数据的接收和发送功能。
4. 计算机编程:编写计算机程序,通过串口通讯接收单片机发送的数据,并进行相应的处理和显示。
5. 实验验证:运行单片机程序和计算机程序,观察数据的传输过程和结果,验证串口通讯的正确性。
五、实验结果与分析经过实验,我们成功地实现了计算机与单片机之间的数据传输。
通过串口通讯,我们可以将计算机上的数据发送到单片机上,并从单片机上接收到数据,实现了双向的数据交互。
我们还观察到,在不同的串口参数设置下,数据传输的速度和稳定性会有所差异。
六、实验应用串口通讯在现实生活中有着广泛的应用。
例如,我们可以通过串口通讯将计算机连接到打印机或扫描仪上,实现打印和扫描功能。
此外,串口通讯还可以应用于工业自动化控制、仪器仪表通讯等领域。
七、实验总结通过本次实验,我们深入了解了串口通讯的原理和应用,并成功地实现了计算机与单片机之间的数据传输。
通过实验,我们掌握了串口通讯的基本操作方法,并对串口通讯的参数设置和数据传输过程有了更深入的理解。
嵌入式体系结构实验4-UART实验

实验四UART通信实验1、实验目的•掌握S3c2410UART串口通信的工作原理•掌握s3c2419串口初始化的方法•掌握使用串口进行数据收、发的程序结构。
•了解通过串口通信进行设备控制的方法。
2、实验设备•硬件:PC 机,嵌入式系统实验箱•软件:ADS1.2或者KEIL MDK3、实验内容3.1 s3c2410的UART模块S3c2410处理器内部集成了3个独立的UART通信接口,UART0、UART1和UART2,具有以下特征:•所有的UART接口都可以选择采用查询、中断或者DMA控制方式。
•各UART波特率的时钟源可以选择PCLK或者UCLK,通过配置波特率分频系数,通信采用的波特率可调,最高可达230.4KPS。
•每个UART通信模块都拥有16字节大小的收/发数据队列各一个。
•内置红外(IrDA)编码器和解码器,支持红外工作模式。
•UART0和UART1配有nRTS和nCTS信号,支持握手传输方式。
•内部可检测多种接收错误,包括帧覆盖错误、奇偶校验错、帧格式错、间断状态等,并支持错误中断请求。
•可通过编程配置帧格式、工作模式(AFC、回环模式、红外模式)、FIFO、控制方式选择等等。
UART应用编程,包括两个部分,即UART初始化配置和UART通信控制。
涉及的底层特殊功能寄存器包括各种控制寄存器、状态寄存器和数据寄存器。
UART初始化过程就是针对各种控制寄存器的初始化配置。
利用查询方式进行通信控制方式,主要通过查询状态寄存器,读写数据寄存器实现的。
3.2 S3c2410的UART 模块相关SFR通过查询UTRSTAT 寄存器的Transmitter empty 位和Receive buffer data ready 位,确定是否能够向UTXHn 写入数据和从URXHn 读取数据。
图1 查询方式进行发送 图2 查询方式进行接收4、实验要求对给定的工程文件进行修改,逐步完成以下要求。
4.1 阅读、理解、测试给定代码重新编译UART的ADS工程文件,将生成的目标二进制文件system.bin, 通过vivi 的下载命令:load flash ucos x 下载到实验台的flash存储器ucos 分区,然后执行命令boot smc ucos ,执行刚刚下载的二进制文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四UART串口通信一、实验目的及要求设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就是“通用异步收发器”。
二、实验原理UART是一种通用串行数据总线,用于异步通信。
该总线双向通信,可以实现全双工传输和接收。
在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。
资料位的个数可以是4、5、6、7、8等,构成一个字符。
通常采用ASCII码。
从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。
可以是1位、1.5位、2位的高电平。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指标。
表示每秒钟传送的符号数(symbol)。
一个符号代表的信息量(比特数)与符号的阶数有关。
例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。
这两者的概念很容易搞错。
三、实现程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uart isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号;rs232_tx: out std_logic --RS232发送数据信号;);end uart;architecture behav of uart iscomponent uart_rx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);end component;component speed_select port(clk : in std_logic;--系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps的高电平为接收或者发送数据位的中间采样点bps_start:in std_logic --接收数据后,波特率时钟启动信号置位);end component;component uart_tx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end component;signal bps_start_1:std_logic;signal bps_start_2:std_logic;signal clk_bps_1:std_logic;signal clk_bps_2:std_logic;signal rx_data:std_logic_vector(7 downto 0);signal rx_int:std_logic;beginRX_TOP: uart_rx port map(clk=>clk,rst_n=>rst_n,rs232_rx=>rs232_rx,clk_bps=>clk_bps_1,bps_start=>bps_start_1,rx_data=>rx_data,rx_int=>rx_int);SPEED_TOP_RX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_1,bps_start=>bps_start_1);TX_TOP:uart_tx port map(clk=>clk, --系统时钟rst_n=>rst_n, --复位信号rs232_tx=>rs232_tx, --RS232发送数据信号clk_bps=>clk_bps_2, --此时clk_bps的高电平为发送数据的采样点bps_start=>bps_start_2, --接收到数据后,波特率时钟启动置位rx_data=>rx_data, --接收数据寄存器,保存直至下一个数据来到rx_int=>rx_int --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);SPEED_TOP_TX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_2,bps_start=>bps_start_2);end behav;-----------------------------------------------------------------------------------------------------------------------3个子模块------------------------------------------------------------------------------异步接收模块-------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity uart_rx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end uart_rx;architecture behav of uart_rx issignal rs232_rx0: std_logic;signal rs232_rx1: std_logic;signal rs232_rx2: std_logic;signal rs232_rx3: std_logic;signal neg_rs232_rx:std_logic;signal bps_start_r:std_logic;signal num:integer;signal rx_data_r:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrs232_rx0<='0';rs232_rx1<='0';rs232_rx2<='0';rs232_rx3<='0';elseif (rising_edge(clk)) thenrs232_rx0<=rs232_rx;rs232_rx1<=rs232_rx0;rs232_rx2<=rs232_rx1;rs232_rx3<=rs232_rx2;end if;end if;neg_rs232_rx <=rs232_rx3 and rs232_rx2 and not(rs232_rx1)and not(rs232_rx0);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';rx_int<='0';elseif (rising_edge(clk)) thenif(neg_rs232_rx='1') then --接收到串口数据线rs232_rx的下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收rx_int<='1'; --接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号rx_int<='0'; --接收数据中断信号关闭end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrx_data_r<="00000000";rx_data<="00000000";num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rx_data_r(0)<=rs232_rx;--锁存第0bitwhen 2=>rx_data_r(1)<=rs232_rx;--锁存第0bitwhen 3=>rx_data_r(2)<=rs232_rx;--锁存第0bitwhen 4=>rx_data_r(3)<=rs232_rx;--锁存第0bitwhen 5=>rx_data_r(4)<=rs232_rx;--锁存第0bitwhen 6=>rx_data_r(5)<=rs232_rx;--锁存第0bitwhen 7=>rx_data_r(6)<=rs232_rx;--锁存第0bitwhen 8=>rx_data_r(7)<=rs232_rx;--锁存第0bitwhen 10=>rx_data<=rx_data_r;when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;---------------------------------波特率控制模块-----------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity speed_select isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps的高电平为接收或者发送数据位的中间采样点bps_start:in std_logic --接收数据后,波特率时钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位);end speed_select;architecture behav of speed_select issignal cnt:std_logic_vector(12 downto 0);signal clk_bps_r:std_logic;constant BPS_PARA:integer:=5207;constant BPS_PARA_2:integer:=2603;beginprocess(clk,rst_n)beginif (rst_n='0')thencnt<="0000000000000";elseif (rising_edge(clk)) thenif((cnt=BPS_PARA)or(bps_start='0')) thencnt<="0000000000000"; --波特率计数器清零elsecnt<=cnt+'1'; --波特率时钟计数启动end if;end if;end if;end process;process(clk,rst_n)beginif (rst_n='0')thenclk_bps_r<='0';elseif (rising_edge(clk)) thenif(cnt=BPS_PARA_2) thenclk_bps_r<='1'; --clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点elseclk_bps_r<='0'; --波特率计数器清零end if;end if;end if;clk_bps<=clk_bps_r;end process;end behav;---------------------------------异步发送模块-------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity uart_tx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic; --接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end uart_tx;architecture behav of uart_tx issignal rx_int0: std_logic;signal rx_int1: std_logic;signal rx_int2: std_logic;signal neg_rx_int:std_logic;signal bps_start_r:std_logic;signal num:integer;signal tx_data:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrx_int0<='0';rx_int1<='0';rx_int2<='0';elseif (rising_edge(clk)) thenrx_int0<=rx_int;rx_int1<=rx_int0;rx_int2<=rx_int1;end if;end if;neg_rx_int <=not(rx_int1)and (rx_int2);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';tx_data<="00000000";elseif (rising_edge(clk)) thenif(neg_rx_int='1') then --接收到串口数据线rs232_rx的下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收tx_data<=rx_data; --接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrs232_tx<='1';num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rs232_tx<='0';when 2=>rs232_tx<=tx_data(0);--发送第1bitwhen 3=>rs232_tx<=tx_data(1);--发送第2bitwhen 4=>rs232_tx<=tx_data(2);--发送第3bitwhen 5=>rs232_tx<=tx_data(3);--发送第4bitwhen 6=>rs232_tx<=tx_data(4);--发送第5bitwhen 7=>rs232_tx<=tx_data(5);--发送第6bitwhen 8=>rs232_tx<=tx_data(6);--发送第7bitwhen 9=>rs232_tx<=tx_data(7);--发送第8bitwhen 10=>rs232_tx<='1';when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;四、实验步骤1、建立新工程UART,选择芯片,型号为cyclone iiEP2C35F484C8。