基于FPGA Uart串口通信实验

首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同。

  • UART简介
    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART通信在工作中相当常见,项目中需要生成uart信号,在博客中记录下。uart是异步通信,因为它只有一根线就可以数据的通信。不像SPI,I2C等同步传输信号。所以串口的传输速度和其它协议的速度相比是比较慢的。下面具体讲解一些uart协议以及是如何通信的。

  • 一些概念意义
    波特率:此参数容易和比特率混淆,其实他们是由区别的。具体可以百度更清楚。但是我认为uart中的波特率就可以认为是比特率,即每秒传输的位数(bit)。一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。
    起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
    数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。一般情况下都选择8位而不选择7,因为这样能尽可能避免数据的丢失或者混乱。小端传输(即从LSB_D0端开始发送数据,而且是串行发送)。
    校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
    空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

    注意:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)

时钟程序

`timescale 1ns/1ps
module clkdiv(clk50,rst_n,clkout);
input clk50;  //系统时钟
input rst_n;
output clkout;reg clkout;
reg [15:0] cnt;
/分频进程, 50Mhz 的时钟 27 分频/
/*计算过程
波特率115200bps
每个bit接收的数据有16个时钟采样
则分频数为:50_000_000/115200/16=27.13
约为27分频
*/
always @(posedge clk50 or negedge rst_n)
beginif (!rst_n) beginclkout <=1'b0;cnt<=0;endelse if(cnt == 16'd13) beginclkout <= 1'b1;cnt <= cnt + 16'd1;endelse if(cnt == 16'd27) beginclkout <= 1'b0;cnt <= 16'd0;endelse begincnt <= cnt + 16'd1;end
end
endmodule

串口发送程序

`timescale 1ns/1ps
module uarttx(clk, rst_n, datain, wrsig, idle, tx);
input clk; //UART 时钟
input rst_n; //系统复位
input [7:0] datain; //需要发送的数据
input wrsig; //发送命令,上升沿有效
output idle; //线路状态指示,高为线路忙,低为线路空闲
output tx; //发送数据信号
reg idle, tx;
reg send;
reg wrsigbuf, wrsigrise;
reg presult;
reg[7:0] cnt; //计数器parameter paritymode = 1'b0;//检测发送命令 wrsig 的上升沿always @(posedge clk)
beginwrsigbuf <= wrsig;wrsigrise <= (~wrsigbuf) & wrsig;
end//启动串口发送程序always @(posedge clk)
beginif (wrsigrise && (~idle)) //当发送命令有效且线路为空闲时,启动新的数据发送进程beginsend <= 1'b1;endelse if(cnt == 8'd168) //一帧数据发送结束beginsend <= 1'b0;end
end//串口发送程序, 16 个时钟发送一个 bitalways @(posedge clk or negedge rst_n)
beginif (!rst_n) begintx <= 1'b0;idle <= 1'b0;cnt<=8'd0;presult<=1'b0;endelse if(send == 1'b1) begincase(cnt) //产生起始位8'd0: begintx <= 1'b0;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd16: begintx <= datain[0]; //发送数据 0 位presult <= datain[0]^paritymode;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd32: begintx <= datain[1]; //发送数据 1 位presult <= datain[1]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd48: begintx <= datain[2]; //发送数据 2 位presult <= datain[2]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end 8'd64: begintx <= datain[3]; //发送数据 3 位presult <= datain[3]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd80: begintx <= datain[4]; //发送数据 4 位presult <= datain[4]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd96: begintx <= datain[5]; //发送数据 5 位presult <= datain[5]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd112: begintx <= datain[6]; //发送数据 6 位presult <= datain[6]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd128: begintx <= datain[7]; //发送数据 7 位presult <= datain[7]^presult;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd144: begintx <= presult; //发送奇偶校验位presult <= datain[0]^paritymode;idle <= 1'b1;cnt <= cnt + 8'd1;end8'd160: begintx <= 1'b1; //发送停止位idle <= 1'b1;cnt <= cnt + 8'd1;end8'd168: begintx <= 1'b1;idle <= 1'b0; //一帧数据发送结束cnt <= cnt + 8'd1;enddefault: begincnt <= cnt + 8'd1;endendcase
end
else begintx <= 1'b1;cnt <= 8'd0;idle <= 1'b0;end
end
endmodule

测试模块程序

`timescale 1ns / 1ps
module testuart(clk, rst_n, dataout, wrsig);
input clk;
input rst_n;
output[7:0] dataout;
output wrsig;
reg [7:0] dataout;
reg wrsig;
reg [7:0] cnt;
always @(posedge clk or negedge rst_n)
beginif(!rst_n) begincnt<=8'd0;wrsig<=1'b0;endelse beginif(cnt == 254)begindataout <= dataout + 8'd1; //每次数据加“1”wrsig <= 1'b1; //产生发送命令cnt <= 8'd0;endelsebeginwrsig <= 1'b0;cnt <= cnt + 8'd1;endend
end
endmodule

创建并编译顶层文件

实验结果

基于FPGA Uart串口通信实验相关推荐

  1. 基于FPGA的UART串口通信实验(VHDL语言实现)

    一.前言: 最近在做UART串口通信的相关实验时,在网上查了很多资料,发现网上的大部分文章只注重理论,不注重代码,很多代码有错误不说,而且难以理解.故在完成此实验后,起了写一篇博客的心思,以供有想做相 ...

  2. 【正点原子MP157连载】 第十六章 UART串口通信实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  3. 【FPGA练习】(一): UART串口通信实验

    由于之前学习FPGA的过程中,没有做一个良好的记录,以及已学知识的扩展,所以从今天开始每一个实验例程和扩展应用,都要做文档记录.本实验,是基于正点原子达芬奇xc7a35tfgg484-2开发板.开发板 ...

  4. UART 串口通信实验

            串口是"串行接口"的简称,即采用串行通信方式的接口.串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢.因此串口广泛应 ...

  5. 基于Atmega16的串口通信实验

    一.实验目的 1. 理解单片机串口的工作原理. 2. 掌握串口的编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"串口发送中断"(usart_ex1)和&qu ...

  6. 基于 MDK5的串口通信实验

    这里写目录标题 一.串口协议 二.STM32的USART串口通讯 1.新建工程 2.重定向printf函数 3.主要代码 4.编译生成.hex文件 5.烧录程序 6.串口工具运行结果 三.小结 一.串 ...

  7. 正点原子linux串口驱动下载,【正点原子Linux连载】第二十一章UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南 (amobbs.com 阿莫电子论坛)...

    示例代码21.3.1 bsp_uart.h文件代码 1  #ifndef _BSP_UART_H 2  #define _BSP_UART_H 3  #include "imx6ul.h&q ...

  8. UART串口通信(回环测试)

    一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...

  9. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

最新文章

  1. 反思脑机接口技术:机器真的能控制我们的大脑吗?
  2. excel in python
  3. 【Java每日一题】20161123
  4. Applese 走迷宫
  5. Spring整合Mybatis和JUnit
  6. rundll32的使用和使用c#调用dll
  7. 解决CHROME中画布中无法显示图片的方法
  8. 的标题形状工具在哪里_一分钟教你做一款让人眼前一亮的标题!你想学吗?「Word技巧」...
  9. HTML与XML数据的结合小总结
  10. storm32云台说明书_STorM32 BGC三轴增稳云台驱动下载
  11. Matlab科研绘图颜色补充(特别篇5)—176种美国传统颜色
  12. java pdf转jpg字体问题_java生成pdf字体的坑
  13. 基因型填充中的phasing究竟是什么
  14. 从零开始学习Openwrt教程
  15. 成功实现有线路由器和无线路由器连接上网
  16. 《狼图腾》--农耕民族与游牧民族的冲突
  17. 「TCG 规范解读」初识嵌入式和工业工作组
  18. 求解矩阵A的满秩分解的一般方法
  19. 5611AH 数码管 引脚图
  20. python爬虫(1)-百度新闻首页抓取

热门文章

  1. springboot支持返回数据为xml格式
  2. matlab中矩阵的logical函数,Matlab中的logical
  3. N4120拆机和装固态硬盘并迁移原版系统步骤
  4. 初学备忘:scanf返回值被忽略的原因及其解决方法
  5. 算法18--合并两个字典
  6. 《基于剪切波变换的人脸表情识别》笔记
  7. 亚马逊、速卖通、ebay、wish、Lazada、Shopee是如何自己养国外买家账号测评的?
  8. SAP 如何在选择画面中创建动态的select-options <转载>
  9. 介绍一种在MATLAB中获取股市数据的方法
  10. Gradle Transform 详解