基于VHDL的单片机设计.docx
- 文档编号:10135522
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:51
- 大小:252.59KB
基于VHDL的单片机设计.docx
《基于VHDL的单片机设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的单片机设计.docx(51页珍藏版)》请在冰豆网上搜索。
基于VHDL的单片机设计
基于VHDL的单片机设计
学生:
丁洁指导老师:
陈沅涛
摘要:
本文首先对MCS8051单片机的原理进行介绍和分析;接着介绍使用EDA技术,用VHDL语言完成了8051单片机的设计工作;MCS8051单片机的CPU和数模转换器的设计运用了算术逻辑单元ALU算术运算的算法实现和控制单元的状态机;以及数模转换器的∑-△调制方法的实现。
通过如上的算法实现,可以看出VHDL语言在算法级的设计上具有很多的优势和特点。
使用EDA技术设计的结果既可以用FPGA/CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。
关键词:
电子设计自动化(EDA)、VHDL语言、FPGA/CPLD、8051单片机
1引言
伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,己经广泛应用于模拟与数字电路系统等许多领域。
电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术、微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。
EDA技术的发展始干70年代,至今经历了三个阶段。
电子线路的CAD(计算机辅助设计)是EDA发展的初级阶段,80年代初期,形成了CAE(计算机辅助工程)。
也就是所谓的EDA技术中级阶段。
90年代出现了以自动综合器和硬件描述语言为基础,全面支持电子设计自动化ESDA(电子系统设计自动化),即高级EDA阶段、也就是目前常说的EDA[1]。
使用EDA技术设计的结果既可以用FPGA/CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。
EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,诞生于1982年的VHDL语言是经IEEE确认的标准硬件描述语言,在电子设计领域受到了广泛的接受。
1.1课题的背景、目的
进入90年代,电子信息类产品的开发明显地出现了两个特点:
一是开发产品的复杂程度加深;二是开发产品的上市时限紧迫。
而伴随着如上两个特点的产生,相应的出现了设计上的两个问题。
其一,在电子系统日趋数字化、复杂化和大规模集成化的今天,电子厂商们越加迫切地追求电子产品的高功能、优品质、低成本、微功耗和微小封装尺寸,从而使得电子设计日趋复杂。
那么如何去完成这些高复杂度的电子设计呢?
其二,电子产品设计周期短和上市快是电子厂商们坚持不懈的追求,那么面对日趋复杂的设计,又如何能够缩短开发时间呢?
解决以上两个问题的唯一途径是电子设计自动化(EDA),即用计算机帮助设计人员完成繁琐的设计工作。
1.2课程设计的内容
(1)单片机的基本原理和内部结构。
从单片机的内部结构入手,对单片机的基本原理和功能进行介绍和分析,进而提出可改进之处。
(2)EDA的开发中离不开EDA工具的使用,好的开发工具会使设计更加便捷与高效,且会提高设计的效率与效果。
(3)本文重点介绍了基于FPGA和VHDL语言的开发过程,对设计方案中的各模块进行详细介绍和验证,并对整体性能进行分析。
2EDA、VHDL简介
2.1EDA简介
电子设计自动化(EDA,ElectronicDesignAutomation)是指利用计算机完成电子系统的设计[2]。
EDA技术是以计算机和微电子技术为先导,汇集了计算机图形学、拓扑、逻辑学、微电子工艺与结构学和计算数学等多种计算机应用学科最新成果的先进技术。
EDA技术以计算机为工具,代替人完成数字系统的逻辑综合、布局布线和设计仿真等工作。
设计人员只需要完成对系统功能的描述,就可以由计算机软件进行处理,得到设计结果,而且修改设计如同修改软件一样方便,可以极大地提高设计效率。
根据电子设计技术的发展特征,EDA技术发展大致分为三个阶段:
(1)CAD阶段(20世纪60年代中期—20世纪80年代初期)
(2)CAE阶段(20世纪80年代初期—20世纪90年代初期)(3)EDA阶段(20世纪90年代以来)。
2.2VHDL简介
VHDL英文名是Very-High-SpeedIntegratedCircuitHardwareLanguage,诞生于1982年。
1987年底被IEEE(TheInstituteofElectricalandElectronics
Engineers)和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL和Verilog语言将承担起几乎全部的数字系统设计任务。
由于本设计主要使用VHDL语言,故只对VHDL语言的特点进行简要的介绍。
应用VHDL进行工程设计的优点是多方面的,具体如下:
1.与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
2.VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能。
VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有利的支持。
3.对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把VHDL描述设计转变成门级网表(根据不同的实现芯片)。
这种方式突破了门级设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。
应用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更小、更高速的电路系统。
4.可以进行与工艺无关编程。
VHDL语言设计系统硬件时,没有嵌入描述与工艺相关的信息,不会因为工艺变化而使描述过时,与工艺技术有关的参数可通过VHDL提供的类属加以描述。
5.方便ASIC移植。
当产品达到相当数量时,采用VHLD进行的设计可以很容易转成用专用集成电路(ASIC)来实现,甚至用于PLD的源代码可以直接用于ASIC。
3基于VHDL语言的单片机设计过程
3.1系统设计模块划分方案
对8051单片机的设计分成五个模块来实现8051系统。
这五个模块为:
CPU模块、计数器/定时器模块、UART串口模块、存储器模块和DAC模块。
其中DAC为传统8051所不具备的功能模块。
其中,CPU模块又分为控制单元模块和ALU单元模块,且每一个模块又分为几个模块。
中断系统模块并未使用单独的设计模块存在的形式来设计,而是与CPU的设计整合为一体,因为这样会使得设计达到更好的效果,更符合VHDL语言的使用规范和提高设计效率。
这样的划分只是为了更好的实现CPU模块的功能,又能方便设计的进行,不至于在设计过程中引起逻辑上的混乱。
存储器模块又分为RAM模块、ROM模块和FIFO模块。
对于FPGA来说,使用它来实现存储器模块有很多方法,可以直接利用其内部内嵌的RAM模块,也可以利用VHDL语言直接编写。
本文的设计中RAM和ROM的设计直接利用了Altera公司提供的单元库和FPGA中的RAM单元,这样可时设计简化,缩短开发时间。
而FIFO的设计采用的是使用VHDL语言直接编写[3]。
这些方法的应用体现出了使用FPGA进行设计的灵活性和时效性。
传统的8051中没有FIFO模块的存在,而本文的设计中考虑到如今器件的速度越来越快,数据的传输通过FIFO来缓存是很通行的做法,故在本设计中加入FIFO模块的设计。
计数器/定时器模块、UART串口模块的设计均在一个模块内完成。
计数器/定时器和UART串口模块的设计遵从了8051单片机的设计标准,使用VHDL语言完全实现了相应的功能。
而且各个模块均可独立使用,可单独作为一个IP核存在,其它的设计模块也可单独使用,所以利用FPGA和VHDL语言所做的设计具有很好的通用性。
DAC模块的设计是一种新增功能。
在本设计中增加了此模块的设计,主要是考虑增加8051的功能,以及为系统设计提供方便性。
同时,也体现出硬件设计的一种发展方向,即系统集成化。
也为以后的设计工作提供一种借鉴方式。
3.2各模块原理及程序
3.2.1CPU模块
图3-1为CPU整体框图。
由图可知,CPU由两个模块组成,alu模块和control模块。
下面对两个模块进行论述。
◆ALU单元的VHDL语言实现
ALU单元可以直接或间接的执行很多指令,如加、减、乘、除等算术运算指令;逻辑与、或、异或等逻辑运算指令以及移位操作指令。
这些指令是8051单片机的核心指令,分为算术运算、逻辑运算和环移指令等三大类。
本设计中由ALU单元执行的指令共53条,除去上述的算术运算、逻辑运算和环移指令外,还包括条件转移指令中的比较条件转移指令CJNE和减1条件转移指令DJNZ。
图3-1CPU整体框图
这种设计方法主要考虑比较条件转移指令CJNE设计上的方便与规范性;而减1条件转移指令DJNZ的指令操作需要进行减1操作,正好可以利用ALU单元的相应算术运算来进行,因此可通过ALU单元来间接的运行实现。
此类条件转移指令共6条,是由ALU单元间接实现的;其余的47条指令则由ALU单元直接实现,这47条指令包括算术逻辑运算指令、逻辑运算指令和环移指令。
ALU单元要control单元配合起来工作才可正常运行,即需由control单元提供控制信号和数据给ALU单元。
◆控制单元的VHDL语言实现
控制单元起着控制器的作用,单片机程序和原始数据的输入、CPU内部的信息处理、处理结果的输出、外部设备与单片机之间的信息交换等,都是在控制单元的控制下实现的。
本设计中控制单元主要完成的功能为指令译码、中断判优及处理、时序控制和微操作控制等。
图3-2控制单元整体框图
由图3-2可知,控制单元由两个:
control_fsm模块和control_mem模块,其主要的设计方法为有限状态机的设计,通过状态的转换而产生相应的微操作信号,进而实现相应的指令的执行[4]。
其中,control_fsm模块主要实现中断的响应及111条指令的译码并产生各指令的微操作码,主要是通过有限状态机的设计来实现相应的功能;而control_mem模块主要完成由control_fsm模块产生的微操作信号的具体操作过程,控制RAM存储器的读写地址及数据传输、PC寄存器的赋值、串口与定时器的中断信号处理、中断的查询、特殊寄存器的读写等功能。
其VHDL语言实现代码如下:
whenIC_ADD_A_RR=>--ADDA,Rr
ifstate=FETCHthen
s_adr_mux<="0110";--确定Rr的地址
s_nextstate<=EXEC1;--转至EXEC1状态执行
elsifstate=EXEC1then
alu_cmd_o<=ADD_ACC_RAM;--通知ALU单元执行加法操作
s_data_mux<="0011";--ALU单元操作数值操作
s_regs_wr_en<="011";--对累加器及相应状态位进行操作
s_pc_inc_en<="0001";--对PC寄存器进行操作
s_nextstate<=FETCH;--返回FETCH状态,等待下一条指令的执行
endif;
本指令为单字节双时钟周期指令,寻址方式为寄存器寻址。
当从指令存储器中取出的指令代码与程序中代码IC_ADD_A_RR相对应时,即执行本段代码程序。
执行过程如下,在FETCH状态时,确定是寄存器寻址方式(由control_fsm模块完成),然后转到相应的寄存器寻址方式处理段代码进行寄存器地址的确定(由control_mem模块完成),为寄存器内数据的取出做准备;然后是状态转移到EXEC1进行操作。
当进入EXEC1状态后进行如下操作,通知ALU单元进行加法操作,操作数为ACC和相应的RAM单元;提供ALU单元所需的运算数据,使ALU单元进行运算;把操作结果写入ACC,并对标志位CY,OV,AC置位;使程序计数器PC加1;使状态机返回到FETCH状态,等待下一条指令的执行。
至此本条指令运行结束。
3.2.1计数器/定时器模块
定时器/计数器是16位的定时器/计数器,本设计中有两个这样的定时器/计数器,这也是8051本身所具有的特征。
对这两个定时器/计数器的控制主要是通过TCON和TMOD两个特殊功能寄存器实现的。
图3-3、图3-4列出了这两个寄存器的控制位。
图3-3定时器控制寄存器TCON各位定义
由图3-3和3-4可知,定时器/计数器的工作状态和工作模式,主要由TCON和TMOD两个特殊寄存器的状态位来控制。
而这些控制位的信号是通过CPU来控制和加载的,CPU通过传递给特殊寄存器相应的值进而控制定时器/计数器的操作。
而定时器/计数器又有两种工作模式,即定时器模式和计数器模式,在每种模式2、3。
表3.1列出了它们在四种工作方式下的不同功能。
图3-4定时器方式控制寄存器TMOD格式
表3.1定时器/计数器工作方式
3.2.1UART串口模块
UART串口是全双工通用异步接收/发送器,可用于串行通信。
有两个数据缓冲器(SBUF),一个用作发送,另一个用作接收。
这两个数据缓冲器物理上各自独立,通用一个地址99H,发送缓冲器只写不读,接收缓冲器只读不写。
其中接收缓冲器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时响应接收器中断,没有把上一帧数据读走而产生两帧数据重叠问题。
图3-5串口控制寄存器SCON中各位的定义
图3-6串口波特率寄存器PCON中各位的定义
串口的控制是通过控制寄存器SCON和PCON来实现的,图3-5、图3-6列出了以上两寄存器的各控制位。
其中,图3-5中SM0与SM1为串行口方式控制位,用于设定串行口的工作方式,如表3.2所示。
而图3-6中PCON的8位控制位中只使用了最高位来控制串口波特率的选择。
而在8051单片机中还使用了低4位,其功能主要是控制单片机的空闲与掉电工作方式。
表3.2串行口工作方式表
3.2.1存储器模块
RAM存储器可以用来存储实时数据、中间结果、最终结果或作为程序的堆栈区使用。
从有关8051存储器的相关内容可知,8051内部有128个字节的RAM,且可外接RAM。
所以本设计中设计了128个字节的片内RAM和64K的片外RAM。
其中片内128个字节的RAM是与CPU模块做到一片FPGA中的,而片外64KRAM是通过FPGA的接口与整个设计连接在一起的,当然64KRAM也可以放到片内,这可以由使用时的环境和FPGA容量的大小来决定。
图3-7RAM单元外形框图
图3-7是RAM单元外形框图。
它采用Altera公司提供的存储器模块来设计,即直接从库中调用该元件,在VHDL语言中进行例化来使用。
这也是Altera公司推荐的存储器设计方法。
主要可以缩短开发时间,且增加可靠性[5]。
3.2.1DAC模块
D/A转换器(DigitaltoAnalogConverter)是一种能把数字量转换成模拟量的电子器件。
在单片机控制系统中,经常需要用到D/A转换器,在架设单片机和被控实体之间的桥梁时,D/A转换器占有极为重要的地位。
而在以往的应用中,单片机与D/A转换器是以分立元件的形式存在的。
图3-8DAC外形框图
随着科技的发展,SoC已经成为一种发展趋势,所以本文在这方面也做了研究,把单片机与D/A转换器用同一片FPGA来实现。
实现的框图如图3-8所示。
图中所示是本DAC设计的原理框图,输入端包括时钟信号clk、复位信号reset,高电平有效、DAC工作控制信号cont,DAC的工作使能控制端和8位数据输入dacin。
由于DAC是通过FPGA来实现的,而FPGA只能做数字设计,所以本设计中模拟输出的实现还需要增加外部电路,而外部电路只需要由一个电阻和一个电容组成的低通滤波器即可实现相应的功能。
低通滤波器由FPGA的输出dacout来驱动,Vout的取值可以从0V到Vcco,其中Vcco的值由FPGA的端口电压来决定。
4模块功能验证
4.1CPU模块的功能验证
把ALU单元和控制单元整合为一体即成为了CPU模块。
CPU模块是本设计的核心内容,也是整个单片机的核心部分。
由于单片机的指令较多,不能一一列
出验证结果,故在此以简单的程序来进行验证。
程序代码如下:
MOVA,#00H;寄存器A中存入立即数00H
ANLA,#80H;寄存器A中的值与立即数80H进行与操作
MOVP0,A;寄存器A中的值从P0口输出
验证结果波形图如图4-1所示:
图4-1验证波形图
从4-1图可知,P0口输出值为0,与期望输出值相同,可见达到了预期的设计目的,实现了指令的功能。
4.2UART模块的功能验证
工作方式0功能验证:
方式0为寄存器输入/输出方式,Rxdwr_o为数据传输标志位,数据开始传输时为1,传输完毕为0。
Txd_o传输同步脉冲,传输8个脉冲后ti和ri置1,表示一帧传输完毕,可以申请中断。
图4-2串口方式0波形图
从图4-2中波形可看出实现了数据串行传送的功能,达到了设计要求。
结束语
通过本系统的开发有如下体会:
对于一个系统的开发,最初的模块划分是非常重要的。
随着系统的复杂度的增大,模块划分对系统的后续开发显示出越来越大的重要性。
致谢
在这次课程设计过程中,非常感谢陈沅涛老师的指导,在陈老师身上学到的不仅仅是知识的层面,更重要的是他追求知识的热情和本身严谨的工作态度。
他的工作作风以及对生活的态度同样让我受益匪浅。
参考文献
1.褚振勇,翁木云.FPGA设计及应用.西安电子科技大学出版社.2000.3
2.黄正谨,徐坚,章小丽等.CPLD系统设计机输入门与应用[J].电子
2002.3
3.张洪润,蓝清华.单片机应用技术教程[M].清华大学出版社.1999.9
4.胡汉才.单片机原理及其接口技术[M].清华大学出版社.2000.3
5.I.ScottMackenzie.The8051Microcontroller.MicroelectronicsJournal,Volume30,Issue8,August1999
附录:
基于VHDL语言单片机设计部分程序代码
--------------------------------------------------------
------------------------------------------
--Timer/CounterModule
--------------------------------------------------------
------------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytimeris
port
(clk,reset:
instd_logic;
tr0,tr1:
instd_logic;--tcon(4),tcon(6)
Tmod:
instd_logic_vector(7downto0);--registerTMOD
load_i:
instd_logic_vector(7downto0);
int0,int1:
instd_logic;--专门功能中断
t0,t1:
instd_logic;--外部事件脉冲输入
Ec:
instd_logic_vector(1downto0);--TH,TL赋值使能端
ec_e:
instd_logic;
th0,tl0:
outstd_logic_vector(7downto0);--register
TH0,TL0
th1,tl1:
outstd_logic_vector(7downto0);--register
TH1,TL1
tf1,tf0:
outstd_logic);--溢出中断标志
endtimer;
architecturebevoftimeris
signalqa,qb:
unsigned(15downto0);--计数存储器
signalcountl0,counth0:
unsigned(7downto0);
signalcountl1,counth1:
unsigned(7downto0);
signalgate0,gate1:
std_logic;--门控位tmod(7),tmod(3)
signalc0,c1:
std_logic;--tmod(6),tmod
(2)
signaltf0_o,tf1_o:
std_logic;--tf0,tf1输出存储器
signalm:
unsigned(1downto0);--timer/counter0工作方式选择
signaln:
unsigned(1downto0);--timer/counter1工作方式选择
signaltr00,tr11:
std_logic;--计数器使能
signalt0_v,t1_v:
std_logic;--t0,t1下降沿微分两次采样存储器
signalq0,q1,q2,q3:
std_logic;--t0,t1sampling
begin
a:
block
begin
gate0<=tmod(3);
c0<=tmod
(2);
m
(1)<=tmod
(1);
m(0)<=tmod(0);
gate1<=tmod(7);
c1<=tmod(6);
n
(1)<=tmod(5);
n(0)<=tmod(4);
tr00<=tr0and((notgate0)orint0);
tr11<=tr1and((notgate1)orint1);
tf0<=tf0_o;
tf1<=tf1_o;
th0<=std_logic_vector(qa(15downto8));
tl0<=std_logic_vector(qa(7downto0));
th1<=std_logic_vector(qb(15downto8));
tl1<=std_logic_vector(qb(7downto0));
endblocka;
b:
block
begin
t0_v<='1'when(q1<='1'andq0<='0')else'0';
process(clk,reset)
begin
freset='1'then
q0<='0';
q1<='0';
elseifclk'eventandclk='1'then
ifc0='1'then
q0<=t0;
q1<=q0;
endif;
endif;
endif;
endprocess;
t1_v<='1'w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 单片机 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)