RS232串口通信设计.docx
《RS232串口通信设计.docx》由会员分享,可在线阅读,更多相关《RS232串口通信设计.docx(31页珍藏版)》请在冰豆网上搜索。
RS232串口通信设计
《CPLD/FPGA》
课程设计报告
题目:
RS-232串口通信设计
院(系):
信息科学与工程学院
专业班级:
通信工程11
学生姓名:
詹文魁
学号:
指导教师:
吴莉老师
2014年06月09日至2014年6月20日
华中科技大学武昌分校制
RS-232串口通信设计课程设计任务书
一、设计(调查报告/论文)题目
RS-232串口通信设计
二、设计(调查报告/论文)主要内容
下述设计内容需由学生个人独立完成:
1.理解电路原理图与工作过程;
2.掌握RS-232电气特性;
3.掌握RS-232通信原理及串口通信数据格式,并编程完成串行数据的发送、接收和显示;
4.能正确处理编程与调试过程中所遇到的问题。
三、原始资料
1.通信与电子系统实验指导书;
2.CPLD/FPGA实验箱。
四、要求的设计(调查/论文)成果
1.程序结构合理,语言简洁,格式规范,注释详细;
2.掌握RS-232的工作机制与原理;
3.格式为:
1位起始位,8位数据位,1位停止位,无奇偶校验位,波特率设定为300Baud。
能与计算机正常通信;
4.按要求完成课程设计报告,格式符合学校规范标准,字数不少于2000字。
五、进程安排
第1天选题,课题讲解;
第2-3天课题分析,完成设计方案;
第4-6天软件编程;
第7-8天软件调试,故障排查;
第9天结果验收,评分;
第10天撰写课设报告。
六、主要参考资料
[1]陈曦.通信与电子系统实验指导书,武汉:
华中科技大学武昌分校.
[2]谭会生.EDA技术及应用,西安:
西安电子科技大学出版社,2010.
[3]潘松,黄继业.EDA技术与VHDL,北京:
清华大学出版社,2009.
指导教师(签名):
20年月日
1.课程设计的目的………………………………………………………………………4
2.课程设计题目描述和要求……………………………………………………………4
3.课程设计报告内容……………………………………………………………………4
3.1课题设计方案及基本原理……………………………………………………………4
3.2软件设计………………………………………………………………………………7
3.3问题……………………………………………………………………………………14
4.总结………………………………………………………………………………………15
5.参考资料…………………………………………………………………………………16
附录程序清单……………………………………………………………………………17
1.课程设计的目的:
(1)学习RS-232串口通信数据结构,并编程完成串行数据的接收和显示。
(2)掌握RS-232的工作机制与原理。
(3)熟练掌握Quartus2软件的使用。
(4)了解CPLD/FPGA实验箱。
2.课程设计题目描述和要求:
(1)课程设计题目:
基于FPGA的串口通信程序设计。
(2)课程设计要求:
下述设计内容需由学生个人独立完成:
1.理解电路原理图与工作过程;
2.掌握RS-232电气特性;
3.掌握RS-232通信原理及串口通信数据格式,并编程完成串行数据的接收和
显示;
4.能正确处理编程与调试过程中所遇到的问题;
5.在FPGA中构造一个异步串行通信控制模块,完成PC机发送的接收,并设计
显示模块,完成接收数据的显示
(3)要求的设计成果:
1.程序结构合理,语言简洁,格式规范,注释详细;
2.掌握RS-232的工作机制与原理;
3.格式为:
1位起始位,8位数据位,1位停止位,无奇偶校验位,波特率设定
为300Baud。
能与计算机正常通信;
4.按要求完成课程设计报告,格式符合学校规范标准,字数不少于2000字。
3.课程设计报告内容:
3.1课程设计方案及基本原理:
设计方案:
利用实验箱上的MAX232芯片控制通过适当分频(分频的目的是为了达到要求的波特率,控制数据传输速率)的串行输入信号,并将其转换为并行信号并通过实验箱上的数码管的后两位显示从计算机中传输出来的16进制数。
例如在计算机端输入(FF)则会在试验箱上看到(000000FF)的显示图示。
基本原理:
RS-323C标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。
它适合于数据传输速率在0~20000b/s范围内的通信。
这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。
EIA-RS-232C中+3V~+15V之间的电平为‘0’,-3V~-15V的电平为‘1’;与TTL以高低电平表示逻辑状态的规定不同。
因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。
实现这种变换的方法可用分立元件,也可用集成电路芯片。
目前较为广泛地使用集成电路转换器件,如MC1488、SN75150芯片可完成TTL电平到EIA电平的转换,而MC1489、SN75154可实现EIA电平到TTL电平的转换。
MAX232芯片可完成TTL←→EIA双向电平转换。
1.串口通信:
(1)什么是串口通信:
串口是计算机上一种非常通用设备通信的协议。
大多数计算机包含两个基于RS232
的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带
有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串行
接口(Serialport)又称“串口”,主要用于串行式逐位数据传输。
常见的有一
般电脑应用的RS-232(使用25针或9针连接器)和工业电脑应用的半双RS-485
与全双工RS-422。
(2)串口接口规格:
串行接口按电气标准及协议来分,包括RS-232-C、RS-422、RS485、USB等。
RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、
电缆或协议。
USB是近几年发展起来的新型接口标准,主要应用于高速数据传输
领域。
(3)串口通信原理:
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)
的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设
备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口
而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根
线完成:
(1)地线,
(2)发送,(3)接收。
由于串口通信是异步的,端口能够在
一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须
的。
2.RS232芯片
(1)电气特性:
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。
在TxD和RxD上:
逻辑1(MARK)=-3V~-15V
逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15
(2)RS232接口定义:
(3)RS232总线电平转换:
(4)RS232数据传输格式:
为010*******
(5)RS232通信过程:
:
开始通信时,信号线为空闲(逻辑),当检测到由到的跳变时,开始对“接收
时钟”计数。
:
当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起
始位”,而不是干扰信号。
:
接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值
作为D0位数据。
若为逻辑1,作为数据位1;若为逻辑0,作为数据位0。
:
再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据。
….,
直到全部数据位都输入。
:
检测校验位P(如果有的话)。
:
接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑
1),若此时未收到逻辑说明出现了错误在状态寄存器中置“帧错误”标志若没
若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。
若
没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器
中送数据输入寄存器。
若校验错,在状态寄存器中置奇偶错标志。
:
本幀信息全部接收完把线路上出现的高电平作为空闲位。
:
当信号再次变为低时,开始进入下一帧的检测。
3.2软件设计
(1)Quartus顶层设计
如上图所示,整个顶层设计可以分为4个部分,
(1)锁相环;作用是将输入的系统时钟信号(系统时钟50MHZ)转换为12MHZ的sysclk时钟,在进入RS232前先进行第一次分频弥补RS232自身分频不足的特点。
(2)核心模块RS232;作用是将计算机输入的串行数据转换为并行数据便于给后方的显示模块处理。
(3)分频模块;作用是给显示模块提供所需的时钟,由于显示模块的本质是一个个显示,所以为了能同时显示故将输入频率调至1KHz以上让人眼无法一个个识别形成同时显示的效果。
(4)显示模块;作用是将输入的并行信号(8位)分成4位一组,即两组进行处理后在试验箱的数码管上显示。
(1-1)模块一分析:
从上图可以看出:
1.inclk=50MHz2.DC=50%3.Ratio=12/25,从而可以得出outclk=50MHz*12/25=24MHz,再通过D触发器2分频后得到12MHz的输出系统时钟来弥补RS232模块分频不足的缺点。
(1-2)模块二分析:
上图所示的为RS232集成模块,经VHDL编译生成的模块文件。
输入为sysclk=12MHz,rxd=计算机输入的串行数据串,disp为8位的并行数据段。
程序1:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityrs232is
port(sysclk:
instd_logic;
rxd:
instd_logic;
disp:
outstd_logic_vector(7downto0)
);
endrs232;
分析:
定义实体。
输入信号,输入时钟信号为逻辑信号,输出信号disp为8位矢量信号,低位为0
高位为7。
architecturebehvofrs232is
signalb:
std_logic_vector(9downto0);
signalr:
std_logic_vector(3downto0);
signalj:
std_logic_vector(15downto0);
signalfrxd,gt,gtclr,cclk,gate:
std_logic;
begin
gate<=gtandcclk;
disp(7downto0)<=b(8downto1);将串行数据段的1-8位数据位从b中取出至于disp中。
frxd<=notrxd;
分析:
定义机构体。
先定义可信号b,r,j。
其中的b作为数据转移的临时载体。
R,j分别作为后
续程序的计数单元,其中需要注意的是j的位数控制,因为当需要控制波特率的时候,由于
输入的sysclk是固定的12MHz的系统时钟信号无法改变,故能改变的只有RS232中的分频系
数,但由于分频的系数的改变,于是j作为计数信号其值也将随之改变。
s1:
process(sysclk,gt)
begin
ifgt='0'thenj<=(others=>'0');
elsifsysclk'eventandsysclk='1'then
ifj="1001110001000000"thenj<=(others=>'0');
elsej<=j+1;
endif;
endif;
endprocess;
分析:
s1的段码作用是用来计数,所记数为RS232的分频系数,上述代码中的"10011100010"为40000,
通过计算12M/1250=9600,故可以得知波特率为9600b/s。
通过改变j的值可以很方便的来设
置所需要的波特率。
s2:
process(j)
begin
ifj="111001"thencclk<='1';
elsecclk<='0';
endif;
endprocess;
分析:
s2的段码作用是当j计数到一定数值的时候产生一个脉冲,从而实现分频的作用。
其中j值
的设定关系到分频的占空比,只需要j的值在分频系数之内即可产生分频的效果。
s3:
process(gate,gtclr)
begin
ifgtclr='1'thenr<="0000";
elsifgate'eventandgate='1'then
r<=r+1;
endif;
endprocess;
s4:
process(gate,r)
begin
ifr="1010"thengtclr<=notgate;
elsegtclr<='0';
endif;
endprocess;
分析:
s3,s4段码的作用是计数从0-10,即计数输入数据段的10位,0-起始位,1-8-数据位,9-
终止位。
s5:
process(gate,rxd,b)
begin
ifgate'eventandgate='1'then
b(9downto0)<=rxd&b(9downto1);将b的后9位并上rxd的第一位组合成新的信号b。
endif;
endprocess;
分析:
s5段码的作用是,将rxd的输入信号通过移位寄存的方法将RXD中的数据一一取出移动到信
号b中,然后再通过的b的移位从而将rxd中的数据段完整的转移到信号b中保存。
s6:
process(frxd,gtclr)
begin
ifgtclr='1'thengt<='0';
elsiffrxd'eventandfrxd='1'then
gt<='1';
endif;
endprocess;
endbehv;
分析:
s6的段码的作用是用于判断起始位,gt做为标志位,当已经确定为开始时,将
gt的值置‘1’。
(1-3)模块三分析:
分析:
从上图可以看出其作用是作为分频,将50MHz的输入信号先通过PIN1MHZ模块将50MHZ
分为1Mhz,再将1MHZ的信号输入到下一个分频信号中分为频率为:
1HZ,488HZ,1953HZ,
7812HZ,31250HZ,125kHZ,500kHZ的信号。
程序1:
PIN1hz
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPIN1MHZIS
PORT(CLKIN:
INSTD_LOGIC;
CLKOUT:
OUTSTD_LOGIC);
ENDPIN1MHZ;
ARCHITECTUREAOFPIN1MHZIS
BEGIN
PROCESS(CLKIN)
VARIABLECNTTEMP:
INTEGERRANGE0TO49;
BEGIN
IFCLKIN='1'ANDCLKIN'EVENTTHEN
IFCNTTEMP=49THENCNTTEMP:
=0;
ELSE
IFCNTTEMP<25THENCLKOUT<='1';
ELSECLKOUT<='0';
ENDIF;
CNTTEMP:
=CNTTEMP+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDA;
分析:
上述程序段中可以知道,使用变量VARIABLE做为计数,从0-49刚好为50个数,
当小于25的时候赋值为1,其余为0,使得将50MHZ处理为1MHZ。
当取值大于或
等于50时复位为0。
从而达到分频的目的。
程序2:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycntis
port(clk:
instd_logic;
freq1:
outstd_logic;
freq488:
outstd_logic;
freq1953:
outstd_logic;
freq7812:
outstd_logic;
freq31250:
outstd_logic;
freq125k:
outstd_logic;
freq500k:
outstd_logic);
endcnt;
architecturebehvofcntis
signaltemp:
std_logic_vector(19downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
iftemp="11110100001000111111"then
temp<="00000000000000000000";
else
temp<=temp+1;
endif;
endif;
endprocess;
freq1<=temp(19);
freq488<=temp(10);
freq1953<=temp(8);
freq7812<=temp(6);
freq31250<=temp(4);
freq125k<=temp
(2);
freq500k<=temp(0);
endbehv;
分析:
程序2的设计思路同样是使用计数,但和程序1的计数不完全相同,数由16进
制表示,4为2进制组成1位16进制,所以从第0位开始可以计数2位,第一位
可以计数4位,第二位可以计数8位,依次可以得出计数量为2的n+1次方个数,
从而达到同时计数多个的目的从而产生多个时钟信号。
(1-4)模块四分析:
分析:
显示模块由两部分组成,74138的表面作用是译码将输入的sel信号翻译出来并选中制定的数
码管。
其实质作用是由输入的信号(0-7计数为8的计数信号输入),来控制数码管的片选。
而display的作用是来实现片选,将RS232输出的并行信号的两部分(每部分4位组成一个
16进制数)进行处理来实现段选。
分析:
上图为display模块的细节图。
rxd中的信号分为两组输入,分别进入muxer的第0组和第1
组。
其余的组全部拉低,达到出去最低两位显示,其余为显示全0的目的,cnt8为0-7的计
数,作用是控制muxer进入led程序的顺序,而led是为了实现段选,点亮数码管的特定位来
显示输入数值。
程序1.
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt8is
port(clk:
instd_logic;
q:
outstd_logic_vector(2downto0));
endcnt8;
architecturebehvofcnt8is
signaltemp:
std_logic_vector(2downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
iftemp="111"then
temp<="000";
else
temp<=temp+1;
endif;
endif;
endprocess;
q<=temp;
endbehv;
分析:
cnt8的作用为0-7的8位计数,为后面模块提供计数顺序。
程序2.
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityledis
port(din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(6downto0));
endled;
architecturebehvofledis
begin
process(din)
begin
casedinis
when"0000"=>dout<="0111111";
when"0001"=>dout<="0000110";
when"0010"=>dout<="1011011";
when"0011"=>dout<="1001111";
when"0100"=>dout<="1100110";
when"0101"=>dout<="1101101";
when"0110"=>dout<="1111101";
when"0111"=>dout<="0000111";
when"1000"=>dout<="1111111";
when"1001"=>dout<="1101111";
when"1010"=>dout<="1110111";
when"1011"=>dout<="1111100";
when"1100"=>dout<="0111001";
when"1101"=>dout<="1011110";
when"1110"=>dout<="1111001";
when"1111"=>dout<="1110001";
whenothers=>dout<="0000000";
endcase;
endprocess;
endbehv;
分析:
程序led是完成段显,将输入的数值0-15翻译成对应的数码管编码。
(1-5)接收模块
分析:
程序rsSedn作为接受模块,用于将232中发送的数据再次回写到到串口助手的接收端内!
要是程序完全正常的话发送什么就会在接收窗口接收到什么。
3.3问题:
如何真正的实现发送和接受同步,并且发送的和接收的完全一样?
发送和接收波特率怎么弄?
答:
接收和显示的已经做出来了,但是发送的
4.总结:
参考文献
[1]通信与电子系统实验指导书.武汉:
华中科技大学武昌分校.
[2]潘松.EDA技术与VHDL.北京:
清华大学出版社,2009.
[3]朱运利.EDA技术应用(第二版).北京:
电子工业出版社,2007.
[4]王行.EDA技术入门与提高.西安:
西安电子科技大学出版社,2009.
[5]李