工业操控中往往需求完结多通道毛病检测及多通道指令操控(这种多使命设置十分遍及),独自的CPU芯片由于其外部操控接口数量有限而难以直接完结多路检控使命,故运用ARM芯片与FPGA相结合来扩展检控通道是一个十分好的挑选。这儿介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合运用完结多通道检控使命的一种完结办法。
各部分功用简介
图1为此体系的结构衔接框图。如图所示,ARM芯片与FPGA芯片之间经过数据总线、地址总线及读写操控线相连,而与终端PC则经过串口通讯;FPGA与方针设备经过指令操控总线和毛病检测总线相连。
图1 体系结构框图
1 毛病检测和指令操控部分
毛病检测:检测通道的毛病(正常)信号以高(低)电平办法指示,其一旦有毛病发生就会坚持高电平不变直到毛病扫除。针对这种特征,在ARM操控器端选用守时中止循环查询办法来判别毛病通道的状况。守时中止程序经过对ARM 地址总线在FPGA中进行译码而次序确定被检测通道的电平值,然后再经数据总线传回ARM进行判别,最终将判别成果送至长途终端。选用主机查询办法而不选用毛病中止办法出于两个原因:一方面是一般操控芯片外部中止源有限(大都为4个外部中止源),关于多方针中止信号检测显然是困难的;另一方面,由于检测通道或设备遭到短时搅扰而发生电平随机回转,构成毛病中止触发,而中止触发后又无法在通道电平康复正常时吊销毛病信号,故而构成虚伪报警。
指令操控:ARM芯片先判别主控端发来的操控指令,然后经过地址总线和数据总线将指令状况发送至经FPGA地址译码确定的操控通道上。
2 ARM芯片与长途检测操控终端通讯
由于只存在指令和毛病状况信号的收发,所以运用ARM的串口完结与长途PC的通讯,通讯规范选为RS232规范。不过,在ARM芯片上要先将TTL电平经过MAX232芯片转化为RS232电平规范,关于间隔超越15m的全双工通讯,在发送接纳两头还要各加一对RS232转RS422电平的转化模块,以添加通讯间隔。
3 FPGA内部功用模块阐明
FPGA内部检测及操控电路结构联系如图2所示。
图2 FPGA内部逻辑结构
ARM芯片的ADDR2~0位地址线和片选使能信号一起进入译码器decode1进行地址译码后发生8路输出(FPGA内部可设置一个最大输出为256路的译码模块,所以在实践运用中可扩展为更多通道),低4路用于指令发送通道,高4路用于毛病检测通道,读写使能信号操控数据总线。
ARM芯片接纳到发送信号编码指令时,立即在串口接纳中止服务子程序中并送相应地址(通道编号)和数据(指令状况)到FPGA中。译码器有用输出作为相应通道D触发器的锁存时钟,而数据状况则被触发器确定后作为所选通道的输出完结相应操控。
ARM芯片在守时中止发生进入服务程序后对一切检测通道轮番查询,查询到有通道毛病时,毛病信号结合选中通路信号经与非运算送往数据端口被读取。
FPGA程序设计留意问题
1延时的装备
经过地址总线和数据总线进行指令传输和毛病检测时,FPGA是作为ARM芯片的一般外设来运用的。而ARM芯片对外设拜访的速度要远低于片内存储器,所以要在ARM中设置拜访的正确等候周期。ARM中供给的延时周期为0~7个,经过调试即可找到外设适宜的等候周期,此体系的等候周期依据实践测验设置为5个,详细的装备办法见ARM程序阐明。
2 读写使能信号的衔接
从图2中能够看出,写使能信号NWE及读使能信号NRD应作为数据线(DATA0~5)的三态操控信号衔接,即便在ARM芯片无其他外设时也不能缺省。由于ARM的上电加载程序时刻要善于同一体系上FPGA的程序装备时刻,而FPGA的检测及操控通道与ARM芯片的数据总线相连,FPGA加载完结后数据总线会存有相应通道的逻辑电平值(不为三态),这就会导致ARM芯片在对片内Flash芯片烧写程序或上电加载程序时与FPGA抵触(数据被逻辑确定),构成无法正确定位操作目标而使读写失利。
ARM装备及运用程序阐明
1 处理器的资源分配
● 存储器
AT91FR40162内嵌一个256KB的SRAM,1024K个16位字组成的Flash存储器。SRAM经过内部32位数据总线与ARM核相连,单周期拜访,Flash存储器则经过外部总线拜访。
● 体系外围
EBI:外部总线操控接口,EBI可寻址64MB的空间,经过8个片选线(NCS0~NCS3独立)和24位地址线拜访外设,地址线高4位与片选线(NCS4~7)复用,数据总线可装备成8/16位两种形式与外设接口。
PIO:并口操控器,PIO操控32根I/O线,大都为复用引脚,可经过编程挑选为通用或专用。
AIC:先进中止操控器,完结片内外围中止及4个外部中止源中止的办理,其外部中止引脚与通用I/O复用。
● 用户外围
USART0~1:串口收发操控器,支撑8个数据位的发送,能够进行异步/同步传输挑选,其片外引脚与通用I/O复用。
TC:守时/计数器,能够发生守时中止和计数功用,其片外引脚与通用I/O复用。
2 存储器地址重映射后的空间分配
在CPU上电后,都会从地址0开端第一条指令代码的履行,而上电复位后0地址有必要映射到NCS0片选所接的器材上,这儿有必要将NCS0衔接到片内Flash上以加载初始化程序和运用程序。由于中止和反常的进口地址是0~20H固定不变,它们的发生都是跳转到0~20H之间相应的地址取程序履行,为了加速中止呼应,有必要将0~20H地址映射到片内RAM区,所以在初始化的重映射指令履行(EB1_RCR的RCB方位1)后,内部RAM就映射到地址0,一切的中止进口呼应和仓库操作都被映射到在RAM区进行。
由于重映射首要是用于Flash和片内RAM的地址空间交流,所以片内外围接口(EBI、USART、TC)对应的存储器编程地址范围在映射前后不发生改动,而拜访外设地址为重映射后所分配。重映射后地址分配如表1所示。
3 运用接口的存储器装备
EBI存储器:在8个EBI片选存储器(EBI_CSR0~EBI_CSR7)中设置外设拜访参数。其间,32位存储器中包含数据总线宽度8(16)设置,等候状况数目1~7个周期设置,等候使能(不是使能)设置,片选使能(不使能)设置。这儿将FPGA作为外设,使能NCS3(也可依据实践挑选其他闲暇片选线),挑选总线宽度16,使能等候周期并设周期为5(依据调试挑选)。因默许NCS0为加载Flash片选线,而Flash为16位信号、7个等候周期,故需在EBI_CSR0中挑选16位总线宽度、7个等候周期并使能NCS0。
AIC存储器:AIC存储器办理一切内外部中止,对此存储器的正确初始化赋值才会翻开相应中止。设定AIC作业参数:运用串口通讯形式为异步形式,串口发送的数据位字符长度为8位,通讯的波特率9600B/s,串口中止优先级为6(中止优先级由低到高0~7),接纳发送通道使能。
TC存储器:守时中止存储器需求设定守时长度为1s(每1s发生中止进行毛病查询),守时通道使能及软件触发形式,守时中止优先级设为1。
4 运用程序阐明
① 主程序
#define AT91C_BASE_EBI ((AT91PS_EBI) 0xFFE00000) //EBI基地址界说
int main()
{AT91F_EBI_OpenChipSelect (
AT91C_BASE_EBI, //地址指针
0x3, //片NCS3使能
0x30000000+0x3f39); //片选存储器初始化
Usart_init();//初始化串口
timer_init();//初始化守时器
while(1){} //循环等候
}
ARM处理器在完结各寄存器初始化后进入运用主程序,在主程序中首要调用EBI接口使能函数来设置参数:在程序中设置存储器基地址值(0xFFE00000),片选设置0x3(NCS3使能),NCS3的存储器初始化;调用USART操控器函数初始化串口:翻开串口,串口收发通道初始化,设定串口通讯速率;调用守时中止函数:翻开守时中止,设置守时中止时刻,设定触发办法为软件触发;最终进入等候循环。
② 串口指令接纳中止服务程序
#define USART0_INTERRUPT_LEVEL 6//设置中止优先级为6
#define AT91C_US_USMODE_NORMAL AT91C_US_CHMODE_NORMAL//*设置通讯形式(NORMAL界说为异步形式)*//
AT91PS_USART COM0=AT91C_BASE_US0;//设置COM0为收发口
char message[4];
// 操控端串口中止通讯程序 //
//*—————————————————————————-*//
void Usart0_c_irq_handler(AT91PS_USART USART_pt)//串口中止处理函数
{ volatile unsigned int *conp;unsigned int status;
int time;
volatile unsigned int i;
status = USART_pt->US_CSR &USART_pt->US_IMR;//给状况寄存器赋初值
if ( status &AT91C_US_RXRDY)//接纳通道寄存器判别是否有数据
{
AT91F_US_DisableIt(USART_pt,AT91C_US_RXRDY);//封闭接纳通道准备好中止
AT91F_US_EnableIt(USART_pt,AT91C_US_ENDRX);//翻开接纳完毕中止
AT91F_US_ReceiveFrame(USART_pt,(char*)(message),4);//调用接纳数据数接纳数据
}
if ( status &AT91C_US_ENDRX){
AT91F_US_DisableIt(USART_pt,AT91C_US_ENDRX); // 封闭接纳器传送完毕中止
{ if((message[0]^0xff)==message[1])//判别接纳代码
{switch (message[0])
{case 0x31 : {conp=(volatile unsigned int*)(0x1+0x30000000);//OPE1使能
*conp=0x2;}; break;//0x31代码送往OPE1端口
case 0x30 : {conp=(volatile unsigned int*)(0x2+0x30000000);//OPE2使能
*conp=0x1;}; break; // 0x30代码送往OPE2端口
case 0x11 : {conp=(volatile unsigned int*)(0x3+0x30000000);//OPE3使能
*conp=0x2;};break;// 0x11代码则往OPE3端口
case 0x10 : {conp=(volatile unsigned int*)(0x4+0x30000000);//OPE4使能
*conp=0x1;};break; //0x10代码送往OPE4端口
default:break;}
}
}
以上程序为串口中止服务程序,各函数句子阐明拜见注释。中止等级设置为6(高于守时中止),这样使指令发送优先于毛病查询(操控指令随机呈现而毛病查询总是循环进行);接纳缓冲区message[4]数组类型有必要设为动态分配,静态数据分配会使处理器拓荒数据缓冲区到Flash芯片中,然后引发在一个中止处理程序中由于存取时刻过长而导致串口收发超时的过错。由于篇幅有限,其他程序不再逐个叙说。
在ARM运用程序的编写中,应该尽量少的在主函数内运用循环操作,主函数首要完结各接口操控器运用初始化,由于主函数不间断循环操作不但会添加功耗,并且长时刻频频切换于中止服务和主循环之间会构成程序运转的不稳定,所以能用守时中止完结的循环操作尽量用中止完结。
结语
ARM芯片操控功用结合FPGA灵敏的多硬件接口模仿特性在工程上体现出的其共同的优势,已发展为一种盛行的硬件架构形式,跟着芯片功用的不断强壮,这种优势将使其用处更广,对使命处理变得愈加灵敏高效。