openMSP430_IO interrupt

Verilog file: omsp_gpio.v

  1. //============================================================================
  2. // 4) INTERRUPT GENERATION
  3. //============================================================================
  4.  
  5. // Port 2 interrupt
  6. //------------------
  7.  
  8. // Delay input // The p2in_dly stores former value of p2in, it will be used for edge detection
  9. reg [:] p2in_dly;
  10. always @ (posedge mclk or posedge puc_rst)
  11. if (puc_rst) p2in_dly <= 'h00;
  12. else p2in_dly <= p2in & P2_EN_MSK;
  13.  
  14. // Edge detection // Now we can detect rising and falling edge easily by combining p2in and p2in_dly
  15. wire [:] p2in_re = p2in & ~p2in_dly;
  16. wire [:] p2in_fe = ~p2in & p2in_dly;
  17.  
  18. // Set interrupt flag // p2ies register decide which edge is interrup signal; p2ifg_set is sent to p2ifg for interrupt flag
  19. assign p2ifg_set = {p2ies[] ? p2in_fe[] : p2in_re[],
  20. p2ies[] ? p2in_fe[] : p2in_re[],
  21. p2ies[] ? p2in_fe[] : p2in_re[],
  22. p2ies[] ? p2in_fe[] : p2in_re[],
  23. p2ies[] ? p2in_fe[] : p2in_re[],
  24. p2ies[] ? p2in_fe[] : p2in_re[],
  25. p2ies[1] ? p2in_fe[] : p2in_re[],
  26. p2ies[] ? p2in_fe[] : p2in_re[]} & P2_EN_MSK;
  27.  
  28. // Generate CPU interrupt // Interrupt is generated when interrupt is enabled and p2ifg (interrupt flag) is available
  29. assign irq_port2 = |(p2ie & p2ifg) & P2_EN[];

  

  Assume  P2_EN is 1'b1, interrupt is enabled(P2IE=1), interrupt edge is rising(P2IES=0), so the code is as following:

  1. // Delay input
  2. reg [:] p2in_dly;
  3. always @ (posedge mclk or posedge puc_rst)
  4. if (puc_rst) p2in_dly <= 'h00;
  5. else p2in_dly <= p2in;
  6.  
  7. // Edge detection
  8. wire [:] p2in_re = p2in & ~p2in_dly;
  9.  
  10. // Set interrupt flag
  11. assign p2ifg_set = { p2in_re[],
  12. p2in_re[],
  13. p2in_re[],
  14. p2in_re[],
  15. p2in_re[],
  16. p2in_re[],
  17. p2in_re[],
  18. p2in_re[]  };
  19.  
  20. // Generate CPU interrupt
  21. assign irq_port2 = | p2ifg;

  

  P2IFG register is as following:

  1. // P2IFG Register
  2. //----------------
  3. reg [:] p2ifg;
  4.  
  5. wire p2ifg_wr = P2IFG[] ? reg_hi_wr[P2IFG] : reg_lo_wr[P2IFG];
  6. wire [:] p2ifg_nxt = P2IFG[] ? per_din[:] : per_din[:];
  7. wire [:] p2ifg_set;
  8.  
  9. always @ (posedge mclk or posedge puc_rst)
  10. if (puc_rst) p2ifg <= 'h00;
  11. else if (p2ifg_wr) p2ifg <= (p2ifg_nxt | p2ifg_set) & P2_EN_MSK;
  12. else p2ifg <= (p2ifg | p2ifg_set) & P2_EN_MSK;

  Assume P2_EN is 1'b1; P2IFG='h2B, so P2IFG[0]=1;  p2ifg_set = 8{1'b1}

  1. // P2IFG Register
  2. //----------------
  3. reg [:] p2ifg;
  4.  
  5. wire p2ifg_wr = reg_hi_wr[]; // If decoded address is P2IFG, then write it into data
  6. wire [:] p2ifg_nxt = per_din[:]; // receive high byte data from openMSP
  7. wire [:] p2ifg_set;
  8.  
  9. always @ (posedge mclk or posedge puc_rst)
  10. if (puc_rst) p2ifg <= 'h00;
  11. else if (p2ifg_wr) p2ifg <= p2ifg_nxt | p2ifg_set; // write into
  12. else p2ifg <= p2ifg | p2ifg_set; // read out

Verilog之openMSP430(1)的更多相关文章

  1. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  2. Verilog HDL模型的不同抽象级别

    所谓不同的抽象类别,实际上是指同一个物理电路,可以在不同层次上用Verilog语言来描述.如果只从行为功能的角度来描述某一电路模块,就称作行为模块.如果从电路结构的角度来描述该电路模块,就称作结构模块 ...

  3. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  4. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  5. FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  6. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  7. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  8. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  9. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

随机推荐

  1. 然而,该来的还是来了(Diary)

    2017-05-07     LG月赛成功炸掉...发现自己真的好多东西不会啊.对某些知识仅仅有最基础的一点理解啊!连线段树都理解不了怎么办?归并排序(including分治+贪心)全部炸掉啊.感觉自 ...

  2. Redis学习笔记(一)-持久化

    一.RDB持久方式 RDB持久化是把当前进程的数据已快照的形式保存到硬盘的过程. 触发方式: 1.手动触发命令:save和bgsave save:阻塞式,内存较大的实例在执行过程中会造成长时间的阻塞, ...

  3. Linux下SuperLU安装

    SuperLU安装 1.在家目录下建立文件夹superlu,进入该目录,获取安装程序并解压缩 mkdir superlu cd superlu wget http://crd-legacy.lbl.g ...

  4. 继续聊WPF——Thumb控件

    这个控件,真不好介绍,MSDN上也是草草几句,反正就是可以让用户拖动的玩意儿,但是,你会发现,当你在该控件上拖动时,它没有反响,也就是说这个东西默认不做任何操作的,它是赖在那里什么都不干,除非你去踢上 ...

  5. python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了

    我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...

  6. 如何彻底卸载系统自带的IE浏览器

    IE浏览器是windows系统上自带的浏览器,有时我们想要用其他的浏览器,例如chrome,卸载IE浏览器,那么应该如何卸载呢?下面就以win7上的IE9为例,告诉大家如何卸载IE浏览器. 方法/步骤 ...

  7. mongodb--安全

    安全和认证 mongodb和redis比较像,安全部分依赖于其所存在的环境 一定要把mongodb放在一个可信的环境下去运行,mongodb只能被web服务器所访问,禁止开外网端口访问mongodb, ...

  8. android 集成支付宝app支付(原生态)-包括android前端与java后台

    本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...

  9. CSDN日报20170416 ——《为什么程序猿话少钱多死得早?》

    [程序人生]为什么程序猿话少钱多死得早? 作者:文奇 我在想,程序猿都是话少吗?不一定吧.像我和我的同学.都是话非常多啊. 可是经历过非常多事的如今.再想想,发现事实的确如此.程序猿确实话少. 我是一 ...

  10. [Javascript] Understand common misconceptions about ES6's const keyword

    Values assigned with let and const are seen everywhere in JavaScript. It's become common to hear the ...