串口通信发送接口LED.docx

上传人:b****8 文档编号:29167512 上传时间:2023-07-21 格式:DOCX 页数:14 大小:142.48KB
下载 相关 举报
串口通信发送接口LED.docx_第1页
第1页 / 共14页
串口通信发送接口LED.docx_第2页
第2页 / 共14页
串口通信发送接口LED.docx_第3页
第3页 / 共14页
串口通信发送接口LED.docx_第4页
第4页 / 共14页
串口通信发送接口LED.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

串口通信发送接口LED.docx

《串口通信发送接口LED.docx》由会员分享,可在线阅读,更多相关《串口通信发送接口LED.docx(14页珍藏版)》请在冰豆网上搜索。

串口通信发送接口LED.docx

串口通信发送接口LED

 

硬件描述语言设计报告

设计题目串行通信接收接口(LED)

学院电子信息学院

班级电子101

姓名梁嘉诚

学号1011002006

设计时间2013年1月7~11日

 

引言:

随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。

这里所说的通信是只计算机与外界的信息交换。

因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。

由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。

对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。

在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。

所以串行接口是微机应用系统常用的接口。

许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送方式,实际上,CPU与接口之间仍按并行方式工作。

RS-232C标准的全称是EIA-RS-232C标准(ElectronicIndustrialAssociate-RecommendedStandard232C)是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。

232标准与CCITT的V.24基本相同。

它适合于数据传输速率在0~20,000bit/s范围内、传输距离在15m以内的通信。

由于通信设备厂商大都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机串行通信接口中广泛采用。

RS-232C标准最初是为远程通信连接数据终端设备DTE与数据通信设备DCE而制定的。

因此,这个标准的制定,并未考虑计算机系统的应用要求。

但目前它又广泛地被借来用于计算机(更准确地说,是计算机接口)与终端或外设之间的近端连接标准。

很显然,这个标准的有些规定及定义和计算机系统是不一致的,甚至是相矛盾的。

RS-232C标准中所提到的“发送”和“接收”,都是站在DTE的立场上,而不是站在DCE的立场来定义的。

由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,因此双方都能发送或接收

通常RS-232接口以9个引脚(DB-9)或是25个引脚(DB-25)的型态出现,一般个人计算机上会有两组RS-232接口,分别称为COM1和COM2。

RS-232标准规定的数据传输速率为每秒150、300、600、1200、2400、4800、9600、19200波特。

RS-232标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。

传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。

设计原理:

串行通信是指使用一条数据线(另外需要地线,可能还需要控制线),将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。

其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。

使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。

串行通信的特点是:

数据传送按位顺序进行,最少值只需要一根传输线即可完成,节省传输线。

与并行通信相比还有较为显著的优点,传输距离长,可以几米到几千米。

在长距离内串行数据传送速率比并行数据传送速率快,,串行通信的通信时钟频率容易提高,串行通信的干扰能力十分强,其信号间的互相干扰完全可以忽略。

正是由于串行通信的接线少、成本低,因此它在数据采集和控制系统中得到了广泛的应用,产品也多种多样。

串行通信的分类

串行传输中,数据时一位一位按照到达的顺序依次传输的,每位数据的发送的接受都需要时钟来控制,发送端通过发送时钟确定数据位的开始和结束,接受端需要在适当的时间间隔对数据流进行采样来正确的识别数据。

接收端和发送端必须保持步调一致,否则数据传输就会出现差错。

为了解决以上问题,串行通信可采用以下两种方法:

同步通信和异步通信。

⑴同步通信:

同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。

这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。

它们均由同步字符、数据字符和校验字符(CRC)组成。

其中同步字符位于帧开头,用于确认数据字符的开始。

数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。

同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。

⑵异步通信:

串行异步通信即RS232通信,是主机与外部硬件设备的常用通讯方式。

可以双向传输。

异步通信中,在异步通行中有两个比较重要的指标:

字符帧格式和波特率。

数据通常以字符或者字节为单位组成字符帧传送。

字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。

发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。

接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。

异步通信中典型的帧格式是:

1位起始位,7位(或8位)数据位,1位奇偶校验位,2位停止位。

串行通信的工作模式

通过单线传输信息是串行数据通信的基础。

三种传送模式:

单工、半双工、全双工。

1、单工形式:

单工形式的数据传送是单向的。

通信双方中,一方固定是发送端,另一方则固定是接收端,使用一根传输线,如图1-2所示。

单工形式

2.半双工形式:

半双工通信使用同一根传输线,即可发送数据又可接受数据,但不能同时发送和接受。

在任何时刻只鞥由其中的一方发送数据,另一方接受数据。

因此半双工形式既可以使用一条数据线,也可以使用两条数据线。

如图1-3所示。

半双工形式

半双工通信中每个端口都需要有一个收/发切换电子开关,通过切换来决定数据向哪个方向传输。

因为有切换,所以会产生时间延迟,信息传输效率较低。

3、全双工形式:

RS-232

全双工数据通信分别由两根可以在两个不同的端点同时发送和接收的传输线进行传送,通信双方都能在同一时刻进行发送和接收操作。

如图1-4所示。

全双工形式

在全双工形式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高。

 

UART通信协议

在异步通信中,是以字符为单位传送数据,是从低位到高位逐位传送,一个字符表示一帧信息。

串行异步通信协议中字符代码传输格式如图2.3所示,通常UART的一帧数据由四部分组成:

一个起始位S(一般逻辑为“0”),后面是数据长度可变的数据位D0~D7(一般为6位到8位之间可变,数据的低位在前),一个可选的校验位PB(可选奇校验、偶检验或不需要检验),随后是一定长度的停止位P(可选1位、1.5位、或2位),停止位必须为逻辑“1”。

在没有数据被传输时,数据线会一直处于逻辑“1”状态。

由于没有共享时钟信号,因此在进行数据传输之前,收发双方必须协商好一个数据传输的波特率,也就是说,UART接收端应该知道发送端发送数据的波特率(相应的发送端也需要知道接收端的波特率)。

在大多数情况下,发送数据和接受数据的波特率是相同的。

UART发送端按照低位在前,高位在后的顺序移位输出数据。

一旦在初始化过程中,双方协商好了通信的波特率,收发双方的内部时钟都设定在同一波特率(但时钟的相位不同)。

在一个UART包传输开始,接收端将它的内部时钟调整到与发送端同步。

这样接收端就可以在每一位的中心位置对数据位进行采样,保证数据传输的正确性。

设计内容:

串行通信接收接口(LED)

基本要求:

掌握RS232串口的协议,运用DE2的串口进行接收PC的数据。

波特率为9600,8位数据位,无奇偶校验,一个停止位。

硬件验证要求:

在PC机通过“串行通信调试助手”软件

发送数据,DE2通过串口接收数据,完成接收数据后在LED上面进行显示。

在完成基本要求的基础上,可以通过拨码开关来选择奇偶校验的类别。

流程图:

 

接收模块流程图:

 

程序:

//分频模块

moduleclk_div(clk_in,nreset,clk_out);

inputclk_in;

inputnreset;

outputclk_out;

regclk_out=0;

reg[8:

0]cnt=0;

parameterT=217;

always@(posedgeclk_inornegedgenreset)

begin

if(nreset==0)

begin

cnt<=0;

clk_out<=0;end

elseif(cnt==T)

begin

clk_out<=~clk_out;

cnt<=0;

end

else

cnt<=cnt+1;

end

endmodule

 

//接收模块

modulerx(clk,nreset,rxd,data);

inputclk,rxd,nreset;//clk=0.1152MHz

output[7:

0]data;

reg[3:

0]t;

reg[3:

0]s;

reg[7:

0]data0;

reg[7:

0]data;

always@(posedgeclkornegedgenreset)//baud=9600hz

if(nreset==0)

begin

data<=8'h00;

s<=0;

t<=0;

data0<=8'h00;

end

else

begin

case(s)

0:

if(rxd==1)begins<=1;t<=0;end

1:

if(rxd==0)begins<=2;t<=t+1;end

2:

if(t==6)

begin

if(rxd==0)

begins<=3;t<=0;end

else

begins<=1;t<=0;end

end

elset<=t+1;

3:

if(t==11)begindata0[0]<=rxd;t<=0;s<=4;endelset<=t+1;

4:

if(t==11)begindata0[1]<=rxd;t<=0;s<=5;endelset<=t+1;

5:

if(t==11)begindata0[2]<=rxd;t<=0;s<=6;endelset<=t+1;

6:

if(t==11)begindata0[3]<=rxd;t<=0;s<=7;endelset<=t+1;

7:

if(t==11)begindata0[4]<=rxd;t<=0;s<=8;endelset<=t+1;

8:

if(t==11)begindata0[5]<=rxd;t<=0;s<=9;endelset<=t+1;

9:

if(t==11)begindata0[6]<=rxd;t<=0;s<=10;endelset<=t+1;

10:

if(t==11)begindata0[7]<=rxd;t<=0;s<=11;endelset<=t+1;

11:

beginif(t==11)

begin

if(rxd==1)

begint<=0;s<=0;data<=data0;end

else

begint<=0;s<=0;end

end

else

t<=t+1;end

default:

begint<=0;s<=0;end

endcase

end

endmodule

//显示模块

moduleHEX(SW,HEX1,HEX0);

input[7:

0]SW;

outputreg[6:

0]HEX1,HEX0;

parameterseg0=7'b1000000,

seg1=7'b1111001,

seg2=7'b0100100,

seg3=7'b0110000,

seg4=7'b0011001,

seg5=7'b0010010,

seg6=7'b0000010,

seg7=7'b1111000,

seg8=7'b0000000,

seg9=7'b0010000,

sega=7'b0001000,

segb=7'b0000011,

segc=7'b1000110,

segd=7'b0100001,

sege=7'b0000110,

segf=7'b0001110;

always@(*)

begin

case(SW[7:

4])

4'h0:

HEX1[6:

0]=seg0;

4'h1:

HEX1[6:

0]=seg1;

4'h2:

HEX1[6:

0]=seg2;

4'h3:

HEX1[6:

0]=seg3;

4'h4:

HEX1[6:

0]=seg4;

4'h5:

HEX1[6:

0]=seg5;

4'h6:

HEX1[6:

0]=seg6;

4'h7:

HEX1[6:

0]=seg7;

4'h8:

HEX1[6:

0]=seg8;

4'h9:

HEX1[6:

0]=seg9;

4'ha:

HEX1[6:

0]=sega;

4'hb:

HEX1[6:

0]=segb;

4'hc:

HEX1[6:

0]=segc;

4'hd:

HEX1[6:

0]=segd;

4'he:

HEX1[6:

0]=sege;

4'hf:

HEX1[6:

0]=segf;

default:

HEX1[6:

0]=seg0;

endcase

case(SW[3:

0])

4'h0:

HEX0[6:

0]=seg0;

4'h1:

HEX0[6:

0]=seg1;

4'h2:

HEX0[6:

0]=seg2;

4'h3:

HEX0[6:

0]=seg3;

4'h4:

HEX0[6:

0]=seg4;

4'h5:

HEX0[6:

0]=seg5;

4'h6:

HEX0[6:

0]=seg6;

4'h7:

HEX0[6:

0]=seg7;

4'h8:

HEX0[6:

0]=seg8;

4'h9:

HEX0[6:

0]=seg9;

4'ha:

HEX0[6:

0]=sega;

4'hb:

HEX0[6:

0]=segb;

4'hc:

HEX0[6:

0]=segc;

4'hd:

HEX0[6:

0]=segd;

4'he:

HEX0[6:

0]=sege;

4'hf:

HEX0[6:

0]=segf;

default:

HEX0[6:

0]=seg0;

endcase

end

endmodule

 

//主模块

modulerx_top(CLOCK_50,KEY,UART_RXD,HEX1,HEX0);

inputCLOCK_50;

inputKEY;

inputUART_RXD;

output[6:

0]HEX1,HEX0;

wireclk_out;

clk_divu1(.clk_in(CLOCK_50),.nreset(KEY),.clk_out(clk_out));

wire[7:

0]data;

rxu2(.clk(clk_out),.nreset(KEY),.rxd(UART_RXD),.data(data));

HEXu3(.SW(data),.HEX1(HEX1),.HEX0(HEX0));

Endmodule

波形图:

实验结果

把实验板上电,下载完成后在PC上打开串口调试助手,实现的功能如图所示,这就是FPGA里实现从PC发送数据,使用的是串口UART协议进行收发数据。

用串口调试助手,如下:

总结

由于理论知识的不足,而且平时没有什么设计经验,开始时手忙脚乱,不知从何入手。

在同学的帮助下,我完成了设计。

在这次的实践过程中我学到了一些除理论知识以外的其他东西,网上学习也非常重要。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

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

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