基于Verilog的RISC MCU中断系统的设计与验证_第1页
基于Verilog的RISC MCU中断系统的设计与验证_第2页
基于Verilog的RISC MCU中断系统的设计与验证_第3页
基于Verilog的RISC MCU中断系统的设计与验证_第4页
基于Verilog的RISC MCU中断系统的设计与验证_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    基于Verilog的RISC MCU中断系统的设计与验证        凌朝东,柯志斌,王加贤 时间:2008年10月21日     字 体: 大 中 小        关键词:            摘  要: 

2、0;  关键词: verilog;PIC;RISC MCU;仿真;中断      微控制器(MCU)包括核心指令译码电路、寄存器/存储器模块和一组输入/输出(I/O)模块。当I/O模块处于操作进行时,I/O模块中断机制使微处理器可以忙于执行其他指令,取消MCU对端口的不必要等待时间,从而大大提高了MCU的执行效率1。     在微控制器或微处理器的设计中,控制信号的设计是最复杂的,而在控制信号的设计中,中断系统的设计又是最困难的部分1。本文以自主所开发的4位RISC MCU IP核为载体,采用自

3、上而下的设计方法,给出了其中断系统的Verilog硬件描述语言的具体实现过程。该系统可以作为一个功能部件, 直接在微控制器中加以运用, 对各种复杂中断系统的设计具有很好的借鉴意义。 1 中断系统总体设计    本系统所处的载体是由自身所研发的、采用数据总线和指令总线相互分离的哈佛双总线和Microchip技术公司的微控制器PIC的两级流水线机制2。中断系统的主要功能与MCS-51相同,有4个中断请求源,2个中断优先级,可实现2级中断服务程序嵌套。整个中断系统结构图如图1所示。具体的设计主要包含以下四个设计过程3:   

4、60;   (1)微控制器如何识别发生了哪个中断;     (2)出现多个中断时, 微处理器优先处理哪个中断;     (3)微控制器如何处理中断嵌套;     (4)微控制器如何处理中断执行周期。     其中,(1)是中断源的问题,(4)是中断响应时间的考虑,(2)和(3)归结起来就是中断优先级单元的设计。 1.1 中断源    系统的4个中断源分别是:外部中断SE(由I/

5、O提供);片内的定时/计数器T0的溢出中断请求ST;片内基准定时器BT0的溢出中断请求SB;液晶驱动模块的中断请求SL和中断系统相关的特殊功能寄存器及有中断允许控制寄存器IE,中断优先级控制寄存器IP和中断请求标志寄存器IF。IF、IE、IP寄存器中的中断源排位顺序一致,它们都可通过字节的指令操作来进行读写,MCU复位时,全部为0。当MCU同时收到几个同一优先级的中断请求时,由同级内的优先查询顺序确定哪个中断请求得到响应。各中断源得相应中断入口地址、默认同级优先级及IF/IE/IP寄存器的各位名称如表1所示。       IE的相应位

6、置1,表明相应的中断源为允许,为0时,则是屏蔽;IF的相应位置1,表明相应的中断源有请求,为0,则没有中断源请求;IP的相应位为1,表明相应的中断源为高优先级中断,为0,则为低优先级中断。该部分的相关Verilog代码如下(以基准定时中断为例): /基准定时模块中断源信号(高电平脉冲)的系统时钟同步;     always(sysclk)  begin         int_base1<=int_base;   

7、60;     int_base2<=int_base1;end     assign SB=!int_base1&int_base2; /中断请求标志位:可由中断源SB触发,也可通过对IF /的字节操作对其置位或清零,其余情况下则保持原状态 /不变。     assign FB=(resetn=0)?  1b0:         &

8、#160;   (SB=1)?    1b1:             (IF_wr)?    IF2:                        

9、; LF; /把中断请求标志位写回中断请求暂存寄存器IF_out,若有 /对IF进行写操作(IF_wr=1),则把IF_out写回。     assign IF_out=FB,FT,FE,FL; /中断请求响应条件位     assign FB_f=FB&IE2; 1.2 中断优先级设计    系统设置有2个中断优先级,对于每一个中断请求源可编程为高优先级中断或低优先级中断。中断系统中有2个不可寻址的优先级状态编码器,一个指出MCU是否有

10、高优先级的中断信号,另一个指出MCU是否有低优先级的中断信号。可根据这两个编码器的值来判断系统所处的中断状态。此部分为设计的重点。     如图1所示,把高、低优先级的中断分别归类到高优先级编码器(encoder2)和低优先级编码器(encoder1),无中断时,两编码器值都为零。若有一个不为零或两个都不为零,则会产生一中断信号(int_out),且会根据两优先编码器的值来确定中断入口地址(int_pc)、中断嵌套(int_nesting)、中断嵌套返回(int_nest_back)等信号,并将它们送入PC与堆栈处理模块。当然PC与堆栈模块也会产生相应的

11、反馈信号以处理多种中断情况。相关的重点实现代码如下: /低优先级编码器的输入端选择     assign encoder1_in0=(int_pri0=0)?FL:1b0; assign encoder1_in1=(int_pri1=0)?FE:1b0; assign encoder1_in2=(int_pri2=0)?FT:1b0; assign encoder1_in3=(int_pri3=0)?FB:1b0; /高优先级编码器的输入端选择 assign encoder2_in0=(int_

12、pri0=1)?FL:1b0; assign encoder2_in1=(int_pri1=1)?FE:1b0; assign encoder2_in2=(int_pri2=1)?FT:1b0; assign encoder2_in3=(int_pri3=1)?FB:1b0; /低优先级编码器的实现:无中断时,值为0,进中断时优先 /编码赋值。其中把值寄存一次,用以辨别中断源变化时的 /编码状态,做为中断嵌套等多种中断情况的信号辨别条 /件;高优先级编码器的实现与低优先级类同,结果为out2 /和out2_pre。

13、     always(encoder1_in or out1)         begin         out1_pre<=out1;         casex(encoder1_in)         4b0000:out1

14、=3b000;         4b0001:out1=3b001;         4b001x:out1=3b010;         4b01xx:out1=3b011;         4b1xxx:out1=3b100;    &

15、#160;    default:out1=3b000;         endcase         end /根据高低编码器出来的结果辨别优先级,即该跳转的中断 /向量地址。先仅取用到的5位数,用时再与前面补零;其 /中也已包含了同级默认优先级的功能;     assign int_pc=  (out2=3b100)

16、60; ?  4b0011:                 (out2=3b011)  ?  4b0101:                 (out2=3b010)  ?  4b0111:   &

17、#160;             (out2=3b001)  ?  4b1001:                 (out1=3b100)  ?  4b0011:         

18、60;       (out1=3b011)  ?  4b0101:                 (out1=3b010)  ?  4b0111:                 (ou

19、t1=3b001)  ?  4b1001:                                     4b0000; /中断信号的产生,int_out_clear为PC和堆栈模块的反馈信 

20、;/号;     assign int_out=(int_out_clear=1)? 1b0:            (out2!=3b000)|(out1!=3b000)? 1b1:1b0; /中断嵌套信号的条件是通过两编码器输出结果的变化推 /断出来的,且已通过验证证明是正确的。中断嵌套返回的 /方法与此同,不细述。     assign int_nest=(out1!=3

21、b000)&(out2_pre=3b000)&(out2!= 3b000)=1b1)?1b1:1b0; /int_nest为一辨别信号,将其转换为系统脉冲信号;     always(posedge sysclk)  begin         int_nest1<=int_nest;         int_nest2<=int_nest

22、1;         if(!int_nest2&int_nest)         int_nesting<=1;         else int_nesting<=0;end 1.3 中断响应    中断延迟是MCU的一个重要参数, 通常是指在最坏情况下响应中断的最长时间。因系统属于RISC单

23、周期指令,也就不存在CISC中存在的指令未执行完而被打断的情况。当然MCU也是在现行一条指令执行完毕即下一个指令周期的Q1才开始响应中断的,并不是在一条指令执行期间响应中断,这样MCU才能正确返回断点继续执行原来的程序。由此也可知道系统大部分时刻中断响应时间为1个指令周期;除非正在执行的指令是现场保护(入栈)、现场恢复(出栈),则需要等这些指令执行完之后,再去响应新的中断请求,这一点本系统是通过软件程序来实现。软件程序的具体编写步骤与MCS-51相似,见参考文献4。 1.4 PC与堆栈模块    PC与堆栈模块通过接收来自中断优先级模块的信号处理多种中断

24、情况的发生,并产生相应的反馈信号,且完成了现场保护(入栈)、现场恢复(出栈)、PC预取值等重要操作。除了跳转地址须等指令周期的Q4外,其余的大部分操作皆于Q1时刻完成。     always(posedge clk1 or posedge int_nesting or negedge resetn)  begin         if(resetn=0)          /中

25、断嵌套信号需把int_out_clear清零,以辨别新中断信号; /当有中断信号后的下一个Q1,置int_out_clear为1;中断 /返回指令RTI时置其为0;其余时刻保持不变。         else if(int_nesting) int_out_clear<=0;         else begin         p

26、c_plus1<=pc_fetch+1;         pc<=pc_fetch;         casex(int_out,inst15:12)         5b1xxxx:begin             

27、;    int_out_clear<=1 /pc_int:中断发生标志;pc_pop:中断返回标志             pc_int<=1;             pc_pop<=0; /中断嵌套返回时刻并不执行压栈操作,而应返回原压栈值    

28、;         if(int_nest_back=0)             /压栈         5b01111:begin             pc_pop<=1; &

29、#160;           pc_int<=0;             int_out_clear<=0;             /进栈         def

30、ault:begin             pc_pop<=0;             pc_int<=0;end /预取值地址的辨别 assign pc_fetch=(resetn=0) ? 12b0000_0000_0000:        

31、; (pc_pop=1)  ?   pc_fetch_pop:         (int_nest_back&pc_int)  ?  pc_fetch_pop:         (pc_int=1)  ?  8b00000000,int_pc:         (sys_jmp=1)  ?  pc_jmp:                          pc_plus1; 2 系统的测试与验证    本中断系统属于自主设计的RISC MCU IP核的子模块,其功能与时序仿真也是在整个IP核上进行的。经过六个含中断程序的下载

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论