YibinUniversityEDA技术及应用期末设计报告题目:单片机总线接口电路的设计专业:电子信息科学与技术2013年12月19日摘要:单片机具有性价比高,功能灵活,易于人机交换和良好的数据处理能力等特点;FPGA具有高速,高可靠以及开发方便快捷规范等特点,以此两类器件相结合的电路结构在许多高性能仪器仪表和电子产品中被广泛运用。在目前的单片机与FPGA的接口电路实际设计中,重要的角色之一就是并串转换电路,并且在很多其它设计中是必不可少的,尤其是在数据量庞大的设计中,如果前级电路和后级电路直接通过并行传输数据,那么数据有多少位就得有多少根通信线,这必将导致通信的准确度的降低和通信成本的增加,当距离较长时这种方式更是不可采用的。这次设计是基于FPGA设计的51单片机与外围电路通信的并串转换电路,该转换电路在接到51单片发出的访问外部RAM的时序时,自动接受并行数据,接受完毕后自动串行发送数据,并且产生输出时钟,提供给后级电路使用。该电路可以完成51单片机与串口外围电路的通信,扩展了51单片机的I/O端口,使得单片机可以带更多的负载。关键字:(1)并串转换(2)FPGA(3)VHDL(4)状态机(5)单片机目录摘要------------------------------------------------------------------------2关键字---------------------------------------------------------------------2设计概述------------------------------------------------------------------4总的系统框图------------------------------------------------------------4设计思路------------------------------------------------------------------5方案论证------------------------------------------------------------------5设计程序------------------------------------------------------------------6设计仿真图--------------------------------------------------------------16仿真分析-----------------------------------------------------------------17参考文献------------------------------------------------------------------17设计概述:本次设计用FPGA设计一个并串转换电路,完成的功能是让51单片机可以和串行外设通信,51单片机可以用访问外部RAM的时序去访问该接口电路。在51单片机发出访问时序时,FPGA响应51单片机,接受数据并锁存,然后自动串行发送。具体过程是当ALE有效时,P0口送出地址低八位地址(01),P2口送出高八位地址(FA),FPGA接收地址并锁存;当WR有效时,P0送出8位数据,如果FPGA锁存的地址是FA01,则此时FPAG将锁存8位数据。在整个接受过程中,FPGA不能发送数据,输出数据和时钟都拉为低电平。FPGA在接受完数据后将自动启动串行发送,每发送一位数据都发出一个周期的的输出时钟,作为后级电路的串行输入时钟。当数据发送完后,将数据发送结束标志拉高两个周期的高电平。在整个发送期间,不能接受数据,只有发送结束后才可以接受新的数据,并自动发送。总的系统框图:8051FPGA单P0add_lowQout片P2add_highCLKout机WRwrsend_endALEale设计思路:次本设计采用了模块设计的思路,把整个设计分为三个部分,即接收部分、发送部分、控制部分。接收部分主要负责响应单片机,锁存数据;发送部分主要负责串行发送数据和产生时钟信号;控制部分主要负责控制接受和发送,当在接受时数据时,发送部分被控制在等待状态,输出被拉低,发送完毕后自动开始发送。当在发送数据时控制部分将接收部分关闭,不予响应接收信号。方案论证:方案一:在一个设计实体中完成所用功能,发送和接收之间通过内部标志信号控制。这样做可以用一个程序完成设计,但是内部控制信号繁多,时序复杂,思维不易理清,所以不采用此方案。方案二:采用模块化设计思想,分为接收、发送部分,发送部分采用计数器实现自动发送。该方案采用模块设计思路,明显比方案一思路清晰,但是发送部分采用计数器控制发送,这样不易实现接收和发送的相互控制和配合。方案三:采用模块设计思想,分为接收、控制、发送部分。接收部分采用状态机实现数据的制动发送,控制部分也采用状态机控制接收和发送。当在接收数据时,控制状态机让发送状态机处于等待状态;接收完毕后,接收模块反馈一个信号给控制状态机,随后控制模块使接收模块处于等待状态,使能发送模块,发送完毕后发送模块也反馈一个信号给控制模块,控制模块在此使能接收模块,关闭发送模块,依次反复进行接收发送。第三种方案避免方案一和方案的缺点,所以本次设计采用第三种方案。设计程序:1)接收部分程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRECIVEISPORT(REN,CLR:INSTD_LOGIC;--REN,CLR是控制模块发出的信号,REN使能接收,CLR关闭接收ALE,WR:INSTD_LOGIC;ADD_HIGH,ADD_LOW:INSTD_LOGIC_VECTOR(7DOWNTO0);RECIVE_END:OUTSTD_LOGIC;--接收结束标志信号DATAOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYRECIVE;ARCHITECTUREARTOFRECIVEISSIGNALTEMP:STD_LOGIC_VECTOR(15DOWNTO0);--16位地址锁存BEGINPROCESS(ALE,WR,CLR)ISBEGINIF(CLR='1')THENRECIVE_END='0';--开始发送时将其清零ELSIF(REN='1')THENIF(ALE='1')THENTEMP=ADD_HIGH&ADD_LOW;ENDIF;IF(TEMP=XFA01ANDWR='0')THENDATAOUT=ADD_LOW;RECIVE_END='1';--发送结束,置位发送结束标志ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREART;2)发送部分源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;ENTITYSENDISPORT(SEN,RESET,CLK,LOAD:INSTD_LOGIC;--SEN是控制模块发出的信号DATAIN:INSTD_LOGIC_VECTOR(7DOWNTO0);QOUT,CLKOUT,SEND_END:OUTSTD_LOGIC);--串行数据输出,时钟输出ENDENTITYSEND;ARCHITECTUREARTOFSENDISTYPESTATESIS(ST0,ST1,ST2,ST3,ST4,ST5,ST6,ST7,ST8,ST9,ST10,ST11,ST12,ST13,ST14,ST15,ST16,ST17,ST18);SIGNALCURRENT_STATE,NEXT_STATE:STATES;SIGNALTEMP:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(LOAD)IS--锁存信号BEGINIF(LOAD='1')THENTEMP=DATAIN;--锁存数据ENDIF;ENDPROCESS;PROCESS(CLK,RESET)ISBEGINIF(RESET='1')THENCURRENT_STATE=ST0;ELSIF(CLK='1'ANDCLK'EVENT)THENCURRENT_STATE=NEXT_STATE;ENDIF;ENDPROCESS;PROCESS(SEN,CURRENT_STATE)ISBEGINCASECURRENT_STATEISWHENST0=CLKOUT='0';--状态0,等待状态QOUT='0';SEND_END='0';IF(SEN='0')THENNEXT_STATE=ST0;ELSENEXT_STATE=ST1;ENDIF;WHENST1=CLKOUT='1';QOUT=TEMP(0);SEND_END='0';NEXT_STATE=ST2;WHENST2=CLKOUT='0';QOUT=TEMP(0);SEND_END='0';NEXT_STATE=ST3;WHENST3=CLKOUT='1';QOUT=TEMP(1);SEND_END='0';NEXT_STATE=ST4;WHENST4=CLKOUT='0';QOUT=TEMP(1);SEND_END='0';NEXT_STATE=ST5;WHENST5=CLKOUT='1';QOUT=TEMP(2);SEND_END='0';NEXT_STATE=ST6;WHENST6=CLKOUT='0';QOUT=TEMP(2);SEND_END='0';NEXT_STATE=ST7;WHENST7=CLKOUT='1';QOUT=TEMP(3);SEND_END='0';NEXT_STATE=ST8;WHENST8=CLKOUT='0';QOUT=TEMP(3);SEND_END='0';NEXT_STATE=ST9;WHENST9=CLKOUT='1';QOUT=TEMP(4);SEND_END='0';NEXT_STATE=ST10;WHENST10=CLKOUT='0';QOUT=TEMP(4);SEND_END='0';NEXT_STATE=ST11;WHENST11=CLKOUT='1';QOUT=TEMP(5);SEND_END='0';NEXT_STATE=ST12;WHENST12=CLKOUT='0';QOUT=TEMP(5);SEND_END='0';NEXT_STATE=ST13;WHENST13=CLKOUT='1';QOUT=TEMP(6);SEND_END='0';NEXT_STATE=ST14;WHENST14=CLKOUT='0';QOUT=TEMP(6);SEND_END='0';NEXT_STATE=ST15;WHENST15=CLKOUT='1';QOUT=TEMP(7);SEND_END='0';NEXT_STATE=ST16;WHENST16=CLKOUT='0';QOUT=TEMP(7);SEND_END='0';NEXT_STATE=ST17;WHENST17=CLKOUT='0';--发送结束,将接收标志位置位QOUT='0';SEND_END='1';NEXT_STATE=ST18;WHENST18=CLKOUT='0';QOUT='0';SEND_END='1';NEXT_STATE=ST0;ENDCASE;--ENDIF;ENDPROCESS;ENDARCHITECTUREART;3)控制部分源程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYCONTISPORT(CLK,RESET:INSTD_LOGIC;SEND_END,RECIVE_END:INSTD_LO