#随笔 一个8位MCU学习(基于PIC16F72X)

  首先,这个8位MCU的指令集是基于PIC16,不过省去了SLEEP。因此,可以使用MPLAB来实现编译,通过软硬件协同测试来进行验证。

  这是一个基于嵌入式的指令集,相对于传统的取址,译码,执行,访存和写回的五级流水操作,只有取址,译码,执行和写回这四步。它主要的指令格式有三种,分别是针对字节的文件寄存器操作,针对位的文件寄存器操作以及立即数和控制操作,其中,指令一共有35条(包含NOP,CLRWDT,SLEEP)。下图是指令的通用格式:

  

 

  大部分指令可以在一个指令周期内完成,除非条件测试指令或指令执行改变PC值,这种情况需要两个指令周期,并且第二个指令是NOP。

  在自己设计的PIC内核中,主要分为IAU(取址),IRU(译码),EU(执行),STATUS(状态寄存器)以及STK_CTRL(堆栈和读写REG控制)。本内核采用的是八个硬核堆栈,并且将取址译码放在同一级流水,执行写回在第二级流水。在两级流水中,分别有对数据存储器的读写操作,由于可能出现连续两条指令出现,对同一个寄存器出现先写后读的操作,会导致出现数据冒险。因此,对于这种情况,在硬件上设置了旁路,可以直接将执行输出值,送到下一级的操作数上。

  由于我们的数据存储器是单口RAM,并且由于流水线操作,所以存在在同一时钟周期,对数据存储器进行读写操作。因此,我们将数据存储器的时钟设置为指令执行时钟的2倍,从而避免了结构冒险。最后对于控制冒险,分支跳转指令则是通过插入NOP来实现的。

 

posted on 2018-09-08 10:16  七颗糖  阅读(405)  评论(0编辑  收藏  举报

导航