串行数据发送器

news2024/12/22 20:08:16

框图

在这里插入图片描述

  • THR:发送保持寄存器

    • 定义了两种状态:空,满
    • 数据写入端口地址:00H
    • 状态读出端口地址:00H
    • 当THR不满时,可以向THR写入数据
  • TSR:发送移位寄存器

    • 一旦TSR空而THR中有数据时,THR中的数据就送到TSR
    • RSR中的数据以串行方式从TxD段发送,高位在前,低位在后
    • 在TxD端的bit流中,若连续出现5个’1‘,则在第5个’1‘之后自动插入一个’0’。注意:相邻两个字节之间也会出现5个连续的‘1’
      - yi
      在这里插入图片描述
  • 发送时许
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 代码
module p2s_tramsmitter (
   RST,CLK2M,CS,FS,WR,RD,A0,D,TxD
);
   input       RST,CLK2M,CS,WR,RD,FS;
   input       A0;
   inout [7:0] D;
   output      TxD;
   reg         TxD;
   wire  [7:0] D;
   reg   [7:0] THR_Status,THR,TSR,R_Shifter;
   // R_Shifter 最低为TxD_1;
   reg   [2:0] Count8;
   reg   [2:0] Count5;
   reg   [4:0] Count32;
   reg         TSR_Shift_EN;
   reg         Mux_Sel1,Mux_Sel2;
   reg         TxD_2;
   reg         Load_EN;
   reg         THR_Read;
   // 移位寄存器,load操作为:每当移完一个字节的数据并且THR不空时,
   // 就从THR加载一个数据
   // 在TSR_Shift_EN信号有效时,TSR做移位操作
   always @(posedge RST or posedge CLK2M) begin
      if (RST) 
         TSR <= 8'b00000000;
      else if (Count8 ==3'b000&&THR_Status[0] == 1) begin
         TSR <= THR;
      end else if (TSR_Shift_EN == 1'b1) 
         TSR <= {TSR[6:0],1'b0};
   end
   //连续5个‘1’的检测及插‘0’。
   always @(posedge RST or posedge CLK2M) begin
      if (RST) 
         Count5 = 3'b100;
      else if (TSR[7] == 1'b0) 
         Count5 = 3'b100;
      else 
         Count5 = Count5 - 1;
   end

   always @(TSR or Mux_Sel1) begin
      if (Mux_Sel1) 
         TxD_2 = 1'b0;
      else 
         TxD_2 = TSR[7];
   end

   always @(Count5) begin
      if (Count5 == 3'b000) 
         Mux_Sel1 = 1'b1;
      else 
         Mux_Sel1 = 1'b0;
   end
   //在发送5个连续的‘1’之后要插入一个‘0’,此时TSR不移位。
   // always @(Count5) begin
   //    if (Count5 == 3'b000) 
   //       TSR_Shift_EN = 1'b0;
   //    else 
   //       TSR_Shift_EN = 1'b1;
   // end 等价于
   always @(Mux_Sel1) begin
      TSR_Shift_EN = ~Mux_Sel1;
   end
   //正常数据与发送7EH的处理
   always @(Mux_Sel1 or TxD or R_Shifter) begin
      if (Mux_Sel2) 
         TxD = R_Shifter[7];
      else 
         TxD = TxD_2;
   end

   always @(posedge RST or posedge CLK2M) begin
      if (RST) 
         R_Shifter = 8'b01111110;
      else if (Load_EN) 
         R_Shifter = 8'b01111110;//7EH
      else 
         R_Shifter = {R_Shifter[6:0],R_Shifter[7]};
   end
   
   always @(posedge RST or posedge CLK2M) begin
      if (RST)
         Count32 = 5'b11111;
      else if (~FS) 
         Count32 = 5'b11111;
      else if (TSR_Shift_EN) 
         Count32 = Count32 - 1;
   end
   // 对TSR移位32次,即进入空闲态,因此Count32对TSR_Shift_EN进行计数
   always @(Count32) begin
      if (Count32 == 5'b00000)
         Load_EN = 1'b1;
      else 
         Load_EN = 1'b0;
   end

   always @(Load_EN) begin
      Mux_Sel2 = Load_EN;
   end

   always @(posedge RST or posedge CLK2M) begin
      if (RST)
         THR = 8'b00000000;
      else if (CS == 1'b0&&WR == 1'b0&&A0 == 1'b0) 
         THR = D;
   end
   //THR_Status是一个状态信号,由于该状态最终可以被处理器通过总线读取,因此可以将它设置为
   //8bits,当THR中有数据时为00000001,否则为00000000;
   // 该信号应该是寄存器信号,无论THR中是否有数据,只要TSR发出一个读信号,那么在
   // 读信号有效的下一个时钟沿,该信号为空
   always @(posedge RST or posedge CLK2M) begin
      if (RST) 
         THR_Status = 8'b00000000;
      else if (WR == 1'b0 && THR_Read == 1'b1 &&A0 == 1'b0) 
         THR_Status = 8'b00000001;
      else if (WR == 1'b1 && THR_Read == 1'b0) 
         THR_Status = 8'b00000000;
   end

   always @(Count8) begin
      if (Count8 == 3'b000) 
         THR_Read = 1'b0;
      else 
         THR_Read = 1'b1;
   end

   always @(posedge RST or posedge CLK2M) begin
      if (RST) 
         Count8 = 3'b000;
      else if (~FS) 
         Count8 = 3'b111;
      else if (TSR_Shift_EN)
         Count8 = Count8 - 1;
   end

   assign D = (RD == 1'b0 &&A0 == 1'b0)?THR_Status:8'bzzzzzzzz;

endmodule

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

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

相关文章

Ubuntu服务器安装Nvidia显卡驱动各类失败问题的解决方案集合

前言 给实验室服务器安装显卡驱动&#xff0c;总是遇到各种各样的问题。故而专门开一个文章记录一下遇到的各类问题。 正常安装方法 在这里安装CUDA&#xff0c;选择最新版本后根据系统配置点选即可&#xff0c;会自动生成对应的链接&#xff0c;如下图。这里选runfile&…

Mysql join用法详解

本篇文章旨在详细讲解Mysql 中join的用法&#xff0c;并附上例题。 一. left join 首先附上图 这个查询语句最根本的是要找出A表中所有的行&#xff0c; 所以如图所示&#xff0c;A表整个被涂蓝 A与B交叉的那部分可以视为ON后所跟的条件 重点是&#xff1a; 如果A表中有一条…

C#学习 - 方法的定义、调用、调试

方法 方法&#xff08;Method&#xff09;是由C/C中的函数&#xff08;Function&#xff09;发展而来的 //C语言 #include <stdio.h> int Add(int x, int y) {return x y; }//函数 int main(void) {int a 4;int b 2;int c Add(a, b);printf("%d %d %d\n&quo…

mysql 删除索引 索引长度还在,数据内存 索引内存没有减少

在我们针对数据表进行了大量删除或者删除掉某个无用的索引之后&#xff0c;该表占的数据内存或者索引并没有明显的变换&#xff0c;这是因为删除操作后在数据文件中留下碎片所致。 查看数据与索引 SELECTTABLE_NAME,concat( TRUNCATE ( data_length / 1024 / 1024, 2 ), MB …

腾讯云4核8G服务器CVM S5性能测评(CPU/流量/系统盘)

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用&#xff1a; 目录 腾讯云4核8G服务器CVM S5性能测评…

【C++】简单理解:将整数(浮点数)转换为字符串(string),将字符串(string)转换为整数(浮点数)方法

用stringstream类&#xff0c;口诀&#xff1a;过滤一下就转化 头文件#include<sstream> 例子&#xff1a;将整数12和浮点数12.34转化为字符串 int main() {int x 12;double d 12.34;string s;//创建一下对象strstringstream str;//过滤一下就转化str << x;st…

分享芯片行业有趣的小知识

随着拜登签署《芯片与科学家法案》&#xff0c;全球芯片争夺战进一步升温&#xff0c;我国芯片市场再次面临霸权主义的挑战。尽管困难重重&#xff0c;我们决不会停止在芯片领域的探索与发展&#xff0c;这彰显了芯片对国家的至关重要性。除了其重要性&#xff0c;芯片还有许多…

矿山边坡安全监测及预警系统解决方案

1.建设背景 近年来&#xff0c;矿山安全问题一直受到国家和社会的高度关注。为了全面提升矿山安全生产水平&#xff0c;国家矿山安全监察局和各省级非煤矿山安全监管部门开展了一项重大举措&#xff1a;推广并实施露天矿山边坡监测系统。 矿山边坡和排土场安全是露天矿山安全生…

vs2019配置sfml外部库出现的问题

问题描述 在debug模式下程序正常运行&#xff0c;在release模式中报错 解决 C/C Windows环境下 boost 安装使用教程 Debug 通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化&#xff0c;便于程序员调试程序。 Release&#xff1a;Release通常称为发…

【HCIE】03.BGP高级特性

每一条BGP路由都可以携带多个路径属性&#xff0c;针对其属性也有特有的路由匹配工具&#xff0c;包括&#xff1a;AS Path Filter和Community Filter。 import方向的属性&#xff0c;出现在如策略里面&#xff0c;加入到BGP路由表中&#xff0c;再传给路由表里&#xff0c;出去…

产品波士顿矩阵

随着公司产品的增多&#xff0c;每个产品的生命周期节点各不相同&#xff0c;很多时候我们往往在产品结构、资源分配方面会产生各种问题&#xff0c;导致需要发展的产品得不到资源&#xff0c;消耗资源的产品却有无法增长&#xff0c;所谓不聚焦导致的问题其实是资源和发展错配…

RP9学习-1

一.基础 1.10个面板位置示意图&#xff1a; 2.常用英文 1.鼠标点击&#xff1a;click or tap 3.工作区 1.恢复默认工作区&#xff1a; view-->reset view 2.自定义工作区&#xff1a; 可以用鼠标左键拖动面板到独立的位置或者吸附到其他面板上 3.自定义工具栏 view-->T…

4核8G服务器腾讯云CVM S5性能如何?CPU型号及租用价格

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用&#xff1a; 目录 腾讯云4核8G服务器CVM S5性能测评…

让AI帮你做出回答-钉钉问答机器人来啦

什么是问答机器人 问答机器人是一种人工智能系统&#xff0c;它可以根据用户提出的问题&#xff0c;自动地搜索并提供相关的答案。这些机器人通常基于自然语言处理技术&#xff0c;可以理解用户提出的问题&#xff0c;并能够快速地给出答案。 问答机器人通常会在多个数据源中…

怎么给商品图片去除背景,制作商品白底图?

很多商家在上架新产品时平台都会要求上传一张白底图&#xff0c;上传商品白底图不仅可以更快速的通过资源位审核&#xff0c;还更容易获得平台的免费曝光机会&#xff01; 我们在编辑商品主图、上传商品素材图片的时候&#xff0c;经常需要用到白底图。但是很多朋友都不知道怎…

虹科分享 | 解决外科医生的担忧:AR让技术自己开口说话

在手术室中&#xff0c;分心可能导致严重错误和伤害&#xff0c;这凸显了在手术过程中减少对外科医生干扰的重要性。对于外科医生来说&#xff0c;在长时间的手术过程中&#xff0c;引入新技术设备时需要考虑多种因素。根据Vuzix对500多名外科医生的综合调查显示&#xff0c;使…

华为云云耀云服务器L实例使用教学:快速安装mysql

最近趁着华为云828大促活动&#xff0c;薅了一台云耀云服务器L实例&#xff0c;由于我买的是纯净版linux系统&#xff0c;所以上面啥也没有&#xff0c;我有一些自己的Java应用&#xff0c;后面就准备全部迁移到这台机器 jdk已经装好了&#xff0c;接下来准备把mysql搞定 首先…

JSR 303 校验

前言&#xff1a; JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架&#xff0c;它已经包含在 JavaEE 6.0 标准中。JSR 303 通过在 Bean 属性上标注类似于 NotNull、Max 等 JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架&#xff0c;它已经包含在 JavaEE 6.0 标…

操作系统学习笔记---计算机系统概述

目录 概念 功能和目标 特征 并发 共享&#xff08;资源共享&#xff09; 虚拟 异步 发展与分类 手工操作阶段&#xff08;无OS&#xff09; 批处理阶段 单道批处理系统 多道批处理系统 分时操作系统 实时操作系统 网络操作系统 分布式计算机系统 个人计算机操…