Picoblaze的简易中断实验的启示
来源:互联网 发布:淘宝订单怎么拆分发货 编辑:程序博客网 时间:2024/05/01 18:39
Picoblaze的LED灯中断实验
刚学习Picoblaze,自己设计了一个实验,几天功夫实验才成功,并且搞清楚之前问题的根源,撰此文以记之。
如不了解Picoblaze相关知识,请参阅其他网络文档,Xilinx公司应用手册等参考资料。
预期实现的效果如下:有四盏LED灯L0,L1,L2,L3。正常工作的时候,从L0起依次点亮各LED等,即L0,L1,L2,L3,L0……当按下某个按键时,LED灯反向点亮一次,即L0,L3,L2,L1,L0……
以下是实验框图:
psm文件的大致流程为:
1. 初始化寄存器,设置中断使能
2. 程序正常运行部分,使用左移命令变换数据,将数据送入某LED端口,从OUT_PORT输出数据,驱动LED灯。循环此部分,第四盏灯点亮后跳转到该段程序首。
3. 延时语句编写
4. 中断程序部分,与正常运行部分相仿,不过这一部分先要保存环境,使用右移命令变换数据,执行完一次后跳出中断,恢复环境。
在描述顶层模块的时候,采用这样的语句来捕获数据:
最后得到的实验结果是灯“有规律”的点亮,但并不是预期的规律。百思不得其解。经过反复调试,发现是演示程序造成这样的结果。演示程序是简单的计数程序,怎么会造成这样的结果呢?起初端口号为0A,改成80等大端口号问题就消失了。因此怀疑在延时程序过程中计数计到了0A,在PORT_ID端口产生了0A这个信号。
要理解这个问题,首先要理解对于Picoblaze来说,这所谓的端口究竟是怎么回事。Picoblaze只有一个8位的PORT_ID与8位的OUT_PORT定义输出的信号。在执行OUTPUT命令时,在PORT_ID输出对应端口号,而OUT_PORT输出该端口的数据。其实说白了,Picoblaze只是定义了当与之连接的设备在PORT_ID输出是0A时,OUT_PORT输出的是你希望的信号。0A不过是个名字,就像一只鼠标,你爱叫它键盘它就是你承认的“键盘”而已。这样理解似乎解释的通,可是仔细看过应用手册,会发现OUTPUT有这样的时序:
看看忽略了什么?没错,就是这个WRITR_STROBE信号!在执行OUTPUT命令时,PORT_ID与OUT_PORT上的信号存在两个时钟周期,最后一个周期WRITE_PORT信号发生。但是接下来的解释会让你意识到这个信号是多么的重要。
翻阅指令集的详细介绍,找不到延时程序的问题所在。于是进行行为仿真,看看程序运行时发生了什么。
在这里,22b80这条指令就是将数据77从80端口输出了,我们可以看到,除了这条语句,其他语句也在PORT_ID输出不同的数据。在上图中,PORT_ID输出为00的大多是跳转语句。排除这些语句,仔细观察instruction与PORT_ID的关系,会发现指令的最后两位被放到了PORT_ID上。以0c101这条指令为例,它对应的语句是SUB s01, 01,这就是问题所在了,的确当计数器计到某个值时,PORT_ID会输出该立即数,这是一个巧合。因此,OUTPUT产生的PORT_ID与延时程序产生的PORT_ID有什么区别呢?关键就在于一个周期的WRITE_PORT信号了。这是它们之间的唯一区别。在描述顶层模块中,如果这样写,这样使用小端口也没有问题了:
- Picoblaze的简易中断实验的启示
- PicoBlaze
- 中断体系结构的实验~TQ2440
- 实验启示
- [安卓初学者实验]简易的计算器
- tasklet实验(加中断后的)
- 基于platform的ok6410按键中断实验
- 基于platform的ok6410按键中断实验
- zedboard的裸机中断实验(一)
- zedboard的裸机中断实验(一)
- 操作系统:进程的软中断通信实验
- Linux内核软中断线程对于通用内核线程的启示
- Linux内核软中断线程对于通用内核线程的启示
- 俄罗斯方块的启示
- 游戏的启示
- 蝴蝶的启示
- 未来的启示
- 《黑客帝国》的宗教启示
- 下拉列表框JS 写 代码
- java中获取文件路径的几种方式
- DirectFB资料(1)
- vc2005 使用Boost库的编译步骤.
- 贪心的想你
- Picoblaze的简易中断实验的启示
- POJ 1007
- POJ1068
- SAP message 探究
- 经典技术类图书收藏
- 面试常见的为题(看看你能答出来几道?)
- 有关PHP中的大小写区分
- 利用InstallShield12制作安装包之二:利用InstallScript脚本进行最基本的编程
- C#中获取文件夹的名称