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…

「Tech初见」对epoll的理解

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

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矩阵键盘和数码管显示的编…

纵行科技亮相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…

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部分是否有关于…

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…

Threejs_06 多材质的实现

Threejs 同一个几何体如何实现多材质呢&#xff1f; 多材质的实现 1.使用索引绘制一个几何体 //创建几何体(三角形) const geometry new THREE.BufferGeometry();//使用索引绘制 (两个共用的) const vertices new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1…

谈谈系统性能调优中都需要考虑哪些因素

一、 什么是性能调优&#xff1f; 这个系统好慢、网站又打不开了&#xff0c;太卡了&#xff0c;又没响应了&#xff0c;相信大家都遇到过用户的这种抱怨&#xff0c;此时&#xff0c;说明我们的应用系统出现了性能问题&#xff0c;那么怎么办呢&#xff0c;首先想到的应该是优…

HP惠普暗影精灵9笔记本电脑OMEN by HP Transcend 16英寸游戏本16-u0000原厂Windows11系统

惠普暗影9恢复出厂开箱状态&#xff0c;原装出厂Win11-22H2系统ISO镜像 下载链接&#xff1a;https://pan.baidu.com/s/17ftbBHEMFSEOw22tnYvPog?pwd91p1 提取码&#xff1a;91p1 适用型号&#xff1a;16-u0006TX、16-u0007TX、16-u0008TX、16-u0009TX、16-u0017TX 原厂系…

数据结构与算法编程题2

逆置线性表&#xff0c;使空间复杂度为 O(1) #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;void Init_SqList(SqList& …

YOLOV8部署Android Studio安卓平台NCNN

下载Android Studio&#xff0c;配置安卓开发环境&#xff0c;这个过程比较漫长。 安装cmake&#xff0c;注意安装的是cmake3.10版本。 根据手机安卓版本选择相应的安卓版本&#xff0c;我的是红米K30Pro&#xff0c;安卓12。 使用腾讯开源的ncnn&#xff0c;这是一个为手机端极…

驶入产业发展快车道,汉鑫科技人工智能研发中心正式启用!

11月18日&#xff0c;汉鑫科技人工智能研发中心正式启用。中心立足烟台&#xff0c;服务全国&#xff0c;聚焦工业智能、智能网联、智慧城市三大业务板块&#xff0c;以人工智能技术赋能政企实现“数智化”转型升级。该中心的启用标志着汉鑫科技在人工智能研发应用领域迈上了新…

移动端表格分页uni-app

使用uni-app提供的uni-table表格 网址&#xff1a;https://uniapp.dcloud.net.cn/component/uniui/uni-table.html#%E4%BB%8B%E7%BB%8D <uni-table ref"table" :loading"loading" border stripe type"selection" emptyText"暂无更多数据…

【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Nacos 一、nacos实现配置管理1.1 统一配置管…