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.mzph.cn/news/149843.shtml

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

相关文章

设计模式(二)-创建者模式(2-0)-简单工厂模式

一、简单工厂模式定义 客户端不需要关注创建实例的过程。于是需要通过工厂模式&#xff0c;要把创建对象过程和使用对象进行分离。所以客户端只要使用对象即可&#xff0c;而创建对象过程由一种类来负责&#xff0c;该类称为工厂类。 由于创建实例的方式是在静态方法里实现的…

ICASSP2023年SPGC多语言AD检测的论文总结

文章目录 引言正文AbstractRelated ArticleNo.1: CONSEN: COMPLEMENTARY AND SIMULTANEOUS ENSEMBLE FOR ALZHEIMERSDISEASE DETECTION AND MMSE SCORE PREDICTION特征相关模型结构数据处理结果分析 No.2: CROSS-LINGUAL TRANSFER LEARNING FOR ALZHEIMERS DETECTION FROM SPON…

learning项目总结

Dialog组件&#xff1a;当背景图片是不规则情况&#xff0c;可以把内容写在传递函数中&#xff1a;modalRender{() > ()}&#xff0c;而不是在>后面写 。所有的点击按钮都要加上cursor&#xff1a;pointer&#xff0c;会让用户知道在哪儿点击。对于需要兼容undefined / i…

「Tech初见」对epoll的理解

一、Motivation 通常&#xff0c;操作系统会为每个进程划分一个时间片的&#xff0c;在这个时间片内进程可以合法占有 cpu 进行一些计算任务。并当时间片结束后自动退回至就绪状态待命&#xff0c;等待下一次的调度 但是&#xff0c;有一种情况会使进程提前&#xff08;时间片…

Python服务器的常用指令合集

Python常用指令 激活环境 # 服务器常用指令 source ~/.bashrc source activate torch conda deactivate conda activate torchconda activate machine-learning # 激活 jupyter notebook conda deactivate # 取消激活# shell activate torch&&d:&&cd D:\c…

vue中为什么data属性是一个函数而不是一个对象

面试官&#xff1a;为什么data属性是一个函数而不是一个对象&#xff1f; 一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格…

EDA实验-----4*4矩阵键盘与数码管显示测试(Quartus ‖)

目录 一、实验目的 二、实验仪器设备 三、实验原理 四、实验要求 五、实验步骤 六、实验报告 七、实验过程 1.矩阵键盘按键原理 2.数码管原理 3.分频器代码 4.电路图连接 5.文件烧录 一、实验目的 了解数码管的工作原理&#xff1b;掌握4*4矩阵键盘和数码管显示的编…

STM32框架之按键扫描新思路

STM32框架之按键扫描新思路 引入代码展示思路分析 我们学习了定时器实现毫秒级/秒级任务框架&#xff0c;这期我们基于任务框架学习按键扫描新思路。 引入 在按键扫描的过程中&#xff0c;最重要的一步就是按键消抖&#xff0c;解决的方法最简单粗暴的就是先扫描一次按键状态&…

纵行科技亮相2023汽车物流行业年会,与菜鸟共推ZETag资产管理方案

近日&#xff0c;由中物联汽车物流分会主办的“汽车物流行业年会”在十堰召开。纵行科技受邀亮相&#xff0c;并与菜鸟共推ZETag资产管理方案&#xff0c;助力汽车物流数字化发展。 当前&#xff0c;我国物流业处于恢复性增长和结构性调整的关键期&#xff0c;国务院印发的《…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

中间件安全:Apache 目录穿透.(CVE-2021-41773)

中间件安全&#xff1a;Apache 目录穿透.&#xff08;CVE-2021-41773&#xff09; Apache 的 2.4.49、2.4.50 版本 对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c…

list用stream流转map报key重复

我们在利用java8 Lambda 表达式将集合中对象的属性转成Map时就会出现 Duplicate key xxxx , 说白了也就是key 重复了&#xff01;案例如下&#xff1a; GetterSetterAllArgsConstructorpublic class Student{private String className;private String studentName;public st…

K-Means聚类

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 K-means聚类算法实现 技术细节 选取的数据集是sklearn.datasets里面的鸢尾花数据集&#xff0c;方便最后的算法评价。 根据手肘法&#xff08;即根据SSE代价函数&#xff09;得出最合适的k值。 此处思路是先根据E …

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE &#xff08;含2.0以上版本&#xff09;默认库文件位置的方法。 原创文章&#xff0c;转载请注明出处&#xff1a; 【实用技巧】更改ArduinoIDE默认库文件位置&#xff0c;解放C盘&#xff0c;将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…

Kubernetes Dashboard部署ImagePullBackOff问题处理

通常&#xff0c;出现ImagePullBackOff问题是由于Kubernetes集群无法拉取所需的镜像导致的。解决这个问题的方法通常包括以下步骤&#xff1a; 1. 检查Pod的描述信息&#xff1a; kubectl describe pod/[pod名称] --namespacekubernetes-dashboard 查看Events部分是否有关于…

GOTS认证资讯-7.0版关于环境准则的要求

4.3. 环境准则 4.3.1. 环境管理政策 4.3.1.1. 除GOTS准则外&#xff0c;被认证实体应必须确保其加工或制造阶段&#xff08;包括气体排放、废水排放和废弃物及污泥的处置&#xff09;符合相应国家和当地环境法规的相关要求。 4.3.1.2. 被认证实体应拥有与其业务性质相适应的书面…

【Python百宝箱】图解未来:数据可视化引领智慧决策时代

图表和数据可视化在数据分析中的关键作用 引言&#xff1a; 在现代数据科学中&#xff0c;数据可视化扮演着至关重要的角色。通过图表和可视化工具&#xff0c;我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具&#xff1a;mat…

Windows安装Java环境(OracleJDK)

在下载之前&#xff0c;我们先了解一下java的前世今生 1991年&#xff1a;Java 的前身 Oak 由 James Gosling 和他的团队在 Sun Microsystems 公司开发。1995年&#xff1a;Oak 更名为 Java&#xff0c;并在同年发布。Java 1.0 版本正式推出。1996年&#xff1a;Sun Microsyst…

Vue 2.0中引入的类型检查Flow

1. 认识 Flow Flow 是 facebook 出品的 JavaScript 静态类型检查工具。Vue.js 的源码利用了 Flow 做了静态类型检查&#xff0c;所以了解 Flow 有助于我们阅读源码。 2. 为什么用 Flow JavaScript 是动态类型语言&#xff0c;它的灵活性有目共睹&#xff0c;但是过于灵活的副…

XLua热更新框架原理和代码实战

安装插件 下载Xlua插件&#xff1a;https://github.com/Tencent/xLua 下载完成后&#xff0c;把Asset文件夹下的文件拖入自己的工程Asset中&#xff0c;看到Unity编辑器上多了个Xlua菜单&#xff0c;说明插件导入成功 Lua启动代码 新建一个空场景&#xff0c;场景中什么都不…