码迷,mamicode.com
首页 > 其他好文 > 详细

基于FPGA的通用异步收发器设计与实现

时间:2015-11-10 13:47:30      阅读:887      评论:0      收藏:0      [点我收藏+]

标签:

一,UART

  1. UART的协议

 技术分享技术分享

  2UART工作原理

  发送数据:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。

     接受原理:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存

     为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据

 

  3UART波特率发生器 

  波特率是衡量数据传输速率的指标,表示每秒传送数据的字符数,单位为BaudUART的接收和发送是按照相同的波特率进行收发的。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提取出异步的串行数据。根据给定的晶振时钟和要求的波特率,可以算出波特率分频计数值。

二,verilog设计

  1, 顶层模块

 技术分享

  2,接受模块uart_rcv

    状态转换图

     技术分享

  检测数据下降沿,线路有数据传输

  技术分享

  通过data_bit_cnt计数,实现对输入的串行数据进行并行转换

技术分享 

  判断奇偶校验位是否正确

   技术分享

  只要判断接受数据与^rcv_data_reg是否相同

  注:^a操作就是将a中的每一位按位逐一进行异或,例如a=4‘b1010,则b=1^0^1^0=0,由此可以判断a中为1的位数是奇数还是偶数

  简易波特率发生模块

   技术分享

   技术分享

  3,发送模块uart_xmt

  发送完奇偶校验位后需要拉高数据线

   技术分享

  串并转换

   技术分享

  基本原理与发送模块类似

  4,控制模块uart_ctl

   技术分享

  //  地址对应寄存器

  0:{ctl_rst,xmt_rst,rcv_rst}    地址0可读可写,复位信号

  1:clk_div_ctl                  地址1可读可写,时钟分频系数

  2:xmt_data                   地址2可写,发送数据缓存器

  3: xmt_en                    不可读,不可写,发送使能信号

  4: rcv_data                   地址4,可读,接受数据缓存器

  5: {6‘b0,int_rcv,rcv_error}     地址5,可读,接受中断,奇偶校验位错误信号

  6: {7‘b0,int_xmt}               地址6,可读,发送中断位

  技术分享 

  中断信号发送给微机

   技术分享

  技术分享

 

  5,测试模块testbench 

  测试向量用了task任务,通过对比发送的数据和接受的数据,自动反馈是否产生错误

  仿真cpu双向io

   技术分享

  写任务

   技术分享

  读任务

   技术分享

  6modelsim仿真结果

  附:源程序uart_rcv.v

  技术分享 

 技术分享

 技术分享

 

Uart_xmt.v

 技术分享

 技术分享

 技术分享

Uart_ctl.v

 技术分享

技术分享

 技术分享

技术分享

 

 

 

Uart_system

 技术分享

技术分享

 

Testbench 

技术分享

技术分享

技术分享

 

基于FPGA的通用异步收发器设计与实现

标签:

原文地址:http://www.cnblogs.com/love-Jessica/p/4952468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!