Xilinx FPGA:vivado实现串口的接收端

补充一些串口里用到的数值的相关知识点

接收端串口时序图:

程序设计:

`timescale 1ns / 1ps
/串口接收端    串行转并行
module uart_rx(input                  sys_clk ,input                  rst_n    ,input                  rx_data   ,  //输入串行数据output    reg[7:0]     uart_data , // 输出并行数据output    reg          rx_done     //数据传输完成结束信号      );parameter         SYSCLK =   50_000_000  ;parameter         Baud   =   115200      ;parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期parameter         MID    =   COUNT/2     ;///产生开始信号(检测下降沿-----二级寄存)reg           rx_reg1     ;reg           rx_reg2     ;wire          start_flag    ;  开始信号reg           rx_flag       ;reg    [3:0]   cnt_bit      ;///0~9reg    [9:0]   cnt          ;///434reg    [7:0]   data_reg     ;always@(posedge sys_clk)if(!rst_n)beginrx_reg1 <= 1 ;  //处于空闲位  数据线上无数据rx_reg2 <= 1 ;  //处于空闲位  数据线上无数据endelsebeginrx_reg1 <= rx_data  ;rx_reg2 <= rx_reg1  ;endassign start_flag = ~rx_reg1 & rx_reg2  ;  //rx_flagalways@(posedge sys_clk )if(!rst_n)rx_flag <= 0 ;else if (start_flag)rx_flag <= 1 ;else if ( cnt_bit == 9 && cnt == MID -1 )rx_flag <= 0 ;elserx_flag <= rx_flag ;cnt 434  always@(posedge sys_clk )if(!rst_n)cnt <= 0;else if ( rx_flag == 1 )beginif ( cnt == COUNT -1) ///一定要减一,如果不减一,实际会计到435次,反算回去波特率就不是115200了cnt <= 0;elsecnt <= cnt +1 ;endelsecnt <= 0 ;/计数器always@(posedge sys_clk )if(!rst_n)cnt_bit <= 0 ;else if ( rx_flag )beginif ( cnt == COUNT -1)beginif(cnt_bit == 9)cnt_bit <= 0 ;elsecnt_bit <= cnt_bit +1 ;endelsecnt_bit <= cnt_bit     ;endelsecnt_bit <= 0 ;[7:0]uart_data/*cnt_bit = 0 起始位cnt_bit = 1-8 数据位cnt_bit = 9 停止位但是  [7:0]uart_data   没有uart[8]所以if ( cnt == MID -1 && cnt_bit > 0 && cnt_bit < 9 )uart_data[cnt_bit -1] <= rx_data ;*/
//    always@(posedge sys_clk )
//          if(!rst_n)
//          uart_data <= 0 ;
//          else if ( rx_flag )begin
//                if ( cnt == MID -1 && cnt_bit > 0 && cnt_bit < 9 )
//                uart_data[cnt_bit -1] <= rx_data ; //这里uart_data是不断随着cnt_bit变化的,只有在第九位的时候才有正确的最终值
//                else
//                uart_data <= uart_data ;
//          end
//          else
//          uart_data <= 0 ;因为这里要让uart_data只在rx_done的时候有值,所以定义一个中间寄存器data_regalways@(posedge sys_clk )if(!rst_n)data_reg <= 0 ;else if ( rx_flag )beginif ( cnt == MID -1 && cnt_bit > 0 && cnt_bit < 9 )data_reg[cnt_bit -1] <= rx_data ; //这里uart_data是不断随着cnt_bit变化的,只有在第九位的时候才有正确的最终值elsedata_reg <= data_reg ;endelsedata_reg <= 0 ;
//  其他赋值方法1
//      always@(posedge sys_clk )
//          if(!rst_n)
//             uart_data <= 0;
//          else if (cnt == MID -1)begin
//             case(cnt_bit)
//             0:  uart_data  <= 0  ;
//             1:  uart_data [0] <= rx_data  ;
//             2:  uart_data [1] <= rx_data  ;
//             3:  uart_data [2] <= rx_data  ;
//             4:  uart_data [3] <= rx_data  ;
//             5:  uart_data [4] <= rx_data  ;
//             6:  uart_data [5] <= rx_data  ;
//             7:  uart_data [6] <= rx_data  ;
//             8:  uart_data [7] <= rx_data  ;
//             9:  uart_data  <= uart_data  ;  ///停止位的时候数据传完,保持
//             endcase
//             end
//           else
//             uart_data  <= uart_data  ;//   其他赋值方法2
//    always@(posedge sys_clk )
//          if(!rst_n)
//          uart_data <= 0 ;
//          else if (cnt == MID -1 && cnt_bit > 0 && cnt_bit < 9)
//               uart_data <= {rx_data,uart_data[7:1]} ;
//          else
//               uart_data <= uart_data ;给uart_data赋值always@(posedge sys_clk )if(!rst_n)     uart_data <= 0 ;   else if (rx_flag)beginif (cnt_bit == 9 && cnt == MID/4 -1)uart_data <= data_reg ;elseuart_data <= uart_data ;endelseuart_data <= uart_data ; 可以保持到下一个数据到来uart_data <= 0 ;  只保持在rx_done处于高电平的时候/rx_donealways@(posedge sys_clk )if(!rst_n)           rx_done <= 0 ;else if (rx_flag)beginif ( cnt_bit == 9 && cnt == MID/2 -1)rx_done <= 1 ;elserx_done <= 0 ;       endelserx_done <= 0 ;  endmodule

仿真程序

`timescale 1ns / 1ps
module test_bench(  );reg                  sys_clk    ;reg                  rst_n      ;reg                  rx_data    ;  //输入串行数据wire[7:0]            uart_data  ; // 输出并行数据wire                 rx_done    ;//数据传输完成结束信号      parameter         SYSCLK =   50_000_000  ;parameter         Baud   =   115200      ;parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期parameter         MID    =   COUNT/2     ;initialbeginsys_clk = 0 ;rst_n   = 0 ;#10rst_n   = 1 ;endalways #1 sys_clk = ~sys_clk ; //2nsinitialbeginuart_out (8'h34);uart_out (8'hef);uart_out (8'h98);uart_out (8'h70);uart_out (8'h14);end//任务函数task     uart_out   ;input      [7:0]    DATA   ;beginrx_data = 1 ;///空闲位初始#20 rx_data = 0 ;///起始位///传输1bit的计时次数*1周期时间=总时间#(COUNT*2)  rx_data = DATA[0] ;///数据位第一位#(COUNT*2)  rx_data = DATA[1] ;///数据位第二位#(COUNT*2)  rx_data = DATA[2] ;#(COUNT*2)  rx_data = DATA[3] ;#(COUNT*2)  rx_data = DATA[4] ;#(COUNT*2)  rx_data = DATA[5] ;#(COUNT*2)  rx_data = DATA[6] ;#(COUNT*2)  rx_data = DATA[7] ;#(COUNT*2)  rx_data = 1       ;#(COUNT*2)                    ;//停止位也需要时间endendtaskuart_rx  uart_rx1(.    sys_clk    (sys_clk  )   ,.    rst_n      (rst_n    )   ,.    rx_data    (rx_data  )   ,  //输入串行数据.    uart_data  (uart_data)   ,  // 输出并行数据.    rx_done    (rx_done  )      //数据传输完成结束信号      );
endmodule

仿真波形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】相机标定源码笔记-通用工具函数类

提供了一系列工具函数及处理方法&#xff0c;主要用于图像处理、点云处理和文件操作等领域。以下是对关键函数的简要解析&#xff1a; 点云处理与平面拟合 包含两个重载函数&#xff0c;一个接受Eigen矩阵类型的点集&#xff0c;另一个接受pcl::PointCloud<pcl::PointXYZ>…

【Java中导出Excel导出多个sheet页】

Java中导出Excel导出多个sheet页 序言如何处理多个sheet页的导出期间遇到了一个sheet页相关的问题&#xff0c;以及解决办法多sheet页导出遇到&#xff0c;第二个sheet页的标题名称会把第一个的覆盖的问题 结语 序言 在日常工作中经常有导出数据文件的需求&#xff0c;避免不了…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统&#xff0c;下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

电机驱动知识点总结

一、直流电机入门基础知识 1.直流电机原理 下面是分析直流电机的物理模型图。其中&#xff0c;固定部分有磁铁&#xff0c;这里称作主磁极&#xff1b;固定部分还有电刷。转动部分有环形铁心和绕在环形铁心上的绕组。(其中 2 个小圆圈是为了方便表示该位置上的导体电势或电流…

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理&#xff1a;高性能&#xff08;一&#xff09;从数据库性能优化系统概述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要&#xff1a;本章节介绍查询端到端处理的…

基于STM32F103最小系统板和DL-LN33 2.4G通信 ZigBee无线串口自组网采集温湿度

文章目录 前言一、组网概述二、产品特性三、电气特性四、引脚配置五、UART通信协议5.1 UART参数5.2 包分割5.3 端口5.4 举例通信5.4.1 一个节点给另一个节点发送数据5.4.2 一个节点给另一个节点的内部端口发送数据5.4.3 一个节点给自己的内部端口发送数据5.4.4 不推荐的数据传输…

气膜体育馆的安装流程—轻空间

随着人们对健康生活和高品质运动环境的追求&#xff0c;气膜体育馆因其独特的优点而逐渐受到青睐。轻空间将详细介绍气膜体育馆的安装流程&#xff0c;从实地勘测到检测&#xff0c;再到最终的清理现场&#xff0c;每一步都至关重要&#xff0c;确保体育馆的安全性和功能性。 一…

内网穿透与异地组网强强联合,这款工具屌爆了!!!

在数字化飞速发展的今天&#xff0c;远程访问的需求日益增长&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;远程网络连接的稳定性和安全性往往是我们关注的焦点。节点小宝作为一款创新型的远程管理工具&#xff0c;凭借其使用简单&#xff0c;高速…

RabbitMQ WEB管理端介绍

页面功能概览 Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。 1. Overview(概述) 主要分为三部分 1.1 Queued messages&#xff08;所有队列的消息情况&#xff09; Ready&#xff1a;待消费的消息总数Unacked&#xff1a;待应…

实时美颜技术解析:视频美颜SDK如何改变直播行业

实时美颜技术的出现&#xff0c;尤其是视频美颜SDK的应用&#xff0c;正逐渐改变着直播行业的生态。 一、实时美颜技术的原理 实时美颜技术利用人工智能和图像处理算法&#xff0c;对视频中的人物面部进行优化和修饰。该技术通常包含以下几个步骤&#xff1a; 1.人脸检测和识…

OpenGL->OpenGL环境搭建和配置

OpenGL概述 OpenGL&#xff1a;用于渲染2D、3D矢量图形的APIGLEW&#xff1a;是一个跨平台的C/C库&#xff0c;能够使用更高版本的OpenGL扩展特性GLFW&#xff1a;创建和管理OpenGL上下文&#xff0c;管理渲染窗口&#xff0c;处理输入事件&#xff0c;更轻量GLUT&#xff1a;…

视频格式转换方法:如何使用视频转换器软件转换视频

众所周知&#xff0c;目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如&#xff0c;如果不先将其转换为 MP4、MOV 或 M4V 文件&#xff0c;AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…

解决微信小程序使用textarea输入框 type=“textarea“ 文本输入限制问题

出现的问题 type"textarea" 这个限制 微信小程序使用textarea , 输入字数大于140 时就输入不进去了 加入这个就解决了 maxlength"-1" <u-inputv-model"queryParams.orderIdTxt"border"true":focus"true":auto-height&q…

【知识学习】阐述Unity3D中Stencil的概念及使用方法示例

在Unity3D中&#xff0c;Stencil&#xff08;模板&#xff09;是一种高级的图形渲染技术&#xff0c;它允许开发者对渲染过程进行精细控制。Stencil Buffer是附加在颜色缓冲区和深度缓冲区之外的另一个缓冲区&#xff0c;它可以用来存储每个像素是否应该被渲染的信息。 Stenci…

自动化物流控制系统WCS应用与异常处理

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 WCS的定义与作用&#xff1a; 物流仓储设备…

探索AIGC治愈系创作:Stable Diffusion 带你轻松复刻某书爆款动漫卡通文案!

hello&#xff0c;大家好我是安琪&#xff01; 情感治愈类一直是受众群体很高非常火爆的赛道&#xff0c;安琪也关注到在某书平台上&#xff0c;漫画治愈类风格的内容也是非常的受欢迎。先来看看以下一些案例 看看这几个账号内容的质量就可以看出该部分内容是很受欢迎的&#x…

论文阅读Vlogger: Make Your Dream A Vlog

摘要 论文介绍了一个名为“Vlogger”的通用人工智能系统&#xff0c;它能够根据用户的描述生成分钟级的视频博客&#xff08;vlog&#xff09;。与通常只有几秒钟的短视频不同&#xff0c;vlog通常包含复杂的故事情节和多样化的场景&#xff0c;这对现有的视频生成方法来说是一…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代&#xff0c;我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具&#xff0c;帮您快速识别并删除重复的文档、音乐、视频和照片&#xff0c;让您的计算环境更加清洁、有序。 精准查找&#xff0c;一键删除 DupI…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

Todesk远程连接Ubuntu卡100%,以及小窗口打不开

Todesk远程连接Ubuntu卡100%&#xff0c;以及小窗口打不开 使用Todesk远程连接Ubuntu一直卡100%进不去还有todesk里的小悬浮窗打开就会小时&#xff08;小下拉框会消失&#xff09; 使用Todesk远程连接Ubuntu一直卡100%进不去 还有todesk里的小悬浮窗打开就会小时&#xff08;小…