已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FPGA 实现串行接口实现串行接口 RS232 串行接口 RS 232 串行接口是连接 FPGA 和 PC 机的一种简单方式 这个项目向大家展示了如果使用 FPGA 来创建 RS 232收发器 整个项目包括5个部分 RS232是怎样工作的 如何产生需要的波特率 发送模块 接收模块 应用实例 RS 232接口是怎样工作的接口是怎样工作的 作为标准设备 大多数的计算机都有1到2个 RS 232串口 特性特性 RS 232有下列特性 使用9针的 DB 9 插头 旧式计算机使用25针的 DB 25 插头 允许全双工的双向通讯 也就是说计算机可以在接收数据的同时发送数据 最大可支持的传输速率为10KBytes s DB 9插头插头 你可能已经在你的计算机背后见到过这种插头 它一共有9个引脚 但是最重要的3个引脚是 引脚2 RxD 接收数据 引脚3 TxD 发送数据 引脚5 GND 地 仅使用3跟电缆 你就可以发送和接收数据 串行通讯串行通讯 数据以每次一位的方式传输 每条线用来传输一个方向的数据 由于计算机通常至少需要 若干位数据 因此数据在发送之前先 串行化 通常是以8位数据为1组的 先发送最低 有效位 最后发送最高有效位 异步通讯异步通讯 RS 232使用异步通讯协议 也就是说数据的传输没有时钟信号 接收端必须有某种方式 使之与接收数据同步 对于 RS 232来说 是这样处理的 串行线缆的两端事先约定好串行传输的参数 传输速度 传输格式等 当没有数据传输的时候 发送端向数据线上发送 1 每传输一个字节之前 发送端先发送一个 0 来表示传输已经开始 这样接收端便 可以知道有数据到来了 开始传输后 数据以约定的速度和格式传输 所以接收端可以与之同步 每次传输完成一个字节之后 都在其后发送一个停止位 1 让我们来看看0 x55是如何传输的 0 x55的二进制表示为 01010101 但是由于先发送的是最低有效位 所以发送序列是这样的 1 0 1 0 1 0 1 0 下面是另外一个例子 传输的数据为0 xC4 你能看出来吗 从图中很难看出来所传输的数据 这也说明了事先知道传输的速率对于接收端有多么重要 数据传输可以多快数据传输可以多快 数据的传输速度是用波特来描述的 亦即每秒钟传输的数据位 例如1000波特表示每秒钟 传输100比特的数据 或者说每个数据位持续1毫秒 波特率不是随意的 必须服从一定的标准 如果希望设计123456波特的 RS 232接口 对不 起 你很不幸运 这是不行的 常用的串行传输速率值包括以下几种 1200 波特 9600 波特 38400 波特 115200 波特 通常情况下是你可以使用的最高速度 在115200 波特传输速度下 每位数据持续 1 115200 8 7 s 如果传输8位数据 共持续 8 x 8 7 s 69 s 但是每个字节的传输又要求额外的 开始位 和 停止位 所以实际上需要花 费10 x 8 7 s 87 s 的时间 最大的有效数据传输率只能达到 11 5KBytes 每秒 在115200 波特传输速度下 一些使用了不好的芯片的计算机要求一个长的停止位 1 5或2位 数据的长度 这使得最大传输速度降到大约10 5KBytes 每秒 物理层物理层 电缆上的信号使用正负电压的机制 1 用 10V 的电压表示 或者在 5V 与 15V 之间的电压 0 用 10V 的电压表示 或者在 5V 与 15V 之间的电压 所以没有数据传输的电缆上的电压应该为 10V 或 5到 10之间的某个电压 波特率发生器波特率发生器 这里我们使用串行连接的最大速度115200波特 其他较慢的波特也很容易由此产生 FPGA 通常运行在远高于115200Hz 的时钟频率上 对于今天的标准的来说 RS 232真是太慢 了 这就意味着我们需要用一个较高的时钟来分频产生尽量接近于115200Hz 的时钟信号 从1 8432MHz 的时钟产生 通常 RS 232芯片使用1 8432MHz 的时钟 以为这个时钟很容易产生标准的波特率 所以我 们假设已经拥有了一个这样的时钟源 只需要将 1 8432MHz 16分频便可得到 115200Hz 的时钟 多方便啊 reg 3 0 BaudDivCnt always posedge clk BaudDivCnt 2000000 printf else printf acc 2000000 这段代码会精确的以平均每 17 361111111 个时钟间隔打印出一个 为了从 FPGA 得到同样的效果 考虑到串行接口可以容忍一定的波特率误差 所以即使我 们使用17 3或者17 4这样的分频比也是没有关系的 FPGA 波特率发生器波特率发生器 我们希望2000000是2的整数幂 但很可惜 它不是 所以我们改变分频比 2000000 115200 约等于 1024 59 17 356 这跟我们要求的分频比很接近 并且使得在 FPGA 上实现起来相当有效 10 位的累加器 9 0 1位进位输出 10 reg 10 0 acc 一共11位 always posedge clk acc acc 9 0 59 我们使用上一次结果的低10位 但是保留11位结果 wire BaudTick acc 10 第11位作为进位输出 使用 2MHz 时钟 BaudTick 为 115234 波特 跟理想的115200波特存在 0 03 的误差 参数化的参数化的 FPGA 波特率发生器波特率发生器 前面的设计我们使用的是10位的累加器 如果时钟频率提高的话 需要更多的位数 下面是一个使用 25MHz 时钟和 16 位累加器的设计 该设计是参数化的 所以很容易根 据具体情况修改 parameter ClkFrequency 25000000 25MHz parameter Baud 115200 parameter BaudGeneratorAccWidth 16 parameter BaudGeneratorInc Baud BaudGeneratorAccWidth ClkFrequency reg BaudGeneratorAccWidth 0 BaudGeneratorAcc always posedge clk BaudGeneratorAcc BaudGeneratorAcc BaudGeneratorAccWidth 1 0 BaudGeneratorInc wire BaudTick BaudGeneratorAcc BaudGeneratorAccWidth 上面的设计中存在一个错误 BaudGeneratorInc 的计算是错误的 因为 Verilog 使用 32 位 的默认结果 但实际计算过程中的某些数据超过了32位 所以改变一种计算方法 parameter BaudGeneratorInc Baud 5 ClkFrequency 4 这行程序也使得结果成为整数 从而避免截断 这就是整个的设计方法了 现在我们已经得到了足够精确的波特率 可以继续设计串行接收和发送模块了 RS 232发送模块发送模块 下面是我们所想要实现的 它应该能像这样工作 发送器接收8位的数据 并将其串行输出 TxD start 置位后开始传输 当有数传输的时候 使 busy 信号有效 此时 TxD start 信号被忽略 RS 232模块的参数是固定的 8位数据 2个停止位 无奇偶校验 数据串行化数据串行化 假设我们已经有了一个115200波特的 BaudTick 信号 我们需要产生开始位 8位数据以及停止位 用状态机来实现看起来比较合适 reg 3 0 state always posedge clk case state 4 b0000 if TxD start state 4 b0100 4 b0100 if BaudTick state 4 b1000 开始位 4 b1000 if BaudTick state 4 b1001 bit 0 4 b1001 if BaudTick state 4 b1010 bit 1 4 b1010 if BaudTick state 4 b1011 bit 2 4 b1011 if BaudTick state 4 b1100 bit 3 4 b1100 if BaudTick state 4 b1101 bit 4 4 b1101 if BaudTick state 4 b1110 bit 5 4 b1110 if BaudTick state 4 b1111 bit 6 4 b1111 if BaudTick state 4 b0001 bit 7 4 b0001 if BaudTick state 4 b0010 停止位1 4 b0010 if BaudTick state 4 b0000 停止位2 default if BaudTick state 4 b0000 endcase 注意看这个状态机是怎样实现当 TxD start 有效就开始 但只在 BaudTick 有效的时候才转 换状态的 现在 我们只需要产生 TxD 输出即可 reg muxbit always state 2 0 case state 2 0 0 muxbit TxD data 0 1 muxbit TxD data 1 2 muxbit TxD data 2 3 muxbit TxD data 3 4 muxbit TxD data 4 5 muxbit TxD data 5 6 muxbit TxD data 6 7 muxbit TxD data 7 endcase 将开始位 数据以及停止位结合起来 assign TxD state 4 state 3 RS232接收模块接收模块 下面是我们想要实现的模块 我们的设计目的是这样的 1 当 RxD 线上有数据时 接收模块负责识别 RxD 线上的数据 2 当收到一个字节的数据时 锁存接收到的数据到 data 总线 并使 data ready 有效 一个周期 注意 只有当 data ready 有效时 data 总线的数据才有效 其他的时间里不要使用 data 总线上的数据 因为新的数据可能已经改变了其中的部分数据 过采样过采样 异步接收机必须通过一定的机制与接收到的输入信号同步 接收端没有办法得到发送断的 时钟 这里采用如下办法 1 为了确定新数据的到来 即检测开始位 我们使用几倍于波特率的采样时钟对接收 到的信号进行采样 2 一旦检测到 开始位 再将采样时钟频率降为已知的发送端的波特率 典型的过采样时钟频率为接收到的信号的波特率的16倍 这里我们使用8倍的采样时钟 当 波特率为115200时 采样时钟为921600Hz 假设我们已经有了一个8倍于波特率的时钟信号 Baud8Tick 其频率为 921600Hz 具体设计具体设计 首先 接受到的 RxD 信号与我们的时钟没有任何关系 所以采用两个 D 触发器对其进行 过采样 并且使之我我们的时钟同步 reg 1 0 RxD sync always posedge clk if Baud8Tick RxD sync RxD sync 0 RxD 首先我们对接收到的数据进行滤波 这样可以防止毛刺信号被误认为是开始信号 reg 1 0 RxD cnt reg RxD bit always posedge clk if Baud8Tick begin if RxD sync 1 else if RxD sync 1 if RxD cnt 2 b00 RxD bit 0 else if RxD cnt 2 b11 RxD bit 1 end 一旦检测到 开始位 使用如下的状态机可以检测出接收到每一位数据 reg 3 0 state always posedge clk if Baud8Tick case state 4 b0000 if RxD bit state 4 b1000 start bit found 4 b1000 if next bit state 4 b1001 bit 0 4 b1001 if next bit state 4 b1010 bit 1 4 b1010 if next bit state 4 b1011 bit 2 4 b1011 if next bit state 4 b1100 bit 3 4 b1100 if next bit state 4 b1101 bit 4 4 b1101 if next bit state 4 b1110 bit 5 4 b1110 if next bit state 4 b1111 bit 6 4 b1111 if next bit state 4 b0001 bit 7 4 b0001 if next bit state 4 b0000 stop bit default state 4 b0000 endcase 注意 我们使用了 next bit 来遍历所有数据位 reg 2 0 bit spacing always posedge clk if state 0 bit spacing 0 else if Baud8Tick bit spacing bit spacing 1 wire next bit bit spacing 7 最后我们使用一个移位寄存器来存储接受到的数据 reg 7 0 RxD data always posedge clk if Baud8Tick 怎样使用发送和接收模块怎样使用发送和接收模块 这个设计似的我们可以通过计算机的串行口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟电厂平台及其实践应用综述
- 2026年基金从业资格考试证券投资基金基础知识考点解析含解析
- 陈善昂投资学金融改革信息学院0410
- 2026年新课标II卷数学压轴题模拟卷含解析
- 2026年新高考全国甲卷英语高频考点专题卷含解析
- 直线与直线垂直课件2025-2026学年高一下学期数学人教A版必修第二册
- 煤调湿工QC管理能力考核试卷含答案
- 矩形(第2课时)(教学课件)数学新教材浙教版八年级下册
- 动车组维修师岗前安全知识竞赛考核试卷含答案
- 绿氢产业发展动态
- 上海初中入团考试试题及答案
- 2025向量化与文档解析技术加速大模型RAG应用
- 2025年工会财务知识竞赛考试题库及参考答案
- 酮症酸中毒教学课件
- 供应商信息安全管理制度
- 国有企业招标培训课件
- 丛林寺院管理制度
- 企业所得税年度纳税申报表(A类2017年版2025年01月修订)-做账实操
- 《中国概况》课件
- 2024年嘉兴市属国有企业招聘考试真题
- 2025中级消防设施操作员作业考试题及答案(1000题)
评论
0/150
提交评论