FPGA与单片机实现串行通信Word文件下载.docx

上传人:b****5 文档编号:16701256 上传时间:2022-11-25 格式:DOCX 页数:14 大小:268.82KB
下载 相关 举报
FPGA与单片机实现串行通信Word文件下载.docx_第1页
第1页 / 共14页
FPGA与单片机实现串行通信Word文件下载.docx_第2页
第2页 / 共14页
FPGA与单片机实现串行通信Word文件下载.docx_第3页
第3页 / 共14页
FPGA与单片机实现串行通信Word文件下载.docx_第4页
第4页 / 共14页
FPGA与单片机实现串行通信Word文件下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

FPGA与单片机实现串行通信Word文件下载.docx

《FPGA与单片机实现串行通信Word文件下载.docx》由会员分享,可在线阅读,更多相关《FPGA与单片机实现串行通信Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。

FPGA与单片机实现串行通信Word文件下载.docx

FPGA

3系统硬件设计

3.1单片机串行通信设计

单片机与FPGA串行通信可采用单片机的SPI(串行外设接口)方式。

相对于UART,SPI更简单,速度更快。

SPI共四条线。

MOSI(MasterOutSlaveIn).MISO,SCK(SerialClock),SS(SlaveSelect)。

图1为SPIT作时序。

当单片机向FPGA传输命令或数据时,应用SPI的四种模式中的SPIO模式。

当片选SS拉低。

然后在每个时钟(SCK)上升沿送出数据。

将片选信号SS与移位寄存器使能端(En)相接,MOSI与移位寄存器数据输入端(SI)相接,SCK同时为移位寄存器提供时钟信号。

在SS信号为低电平时,移位寄存器开始工作,在每个时钟上升沿将接收到的数据左移一位,等全部接受完毕,将SS置一l”,移位寄存器工作完毕,同时为触发器提供时钟,使移位寄存器接收到的数据并行输出。

当单片机从FPGA读取数据时,向FPGA发送读使能信号RE(可用任意空闲I/0口)。

在每个时钟(SCK)上升沿.FPGA送出一位串行数据,单片机通过MISO读取数据。

借助VHDL硬件描述语言和EDA开发工具可方便的实现该系统。

如下图所示:

图一:

单片机电路

3.2FPGA串行通信

由于FPGA具有丰富的引脚资源,且EP1C3T100C8N的核电压是3.3V,STC89LE52的输出电压也是3.3V,所以任选3064A四个I/O与单片机4个I/O口连接即可,若连接在单片机的Po口时需要加上拉电阻。

在这里将SS(CS)、SCK、SDI、SDO分别如图所示连接。

图二:

FPGA电路

4系统软件设计

4.1FPGA单元设计

FPGA的设计是通信网络的核心部分。

依据功能要求,FPGA内部划分成四大功能模块:

SRAM控制器、发送数据缓冲模块、16个UART模块、接收数据缓冲模块。

发送数据缓冲模块划分成16个RAM区,每个RAM区分别连接1个UART,当发送缓冲模块接收到主单片机下发的控制数据后,启动UART将数据发送至从单片机。

接收缓冲区同样分为16个RAM区,发送控制数据后,UART周期性地向从单片机发送状态查询命令,从单片机将最新状态发送至UART模块,UART模块将数据存入接收缓冲模块相应的RAM区。

如图3所示。

  FPGA内部共有16对读/写和数据总线,分别连接UART和相应的发送缓冲区RAM及接收缓冲区RAM。

FPGA内部模块采用图3FPGA内部功能模块示意图自顶向下的设计方法,将复杂系统划分为简单系统,然后通过逻辑和接口设计实现各个模块功能。

SRAM控制器用于FPGA和C8051F020的接口,负责内部RAM的读写控制。

UART负责接收从单片机上传的串行信号,将其并行化后存入接收数据缓冲RAM;

另外也负责将发送缓冲RAM中的数据转换成符合RS232协议规范的串行信号发送给从单片机。

  FPGA内部系统采用同步有限状态机(FSM)的设计方法实现,FSM负责调配各功能模块之间的协作。

状态机采用独热(one—hot)编码,使电路的可靠性和速度有显著的提高。

系统状态转移图如图4所示。

4.2串行通信MAX3232

 主单片机和上位机的通信速率及FPGA和从单片机的通信速率均设置为38.4Kbps,可以更精确的控制主单片机与各个从单片机之间的通信时间。

通信指令由报头、设备类型、设备号、命令号、命令数据、校验等字段组成。

报头用于通知单片机开始串行通信。

设备类型和设备号用于将指令正确传达到相应的设备,命令号用于通知单片机指令,命令数据用于通知单片机具体的功能,校验则采用CRC校验以保证通信的准确性。

写入控制命令号为OOH,读取命令号为01H,读取指令命令数据为0字节。

通信指令的帧格式如下:

  单片机接收到控制命令后,如果接收正确,返回00H,若错误则返回01H。

返回帧格式为:

 

接收后单片机返同帧格式为:

系统发送、接受程序流程图如下:

FPGA发送数据的仿真图如下:

图中Din写入值为3355H,波特率为2400Hz,Start信号始终置逻辑1,即随时都能发送数据。

Reset信号逻辑1时复位,逻辑0时电路开始工作。

THR是数据寄存器,文件头、数据长度以及数据位都先寄存到THR中,Len是数据长度,TSR是低8位数据帧寄存器,TSR1是高8位数据帧寄存器。

数据长度Len定为02H,发送时先发送低8位55H,后发送高8位33H,一共发送两遍。

发送的数据格式说明:

当发送55H时,其二进制为01010101,则发送的数据的二进制数为00101010111(1位开始位+8位数据位+1位奇校验位+1位停止位)。

单片机部分先对FPGA发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。

根据FPGA发送模块的协议,对串口控制寄存器SCON和波特率控制寄存器PCON的设置即可实现。

FPGA接收数据仿真图:

串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。

接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。

还要输出一个数据接收标志信号标志数据接收完。

5.系统调试

首先,检查电路板上各个元器件的工作电压正确,电路板能正常工作;

其次,将调试的部分小程序下载到电路板上,检测R232能正常工作;

再次,将单片机发送,FPGA接受的子程序下入电路板,观察现象正确,将FPGA发送,单片机接受的子程序下入电路板,观察现象;

最后,将总程序下载到电路板中,观察现象正确。

6课程设计总结

此次课程设计,让我们有机会把课本中学到的理论应用到实际中去,理论联系实际,在更好的掌握了书本中的知识的同时加强了动手能力,在调试工程中遇到了许多问题,这些问题是在书中学不到的,只有通过查阅大量资料,咨询老师和同学,我们才一步步排除电路错误,在调试排错的同时收获了很多单片机实际应用中的知识。

这次实习让我们受益匪浅,无论从知识上还是其他的各个方面。

上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。

但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。

这几周的实习还是比较辛苦的,程序里面的好多内容不懂,自我感觉是单片机和FPGA我们所学的内容还不足以编出这两个程序,但是只好硬着头皮去看去理解。

但在学习过程中也充满了乐趣,当看懂了程序的一些语句,画出了要求的设计图,那我喜悦那种成就感油然而生。

在这次课程设计中又让我体会到了集体的力量,当遇到不会或是设计不出来的地方,我们就会向老师或者是同学请教。

团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。

这次课设是对我的学习态度的一次检验。

对于这次课程设计,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。

我们这次实习所遇到的多半问题多数都是由于我们不够严谨。

我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。

通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。

创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。

单片机和FPGA是电子信息工程的一门重要专业课,学好单片机和EDA,就可以凭这个技术找一个好工作。

为即将毕业的我们在面试时提供了一些实习经验。

我们要在今后的学习中进一步学习单片机知识,培养对其的兴趣,为将来工作打好基础,充实度过大学生活。

Libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityatel2_binis

port(txclk:

instd_logic;

--2400Hz的波特率时钟

reset:

--复位信号

din:

instd_logic_vector(15downto0);

--发送的数据

start:

--允许传输信号

sout:

outstd_logic--串行输出端口

);

endatel2_bin;

architecturebehavofatel2_binis

signalthr,len:

std_logic_vector(15downto0);

signaltxcnt_r:

std_logic_vector(2downto0);

signalsout1:

std_logic;

signalcou:

integer:

=0;

signaloddb:

std_logic;

typesis(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);

signalstate:

s:

=start1;

begin

process(txclk)

ifrising_edge(txclk)then

ifcou<

3thenthr<

="

0000000001010101"

;

--发送的文件头

elsifcou=3then

thr<

0000000000000010"

--发送的文件长度

elsif(cou>

3andstate=stop2)thenthr<

=din;

--发送的数据

endif;

endprocess;

process(reset,txclk)

variabletsr,tsr1,oddb1,oddb2:

std_logic_vector(7downto0);

ifreset='

1'

then

txcnt_r<

=(others=>

'

0'

sout1<

='

state<

cou<

elsiftxclk'

eventandtxclk='

casestateis

whenstart1=>

ifstart='

ifcou=3then

len<

=thr;

tsr:

=thr(7downto0);

oddb1:

--起始位

=shift1;

else

whenshift1=>

oddb<

=oddb1(7)xoroddb1(6)xoroddb1(5)xoroddb1(4)xoroddb1(3)xoroddb1

(2)xoroddb1

(1)xoroddb1(0);

=tsr(0);

--数据位

tsr(6downto0):

=tsr(7downto1);

tsr(7):

=txcnt_r1;

if(txcnt_r=7)then

=odd1;

=cou1;

whenodd1=>

--奇校验位

ifoddb='

=stop1;

whenstop1=>

--停止位

4then

=start2;

whenstart2=>

tsr1:

=thr(15downto8);

oddb2:

=shift2;

whenshift2=>

=oddb2(7)xoroddb2(6)xoroddb2(5)xoroddb2(4)xoroddb2(3)xoroddb2

(2)xoroddb2

(1)xoroddb2(0);

=tsr1(0);

--数据位

tsr1(6downto0):

=tsr1(7downto1);

tsr1(7):

=odd2;

whenodd2=>

=stop2;

whenstop2=>

iflen="

0000000000000000"

=len-1;

endcase;

sout<

=sout1;

endbehav;

原理图:

欢迎您的下载,资料仅供参考!

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

当前位置:首页 > 小学教育 > 语文

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

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