数字电压表设计课程设计.docx
《数字电压表设计课程设计.docx》由会员分享,可在线阅读,更多相关《数字电压表设计课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
数字电压表设计课程设计
东北石油大学
课程设计
课程硬件课程设计
题目数字电压表设计
院系计算机与信息技术学院
专业班级计
学生姓名
学生学号
指导教师
2
东北石油大学课程设计任务书
课程硬件课程设计
题目数字电压表设计
专业
主要内容、基本要求等
一、主要内容:
利用EL教学实验箱、微机和QuartusⅡ软件系统,使用VHDL语言输入方法设计数字钟。
可以利用层次设计方法和VHDL语言,完成硬件设计设计和仿真。
最后在EL教学实验箱中实现。
二、基本要求:
1、A/D转换接口电路的设计,负责对ADC0809的控制。
2、编码转换电路设计,负责把从ADC0809数据总线中读出的电压转换成BCD码。
3、输出七段显示电路的设计,负责将BCD码用7段显示器显示出来。
三、参考文献
[1]潘松.EDA技术实用教程[M].北京:
科学出版社,2003.11-13.
[2]包明.《EDA技术与数字系统设计》.北京航天航空大学出版社.2002.
[3]EDA先锋工作室.AlteraFPGA/CPLD设计[M].北京:
人民邮电出版社2005.32-33.
[4]潘松.SOPC技术实用教程[M].清华大学出版社.2005.1-15.
完成期限第18-19周
指导教师
专业负责人
摘要
本文介绍了基于EDA技术的8位数字电压表。
系统采用CPLD为控制核心,采用VHDL语言实现,论述了基于VHDL语言和CPLD芯片的数字系统设计思想和实现过程。
在硬件电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,而VHDL语言则是EDA的关键技术之一,。
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,它采用自顶向下的设计方法,即从系统总体要求出发,自上至下地将设计任务分解为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。
电子设计自动化技术EDA的发展给电子系统的设计带来了革命性的变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件(PLD)使得EDA技术的应用走向普及。
CPLD是新型的可编程逻辑器件,采用CPLD进行产品开发可以灵活地进行模块配置,大大缩短了产品开发周期,也有利于产品向小型化,集成化的方向发展。
而VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,完成系统的整体设计。
本文用CPLD芯片和VHDL语言设计了一个八位的数字电压表。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外还具有校时功能和闹钟功能。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。
关键词:
数字电压表;QuartusⅡ软件;EDA(电子设计自动化)
目录
第1章概述1
1.1EDA的概念1
1.2EDA技术及应用2
1.3EDA硬件工作平台2
1.4EDA的软件工作平台2
第2章数字电压表的设计实现3
2.1状态机3
2.2状态机的设计3
2.3BCD码的转换5
2.4七段电路显示7
第3章数字电压表的测试与运行10
3.1数字电压表的编译与仿真10
3.2数字电压表的仿真与烧写12
结论15
参考文献16
第1章概述
1.1EDA的概念
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写。
由于它是一门刚刚发展起来的新技术,涉及面广,内容丰富,理解各异,所以目前尚无一个确切的定义[1]。
但从EDA技术的几个主要方面的内容来看,可以理解为:
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计电子系统到硬件系统的一门新技术。
可以实现逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化,逻辑布局布线、逻辑仿真[2]。
EDA技术是伴随着计算机、集成电路、电子系统的设计发展起来的,至今已有30多年的历程。
大致可以分为三个发展阶段。
20世纪70年代的CAD(计算机辅助设计)阶段:
这一阶段的主要特征是利用计算机辅助进行电路原理图编辑,PCB不同布线,使得设计师从传统高度重复繁杂的绘图劳动中解脱出来。
[3]20世纪80年代的QAE(计算机辅助工程设计)阶段:
这一阶段的主要特征是以逻辑摸拟、定时分析、故障仿真、自动布局布线为核心,重点解决电路设计的功能检测等问题,使设计能在产品制作之前预知产品的功能与性能[4]。
20世纪90年代是EDA(电子设计自动化)阶段:
这一阶段的主要特征是以高级描述语言,系统级仿真和综合技术为特点,采用“自顶向下”的设计理念,将设计前期的许多高层次设计由EDA工具来完成。
EDA是电子技术设计自动化,也就是能够帮助人们设计电子电路或系统的软件工具。
该工具可以在电子产品的各个设计阶段发挥作用,使设计更复杂的电路和系统成为可能。
在原理图设计阶段,可以使用EDA中的仿真工具论证设计的正确性;在芯片设计阶段,可以使用EDA中的芯片设计工具设计制作芯片的版图;在电路板设计阶段,可以使用EDA中电路板设计工具设计多层电路板。
特别是支持硬件描述语言的EDA工具的出现,使复杂数字系统设计自动化成为可能,只要用硬件描述语言将数字系统的行为描述正确,就可以进行该数字系统的芯片设计与制造[5]。
21世纪将是EDA技术的高速发展期,EDA技术将是对21世纪产生重大影响的十大技术之一。
硬件描述语言:
硬件描述语言(HDL)是一种用于进行电子系统硬件设计的计算机高级语言,它采用软件的设计方法来描述电子系统的逻辑功能、电路结构和连接形式。
常用硬件描述语言有HDL、Verilog和VHDL语言。
1.2EDA技术及应用
电子EDA技术发展迅猛,逐渐在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。
在教学方面:
几乎所有理工科(特别是电子信息)类的高校都开设了EDA课程。
主要是让学生了解EDA的基本原理和基本概念、硬件描述系统逻辑的方法、使用EDA工具进行电子电路课程的模拟仿真实验并在作毕业设计时从事简单电子系统的设计,为今后工作打下基础。
[6]具有代表性的是全国每两年举办一次的大学生电子设计竞赛活动。
在科研方面:
主要利用电路仿真工具进行电路设计与仿真;利用虚拟仪器进行产品调试;将FPGA器件的开发应用到仪器设备中[7]。
在产品设计与制造方面:
从高性能的微处理器、数字信号处理器一直到彩电、音响和电子玩具电路等,EDA技术不单是应用于前期的计算机模拟仿真、产品调试,而且也在后期的制作、电子设备的研制与生产、电路板的焊接、器件的制作过程等有重要作用[8]。
可以说电子EDA技术已经成为电子工业领域不可缺少的技术支持。
1.3EDA硬件工作平台
1.计算机
2.EDA实验开发系统:
EL教学实验箱。
1.4EDA的软件工作平台
PLD(ProgrammableLogicDevice)是一种由用户根据需要而自行构造逻辑功能的数字集成电路。
目前主要有两大类型:
CPLD(ComplexPLD)和FPGA(FieldProgrammableGateArray)[9]。
它们的基本设计方法是借助于EDA软件,用原理图、状态机、布尔表达式、硬件描述语言等方法,生成相应的目标文件,最后用编程器或下载电缆,由目标器件实现[10]。
生产PLD的厂家很多,但最有代表性的PLD厂家为Altera、Xilinx和Lattice公司。
第2章数字电压表的设计实现
2.1状态机
用状态机对ADC0809进行采样控制首先必须了解其工作时序,然后据此作出状态图,最后写出相应的VHDL代码。
ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。
ADC0809的分辨率为8位,转换时间约100μs,输出由三态缓冲器控制,单5V电源供电。
如图2-1所示:
图2-1ADC0809接口电路原理图
2.2状态机的设计
状态机就是控制ADC0809转换过程的控制器。
根据ADC0809的工作时序,就可以设计出状态机。
该组状态机由以下几个部分组成,其VHDL语言描述如下。
P1:
process(present_state,next_state,INT)
begin
casepresent_stateis
whenidle=>CS<='1';WR<='1';RD<='1';
next_state<=write;
whenwrite=>CS<='1';WR<='0';RD<='1';
next_state<=swait;
whenswait=>CS<='1';WR<='1';RD<='1';
if(INT='0')then
next_state<=read;
else
next_state<=swait;
endif;
whenread=>CS<='1';WR<='1';RD<='0';
next_state<=disp1;
whendisp1=>CS<='1';WR<='1';RD<='1';
DATOUT<=dout1;
next_state<=disp2;
whendisp2=>CS<='1';WR<='1';RD<='1';
DATOUT<=dout2;
next_state<=disp3;
whendisp3=>CS<='1';WR<='1';RD<='1';
DATOUT<=dout3;
next_state<=disp4;
whendisp4=>CS<='1';WR<='1';RD<='1';
DATOUT<=dout4;
next_state<=write;
endcase;
endprocessP1;
当CS<='1';WR<='0';RD<='0'时,ADC0809被设为空位,由控制器发出信号要求ADC0809开始进行模/数信号的转换。
当CS<='1';WR<='1';RD<='0'时,往ADC0809里写数据ADC0809进行转换动作,转换完毕后INT将低电位。
当CS<='0';WR<='0';RD<='0'时,如果此时INT=1,说明转换结束,由控制器发出信号以读取ADC0809的转换资料,如果此时INT=0,说明转换没结束,继续转换。
当CS<='1';WR<='0';RD<='1'时,由控制器读取数据总线上的数字转换资料。
当接下来的几个状态(disp1,disp2,disp3,disp4)是控制输出的。
begin
if(RESET='0')then
present_state<=idle;
datain<="00000000";
elsif(CLK'eventandCLK='1')then
present_state<=next_state;
if(present_state=read)then
datain<=D;
endif;
endif;
endprocessP2;
进程2是时序进程,当RESET='0'时,datain<="00000000"(数据信号转化为模拟信号)当时钟上升沿一来时,如果此时present_state=read,说明转换结束,datain<=D(数据信号转化为模拟信号)。
2.3BCD码的转换
其中表2-1为把数据转化为BCD码,模拟输入电压与输出电压的对应关系。
表2-1数据转化为BCD码
进制
参考电压
16
2
高4位电压
低4位电压
0
0000
0.00
0.00
1
0001
0.32
0.02
2
0010
0.64
0.04
3
0011
0.96
0.06
4
0100
1.28
0.08
5
0101
1.60
0.10
6
0110
1.92
0.12
7
0111
2.24
0.14
8
1000
2.56
0.16
9
1001
2.88
0.18
A
1010
3.20
0.20
B
1011
3.52
0.22
C
1100
3.84
0.24
D
1101
4.16
0.26
E
1110
4.48
0.28
F
1111
4.80
0.30
这样由ADC0809收到的信号是01110110(76H),则对照表时,高4位0111的电压为2.24V,而低4位0110是0.12V,所以最后的电压输出结果为2.24+0.12=2.36V。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYBCDIS
PORT(V:
INSTD_LOGIC_VECTOR(7DOWNTO0);
HB,LB:
BUFFERSTD_LOGIC_VECTOR(11DOWNTO0);
BVALUE:
BUFFERSTD_LOGIC_VECTOR(11DOWNTO0);
BCD_L,BCD_M,BCD_H:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDBCD;
ARCHITECTUREAOFBCDIS
BEGIN
P1:
PROCESS(V(7DOWNTO4))
BEGIN--A/D输出高4位转换分辨率0.32V
IFV(7DOWNTO4)="1111"THENHB<="010010000000";--4.80V
ELSIFV(7DOWNTO4)="1110"THENHB<="010001001000";--4.48V
ELSIFV(7DOWNTO4)="1101"THENHB<="010000010110";--4.16V
ELSIFV(7DOWNTO4)="1100"THENHB<="001110000100";--3.84V
ELSIFV(7DOWNTO4)="1011"THENHB<="001101010010";--3.52V
ELSIFV(7DOWNTO4)="1010"THENHB<="001100100000";--3.20V
ELSIFV(7DOWNTO4)="1001"THENHB<="001010001000";--2.88V
ELSIFV(7DOWNTO4)="1000"THENHB<="001001010110";--2.56V
ELSIFV(7DOWNTO4)="0111"THENHB<="001000100100";--2.24V
ELSIFV(7DOWNTO4)="0110"THENHB<="000110010010";--1.92V
ELSIFV(7DOWNTO4)="0101"THENHB<="000101100000";--1.60V
ELSIFV(7DOWNTO4)="0100"THENHB<="000100101000";--1.28V
ELSIFV(7DOWNTO4)="0011"THENHB<="000010010110";--0.96V
ELSIFV(7DOWNTO4)="0010"THENHB<="000001100100";--0.64V
ELSIFV(7DOWNTO4)="0001"THENHB<="000000110010";--0.32V
ELSIFV(7DOWNTO4)="0000"THENHB<="000000000000";--0.00V
ELSEHB<="000000000000";--0.00V
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(V(3DOWNTO0))
BEGIN--A/D输出低4位转换分辨率0.02V
IFV(3DOWNTO0)="1111"THENLB<="000000110000";--0.30V
ELSIFV(3DOWNTO0)="1110"THENLB<="000000101000";--0.28V
ELSIFV(3DOWNTO0)="1101"THENLB<="000000100110";--0.26V
ELSIFV(3DOWNTO0)="1100"THENLB<="000000100100";--0.24V
ELSIFV(3DOWNTO0)="1011"THENLB<="000000100010";--0.22V
ELSIFV(3DOWNTO0)="1010"THENLB<="000000100000";--0.20V
ELSIFV(3DOWNTO0)="1001"THENLB<="000000011000";--0.18V
ELSIFV(3DOWNTO0)="1000"THENLB<="000000010110";--0.16V
ELSIFV(3DOWNTO0)="0111"THENLB<="000000010100";--0.14V
ELSIFV(3DOWNTO0)="0110"THENLB<="000000010010";--0.12V
ELSIFV(3DOWNTO0)="0101"THENLB<="000000010000";--0.10V
ELSIFV(3DOWNTO0)="0100"THENLB<="000000001000";--0.08V
ELSIFV(3DOWNTO0)="0011"THENLB<="000000000110";--0.06V
ELSIFV(3DOWNTO0)="0010"THENLB<="000000000100";--0.04V
ELSIFV(3DOWNTO0)="0001"THENLB<="000000000010";--0.02V
ELSIFV(3DOWNTO0)="0000"THENLB<="000000000000";--0.00V
ELSELB<="000000000000";--0V
ENDIF;
ENDPROCESSP2;
BVALUE<=HB+LB;
P3:
PROCESS(BVALUE)
VARIABLEJJ:
STD_LOGIC_VECTOR(11DOWNTO0);
BEGIN
JJ:
=BVALUE;
IF(JJ(3DOWNTO0)>"1001")THEN――如果12位结果中,低4位
JJ:
=JJ+"000000000110";――大于9则低4位加6
ENDIF;
IF(JJ(7DOWNTO4)>"1001")THEN――如果中间的4位大于9
JJ:
=JJ+"000001100000";――则中4位加6
ENDIF;
BCD_L<=JJ(3DOWNTO0);
BCD_M<=JJ(7DOWNTO4);
BCD_H<=JJ(11DOWNTO8);
ENDPROCESSP3;
ENDA;
2.4七段电路显示
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitymux3_1is
port(sel:
instd_logic_vector(1downto0);
A,B,C:
instd_logic_vector(3downto0);
Mselout:
outstd_logic_vector(3downto0));
endmux3_1;
architectureaofmux3_1is
begin
process(sel)
begin
ifsel="10"thenMselout<=A;
elsifsel="01"thenMselout<=B;
elsifsel="00"thenMselout<=C;
elsenull;
endif;
endprocess;
enda;
――位选信号产生器(3进制计数器)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityc3is
port(clk,clr:
instd_logic;
qout:
bufferstd_logic_vector(1downto0)
);
endc3;
architecturebehaveofc3is
begin
process(clk,clr)
begin
if(clr='0')thenqout<="00";
elsif(clk'eventandclk='1')then
qout<=qout+1;
if(qout=2)thenqout<="00";
endif;
endif;
endprocess;
endbehave;
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYdel7IS
PORT
(input:
INSTD_LOGIC_vector(3downto0);
output:
OUTSTD_LOGIC_vector(6downto0)
);
ENDdel7;
ARCHITECTUREaOFdel7IS
BEGIN
PROCESS(input)
BEGIN
CASEinputIS
WHEN"0000"=>output<="1111110";
WHEN"0001"=>output<="0110000";
WHEN"0010"=>output<="1101101";
WHEN"0011"=>output<="1111001";
WHEN"0100"=>output<="0110011";
WHEN"0101"=>output<="1011011";
WHEN"0110"=>output<="1011111";
WHEN"0111"=>output<="1110000";
WHEN"1000"=>