35.UART(通用异步收发传输器)-RS232(2)

news2024/9/24 19:20:59

(1)RS232接收模块visio框图:

(2)接收模块Verilog代码编写:

/*
常见波特率: 4800、9600、14400、115200
在系统时钟为50MHz时,对应计数为:   
(1/4800)    * 10^9 /20 -1 = 10416     
(1/9600)    * 10^9 /20 -1 = 5207
(1/14400)   * 10^9 /20 -1 = 3471
(1/115200)  * 10^9 /20 -1 = 433 
*/

module rs232_rx
(
    input [16:0]    baud_set    ,
    input           clk         ,
    input           reset_n     ,
    input           rx          ,
    input           rx_start    ,
    
    output reg[7:0] rx_data     ,
    output reg      rx_done     
    
);
    
    reg [15:0]      BAUD_MCNT   ;
    reg             rx_reg0     ;
    reg             rx_reg1     ;
    reg             rx_reg2     ;
    reg             en_baud_cnt ;
    reg [15:0]      baud_cnt    ;
    reg [3:0]       bit_cnt     ;
    reg [7:0]       r_rx_data   ;
    
    wire            nedge       ;
    wire            w_rx_done   ;
    
//波特最大计数设计
    always@(posedge clk)
        begin
            case(baud_set)
                17'd4800    :BAUD_MCNT <= 16'd10416;
                17'd9600    :BAUD_MCNT <= 16'd5207;
                17'd14400   :BAUD_MCNT <= 16'd3471;
                17'd115200  :BAUD_MCNT <= 16'd433;
                default     :BAUD_MCNT <= 16'd5207;      //当输入baud_set为其他值时,一律当成9600处理。
            endcase
        end
    
//输入信号打拍处理
    always@(posedge clk)
        begin
            rx_reg0 <= rx;
            rx_reg1 <= rx_reg0;
        end

//下降沿设计
    always@(posedge clk)
        rx_reg2 <= rx_reg1;
        
    assign nedge = (rx_reg2) && (!rx_reg1);
    
//波特率计数使能信号设计 
   always@(posedge clk or negedge reset_n)
        if(!reset_n)
            en_baud_cnt <= 1'd0;
        else if(!rx_start)
            en_baud_cnt <= 1'd0;
        else if(nedge)
            en_baud_cnt <= 1'd1;
        else if((bit_cnt == 4'd0) && (baud_cnt == BAUD_MCNT/2)&&(rx_reg2))      //防止起始位只是一个抖动
            en_baud_cnt <= 1'd0;
        else if((bit_cnt == 4'd9) && (baud_cnt == BAUD_MCNT/2))
            en_baud_cnt <= 1'd1;
        else    
            en_baud_cnt <= en_baud_cnt;
            
//波特计数器模块设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            baud_cnt <= 16'd0;
        else if(!en_baud_cnt)
            baud_cnt <= 16'd0;
        else if(baud_cnt == BAUD_MCNT)
            baud_cnt <= 16'd0;
        else 
            baud_cnt <= baud_cnt + 16'd1;
            
//位计数器模块设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            bit_cnt <= 4'd0;
        else if((baud_cnt == BAUD_MCNT) &&(bit_cnt == 4'd9))
            bit_cnt <= 4'd0;
        else if(baud_cnt == BAUD_MCNT)
            bit_cnt <= bit_cnt + 4'd1;
        else 
            bit_cnt <= bit_cnt;
            
//rx_data设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            r_rx_data <= 8'd0;
        else if(baud_cnt == BAUD_MCNT/2)begin
            case(bit_cnt)
                4'd1: r_rx_data[0] <= rx_reg2;
                4'd2: r_rx_data[1] <= rx_reg2;
                4'd3: r_rx_data[2] <= rx_reg2;
                4'd4: r_rx_data[3] <= rx_reg2;
                4'd5: r_rx_data[4] <= rx_reg2;
                4'd6: r_rx_data[5] <= rx_reg2;
                4'd7: r_rx_data[6] <= rx_reg2;
                4'd8: r_rx_data[7] <= rx_reg2;
                default:r_rx_data <= r_rx_data;
            endcase
        end
        else 
            r_rx_data <= r_rx_data;
    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            rx_data <= 8'd0;
        else if(w_rx_done)
            rx_data <= r_rx_data;
        else    
            rx_data <= rx_data;
    
//w_rx_done和rx_done信号设计
    assign w_rx_done = (bit_cnt == 4'd9) && (baud_cnt == BAUD_MCNT/2) ;
    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            rx_done <= 1'd0;
        else 
            rx_done <= w_rx_done;
            
endmodule

(3)仿真文件代码:

`timescale 1ns / 1ps

module rs232_tx_tb;

reg   [16:0]        baud_set    ;
reg                 clk         ;
reg                 reset_n     ;
reg                 rx          ;
reg                 rx_start    ;

wire [7:0]          rx_data     ;
wire                rx_done     ;

    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin 
        baud_set <= 17'd9600;
        rx_start <= 1'd0;
        #200;
        rx_start <= 1'd1;
        reset_n <= 1'd0;
        rx      <= 1'd1;
        #15;
        reset_n <= 1'd1;
        @(posedge clk)
        set_bit(8'd1 );
        set_bit(8'd3 );
        set_bit(8'd7 );
        set_bit(8'd15);
        $stop;
    end


rs232_rx    rs232_rx_inst
(
    .baud_set    ( baud_set )     ,
    .clk         ( clk      )     ,
    .reset_n     ( reset_n  )     ,
    .rx          ( rx       )     ,
    .rx_start    ( rx_start )     ,

    .rx_data     ( rx_data  )     ,
    .rx_done     ( rx_done  )     
    
);

task   set_bit(
    input [7:0]data
);

integer i;
    for(i=0;i<10;i=i+1)begin
        case(i)
            0: rx <= 1'd0;
            1: rx <= data[0];
            2: rx <= data[1];
            3: rx <= data[2];
            4: rx <= data[3];
            5: rx <= data[4];
            6: rx <= data[5];
            7: rx <= data[6];
            8: rx <= data[7];
            9: rx <= 1'd1;
        endcase
        #(5208 * 20);        
    end
endtask


endmodule

(4)仿真波形:

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

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

相关文章

如何防止漏洞攻击

随着信息技术的日新月异&#xff0c;企业在日常运营中对网络和数字化系统的依赖日益加深。然而&#xff0c;这种高度依赖也伴随着网络安全威胁的急剧增长&#xff0c;对企业的核心资产与数据构成了严峻挑战。为了有效捍卫企业利益&#xff0c;确保运营无忧&#xff0c;积极构建…

Monaco 使用 DocumentHighlightProvider

Monaco 中有一个文字高亮的功能&#xff0c;就是选中一个单词&#xff0c;会高亮文字文档中所有出现该单词的位置&#xff0c;效果如下&#xff1a; Monaco 默认就有这个功能&#xff0c;可以根据具体需求进行定制。通过 registerDocumentHighlightProvider 进行注册 实现 pro…

无人机之图传距离的决定因素

一、发射功率&#xff1a;图传设备的发射功率越大&#xff0c;信号能够传播的距离就越远 二、工作频段&#xff1a;不同频段具有不同的传播特性&#xff0c;一些频段在相同条件下可能具有更远的传输距离。 三、天线性能&#xff1a;优质的天线可以增强信号的发送和接收能力&a…

9.11和9.9哪个数更大?所有模型测试

目录 通义千问2.5 通义千问2_0.5b kimi 智谱清言 ​编辑讯飞星火 秘塔搜索 文言一心 豆包 腾讯元宝 海螺AI ChatGPT 3.5 Gemini 1.0 通义千问72B Claude-3 天工AI 参赛选手&#xff1a;讯飞星火、文言一心、腾讯元宝、海螺AI、通义千问72B、天工AI、 通义千问2…

实验七:图像的复原处理

一、实验目的 熟悉常见的噪声及其概率密度函数。熟悉在实际应用中比较重要的图像复原技术,会对退化图像进行复原处理。二、实验原理 1. 图像复原技术,说简单点,同图像增强那样,是为了以某种预定义的方式来改进图像。在具体操作过程中用流程图表示,其过程就如下面所示: 2…

git查看历史记录方法

0 Preface/Foreword 1 git reflog git reflog显示所有的操作&#xff0c;不仅仅是commit&#xff0c;也包括git pull&#xff0c;checout等动作。 1.1 查看本地和远程仓库的区别 远程仓库&#xff1a;中间的提交是直接在web端编辑 远程仓库&#xff1a;最新的提交是在本地编…

在golang中Sprintf和Printf 的区别

最近一直在学习golang这个编程语言&#xff0c;我们这里做一个笔记就是 Sprintf和Printf 的区别 fmt.Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。 fmt.Printf 根据格式化参数生成格式化的字符串并写入标准输出。由上面就可以知道&#xff0c;fmt.Sprintf返回的…

爬虫(二)——爬虫的伪装

前言 本文是爬虫系列的第二篇文章&#xff0c;主要讲解关于爬虫的简单伪装&#xff0c;以及如何爬取B站的视频。建议先看完上一篇文章&#xff0c;再来看这一篇文章。要注意的是&#xff0c;本文介绍的方法只能爬取免费视频&#xff0c;会员视频是无法爬取的哦。 爬虫的伪装 …

leetcode-三数之和

视频&#xff1a;https://www.bilibili.com/video/BV1bP411c7oJ/?spm_id_from333.788&vd_sourcedd84879fcf1be72f360461b01ecab0d6 从两数之和开始&#xff0c;排序后的两数之和&#xff0c;利用好升序的性质&#xff0c;可以将时间复杂度从on2降到on; class Solution …

MongoDB常用命令大全,概述、备份恢复

文章目录 一、MongoDB简介二、服务启动停止、连接三、数据库相关四、集合操作五、文档操作六、数据备份与恢复/导入导出数据6.1 mongodump备份数据库6.2 mongorestore还原数据库6.3 mongoexport导出表 或 表中部分字段6.4 mongoimport导入表 或 表中部分字段 七、其他常用命令八…

Qt 4.8.7 + MSVC 中文乱码问题深入分析

此问题很常见&#xff0c;然而网上关于此问题的分析大多不够深刻&#xff0c;甚至有错误&#xff1b;加之Qt5又更改了一些编码策略&#xff0c;而很多文章并未提及版本问题&#xff0c;或是就算提了&#xff0c;读者也不重视。这些因素很容易让读者产生误导。今日我彻底研究透了…

成像光谱遥感技术中的AI革命:ChatGPT

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力&#xff0c;ChatGPT在遥感中的应用&#xff0c;人工智能在…

AI第二课堂第一次笔记

conda的使用 在输入cmd进入终端后&#xff0c;使用命令 conda create -n env_name python3.10 创建环境 命令 conda activate env_name 打开环境&#xff0c;如&#xff1a;使用 conda deactivate退出指令 2.python一些常见操作 python中的文件打开与关闭 调开源的库 p…

spring框架(ioc控制反转 aop面向切面编程)

目录 服务端三层开发&#xff1a; spring框架&#xff08;ioc控制反转 aop面向切面编程&#xff09; 1、Spring框架的优点 什么是事物&#xff1f; 2、Spring的IOC核心技术 什么是ioc&#xff1f; 代码举例&#xff1a;&#xff08;详细流程见笔记&#xff09; **applic…

一些简单的基本知识(与C基本一致)

一、注释 1.单行注释&#xff1a;//&#xff08;快捷键&#xff1a;ctrlshift&#xff1f;&#xff0c;可以选择多行&#xff09; 2.多行注释&#xff1a;/* 文本 */ 二、变量 变量的作用是给一段内存空间起名&#xff0c;方便操作内存中的数据。 通过赋予某数据的…

肯德基蛋挞咖啡?品牌为何热衷于研发“奇葩”新品

想喝蛋挞的风还是吹到了咖啡这里... 是的&#xff0c;它来了&#xff0c;它带着新品走来了。前不久&#xff0c;肯德基旗下的肯悦咖啡推出了一款“蛋挞dirty”&#xff0c;就是把除去蛋挞的芯&#xff0c;留下蛋挞皮皮献给咖啡&#xff0c;成功变成了可以吃的咖啡或者说是可以…

Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别

目录 引言&#xff1a; 正文&#xff1a; 一、Serial GC工作原理 年轻代垃圾回收&#xff08;Minor GC&#xff09;&#xff1a; 老年代垃圾回收&#xff08;Major GC或Full GC&#xff09;&#xff1a; 二、年轻代和老年代的区别 年轻代&#xff08;Young Generation&a…

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分&#xff0c;具有特殊意义&#xff0c;前面加一个反斜可以取消其特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个…

Java从入门到精通(第4版)中文电子版

前言 针对编程语言JAVA相关知识进行了精密的讲解&#xff0c;全册分为28章&#xff0c;含基础知识、核心知识、高级应用3大核心模块&#xff0c;具体细分又包括初识Java&#xff0c;类的高级特性&#xff0c;流程控制&#xff0c;字符串&#xff0c;数组&#xff0c;数据库操作…

团队提效探索:市场上最好的10款项目工单管理工具对比

本文将分享2024年值得关注的10款项目工单管理系统&#xff1a;PingCode、Worktile、蓝凌OA、禅道、泛微E-office、Teambition、monday.com、Basecamp、ProofHub、Wrike。 你是否曾经因为项目进度混乱而感到头疼&#xff0c;或是在处理大量任务时不知所措&#xff1f;在项目管理…