基于RTL的16位嵌入式微控制器(A8096)的设计

这里描述了一款自主研发的16位嵌入式微控制器(a8096)的设计与实现,基于rtl级设计方法使用veriloghdl进行设计描述,在设计中,采用硬布线控制方式,减少了面积和功耗,同时mcu兼容了msc-96指令集,目标是可以应用于实际嵌入式系统项目中。
1 总体设计
1.1 msc-96体系结构
图1所示为msc-96体系结构。intel 8096微控制器是由通用寄存器阵列、算术逻辑单元(ralu)和微程序控制器等模块组成。其采用的是微程序控制方式,需要使用一个片内rom存储器,因而会造成面积和功耗都会较大。
mcu内部的寄存器阵列通过一个控制器和2条总线与ralu相连。这两条总线是8位的a-bus和16位的d-bus。dbus只用于ralu与寄存器之间的数据传输,而a-bus用作上述传输过程中的地址总线。当mcu通过寄存器控制器访问片内外寄存器时,a-bus可作为多路转换的地址/数据总线。
1.2 a8096总体结构
为了减少面积和功耗,a8096采用硬布线逻辑控制方式取代上述的微程序控制器。依据msc-96的体系结构,a8096主要功能模块包括:ipu(instruction pre-fetch unit。指令预取单元)、cu(control unit,控制单元)、alu(arithmetic logical unit,算术逻辑单元)、mem_c-trl(mem控制器)、rf_ctrl(寄存器堆控制器)、isr(interrupt service routine unit,中断服务单元)、gpio(general purpose input out-put,通用输入输出单元)等主要功能部件。其结构如图2所示。
1.3 系统总线
a8096采用3条总线:一条是mem总线,用于ipu和mem ctrl对程序空间和数据空间的读写控制;16 bit的数据线,16 bit的地址线,读写信号memrd/memwr;一条是内部寄存器阵列(register file)总线,用于rf_ctrl对内部寄存器阵列的读写访问,地址线是8 bit的,数据线为16 bit,读写信号为rf_rd/rf_wr;一条是sfr总线,用于访问数据空间地址在00h~19h的特殊定义的寄存器空间。8 bit的地址总线,16bit的数据总线,读写信号sfrrd/sfrwr。另外ipu和memctr的数据交互是通过8 bit的数据线instr_bus完成的,其作用是从预取指令队列中将指令传给cu单元等。
2 mcu设计与实现
2.1 mcu工作原理
a8096通过ipu(指令预取单元)指令预取,并存放在预取指令队列中,cu(控制单元)从ipu指令队列中取指并进行译码,产生控制时序等信号。alu单元、ram控制器、mem控制器等部件中均有译码模块,依据当前指令和当前指令周期主动工作。如:ram控制器在加法指令的相应周期取操作数送往alu单元,alu在相应周期接收数据,然后进行运算并将结果输出。
2.2 mcu启动过程
在上电复位时,mcu处于复位态(rst信号有效)。复位时,ipu单元中的指令队列清空(empty信号有效),总线处于空闲态,ipu立刻进行指令预取动作,程序空间的首地址(2080h)指令即被取人指令队列,随后队列空信号(empty)无效,同时指令被发送出去(instr_bus)。在复位同时,控制单元(cu)的取指信号(codefetche)即一直有效,在指令队列空信号empty无效后(在empty无效之前cu一直等待),指令即通过instr_ bus进入了cu,指令操作码被存入了指令寄存器,如图3中instr寄存器更新为加法指令的操作码74。至此,mcu完成了复位、自动取指操作,并开始往下执行该指令,ipu单元也会继续进行指令预取操作。
2.3 指令执行过程
在a8096中,有两级指令预取概念:一级是指令预单元ipu利用总线空闲从程序空间不断预取指令存入指令队列中;一级则是指令执行过程中的指令预取,当一条指令执行到最后一个时钟周期时,cu单元就会发送取指信号,进行指令执行级的预取指动作,下一条指令的操作码即被预取出来(指令队列为空时需等待),并立刻进行译码确定指令的字节长度和指令执行周期数。
如图4所示,在加法指令的最后一个周期(cycle=05),cu单元取指信号codefetche有效,则下一条指令的操作码(6c,乘法操作码)被预取出来,同时进行查表译码确定其指令字节长度和指令周期数,随后操作码被存入指令寄存器instr中(此时,指令周期计数器cycle又从01开始计数)。后面乘法指令的操作数也会不断被取进来执行,直到乘法指令最后一个周期时,又将下一条指令的操作码预取进来。
需要说明:codefetche为取操作码信号,datafetche为取操作数信号。在指令最后一个周期时若有中断请求,则插入lcall指令进行中断处理,读取下一条指令。其流程如图5所示。
2.4 指令译码过程
在mcu设计过程中,首先完成对各条指令的指令分析工作,确定每个周期该做的动作,然后各部件依据指令分析表进行相关的指令译码(ram控制器只译ram要做的动作,alu只译alu要做的动作)。过程描述如下:在预取操作码时,cu单元对操作码进行译码确定指令的字节长度(nr_bytes)和指令周期数(nr_cycles)。然后cu依据指令字节长度(nr_bytes)取操作数,其他部件依据指令和当前指令周期(curcycle)执行相应的指令操作。表1为加法指令分析表,下面以加法指令的译码过程来说明整个译码流程:
1)加法指令 add opl op2(将opl+0p2结果写入opl中);其目标码格式为:add op2 opl,其中opl和op2均为操作数地址。
2)0周期 实际指上一条指令的最后一个时钟周期,此周期codefetche取指信号有效,ipu单元将指令送入cu单元确定了指令周期和指令长度。
3)l周期 取操作数信号datafetche有效,op2(地址)进来,被送入ram地址线,发读信号(从ram寄存器阵列取操作数2)。
4)2周期 操作数2被取入,并存入alu中的a寄存器;此周期取操作数信号datafetche有效,opl(地址)进来,被送入ram地址线,发读信号。
5)3周期 操作数l被取入,并存入alu中的b寄存器;加法器立刻进行a+b运算。
6)4周期 将加法结果放到ram数据线上,地址线=opl,发写信号。将加法结果写回到opl中,并依据结果对psw进行处理。
7)5周期 无动作,用于写回操作的过程。
3 验证结果
3.1 仿真验证
芯片的功能与结构设计,只是设计流程的一部分,为保证最终设计成功,必须对其全面仿真与功能验证。对mcu的测试方法如下:1)功能模块的单元测试,验证模块的功能正确性,包括接口时序等。2)系统集成测试,首先编写简单的机器码测试向量进行初步调试:然后使用编译器写汇编程序,编译成二进制机器码进行程序功能测试。在集成测试中,编写汇编测试程序,用编译器编译成机器码,在cadenee nc下运行这些测试程序进行仿真测试。对每条指令均测试了其各种寻址方式,且测试程序自动向debug寄存器写测试结果,以方便调试。经过复杂的测试和不断修正,验证结果显示mcu指令执行的正确性。
3.2 fpga验证
使用的fpga器件是stratixⅱ型号为ep1s40f780c7。综合结果显示:a8096使用3 565个le(logic element)。时序分析结果:a8096可以运行在49.93 mhz的时钟频率下。a8096占用fpga资源分布情况如图6所示。
4 结论
本设计中,采用risc技术中的硬布线控制逻辑,有利于减少mcu面积、降低功耗以及提高mcu执行效率,fpga实现表明其只占用了3 565个le单元,工作时钟可达50 mhz。同时该mcu具有很强的扩展性与实用性,应用领域广泛,可方便与定时器、串行通讯接口(i2c)、串行外围接口(spi)、模数(a/d)转换器等外围功能单元组成各种嵌入式系统,完全具备实际应用价值。

电机驱动电源芯片U6206DC带来更强驱动力
2021FTF青少年无人机大赛区域选拔赛成功举办
关于干式变压器的分类
晶体管的类型及工作原理
Qtum量子链现状与未来发展探讨
基于RTL的16位嵌入式微控制器(A8096)的设计
液位传感器怎么安装和使用
嵌入式系统的设计和开发资料大全
华为在印度智能手机市场屡屡受挫,原因值得深思
5G将会为自动驾驶的发展带来什么
工业机器人2.0:智能制造时代的主力军
五部委联合发文:严禁粗制滥造机器人
全球暗网监控工具TOP 10
5G商用牌照的发放为工业互联网的发展提供了重要网络技术支持
LSM6DSO六轴传感器使用指南
佟吉禄:发挥铁塔公司优势配合电信企业,全力以赴支撑5G网络建设
传感器的发展谁提供了新动能
运行iOS 13.1的多款iPhone无线充电板的充电速度测试
ADI即将推出新型电化学和阻抗测量前端
基于C8051F020和DTMF单元的电台身份识别及语音自动