小梅哥11——UART串口发送模块设计
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串口发送模块设计相关推荐
- UART串口发送模块设计Verilog
1.知识点 1.1 UART通信协议实现 定义 UART (Universal Asynchronous Receiver and Transmitter)即通用异步接收发送器,是一种通用的串行数据总 ...
- FPGA学习之串口发送模块设计与验证
FPGA学习之串口发送模块设计与验证 1.实验目的: 实现一个串口输出,通过上位机PC查看接收到的是否是串口发送的数据. 2.实验介绍: 学习UART通信原理及其硬件电路设计,使用FPGA实现UART ...
- 小梅哥FPGA学习笔记——串口发送模块
串口发送模块 串口发送模块结构框图 顶层模块 串口发送模块结构框图 发送模块具体实现结构框图如图所示,按照图片的内容一步步实现发送模块的设计. DR_LUT查找表的作用是选择不同波特率时,得到对应波特 ...
- 基于FPGA的UART异步串行通信发送模块设计与实现
欢迎关注微信公众号"FPGA科技室",更多内容请关注 下一篇文请点击下列链接(接收模块设计) [基于FPGA的UART异步串行通信接收模块设计与实现] 本文发送模块: 在电子系统中 ...
- UART 异步串行通信发送模块设计与实现
UART 异步串行通信发送模块设计与实现 串口发送模块接口设计 注意:在每一次设计端口时,我们都要求可以随时控制该模块开始和结束,因此在设计每一个模块时,务必要加模块的使能端口(EN)和模块结束端口( ...
- 串口发送模块uart_tx详解
1. 原理介绍 本文是学习小梅哥串口模块教程后的整理总结. 用于数据接收与发送的常用通信协议: UART(通用异步收发传输器).I2C(集成电路总线).USB2.0/3.0(通用串行总线).SPI(串 ...
- esp32的uart串口发送16进制通信指令调用实例
esp32的uart串口发送16进制通信指令调用实例 简介 最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正.比较愚笨,过程中踩了很多坑, ...
- 单片机:11.UART串口通信
原文地址:https://blog.csdn.net/Qingzhusshuiyun/article/details/78236798 通信按照传统的理解就是信息的传输与交换.对于单片机来说,通信则与 ...
- 【自学51单片机】11 -- UART串口通信
文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...
- 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性
前言 本文从UART串口型WIFI模组的"透传"概念的本质入手,解释了"透传"的实际机理,点出了UART串口型模组的"透传",其目的是为了避 ...
最新文章
- 使用python抓取百度漂流瓶妹纸照片
- swift学习一:介绍,开发文档下载
- 选择IT事业,意味着终身学习
- 这是我用Microsoft Word 2010 直接发布的测试用博客
- 服务治理之Eureka--基本介绍
- 利用 Domino V8 新特性开发 Mashup 应用(转载)
- android设置window背景颜色,Android WindowManager 背景暗化
- 2017省夏令营Day7
- 7. 锁定框架(The Locking Framework)
- MMUlinux内核开启
- 基于AT89C51单片机的电子万年历PROTEUS仿真设计
- 关于分布函数连续性的运用
- opencv面试知识点
- win10更新失败导致电脑不能开机怎么办
- PS2023和2022版本保姆级安装教程【博主亲测】
- CSOL NST1007 V1.0 完整汉化版发布
- 谈谈AssetStore及其脱离Unity下载方法
- 非参数估计:核密度估计KDE
- 关于不使用firefly补丁对系统进行美化的探讨(转)
- form表单中的 action=./? 是什么意思
热门文章
- 庭审公开网分享(如有违规通知博主,立马下架)
- 如何结合自动化工具和设备及传统的手段进行网络安全分析、检测和响应
- 扯淡——《参观苏州农交会(二)》
- for循环嵌套:一百块钱买一百斤水果:苹果5元1斤,梨3元1斤,西瓜1元3斤。用100元,买100斤果,问苹果、梨、西瓜各买多少斤?
- 如何拯救商业wifi的流量困境
- 高级API之file类的使用
- 比起妹子,程序员更喜欢这种类型的键盘!最后一个大家都用过!
- c++ 原子操作 赋值_C++11 多线程中原子类型与原子操作
- R语言survival包的Surv函数创建生存对象、survfit函数公式中增加一个因子变量来获得该变量不同水平下的生存信息(率)、plot函数可视化生存曲线、使用lty参数设置不同水平生存曲线的类型
- Windows网络环境下网络规划需要掌握的计算方法(三)