ZYNQ_project:uart(odd,even)

概念:

UART(Universal Asynchronous Receiver-Transmitter):即通用异步收发器,是一种通用串行数据总线,用于异步通信。一般UART接口常指串口。

UART在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。

单工通信:数据只能沿一个方向传输。

半双工通信:数据可以沿两个方向传输,但需要分时进行。

全双工通信:数据可以同时进行双向传输。

同步通信:带时钟端口的数据传输。

异步通信:没有时钟端口,发送方和接收方使用各自的时钟控制数据的收发过程。

常见串行通信接口:

 模块框图:

时序图:

 

代码:

// uart的接收模块,要求波特率可调,回环实验
// 完成回环实验后加入校验位
// 然后加入led与蜂鸣器的控制模块
`include         "para.v"
module rx (input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire                rx          ,output      reg     [7:0]       po_data     , // port_outputoutput      reg                 po_flag     
);// parameterparameter   MAX_BPS_CNT = `CLOCK/`BPS   ,//434 ,MAX_BIT_CNT = `BIT_CHACK    ;//10   ; localparam  RX_MOD      = 1'b1          ,CHECK_MOD   = `EVEN         ;// reg signal definereg                 rx_r1    ;reg                 rx_r2    ;reg     [31:0]      cnt_bps  ;reg                 work     ;reg     [3:0]       cnt_bit  ;reg     [7:0]       data_reg ;reg                 check    ;reg                 check_reg;// wire signal definewire                nege    ;/*******************************************************************/// // reg signal define// reg                 rx_r1   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rx_r1 <= 1'b1 ;elserx_r1 <= rx ;end// reg                 rx_r2   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rx_r2 <= 1'b1 ;elserx_r2 <= rx_r1 ;end// reg                 work    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) work <= 1'b0 ;else if(nege)work <= 1'b1 ;else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1))) // 这俩条件可以用end_cnt_XXX来代替,组合逻辑赋work <= 1'b0 ;else work <= work ;end// reg     [31:0]      cnt_bps ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_bps <= 32'd0 ;else if(work && (cnt_bps == (MAX_BPS_CNT - 1)))cnt_bps <= 32'd0 ;else if(work)cnt_bps <= cnt_bps + 1'b1 ;else cnt_bps <= 32'd0 ;end// reg     [3:0]       cnt_bit ; 应该会归0always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_bit <= 4'd0 ;else if (work && (cnt_bps == (MAX_BPS_CNT - 1) && cnt_bit == (MAX_BIT_CNT - 1)))cnt_bit <= 4'd0 ;else if (work && (cnt_bps == (MAX_BPS_CNT - 1)))cnt_bit <= cnt_bit + 1'b1 ;else if(work)cnt_bit <= cnt_bit ;else cnt_bit <= 8'd0 ;end// reg     [7:0]       data_reg;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) data_reg <= 8'd0 ;else if(work && cnt_bps == (MAX_BPS_CNT/2)) begin // 采样,采集数据的时刻case (cnt_bit)0 : data_reg <= 8'd0 ;1 : data_reg[cnt_bit - 1] <= rx_r2 ;2 : data_reg[cnt_bit - 1] <= rx_r2 ;3 : data_reg[cnt_bit - 1] <= rx_r2 ;4 : data_reg[cnt_bit - 1] <= rx_r2 ;5 : data_reg[cnt_bit - 1] <= rx_r2 ;6 : data_reg[cnt_bit - 1] <= rx_r2 ;7 : data_reg[cnt_bit - 1] <= rx_r2 ;8 : data_reg[cnt_bit - 1] <= rx_r2 ;default: data_reg <= data_reg ;endcaseend elsedata_reg <= data_reg ;end// // wire signal define// wire                nege    ;assign  nege = ~rx_r1 && rx_r2 ;// reg                 check    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) check <= 1'b0 ;else if(CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))check <= ~^data_reg ;else if(~CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))check <= ^data_reg ;    else check <= check ;end  // reg                 check_reg;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) check_reg <= 1'b0 ;else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT /2)))check_reg <= rx_r2 ;else check_reg <= check_reg ;end  // output      reg     [7:0]       po_data     , // port_outputalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) po_data <= 8'd0 ;else if((check == check_reg) && (cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))po_data <= data_reg ;else if(RX_MOD)po_data <= po_data ;else po_data <= 8'd0 ;end// output      reg                 po_flag   always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) po_flag <= 8'd0 ;else if((check == check_reg) && ((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))) po_flag <= 1'b1 ;else po_flag <= 8'd0 ;end  endmodule
// uart的数据发送模块。停止位 1bit
`include         "para.v"
module  tx(input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire    [7:0]       pi_data     ,input       wire                pi_flag     ,output      reg                 tx         
);// parameterparameter   MAX_BPS_CNT = `CLOCK/`BPS   ,MAX_BIT_CNT = `BIT_CHACK + 1;localparam  CHECK_MOD   = `EVEN         ;// reg signal definereg     [7:0]       data_reg ;reg                 work     ;reg     [31:0]      cnt_bps  ; reg     [3:0]       cnt_bit  ; /********************************************************************/// // reg signal define// reg     [7:0]       data_reg ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) data_reg <= 8'd0 ;else if(pi_flag)data_reg <= pi_data ;else data_reg <= data_reg ;end// reg                 work     ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) work <= 1'b0 ;else if(pi_flag)work <= 1'b1 ;else if(cnt_bps == (MAX_BPS_CNT - 1) && cnt_bit == (MAX_BIT_CNT - 1))work <= 1'b0 ;else work <= work ;end// reg     [31:0]      cnt_bps  ; always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_bps <= 32'd0 ;else if((work && (cnt_bps == (MAX_BPS_CNT - 1))) || (work && (cnt_bit == (MAX_BIT_CNT - 1)) && cnt_bps == (MAX_BPS_CNT - 1)))cnt_bps <= 32'd0 ;else if(work)cnt_bps <= cnt_bps + 1'b1 ;else cnt_bps <= 32'd0 ;end// reg     [3:0]       cnt_bit  ; always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_bit <= 4'd0 ;else if(work && (cnt_bps == (MAX_BPS_CNT - 1)) && cnt_bit == (MAX_BIT_CNT - 1))cnt_bit <= 4'd0 ;else if(work && (cnt_bps == (MAX_BPS_CNT - 1)))cnt_bit <= cnt_bit + 1'b1 ;else if(work)cnt_bit <= cnt_bit ;else cnt_bit <= 4'd0 ;end// output      reg                 tx          always @(*) beginif(~sys_rst_n)tx = 1'b1 ;else if(work) begincase (cnt_bit)4'd0:   tx = 1'b0 ; 4'd1:   tx = data_reg[cnt_bit - 1] ; 4'd2:   tx = data_reg[cnt_bit - 1] ; 4'd3:   tx = data_reg[cnt_bit - 1] ; 4'd4:   tx = data_reg[cnt_bit - 1] ; 4'd5:   tx = data_reg[cnt_bit - 1] ; 4'd6:   tx = data_reg[cnt_bit - 1] ; 4'd7:   tx = data_reg[cnt_bit - 1] ; 4'd8:   tx = data_reg[cnt_bit - 1] ; 4'd9:   begin if(CHECK_MOD)tx = ~^data_reg ;else tx = ^data_reg ;enddefault: tx = 1'b1 ;endcaseend else tx = 1'b1 ;end
endmodule

 

module  top(input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire                rx          ,output      wire                tx          
);// 例化间连线 Wiring between instantiationswire                clk_100Mhz  ;wire                clk_50Mhz   ;wire                locked      ; wire                rst_n       ; assign              rst_n   = sys_rst_n && locked ;wire    [7:0]       po_data     ;wire                po_flag     ;
pll pll_inst(.clk_in1          ( sys_clk       ) ,.resetn           ( sys_rst_n     ) ,.clk_out1         ( clk_100Mhz    ) ,.clk_out2         ( clk_50Mhz     ) ,.locked           ( locked        ) );rx rx_inst(.sys_clk        ( clk_50Mhz     ) ,.sys_rst_n      ( rst_n         ) ,.rx             ( rx            ) ,.po_data        ( po_data       ) ,.po_flag        ( po_flag       )  
);tx tx_inst(.sys_clk        ( clk_50Mhz     ) ,.sys_rst_n      ( rst_n         ) ,.pi_data        ( po_data       ) ,.pi_flag        ( po_flag       ) ,.tx             ( tx            )
);
endmodule

 

仿真:

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

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

相关文章

采用connector-c++ 8.0操作数据库

1.下载最新的Connector https://dev.mysql.com/downloads/connector/cpp/&#xff0c;下载带debug的库。 解压缩到本地&#xff0c;本次使用的是带debug模式的connector库&#xff1a; 注&#xff1a;其中mysqlcppconn与mysqlcppconn8的区别是&#xff1a; 2.在cmakelist…

【2018年数据结构真题】

方法一 给定一个含n(n>1)个整数的数组&#xff0c;请设计一个在时间上尽可能高效的算法&#xff0c;找出数组中未出现的最小正整数。例如&#xff0c;数组{-5&#xff0c;3&#xff0c;2&#xff0c;3}中未出现的最小正整数是1&#xff1b;数组{1&#xff0c;2&#xff0c;…

算法刷题-动态规划2

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…

常见的8个JMeter压测问题

为什么在JMeter中执行压力测试时&#xff0c;出现连接异常或连接重置错误&#xff1f; 答案&#xff1a;连接异常或连接重置错误通常是由于服务器在处理请求时出现问题引起的。这可能是由于服务器过载、网络故障或配置错误等原因导致的。 解决方法&#xff1a; 确定服务器的…

【高级网络程序设计】Week3-2 Servlet

一、 What are servlets? 1. 定义 &#xff08;1&#xff09;Servlets are Java’s answer to CGI&#xff1a; programs that run on a web server acting as middle layer between HTTP request and databases or other applications.Used for client requests that cann…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路&#xff1a; class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值&#xff0c;除数是1&#xff0c;返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

羊大师提示,羊奶都有哪些惊人功效?

羊奶不仅是一种美味的健康饮品&#xff0c;在近年来备受瞩目的的健康圈子里&#xff0c;羊奶还被赋予了更多的功效&#xff0c;成为一种备受推崇的保健品。羊奶不但富含营养&#xff0c;而且还有着非常多的益处&#xff0c;它能够用来美容、保健&#xff0c;甚至还可以治疗某些…

C语言基本算法之选择排序

目录 概要&#xff1a; 代码如下 运行结果如下 概要&#xff1a; 它和冒泡排序一样&#xff0c;都是把数组元素按顺序排列&#xff0c;但是方法不同&#xff0c;冒泡排序是把较小值一个一个往后面移&#xff0c;选择排序则是直接找出最小值&#xff0c;可以这个说&#xff…

【OpenCV实现图像:OpenCV利用Python创作热力图】

文章目录 概要读取图像图像灰度化**像素化效果**小结 概要 热力图是一种强大的统计图表&#xff0c;通过对数据进行色彩映射&#xff0c;直观展示了数据分布的热度和密度。在绘制热力图时&#xff0c;关键在于指定颜色映射的规则&#xff0c;这决定了图中不同数值的呈现方式。…

【React-Router】路由导航

1. 概念 路由系统中的多个路由之间需要进行路由跳转&#xff0c;并且在跳转的同时有可能需要传递参数进行通信。 2. 声明式导航 // /page/Login/index.jsimport { Link } from react-router-dom const Login () > {return <div>登录页{/* 解析成 a 链接 */}<Li…

利用ros实现单片机通讯(转载)

我觉得如果使用这个人的micro_ros通信协议&#xff0c;就不用再去Ubuntu或者Windows上面自己写驱动程序了&#xff0c; 利用micro_ros实现esp32与ros2的通讯 Tianci ​ 天津大学 工学博士 参考&#xff1a;https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…

04 后端增删改查【小白入门SpringBoot + Vue3】

项目笔记&#xff0c;教学视频来源于B站青戈 https://www.bilibili.com/video/BV1H14y1S7YV 保证前面的都功能都实现后&#xff0c;接着往下走。 查 分页 接下来&#xff0c;实现前端页面分页功能。 前端分页组件 打开elementplus官网&#xff0c;找到合适的分页组件&…

软件测试工具常用的都有哪些

软件测试工具是用于辅助软件测试的软件工具&#xff0c;可以帮助测试人员执行测试用例、记录测试结果、跟踪缺陷状态等&#xff0c;提高测试效率和质量。以下是一些常见的软件测试工具&#xff1a; 一、AutoRunner自动化测试工具 AutoRunner(简称AR&#xff09;是国内自主研发…

python使用selenium webDriver时 报错

可能原因和解决&#xff1a; 1. python 解释器 ----> 设置 2. 浏览器版本 与 浏览器驱动版本不一致 ----> 安装同一版本的 (下载chromedriver | 谷歌驱动更高版本的测试版) 参考&#xff1a;Python使用Selenium WebDriver的入门介绍及安装教程-CSDN博客 Selenium安…

企业网盘哪家好?值得信赖的品牌推荐

企业网盘可谓是当下热门的企业服务之一&#xff0c;市面上也出现了非常多企业网盘工具。那么&#xff0c;企业网盘哪家好&#xff1f;哪个品牌更值得信赖呢&#xff1f; 企业网盘哪家好&#xff1f; Zoho Workdrive企业网盘一定榜上有名&#xff0c;Zoho Workdrive企业网盘是著…

IDEA JRebel安装使用教程

1、下载插件 版本列表&#xff1a;https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions 下载&#xff1a;JRebel and XRebel 2022.4.1 这里下载2022.4.1版本&#xff0c;因为后续新版本获取凭证会比较麻烦。下载完成会是一个压缩包。 2、安装 选择第一步…

微软Copilot即将对大陆开放,一起来看看都有什么好用的功能

微软发布了Copilot&#xff0c;12月1日起对大陆用户开放&#xff0c;以下是Copilot的11个新功能&#xff0c;你一定不想错过&#xff1a;1. PowerPoint&#xff1a; 将Word文档转换为演示文稿。从文件中快速创建演示文稿。通过关键幻灯片总结冗长的演示文稿。使用提示添加新的…

2024贵州大学计算机考研分析

24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院&#xff08;贵州大学省级示范性软件学院&#xff09;位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院&#xff08;软件学院&#xff09;自1972年创办计算机软件本科专业开始&#xff0c;至今已有…

cadence layout lvs时出现error

Error&#xff1a;Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下&#xff1a; cadence layout lvs时出现error-CSDN博客

Unity 头顶图文字性能优化

如图&#xff1a;常规的排版&#xff0c;会有很多Batches。这是优化后的Batches只有3。 常用解决方案&#xff1a; 1、创建两个Canvas&#xff0c;一个放所有文本Text&#xff0c;一个放所有Image。但这里有会有两个问题&#xff1a;一旦文字夹在两个Image中间&#xff0c;还有…