RS232FPGA.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RS232例程说明文档 RS232例程文件: 下载地址 **存放文件的目录不能有中文 开发平台:Xilinx xc3s500e-5fg320 Spartan 3e 本文主要展示如何使用FPGA来构建一个RS232的收发器,与计算机通信。 大致分为4个部分: RS232工作原理。 如何在FPGA端产生需要的波特率。 发送、接收模块。 实例1. RS232工作原理: 如果手边用个示波器,你们观察到的现象就更加直观。 物理特性: 不发送数据时:传输线上一直发1(用万用表或者示波器能够测得一个-10V(-5V~-15V)的直流电平) 逻辑“1”用-10V电压表示;逻辑“0”用+10V(+5~+15V)电压表示; 约定如果要发送数据,就在数据前面先发一个“0”表示即将有数据发送,发送结束后发送一个1;并且数据从低位开始发送。也就是说如果要发送一个8’b=8’h4B) 实际需要发送 10 bit 的数据;发送顺序为: 0 ② 1 ③1 ④ 0 ⑤1 ⑥ 0 ⑦ 0 ⑧ 1 ⑨ 0 ⑩ 1RS232 使用异步通信协议。 收发数据的两端在发送或接收数据之前都会约定好串行传输参数。波特率,数据位。2.如何用FPGA产生需要的波特率 波特率就是每秒钟数据线上可以发送多少位数据。 常见的9600,就是每秒钟可以发送9600bit 数据。也就说每位数据在数据线上维持的时间为1/9600 s. 常见的波特率有很多: 打开一个串口调试助手就知道了。 如何用FPGA产生需要的波特率的问题关键是分频的问题: 只需要把FPGA的时钟合适分频就能够得到需要的波特率。 SPARTAN 3E的时钟为 50MHz. 50M÷9600 ≈ 5208; 代码: reg [12:0] cnt;//只要能够表示N/2就行 reg clk_out; parameter N = 5208; always @ (posedge clk) begin if (N/2-1 == cnt)beginclk_out = !clk_out;cnt = 0;end elsecnt = cnt + 1; end 还有种方法: baud 指需要的波特率 50M FPGA提供的时钟 n 用多少位寄存器来计数,在声明寄存器的时候声明n + 1 位寄存器 最高位作为时钟输出 K 指计数时候的步长 生命寄存器的时候位宽应该适当,不能太少3. 接收、发送模块 接收模块 前面讨论了RS232数据发送的问题。在发送有效数据前会发送一个“0”;不发送数据时会一直发送“1”;这就意味着在数据线上一直为“1”。如果发现一个从“1”变到“0”那么意味着即将有数据发送过来。关键问题是如何检测这个变化。 用于检测这种变化的常用方法是用一个是比特率几倍的时钟来一直检测。当某一个时刻检测到数据线上“0”时,如果在接下来的几个时钟内都检测到“0”,那么就意味这数据发送即将开始。 实际电路可以采用D触发器。如果我们用8*比特率的时钟的话,我们可以用4个D触发器,也可以使用更多。但是不能超过8个,考虑到延迟的话最好不要超过7个。4个是最合适的,一方面4个足以检测到,另一方面又节约资源。采用如下电路: 右边输出端叫Control; 左边输出端分别为 rxd 、clk; Verilog可以这样写: reg [3:0] fd; reg control; always @ (posedge clk) begin if (!rxd !control)beginfd[0] = rxd;fd[1] = fd[0];fd[2] = fd[1];fd[3] = fd[2];control = ~( fd[0] | fd[3] );end end 当control = 1 时,表示数据发送开始;并且驱动后面接收数据电路; 具体接收模块的实现将在后面的实例中进行讲解; 发送模块 发送模块需要将发送的数据依次发送出去; 发送规则与接收规则一致; 发送数据前首先发送一个“0”,接着发送有效数据;最后发送一个“1”; 发送数据比接收数据容易实现; 最后同过一个实例来讲解;实例 (实例不是自己写的) 实例是一个上位机发送数据接收成功后,会点亮LED。按下BTN South(按键)的话会发送一个左斜线(/); fp_even 模块的目的是产生一个9600波特率的时钟; fp_odd 模块的目的是产生一个8*9600的时钟,用于接收数据; uart_send模块为发送模块; uart_rc 模块为接收模块; 重点讲解接收模块: module uart_rc(rst,clk,sin,pout); input rst;//high valid input clk; input sin; output[7:

文档评论(0)

xciqshic + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档