Picoblaze的简易中断实验的启示

 

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信号了。这是它们之间的唯一区别。在描述顶层模块中,如果这样写,这样使用小端口也没有问题了:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值