通信协议: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接收器负责接收串行比特流,去除起始位和停止位,并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟,因此尽管数据以标准比特率到达,但数据未必与接收主机内的时钟同步。同步问题可…...

嵌入式MCU都有什么高级用法?
嵌入式MCU都有什么高级用法? 您举的几个例子,确实是MCU外设的一些高端玩法。只是不知道您是否想过,既然这些机制是被 人设计出来的,那它就是种标准用法。从微控制器的发展历程来看,许多硬件机制都是有了实际 需求后才…...
热启动和冷启动是什么,区别
app冷启动: 当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这个启动方式就叫做冷启动(后台不存在该应用进程)。冷启动因为系统会重新创建一个新的进程分配给它ÿ…...
每日一题 494目标和(0-1背包)(灵神笔记)
0-1背包模版 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 当前操作?枚举第i个物品选还是不选,不选容量不变,选容量减少 子问题ÿ…...

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

java项目之列车票务信息管理系统(ssm源码+文档)
项目简介 列车票务信息管理系统实现了以下功能: 管理员:个人中心、用户管理、车票信息管理、购票指南管理、管理员管理、论坛管理、我的收藏管理、系统管理、订单管理。前台首页:首页、车票信息、购票指南、我的收藏管理、论坛信息、我的、…...
【Pytorch笔记】3.数学运算
深度之眼官方账号 - 01-03-mp4-张量操作与线性回归 torch.add() 功能:逐元素计算inputalphaother。 torch.add(input,alpha1,other,outNone)input:tensor; alpha:other的系数,是个实数; other࿱…...

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

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

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

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

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

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

某高校的毕设
最近通过某个平台接的单子,最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面:推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…...
利用uvicorn、Starlette和pipeline将一个训练好的大模型发布成一个web服务
技术名词: 1、Starlette: 它是一个轻量级、高度可用性和可扩展性的Web框架,它专门为异步应用程序设计。 Starlette基于Python 3.6的异步/协程语法,具有快速响应性能和低延迟。你可以将它理解为Java的Spring。 安装:…...
贝赛尔曲线 - Vue3实现加入购物车抛物线效果组件
贝赛尔曲线 - Vue3实现加入购物车抛物线效果组件(可连续多个动画,动态回收DOM) 前言 在前几天的一次迭代中,我遇到了这么一个需求,模仿支付宝首页应用中心的编辑功能,支持编辑首页展示的应用,…...
AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes解决方法
打开一个编译选项启用ASan的程序: AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes然后程序启动失败。 原因: [cfe-dev] Question about Clang/LLVM addresssanitizer /proc/sys/vm/overcommit_memory是一个用于控制内存…...

Fortinet 2023上半年全球威胁态势研究报告:勒索软件检测成下降趋势,针对性攻击持续升温
近日,专注于推动网络与安全融合的全球网络安全领导者Fortinet(NASDAQ:FTNT),发布《2023上半年全球威胁态势研究报告》。报告显示,2023 年上半年勒索软件检出数量继续下降、高级持续性威胁(APT&a…...

MySQL ——多表连接查询
一、(左、右和全)连接概念 内连接: 假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分,两张表是平等的。 关键字:inner join on 语句…...

前沿技术 --> 待定
一、可会可不会 1.1如何优雅的编写技术文档 网址: 如何优雅的编写技术文档? - YouTube...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...