×
单片机 > 单片机程序设计 > 详情

基于EDA技术的单片机IP核设计

发布时间:2020-06-06 发布时间:
|

1.   引言

EDA(Electronic Design Automatic),简单的说就是通过有关的开发软件,自动完成用软件的方式设计的电子系统到最终形成集成电子系统或专用集成芯片的一门新技术。其中, EDA关键技术之一就是可以用硬件描述语言(HDL)来描述具有广泛应用前景、且具备自主知识产权的IP核(Intellectual Property)。这种IP核具有很高的通用性和灵活性,可以通过软件编程完成不同特定的功能,可以任意使用在各种嵌入式微控制系统中。嵌入式IP核的应用,由于重用设计思想、设计知识,极大地降低了设计成本,缩短了设计周期,成为当今片上系统(SoC)的重要设计手段。【1】

MCS-51系列单片机是目前国内应用时间最长、最普及、可获得应用资料最多的功能强大的8位MCU,建立兼容MCS-51单片机IP核对于各种嵌入式系统和SoC的应用具有重要意义。针对MCS-51单片机的应用前景,笔者成功设计了与MCS-51系列微处理器指令集完全兼容且功能更强的8位嵌入式微处理器芯片,通过IP核重用技术,可广泛应用在各种SoC中。

2.系统简介

本课题采用Altera公司的MAX+plusⅡ10.0设计平台,以超高速集成电路硬件描述语言VHDL为系统逻辑描述的唯一表达方式,采用自顶向下的设计原则,对MCS-51单片机进行反相设计。同时选用 Altera 公司的 ACEX系列器件来实现最终的IP核。由于篇幅的关系,笔者不打算对开发平台、开发工具以及最终实现硬件电路的FPGA芯片进行介绍,而是着重介绍整体的设计思想。图1是本课题进行设计的顶层设计层次图。实线部分是MCS-51单片机的内核部分,虚线部分是外围存储电路部分。下面介绍各部分的实现方法。


                          图1   MCS-51单片机顶层设计层次图

3.系统现实

3.1 算术逻辑单元(ALU)的实现

算术、逻辑运算模块的功能是按照控制单元给出的指令,对来自数据存储器、程序存储器、累加器A以及程序状态字的相关位的数据,进行相关的算术和逻辑运算。图2是用VHDL语言对ALU模块进行描述的设计层次图。由图中可以看出整个ALU由6个模块组成:加/减法器,乘法器、除法器、十进制调整器、逻辑运算器以及一个多路选择器。其中加/减法器又可以分成两个子模块。本模块将用较为简单的纯组合逻辑电路来实现。限于篇幅,具体的实现不再赘述,请读者参阅参考文献【2】。

          
                             图 2  ALU设计层次图

3.2定时器/计数器(Timer/Counter)模块的实现

分析MCS-51单片机的定时器/计数器的功能和原理可知,本单元将必须以时序逻辑电路的方式来实现。图3中的左图就是本模块设计完成后形成的符号文件。图中的输入除时钟CLK、复位RESET、外部中断0 INT0_I和外部中断1 INT1_I直接来自芯片的外部输入之外,其余的输入信号全部来自控制器。其中的RELOAD_I[7 to 0]、WT_EN以及WT_I[7 to 0]用于重写定时器/计数器内部寄存器。所有的输出信号全部送往控制器,用于及时更新特殊功能寄存器的内容。

定时器/计数器的两种工作方式决定了要设计好定时器/计数器首先必须设计一个分频器和两个(因为有两个定时器/计数器)负跳变的检测器。负跳变的检测器,可以用一个双稳态的触发器来实现;分频器的实质是计数器。触发器和计数器都是时序逻辑电路中的基本单元,VHDL语言的实现方法请读者参考相关书籍【1】。因此本设计实体的结构体将由3个进程来实现。除了分频器和两个负跳变的检测器各占用一个进程外,第三个进程用于实现时器/计数器的四种工作模式。对定时器/计数器的各种工作于模式的原理分析可知,要实现这样一个电路,其VHDL语言的结构体应该包括两个大的部分:一是置中断标志位,二是改变计数寄存器的值。同时,改变计数寄存器的值又可以细分为两块——写高8位寄存器和写低8位寄存器。各个进程之间相互关联,内部信号将作为进程之间传输信息的纽带。[page]


                 图 3  8051_tmrctr和8051_siu的符号文件图

3.3串行接口模块

MC5—51单片机的串行接口既可以作通用异步接收和发送器(UART)用,又可以作同步移位寄存器用。图3中的右图就是本模块设计完成后形成的符号文件。由于本设计不支持I/O口的复用,所以为串行口工作于模式0下增加了RXD_O和RXDWR两个输出引脚,前者用于输出,后者为输出有效控制位。串行口控制寄存器SCON在设计中也被分成两部分,一部分接收来自控制器的输入(一共6位,SM0、SM1、SM2、REN、TB8和RI),一部分作为输出送往控制器(一共3位,RB8以及分别指示发送和接收完毕的两位,控制器会根据这两位来对中断标志置位)。至于发送中断标志位TI,由于其不会影响串行口的工作过程所以在此并未列出,它将在控制器中得到体现。

串行口有四种工作方式,方式0和方式2是对时钟频率分频的结果;方式1和方式3的波特率是对定时器/计数器1的溢出率进行分频。由此可见,首先必须要解决的问题就是设计分频器。由于在方式0下,串行口是作半双工的同步移位寄存器使用,其发送和接收的波特率是一样的,因此对于方式0,串行口内部的分频信号只需要一路即可。但是对于其他方式,串行口均是工作在全双工的状态下,因此,每种方式下均需要两路分频信号。分频器的设计在上已经述及,在此不加赘述。对于方式1和方式3,其分频的对象都是定时器/计数器1的溢出率,且分频的系数是一样的。由于串行口只有一个,它不可能同时工作在方式1和3,因此方式1和方式3可以共用分频信号。要对定时器/计数器1的溢出率进行分频,首先必须测出其频率,为此需要一个上升沿的检测器来监测外部输入的定时器/计数器1的溢出信号(图3中的右图中的TF_I引脚),这样的检测器同样可以用双稳态触发器来实现。检测器在监测到TF_I引脚的上升沿时就使其输出信号保持一个时钟周期的高电平,再来另外设计计数器对此高电平进行计数,以达到对其分频的效果。

除了作为同步移位寄存器的方式0外,其他的三种方式在接收外部输入的时候均需要对外部的输入信号采样监测以确定信号的值。因此一个位检测器是必需的。同时,串行口工作在方式1、方式2和方式3时,每一个接收的数据帧都有一个起始位,这个起始位被固定为0,也就是说在输入端RXD_I监测到1到0的负跳变就会启动接收过程(注:负跳变检测器对外部输入引脚的采样频率为波特率的16倍)。位检测器的设计原理是把一个接收位的时间分为16等分(以内部计数器的16个状态来表示),在计数器的7、8、9状态时,位检测器对外部输入端的值进行采样。采用3取2的表决方法来抑制噪声。如果位检测器检测到接收的第一位不是0,那么就说明它不是一帧数据的起始位,应该摈弃,接收电路复位。

至于接收和发送,这里采用有限状态机的方式来实现。由于要工作在全双工模式下,所以接收和发送要采用两个有限状态机,有限状态机的每一个状态用来发送/接收移位数据,发送和接收的具体实现方式是移位【3】。移位的时钟来自上面所述的分频器,也就是根据各自的波特率进行。限于篇幅,在此不再详述。

3.4控制器模块

控制器的设计是MCS-51单片机IP核设计中最复杂的部分,也是设计中最重要的组成模块。控制器的将分为两个模块来实现。一个模块(在此命名为control_mem)主要用于与存储器(包括内部RAM,特殊功能寄存器SFR,外部RAM以及程序存储器)的控制。另一个模块(在此命名为control_fsm)主要用来实现指令系统。control_mem以时序电路的方式来实现,它的作用是根据状态机传来的各种控制指令来对相应的存储器进行操作。本状态机的主控时序进程是control_mem模块中的一个以时序逻辑电路现实的进程。它的启动由control_mem模块的相应输出信号来实现,启动后每经过已过状态,其输出的信号就会部分改变,这些改变就会指示control_mem下一步的动作,如此周而复始。下面简要介绍一下二者的实现原理。

control_mem模块的主要任务是根据状态机的相应指令,实现对存储器的相应操作。其总共要完成7个任务(7个任务分别以7个进程来实现,除前3个以时序逻辑电路的方式来实现外,后面的4个进程全部是以组合逻辑电路的方式来实现的。),分别是:

1.监测各个中断源的变化。使指示中断源有变化的相应信号位置位。监测外部引脚的变化的方法,一个简单的双稳态触发器就可以实现。

2.根据状态机的指令写一些用户没有直接地址的芯片内部辅助寄存器。它主要的作用是作为状态机的主控进程,同时它也会根据状态机的状态置位相应的内部辅助寄存器(例如:指示高、低优先级的中断是否正在运行的寄存器等)。同时,取指令也是在本进程中实现的。

3.写内部RAM和SFR,包括写“字节”和写“位”。它由时序逻辑电路来实现,写“位”和写“字节”的控制信号由状态机给出,每次写操作均由时钟上升沿触发。

4.根据检测中断源的变化的结果,在必要时向状态机发送中断请求类别指示信号。它是一个纯组合逻辑电路,进程1中一旦监测到中断源有变化,它的输出信号(与状态机相连接)就会改变,从而指示状态机进入中断。

[page]

5.读内部RAM和SFR,包括读“字节”和读“位”。此进程为一纯组合逻辑电路。RAM和SFR任何单元的内容的改变均可以启动该进程,同时地址信号也是进程的敏感信号之一。每一次读的过程会读到两个值,一个是“字节”数据,一个是“位”数据,至于状态机在指令的执行过程中会使用“字节”数据还是“位”数据,由状态机根据当前指令自己决定。

6.根据状态机发出的各种多路选择器的值,输出相应的地址和数据的值。多路选择器的作用是根据状态机的指示,即时的输出内部RAM的地址、内部RAM数据(包括“位”数据和“字节”数据)、外部RAM的地址等。

7.计算下一个指令指针的值。它根据状态机的指示,实现对程序计数器值的改写。

control_fsm模块的作用则很单一,就是实现指令系统。不过需要说明的是,这个状态机在接收到来自control_mem模块的有关中断源有变化的信号时,它会优先发出控制指令,指示control_mem模块改变指令指针的值,进入中断。没有中断发生的时候,它就会根据程序存储器的指令来运作。关于指令状态机的设计细节读者可以参阅参考文献【4】。

3.5.外围存储器模块的实现

由于对存储器容量在不同的场合有不同的要求,且实现的方式多种多样,故本设计才把整个设计分为MCS-51内核和存储器两个大的部分。这样做一方面可以方便裁减,使IP核可以在更多的可编程器件上综合;另外实现起来也相对容易。

MAX+ plusⅡ中为了增加原件库的灵活性,为一些常用的功能模块提供了参数化的元件,这些元件的规模以及具体功能可以由用户直接指定,如同可编程元件。这一类元件就是MAX+ plusⅡ中的LPM,即——可调参数元件。利用LPM所提供的RAM、ROM例化设计文件,设计实现了128字节内部RAM和4k ROM模块,其中ROM模块是一个空结构实体,在有内部程序时换成相应的结构。内部程序必须以ASCII码形式或十六进制形式的文件写入,表明每个地址的初始值,用于设计的仿真和综合。

4.功能仿真

下面通过几条简单的指令,来对所设计的IP核进行软件仿真。几条仿真的指令助记符和指令的操作码、操作数、字节数、周期数如下表1所示。仿真的结果如图5所示。图中rom_data_i表示的程序存储器中的数据;rom_adr_o是程序计数器PC的值;state_i为芯片内部信号,指示的是指令执行的状态,“7”表示在取指令状态,其他值为执行状态。acc_o是内部寄存器ACC的值。从图中可以清楚的看到各信号的变化。

                            表1 仿真指令表

指令助记符

操作码

操作数

指令字节

指令周期

AJMP FFH

01H

FFH

2

2

CPL

F4H

/

1

1

MOV A,#23H

74H

23H

2

2

MOV R0,A

F8H

/

1

1

MOV23H,#05H

75H

23H,5H

3

3

ADDC A, @R0

36H

/

1

2


                            图4 8051-Core软件仿真图

5 结束语

嵌入式微处理器具有广泛的应用前景,特别是随着信息技术的发展,信息安全性和可靠性正逐步受到人们的重视。在FPGA的可用门和性能对高档功能的支持中,IP核的价值正在充分展现。IP核已成为有效地进行大规模设计和缩短设计时间的基础。因此,积极开发具有自主知识产权的IP模块,在SoC领域占有一席之地,即符合我国国情,有具有重要意义。本课题设计出的MSC-51系列单片机IP核不仅通过了软件仿真,而且其功能已经通过了硬件测试,所以其不仅是一个成熟的软IP核,也是一个成熟的硬IP核。

本项目经济效益:本IP核主要应用于SoC中,向相关有偿机构购买类似IP核一次的使用价格在3美元左右,但是附带开发工具在300美元左右,本IP核完全利用免费版本的MAX+plusⅡ进行设计以及后期使用,因此若本IP核应用3000次,那么项目的经济效益在8万元左右。

本文作者创新点:本次要设计的兼容MCS-51单片机IP核有以下特色:1.完全同步的设计,系统在统一的时钟下工作。2.指令集与工业标准的MCS-51系列单片机完全兼容。3.指令周期较原MCS-51系列大幅提高,所有指令都可在1到4个时钟周期内完成,时钟周期只与所选用的FPGA/CPLD芯片的延时有关,而与设计无关。4.没有复用的I/O口。5.IP核升级方便,对于不需要的部件可以任意裁减。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向