ATLYS之中断控制器实验.docx
- 文档编号:12012430
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:26
- 大小:2.36MB
ATLYS之中断控制器实验.docx
《ATLYS之中断控制器实验.docx》由会员分享,可在线阅读,更多相关《ATLYS之中断控制器实验.docx(26页珍藏版)》请在冰豆网上搜索。
ATLYS之中断控制器实验
基于ATLYS开发板microblaze处理器
中断控制器的操作
本文档包括的内容如下:
1、实验背景及实验内容
2、硬件系统设计模块
3、软件设计模块
4、实验结果及分析
5、参考文档以及代码来源
一、实验背景及实验内容
1.1实验背景
CPU与外设之间传输数据的控制方式通常有三种:
查询方式、中断方式和DMA方式。
查询方式的优点是硬件开销小,使用起来比较简单。
但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPU的大量时间,降低了CPU的利用率。
为了解决这个矛盾,通常采用中断传送方式:
即当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。
这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。
能够向CPU发出中断请求的设备或事件称为中断源。
系统引入中断机制后,CPU与外设(甚至多个外设)处于“并行”工作状态,便于实现信息的实时处理和系统的故障处理。
中断方式的原理示意图如下所示。
图1中断处理示意图
1)中断响应
中断源向CPU发出中断请求,若优先级别最高,CPU在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点及现场信息。
然后,根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。
CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。
2)中断服务子程序
CPU响应中断以后,就会中止当前的程序,转去执行一个中断服务子程序,以完成为相应设备的服务。
中断服务子程序的一般结构如下图所示。
图2中断服务子程序处理流程
▼保护现场(由一系列的压栈指令完成)。
目的是为了保护那些与主程序中有冲突的寄存器,(如R0,R1,R2等),如果中断服务子程序中所使用的寄存器与主程序中所使用的寄存器等没有冲突的话,这一步骤可以省略。
▼中断处理,中断处理程序在检查到相应的中断源后,调用对应的中断处理程序完成。
▼恢复现场并返回(由一系列的出栈指令完成)。
是与保护现场对应的,但要注意数据恢复的次序,以免混乱。
由于中断服务子程序需要打断主程序的执行,因此其处理应该及时完成,较长时间的延时将导致系统性能严重下降。
1.2实验内容
本实验所用到的开发板是digilent公司出产的ATLYS型号开发板。
在本开发板所用到的FPGA芯片是Spartan-6XC6SLX45CSG324C,它所具有的硬件资源如图所示
图3:
ATLYS开发板上所具有的硬件资源
下图为ATLYS开发板的硬件实物图:
图4:
ATLYS开发板实物图
从中我们可以得知,共有8个led灯,8个交叉开关,五个按键。
本实验中就是要将按键作为中断的输入,即是每按一次按键就产生一个中断。
以及处理器内部有一个定时器,每隔一个固定的事件就产生一个中断。
假若产生中断的话就根据中断源的不同LED灯闪烁的效果就不同。
二、硬件系统设计模块
2.1逻辑电路连接
本实验中所用到的CPU是xilinx公司开发的microblaze软核,所用到的总线为PLB总线,LED灯以及按键都是通过GPIOIP核进行连接的,还有中断控制器以及计数器/计时器IP核。
intc
按键
PLB
timer
GPIO
LED灯
GPIO
microblaze
图5:
系统逻辑电路连接图
2.2XPS进行硬件模块设计
步骤一:
打开XPS的BSB向导,选择工程要存放的位置和PLB总线类型,以及指定板级支持包的路径,点击OK。
如图所示
图6:
新建一个XPS工程
步骤二:
所有选项都选择默认设置,直到出现如图所示对话框
图7:
配置处理器的时钟、localmemory大小等
在这里我们选择处理器时钟位75MHZ,localmemory大小为最大64KB,其他为默认设置。
点击下一步
步骤三:
一直点击下一步,所有选项都选择默认设置,直到出现如图所示对话框。
图8:
处理器外围设备配置
按照如图所示进行选择处理器的外围设备配置。
之后一直点击下一步,按照默认配置即可,直到完成BSB设置向导。
步骤四:
下面就得往硬件系统中添加中断控制器与计数器/计时器的IP核了。
首先在XPS的环境中,用鼠标双击IPCatalog---->Clock,ResetandInterrupt---->XPSInterruptController2.0.1.a来添加中断控制器的IP核如图9所示
图9:
选择中断控制器IP核
其次用同样的方式添加计数器/计时器IP核。
步骤五:
往硬件系统中添加了中断控制器与定时器/计数器的IP核后这两个IP核是独立的并没有连接到硬件系统当中去。
所以接下来的工作就是将设置IP核的参数与连接
首先将两个IP核与PLB总线连接。
在SystemAssemblyView视图中进行如图10修改将IP核与PLB总线进行连接。
图10:
将IP核与PLB总线进行连接
因为对于处理器microblaze来说外设是核内存统一编址的,所以接下来就得给外设分配地址了。
在SystemAssemblyView视图中选择Address视图点击右上角的生成地址按钮即可。
如图11所示
图10:
生成外设的地址空间
接下来就是连接IP核到硬件系统中去了以及设置IP核的参数。
我们在这里直接在mhs文件里修改。
关于中断控制器与计数器/计时器的IP核的连接以及参数配置如下图11所示
图11:
连接IP核到硬件系统中
关于各个IP核中端口连接请参考各个IP核的顶层实体定义。
在路径C:
\Xilinx\14.2\ISE_DS\EDK\hw\XilinxProcessorIPLib\pcores\xps_intc_v2_01_a\hdl\vhdl是关于中断控制器的顶层实体定义。
C:
\Xilinx\14.2\ISE_DS\EDK\hw\XilinxProcessorIPLib\pcores\xps_timer_v1_02_a\hdl\vhdl是关于定时器/计数器的顶层定义。
其中PORTIntr=timer1&Push_Buttons_5Bits_IP2INTC_Irpt代表中断控制器有两个中断输入分别是来自GPIO核与xps_timerIP核的。
而中断控制器默认的C_NUM_INTR_INPUTS(中断输入个数)就是2,其他的参数的默认值参考C:
\Xilinx\14.2\ISE_DS\EDK\hw\XilinxProcessorIPLib\pcores\xps_intc_v2_01_a\hdl\vhdl目录下中断控制器顶层实体定义文件xps_intc.vhd
因为添加的这两个IP核并不需要和实际的板卡相对于FPGAspartan-6的外设硬件相连接,所以就不用修改UCF文件。
三、软件设计模块
下图为软件程序的主函数部分,我们来逐句分析一下。
图12:
软件主程序代码
首先分析如下函数语句
这个函数代表了将中断源、中断处理函数以及中断控制器和中断源所处的中断号关联起来。
关于函数XIntc_RegisterHandler的具体描述如下所示
XIntc_MasterEnable(XPAR_XPS_INTC_0_BASEADDR);关于该函数的具体描述如下所示
从中可知这个在设置中断控制器中的MER(MasterEnableRegister)寄存器。
并且
#defineXIN_INT_MASTER_ENABLE_MASK0x1UL
#defineXIN_INT_HARDWARE_ENABLE_MASK0x2UL
关于MasterEnableRegister寄存器的详细描述如下所示
Thisisatwobit,read/writeregister.Thetwobitsaremappedtothetwoleastsignificantbitsofthelocation.TheleastsignificantbitcontainstheMasterEnable(ME)bitandthenextbitcontainstheHardwareInterruptEnable(HIE)bit.Writinga1totheMEbitenablestheIRQoutputsignal.Writinga0totheMEbitdisablestheIRQoutput,effectivelymaskingallinterruptinputs.TheHIEbitisawriteoncebit.Atresetthisbitisresettozero,allowingsoftwaretowritetotheISRtogenerate
interruptsfortestingpurposes,anddisablinganyhardwareinterruptinputs.Writingaonetothisbitenablesthehardwareinterruptinputsanddisablessoftwaregeneratedinputs.Writingaonealsodisablesanyfurtherchangestothisbituntilthedevicehasbeenreset.Writingonesorzerostoanyotherbitlocationdoesnothing.Whenread,thisregisterwillreflectthestateoftheMEandHIEbits.
而这句话代表使能硬件中断、使能所有中断。
XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR,0x3);关于该函数的具体描述如下所示
该函数改变的是中断控制器的IER(InterruptEnableRegister)寄存器。
关于该寄存器的详细描述如下所示
Thisisaread/writeregister.Writinga1toabitinthisregisterenablesthecorrespondingISRbittocauseassertionoftheINTCoutput.AnIERbitsetto'0'doesnotinhibitaninterruptconditionfrombeingcaptured,justreported.Writinga0toabitdisables,ormasks,willdisablethegenerationofinterruptoutputforcorrespondinginterruptinputsignal.Notehowever,thatdisablinganinterruptinputisnotthesameasclearingit.DisablinganactiveinterruptblocksthatinterruptfromreachingtheIRQoutput,butassoonasitisre-enabledtheinterruptwillimmediatelygeneratearequestontheIRQoutput.AninterruptmustbeclearedbywritingtotheInterruptAcknowledgeRegisterasdescribedbelow.ReadingtheIERindicateswhichinterruptinputsareenabled,whereaoneindicatestheinputisenabledandazeroindicatestheinputisdisabled.Iftherearefewerinterruptinputsthanthewidthofthedatabus,writinga1toanon-existinginterruptinputdoesnothingandreadingitwillreturnzero.TheInterruptEnableRegister(IER)isshowninFigure5andthebitsaredescribedinTable7.
该语句代表使能第0位与第一位的中断源
Status2=XGpio_Initialize(&GpioOutput2,XPAR_PUSH_BUTTONS_5BITS_DEVICE_ID);
if(Status2!
=XST_SUCCESS)
{eturnXST_FAILURE;}
XGpio_SetDataDirection(&GpioOutput2,LED_CHANNEL,0xffffffff);
该语句代表初始化关于按键的GPIOip核的寄存器,并且设置该GPIO的方向为input
XGpio_InterruptGlobalEnable(&GpioOutput2);关于该函数的详细描述如下所示
从中可知该函数改变了GIE寄存器的值。
关于GIE寄存器的详细描述如下所示
该语句代表使能全局中断使能
XGpio_InterruptEnable(&GpioOutput2,0x00000001);关于该函数的详细描述如下所示
从中我们可以得知改变的是IER寄存器,关于该寄存器的详细描述如下所示
该语句的含义是使能channel1的中断源。
XTmrCtr_SetLoadReg(XPAR_XPS_TIMER_0_BASEADDR,0,(timer_count*timer_count+1)*80000000);关于该函数的详细描述如下所示
从中我们可以得知是改变TLR寄存器的值,关于该寄存器的详细描述如下所示
该语句代表初始化计数器的值。
XTmrCtr_SetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0,XTC_CSR_INT_OCCURED_MASK|XTC_CSR_LOAD_MASK);关于该函数的详细描述如下所示
从中我们可以得知改变的是TCSR的值,下面是该寄存器的详细描述
#defineXTC_CSR_INT_OCCURED_MASK0x00000100
#defineXTC_CSR_LOAD_MASK0x00000020
所以该语句代表将T0INT清零以及将TLR0中的值加载到timer中去
XTmrCtr_SetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0,XTC_CSR_ENABLE_TMR_MASK|XTC_CSR_ENABLE_INT_MASK|
XTC_CSR_AUTO_RELOAD_MASK|XTC_CSR_DOWN_COUNT_MASK);
其中
#defineXTC_CSR_ENABLE_TMR_MASK0x00000080
#defineXTC_CSR_ENABLE_INT_MASK0x00000040
#defineXTC_CSR_AUTO_RELOAD_MASK0x00000010
#defineXTC_CSR_DOWN_COUNT_MASK0x00000002
所以该语句代表使能计数器、使能timer0的中断信号,当产生中断后重新加载计数器最开始的值以及向下递减计数。
microblaze_enable_interrupts();使能处理器的中断
/*Waitforinterruptstooccur*/
while
(1){
if(one_second_flag){
count_mod_3=count%3;
if(count_mod_3==0)
xil_printf("Interrupttakenat%dseconds\n\r",count);
one_second_flag=0;
xil_printf(".");
}
}
下面是关于计数器的中断处理函数
值得分析的就是
/*Readtimer0CSRtoseeifitraisedtheinterrupt*/
csr=XTmrCtr_GetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0);
/*Clearthetimerinterrupt*/
XTmrCtr_SetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0,csr);
这两句话首先代表读出TSCR0的值,因为此时一定是出现了中断情况,所以T0INT的值为1,然后再将读出TSCR0的值写入到TSCR0中去就可以将T0INT清零。
完成了一个完整的中断过程。
四、实验结果及分析
达成了一开始实验内容的目的,每当按下一个按键是就会产生一个中断。
下面总结一下算法流程:
首先将中断源、中断处理函数以及中断控制器和中断源所处的中断号关联起来。
使能中断控制器的master中断输出信号以及使能硬件中断禁止软件中断
使能中断控制器的各个输入中断源
接下来初始化按键GPIO,使其为input
使能按键GPIO的全局中断
使能按键的GPIO中channel1的中断源。
初始化计数器/计时器的loadregister的值
将计数器的TCSR寄存器中T0INT位清零以及将TLR0中的值加载到timer中去
按照如下设置计数器的TCSR寄存器:
使能计数器、使能timer0的中断信号,当产生中断后重新加载计数器最开始的值以及向下递减计数。
使能处理器中断以使处理器能够接收中断源和处理中断
产生中断后中断处理函数中要有清除相应中断的函数语句。
五、参考文档及代码来源
主要参考的文档是《xps_gpio.pdf》《xps_intc.pdf》《xps_timer.pdf》
工程文件放置于路径H:
\atlys_ziliao\microblaze\interrupt_timer_gpio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATLYS 中断 控制器 实验