FPGA通过UART协议发送数据

实现功能:ISSP输入需要通过串口发送出去的数据,然后通过按下 AC620 开发板上的按键来控制 FPGA 将待发送的数据发送出去,并在串口助手中查看 PC 端接收到的数据。

uart协议:

板内、板间或者下位机与上位机之间进行数据的发送与接收,需要双方共同遵循一定的通信协议来保证数据传输的正确性。 通用异步收发传输器(UART):在数据发送时将并行数据转换成串行数据来传输,在数据接收时将接收到的串行数据转换成并行数据,可以实现全双工传输和接收。

只使用一根数据线,因此使用串行数据,且要求FPGA发送/接收速率=PC端接收/发送速率(串口调试助手)。

波特率是主从端约定的通信速率,每位数据变换(长度)固定,则需保证Clk信号稳定,间隔为波特率,常用9600bps,即频率为9600Hz

UART发送一个字节时序图:

起始位+八位数据(高低电平均可)+停止位

2个2选1多路器——考虑优先级

bps_clk产生,开始计数就输出高电平,因为使能刚开始就是高电平,等计数到最大值则延迟一个周期,为了提高响应速度

uart_byte_tx 

module uart_byte_tx(Clk,Rst_n,data_byte,baud_set,send_en,Rs232_tx,Tx_done,uart_state);input Clk;//50Minput Rst_n;input [7:0]data_byte;//待传输8bit数input [2:0]baud_set;//波特率设置,常用5种,最少需要3位二进制input send_en;output reg Rs232_tx;//信号输出output reg Tx_done;//发送完成信号,一个周期高电平output reg uart_state;//发送状态reg [15:0]bps_DR;//不同波特率时钟计数最大值reg [7:0]r_data_byte;//传输数据寄存,保证稳定reg [15:0]div_cnt;//分频计数器reg [3:0]bps_cnt;reg bps_clk;localparam Start_bit = 1'b0;localparam Stop_bit = 1'b1;//波特率时钟生成模块 always@(posedge Clk or negedge Rst_n)//设置不同波特率的计数值if(!Rst_n)bps_DR <= 16'd5207;//默认9600bpselse begincase(baud_set)3'd0: bps_DR <= 16'd5207;//9600bps3'd1: bps_DR <= 16'd2603;//19200bps3'd2: bps_DR <= 16'd1301;//38400bps3'd3: bps_DR <= 16'd867;//57600bps3'd4: bps_DR <= 16'd433;//115200bpsdefault: bps_DR <= 16'd5207;endcaseendalways@(posedge Clk or negedge Rst_n)//利用计数器生成波特率时钟if(!Rst_n)div_cnt <= 16'b0;else if(uart_state == 1'b1)beginif(div_cnt == bps_DR)div_cnt <= 16'b0;elsediv_cnt <= div_cnt + 1'b1;endalways@(posedge Clk or negedge Rst_n)if(!Rst_n)bps_clk <= 1'b0;else if(div_cnt == 16'd1)//一开始传送数据就高电平,周期不变bps_clk <= 1'b1;else  bps_clk <= 1'b0;//不是复位、开始计数情况下的值要说明//数据输出模块设计always@(posedge Clk or negedge Rst_n)//对波特率时钟计数,确定数据发送循环状态if(!Rst_n)      bps_cnt <= 4'd0;else if(bps_cnt == 4'd11)//如果以tx_done高电平为条件,那么bps_cnt会保持两个周期的11,以11为条件,则与tx_done同时进行,只有一个周期bps_cnt <= 4'd0;else if(bps_clk)bps_cnt <= bps_cnt + 1'b1;always@(posedge Clk or negedge Rst_n)//传送结束信号if(!Rst_n)Tx_done <= 1'b0;else if(bps_cnt == 4'd11)//位宽为4的十进制表示Tx_done <= 1'b1;elseTx_done <= 1'b0;always@(posedge Clk or negedge Rst_n)//数据传输状态信号,正常传输时为高电平if(!Rst_n)uart_state <= 1'b0;else if(send_en)//按键按下为使能信号,一个周期高电平uart_state <= 1'b1;//数据传送为高电平else if(bps_cnt == 4'd11)uart_state <= 1'b0;//传送结束为低电平always@(posedge Clk or negedge Rst_n)if(!Rst_n)r_data_byte <= 8'd0;else if(send_en)//有条件需要使用ifr_data_byte <= data_byte;//数据传输状态控制模块always@(posedge Clk or negedge Rst_n)if(!Rst_n)Rs232_tx <= 1'd1;//串口未发送状态默认为高电平else begincase(bps_cnt)4'd0: Rs232_tx <= 1'b1;4'd1: Rs232_tx <= Start_bit;//低电平开始4'd2: Rs232_tx <= r_data_byte[0];4'd3: Rs232_tx <= r_data_byte[1];4'd4: Rs232_tx <= r_data_byte[2];4'd5: Rs232_tx <= r_data_byte[3];4'd6: Rs232_tx <= r_data_byte[4];4'd7: Rs232_tx <= r_data_byte[5];4'd8: Rs232_tx <= r_data_byte[6];4'd9: Rs232_tx <= r_data_byte[7];4'd10: Rs232_tx <= Stop_bit;//高电平结束default: Rs232_tx <= 1'b1;endcaseendendmodule

uart_byte_tx_tb 

`timescale 1ns/1ns
`define clk_period 20
module uart_byte_tx_tb;reg Clk;reg Rst_n;reg [7:0]data_byte;reg [2:0]baud_set;reg send_en;wire Rs232_tx;wire Tx_done;wire uart_state;uart_byte_tx uart_byte_tx(.Clk(Clk),.Rst_n(Rst_n),.data_byte(data_byte),.baud_set(baud_set),.send_en(send_en),.Rs232_tx(Rs232_tx),.Tx_done(Tx_done),.uart_state(uart_state));initial Clk = 1'b1;always#(`clk_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;data_byte = 8'd0;baud_set = 3'd4;send_en = 1'd0;#(`clk_period*20 + 1'b1)Rst_n = 1'b1;#(`clk_period*50)data_byte = 8'haa;send_en = 1'd1;#`clk_period;send_en = 1'd0;@(posedge Tx_done)#(`clk_period*5000);data_byte = 8'h55;send_en = 1'd1;#`clk_period;send_en = 1'd0;@(posedge Tx_done)#(`clk_period*5000);$stop;end
endmodule 

仿真波形

  仿真波形与预期一致,设计顶层文件,进行板级验证

uart_byte_tx_top

module uart_byte_tx_top(Clk,Rst_n,Rs232_tx,key_in0,led
);input Clk;input Rst_n;input key_in0;output Rs232_tx;output led;wire send_en;wire [7:0]data_byte;wire key_flag0;wire key_state0;assign send_en = key_flag0 & !key_state0;//按键消抖检测成功&按键状态为低电平,为一个周期高电平,按下~使能~传送数据uart_byte_tx uart_byte_tx(//加入底层模块.Clk(Clk),.Rst_n(Rst_n),.data_byte(data_byte),.baud_set(3'd4),.send_en(send_en),.Rs232_tx(Rs232_tx),.Tx_done(),//不使用.uart_state(led)//未发送状态0,0led亮);//加入按键模块key_filter key_filter0(//复用设计好的代码,将代码保存在当前工程rtl下,例化.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in0),.key_flag(key_flag0),//作为控制信号.key_state(key_state0)//作为控制信号);issp issp(.probe(),.source(data_byte));
endmodule

小梅哥11——UART串口发送模块设计相关推荐

  1. UART串口发送模块设计Verilog

    1.知识点 1.1 UART通信协议实现 定义 UART (Universal Asynchronous Receiver and Transmitter)即通用异步接收发送器,是一种通用的串行数据总 ...

  2. FPGA学习之串口发送模块设计与验证

    FPGA学习之串口发送模块设计与验证 1.实验目的: 实现一个串口输出,通过上位机PC查看接收到的是否是串口发送的数据. 2.实验介绍: 学习UART通信原理及其硬件电路设计,使用FPGA实现UART ...

  3. 小梅哥FPGA学习笔记——串口发送模块

    串口发送模块 串口发送模块结构框图 顶层模块 串口发送模块结构框图 发送模块具体实现结构框图如图所示,按照图片的内容一步步实现发送模块的设计. DR_LUT查找表的作用是选择不同波特率时,得到对应波特 ...

  4. 基于FPGA的UART异步串行通信发送模块设计与实现

    欢迎关注微信公众号"FPGA科技室",更多内容请关注 下一篇文请点击下列链接(接收模块设计) [基于FPGA的UART异步串行通信接收模块设计与实现] 本文发送模块: 在电子系统中 ...

  5. UART 异步串行通信发送模块设计与实现

    UART 异步串行通信发送模块设计与实现 串口发送模块接口设计 注意:在每一次设计端口时,我们都要求可以随时控制该模块开始和结束,因此在设计每一个模块时,务必要加模块的使能端口(EN)和模块结束端口( ...

  6. 串口发送模块uart_tx详解

    1. 原理介绍 本文是学习小梅哥串口模块教程后的整理总结. 用于数据接收与发送的常用通信协议: UART(通用异步收发传输器).I2C(集成电路总线).USB2.0/3.0(通用串行总线).SPI(串 ...

  7. esp32的uart串口发送16进制通信指令调用实例

    esp32的uart串口发送16进制通信指令调用实例 简介 最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正.比较愚笨,过程中踩了很多坑, ...

  8. 单片机:11.UART串口通信

    原文地址:https://blog.csdn.net/Qingzhusshuiyun/article/details/78236798 通信按照传统的理解就是信息的传输与交换.对于单片机来说,通信则与 ...

  9. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  10. 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性

    前言 本文从UART串口型WIFI模组的"透传"概念的本质入手,解释了"透传"的实际机理,点出了UART串口型模组的"透传",其目的是为了避 ...

最新文章

  1. 使用python抓取百度漂流瓶妹纸照片
  2. swift学习一:介绍,开发文档下载
  3. 选择IT事业,意味着终身学习
  4. 这是我用Microsoft Word 2010 直接发布的测试用博客
  5. 服务治理之Eureka--基本介绍
  6. 利用 Domino V8 新特性开发 Mashup 应用(转载)
  7. android设置window背景颜色,Android WindowManager 背景暗化
  8. 2017省夏令营Day7
  9. 7. 锁定框架(The Locking Framework)
  10. MMUlinux内核开启
  11. 基于AT89C51单片机的电子万年历PROTEUS仿真设计
  12. 关于分布函数连续性的运用
  13. opencv面试知识点
  14. win10更新失败导致电脑不能开机怎么办
  15. PS2023和2022版本保姆级安装教程【博主亲测】
  16. CSOL NST1007 V1.0 完整汉化版发布
  17. 谈谈AssetStore及其脱离Unity下载方法
  18. 非参数估计:核密度估计KDE
  19. 关于不使用firefly补丁对系统进行美化的探讨(转)
  20. form表单中的 action=./? 是什么意思

热门文章

  1. 庭审公开网分享(如有违规通知博主,立马下架)
  2. 如何结合自动化工具和设备及传统的手段进行网络安全分析、检测和响应
  3. 扯淡——《参观苏州农交会(二)》
  4. for循环嵌套:一百块钱买一百斤水果:苹果5元1斤,梨3元1斤,西瓜1元3斤。用100元,买100斤果,问苹果、梨、西瓜各买多少斤?
  5. 如何拯救商业wifi的流量困境
  6. 高级API之file类的使用
  7. 比起妹子,程序员更喜欢这种类型的键盘!最后一个大家都用过!
  8. c++ 原子操作 赋值_C++11 多线程中原子类型与原子操作
  9. R语言survival包的Surv函数创建生存对象、survfit函数公式中增加一个因子变量来获得该变量不同水平下的生存信息(率)、plot函数可视化生存曲线、使用lty参数设置不同水平生存曲线的类型
  10. Windows网络环境下网络规划需要掌握的计算方法(三)