您的当前位置:首页正文

FPGA与单片机实现串行通信

2021-06-23 来源:个人技术集锦
h

题目名称:FPGA与单片机实现串行通信

h

h

目录

1设计任务及内容 ............................................................................................................................ 1 2设计方案........................................................................................................................................ 1 3系统硬件设计 ................................................................................................................................ 1

3.1单片机串行通信设计 ...................................................................................................... 2 3.2 FPGA串行通信 .............................................................................................................. 3 4系统软件设计 ................................................................................................................................ 5

4.1 FPGA单元计………………………………………5

4.2

MAX3232……………………………………6

5.系统调试...................................................................................................................................... 10 6课程设计总结 .............................................................................................................................. 10 附录: ............................................................................................................................................ 11

h

h

1设计任务及内容

要求实现FPGA与单片的串行通信,熟悉单片机和VHDL语言的编写,在设计过程中对单片机与FPGA有进一步理解,能够实现串行通信。

2设计方案

整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA波特率发生控制模块,FPGA总体接口模块以及单片机数据接收模块。在通信过程中完全遵守RS232协议,并利用VHDL语言实现 FPGA与单片机的串口异步通信电路。本设计采用ll位帧格式异步通信方式,一位起始位、一位停止位、一位奇偶校验位、8位数据位,基于有限状态机原理进行FPGA设计。设计方案框图如下:

FPGA

单片机 控制器 通信控制 发送器 波特率发生 接收器 3系统硬件设计

h

h

3.1单片机串行通信设计

单片机与FPGA串行通信可采用单片机的SPI(串行外设接口)方式。相对于UART,SPI更简单,速度更快。SPI共四条线。MOSI(Master Out Slave In).MISO,SCK(Serial Clock),SS(Slave Select)。图1为SPI T作时序。当单片机向FPGA传输命令或数据时,应用SPI的四种模式中的SPIO模式。当片选SS拉低。然后在每个时钟(SCK)上升沿送出数据。将片选信号SS与移位寄存器使能端(En)相接,MOSI与移位寄存器数据输入端(SI)相接,SCK同时为移位寄存器提供时钟信号。在SS信号为低电平时,移位寄存器开始工作,在每个时钟上升沿将接收到的数据左移一位,等全部接受完毕,将SS置一l”,移位寄存器工作完毕,同时为触发器提供时钟,使移位寄存器接收到的数据并行输出。

当单片机从FPGA读取数据时,向FPGA发送读使能信号RE(可用任意空闲I/0口)。在每个时钟(SCK)上升沿.FPGA送出一位串行数据,单片机通过MISO读取数据。借助VHDL硬件描述语言和EDA开发工具可方便的实现该系统。如下图所示:

h

h

图一:单片机电路

3.2 FPGA串行通信

由于FPGA具有丰富的引脚资源,且EP1C3T100C8N的核电压是3.3 V,STC89LE52的输出电压也是3.3 V,所以任选3064A四个I/O与单片机4个I/O口连接即可,若连接在单片机的Po口时需要加上拉电阻。在这里将SS(CS)、SCK、SDI、SDO分别如图所示连接。

h

h

图二:FPGA电路

h

h

4系统软件设计

4.1 FPGA单元设计

FPGA的设计是通信网络的核心部分。依据功能要求,FPGA内部划分成四大功能模块:SRAM控制器、发送数据缓冲模块、16个UART模块、接收数据缓冲模块。 发送数据缓冲模块划分成16个RAM区,每个RAM区分别连接1个UART,当发送缓冲模块接收到主单片机下发的控制数据后,启动UART将数据发送至从单片机。接收缓冲区同样分为16个RAM区,发送控制数据后,UART周期性地向从单片机发送状态查询命令,从单片机将最新状态发送至UART模块,UART模块将数据存入接收缓冲模块相应的RAM区。如图3所示。

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

RAM及接收缓冲区 RAM。 FPGA内部模块采用图3 FPGA内部功能模块示意图自顶向下的设计方法,将复杂系统划分为简单系统,然后通过逻辑和接口设计实现各个模块功能。SRAM控制器用于FPGA和 C8051F020的接口,负责内部RAM的读写控制。UART负责接收从单片机上传的串行信号,将其并行化后存入接收数据缓冲RAM;另外也负责将发送缓冲RAM中的数据转换成符合RS232协议规范的串行信号发送给从单片机。 FPGA内部系统采用同步有限状态机(FSM)的设计方法实现,FSM负责调配各功能模块之间的协作。状态机采用独热(one—hot)编码,使电路的可靠性和速度有显著的提高。系统状态转移图如图4所示。

h

h

4.2串行通信MAX3232

主单片机和上位机的通信速率及FPGA和从单片机的通信速率均设置为38.4 Kbps,可以更精确的控制主单片机与各个从单片机之间的通信时间。通信指令由报头、设备类型、设备号、命令号、命令数据、校验等字段组成。

报头用于通知单片机开始串行通信。设备类型和设备号用于将指令正确传达到相应的设备,命令号用于通知单片机指令,命令数据用于通知单片机具体的功能,校验则采用CRC校验以保证通信的准确性。写入控制命令号为OOH,读取命令号为01H,读取指令命令数据为0字节。通信指令的帧格式如下:

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

返回帧格式为:

h

h

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

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

初始 初始 接受 发送 启动接受 发送起始位 接收数据 发送数据 9位? 9位? 发停止位? h

h

停止位? 结束 结束 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接收数据仿真图:

h

h

串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。

5.系统调试

首先,检查电路板上各个元器件的工作电压正确,电路板能正常工作;其次,将调试的部分小程序下载到电路板上,检测R232能正常工作;再次,将单片机发送,FPGA接受的子程序下入电路板,观察现象正确,将FPGA发送,单片机接受的子程序下入电路板,观察现象;最后,将总程序下载到电路板中,观察现象正确。

6课程设计总结

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

h

h

上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。这几周的实习还是比较辛苦的,程序里面的好多内容不懂,自我感觉是单片机和FPGA我们所学的内容还不足以编出这两个程序,但是只好硬着头皮去看去理解。但在学习过程中也充满了乐趣,当看懂了程序的一些语句,画出了要求的设计图,那我喜悦那种成就感油然而生。在这次课程设计中又让我体会到了集体的力量,当遇到不会或是设计不出来的地方,我们就会向老师或者是同学请教。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。这次课设是对我的学习态度的一次检验。

h

h

对于这次课程设计,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。

单片机和FPGA是电子信息工程的一门重要专业课,学好单片机和EDA,就可以凭这个技术找一个好工作。为即将毕业的我们在面试时提供了一些实习经验。我们要在今后的学习中进一步学习单片机知识,培养对其的兴趣,为将来工作打好基础,充实度过大学生活。

附录:

Library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity atel2_bin is

port( txclk: in std_logic; --2400Hz的波特率时钟 reset: in std_logic; --复位信号

din: in std_logic_vector(15 downto 0); --发送的数据 start: in std_logic; --允许传输信号 sout: out std_logic --串行输出端口 );

end atel2_bin;

architecture behav of atel2_bin is

signal thr,len: std_logic_vector(15 downto 0); signal txcnt_r: std_logic_vector(2 downto 0); signal sout1: std_logic; signal cou: integer:=0; signal oddb:std_logic;

type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2); signal state:s:=start1; begin

h

h

process(txclk) begin

if rising_edge(txclk) then

if cou<3 then thr<=\"0000000001010101\"; --发送的文件头 elsif cou=3 then

thr<=\"0000000000000010\"; --发送的文件长度

elsif (cou>3 and state=stop2) then thr<=din;--发送的数据 end if; end if;

end process;

process(reset,txclk)

variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);

h

h

h

h

begin

if reset='1' then

txcnt_r<=(others=>'0'); sout1<='1'; state<=start1; cou<=0;

elsif txclk'event and txclk='1' then case state is when start1=>

if start='1' then if cou=3 then len<=thr; end if;

tsr:=thr(7 downto 0); oddb1:=thr(7 downto 0); sout1<='0'; --起始位 txcnt_r<=(others=>'0'); state<=shift1; else

state<=start1; end if;

when shift1=>

oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0); sout1<=tsr(0); --数据位

tsr(6 downto 0):=tsr(7 downto 1); tsr(7):='0';

txcnt_r<=txcnt_r 1; if (txcnt_r=7) then state<=odd1;cou<=cou 1; end if;

when odd1=> --奇校验位 if oddb='1' then

sout1<='0';state<=stop1; else

sout1<='1';state<=stop1; end if;

when stop1=>

sout1<='1'; --停止位 if cou<4 then state<=start1; else

h

h

state<=start2; end if;

when start2=>

tsr1:=thr(15 downto 8); oddb2:=thr(15 downto 8); sout1<='0'; --起始位 txcnt_r<=(others=>'0'); state<=shift2; when shift2=>

oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0); sout1<=tsr1(0);--数据位

tsr1(6 downto 0):=tsr1(7 downto 1); tsr1(7):='0';

txcnt_r<=txcnt_r 1; if (txcnt_r=7) then state<=odd2; end if;

when odd2=> --奇校验位 if oddb='1' then

sout1<='0';state<=stop2; else

sout1<='1';state<=stop2; end if;

when stop2=>

sout1<='1'; --停止位

if len=\"0000000000000000\" then state<=stop2; else

state<=start1; len<=len-1; end if; end case; end if;

end process; sout<=sout1; end behav;

原理图:

h

h

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

h

因篇幅问题不能全部显示,请点此查看更多更全内容