通信协议: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高级数字设计》,有删改

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LaTex模板免费下载网站

LaTex模板免费下载网站 在进行文档排版时候&#xff0c;有时需要对不同类型文章的格式进行编辑&#xff0c;本博文推荐一个免费下载LaTex模板的网站。 一、网站地址 链接: LaTex模板网址&#xff1a;http://www.latextemplates.com/ 二、模板类型 模板类型如图2和图3所示。…

Ctfshow web入门 phpCVE篇 web311-web315 详细题解 全

CTFshow phpCVE web311 CVE-2019-11043 PHP远程代码执行漏洞复现&#xff08;CVE-2019-11043&#xff09;【反弹shell成功】-腾讯云开发者社区-腾讯云 (tencent.com) 漏洞描述 CVE-2019-11043 是一个远程代码执行漏洞&#xff0c;使用某些特定配置的 Nginx PHP-FPM 的服务…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

【Html】用CSS定义咖啡 - 咖啡配料展示

显示效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>CodePen - For The Love Of Coffee</title><link rel"stylesheet" href"./style.css">&l…

Java中的IO流的缓冲流

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

民企再续“助学故事”,恒昌公益两所“云杉校园”如何聚木成林?

撰稿|多客 来源|贝多财经 “生物世界丰富多彩、五花八门、琳琅满目&#xff0c;可谓大千世界芸芸众生”……这是遵义市正安县安场镇光明完全小学图书馆收藏的一本名为《闯入生物世界》书中所写景象。 在这所学校&#xff0c;课外书籍按照年级及类别进行划分&#xff0c;如一…

微信小程序案例2-3:婚礼邀请函

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;导航栏设置1、导航栏的相关配置项2、利用导航栏组件2、在页面配置文件中对导航栏进行配置3、在全局配置文件中对导航栏进行配置 三、实现步骤 一、运行效果 “婚礼邀请函”微信小程序由4个页面组成&#xff0c;分别…

ABB DDC779BE02 3BHE006805R0002 控制主板模块

ABB DDC779BE02 3BHE006805R0002 控制主板模块用于自动化和控制系统中&#xff0c;它们可能具有以下一些常见特点和功能&#xff1a; 处理能力&#xff1a;ABB DDC779BE02 3BHE006805R0002 控制主板模块通常具有强大的处理能力&#xff0c;可以执行复杂的控制算法和逻辑。 多种…

Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)

阅读导航 前言一、fork函数初识1. 基本概念2. fork函数返回值 二、fork函数的写时拷贝三、总结温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也学习了一些Linux的基本操作&#xff0c;也了解并…

山石网科国产化防火墙,打造全方位边界安全解决方案

互联网的快速发展促进了各行各业的信息化建设&#xff0c;但也随之带来了诸多网络安全风险。大部分组织机构采用统一互联网接入方案&#xff0c;互联网出口承担着内部用户访问互联网的统一出口和对外信息服务的入口&#xff0c;因此在该区域部署相匹配的安全防护手段必不可少。…

Serverless 数仓技术与挑战(内含 PPT 下载)

近期&#xff0c;Databend Labs 联合创始人张雁飞发表了题为「Serverless 数仓技术与挑战」的主题分享。以下为本次分享的精彩内容&#xff1a; 主题&#xff1a; 「Serverless 数仓技术与挑战」 演讲嘉宾&#xff1a; 张雁飞 嘉宾介绍&#xff1a; Databend Labs 联合创始人…

vue重修002

文章目录 版权声明一 指令修饰符1. 什么是指令修饰符&#xff1f;2. 按键修饰符3. v-model修饰符4. 事件修饰符 二 v-bind对样式控制的增强-操作class1. 语法&#xff1a;2. 对象语法3. 数组语法4. 代码练习 三 京东秒杀-tab栏切换导航高亮四 v-bind对有样式控制的增强-操作sty…

代码随想录刷题 Day18

513.找树左下角的值 这个题用层序遍历比较简单&#xff0c;按照模版改一句话就可以&#xff1b;层序遍历用这个queue来实现&#xff1b; 用前序遍历的话就需要用递归比较麻烦 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que…

Oracle-ADG无法应用日志问题(Bug-17695685)

问题: Oracle11.2.0.4.5的版本&#xff0c;ADG备库mrp进程出现无法应用日志的问题 问题原因分析: 查看当前mrp进程的状态&#xff0c;当前在应用日志thread# 1 626298 select inst_id,process,thread#,sequence#,status from gv$managed_standby;备库查看日志的状态&#xf…

国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求

近年来&#xff0c;为了摆脱对国外技术和产品的依赖&#xff0c;建设安全的网络环境&#xff0c;以及加强我国对网络信息的安全可控能力&#xff0c;我国推出了国密算法。同时&#xff0c;为保护网络通信信息安全&#xff0c;更高级别的安全加密数字证书—国密SSL证书应运而生。…

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…

案例题概述

案例题概述 考点 考点 新教材的新增考点 第一题必做&#xff0c;之后是4选2 感觉都是记忆的&#xff0c;课件完整一些&#xff0c;之后以看课件为主了&#xff0c;不在做详细笔记了

IDEA中如何查看自己的SpringBoot的版本

直接输入代码执行&#xff1a; public class App {public static void main(String[] args) {String springVersion SpringVersion.getVersion();String springBootVersion SpringBootVersion.getVersion();System.out.println("Spring版本:"springVersion"\…

java常用API(Math,System,Runtime)

Math Math的常用方法 package myMath;public class myMath {public static void main(String[] args) {System.out.println(Math.abs(-99));//这个表示取绝对值的 打印结果为99//但是他有个bug.int最大取值范围是-2,147,483,648 到2,147,483,647System.out.println(Math.abs(-…

Linux -- 进程间通信之匿名管道

博客中涉及代码已全部上传至Gitee&#xff0c;有需要请自行下载 目录 前言通信基础管道 匿名管道第一步&#xff1a;创建管道第二步&#xff1a;创建子进程第三步&#xff1a;开始通信第四步&#xff1a;结束通信 匿名管道通信代码实现四种特殊情景 基于匿名管道的多进程控制对…