基于FPGA的RS232设计(共21页).doc

上传人:飞****2 文档编号:13876816 上传时间:2022-05-01 格式:DOC 页数:21 大小:568KB
返回 下载 相关 举报
基于FPGA的RS232设计(共21页).doc_第1页
第1页 / 共21页
基于FPGA的RS232设计(共21页).doc_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《基于FPGA的RS232设计(共21页).doc》由会员分享,可在线阅读,更多相关《基于FPGA的RS232设计(共21页).doc(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上课程设计(论文)说明书 题 目 : 基于FPGA的RS232串口通信 院 (系) : 信息与通信学院 专 业 : 微电子学 学生姓名 : 学 号 : 指导教师 : 职 称 : 副教授 2012 年 12 月 10 日专心-专注-专业摘 要实验设计了基于verilog描述的RS232串口通信控制器,通过串口调试工具实现PC机和FPGA互发和接收数据。完成的功能包括实现收发一帧10个bit、波特率为9600的串口通信控制器,FPGA接收数据后显示在串口助手的接收数据栏里。实验的重心放在了RS232串口通信控制器发送模块和接收模块的设计,采用了自顶向下的思路进行设计。报告中

2、给出了完整的设计思路和过程,并将系统分模块进行了详细的设计,给出了verilog语言描述。完成了各个模块以及系统整体的仿真验证。最终下载到实验板上测试通过。关键词: RS232;verilog;串口通信;发送;接收;分频AbstractExperiment design based on the description of the Verilog RS232 serial communication controller, through the serial port debugging tools to achieve PC machine and FPGA sending and re

3、ceiving data. Complete function includes transmitting a frame of 10 bit, baud rate to 9600 serial communication controller, FPGA receives the data displayed in a serial assistants to receive data column.Key words:RS232 ; verilog ; Serial communication ;transmission ;receive ; frequency division 目 录引

4、言引言系统常需要进行异步串行数据传输。目前广泛使用的RS232异步串行接口,如8250、 NS16450等专用集成器件,虽然使用简单,却占用电路板面积、布线复杂等缺点。片上系统SoC(System on Chip)是以嵌入式系统为核心,以IP复用技术为基础,集软、硬件于一体的设计方法。使用IP复用技术,将UART集成到FPGA器件上,可增加系统的可靠性,缩小PCB板面积;其次由于IP核的特点,使用IP核可使整个系统更加灵活,还可根据需要实现功能升级、扩充和裁减。这里采用VHDL语言编写 UART模块,将其集成到FPGA上,与器件其他功能模块构成片上系统SoC。第一部分 任务要求1.1课题要求设

5、计并实现一个可以和PC机通过RS232协议进行通信的串口通信控制器。1. PC机通过串口调试工具来验证程序的功能;2. 实现一个收发一帧10个bit的串口控制器,10个bit是1位起始位,8位数据位,1位结束位,无奇偶校验位;3. 串口的波特率选择9600bit,串口处于全双工工作状态;4. PC机可随时向FPGA发送0F的十六进制数据;1.2设计目标根据课题要求,实验中将目标进行了细化,叙述如下:1. 设定数据帧格式为10bit,其中第一位为起始位,定位低电平,8位数据位,1位结束位,无数据传输时为高电平;2.通过串口调试工具向FPGA发送数据,FPGA接收后显示串口调试工具的接收数据窗口;

6、第二部分 系统设计2.1系统结构设计2.1.1系统结构框图接收数据PC发送数据FPGA PGA图2.1 RS232串口通信控制器系统结构框图串口通信控制器的输入是PC发送的数据。当发送数据按键按下时,FPGA向PC发送已定义好的数据。同时,当FPGA检测到PC发送数据帧的起始位时,开始接收数据,并行输出。2.1.2系统逻辑功能划分PC发送模块分频模块接收模块图2.2 RS232串口通信控制器系统逻辑框图如图2.2所示,系统可逻辑地划分为三个子系统:一是分频子系统,包括为发送模块和接收模块提供波特率为9600bit的时钟;二是发送子系统,包括发送模块;三是接收子系统,包括接收模块和串口助手显示模

7、块。2.1.3层次模块划分系统划分为两层,自顶向下分别是顶层模块、控制器子模块。顶层描述了整个系统的功能和运行;控制器子模块实现系统中各个独立而完整的功能部分,每个层次可用一个或多个具体模块加以实现。A. 顶层模块:作用为集成子模块功能,控制子模块的连接和耦合信号。定义名称为uart1,在其中例化子模块。B. 中层模块:具体实现顶层模块的描述,包括的功能主要是产生时钟信号,发送模块和接收模块的定义和状态的转移:speed_select时钟分频模块,将50MHz的时钟分频为96001Hz的时钟。定义波特率为9600bit,波特因子为1。输入:50MHz晶振信号。输出:送往接收模块和发送模块的96

8、0011Hz的信号。a) my_uart_rx接收模块,检测接收端,若检测到低电平则开始接收数据,每隔1个周期接收一位数据,直到接满8bit。输入:96001Hz时钟信号、PC机发送的串行数据。输出:PC机发送的串行数据并行输出。b) my_uart_tx发送模块。当发送数据按键确定有效时向PC发送自定义的数据。输入:96001Hz时钟信号、发送数据按键。输出:字符串的串行输出。以上模块分别定义在一个工程内,最后在顶层模块中用语言进行连接。2.1.4模块设计图发送模块设计发送模块工作时首先检测发送数据下降沿到来,如复位信号有效时,控制器处于复位状态,一旦检测到复位信号无效并且检测到下降沿的到来

9、则进入起始状态。从PC接收到的数据帧:1位起始位+8位数据位+1()位停止位(无奇偶校验),检测到电脑端的起始位后(rs232_rx下降沿)打开波特率发生器,到起始电平时间的中点时检测数据,每隔“一个”电平时间,采集一次并存入接收暂存寄存器,待到1(或)个结束位到来后将接收暂存寄存器数据放入接收寄存器并关闭波特率发生器,清楚数据检测使能标志。 接收模块设计与发送模块类似,接收模块分为检验下降沿到来、启动接收数据使能有效、接收数据处理等模块。没有检测到起始位时程序一直处于开始状态,一旦检测到低电平的起始位(neg_rs232_rx=1),则进入找中状态。定时计数器cnt=0时则进入等待状态,当定

10、时计数器cnt=1时对数据进行采样,直到移位计数器rx_temp_data0 = rs232_rx;,即8bit数据采样完毕,此时进入停止状态,重新返回开始状态。检测到由接收模块使能位的下降沿后开启波特率发生器并使能发送,隔半个电平时间后开始发送数据帧每隔“一个”电平时间更新要发的数据位,发送一位结束位后停止工作2.1.7分频模块设计串行异步通信的关键在于准确地检测到起始位,因此接收端的时钟必须采用比波特率更高的时钟信号,以便提高采样的分辨率和抗干扰能力,从而更准确地判定起始位。本实验中波特率为9600bit,取波特率因子为1。接收端检测到传输线上电平由高到低的变化后便开始对接收时钟进行计数,

11、当计到8个时钟以后,再次对传输线进行采样,如果仍为低电平,则确认是起始位,而不是干扰信号,之后每隔16个时钟进行一次采样,直到采样到停止位。而且由于每一次采样都是在码元的中心进行的,这样还可以最大限度地避免收、发时钟偏差对数据传送造成的影响。2.2系统硬件语言描述2.2.1verilog描述思路第二部分“系统设计”中对系统的功能和逻辑结构、状态转移以及模块划分都有了详细的叙述,模块间的耦合和信号的传递关系已经清晰。可以使用verilog语言描述硬件电路了。发送模块和接收模块的verilog语言描述按照事先设计好的状态转移进行编写可以使电路思想明晰化,避免编程过程中用软件的思维去描述硬件的电路系

12、统,也可有效避免系统性的错误。由于进行了细致的模块划分,模块的间的耦合程度降到了很低,这就使得电路设计的可靠性大为增强,只要模块的输出满足了功能定义,整个系统就能正常工作,即便个别模块出现问题,也不会过多影响到其他模块。实际测试过程中也印证了这一点。2.2.2总体电路的描述顶层符号文件描述如下:图2.8 顶层符号文件2.2.3分块电路的verilog描述本节给出分块电路的硬件描述,对关键部分进行了分析。1、 发送模块的描述timescale 1ns / 1psmodule my_uart_tx( clk,rst_n, rx_data,rx_int,rs232_tx, clk_bps,bps_s

13、tart,led1);input clk;/ 50MHz主时钟input rst_n;/低电平复位信号input clk_bps;/ clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据改变点input7:0 rx_data;/接收数据寄存器input rx_int;/接收数据中断信号,接收到数据期间始终为高电平,在该模块中利用它的下降沿来启动串口发送数据output rs232_tx;/ RS232发送数据信号output bps_start;/接收或者要发送数据,波特率时钟启动信号置位output led1;reg rx_int0,rx_int1,rx_int2;/rx_i

14、nt信号寄存器,捕捉下降沿滤波用wire neg_rx_int;/ rx_int下降沿标志位always (posedge clk or negedge rst_n) beginif(!rst_n) beginrx_int0 = 1b0;rx_int1 = 1b0;rx_int2 = 1b0; endelse beginrx_int0 = rx_int;rx_int1 = rx_int0;rx_int2 = rx_int1; endEndassign neg_rx_int = rx_int1 & rx_int2;/捕捉到下降沿后,neg_rx_int拉高保持一个主时钟周期reg7:0 tx_d

15、ata;/待发送数据的寄存器reg bps_start_r;reg tx_en;/发送数据使能信号,高有效reg3:0 num;always (posedge clk or negedge rst_n) beginif(!rst_n) beginbps_start_r = 1bz;tx_en = 1b0;tx_data = 8d0;endelse if(neg_rx_int) begin/接收数据完毕,准备把接收到的数据发回去bps_start_r = 1b1;tx_data = rx_data;/把接收到的数据存入发送数据寄存器tx_en = 1b1;/进入发送数据状态中endelse if

16、(num=4d11) begin/数据发送完成,复位bps_start_r = 1b0;tx_en = 1b0;endendassign bps_start = bps_start_r;reg rs232_tx_r;reg led1_r;always (posedge clk or negedge rst_n) beginif(!rst_n) beginnum = 4d0;rs232_tx_r = 1b1;led1_r=1b0;endelse if(tx_en) beginif(clk_bps)begin led1_r=1b1;case (num)4d0: rs232_tx_r = 1b0;

17、/发送起始位4d1: rs232_tx_r = tx_data0;/发送bit04d2: rs232_tx_r = tx_data1;/发送bit14d3: rs232_tx_r = tx_data2;/发送bit24d4: rs232_tx_r = tx_data3;/发送bit34d5: rs232_tx_r = tx_data4;/发送bit44d6: rs232_tx_r = tx_data5;/发送bit54d7: rs232_tx_r = tx_data6;/发送bit64d8: rs232_tx_r = tx_data7;/发送bit74d9: rs232_tx_r = 1b1;

18、/发送结束位default: rs232_tx_r = 1b1;endcasenum = num+1b1;endelse if(num=4d11)begin num = 4d0;/复位led1_r=1b0;endendendassign rs232_tx = rs232_tx_r;assign led1=led1_r;endmodule2、 接收模块的描述timescale 1ns / 1psmodule my_uart_rx(clk,rst_n, rs232_rx,rx_data,rx_int,clk_bps,bps_start,led0);input clk;/ 50MHz主时钟input

19、 rst_n;/低电平复位信号input rs232_rx;/ RS232接收数据信号input clk_bps;/ clk_bps的高电平为接收或者发送数据位的中间采样点output bps_start;/接收到数据后,波特率时钟启动信号置位output7:0 rx_data;/接收数据寄存器,保存直至下一个数据来到output rx_int;/接收数据中断信号,接收到数据期间始终为高电平output led0;reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;/接收数据寄存器,滤波用wire neg_rs232_rx;/表示数据线接收到下降沿alway

20、s (posedge clk or negedge rst_n) beginif(!rst_n) beginrs232_rx0 = 1b0;rs232_rx1 = 1b0;rs232_rx2 = 1b0;rs232_rx3 = 1b0;endelse beginrs232_rx0 = rs232_rx;rs232_rx1 = rs232_rx0;rs232_rx2 = rs232_rx1;rs232_rx3 = rs232_rx2;endendassign neg_rs232_rx = rs232_rx3 & rs232_rx2 & rs232_rx1 & rs232_rx0;/接收到下降沿后

21、neg_rs232_rx置高一个时钟周期reg bps_start_r;reg3:0 num;/移位次数reg rx_int;/接收数据中断信号,接收到数据期间始终为高电平always (posedge clk or negedge rst_n)if(!rst_n) beginbps_start_r = 1bz;rx_int = 1b0;endelse if(neg_rs232_rx) begin/接收到串口接收线rs232_rx的下降沿标志信号bps_start_r = 1b1;/启动串口准备数据接收rx_int = 1b1;/接收数据中断信号使能endelse if(num=4d12) b

22、egin/接收完有用数据信息bps_start_r = 1b0;/数据接收完毕,释放波特率启动信号rx_int = 1b0;/接收数据中断信号关闭endassign bps_start = bps_start_r;reg7:0 rx_data_r;/串口接收数据寄存器,保存直至下一个数据来到reg led0_r;reg7:0 rx_temp_data;/当前接收数据寄存器always (posedge clk or negedge rst_n)if(!rst_n) beginrx_temp_data = 8d0;num = 4d0;rx_data_r = 8d0;led0_r=1b0;ende

23、lse if(rx_int) begin/接收数据处理 led0_r=1b1;if(clk_bps) begin/读取并保存数据,接收数据为一个起始位,8bit数据,1或2个结束位case (num)4d1: rx_temp_data0 = rs232_rx;/锁存第0bit4d2: rx_temp_data1 = rs232_rx;/锁存第1bit4d3: rx_temp_data2 = rs232_rx;/锁存第2bit4d4: rx_temp_data3 = rs232_rx;/锁存第3bit4d5: rx_temp_data4 = rs232_rx;/锁存第4bit4d6: rx_te

24、mp_data5 = rs232_rx;/锁存第5bit4d7: rx_temp_data6 = rs232_rx;/锁存第6bit4d8: rx_temp_data7 = rs232_rx;/锁存第7bitdefault: ;endcasenum = num+1b1;endelse if(num = 4d12) begin/我们的标准接收模式下只有1+8+1(2)=11bit的有效数据num = 4d0;/接收到STOP位后结束,num清零rx_data_r = rx_temp_data;/把数据锁存到数据寄存器rx_data中led0_r=1b0;endendassign rx_data

25、= rx_data_r;assign led0=led0_r;endmodule3、 分频模块的描述module speed_select(clk,rst_n,bps_start,clk_bps);input clk;/ / 50MHz主时钟input rst_n;/低电平复位信号input bps_start;/接收到数据后,波特率时钟启动信号置位output clk_bps;/ clk_bps的高电平为接收或者发送数据位的中间采样点defineBPS_PARA5207/波特率9600分频点数define BPS_PARA_22603reg12:0 cnt;reg clk_bps_r;reg

26、2:0 uart_ctrl;/ uart?always (posedge clk or negedge rst_n) beginif(!rst_n) cnt = 13d0;else if(cnt = BPS_PARA) | !bps_start) cnt = 13d0;/clear else cnt = cnt+1b1; endalways (posedge clk or negedge rst_n) beginif(!rst_n) clk_bps_r = 1b0;else if(cnt = BPS_PARA_2) clk_bps_r = 1b1;else clk_bps_r = 1b0; e

27、ndassign clk_bps = clk_bps_r;endmodule2.3系统仿真验证系统仿真分为两个步骤进行,首先是关键模块的仿真,验证子系统功能的正确性,然后是综合仿真,验证整个系统的功能。仿真环境是QuartusII 7.2。首先是分频模块的仿真。由仿真结果可看出bclk的时钟周期为104us,与要求结果一致,频率为9600Hz。图2.9 分频模块仿真图(9600Hz分频)然后是发送模块的仿真波形。下图为发送模块第一个字符发送的波形,第一个字符的数值为“”,发送时低位先发送,因此仿真波形由时间的先后顺序,其序列应为“”,每一帧数据为10个bit,第一个bit为起始位,最后一个bi

28、t为停止位,可以看出,中间的八位为“”,说明了仿真波形的正确性。图2.10 发送模块仿真图下图为接收模块仿真图。设定的输入信号为“”。接收时将先接收到的数据作为低位,后接收到的数据作为高位,因此转化成的并行数据应为“”,因此仿真波形正确。图2.11 接收模块仿真图第三部分 结果与分析3.1实现功能说明本实验完成的RS232串口通信控制器,完成了课题要求的所有功能。由于顶层设计采用了子系统分模块描述的方法,使得控制器具有很好的扩展性。可以在不改变系统框架和模块间电路连接关系,增加其他模块,实现其他功能。本课题中并没有在数据帧中加入校验位,仅仅实现了1位起始位,1位停止位和8位数据位的传输。初步实

29、现了PC和FPGA之间的通信。数字系统的设计,真正的重点在于把系统层面的设计做好,把系统状态机设计完整,系统架构清晰,层次明确,稳定性好,可扩展和可移植性好,这样的系统给到用户,只要添加用户模块或者稍作修改即可完成非特定的功能。3.2器件资源分析在设计阶段,对系统描述采用过多种方式,尝试了多种描述,代码的长度在增加,模块在增多,但系统稳定性和可扩展性也在增强,层次结构和模块设计也更加完善。设计之初对资源使用没有多少概念,时常以软件的思想描述硬件,在描述中使用乘法等资源耗费严重的操作,也曾使用过嵌套多层的IF-ELSE语句,产生很长的选择器,降低了模块的可靠性,增加处理延时。随着设计的深入,加上

30、反复求精的过程磨练,逐步对硬件描述综合出的实际电路形式有了更多的理解,对延时和资源占用有了初步概念。一个显见的结论是描述代码的长度和综合后的电路形式与资源占用无必然联系。需要关注编译器在综合时如何将verilog行为级描述转化为结构化的门级电路,才能分析清楚资源占用率和电路结构。行为级描述可能与实际综合的电路产生不一致,需要谨慎对待。图3.1是QuartusII编译工程后的综合报告。逻辑单元占用率27%。图3.1 QuartusII编译综合报告3.3故障和问题分析实验中由于仔细设计了详细划分了子模块、各模块的实现都仔细进行了描述,故没有出现太多的故障。由于以前对verilog语言的理解停留在很

31、低的层次,甚至和C语言等软件语言混为一谈,没有很好地理解状态机、硬件并发性、数字系统设计的方法,主要的麻烦产生在verilog描述上。在查阅了诸多相关资料后对verilog的语法基本熟悉,从最初的类似C语言的风格到模块初步成型、状态机引入,再到最后全模块化,自顶向下设计系统,完成verilog描述。最深的感受在于,开始时一心专注于代码的编写和语法的使用,忽视了系统设计,导致设计结果不令人满意,后来逐步采用自顶向下的设计思路,先从逻辑上把系统的功能和子系统的划分描述清楚,然后设计各个模块的接口和定义,最后分别去描述底层各个模块的功能和实现,清晰明了,一气呵成。这也是系统没有多少故障的主要原因。v

32、erilog描述中解决的最成功的一个问题是Multi-drive错误的处理。采用了中间寄存器存储各个信号,然后利用选择器进行选择,就避免了多驱动的问题。第四部分 总结与结论4.1实验结论本实验历时四周,分为选定题目、系统设计、verilog描述、成果验收四个步骤。RS232串口通信控制器的设计成果完成了基本实验要求,实现串口的基本通信功能。系统采用了自顶向下的设计思路,详细分析了系统功能,划分了3个模块分别实现子系统各部分的功能。在设计中采用顶层模块调用底层模块的设计方法。报告中给出了系统设计的四个步骤的详细情况,给出了系统的仿真和分析,附录了完整硬件描述代码和电路图。4.2总结体会通过基于F

33、PGA的RS232串口通信的设计、制作、调试等实验,非常锻炼我的动手能力。首先是对Quartus软件的认识相较以前用起来更顺利了,不管是编译还是波形仿真,其中的内涵都能基本的了解。其次就是verilog硬件描述语言这 方面也得到了显著的提高,从不懂得看程序到能学会修改程序。例如verilog的两个误区:使用reg 类型还是net类型,reg类型只是在过程模块中被赋值;而net类型则是在过程快外面被赋值或者驱动。同时也能明白每一个always模块之间是并行的关系,是同步的,同时不能在两个或者多个always模块中给同一个输出变量赋值。接着就将每个模块程序写好之后,就会进行编译和波形仿真。在为做这

34、次设计之前,我连最基本的波形仿真都不知道如何给输入变量赋初始值。经过不断的努力,我能看懂程序,也能把输入变量设置好初始值。最后就是FPGA板子的烧入了,首先要学会看板子的原理图,接着就是学会分配管脚。通过这次试验收获颇深。第五部分 元器件清单5.1元器件和仪表清单名称数量作用FPGA实验板cycloneII EP2C8Q208C81下载测试RS232串口通信控制器台式电脑1在QuartusII7.2软件环境中编写verilog描述代码,进行仿真验证和分析9针串口数据线1实现PC和fpga的通信谢 辞感谢我的课程设计老师分配给我一个如此重要且非常具有意义的任务,在老师的耐心辅导和帮助下,我才能出色的完成此次任务。在编写代码的过程中,我的同学给予了无限的帮助,和我共同进退,我在这里也特别要感谢他们。同时,谢谢我的学校桂林电子科技大学给我们提供了各种实验仪器,使我们能把任务顺利完成。最后,我在这里由衷的感谢帮助过我的老师和同学们,万分感谢,你们辛苦了!参考文献1 夏宇闻等.verilog数字系统设计教程.北京:北京航空航天大学出版社,2 袁东明等.现代数字电路与逻辑设计实验教程.2011.3田辉等.微机原理与接口技术(第二版).高等教育出版社.20114 王行等. EDA技术入门与提高(第二版).西安电子科技大学出版社.2009

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com