FPGA与单片机实现串行通信Word文件下载.docx
《FPGA与单片机实现串行通信Word文件下载.docx》由会员分享,可在线阅读,更多相关《FPGA与单片机实现串行通信Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![FPGA与单片机实现串行通信Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/25/58c43e50-91fa-4c19-956c-001f82e48577/58c43e50-91fa-4c19-956c-001f82e485771.gif)
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;
原理图:
欢迎您的下载,资料仅供参考!