临近研三了,自己倾向于要找数字IC方面的工作,苦于教研室的项目一直都是调板子调板子调板子,真正用到FPGA的很少,,本着"工欲善其事必先利其器"的原则,在网上搜寻如何自学FPGA,一咬牙买了块黑金AX515,拿着上面的小例程一个个实现.第一个我觉得有必要记录一下的就是关于UART串口协议的实现.

  由于之前也算接触了FPGA(教研室项目用到了Altera的Cyclone iV),所以拿到板子没有从第一个例程开始,直接上手RTC实时时钟系统的实现.先简单描述一下这个系统的功能(网上的资料大把):这个系统的核心是一块DS1302芯片,它的功能大概可以描述成只要给它一个初始值(符合时间格式),它就可以以这个初始值为基础开始计时.DS1302初始值的设定是通过访问寄存器来完成配置,如hour/minute/second都有各自对应的寄存器地址.在这个例程里面,原本官方的做法是将初始值写死在FPGA程序里,上电就通过IIC总线发送到DS1302,DS1302产生的值也通过IIC总线发送回FPGA,然后FPGA通过UART串口发给PC端,再由串口调试助手显示.官方的初始功能大致就是这样,每次复位初始值都是事先写死的,不能更改,因此我的第一个想法就是通过UART发送一个初始值给FPGA,代替原来写死的做法,这样就可以随时改变初始时间,要完成此功能,就需要了解UART串口的工作原理.

  UART全称是Universal Asychronous Receiver/Transmitter,通用异步收发器,它仅需要一根数据线即可完成数据传输,是最简单的总线协议.UART的格式为1个起始位,5~8个数据位,一个奇偶校验位(可选),一个停止位,如图1:

  要实现UART串口协议,电路至少需要接收模块、发送模块、波特率产生模块。由于UART串口协议没有时钟信号,因此数据传输的同步只能由波特率产生模块来保证。波特率表示每秒钟传输的位数,单位是波特/秒。为保证正确接收数据,一般接收器采用比波特率更高的时钟频率来对数据进行采样,本项目中接收模块的采样频率和PC发送数据的波特率相等(有待进一步探究),波特率为9600,本地时钟SCLK为50MHz,波特率产生模块先对SCLK进行326分频得到CLK,在接收模块中每隔16个CLK周期接收一位PC端发来的数据,以此保证了每秒传送9600bit数据。数据接收开始的标志是起始位拉低,本例程用下降沿检测电路先检测下降沿,然后另有一个信号监视接收进程的状态,若接收进程处于接收数据的过程中(即一帧数据没有接收完),则拉高;若接收完了一帧,则拉低,即此时进程空闲。当检测到下降沿且进程为空闲状态,则开启一帧数据的接收,每16个CLK时钟周期接收1bit数据,周而复始。其中16是预分频因子(PD),326是波特率因子(BD)。采样接收数据应在数据持续时间的中间时刻进行,例如本例中1bit数据持续16个CLK时钟周期,则采样时刻应在该数据为持续时间的第八个CLK周期进行。本例中BD为326,PD为16,SCLK为50MHz,因此接收模块的实际波特率为50000000/(326*16)=9586,与9600有偏差,累积的位时间错位可能会造成错误,但本例中由于一帧数据的持续时间比较长,这种隐患暂时没有体现出来。

RTC实时时间系统学习笔记(一)---------------UART串口的更多相关文章

  1. Dubbo -- 系统学习 笔记 -- 入门

    Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...

  2. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  3. Dubbo -- 系统学习 笔记 -- 配置

    Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...

  4. Dubbo -- 系统学习 笔记 -- 示例 -- 集群容错

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 集群容错 在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重 ...

  5. Dubbo -- 系统学习 笔记 -- 配置参考手册

    Dubbo -- 系统学习 笔记 -- 目录 配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> ...

  6. Dubbo -- 系统学习 笔记 -- 快速启动

    Dubbo -- 系统学习 笔记 -- 目录 快速启动 服务提供者 服务消费者 快速启动 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubb ...

  7. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 结果缓存 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用 ...

  9. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...

随机推荐

  1. ORACLE ASMM与AMM的总结

      概念对比介绍 相信有些人会对ORACLE当中的AMM(Automatic Memory Management)与ASMM(Automatic Shared Memory Management)有些 ...

  2. dm642的中断

    void fifoint_isr();            extern far void vectors(); void int_init() {  IRQ_resetAll();  IRQ_se ...

  3. ssh禁止密码登录

    1.root用户登陆后,运行以下第一句指令,其他根据提示进行输入: ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file ...

  4. Extjs 4.0 Tab页

    1.JSON代码 Ext.MyTabs=Ext.extend(Ext.TabPanel ,{ xtype:"tabpanel", activeTab:2, width:694, h ...

  5. linux内核initrd文件自定义方法

    linux内核initrd文件自定义方法 重新编译内核后,可能加入了自定义的模块,就有可能需要修改init文件,而init文件就在initrd中,这里记录下操作步骤,以防遗忘. 1.  cp  /bo ...

  6. Java中的i++和i--

    /** * @Title:DataCate.java * @Package:com.you.dao * @Description:数据类型转换 * @Author: 游海东 * @date: 2014 ...

  7. FC总线技术简介

    FC是由美国标准化委员会(ANSI)的X3T11小组于1988年提出的高速串行传输总线,解决了并行总线SCSI遇到的技术瓶颈,并在同一大的协议平台框架下可以映射更多FC-4上层协议.FC具备通道和网络 ...

  8. DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

    虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...

  9. c语言 第二次实验报告

    一·实验题目,设计思路,实现方法 11-7 找鞍点 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点. 利用双重 ...

  10. CentOS配置samba服务

    1.服务器需要下载samba.sambaclient包 yum install samba samba-client -y 2.客户端需要下载samba-client.cifs-utils包 yum ...