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_output
    output      reg                 po_flag     
);
    // parameter
    parameter   MAX_BPS_CNT = `CLOCK/`BPS   ,//434 ,
                MAX_BIT_CNT = `BIT_CHACK    ;//10   ; 
    localparam  RX_MOD      = 1'b1          ,
                CHECK_MOD   = `EVEN         ;
    // reg signal define
    reg                 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 define
    wire                nege    ;
    /*******************************************************************/
    // // reg signal define
    // reg                 rx_r1   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rx_r1 <= 1'b1 ;
        else
            rx_r1 <= rx ;
    end
    // reg                 rx_r2   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rx_r2 <= 1'b1 ;
        else
            rx_r2 <= rx_r1 ;
    end
    // reg                 work    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~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) begin
        if(~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 ; 应该会归0
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~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) begin
        if(~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 ;
            endcase
        end else
            data_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) begin
        if(~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) begin
        if(~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_output
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~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) begin
        if(~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         
);
    // parameter
    parameter   MAX_BPS_CNT = `CLOCK/`BPS   ,
                MAX_BIT_CNT = `BIT_CHACK + 1;
    localparam  CHECK_MOD   = `EVEN         ;
    // reg signal define
    reg     [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) begin
        if(~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) begin
        if(~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) begin
        if(~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) begin
        if(~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 @(*) begin
        if(~sys_rst_n)
            tx = 1'b1 ;
        else if(work) begin
            case (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 ;
                    end
            default: tx = 1'b1 ;
            endcase
        end 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 instantiations
    wire                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.mfbz.cn/a/158303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

注册表单mvc 含源代码

总结 jsp给我们的ControllerServlet.java,ControllerServlet.java获取参数,信息封装给RegisterFormBean.java的对象看是否符合格式,符合格式再信息封装给UserBean对象,调用Dbutil插入方法查重.]]要创建一个user集合成功跳哪个界面,打印信息注意什么时候要加getsession失败跳哪…

react-router-dom 版本6.18.0中NavLink的api和属性介绍

React Router 是一个基于 React 的路由库&#xff0c;它可以帮助我们在 React 应用中实现页面的切换和路由的管理。而 NavLink 则是 React Router 中的一个组件&#xff0c;它可以帮助我们实现导航栏的样式设置和路由跳转。 在 React Router 版本6.18.0 中&#xff0c;NavLink…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)

文章目录 先看本次实现的最终效果前言绘制炮塔UI炮塔转向敌人生成炮弹旋转我们的子弹对敌人造成伤害&#xff0c;回收子弹自动发射子弹添加攻击间隔显示伤害字体设计通用泛型单例创建更多炮塔升级增加伤害升级缩短攻击间隔添加货币杀死敌人获取金币源码完结 先看本次实现的最终…

epoll协程简述

协程的由来 【协程第二话】协程和IO多路复用更配哦~_哔哩哔哩_bilibili 协程类别:有栈(静态)协程, 无栈(动态协程) 协程epoll 当有需要等待的时候,就切换出去,要用汇编保存这个栈rsp 运行时,要根据协程上下文恢复出这个栈

Beego之Bee工具使用

1、bee工具使用 bee 工具是一个为了协助快速开发 Beego 项目而创建的项目&#xff0c;通过 bee 你可以很容易的进行 Beego 项目的创 建、热编译、开发、测试、和部署。Bee工具可以使用的命令&#xff1a; [rootzsx ~]# bee 2023/02/18 18:17:26.196 [D] init global config…

Java基础笔记

1.数据类型在java语言中包括两种: 第一种:基本数据类型 基本数据类型又可以划分为4大类8小种: 第一类:整数型 byte , short,int, long(没有小数的&#xff09; 第二类:浮点型 float,aouble(带有小数的&#xff09; 第三类:布尔型 boole…

【Rust】快速教程——模块mod与跨文件

前言 道尊&#xff1a;没有办法&#xff0c;你的法力已经消失&#xff0c;我的法力所剩无几&#xff0c;除非咱们重新修行&#xff0c;在这个世界里取得更多法力之后&#xff0c;或许有办法下降。——《拔魔》 \;\\\;\\\; 目录 前言跨文件mod多文件mod 跨文件mod //my_mod.rs…

高能分享:软件测试十大必问面试题(附带答案)

1 介绍之前负责的项目 参考答案&#xff1a;先大概描述一下这个项目是做什么的&#xff08;主要功能&#xff09;&#xff0c;包括哪些模块&#xff0c;是什么架构的&#xff08;B/S、C/S、移动端&#xff1f;&#xff09;&#xff0c;你在其中负责哪些模块的测试。期间经历了几…

Java后端工程师有福啦,CSDN里找到宝藏

目录 一、说明 二、操作步骤 一、说明 CDSN也有系统的java学习资料&#xff0c;有事无事翻翻挺好。 二、操作步骤 1、在CSDN首页顶端左边&#xff0c;点【学习】 2、在【学习】的页面&#xff0c;往下滑&#xff0c;找到【职业路线】 3、java后端工程师【入门版】【进阶版】…

Python基础:输入输出详解-输出字符串格式化

Python中的输入和输出是编程中非常重要的方面。 1. 输入输出简单介绍 1.1 输入方式 Python中的输入可以通过input()函数从键盘键入&#xff0c;也可以通过命令行参数或读取文件的方式获得数据来源。 1&#xff09;input()示例 基本的input()函数&#xff0c;会将用户在终端&…

Unity中Shader纹理的环绕方式

文章目录 前言一、修改环绕方式前的设置准备二、在纹理的设置面板可以修改环绕方式三、在Shader中&#xff0c;实现纹理的环绕方式切换1、在属性面板定义一个和纹理面板一样的纹理环绕方式下拉框2、在Pass中&#xff0c;定义枚举对应的变体3、在片元着色器中&#xff0c;纹理采…

腾讯云服务器收费标准是多少?腾讯云服务器收费标准表

你是否曾被繁琐复杂的服务器租赁费用搞得头昏脑胀&#xff1f;看着一堆参数和计费方式却毫无头绪&#xff1f;别担心&#xff0c;这篇文章就来帮你解决这个问题&#xff01;我们今天就来揭秘一下腾讯云服务器的收费标准&#xff0c;让大家轻松明白地知道如何租用腾讯云服务器。…

2023.11.17-hive调优的常见方式

目录 0.设置hive参数 1.数据压缩 2.hive数据存储格式 3.fetch抓取策略 4.本地模式 5.join优化操作 6.SQL优化(列裁剪,分区裁剪,map端聚合,count(distinct),笛卡尔积) 6.1 列裁剪: 6.2 分区裁剪: 6.3 map端聚合(group by): 6.4 count(distinct): 6.5 笛卡尔积: 7…

Go 语言变量类型和声明详解

在Go中&#xff0c;有不同的变量类型&#xff0c;例如&#xff1a; int 存储整数&#xff08;整数&#xff09;&#xff0c;例如123或-123float32 存储浮点数字&#xff0c;带小数&#xff0c;例如19.99或-19.99string - 存储文本&#xff0c;例如“ Hello World”。字符串值用…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-C

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

技术分享 | 如何写好测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 ## 一…

337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连…

学习指南:如何快速上手媒体生态一致体验开发

过去开发者们在使用多媒体能力时&#xff0c;往往会遇到这样的问题&#xff0c;比如&#xff1a;为什么我开发的相机不如系统相机的效果好&#xff1f;为什么我的应用和其他的音乐一起发声了&#xff0c;我要怎么处理&#xff1f;以及我应该怎么做才能在系统的播控中心里可以看…

talbay---贝叶斯网络分析工具产品介绍

一 简介 talbay是拥有独立知识产权的国产软件&#xff0c;主要功能是贝叶斯网络建模、决策网络建模、概率计算、决策支持、敏感性分析、网络模型验证、机器学习等。talbay以用户为中心&#xff0c;简单易用, 计算准确高效&#xff0c;分析全面多样&#xff0c;在应用成熟理论及…

2023年“华为杯”第二十届中国研究生数学建模成绩数据分析(末尾有吃席群)

目录 0引言1、数据大盘1.1 官方数据1.2 分赛题统计数据1.2.1 A-F 获奖数1.2.2 A-F 获奖率 2、分学校统计获奖情况&#xff08;数模之星没有统计&#xff09;3、 数模之星4、吃席群5、写在最后的话 0引言 2023年华为杯成绩于2023年9月22-26日顺利举行&#xff0c;来自国际和全国…
最新文章