资源描述
电子课程设计
—数字电压表的设计
学院:xx学院
专业、班级:电子092203
姓名:xx
学号:xxxxxx
指导老师:xx
2011年12月25日
目录
目录……………………………………………………1
一、前言………………………………………………2
二、设计任务与要求……………………………………6
三、总体框图……………………………………………6
四、选择器件……………………………………………8
五、模块功能…………………………………………11
六、总体设计电路图…………………………………20
七、总结
1,心得……………………………………………22
2,展望……………………………………………22
3,致谢……………………………………………23
八,参考文献…………………………………………23
一、前言
课题研究的背景
随着信息技术获得了突飞猛进的发展,信息技术渗透了我们生活的几乎全部领域,改变着人类的生存状态和思维模式。而我们的课题所涉及的电子设计自动化(EDA)技术就是在这种时代背景下产生的,并影响巨大。FPGA是新型的可编程逻辑器件,与传统 ASIC 相比,具有设计开发周期短、设计制造成本低、开发工具先进 等优点,特别适合于产品的样品开发和小批量生产。传统的数字电压表多以单片机为控制核心,芯片集成度不高,系统连线复杂,难以小型化,尤其在产品需求发生变化时,不得不重新布版、调试,增加了投资风险和成本。而采用 FPGA 进行产品开发,可以灵活地进行模块配置,大大缩短了开发周期,也有利于数字电压表向小型化、集成化的方向发展。 随着电子技术的发展,当前数字电子系统的设计正朝着速度快、容量大、体积小、重量轻的方向发展。推动该潮流发展的引擎就是日趋进步和完善的ASIC设计技术。目前数字系统的设计可以直接面向用户需求,根据系统的行为和功能的要求,自上而下的完成相应的描述、综合、优化、仿真与验证,直接生成器件。上述设计过程除了系统行为和功能描述以外,其余所有的设计几乎都可以用计算机来自动完成,也就说做到了电子设计自动化(EDA)这样做可以大大的缩短系统的设计周期,以适应当今品种多、批量小的电子市场的需求
伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,己经广泛应用于模拟与数子电路系统等许多领域。目前电子技术的发展主要体现在EDA领域,数字系统的设计正朝着速度快、容量大、体积小、重量轻的方向发展。电子设计自动化是近几年迅速发展起来的将计算机软件、硬件、微电子技术交叉运用的现代电子设计学科。其中EDA设计语言中的VHDL语言是一种快速的电路设计工具,功能涵盖了电路描述、电路合成、电路仿真等三大电路设计工作。本电压表的电路设计正是用VHDL语言完成的。此次设计主要应用的软件是美国ALTERA公司自行设计的Quartus II。
FPGA设计具有以下优点:
(1)硬件设计软件化
这是FPGA开发的最大优势。传统硬件电路设计先要进行功能设计,然后进行电路板级设计并做称电路板后进行调试,如果电路中有什么错误,整个电路板都将作废,这是很不经济的。FPGA的开发在功能层面上可以完全脱离硬件而在EDA软件上做软仿真。当功能确定无误后可以进行硬件电路板的设计。最后将设计好的,由EDA软件生成的烧写文件下载到配置设备中去,进行在线调试,如果这时的结果与要求不一致,可以立即更改设计软件,并再次烧写到配置芯片中而不必改动外接硬件电路。
(2)高度集成化,高工作频率
一般的FPGA内部都集成有上百万的逻辑门,可以在其内部规划出多个与传统小规模集成器件功能相当的模块。这样将多个传统器件集成在同一芯片内部的方法不但可以改进电路板的规模,还可以减少PCB布线的工作。由于各个模块都是集成在FPGA芯片内部,这就很大程度地解决了信号的干扰问题,使得FPGA的工作频率可以大幅度的提高。另外,一般的FPGA内部都有PLL倍频的时钟,这进一步解决了电磁干扰和电磁兼容问题。
(3)支持多种接口
FPGA芯片可支持多种标准的接口电平,可通过EDA开发工具来选定采用什么样的接口标准,包括常用的TTL和差分输入等。这便于后端各种不同接口电路的匹配。
FPGA设计流程
可编程逻辑器件的设计是利用EDA开发软件和编程土具对器件开发的过程。它包括设计准备、设计输入、功能仿真、设计处理、时序仿真和器件编程及测试等七个步骤。
1.设计准备
在系统设计之前,首先要进行方案论证、系统设计和器件选择等准备工作。
一般采用自上而下的设计方法,也可采用传统的自下而上的设计方法。
2.设计输入
设计输入将所设计的系统或电路以开发软件要求的某种形式表示出来,并送入计算机的过程称为设计输入。设计输入通常有以下集中形式:
1)原理图输入方式
2)硬件描述语言输入方式
3)波形输入方式
3.功能仿真
功能仿真也叫做前仿真。用户所设计的电路必须在编译之前进行逻辑功能验证,此时的仿真没有延时信息,对于初步的功能检测非常方便。仿真中如发现错误,则返回设计输入中修改逻辑设计。
4.设计处理
设计处理是器件设计中的核心环节。在设计处理过程中,编译软件将对设计输入文件进行逻辑化简、综合优化和适配,最后产生编程用的编程文件。主要有: 1) 语法检查和设计规则检查
2)逻辑优化和综合
3)适配和分割
4)布局和布线
5.时序仿真
时序仿真又称后仿真或延时仿真。由于不同器件的内部延时不一样,不同的布局布线方案也给延时造成不同的影响,因此在设计处理以后,对系统和各模块进行时序仿真,分析其时序关系,估计设计的性能,以及检查和消除竟争冒险等是非常有必要的。
6.器件编程测试
时序仿真完成后,软件就可产生供器件编程使用的数据文件。
VHDL语言描述
硬件描述语言(hardware description language,HDL)是电子系统硬件行为描述,结构描述,数据流描述的语言.目前,利用硬件描述语言可以进行数字电子系统的设计.随着研究的深入,利用硬件描述语言进行模拟电子系统设计或混合电
子系统设计也正在探索中。
国外硬件描述语言种类很多,有的从Pascal发展而来,也有一些从C语言发展而来.有些HDL成为IEEE标准,但大部分是企业标准.VHDL来源于美国军方,其他的硬件描述语言则多来源于民间公司.可谓百家争鸣,百花齐放.这些不同的语言传播到国内,同样也引起了不同的影响.在我国比较有影响的有两种硬件描述语言:VHDL语言和Verilog HDL语言.这两种语言已成为IEEE标准语言。
VHDL语言的设计流程
采用VHDL语言设计硬件电路系统的设计流程一般可以分为以下几个步骤。①硬件电路系统设计要求的定义。②编写描述硬件电路系统功能的VHDL语言程序。③VHDL语言程序的模拟。④VHDL语言的综合、优化和布局布线。⑤布局布线后的设计模拟。⑥器件的编程。设计人员在从事硬件电路系统的合计过程中,编写VHDL语言程序之前必须对硬件电路系统的设计目的和设计要求有一个非常明确的认识才行。
Quartus II开发平台简介
Quartus II是Altera提供的FPGA/CPLD开发集成环境,Altera是世界最大可编程逻辑器件供应商之一。Quartus II在21世纪初推出,是Altera前一代FPGA/CPLD集成开发环境MAX+plus II的更新换代产品,其界面友好,使用便捷。在Quartus II上可以完成设计输入、HDL综合、布线布局(适配)、仿真和下载和硬件测试等流程,它提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程。
本次所设计的电压表的测量范围是0~5V,精度为0.01V。此电压表的设计特点为:通过软件编程下载到硬件实现,设计周期短,开发效率高。
关键字:电子设计自动化(EDA);FPGA;VHDL;A/D;数字电压表。
二、设计任务与要求
要求利用FPGA控制模块数转换器对外部输入的模拟信号进行采样,获取当前电压值,并在数码管上显示。
传统的数字电压表设计通常以大规模ASIC(专用集成电路)为核心器件,辅以少量中规模集成电路及显示器件构成。ASIC完成从模拟量的输入到数字量的输出,是数字电压表的心脏,这种电压表的设计简单、精确度高,但是这种设计方法由于采用了ASIC器件使得的它欠缺灵活性,其系统功能固定,难以更新扩展,。后来发展起来的微处理器(单片机)控制通用A/D转换器件的数字电压表的设计的灵活性有所提高,系统功能的扩展性变得简单,但是由于微处理机的引脚数量有限,其控制转换速度和灵活性还是不能满足日益发展的电子工业的需求。而应以EDA技术及FPGA,其集成度高、速度快、性能十分可靠、用户可自由编程且编程语言通俗易懂、系统工程扩展非常方便。采用FPGA芯片控制通用A/D转换器可是速度、灵活性大大优于微处理器和通用A/D转换器构成的数字电压表。
a,能够实现一个通道的采样控制;
b,产生ADC0809工作所需的各种控制信号;
c,计算转换后的数字电压信号,并以BCD码方式表示。
三、 总体框图
方案一:
本利用ADC0809作为电压采样端口,FPGA作为系统的核心器件,用LED进行数码显示,把读取的8位二进制数据转换成便利于输出3位十进制BCD码送给数码管。
采用FPGA芯片作为系统的核心器件,负责ADC0809的A/D转换的启动、地址锁存、输入通道的选择、数据的读取。同时,把读取的8位二进制数据转换成便于输出3位十进制的BCD码送给数码管,以显示当前测量电压值。这些工作由ADC0809转换控制模块、数据转换模块、译码模块完成。
图1
图2
方案二:
基于VHDL语言的系统设计是采用自顶向下的设计方法,将系统划分为多个功能模块,然后再逐个实现各个模块的功能,最终把他们组合在一起,形成一个大的系统。
本系统共分为6个模块,分别为时钟分频(div_f)、数据采集控制(cs_control)、数据串转并(chuan2bing)、显示数值计算(data_calculate)、数码管扫描(led_select)、显示译码(led_translate)。
在设计中,主要采用分模块的方式,先实现各个模块,然后组成整个系统。主要分为如下几个模块:时钟分频(div_f)、数据采集控制(cs_control)、数据串转并(chuan2bing)、显示数值计算(data_calculate)、数码管扫描(led_select)、显示译码(led_translate)。其中时钟分频主要用计数器实现,采样数据暂存于一寄存器。利用TLC549就可以采集外部模拟电压的大小并转换成数字信号,通过串行输入到控制器,经过控制器对数据处理如计算成实际电压、保留三位小数,再经过控制器设计的数码管控制模块控制四个数码管显示处理过后的数据,就实现了将外部电压值显示在数码管的功能,这样就实现了数字电压表的显示。
这里我们采用方案一。
四、选择器件
(1)A/D转换器ADC0809控制电路
编程说明
利用ADC0809作为电压采样端口,FPGA作为系统的核心器件,用LED进行数码显示,把读取的8位二进制数据转换成便于输出3位十进制BCD码送给数码管。
由FPGA设计的ASIC芯片:
一方面产生ADC0809的控制信号,控制ADC0809实现0~5v的模拟电压到8位数字量DB0~DB7的变换;
另一方面将读入的数字量转化成电压工程值,并转换为3位BCD码的七段数字显示字符码送到LED数码管进行显示。
FPGA构成的ASIC芯片中包括三部分电路:
1, 用有限状态机设计的A/D转换控制电路;
2, 将8位数字量DB0~DB7转换为3位BCD码的电压值的转换电路;
3, 3位LED显示器的译码显示电路。
所用芯片ADC0809的技术资料:
1, 工作电压:+5v,即VCC=+5v。采用逐次逼近的方法实现A/D转换。
2, 模拟输入电压范围:0~+5v。
3, 分辨率:8位。
2, 转换时间:100us。
3, 转换误差:±1LSB。
参考电压:2.5v。
图3,ADC0809控制器的状态转换图
图4
外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809芯片的控制方法及转换过程:
控制ADC0809动作的信号有:ALE,START,OE,EOC。
ADC0809的动作大致分为5个步骤区间:S0,S1,S2,S3,S4。每个步骤区间的动作方式如下:
步骤S0:对ADC0809进行复位操作;
步骤S1:由FPGA发出信号要求ADC0809进行A/D转换;
步骤S2:转换后,转换完毕后的EOC将高电位降到低电位,而转换时间>100us;
步骤S3:转换结束,有FPGA发出读命令;
步骤S4:有FPGA读取DB0~DB7上的数字转换资料,并锁存数据。
(2)将采样数字量转换成3位BCD码
编程说明
8位数字量BD0~BD7如何变成3位BCD码?用FPGA实现乘除法是很耗资源的,因而,下面采用查表方法求取BD0~BD7与模拟输入电压0~5v的对应关系。
编一个查表程序,对上述电压进行BCD编码,然后根据对应的4位BCD码相加的结果决定是否进位,从而得到待处理数据的BCD码。例如:从AD0809上取得的数据位“11011110”,“1101”对应的电压值位4.16v,其对应的BCD编码为“010000010110”,“1110”对应的电压值为0.28v,其对应的BCD编码为“000000101000”。低4位相加为“1110”,大于9,加6将其调整为BCD码,其值为0100,并且向前有一进位。四位相加的结果为0011,由于低位有进位,因此最终结果为0100,。高四位的结果为0100.三位合计值为4.44v,与4.16+0.28的结果一样。
表中将8位数字量分为高4位HB和低4位LB,这样每个4位码的编程都是从0000~1111的16组码,由于5V被8位二进制码最大值除得到的结果是0.02v,即数字量每增大1对应模拟电压增大0.02v。
表中ADC0809采样的参考电压值是2.56v。
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
图5
2, 从表中得到的模拟电压值必须用BCD码表示才能便于用LED数码管显示。
例如,ADC0809的DB0~DB7是89H(10001001B),高4位HB是1000,低4位LB是1001,表中查询到高四位1000对应的2.56v,写成BCD码是0010,0101,0110;低四位1001对应的是0.18v,写成BCD码是0000,0001,1000.其和是2.74v,求的BCD码的运算如下:
HB 0010 0101 0110
LB 0000 0001 1000
+进位 1 0110
结果 0010 0111 0100
(3)译码,显示电路
编程说明
1, 译码、显示电路可以采用动态扫描显示和静态显示两种方法。这里采用动态显示。
2, 动态显示的字位更新采用一个计数器频率约为125Hz的信号轮流接通各位数码管的位线,并对显示字符进行扫描,应保证显示不闪烁。
(4)EP1C12Q240C8
FPGA EP1C12Q240C8开发板是基于FPGA的硬件描述语言EDA和软内核嵌入式系统的SOPC开发平台。系统采用多层PCB板设计,完善的电源和时钟设计,性能稳定可靠、结构紧凑美观。系统采用主流FPGA构建平台,片内资源丰富,板载器件多、周边接口多、可扩展性强。优化设计使系统调试方便,配置容易。配备丰富的例程有利于FPGA和SOPC的学习、快速入门与提高。FPGA/SOPC开发平台是电子、信息类专业学生学习FPGA和SOPC的理想良师益友,是各大专院校教学科研的良好工具,也可用于科研机构研发特色新产品。
五、功能模块
1,ADC0809(ad)
功能:利用ADC0809作为电压采样端口,进行A/D转换。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ad is
port(clk:in std_logic;
eoc:in std_logic;
datain:in std_logic_vector(7 downto 0);
dataout:out std_logic_vector(7 downto 0);
oe:out std_logic;
ale:out std_logic;
start:out std_logic;
add:out std_logic_vector(2 downto 0));
end ad;
architecture one of ad is
type states is(st0,st1,st2,st3,st4);
signal current_state,next_state:states:=st0;
signal temp:std_logic_vector(7 downto 0);
signal lock:std_logic;
begin
add<="001";
dataout<=temp;
process(current_state,eoc)
begin
case current_state is
when st0=>ale<='0';start<='0';oe<='0';lock<='0';
next_state<=st1;
when st1=>ale<='1';start<='1';oe<='0';lock<='0';
next_state<=st2;
when st2=>ale<='0';start<='0';oe<='0';lock<='0';
if (eoc='1')then next_state<=st3;
else next_state<=st2;
end if;
when st3=>ale<='0';start<='0';oe<='1';lock<='1';
next_state<=st4;
when st4=>ale<='0';start<='0';oe<='1';lock<='1';
next_state<=st0;
end case;
end process;
process(clk)
begin
if(clk 'event and clk='1') then current_state<=next_state;
end if;
end process;
process(lock)
begin
if lock='1' and lock 'event then temp<=datain;
end if;
end process;
end architecture one;
其生成项目符号:
图6
该模块时序仿真图如下:
图7
如图:
Datain、EOC、CLK:输入端
Dataut、OE、ALE、START、ADD:输出端
当输入时钟信号时,八位数字量在EOC有高电位变为低电位时,标志着A/D转换结束。
2, Dataprocess
功能:将采样数字量转换成3位BCD码。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dataprocess is
port(b_datain:in std_logic_vector(7 downto 0);
b_dataout:out std_logic_vector(11 downto 0));
end dataprocess;
architecture one of dataprocess is
signal middata:std_logic_vector(7 downto 0);
signal vdata:std_logic_vector(11 downto 0);
signal hdata:std_logic_vector(11 downto 0);
signal ldata:std_logic_vector(11 downto 0);
signal c0:std_logic;
signal c1:std_logic;
signal c2:std_logic;
begin
middata<=b_datain;
hdata<="010010000000"when middata(7 downto 4)="1111"else
"010001001000"when middata(7 downto 4)="1110"else
"010000010110"when middata(7 downto 4)="1101"else
"001110000100"when middata(7 downto 4)="1100"else
"001101010010"when middata(7 downto 4)="1011"else
"001100100000"when middata(7 downto 4)="1010"else
"001010001000"when middata(7 downto 4)="1001"else
"001001010110"when middata(7 downto 4)="1000"else
"001000100100"when middata(7 downto 4)="0111"else
"000110010010"when middata(7 downto 4)="0110"else
"000101100000"when middata(7 downto 4)="0101"else
"000100101000"when middata(7 downto 4)="0100"else
"000010010110"when middata(7 downto 4)="0011"else
"000001100100"when middata(7 downto 4)="0010"else
"000000110010"when middata(7 downto 4)="0001"else
"000000000000";
ldata<="000000110000"when middata(3 downto 0)="1111"else
"000000101000"when middata(3 downto 0)="1110"else
"000000100100"when middata(3 downto 0)="1101"else
"000000100100"when middata(3 downto 0)="1100"else
"000000100010"when middata(3 downto 0)="1011"else
"000000100000"when middata(3 downto 0)="1010"else
"000000011000"when middata(3 downto 0)="1001"else
"000000010110"when middata(3 downto 0)="1000"else
"000000010100"when middata(3 downto 0)="0111"else
"000000010010"when middata(3 downto 0)="0110"else
"000000010000"when middata(3 downto 0)="0101"else
"000000001000"when middata(3 downto 0)="0100"else
"000000000110"when middata(3 downto 0)="0011"else
"000000000100"when middata(3 downto 0)="0010"else
"000000000010"when middata(3 downto 0)="0001"else
"000000000000";
c0<='1' when hdata(3 downto 0)+ldata(3 downto 0)>"01001" else '0';
c1<='1' when hdata(7 downto 4)+ldata(7 downto 4)>"01001" else '0';
c2<='1' when hdata(11 downto 8)+ldata(11 downto 8)>"01001" else '0';
vdata(3 downto 0)<=hdata(3 downto 0)+ldata(3 downto 0)+"0110" when c0='1' else
hdata(3 downto 0)+ldata(3 downto 0);
vdata(7 downto 4)<=hdata(7 downto 4)+ldata(7 downto 4)+"0111" when c1='1' and c0='1' else
hdata(7 downto 4)+ldata(7 downto 4)+"0110" when c1='1' and c0='0'
else hdata(7 downto 4)+ldata(7 downto 4)+"0001" when c1='0' and c0='1'
else hdata(7 downto 4)+ldata(7 downto 4);
vdata(11 downto 8)<=hdata(11 downto 8)+ldata(11 downto 8)+"0111" when c2='1' and c1='1' else
hdata(11 downto 8)+ldata(11 downto 8)+"0110" when c2='1' and c1='0'
else hdata(11 downto 8)+ldata(11 downto 8)+"0001" when c2='0' and c1='1'
else hdata(11 downto 8)+ldata(11 downto 8);
b_dataout<=vdata;
end architecture one;
其生成项目符号:
图8
该模块时序仿真图如下:
图9
如图:
B_Datain:输入, B_Dataout:输出。
将8位数字量转化为3位BCD码
图中Datain“11011110”,“1101”对应的电压值位4.16v,其对应的BCD编码为“010000010110”,“1110”对应的电压值为0.28v,其对应的BCD编码为“000000101000”。低4位相加为“1110”,大于9,加6将其调整为BCD码,其值为0100,并且向前有一进位。四位相加的结果为0011,由于低位有进位,因此最终结果为0100,。高四位的结果为0100.三位合计值为4.44v,与4.16+0.28的结果一样。
3, Leddisplay
功能:用LED进行数码显示。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity leddisplay is
port(bcdcode:in std_logic_vector(11 downto 0);
ck:in std_logic;
led_dp:out std_logic;
seg:out std_logic_vector(6 downto 0);
sel:out std_logic_vector(1 downto 0));
end leddisplay;
architecture one of leddisplay is
signal num:std_logic_vector(3 downto 0);
signal count:std_logic_vector(1 downto 0);
begin
process(ck)
begin
if ck 'event and ck='1' then count<=count+1;
end if;
end process;
sel<=count;
num<=bcdcode(3 downto 0) when count=0 else
bcdcode(7 downto 4) when count=1 else
bcdcode(11 downto 8) when count=2 else
"0000";
led_dp<='1' when count=2 else '0';
seg<="0111111" when num =0 else
"0000110" when num =1 else
"1011011" when num =2 else
"1001111" when num =3 else
"1100110" when num =4 else
"1101101" when num =5 else
"1111101" when num =6 else
"0000111" when num =7 else
"1111111" when num =8 else
"1101111" when num =9 else
"1110111" when num =10 else
"1111100" when num =11 else
"0111001" when num =12 else
"1011110" when num =13 else
"1111001" when num =14 else
"1110001" when num =15 else
"0000000";
end one;
其生成项目符号为:
图10
该模块时序仿真图如下:
图11
如图:
Bcdcode、CK:输入
Led_dp、seg、sel:输出
输出随输入发生相应的变化
4,Decoder2_to_4_t
library ieee;
use ieee.std_logic_1164.all;
entity decoder2_to_4_t is
port(sel:in std_logic_vector(1 downto 0);
sel00,sel01,sel10,sel11:out std_logic);
end entity decoder2_to_4_t;
architecture dec of decoder2_t
展开阅读全文