当前位置: 首页 > news >正文

通信协议:Uart的Verilog实现(下)

4、UART接收器

        UART接收器负责接收串行比特流,去除起始位和停止位,并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟,因此尽管数据以标准比特率到达,但数据未必与接收主机内的时钟同步。同步问题可以用同步器等方法解决,数据的采集可以使用一个更高频率的本地时钟进行采样。为保证采样是在比特时间的中间进行,应对Sample_clock时钟周期进行计数,如下图所示。采样方法必须保证:(1)能够检测到起始位到达;(2)能够采样到8个数据位;(3)能够把采样数据送到本地总线。

        虽然可以采用更高的采样频率,但本例中Sample_clock的频率定为(已知)发送时钟频率的8倍。这可以保证Sample_clock前沿与起始位之间的少许差异不会影响采样,因为只需在起始位对应的比特时间之内采样完成即可。具体来说,就是当串行输入被采样为低电平后表示起始位到来,而后将再进行三次采样增加可信度,在此后的连续数据位都将在比特时间的中间附近被采样(即控制两次采样间隔时间是比特时间),这是通过数据通路中的计数器来实现的。

        下图给出了接收器的内部框图,包括控制单元和数据通路,可以看到其中控制单元和主机之间的接口信号,已经控制单元和数据通路之间的控制信号与状态信号。

        控制单元的输入信号及其作用:

        read_not_ready_in:表示主机未准备好接收。

        Ser_in_0:当Serial_in = 0时有效,是由数据通路提供的状态信号。

        SC_eq_3:当Sample_counter = 3时有效,是由数据通路提供的状态信号。

        BC_er_8:当Sample_count < 7时有效,是由数据通路提供的状态信号。

        Sample_counter:对两次采样间隔进行计数。

        Bit_counter:计数已采样的数据位数。

        控制单元的输出信号及其作用:

        read_not_ready_out:表示接收机已接收到8位数据。

        clr_Sample_counter:控制数据通路的Sample_counter计数器清零。

        inc_Sample_counter:控制数据通路的Sample_counter计数值加1。

        clr_Bit_counter:控制数据通路的Bit_counters计数器清零。

        inc_Bit_counter:控制数据通路的Bit_counters计数值加1。

        shift:控制数据通路的RCV_shftreg向LSB方向移位。

        load:控制数据通路的RCV_shftreg数据传送到RCV_datareg。

        Error1:最后一个数据位采样结束后主机还没有准备好接收数据时有效。

        Error2:停止位丢失时有效。

        接收器控制器状态机ASMD如下图所示。该状态机包括idle、starting和receiving三个状态。状态之间的转移由Sample_clk来同步。低有效的同步复位输入rst_b使状态机进入idle状态,直到状态信号Ser_in_0变为高电平(串行输入为0)后状态机进入starting状态。在starting状态下,状态机重复采样Serial_in以确认是否是有效起始位。在Sample_clock的下一个有效沿,clr_Sample_counter和inc_Sample_counter需根据采样值确认是增加计数值还是清零:若接下来的连续三次采样值均为0,则认定为有效起始位,状态机转移到receiving状态并将给出clr_Sample_counter信号控制Sample_counter清零。在receiving状态下inc_Sample_counter将控制Sample_counter计数值增加以进行8个时钟周期的计时,对每个有效比特,在其比特时间的中间采样,总共采样7位数据位,1位校验位,Bit_counter增加。若采样的不是校验位,则inc_Bit_counter和shift持续有效。信号shift有效时,串行输入将载入接收器的移位寄存器RCV_shftreg的MSB位,且寄存器最左边的7位将向LSB方向移动。

module UART_RCVR #(parameter word_size = 8, half_word = word_size / 2)(output [word_size - 1 : 0]RCV_datareg,output read_not_ready_out,Error1, Error2,input  Serial_in,read_not_ready_in,Sample_clk,rst_b
);wire Ser_in_0, SC_eq_3, SC_lt_7, BC_eq_8,clr_Sample_counter, inc_Sample_counter,clr_Bit_counter, inc_Bit_counter,shift, load;Control_Unit M0(read_not_ready_out, Error1, Error2, clr_Sample_counter,inc_Sample_counter, clr_Bit_counter, inc_Bit_counter,shift, load, read_not_ready_in, Ser_in_0, SC_er_3,SC_lt_7, BC_er_8, Sample_clk, rst_b);Datapath_Unit M1(RCV_datareg, Ser_in_0, SC_eq_3, SC_lt_7, BC_eq_8, Serial_in,clr_Sample_counter, inc_Sample_counter, clr_Bit_counter,inc_Bit_counter, shift, load, Sample_clk, rst_b);endmodulemodule Control_Unit #(parameter word_size = 8, half_word = word_size / 2,Num_state_bits = 2)(output reg read_not_ready_out,Error1, Error2, clr_Sample_counter,inc_Sample_counter, clr_Bit_counter, inc_Bit_counter,shift, loadinput read_not_ready_in, Ser_in_0, SC_er_3,SC_lt_7, BC_er_8, Sample_clk, rst_b
);localparam idle = 2'b00,starting = 2'b01,receiving = 2'b10;reg [word_size - 1 : 0] RCV_shftreg;reg [Num_state_bits - 1 : 0] state, next_state;always@(posedge Sample_clk)if(rst_b == 0)state <=idle;elsestate <= next_state;always@(*)beginread_not_ready_out = 0;clr_Sample_counter = 0;clr_Bit_counter = 0;inc_Sample_counter = 0;inc_Bit_counter = 0;shift = 0;Error1 = 0;Error2 = 0;load = 0;next_state = idle;case(state)idle: if(Ser_in_0 == 1)next_state = starting;elsenext_state = idle;starting: if(Ser_in_0 == 0)beginnext_state = idle;clr_Sample_counter = 1;endelse if(SC_eq_3 == 1)beginnext_state = receiving;clr_Sample_counter = 1;endelse beginnext_state = starting;inc_Sample_counter = 1;                    endreceiving: if(SC_lt_7 == 1)begininc_Sample_conter = 1;next_state = receiving;endelse beginclr_Sample_counter = 1;if(!BC_eq_8)beginnext_state = receiving;                              shift = 1;inc_Bit_counter = 1;                               endelse beginnext_state = idle;read_not_ready_out = 1;clr_Bit_counter = 1;if(read_not_ready_in == 1) Error1 = 1;else if(Ser_in_0 == 1)Error2 = 1;elseLoad = 1;endenddefault: next_state = idle;endcase end
endmodulemodule Datapath_Unit #(parameter word_size = 8, half_word = word_size / 2,Num_counter_bits = 4)(output reg [word_size - 1 : 0] RCV_datareg,output Ser_in_0,SC_eq_3, SC_lt_7, BC_eq_8,input Serial_in, clr_Sample_counter, inc_Sample_counter, clr_Bit_counter,inc_Bit_counter, shift, load, Sample_clk, rst_b
);reg [word_size - 1 : 0] RCV_shftreg;reg [Num_counter_bits - 1 : 0] Sample_counter;reg [Number_counter_bits : 0] Bit_counter;assign Ser_in_0 = (Serial_in == 0);assign BC_eq_8 = (Bit_counter == word_size);assign SC_lt_7 = (Sample_counter < word_size - 1);assign SC_eq_3 = (Sample_counter == half_word - 1);always@(posedge Sample_clk)if(rst_b == 0)beginSample_counter <= 0;Bit_counter <= 0;RCV_datareg <= 0;RCV_shftreg <= 0;endelse beginif(clr_Sample_counter == 1)Sample_counter <= 0;else if(inc_Sample_counter == 1)Sample_counter <= Sample_counter + 1;if(clr_Bit_counter == 1)Bit_counter <= Bit_counter;else if(inc_Bit_counter == 1)Bit_counter <= Bit_counter + 1;if(shift == 1)RCV_shftreg <= {Serial_in, RCV_shftreg[word_size - 1 : 1]};else if(load == 1)RCV_datareg <= RCV_shftreg;end
endmodule

 以上内容来源于《Verilog HDL高级数字设计》,有删改

相关文章:

通信协议:Uart的Verilog实现(下)

4、UART接收器 UART接收器负责接收串行比特流&#xff0c;去除起始位和停止位&#xff0c;并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟&#xff0c;因此尽管数据以标准比特率到达&#xff0c;但数据未必与接收主机内的时钟同步。同步问题可…...

嵌入式MCU都有什么高级用法?

嵌入式MCU都有什么高级用法&#xff1f; 您举的几个例子&#xff0c;确实是MCU外设的一些高端玩法。只是不知道您是否想过&#xff0c;既然这些机制是被 人设计出来的&#xff0c;那它就是种标准用法。从微控制器的发展历程来看&#xff0c;许多硬件机制都是有了实际 需求后才…...

热启动和冷启动是什么,区别

app冷启动&#xff1a; 当应用启动时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c; 这个启动方式就叫做冷启动&#xff08;后台不存在该应用进程&#xff09;。冷启动因为系统会重新创建一个新的进程分配给它&#xff…...

每日一题 494目标和(0-1背包)(灵神笔记)

0-1背包模版 有n个物品&#xff0c;它们有各自的体积和价值&#xff0c;现有给定容量的背包&#xff0c;如何让背包里装入的物品具有最大的价值总和&#xff1f; 当前操作&#xff1f;枚举第i个物品选还是不选&#xff0c;不选容量不变&#xff0c;选容量减少 子问题&#xff…...

软件测试工作步骤详情

软件测试步骤按照研发阶段一般分为5个部分&#xff1a;单元测试、集成测试、确认测试、系统测试、验收测试&#xff0c;下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 一、单元测试的内容&#xff1a;&#xff08;白盒为主&#xff0c;黑盒为辅&#xff09;…...

java项目之列车票务信息管理系统(ssm源码+文档)

项目简介 列车票务信息管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、用户管理、车票信息管理、购票指南管理、管理员管理、论坛管理、我的收藏管理、系统管理、订单管理。前台首页&#xff1a;首页、车票信息、购票指南、我的收藏管理、论坛信息、我的、…...

【Pytorch笔记】3.数学运算

深度之眼官方账号 - 01-03-mp4-张量操作与线性回归 torch.add() 功能&#xff1a;逐元素计算inputalphaother。 torch.add(input,alpha1,other,outNone)input&#xff1a;tensor&#xff1b; alpha&#xff1a;other的系数&#xff0c;是个实数&#xff1b; other&#xff1…...

MeterSphere 监控方案

前言&#xff1a;在部署MeterSphere之后&#xff0c;很多时候需要看下MeterSphere服务的监控信息&#xff0c;虽然有监控告警脚本&#xff0c;但还不是太直观&#xff0c;所以就结合 PrometheusExporterGrafana 部署一套完整的MeterSphere监控方案。 首先我们先罗列一下需要监控…...

elementui-plus+ts+axios使用el-upload组件自定义上传

1.前言&#xff1a; 使用element ui有很多便捷之处&#xff0c;但是由于是封装的组件和自己写还是有些许的不一样&#xff0c;这里主要解决几个问题。 1. 如何获取子组件实例 2. 如何自定义上传方法 2.两个问题&#xff1a; ⛺️ 获取子组件实例 实际上vue一般通过ref获取子组…...

【STM32单片机】u8g2智能风扇设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块、DS18B20温度传感器、直流电机、红外遥控等。 主要功能&#xff1a; 初始化后进入温度显示界面&#xff0c;系统初始状态为手动…...

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…...

7、SpringBoot_高级配置

一、配置高级 1.临时属性设置 1.1引出问题 如果目标电脑上8080端口已经使用&#xff0c;再次使用该端口会出现端口占用问题 解决方式 重新更换配置文件修改端口打包通过临时属性配置新端口更换配置文件 1.2添加临时属性配置 通过临时属性修改8080端口 java -jar 项目.jar…...

cocos2dx查看版本号的方法

打开文件&#xff1a;项目根目录\frameworks\cocos2d-x\docs\RELEASE_NOTES.md 知道引擎版本号的意义&#xff1a; 1.面试中经常被问到(面试官想知道你会不会查版本号&#xff0c;你会查也不一定会去看&#xff0c;如果你去看了说明你是一个有心人&#xff0c;或者想深入研究下…...

某高校的毕设

最近通过某个平台接的单子&#xff0c;最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面&#xff1a;推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…...

利用uvicorn、Starlette和pipeline将一个训练好的大模型发布成一个web服务

技术名词&#xff1a; 1、Starlette&#xff1a; 它是一个轻量级、高度可用性和可扩展性的Web框架&#xff0c;它专门为异步应用程序设计。 Starlette基于Python 3.6的异步/协程语法&#xff0c;具有快速响应性能和低延迟。你可以将它理解为Java的Spring。 安装&#xff1a;…...

贝赛尔曲线 - Vue3实现加入购物车抛物线效果组件

贝赛尔曲线 - Vue3实现加入购物车抛物线效果组件&#xff08;可连续多个动画&#xff0c;动态回收DOM&#xff09; 前言 在前几天的一次迭代中&#xff0c;我遇到了这么一个需求&#xff0c;模仿支付宝首页应用中心的编辑功能&#xff0c;支持编辑首页展示的应用&#xff0c;…...

AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes解决方法

打开一个编译选项启用ASan的程序&#xff1a; AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes然后程序启动失败。 原因&#xff1a; [cfe-dev] Question about Clang/LLVM addresssanitizer /proc/sys/vm/overcommit_memory是一个用于控制内存…...

Fortinet 2023上半年全球威胁态势研究报告:勒索软件检测成下降趋势,针对性攻击持续升温

近日&#xff0c;专注于推动网络与安全融合的全球网络安全领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;发布《2023上半年全球威胁态势研究报告》。报告显示&#xff0c;2023 年上半年勒索软件检出数量继续下降、高级持续性威胁&#xff08;APT&a…...

MySQL ——多表连接查询

一、&#xff08;左、右和全&#xff09;连接概念 内连接&#xff1a; 假设A和B表进行连接&#xff0c;使用内连接的话&#xff0c;凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分&#xff0c;两张表是平等的。 关键字&#xff1a;inner join on 语句&#xf…...

前沿技术 --> 待定

一、可会可不会 1.1如何优雅的编写技术文档 网址&#xff1a; 如何优雅的编写技术文档&#xff1f; - YouTube...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...