ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:102.46KB ,
资源ID:20215596      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20215596.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FPGA串口调试文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

FPGA串口调试文档格式.docx

1、其中,数据线上没有数据传输的时候是保持高电平,而第一个低电平的出现就是起始位。当发送数据和接收数据的时候,按以上格式进行就可以了。不知道大家会不会有这样一个问题,经常听说串口传输的速度是多少多少,看了这个数据帧格式,没发现速度是怎么控制的啊。对的,这儿就引出了波特率的问题。波特率时钟并没有表现在传输线上,它其实是用来指示我们每采样或发送一个数据位的速度的。比如说,我们定义一个波特率时钟为 96k,那么我们用这个时钟把数据串行一个一个打出去,接收端只要匹配一个相同的时钟,一个一个数据位接受进来,那数据传输就可以了!2.代码 这部分的代码相对于前面的就稍稍有点多了,我们来一点一点分析,由于这次用到

2、了模块调用,这次上代码,我们把每个文件名都写上。首先我们来看下这个工程的树状代码:33.jpg(9.46 KB)2011-5-10 14:02 通过这个树状图,大家应该就对这个工程有一定了解了,主模块是 uart,它包含四个子模块,分别是接收模块 rx、接收模块的波特率时钟 rx_clk、发送模块 tx、发送模块的波特率时钟 tx_clk。1、主模块:uart.v 复制内容到剪贴板 代码:module uart(clk,rst_n,rxd,txd);input clk;/输入时钟,50M input rst_n;input rxd;/串口输入 rx output txd;/串口输出 tx wi

3、re bps_start1,bps_start2;/rx、tx的波特率启动信号 wire bps_clk1,bps_clk2;/rx、tx 的波特率时钟 wire rx_done;/数据接收完毕信号,有 rx 输出到 tx,rx接收数据由 tx 发送回去 wire7:0 data;/数据寄存器 bps_generate rx_clk(.clk(clk),/50M .rst_n(rst_n),.bps_start(bps_start1),/拉高,产生波特率时钟 .bps_clk(bps_clk1);rx rx (.clk(clk),.rst_n(rst_n),.rxd(rxd),.bps_clk

4、(bps_clk1),.bps_start(bps_start1),.rx_done(rx_done),.data(data);bps_generate tx_clk(.clk(clk),/50M .rst_n(rst_n),.bps_start(bps_start2),/拉高,产生波特率时钟 .bps_clk(bps_clk2);tx tx (.clk(clk),.rst_n(rst_n),.bps_clk(bps_clk2),.bps_start(bps_start2),.data(data),.rx_done(rx_done),.txd(txd);endmodule 通常,我们在顶层模块

5、里不会写具体操作的代码,主模块的作用是将各个模块连接在一起。这样有利于代码的维护!我们看到主模块对外的输入输出引脚只有时钟 clk,复位 rst_n,以及数据输入线rx 和输出线 tx。往下看,我们看到一堆 wire 的定义,这个很重要。由于 input 和 output的端口 Quartus 软件会自动配置成 wire 型,所以这些端口不用再 wire 定义。而其他剩下的端口,如果不“wire”一下,那么下面的各模块例化相互的端口就不会连接在一起。接下来终于要说到模块例化了,所谓“例化”,是从英文的 instantiate 翻译过来的。这里我说个不太严谨的说法:就是把另一个模块添加在这个模块

6、当中,更不严谨的,也可以说是调用吧。代码:bps_generate rx_clk(.clk(clk),/50M .rst_n(rst_n),.bps_start(bps_start1),/拉高,产生波特率时钟 .bps_clk(bps_clk1);我们引用波特率时钟模块来说明例化的格式吧。首先,bps_generate 是原来模块的模块名,后面加一个或几个空格,紧跟着 rx_clk 是在这个模块下(也就是 uart)的模块名。通常,我们会把两个命名一样,或者后面的命名为:i1、i2,意思是模块 1,2这个可以随意。接下来在();里添加这个模块的输入输出引脚,其中.clk()是原来模块的名称,而

7、括号里则是在当前模块下的名称。在当前模块里,两个名称一样,再“wire”一下,那这个信号就连接在一起了。这儿,你可以直接给这个接口赋一个数,例如.data(16h11),这样,也是可以的。2、波特率产生模块:bps_generate.v 代码:module bps_generate(clk,rst_n,bps_start,bps_clk);/50M input rst_n;input bps_start;/高电平,产生波特率时钟 output bps_clk;parameter CNT_NUM=434;/波特率为 50M/434=115200 parameter CNT_NUM_2=216;/

8、计数值的一半,产生一个高电平 reg15:0 cnt;always(posedge clk or negedge rst_n)begin if(!rst_n)cnt=16b0;else if(cnt=CNT_NUM)cnt=16b0;else if(bps_start)cnt=cnt+1b1;else cnt=16b0;end reg bps_clk_r;rst_n)bps_clk_r=1b0;else if(cnt=CNT_NUM_2)bps_clk_r=1b1;else bps_clk_r=1b0;end assign bps_clk=bps_clk_r;endmodule 这里,我们首先

9、用到了 parameter,因为我们常通过修改计数值来改波特率时钟,所以,用 parameter 是很方便的!接下来就是计数的操作,我想不用介绍太多。最后产生的波特率时钟差不多是这样的,我们利用每个高电平来采集、发送数据。44.jpg(3.81 KB)2011-5-10 14:02 这里,还要讲到一个模块重复调用的问题。由于接收和发送的波特率时钟是一样的,我们在顶层模块 uart 调用的时候都是调用了这个代码文件,但分别命名为 rx_clk 和 tx_clk,Quartus 软件在综合的时候就会综合成两个电路。不同于软件程序的调用,大家一定要引起重视!3、接收模块:rx.v 代码:module

10、 rx(clk,rst_n,bps_clk,rxd,bps_start,rx_done,data);input rst_n;input bps_clk;output bps_start;output rx_done;output7:reg reg_rxd0;rst_n)reg_rxd0=1b1;else reg_rxd0=rxd;end reg reg_rxd1,reg_rxd2;rst_n)begin reg_rxd1=1b1;reg_rxd2=1b1;end else begin reg_rxd1=reg_rxd0;reg_rxd2=reg_rxd1;end end wire reg_ne

11、gedge=reg_rxd2&(reg_rxd1);/下降沿检测 reg bps_start_r;reg rx_done_r;rst_n)begin bps_start_r=1b0;rx_done_r=1b0;end else if(reg_negedge)bps_start_r=1b1;/检测到起始位,打开波特率时钟 else if(state=4d9)rx_done_r=1b1;/数据接收完成,启动一次数据传输 else if(state=4d10)begin bps_start_r=1b0;/一帧数据传输完毕,关闭波特率时钟 rx_done_r=1b0;/标志位关闭,避免重复传输 end

12、 end assign bps_start=bps_start_r;assign rx_done=rx_done_r;/数据传输标志位,拉高,表明 rx接收一帧数据完成,tx发送一次该组数据 reg3:0 state;rst_n)state=4b0;else if(state=4d10)state=4b0;/一帧数据传输完毕,回到初始状态 else if(bps_clk)/波特率每个高电平进行状态转移 begin case(state)4d0:state=4d1;4d1:state=4d2;4d2:state=4d3;4d3:state=4d4;4d4:state=4d5;4d5:state=

13、4d6;4d6:state=4d7;4d7:state=4d8;4d8:state=4d9;4d9:state=4d10;4d10:state=4b0;default:endcase end end reg7:0 data_temp;rst_n)begin data_temp=8b0;end else if(bps_clk)begin case(state)4d1:data_temp0=rxd;data_temp1=rxd;data_temp2=rxd;data_temp3=rxd;data_temp4=rxd;data_temp5=rxd;data_temp6=rxd;data_temp7=

14、rxd;/逐位存入数据 endcase end end assign data=data_temp;endmodule 在这个代码文件中,蓝色部分是用来下降沿检测的,前面已经介绍过。红色部分,是一个简单的状态机。FPGA 内部相当于硬件电路,都是并行执行,但是,有些逻辑却是有一定顺序的,这时候,我们就需要使用状态机来完成顺序执行。大家发现,红色部分第一个 always 模块的 case 结构,状态 state 是随着波特率的高电平 else if(bps_clk)一个一个转移的。而在第二个 always 模块里,利用每一个状态执行一次数据读入的操作!4、数据发送模块:tx.v 代码:modul

15、e tx(input clk,input rst_n,input bps_clk,input rx_done,input7:0 data,output bps_start,output txd);reg bps_start_r;rst_n)bps_start_r=1b0;else if(rx_done)bps_start_r=1b1;else if(state=4d11)bps_start_r=1b0;end assign bps_start=bps_start_r;reg7:0 tx_data;rst_n)tx_data=8b0;else if(rx_done)tx_data=data;en

16、d reg3:else if(bps_clk)begin case(state)4d0:state=4d11;/4d10:4d11:endcase end end reg txd_r;rst_n)txd_r=1b1;else if(bps_clk)begin case(state)4d1:txd_r=1b0;txd_r=tx_data0;txd_r=tx_data1;txd_r=tx_data2;txd_r=tx_data3;txd_r=tx_data4;txd_r=tx_data5;txd_r=tx_data6;txd_r=tx_data7;txd_r=1b1;/crc 4d11:/stop

17、 endcase end end assign txd=txd_r;endmodule 发送模块和接收模块是非常相似的,这里就不重复介绍了。3.调试前准备 对于我们这个串口调试:1、我们需要准备一个 USB 数据线,是标准的一边小头,一边大头的那种,我想,很多 MP3,手机都是采用这种数据线的,很好找。2、安装串口转 USB的驱动程序。3、安装一个串口调试助手。这些,我们都将在帖子里附件打包。4.上电调试 分配好管脚,下载代码,打开串口大师如下图:当上面的窗口能显示出下面窗口我们发送的内容,就算是调试成功了 O(_)O!55.jpg(38.68 KB)2011-5-10 14:02 5.总结 这次实验,我们学习了简单的串口 RS232 的通信时序和逻辑设计。也是我们第一次用到了模块调用,第一次设计了一个相对长一些的代码。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1